Setup in 60 seconds
Stand up an endpoint
Any HTTPS URL that responds 2xx within 30 seconds. Keep it cheap;
do the heavy work asynchronously after acknowledging.
Subscribe
Create the endpoint via API or dashboard. The response includes a
signing_secret — store it; it’s shown only once.Event topics
| Topic | Fires when |
|---|---|
blog_post.published | A post transitions to status=published, manually or via scheduler. |
blog_post.translated | A post translation finishes (per language). |
social_post.published | A scheduled or on-demand publish succeeded on at least one platform. |
social_post.failed | All platforms in a post returned an error. |
order.created | A new Order row is created (manual or Stripe Checkout). |
order.paid | An Order transitions to payment_status=paid. |
order.fulfilled | An Order transitions to status=delivered. |
order.cancelled | An Order transitions to status=cancelled. |
order.refunded | A full or partial refund completes. |
booking.confirmed | A booking is confirmed (auto or manual). |
booking.cancelled | A booking is cancelled (admin or customer). |
booking.completed | A booking is marked complete after the appointment. |
content.changed | A translation key value changes — useful for SSG rebuild triggers. |
image.generated | An async image generation job completes. |
connect.account_updated | Stripe Connect status changes (onboarding, requirements). |
Delivery shape
Verifying the signature
The signature is a hex-encoded HMAC-SHA256 of the raw body (do not parse and re-stringify) using yoursigning_secret. The header is
t=<unix>,v1=<hex>; future signature versions will append additional
algorithms (e.g. v2=).
Retry behavior
If your endpoint doesn’t respond2xx within 30 seconds, we retry with
exponential backoff: 30 s, 2 m, 10 m, 1 h, 6 h. After 5 failed attempts the
delivery is marked failed and visible in the dashboard.
| Attempt | Delay since previous |
|---|---|
| 1 | (immediate) |
| 2 | 30 seconds |
| 3 | 2 minutes |
| 4 | 10 minutes |
| 5 | 1 hour |
| 6 | 6 hours |
data payload is always the resource as it stood at delivery time
(not the resource as it stands now). A redeliver replays the original payload.
Best practices
Acknowledge fast, work async
Acknowledge fast, work async
Return
2xx as soon as you’ve persisted the raw payload (or queued a job).
Don’t run business logic in the request handler — anything over a few
seconds risks a retry that double-processes.Idempotent processing
Idempotent processing
Treat
X-Neural-Draft-Delivery as the dedupe key. Index it; reject (and
2xx) duplicates. Retries happen — they’re a feature, not a bug.Replay protection
Replay protection
Reject deliveries with timestamps more than 5 minutes off. The verifier
helpers above do this for you.
Rotate secrets
Rotate secrets
Rotate the signing secret quarterly, or instantly if you suspect a leak.
The dashboard supports a transition window — both old and new secrets
accepted for up to 24 hours.
Monitor failures
Monitor failures
Watch the
last_delivery_status field on the endpoint resource (also
visible in the dashboard’s delivery log). A failed state for more than
an hour is your cue to investigate.Use one endpoint per concern
Use one endpoint per concern
A single endpoint subscribed to many topics is fine; the
X-Neural-Draft-Event
header tells you which one. But splitting concerns by URL (orders, content,
bookings) makes failure isolation cleaner.