Skip to content

Schedule campaigns

Scheduled campaigns are stored with status='scheduled' and picked up by the push-scheduler cron once per minute.

From the composer or the campaign detail page: Schedule action.

  • Pick a datetime (UTC). Local timezone shown alongside for reference.
  • Confirm.
  • Campaign moves to scheduled state.
  • Any scheduled campaign can be moved back to draft from the detail page.
  • Once a campaign moves to sent or sending, it’s too late to unschedule: you’ll need to wait for delivery.
  • Server-side scheduling is UTC.
  • For “same wall clock in every user’s timezone” campaigns (e.g. “Send at 9am local everywhere”): this is not supported natively in v2. Workaround: create N campaigns, one per major TZ cluster.
  • push-scheduler runs every minute.
  • Query: push_campaigns WHERE status='scheduled' AND scheduled_at <= now().
  • Failures per campaign don’t block the batch. Failed campaigns flip to status='failed' with a last_error string.

Same as Compose & send a push: schedule and unschedule are two of those endpoints.