KYC Webhook Incident Recovery: A Runbook for Missed and Replayed Events
An endpoint can recover while customer cases stay stuck. Here is how to reconcile missed KYC events without repeating account actions.
When KYC webhook delivery is interrupted, recover the affected cases from authoritative verification records before replaying business actions. A backlog of callbacks is evidence to investigate, not permission to approve accounts again.
This runbook is for engineering and operations teams recovering from an unavailable endpoint, a stalled worker or a processing bug. It builds on our webhooks versus polling architecture guide and webhook signature-verification guide. The question here is narrower: how do you close an incident without losing cases or repeating side effects?
Start with the incident boundary
Write down the affected environment, endpoint, deployment window and last known successful processing checkpoint. Identify whether requests failed to arrive, failed verification, were stored but not processed, or completed processing without updating the application. These failure modes need different repairs.
A successful HTTP acknowledgment alone does not prove that a worker updated the correct account. Use separate evidence for receipt, durable storage, processing and the resulting business action.
The operating rule is simple: scope recovery to affected cases, keep normal incoming traffic observable, and give one person responsibility for deciding when reconciliation is complete.
Build a bounded recovery list
Start from your internal verification references and delivery/processing records for the incident window. Include cases whose local state is uncertain, not every applicant in the database. For each case, record:
Field | What to record |
|---|---|
Verification reference | The |
Last local state | What your application currently shows |
Last checked time | When the case was last compared with the provider record |
Processing outcome | Reconciled, held, or sent to the exception queue |
Recovery owner | The named person responsible for this row |
Keep delivery identity separate from case identity. VOVE ID's webhook documentation distinguishes the delivery identifier from the subject reference and describes durable duplicate handling. One person may generate several legitimate status changes, so treating every later message for that person as a duplicate can discard useful information.
Use an overlap around your checkpoint to catch events that were in flight. Choose that overlap from your incident evidence and processing latency rather than assuming a universal number. Deduplicate overlapping records before dispatching work.
Reconcile state before replaying side effects
For each affected case, compare the current provider record with your local state. VOVE ID's result-retrieval documentation describes obtaining the current KYC resource by its stable reference. Use the supported lookup in the current integration contract rather than assuming a bulk-export endpoint.
Then make three separate decisions:
- Does local state need repair?
- Does an operational action remain outstanding?
- Did that action already happen?
A corrected verification status must not automatically trigger a second welcome message, payout enablement or account transition.
When the sources disagree or the original action outcome is unknown, hold that action for investigation. Reconciliation should preserve uncertainty until evidence resolves it.
A worked incident: the endpoint recovered, the queue did not
Consider a hypothetical marketplace. Its webhook endpoint persisted valid events during a deployment, but a worker stopped before applying them. The provider's delivery log shows successful acknowledgments while the marketplace still shows several sellers waiting.
Replaying every request from the delivery log is tempting. It also risks repeating actions for sellers that a second worker or a support operator already handled.
The recovery owner first lists stored-but-unprocessed events and their linked cases. The worker retrieves current verification state, checks the action journal, and applies only the missing transition. Cases with an uncertain prior account action go to a named exception queue. The incident closes when the recovery list has an evidenced outcome for every row, not when the HTTP endpoint is green.
Make manual recovery coexist with automatic retries
Provider retries can arrive while a recovery job is running. Share the same durable processing guard between ordinary deliveries and recovery work; otherwise two individually sensible paths can perform the same action.
Keep business-action idempotency separate from receipt deduplication. An event may have been received once while the action it started is still unresolved. Checkpoint only after the intended processing result is durably recorded.
Stripe's undelivered-event guidance is a useful example of manual recovery overlapping with automatic delivery. Its event-retention periods and retry timings are Stripe-specific, so do not copy them into a VOVE ID integration or assume every provider exposes the same replay interface.
Define evidence for closing the incident
Close the incident only when all of the following are true:
- Every affected case is reconciled, deliberately held or assigned to an exception owner.
- No unknown business action is labeled successful merely because a retry was submitted.
- Normal ingestion and the recovery worker can process duplicates without repeating an action.
- Older callbacks cannot silently replace a newer authoritative state.
- The saved checkpoint includes the time window and coverage limits.
- Customer-impacting exceptions have a next action and a responsible owner.
For monitoring, start with three measures: the oldest unprocessed event, the number of unresolved cases and the age of unknown action outcomes. They answer different questions, and a low queue size can still hide one long-blocked customer.
Test the recovery path before you need it
In Sandbox, test each of these:
- A worker failure after acknowledgment
- A duplicate during manual recovery
- An older event arriving after reconciliation
- An unavailable result lookup
- A timeout after an action may have completed
The expected result should include both application state and the evidence retained for investigation.
Use fictional cases and the matching environment's credentials. Keep secrets and sensitive verification material out of incident summaries. Record minimal operational identifiers and outcomes rather than copying identity documents into a troubleshooting report.
How VOVE ID fits
Use VOVE ID's current webhook contract for receiving verified events and its verification-result lookup to reconcile cases. Your application still owns its recovery queue, business-action ledger and exception decisions.
FAQ
Should we ask every affected customer to verify again?
First establish what evidence and current result already exist. A missing application update is different from a missing verification. Request a new attempt only when the case-specific workflow requires it.
Can we mark an event processed as soon as it is received?
Keep receipt and processing outcomes distinct. Record a final processing outcome only after the intended work is safely completed or explicitly routed to an exception.
What if the original action might already have happened?
Reconcile its outcome before retrying. If evidence remains inconclusive, retain the uncertainty and assign an owner rather than automatically repeating it.
Sources and review basis
- VOVE ID: Webhooks: current delivery and processing contract.
- VOVE ID: Get User Verification: current-resource reconciliation by
refId. - Stripe: Process undelivered webhook events: external example of recovery and retry overlap.
Before launch, agree with your engineering and operations owners how a missed status change is detected, recovered and evidenced. To walk through your verification workflow with our team:
Sources checked November 12, 2026. The incident and recovery workflow are illustrative engineering guidance, not customer evidence or a claim that a particular implementation has been tested.