Scheduled email

Schedule emails with one field

In short

Add scheduled_at with an ISO 8601 time to any send and Sendpository delivers it then. Scheduled messages can be listed and cancelled until they go, and quota is refunded if you cancel.

One field

scheduled_at: "2026-12-01T09:00:00Z" - the same request, the same response.

Cancel any time

POST /v1/emails/:id/cancel before it goes; quota comes back.

Exactly once

Each scheduled message is claimed once, so it is never sent twice.

Example

Node.js
await sendpository.emails.send({
  from: "Your App <hello@mail.yourdomain.com>",
  to: ["customer@example.com"],
  subject: "Your trial ends tomorrow",
  html: "<p>Upgrade to keep your data.</p>",
  scheduled_at: "2026-12-01T09:00:00Z",
});

How a scheduled send is held and released

A send with a future `scheduled_at` is stored rather than queued, and a worker picks up whatever is due. Until it fires, the message is cancellable by id - after it fires it is an ordinary send and cannot be recalled, the same as any other email.

The time is absolute, in UTC. That matters for anything user-facing: 'nine in the morning' is a different instant for every recipient, so the conversion from their local time has to happen in your code, where you know their timezone, not in the API.

What it is and is not for

It is for a message that should arrive later - a reminder the day before, a trial-ending notice, a digest at a fixed hour. It is not a replacement for a job queue: the schedule holds one message, not a recurring rule, so anything repeating is still your scheduler calling this API each time.

What it does not do

Read the Scheduling guide →

Questions

What if a scheduled email can't go out on time?

It is retried until it can - but a message more than 24 hours past its time is failed rather than sent, because a reminder that arrives a day late does more harm than good.

Other features

Send your first email in minutes

6,000 emails a month (up to 200 a day), free forever. No card needed.