Overview
A reminder before a date is a normal automation, no custom code needed:- a trigger that fires when the contact gets the date (a registration, a booking, a field update),
- a wait until a moment relative to a date field of the contact (“6 hours before”, “1 day before”, “3 days after”),
- the message.
appointment_at, trial_ends_at) or a dynamic field computed from your connected database, such as the start of the next tournament a player registered to.
Example: tournament reminders (6 hours and 1 hour before)
A tournament app stores tournaments intornei (with the start time in tornei.inizio) and registrations in tornei_iscritti (utente_id, compagno_id). The goal: every registered player gets a reminder 6 hours before the start and another one 1 hour before.
1
Give each player the date
Create a dynamic field with Ask Mo:
Create a dynamic field NEXT_TOURNAMENT_START (datetime): for each contact, the minimum ofThe field is filled for every player right away and recomputed when a registration is added or changes.tornei.inizioacross the tournaments intornei_iscrittiwhere the person isutente_idorcompagno_id, with a start date in the future.
2
Build the automation
Describe it to Mo (or to Claude through the Minimo MCP):
When NEXT_TOURNAMENT_START is updated, wait until 6 hours before NEXT_TOURNAMENT_START and send a reminder email, then wait until 1 hour before and send a last-call email.Mo creates it as a draft:
- Trigger: Field updated,
NEXT_TOURNAMENT_START - Wait: until 6 hours before
NEXT_TOURNAMENT_START, skip the next step if the moment has passed - Email: “The tournament starts in 6 hours”
- Wait: until 1 hour before
NEXT_TOURNAMENT_START, skip the next step if the moment has passed - Email: “Last call: the tournament starts in 1 hour”
3
Review and activate
Open the draft in the builder, check the copy and activate it. If your app already sends these reminders from code, turn that code path off when the automation goes live, so players don’t get them twice.
Build it by hand
In the builder add a Delay step and choose Based on a contact date:- Contact date field: any field of type date or datetime (fields synced from your database included).
- When: Before, After or On the exact date, with an offset in minutes, hours or days.
- Skip the next step if this moment has already passed: see below.
Late registrations
If someone registers 3 hours before the start, “6 hours before” is already in the past.- With Skip the next step if this moment has already passed on, the wait does not hold the contact and the step right after it (the 6-hour reminder) is skipped. The flow goes on, so the 1-hour reminder still goes out on time.
- With it off, the wait ends immediately and the next step runs right away (the 6-hour reminder is sent late).
The skip option and the stop on a missing date are delivered by the latest automation engine release, which is rolling out now. Until it is live, a wait whose moment has already passed ends immediately and the reminder goes out right away instead of being skipped.
Good to know
- One date per contact. A wait reads one value. With a dynamic field like “next tournament start”, a player registered to several tournaments is reminded for the nearest one; the next one gets its reminders when the field moves to it.
- A new-row trigger does not carry the row. A trigger on a new row in a synced table starts the flow for the matched contact, but the row’s own values do not reach the steps today. Read the date from a contact field instead: a dynamic field such as the next tournament start, a Field updated trigger and a wait until N hours before, exactly the pattern above.
- The date is read when the wait starts. Each wait reads the field at that moment, so a second wait uses the current value.
- Time zones. Store dates with their time zone (for example a Postgres
timestamptz). The reminder fires at that exact instant. - Recompute on data changes. A dynamic field is recomputed when its data changes, not only because time passed. See Dynamic fields.