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 timezone column on your contacts).

Setting a schedule

  1. Open Send → Campaign and compose as usual.
  2. Click Schedule instead of Send now.
  3. Pick a date and time. The default timezone is your browser's, but you can override.
  4. (Optional) Toggle Use recipient timezone.
  5. 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:

  1. The timezone field on the contact (IANA name, e.g. Asia/Dhaka).
  2. The contact's country, mapped to a representative timezone.
  3. 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.

Related

Ready to start sending?

Bring your own SMTP and send transactional or bulk email from $0.59/mo.