Skip to main content

Normal generation-event delivery

For the subscribed generation events, BabySea uses the normal delivery path in the webhook service. Each delivery attempt includes:
  • X-BabySea-Signature
  • X-BabySea-Event
  • X-BabySea-Timestamp
  • X-BabySea-Delivery-Id
  • A JSON body with the same event data

What triggers another attempt

BabySea retries a delivery when your endpoint:
ConditionDescription
Non-2xx responseAny HTTP status outside the 200-299 range, including 3xx redirects
TimeoutYour endpoint does not respond within 10 seconds
Connection errorTCP connection refused, DNS failure, TLS handshake error
BabySea treats redirects as failures because only 2xx responses count as successful delivery.

Retry schedule

BabySea makes up to 5 attempts using this delay schedule:
AttemptDelay after previous attemptCumulative time
1Immediate0 seconds
21 second1 second
34 seconds5 seconds
416 seconds21 seconds
560 seconds81 seconds
After the fifth failed attempt, BabySea logs the failed delivery with the final status code or error.

Auto-disable

If a webhook endpoint accumulates 15 consecutive delivery failures (across any events, not just a single delivery), BabySea automatically disables it. This prevents hammering an endpoint that is persistently down. When auto-disable triggers:
What happensDetails
Webhook status changes to DisabledVisible as a red badge in your dashboard
Matching events can queue to the dead letter queueQueued items are held for up to 72 hours
No deliveries are attemptedUntil you re-enable the webhook
The consecutive failure counter resets to zero when any delivery succeeds (receives a 2xx response).

Dead letter queue (DLQ)

When BabySea finds no active webhook for the account, it checks disabled webhooks and can queue matching events into the dead letter queue.
PropertyValue
Retention72 hours from when the event was queued
Status valuespending, delivered, expired
ScopePer webhook
Event filteringOnly events matching the webhook’s subscribed events are queued
DLQ events expire after 72 hours. Re-enable a disabled webhook and drain the queue promptly to recover missed events.

Draining the DLQ

After re-enabling a webhook, you can deliver all queued events from the webhook details page:
1

Re-enable the webhook

Toggle the status switch to Enabled on the Webhook details page.
2

Click Deliver queued events

A banner appears when there are pending DLQ items. Click Deliver queued events to start draining.
3

BabySea re-delivers queued items

Each queued event is sent with a fresh delivery ID, fresh timestamp, and a fresh HMAC signature. The stored event payload is preserved.
DLQ drain behavior:
BehaviorDetails
RetriesSingle attempt per item (no automatic retries)
SignaturesFresh HMAC signature computed for each delivery
Delivery IDsNew UUID for each delivery (not the original)
Active webhook requiredYes. The endpoint must be enabled before drain can run
The webhook.test event is never queued to the DLQ. Test events are for manual verification only.

Replaying deliveries

You can manually replay a previous delivery from the Webhook events table on Webhook details.
PropertyValue
Delivery IDFresh UUID (not the original)
TimestampFresh ISO 8601 timestamp
SignatureFresh HMAC computed with current secret
PayloadOriginal webhook_data preserved exactly
RetriesSingle attempt (no automatic retries)
Rate limit1 replay per delivery log entry per 10 seconds
Active webhook requiredYes
Replays are useful for:
  • Recovering from transient processing failures in your handler.
  • Testing changes to your webhook processing logic against real payloads.
  • Re-delivering events after fixing a bug in your endpoint.

Events table

The webhook details page includes the Webhook events table with these columns:
ColumnDescription
EventThe webhook_event value (e.g., generation.completed)
Generation IDThe generation_id from the payload
StatusHTTP response code from your endpoint, color-coded by outcome
ErrorError message if the delivery failed
AttemptsNumber of delivery attempts made
Delivered atThe recorded delivery timestamp
ActionsResend button for manual replay
Status codes are color-coded:
ColorMeaning
Green2xx success
Red4xx or 5xx failure
Amber429 rate limited
The page also supports search, batch selection, and export or copy actions.

Webhook statuses

A webhook can be in one of two statuses:
StatusBadgeDeliveriesDLQ behavior
EnabledGreenActiveNot used
DisabledRedPausedNew events queue for up to 72 hours
A webhook starts as Enabled when created. It becomes Disabled in two ways:
TriggerHow it happens
ManualYou toggle the status switch on the webhook details page
Auto-disableBabySea disables it after 15 consecutive delivery failures

Enable and disable

Toggle the status switch on the Webhook details page to enable or disable a webhook. Only Owner and Primary Owner roles can toggle status. When you disable a webhook:
  • BabySea stops delivering events to the endpoint immediately.
  • New events are queued in the dead letter queue (DLQ) for up to 72 hours.
  • The delivery log is preserved.
When you re-enable a webhook:
  • BabySea resumes delivering new events immediately.
  • A banner appears if there are pending DLQ items. Click Deliver queued events to drain the queue.

Rotate secret

If your webhook secret is compromised or you want to refresh it on a regular schedule, generate a new secret from the webhook details page.
1

Open Webhook details

Navigate to the Webhook details page for the endpoint you want to update.
2

Click Rotate secret

Click Rotate secret. The dialog says the old secret will stop working immediately.
3

Copy the new secret

The new secret is displayed in a dialog:
whsec_x9Y8z7W6v5U4t3S2r1Q0p9O8n7M6l5K4
Copy this secret immediately. It is shown only once and cannot be retrieved later.
4

Update your environment

Replace the old secret in your environment variables and redeploy before any new events arrive:
.env
BABYSEA_WEBHOOK_SECRET=whsec_x9Y8z7W6v5U4t3S2r1Q0p9O8n7M6l5K4
When you rotate a secret:
What happensDetails
Old secret is invalidated immediatelyAll new deliveries use the new secret
There is no grace period where both old and new secrets are accepted simultaneously. Update your endpoint to use the new secret before BabySea sends the next event.

Send test event

Click Send test event on the Webhook details page to verify your endpoint is reachable and correctly verifying signatures.
PropertyValue
Event typewebhook.test
Generation ID00000000-0000-0000-0000-000000000000
Model identifiertest
Generation statussucceeded
RetriesNone (single attempt)
Rate limit1 test per webhook per 30 seconds

Delete endpoint

Click Delete on the Webhook details page to permanently remove a webhook endpoint.
What is removedDetails
Webhook configurationURL, events, secret, status
All delivery logsFull event history for this endpoint
All DLQ itemsPending, delivered, and expired items
Deletion is permanent and cannot be undone. All delivery history and queued events are lost. If you only need to temporarily stop deliveries, use the disable toggle instead.