Scheduling
Send now, send later, or deliver in the recipient's local timezone.
Three delivery modes
- Send now — the campaign is queued immediately and processed by the next worker tick (typically under 60 seconds).
- Send at a specific time — pick a date, time, and timezone. The worker won't pick up the job before that timestamp.
- Send in recipient's timezone — useful for global lists. The job is split per timezone so a 9:00 AM send arrives at 9:00 AM local for each recipient (requires a
timezonecolumn on your contacts).
Setting a schedule
- Open Send → Campaign and compose as usual.
- Click Schedule instead of Send now.
- Pick a date and time. The default timezone is your browser's, but you can override.
- (Optional) Toggle Use recipient timezone.
- Confirm. The campaign appears in Campaigns → Scheduled with a countdown.
How scheduled jobs are stored
Each scheduled campaign stores a send_after UTC timestamp. The worker query is roughly:
SELECT * FROM campaigns WHERE status = 'scheduled' AND send_after <= now() LIMIT 10;This means: the actual send may be a few seconds after your scheduled time, never before. There is no upper bound on how far in the future you can schedule.
Editing a scheduled campaign
Until the worker picks it up, you can edit the subject, body, recipients, or send time. Once the first batch goes out, the campaign becomes immutable — you can only pause or cancel the remaining queue.
Recipient timezone resolution
When Use recipient timezone is enabled, the resolution order per contact is:
- The
timezonefield on the contact (IANA name, e.g.Asia/Dhaka). - The contact's country, mapped to a representative timezone.
- The campaign's default timezone (fallback).
Daylight saving
Schedules use IANA timezones, so daylight-saving transitions are handled automatically. A 9:00 AM America/New_York schedule will fire at 13:00 UTC in winter and 14:00 UTC in summer.
Common pitfalls
- Wrong timezone selected — always double-check the timezone label next to the time picker.
- Scheduled in the past — the worker will treat it as send now.
- Cron pause — if the system pg_cron is paused (rare), jobs queue up but don't dispatch. Check Admin → Monitoring.