---
title: Scheduling · BuzzKit
description: Hold a message for a moment, in one timezone or in every subscriber’s own.
canonical: https://buzzkit.dev/features/scheduling
last-updated: 2026-09-02
---

# Nine in the morning, everywhere. Released as each clock gets there.

Add a schedule to a send and BuzzKit holds it until the moment arrives. Pick a fixed timezone, or let each subscriber receive it as their own clock reaches the time, released zone by zone.

## A wall-clock time, not an instant

The schedule takes a time without an offset and a timezone to read it in. With the subscriber timezone, the moment comes from the attribute the SDK stamps on identify, with a default for anyone without one.

```
POST /v1/messages
{
  "topic": "weekly-recap",
  "title": "Your week in numbers",
  "schedule": {
    "at": "2026-09-08T09:00",
    "timezone": "subscriber",
    "defaultTimezone": "Europe/Berlin"
  }
}
```

## Released zone by zone

A minute cron releases fixed-timezone messages at their instant, and subscriber-timezone messages one zone at a time. A zone is never sent twice, and a batch that dies is retried on the next tick.

```
GET /v1/messages/msg_7g2h
{
  "status": "processing",
  "schedule": {
    "at": "2026-09-08T09:00",
    "timezone": "subscriber"
  },
  // Zones past 09:00 have gone out, the rest wait
  "counts": {
    "total": 2418,
    "sent": 1130,
    "pending": 1288
  }
}
```

## Quiet hours and daily caps

A tenant-wide send policy applies to every visible push. Quiet hours defer a delivery to the next allowed local time, a daily cap counts sent deliveries per subscriber per local day, and topics carry their own cap on top.

```
PATCH /v1/tenants/gymly
{
  "settings": {
    "sendPolicy": {
      "quietHours": {
        "from": "22:00",
        "to": "08:00",
        "timezone": "subscriber"
      },
      "dailyCap": 3
    }
  }
}
```

## Capabilities

- **Cancel until it releases.** Cancel up to the moment a message goes out.
- **Honest validation.** A moment already past, a date off the calendar or an unknown zone is refused.
- **Expiry from the last release.** The time to live counts from the last possible release.
- **Timezone from the backend.** Set a subscriber’s timezone on identify from your server.
- **Recurring through workflows.** A workflow trigger can be a cron or a daily time over a segment.
- **Local notifications.** A workflow send can fire on the device at the moment, even offline.

## Questions

### How do I send a push at each user’s local time?

Add a schedule with the subscriber timezone option. BuzzKit releases the message as each person’s own clock reaches the time, with a default timezone for anyone whose zone is unknown.

### Can I send the same message every week?

Recurrence is a workflow: a cron or daily trigger over a segment starts one run per member each time it fires, in a fixed timezone or each subscriber’s own.

### What if the moment has already passed in some timezones?

Subscribers in zones past the time receive the message right away, and the rest wait for their own clock. A moment that has passed everywhere is refused.

## Related

- [Sending](https://buzzkit.dev/features/sending.md): One POST sends to a subscriber, a topic or a segment and lands on every device.
- [Workflows](https://buzzkit.dev/features/workflows.md): Event-triggered automation with waits, branches and sends, run per subscriber.
- [Topics & Preferences](https://buzzkit.dev/features/topics.md): Named notification categories with per-topic, per-channel choices for every subscriber.

## Start

- [Start sending](https://buzzkit.dev/dashboard)
- [API Reference](https://docs.buzzkit.dev)
- [BuzzKit on GitHub](https://github.com/buzzkit-dev/buzzkit)
