Skip to content

Organization audit log ​

The activity log is the canonical "who changed what" feed for your organization. Every material write to a tracked entity β€” member, attendance, donation, group, ministry, org unit, school, or enrolment β€” writes one row here, automatically, via a database trigger that can't be bypassed by application code.

Open it from the sidebar under Activity log, or visit /activity-log directly.

Activity log page with entries and filters

Reading an entry ​

Each row tells you four things in plain English:

Sarah Patel updated members β€” Changed: email, phone β€” 2 hours ago

PieceWhere it comes from
Actor nameactor_id β†’ resolved to the user's full name; falls back to email if the profile is gone
VerbThe action column (created, updated, deleted, restored, merge_members, …)
Entity linkIf the entity type has a detail route (members, groups, ministries, schools), the row links directly to it
Changed columnsFor updated actions, the list of columns that changed β€” not the before/after values
TimestampRelative ("2 hours ago"); hover to see the absolute date in your org's timezone

System writes β€” workflow actions, scheduled jobs, edge functions running without an authenticated user β€” show System as the actor instead of a person.

Filtering ​

The header has three filters that combine with AND:

  • Entity type β€” narrow to just members, donations, attendances, etc. Use this when you're investigating a specific table.
  • Action β€” created, updated, deleted, restored. Defaults to all.
  • Actor email β€” free-text contains-match. Type @yourchurch.org to see writes from staff only; type a partial address to find one person.

Filters are URL-driven, so you can bookmark or share a filtered view (/activity-log?entity=donations&action=deleted and so on).

TIP

The activity log is infinite-scroll β€” older entries load as you scroll past the bottom. Apply filters first if you're hunting for one specific event; the unfiltered firehose can be 10,000+ rows per month for a busy org.

Common investigations ​

"A donation amount changed and I don't know why" ​

  1. Open /activity-log
  2. Set entity filter to donations
  3. Set action filter to updated
  4. Optionally filter by actor email if you suspect a specific person
  5. Scan for the donation; click through to verify against the current record

The changed-columns hint will tell you whether amount, fund, or just notes were touched.

"Who deleted this member?" ​

  1. Filter entity to members, action to deleted
  2. Scroll to the date in question
  3. The actor column tells you exactly who did it and when

Deleted members are soft-deleted β€” they're still in the database with deleted_at set. The audit row preserves the actor; the member row preserves the data. You can restore from the recycle bin within 30 days.

"Did the workflow actually run last night?" ​

Workflow actions write entries with actor_email = system and metadata describing the workflow run. Filter actor email to system to see only automated activity.

What the data underneath looks like ​

The org_audit_log table:

sql
id              uuid primary key
organization_id uuid          -- scoped by current_org_id() RLS
actor_id        uuid          -- null for system writes
actor_email     text          -- denormalized for the case the profile is gone
action          text          -- 'created' | 'updated' | 'deleted' | 'restored' | …
entity_type     text          -- table name
entity_id       uuid          -- row id in that table
metadata        jsonb         -- { changed: [...], reason: '...', … }
created_at      timestamptz

The metadata.changed array lists column names. The metadata.reason field, when present, is a free-text justification supplied by the action that wrote the row β€” for example, the workflow run reason or a manual "marked lost" explanation.

Differences vs the Data & Logs audit tab ​

The same org_audit_log table powers the audit tab on Data & Logs. The differences are:

/activity-logData & Logs β†’ Audit
Permissionusers.manageconfig.manage
Rows shownInfinite scroll, all rowsLatest 50, no pagination
FiltersEntity, action, actor emailNone
Use it forInvestigations, auditsA quick "what happened recently?" glance during a config session

Most admins use /activity-log day-to-day. The Data & Logs tab exists so a config-only role (no users.manage) can still see recent activity without granting them the bigger permission.

See also ​