Event reminders β
Set up GCM to send automatic reminders before every event on the calendar β 24 hours, 12 hours, 2 hours before, on whichever channels you choose, with a template you customize. The Reminders tab lives at Settings β Reminders and is admin-only.

Open the reminders tab β
From the sidebar, click Settings, then the Reminders tab. The form is a single card with a master enable switch at the top β flipping that off pauses all event reminders without losing your config.
How reminders work β
A scheduled edge function runs every 15 minutes and looks for events that start within any of your configured offsets. For each matching event, it sends one notification per (member, channel) pair to every member who's marked as attending or invited. Members who've opted out of a specific channel don't get reminders on that channel.
Master enable switch β
The big switch in the card header turns reminders on or off org-wide. Off means the cron job skips your org entirely β no reminders go out until you flip it back on. Useful for:
- Pausing during a planning week when half your calendar is rough drafts.
- Cutting noise during low-attendance seasons.
- Testing a new template without spamming everyone.
Reminder timing β
Pick when reminders fire relative to event start. The badge row offers five preset offsets:
- 24h
- 12h
- 6h
- 2h
- 1h
Click a badge to select; click again (or click the X) to deselect. You can pick more than one β most churches use 24h + 2h as a sensible pair (the day-before nudge plus the same-day prompt). Picking all five floods members with five reminders per event, which is too much.
At least one offset must be selected for the form to save. The error text under the row reminds you.
Notification channels β
Below timing is a checkbox list of channel categories: Push, Email, SMS, In-app, WhatsApp. Tick the channels you want reminders sent on. Each member receives one reminder per ticked channel β they're not routed to a single "best" channel, they get all of them.
TIP
Push + In-app is the gentlest combo β both are silent for members who haven't opted in. Email + SMS is the most reliable but the most intrusive. For a typical congregation, Push + Email is a good default.
At least one channel must be selected. The error text reminds you.
The channels available here mirror what's configured under Settings β Channels and the Channels page. If a channel isn't enabled there, it still appears in this list but the reminder won't actually send on it β the dispatcher logs a "channel disabled" warning and skips it.
Message template β
The reminder body is templated with merge tokens. Two fields:
- Title β the subject line (email), notification title (push, in-app), or first line of an SMS.
- Body β the full message body.
Available tokens:
| Token | Replaced with |
|---|---|
{{event_title}} | The event's title |
{{event_date}} | Formatted date, in the org timezone |
{{event_time}} | Formatted time, 24h |
{{event_location}} | " at {location}" β includes the leading space if a location is set, empty string if not |
The defaults are:
- Title:
Upcoming: {{event_title}} - Body:
{{event_title}} on {{event_date}} at {{event_time}}{{event_location}}
Edit either field freely β you can drop tokens, reorder them, or add static text like "Don't forget!" before the title.
Preview β
The Preview card at the bottom of the form renders both fields with sample data (Sunday Service, Sun, Mar 15, 10:00, at Main Auditorium) so you can see what the final message will look like. The preview updates as you type β no save needed.
Save β
Click Save Reminder Settings in the sticky bar at the bottom. The bar appears only when you have unsaved changes and stays visible while you scroll, so you don't lose track of pending edits. A toast confirms.
The save fails fast if you've deselected all timing options or all channels β the bar disables itself until you fix it.
What's saved where β
All settings live in a single row in event_reminder_config, one row per org:
organization_id (PK with org)
is_enabled
reminder_offsets_hours int[]
channel_slugs text[]
title_template text
body_template textThe cron-side dispatcher reads this row, finds matching events, and writes one notification per recipient to the appropriate channel's send queue.
Channels vs reminders β what's different β
The Reminders tab picks which channels are used for the event-reminder feature specifically. The Channels page configures how each channel is wired to its provider. You need both:
- Channels page: "WhatsApp is configured with our WAHA session at https://waha.grace.org"
- Reminders tab: "Send reminders 24h before via Push + WhatsApp"
If you tick a channel here but haven't configured it on the Channels page, the dispatcher skips it silently β there's no error, but the reminder just doesn't go out on that channel.
Common pitfalls β
"Reminders went out 5 hours off." The dispatcher uses organizations.timezone, not app_settings.app_timezone. If those two ever disagree (it shouldn't happen via the UI, but can if SQL was edited directly), reminders fire in the wrong zone. Re-save the regional settings via Settings β Branding β Regional Settings.
"I set 24h but reminders go out at random times." The dispatcher runs every 15 minutes, so a 24h reminder for a 10:00 event might fire at 10:00, 10:15, or 10:30 the day before. That's by design β running a per-second cron for low-volume reminders would burn a lot of compute for no benefit.
"Members who already attended got reminded anyway." Reminders fire based on the event's start time, not on whether the member has checked in. Once an event is past, no reminders fire for it regardless of RSVP state.
"I disabled SMS but reminders still sent SMS." Did you disable it on the Channels page, or just on the Reminders tab? The Reminders tab unticking only affects this feature; if a workflow or the messaging composer also targets SMS, those still send.
Next steps β
- Channels β configure the providers reminders use.
- Calendar β events that trigger reminders live here.
- Email + notifications β email provider for the email channel.
