WebhooksManual Replay

Manual Replay

In v1 there is no self-service replay endpoint for merchants. If your receiver was down for longer than the auto-retry window or you accidentally rejected events with a 4xx (which is terminal — see retry policy), the events you missed are still in our database with delivery_status = failed.

To get them re-delivered, contact TradeOn support with:

  • Your merchant id (visible in your cabinet → Settings).
  • The event id or list of event ids to replay (X-Event-Id from the original delivery, or the id column from GET /api/v1/merchant/webhook-events).
  • A short note on why a replay is needed (audit trail).

Support will reset each event back to pending, mark the attempt as manual, and the sender service picks it up on the next 5-second poll.

What manual replay does on our side

When support triggers a replay (admin endpoint POST /api/v1/admin/merchants/{merchantId}/webhook-events/{eventId}/retry):

  • The event row is reset to delivery_status = pending, next_attempt_at = null, attempt_kind = manual, and the last_response_* fields are cleared.
  • The sender’s normal claim → POST → outcome flow takes over on the next poll.
  • A single delivery attempt is made. If it succeeds, the event is delivered. If it fails — for any reason, transient or terminal — it goes straight to failed again. Manual replays do not re-enter the auto-retry chain (1m → 10m → 1h); one shot, then terminal.

The single-shot rule is intentional: support has already seen the failure, so silently auto-retrying a manual replay would just mask whatever the merchant is investigating.

What you’ll see

A replayed delivery is indistinguishable from a fresh one at the wire:

  • Same X-Event-Id and body as the original.
  • Fresh X-Timestamp and X-Signature (signed at the moment of replay).
  • Your endpoint must dedup on (purchase_id, event) or provider_uuid (dedup contract) and treat the second arrival as a no-op.

If you want the cabinet to show the replay history, the delivery_attempts counter increments with each attempt — including the manual one — and last_response_code / last_response_body reflect the most recent attempt.

Already-delivered events

You cannot replay a delivered event. Support’s tooling rejects the request with 409 Conflict to prevent accidentally re-firing settled state. If you genuinely need to re-process a delivered event (e.g. you wiped your processing log), reconstruct state from GET /api/v1/merchant/purchases and GET /api/v1/merchant/balance rather than spoofing a webhook.