Delivery Comparison

Compare two delivery attempts side by side — see exactly what changed between a failed attempt and a successful retry, including headers, body, status code, and timing.

Overview

When a delivery fails and is retried, each attempt records the full request and response. The Delivery Comparison tool shows two attempts side by side with differences highlighted, making it easy to spot why one attempt succeeded and another failed.

Delivery Comparison works with any two attempts for the same event — you can compare attempt 1 vs attempt 3, or any combination.

How to use

1

Open the event detail drawer

From the webhook events list, click the event you want to investigate.

2

Find the delivery timeline

In the event drawer, scroll to the delivery attempts section. Each attempt is listed with its status, timestamp, and HTTP status code.

3

Select two attempts

Click the checkbox on two delivery attempts to select them for comparison. The Compare button becomes active.

4

View the diff

Click Compare to open the side-by-side view. Differences are highlighted.


What is compared

SectionDetails
Request headersAll headers sent with the delivery POST, including signature and content-type
Request bodyThe JSON payload sent to the target URL
Response statusHTTP status code returned by the target
Response headersHeaders in the target's response
Response bodyBody returned by the target server
TimingRequest duration in milliseconds, timestamp of each attempt

Example comparison

textSide-by-side comparison
┌─ Attempt 1 (FAILED)              │  Attempt 3 (SUCCESS)            ─┐
│                                  │                                  │
│ POST https://api.example.com/wh  │  POST https://api.example.com/wh │
│ Timestamp: 14:30:00.000Z         │  Timestamp: 14:32:15.000Z        │
│ Duration: 30,042ms               │  Duration: 142ms                 │
│                                  │                                  │
│ ── Request Headers ──            │  ── Request Headers ──           │
│ Content-Type: application/json   │  Content-Type: application/json  │
│ X-HostWebhook-Signature: sig_a.. │  X-HostWebhook-Signature: sig_b. │
│ X-HostWebhook-Attempt: 1        │  X-HostWebhook-Attempt: 3        │  ← different
│                                  │                                  │
│ ── Request Body ──               │  ── Request Body ──              │
│ { "type": "order.created" ... }  │  { "type": "order.created" ... } │
│ (identical)                      │  (identical)                     │
│                                  │                                  │
│ ── Response ──                   │  ── Response ──                  │
│ Status: 504 Gateway Timeout      │  Status: 200 OK                  │  ← different
│ Body: <html>504 error</html>     │  Body: { "received": true }      │  ← different
│ Duration: 30,042ms               │  Duration: 142ms                 │  ← different
└──────────────────────────────────┴──────────────────────────────────┘

Common patterns to look for

  • Status code change (5xx to 200): The target server was down and recovered. Timeout on the failed attempt confirms a connectivity issue.
  • Different response body: The target may have rate-limited the first attempt (429) and accepted the retry after the backoff period.
  • Same 4xx on all attempts: The issue is with the request, not the target. Check the payload or headers for problems.
  • Timing difference: A 30-second failed attempt vs a 100ms success indicates the target was overloaded or unreachable during the first attempt.
If all retry attempts show the same error, the issue is likely in the request configuration (wrong URL, invalid payload, auth problem). Use the Replay Studio to trace the full pipeline and identify where things went wrong.