Integration reliability checklist
Form webhook checklist: reliable delivery, retries and replay safety
Build replay-safe form webhooks with a twelve-field event envelope, receipt-processing split, retry contract and eight-case proof test.
A reliable form webhook verifies who sent the event, records a unique event ID, acknowledges receipt quickly, processes business work asynchronously and treats retries or out-of-order delivery as normal. A 2xx receipt is not proof that the business action completed.
A twelve-field event envelope, receipt-versus-processing state model, action idempotency key, worked replay example and reproducible eight-case proof test, checked against current Stripe and W3C documentation on September 25, 2026.
Key findings
- A successful HTTP receipt confirms transport acceptance, not completion of the downstream CRM, routing or email action.
- Event-level deduplication and action-level idempotency solve different problems; reliable consumers need both.
- Retries, duplicate deliveries and out-of-order events are ordinary conditions that must be modeled and tested rather than treated as exceptional edge cases.
Stable definition
A webhook is an HTTP event delivery from one system to a configured endpoint. It is not a synchronized database transaction. The sender may retry, events may arrive out of order and the receiver may accept the request before downstream CRM, routing or email work completes.
Verify the sender, durably record a unique event, acknowledge the request quickly and perform business work through replay-safe actions. A 2xx receipt is not proof that the business action completed.
This checklist separates transport receipt from business processing, then tests the failure states between them. It applies to form platforms that send webhooks directly and to integration layers that translate a form submission into an HTTP event.
Twelve-field event envelope
| Field | Purpose |
|---|---|
event_id | Deduplicate delivery of the same event |
event_type | Select the allowed handler |
event_version | Parse the intended schema |
occurred_at | Record when the source says the event happened |
delivered_at | Record when this endpoint received the attempt |
submission_id | Link the immutable form event |
form_id | Identify the form and relevant version |
contact_reference | Link the intended contact without copying unnecessary profile data |
payload | Carry only allowlisted event facts |
| Signature metadata | Record the verified signing scheme and safe key version |
trace_id | Connect operational logs across systems |
| Attempt metadata | Explain delivery count, timing and failure state |
Do not put secrets in the payload. Treat the body as untrusted input even after transport authentication. A W3C Trace Context trace-id is for correlating work across systems; it is not a substitute for the sender's unique event ID or the receiver's idempotency key.
Receipt and processing are different states
The receiver should capture the exact raw body needed for signature verification, validate the signature and timestamp, check the event ID, persist a minimal durable receipt and return the documented success response quickly. Expensive CRM lookups, enrichment, email generation and file processing belong in a retryable worker or queue.
| State | Meaning | Safe next action |
|---|---|---|
| Received | Authenticated event and durable receipt exist | Acknowledge according to the sender contract |
| Processing | One or more named business actions are running | Use action-specific idempotency keys |
| Completed | Every required action reached its terminal success state | Retain the evidence required by policy |
| Retryable failure | The failure may succeed without changing intent | Retry with bounded backoff |
| Terminal failure | Automatic retry is unsafe or exhausted | Assign an owner and controlled recovery action |
A transport dashboard showing HTTP 200 does not prove that an owner was assigned, a contact was updated or a follow-up message was sent. Each required action needs its own recorded outcome.
Retry and ordering contract
As checked September 25, 2026, Stripe's current webhook documentation says live-mode events can be retried for up to three days with exponential backoff. It also says delivery order is not guaranteed, duplicate deliveries can occur and event IDs should be logged to prevent repeated processing. Those are Stripe's documented behaviors, not a universal timing standard; use the general reliability model with the chosen sender's current contract.
Apply a uniqueness constraint to the event ID and destination. Then make every business action idempotent with a separate key such as evt_9001:crm_update. Event deduplication prevents the same delivery from entering the pipeline twice; action idempotency prevents a partially completed replay from repeating the actions that already succeeded.
When the source contract supports retrieval, fetch the missing current object rather than inferring state from arrival order. Preserve both occurred_at and delivered_at; neither alone proves that an earlier event has been processed.
Signature and input checks
Stripe's signature guidance requires the exact raw request body, the signature header and the endpoint secret for verification. Whatever sender is selected, follow its current signing specification before parsing or mutating state. Do not apply one provider's header format or timestamp tolerance to another provider.
- Read the exact raw body within a documented size limit.
- Verify the signature, timestamp and expected endpoint secret before mutable work.
- Allowlist content types, event types and schema versions.
- Parse into bounded fields and reject unexpected shapes safely.
- Rotate signing secrets with a tested overlap and rollback plan.
- Log safe identifiers and error classes, never secrets or full sensitive payloads.
If distributed tracing is used, follow the W3C Trace Context privacy and security considerations. Trace values can correlate activity across services, so access and retention need the same deliberate controls as other operational metadata.
Failure ownership
Every terminal failure record needs the event ID, event type, first and latest attempt, failed action, error class, safe context, owner and next recovery step. A dead-letter destination is useful only when someone monitors it and can replay safely.
| Evidence | Question it answers |
|---|---|
| Event and action keys | Which delivery and side effect failed? |
| Attempt history | What was tried, when and how often? |
| Error class | Is retry safe, blocked or permanently invalid? |
| Owner | Who is responsible for review? |
| Recovery action | Retry, repair, compensate, discard or escalate? |
| Result | Did recovery complete without duplicated side effects? |
Retention should be long enough for operational recovery but limited to the documented purpose. Where replay could send email, change ownership or create billing consequences, require an action preview or explicit approval appropriate to the risk.
Worked replay-safe example
A form platform sends submission.accepted for submission sub_205. The endpoint verifies the signature, stores receipt evt_9001 and returns the documented success response. A worker updates the contact and assigns the qualification queue using action keys derived from evt_9001.
The sender retries after a timeout. The receiver finds the durable receipt and does not enqueue a second copy. Later, a replay occurs after the contact update succeeded but before the queue assignment completed. The worker reads the action ledger, skips evt_9001:crm_update and safely retries only evt_9001:queue_assignment.
A status event then arrives before an earlier enrichment event. The handler uses the event type and current source state instead of arrival order. This preserves the accepted form event while preventing a late, stale delivery from overwriting the newer contact state.
Eight-case replay proof test
Run with synthetic records in the intended sender account, endpoint and downstream workspace. Record the expected transport state, business state and observable evidence for each case.
- Valid signed event: one durable receipt and one set of required actions complete.
- Invalid signature: the request is rejected and changes no business state.
- Stale signature timestamp: the documented tolerance is enforced without parsing into mutable work.
- Same event ID twice: the second delivery repeats no side effect.
- Same submission with a new legitimate event: the new event is retained and handled according to type.
- Events out of order: the final state remains correct without relying on arrival sequence.
- Worker failure after durable receipt: transport stays accepted while processing becomes visibly retryable.
- Downstream timeout and replay: completed actions are skipped and incomplete actions resume safely.
Invalid input changes no state; duplicates repeat no side effects; accepted receipts are durable; partial work resumes from action state; out-of-order delivery remains correct; and every terminal failure has an owner and safe recovery path.
Evidence and limitations
A twelve-field event envelope, receipt-versus-processing state model, action idempotency key, worked replay example and reproducible eight-case proof test, checked against current Stripe and W3C documentation on September 25, 2026.
- This checklist is not a complete API, threat-model, privacy or penetration-testing review.
- Signature formats, retry windows, payloads, response requirements and event-order guarantees differ by sender. Revalidate the selected provider's current contract.
- A documented design does not prove the published path works. Test synthetic events, downstream timeouts and safe replay in the actual production integration.
Sources and verification
Current product and plan claims use the primary sources below. Internal methodology links describe the publication's own frameworks and should not be read as vendor documentation.
- Stripe, Receive Stripe events in your webhook endpoint
- Stripe, Resolve webhook signature verification errors
- W3C, Trace Context
- Form testing checklist
- Duplicate submission and contact controls
- What should happen after a form submission?
- The Form Review testing methodology
Last materially verified .