Zamanlama
{ "type": "now" }
{ "type": "at", "at": "2026-10-01T09:00:00Z" }
{ "type": "user_timezone", "localTime": "19:30" }
{ "type": "recurring", "every": "week", "daysOfWeek": [1, 4], "localTime": "09:00", "timezone": "Europe/Istanbul", "until": "2026-12-31T00:00:00Z" }
Şimdi
POST /v1/campaigns/:id/send (ya da sihirbazda Gönder) fan-out işini hemen kuyruğa koyar. Durum sending → sent.
Belirli bir saatte
Kampanya scheduled olur ve fan-out işi at'e kadar Redis'te gecikmeli iş olarak tutulur. Scheduler süreci yoktur — BullMQ zamanı gelince işi yükseltir ve iş API ile worker yeniden başlatmalarını atlatır (Redis appendonly yes ile çalışır).
- API'de
atherhangi bir ISO 8601 string'i; panelin tarih seçicisi sizin tarayıcı saat diliminizde yorumlanıp UTC saklanır. - Tetiklenmeden önce her an iptal:
POST /v1/campaigns/:id/cancelya da listedeki İptal. Gecikmeli iş kaldırılır. - Geçmişteki bir saat hemen gönderir.
Kullanıcının yerel saatinde
localTime: "19:30", her abonenin push'u kendi saatine göre 19:30'da alması demektir. Saat dilimi başına kampanya değil, tek fan-out ile çözülür:
14:00 UTC'de fan-out
├─ Europe/Istanbul'daki kullanıcı (UTC+3) → sonraki yerel 19:30 = 16:30 UTC → iş 2s30 gecikmeli
├─ America/New_York'taki kullanıcı (UTC−4) → sonraki yerel 19:30 = 23:30 UTC → iş 9s30 gecikmeli
└─ saat dilimi olmayan kullanıcı → uygulama varsayılanı, o da yoksa UTC
Her push işi bir notBefore alır, BullMQ gecikmesi olarak uygulanır. "Sonraki" şu demek: o dilimde bugün 19:30 geçtiyse yarın. DST Intl ile ele alınır (core/timezone.ts), kütüphane yok.
Fan-out'un kendisi gönder'e bastığınızda olur; günün push'ları çıkarken kampanya sending, sonuncusu denendiğinde sent gösterir. Raporun saatlik grafiği saat dilimi başına bir tümsek gösterir.
Saat dilimleri SDK'lardan otomatik gelir (Intl.DateTimeFormat().resolvedOptions().timeZone, TimeZone.current, TimeZone.getDefault()). API'den saat dilimsiz oluşturulan kullanıcılar için uygulamanın varsayılan saat dilimini Teslimat kuralları'nda ayarlayın.
Sessiz saatlerle etkileşim
Uygulamanın sessiz saatlerine denk gelen zamanlanmış ya da yerel saatli push yine onlara tabidir (ayara göre ertele ya da atla) — kural push çıkmak üzereyken uygulanır, zamanlandığında değil. Zamanlama zaten kullanıcının gününe saygılıysa bypass.quietHours kullanın.
Tekrarlayan
every: "day" ya da daysOfWeek (0 = Pazar … 6 = Cumartesi) ile every: "week", tek bir timezone'daki localTime'da, isteğe bağlı until'e kadar. Yine scheduler süreci yok: /send bir BullMQ job scheduler'ı (Redis'te bir cron) kurar ve kampanya aktif olur (tekrarlayan · aktif).
Aktif kampanya kendisi asla göndermez. Her tetiklenmede worker onu bir gönderime klonlar — <ad> · #3 adlı, recurringOf ile parent'ı işaret eden, kendi sayaçları olan bir alt kampanya — ve onu o anda segmente uyanlara fan-out eder. Parent'ın rapor sayfası gönderimleri listeler; her gönderimin sıradan bir raporu vardır. Parent'taki runCount ve lastRunAt kaçının çıktığını söyler.
- Kayıtlı segment aktivasyonda parent'a kopyalanır; gönderimler onu yeniden okumaz.
- İptal (
POST /v1/campaigns/:id/cancelya da İptal et) scheduler'ı kaldırır; sonrasında gelen tetiklenme hiçbir şey yapmaz. daysOfWeek'sizweekreddedilir (422).- Sessiz saatler ve frekans sınırı her gönderime diğer kampanyalar gibi uygulanır.

Sihirbazın Tekrarlayan seçeneği aynı alanları sunar; saat dilimi tarayıcınızınkiyle başlar.