Skip to content

Member activity log ​

Every member profile has an Activity tab that shows a chronological timeline of everything that's happened to that person: when they were added, which groups they joined, which Sundays they attended, what donations they made, what workflow messages they received, and when (if ever) they were marked lost and recovered.

Open it from any member's profile.

Member profile with Activity tab open

What appears on the timeline ​

The timeline is fed by the member_activity_log table, which captures lifecycle and engagement events written by application code (not by the generic audit trigger that powers the org audit log). Events come from across the app:

SourceExamples
Member lifecyclecreated, updated, type changed, marked lost, recovered, deleted
Org structureunit assigned/removed, group assigned/removed, ministry assigned/removed
Schoolsenrolled, graduated, removed
Engagementattendance marked, donation recorded
Messagingmessage sent, message failed (with channel and template name)
Workflowsworkflow started, workflow action ran, workflow completed, workflow failed
Notesnote added by a staff member

Each event has an icon, a title, and (when relevant) a short description. Workflow events also include the workflow name as a badge so you can tell which automation touched the member.

Reading the timeline ​

Entries are grouped by date with the most recent day at the top. Within a day they're listed newest first. Each row shows:

  • Icon + color indicating event type (green for "joined" events, red for "lost"/failed, purple for type changes, etc.)
  • Title β€” a short human sentence like "Joined Youth Group" or "Tithe recorded β€” $50.00"
  • Description β€” a longer line with context (the actor, the workflow name, the meeting type)
  • Time in the org's timezone

The list scrolls within the tab, so the rest of the profile stays in view. The 100 most recent entries load by default; older history is paginated when present.

Why a separate log instead of the org audit log? ​

The org audit log is generic and trigger-driven β€” it knows "a row in members got updated" but not "this person enrolled in the youth choir." The member activity log is purpose-built for the member-facing story:

  • Cross-table. Attendance and donations are different tables; the timeline weaves them together.
  • Human-readable titles. Application code writes the title and description in the user's language, so non-technical staff can read the timeline without knowing the schema.
  • Workflow integration. Workflow runs write rich metadata (which automation, which action, what happened) that the generic trigger can't capture.

The two logs don't duplicate each other for read-only queries: a member edit shows in both because it's tracked by the generic trigger and surfaces as a "Profile updated" timeline entry.

Permissions ​

The Activity tab is visible to anyone who can view the member profile (pastors with members.read, group leaders within their scope). There's no separate permission for the timeline because it's already filtered to that one member β€” the privacy boundary is the member-view permission, not the log itself.

When to use the timeline vs the org audit log ​

QuestionUse
"When did this person join the church?"Member activity log
"What's their attendance pattern this year?"Member activity log (or the attendance report)
"Which workflows have touched them?"Member activity log
"Who edited their email address?"Org audit log filtered to this member
"Why was their member type changed?"Both β€” the timeline shows the event, the org log shows the actor

Caveats ​

  • Bulk imports write a single "member.created" event per row but don't populate group/ministry assignments as separate timeline entries β€” those write rows directly. If a member is missing expected join events, check the import history to confirm the import succeeded.
  • PowerSync offline edits are queued and timestamped at sync time, not at edit time. Expect a small drift between the activity timestamp and what the volunteer saw on the device.
  • Deleted activity entries. Soft-deleting a member doesn't wipe their timeline. Restoring brings it back intact. Hard-deletes (rare, GDPR requests) wipe the timeline along with the member.

See also ​