Triggers
When a workflow fires — cron, db, or heartbeat.
A trigger decides when a workflow runs. It says nothing about which rows — that's the query.
cron — on a schedule
Fires on a cron schedule (e.g. 0 3 * * * = daily at 03:00). Best for digests,
nightly cleanups, weekly reports.
db — on a data change
Fires the moment a row is inserted / updated / deleted on a watched table
(customers, reservations, conversations, …). The changed row is available to the
steps as ${trigger} (e.g. ${trigger.customer_id}). Best for reactions — a
new booking, a new customer.
heartbeat — every tick
Fires on one shared tick (every few minutes). The workflow's first step is
usually a list with a time-based query, and later steps act on the results.
Best for "after N minutes/days in a status" rules (no-show, stale-close). A
missed tick self-heals — the next tick re-selects the same rows.
Reference
The watched tables and the exact behavior come from the code — see the Feature catalog.