Events
An event is the immutable record of a single webhook delivery — request, response, attempts, and timing.
An event is the unit FixedHook records for every webhook delivery attempt. The dashboard event stream is just a list of events, newest first, filterable by alias, provider, status, and time.
What's in an event
Every event captures the full delivery context:
| Field | Description |
|---|---|
id | Unique identifier for the event |
aliasId | The alias that received the request |
provider | Best-guess provider (stripe, github, shopify, clerk, …) |
method | HTTP method (POST, GET, etc.) |
path | The path on the alias (e.g. /stripe/webhook) |
query | Query string, if any |
requestHeaders | All request headers as captured |
requestBody | Request body bytes (or null if empty) |
requestSize | Size in bytes |
responseStatus | Final HTTP status from your code |
responseHeaders | All response headers as captured |
responseBody | Response body bytes |
latencyMs | Wall-clock time from request received to response sent |
attempts | Array of delivery attempts (see below) |
isReplay | true if this event was triggered by a replay |
parentEventId | For replays, the original event this is a replay of |
receivedAt | Timestamp the relay received the request |
completedAt | Timestamp the response was sent to the provider |
The event is immutable. Even after replay, the original record is preserved; replay attempts are recorded as new attempts on the same event.
Attempts
A single event can have multiple attempts — every time the relay tries to deliver it, that's a new attempt. Most events have one attempt; events that have been replayed have two or more.
Each attempt has its own:
attemptedAt— when the relay sent the requeststatus—success,failed,queuedresponseStatus— the HTTP status returned (if any)responseBody— the body returned (if any)latencyMs— how long this attempt tookerror— error message if the attempt failed before reaching your code (e.g. tunnel offline)
The dashboard's inspector shows attempts in a side panel; clicking an attempt shows its response and timing.
Status values
The top-level event status is derived from the latest attempt:
- success — the latest attempt returned a 2xx status.
- failed — the latest attempt returned a non-2xx status, or the relay could not deliver (e.g. tunnel offline).
- queued — the request was received but the relay could not deliver it because no tunnel was online. Queued events are still delivered eventually if a tunnel reconnects, but the response is sent to the original caller immediately as
503.
Provider detection
FixedHook attempts to identify the provider from the request headers and path:
Stripe-Signatureheader →stripeX-GitHub-Eventheader →githubX-Shopify-Topicheader →shopifySvix-Signatureheader →clerk,lovable, or any other Svix-based service- Path-based heuristics as a fallback (
/stripe/...,/github/...)
The provider is shown as a colored badge in the event stream and is searchable. It is also one of the most useful filters when you have a busy dashboard.
Latency
latencyMs is the wall-clock time from when the relay accepted the request to when it sent the response back to the provider. It includes:
- Network time from provider to relay
- Time spent in the relay queue
- Network time from relay to CLI
- Time your code spent handling the request
- Network time from CLI to relay
- Network time from relay back to provider
In local development, you should expect 20–80 ms of overhead from FixedHook itself. If your events regularly show latencies above 200 ms with no clear cause, check your local server first.
Body storage
Request and response bodies are stored in object storage (Cloudflare R2 in production, MinIO in local dev) and referenced by URL from the event row. Bodies are kept for the duration of your plan's history window and pruned automatically.
Payloads over 5 MB are not stored in full — only the headers, size, and a hash are kept. The event still records delivery and timing, but you cannot replay it because the body is gone. Most providers stay well under 1 MB; this limit only matters for unusual cases like file uploads.