
scheduled_at and timezone; GOWA stores the request and a background worker sends it at that time. Schedules survive restarts and wait for an offline device.
Schedulable message types: text, image, file, video, audio, sticker, contact, link, location, poll and forward (/message/{id}/forward). Presence and typing indicators are not schedulable.
Schedule fields
Without
scheduled_at, the request is sent immediately as usual.
Examples
schedule_id instead of message_id.
weekdays as repeated fields (-F weekdays=1 -F weekdays=3).
Manage schedules
Schedules belong to a device; send the sameX-Device-Id.
results.data and results.pagination (limit, default 25; offset; total).
Statuses
Delivery behavior
- The worker checks for due schedules every 5 seconds.
- Device offline or not logged in: the run waits and retries every 30 seconds. Waiting does not count as a failed attempt, so a schedule survives long outages.
- Send errors: retried with backoff starting at 15 seconds and capped at 5 minutes, up to 10 attempts per occurrence. A recurring schedule then skips to its next occurrence; a one-off schedule becomes
failed. - Invalid request (for example a bad recipient): fails immediately without retrying.
- Late runs: an occurrence delayed past
end_atis not sent. - Crashes and restarts: shutdown does not abort a send already in flight. If the process dies mid-send, GOWA cannot know whether the message went out, so once the 2-minute claim expires that occurrence is skipped as interrupted and not resent. Recurring schedules continue with their next occurrence.
Over MCP
The MCP toolwhatsapp_send accepts the same schedule fields, and whatsapp_schedule lists, gets, pauses, resumes and cancels schedules. See MCP server.
Check
GET /app/info: results.scheduled_sends is true when the server accepts schedule fields and exposes /send/schedules.