Prefix the 5-field cron expression with `TZ=<IANA timezone>` to pin it to a zone; without the prefix it is evaluated in UTC.
Add `jitter` to spread load when many functions share a schedule: `{ cron: "0 * * * *", jitter: "5m" }`. Jitter must be between 1 second and 5 minutes.
Combine schedules and events on one function by passing an array of triggers: `triggers: [{ event: "user.created" }, { event: "user.updated" }, { cron: "0 5 * * *" }]`. Ref: https://www.inngest.com/docs/guides/multiple-triggers
Branch inside the handler on whether `event` is a scheduled invocation or a user event when using multiple triggers.
Wrap the actual work in `step.run` so a mid-run failure does not repeat completed work on the automatic retry.
Verify the next scheduled time in the Inngest dashboard after syncing — cron functions only appear once the app is synced.
Known gotchas
Daylight-saving transitions: with a TZ-pinned cron, a schedule 'may run zero, one, or two times in a day when clocks change'. Make DST-sensitive jobs idempotent.
A function supports up to 10 unique triggers.
Cron functions do not run against the local Dev Server on a schedule the way production does — trigger them manually from the Dev Server UI while developing.
Changing a cron expression requires resyncing the app; the old schedule persists until the sync completes.
Behaviour for missed runs (deploy gaps, outages) is not documented — do not assume catch-up backfill. Design the job to reconcile from state rather than assuming exactly one execution per period.
Give your agent this knowledge — and 15,900+ more routes
One MCP install gives any agent live access to the full route map across 5,800+ domains, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp
Need this verified for your stack — or a route we don't have yet?