Delivery guarantee
BabySea delivers webhooks at least once. In rare cases (network issues, infrastructure failover) you may receive the same event more than once. Use thewebhook_delivery_id field as an idempotency key to handle duplicates safely.
What triggers a retry
BabySea retries when your endpoint:- Returns a non-
2xxHTTP status (including3xxredirects, BabySea does not follow them) - Does not respond within 10 seconds.
- Returns a connection error.
Retry schedule
BabySea makes up to 5 attempts using exponential backoff, all within approximately 81 seconds:| Attempt | Delay after previous attempt |
|---|---|
| 1 | Immediate |
| 2 | 1 second |
| 3 | 4 seconds |
| 4 | 16 seconds |
| 5 | 60 seconds |
Auto-disable
If a webhook endpoint accumulates 15 consecutive delivery failures, BabySea automatically disables it to avoid hammering an endpoint that is persistently down. You will see the endpoint marked as disabled in your workspace. Events that occur while a webhook is disabled are queued in BabySea’s dead-letter queue (DLQ) for up to 72 hours. After you re-enable the webhook, click Deliver queued events in your workspace to drain the DLQ. BabySea delivers each queued event sequentially with fresh delivery IDs, timestamps, and HMAC signatures.Respond fast, process async
Your endpoint should acknowledge receipt immediately and process the payload in a background job. If your handler needs to do database writes or external API calls, do them after returning200.
- Express
- Next.js
TypeScript
Delivery ordering
BabySea does not guarantee strict ordering of deliveries. For example, ageneration.failed event may arrive before a retry of an earlier generation.completed event from a different generation. Always use webhook_data.generation_id to associate a delivery with the correct generation record.
Replaying deliveries
You can manually replay any previous delivery from your BabySea workspace. A replayed delivery gets a freshwebhook_delivery_id, webhook_timestamp, and HMAC signature, the original webhook_data is preserved. Replays are single-attempt (no automatic retries). Use this to recover from transient processing failures on your end.
Best practices
- Use
webhook_delivery_idfor idempotency. Store processed delivery IDs and skip duplicates. BabySea guarantees at-least-once delivery, so the same event may arrive more than once. - Respond within 10 seconds. Offload slow work (database writes, downstream API calls) to a background queue after acknowledging.
- Monitor your disabled webhooks. Set up alerts in your workspace so you notice when auto-disable triggers. DLQ events expire after 72 hours.
- Verify signatures on every request. Never skip verification, even in staging. See Verify signature.