Snooze and send later
Defer threads and queue outbound mail with undo
Snooze
Press S on a selected thread to snooze it.
What snooze does
- Thread disappears from active lanes until the snooze time
- A
snoozesrow is stored withsnoozedUntil - Thread remains in Gmail — snooze is app-side visibility only
Picking a snooze time
The snooze picker offers presets (later today, tomorrow, next week) or custom datetime.
Waking up
When snoozedUntil passes:
- Cron job (
/api/cron/process-due) deletes expired snooze rows - Thread reappears in its classified lane on next refresh or Pusher update
Cancel snooze
Use the snooze UI or DELETE /api/inbox/snooze with { "threadId": "..." }.
Send later
When composing a reply, you can schedule outbound mail instead of sending immediately.
Undo window
Default send flow uses a 5-second undo window:
- You press
Mod+Enter - Send is queued with
sendAt = now + 5s - Toast offers Undo — cancel via
DELETE /api/inbox/send - After 5s, cron dispatches the message via Gmail
If you set an explicit future sendAt, there is no undo window (undoWindowMs: 0).
Dispatch immediately
PUT /api/inbox/send with scheduledSendId forces immediate send before cron picks it up.
Cron requirement
Send-later and snooze expiry require an external cron pinging:
POST /api/cron/process-due
Authorization: Bearer $CRON_SECRETEvery 1 minute (Vercel Hobby cron is daily-only — use cron-job.org).
See Deploy to production.
Status tracking
Scheduled sends have status:
| Status | Meaning |
|---|---|
pending | Waiting for sendAt |
sent | Successfully dispatched |
cancelled | User cancelled during undo window |
failed | Gmail send error |
Related
- Keyboard shortcuts —
SandMod+Enter - API routes — snooze & send