Webhook teslim garantileri: retry, circuit breaker (sürekli başarısız endpoint'i koruma), 72 saat kalıcı durdurma ve hacim cap'i. Endpoint sağlığın doğrudan teslim akışını (ve senkron hook'larda tenant deneyimini) etkiler. Sağlık bildirimleri delivery.* lifecycle webhook'larıyla gelir.
Her teslim 20 deneme, exponential backoff (10 sn → 3600 sn) — toplam ≈11,4 saatlik pencere, üstüne 24 saatlik sert tavan. Son deneme de başarısızsa teslim dead olur (delivery-logs'ta görünür).
1+2+4+8+16 = 31 saniye — tüketicinin bir deploy'u, bir restart'ı ya da kısa bir kesintisi olayı kalıcı olarak düşürüyordu. Karşılaştırma: Shopify 8 deneme / 4 saat · Square 11 / 24 saat · Stripe 3 gün.id alanı ile dedup zorunlu. 31 saniyelik pencere bu ihtiyacı pratikte gizliyordu; artık gizlemiyor. (Webhook alıcısı'ndaki dedup deseni.)Endpoint'in sürekli başarısızsa teslimler geçici atlanır (boşa retry yığmamak için):
dead teslim VEYA 15 dakikalık pencerede ≥20 denemede ≥%90 fail.skipped (skipReason: 'open'|'half-open').delivery.degraded, kapandığında delivery.restored gönderilir.delivery.disabled).dropped, capClass/capCount) ve delivery.throttled gönderilir.failMode kararı anında uygulanır (open → allow, closed → deny). Restoran personeli bekletilmez. failMode:closed kullanıyorsan endpoint sağlığın doğrudan tenant deneyimidir.Geliştirici, portaldaki teslim loglarından başarısız bir teslimi elle yeniden gönderebilir (GitHub "Redeliver" paritesi). Teslim, install'ın güncel webhookUrl + secret'iyle yeni bir deliveryId altında normal retry hattına girer.
idempotencyKey (envelope id) AYNI kalır → senin dedup'ın çift işlemeyi önler. Yani redeliver'da aynı id'yi tekrar görürsen güvenle yut. Manuel redeliver breaker/cap'ten bağımsızdır; başarılı bir redeliver breaker'ı doğal bir probe gibi kapatabilir.| Durum | delivery-logs | Webhook |
|---|---|---|
| Breaker açıldı | skipped | delivery.degraded |
| Normale döndü | — | delivery.restored |
| 72h → kalıcı durdu | skipped | delivery.disabled |
| Cap aşıldı | dropped | delivery.throttled |