Triggers β
A trigger is what kicks off a workflow run. Every workflow needs at least one. GCM ships about two dozen built-in triggers covering members, attendance, giving, forms, schedules, and external webhooks.
Trigger groups β
| Group | When it fires |
|---|---|
| Instant | Right when an event happens in the database (member created, donation recorded, etc.) |
| Scheduled | On a cron expression or one-off future date |
| Manual | When an admin manually starts the workflow |
Instant triggers (member) β
| Trigger | Fires when |
|---|---|
member.created | A new member record is saved |
member.updated | Any field on a member changes |
member.deleted | A member is soft-deleted |
member.birthday | A member's date_of_birth matches today's date |
member.marked_lost | lost_at is set on a member |
member.recovered | lost_at is cleared on a previously-lost member |
member.type_changed | The member type changes (e.g. Visitor β Member) |
member.unit_assigned | A member is added to an org unit |
member.unit_removed | A member is removed from an org unit |
member.group_assigned | A member is added to a small group |
member.group_removed | A member is removed from a small group |
member.ministry_assigned | A member is added to a ministry |
member.ministry_removed | A member is removed from a ministry |
member.school_enrolled | A member starts a school program |
member.school_graduated | A member completes a school program |
member.school_removed | A member is removed from a school program |
member.note_added | A note is added to a member's profile |
member.tagged | A tag is added to a member |
Instant triggers (attendance and giving) β
| Trigger | Fires when |
|---|---|
attendance.marked | A member is checked in to a meeting |
attendance.removed | An attendance row is deleted |
giving.recorded | A donation is created (manual or online) |
donation.refunded | A donation is refunded |
Instant triggers (other) β
| Trigger | Fires when |
|---|---|
event.created | A calendar event is created |
form.submitted | A public form is submitted (e.g. visitor form) |
webhook.received | An external system POSTs to your church's incoming-webhook URL |
Scheduled triggers β
| Trigger | When |
|---|---|
schedule | Recurring cron β e.g. every Monday 9 AM |
schedule.once | A single future moment |
scheduled_query | Periodic database query (e.g. nightly no attendance for 6 weeks check) |
The schedule trigger uses standard cron syntax. We translate it to your church's timezone (set in Settings β Organization), so 0 9 * * 1 means "9 AM Monday in your church's local time."
Manual triggers β
| Trigger | When |
|---|---|
manual | An admin clicks the run-now button |
manual_enrollment | An admin enrolls one or more members directly |
Useful for ad-hoc sends β e.g. a one-off "we have a service change tomorrow" message.
Trigger configuration β
Most triggers have extra config:
- Filters β only fire when extra conditions hold. E.g.
member.createdwhere member type is Visitor. - Org-unit scope β only fire for members in specific units.
- Membership type scope β only fire for visitors, members, leaders, etc.
These filters are evaluated before a run is enqueued β non-matching events skip the workflow without creating a run row.
Subject and tokens β
Every trigger fires with a subject β usually the member the event concerns. That subject is available throughout the workflow as merge tokens:
{{trigger.member.first_names}}β for a member trigger.{{trigger.donation.amount}}β forgiving.recorded.{{trigger.attendance.meeting.name}}β forattendance.marked.
The token picker shows what's available based on the trigger you chose.
Multi-trigger workflows β
A workflow can have multiple triggers that all funnel into the same action sequence. Common pattern:
- Welcome new arrivals with both
member.createdandmember.recoveredas triggers, both leading to a "welcome" send.
The two triggers connect to a trigger junction node which fans out into the shared actions.
Frequency safeguards β
Some triggers fire a lot. member.updated will fire every time anyone touches any field. To avoid runaway workflows:
- Use trigger filters to narrow what's eligible (only when status changes).
- Use rate-limiting on the workflow level β at most N runs per member per day.
- Use idempotency keys on send-message actions so retries don't duplicate.
WARNING
The classic mistake: a workflow that updates a custom field on member.updated, causing an infinite loop. The builder warns you if you create this pattern; please pay attention to the warning.
Common questions β
Can I trigger on a custom field change? Yes β use member.updated with a filter on the specific field key.
Why isn't my member.created workflow running for bulk-imported members? Bulk import skips workflow triggers by default to avoid messaging the world during migration. There's a checkbox on the import review screen to opt in.
Can a single event fire multiple workflows? Yes. Every workflow with a matching trigger fires independently. Order is not guaranteed.
Next steps β
- Actions β what to do after the trigger.
- Multi-step & delays β sequencing.
- Monitoring runs β see what fired and why.