Skip to main content
Enterprise PortalUnderstanding the Activity Feed

Understanding the Activity Feed

The activity feed is an append-only record of everything that happens in your organization's portal. It exists so admins have a clear paper trail for audits, compliance reviews, and incident investigations.

What gets logged

Every significant action writes one event to the feed. Categories are authentication (sign in, sign out, failed sign-in), team (invite, join, remove, leave, role change), data (download a delivery, export activity CSV, delivery received), settings (industry changes, delivery config, SSO config), and billing (Stripe checkout completed, payment method updated).

What admins see

Admins see every event for their entire organization. They can filter by category, search across actor emails and action names, and page through history. Each event shows a plain-English description, the actor, a timestamp, and the raw metadata on click.

What members see

Members see only events where they are the actor. This means a member can review their own sign-ins and downloads but cannot see what other teammates did. The scoping happens server-side, it cannot be bypassed by the client.

What cannot happen

Audit events are insert-only. Nobody, not even admins, not even VidScore staff, can edit or delete individual events. Retention is 365 days, after which old events are automatically pruned. Everything in between is immutable.

Detailed reference

What you can expect

  • Authentication events (sign in, sign out, failed attempts)
  • Team events (invite, join, remove, leave, role change)
  • Data events (downloads, delivery received, CSV exports)
  • Settings events (industry changes, delivery config)
  • Billing events (checkout completed, payment updated)
  • Plain-English description, actor label, timestamp, and raw metadata per event
  • Category filter and free-text search

Limits

  • Individual events cannot be edited or deleted
  • Retention is 365 days, older events are pruned
  • No real-time notifications on events (no webhooks yet)
  • Members cannot see other members' events, even with filters

How it works

Events are written through a single server-side helper that inserts into the shared audit_log table. The helper derives the event's category from the action name (the prefix before the first dot, e.g. "member.invited" → category "member") so filtering by category is a cheap index lookup.

Each event includes the actor's user ID (for member scoping), the organization ID (for cross-org isolation), and a JSON details blob with action-specific metadata. The IP address and user agent from the request are captured for context.

Row-level security on the database enforces the admin-vs-member scoping directly, even if an API route had a bug, the database would still refuse to return another member's events to a non-admin.

Common misconceptions

  • "I can delete embarrassing events from the feed", false. The feed is insert-only and RLS blocks deletes from any client, including admin sessions.
  • "Members can see each other's downloads", false. Members only see their own events.
  • "The feed is permanent", false. Events older than 365 days are automatically pruned. Export to CSV regularly if you need longer retention.
  • "The feed is real-time notification", false. It is a passive log. Nothing pushes notifications based on feed events.

What to do

  • Review the feed weekly in your first month to confirm your team is using the portal as expected
  • Export to CSV monthly for compliance documentation if your policies require it
  • Use the category filter to narrow to just team events when you are investigating a membership question

Event categories at a glance

Every event name uses the form <category>.<verb>. The category is also indexed on its own so filtering is cheap:

  • auth: login, logout, login_failed
  • member: invited, joined, removed, left, role_changed
  • data: downloaded, delivery_received, audit_log_exported
  • settings: industries_changed, delivery_configured, sso_configured
  • billing: checkout_completed, payment_method_updated

Row-level security

The admin-vs-member scoping is enforced in the database itself via Postgres row-level security, not just in the API layer. Even a buggy route cannot leak another member's events.

Retention and compliance

The 365-day retention window is chosen to balance SOC2 and similar compliance frameworks (which commonly require at least 12 months of audit trail) against keeping the table fast. If your organization requires longer retention, export to CSV monthly and archive the files to your own storage.

Last updated 2026-04-13

Did this help?

Related articles

Still need help?

We're here if you need us.