Configuration
Meridian configures webhook endpoints during provisioning.
payment_link_transaction_* events, ask Meridian to register an endpoint for each of the four event names.
Event routing
Before you parse the body, use theX-Meridian-Resource-Type and X-Meridian-Event-Type headers to identify which resource the event belongs to and which specific event occurred.
The three
payment_link events carry the same Payment Link payload, so read the headers first to tell them apart, then deserialize the body with the webhook schema. Other payment link status transitions, including PROCESSING, FAILED, EXPIRED, LOCKED, and INACTIVE, do not emit a payment_link webhook.
The four payment_link_transaction events carry the same Payment Link Transaction payload: the payment link and the transaction. The body has no envelope, so the event name is only in the X-Meridian-Event-Type header.
Payment link transaction events
Meridian sends apayment_link_transaction webhook every time a payment link transaction changes status, for single and recurring links.
- Each status change sends exactly one event. If Meridian writes the same status twice, you receive one webhook.
- A reversal sends
payment_link_transaction_status_updatedatREVERSAL_IN_PROGRESS, andpayment_link_transaction_failedonly when it reachesREVERSED. - One transaction can send
payment_link_transaction_failedmore than once, because each failure status is its own change. For example,FAILEDthenDEBIT_FAILED, orCOMPLETEDthenRETURNEDafter an ACH return. Handle repeatedfailedevents for the sametransaction.id, and treattransaction.statusandtransaction.previousStatusas the source of truth. - The
paymentLinkobject is a snapshot from when Meridian sent the webhook. Meridian updates the link and the transaction separately, so the link’sstatuscan lag the transaction. Usetransaction.statusfor the payment outcome, and fetch the link through the API if you need its final state.
Security
Webhook requests, including thepayment_link_transaction events, use the same HMAC SHA-256 scheme as the REST API, but with a dedicated Webhook API Key and Secret issued separately from your REST API credentials. Each request includes the following headers:
Validate the signature on every inbound request before processing the payload. Use the same canonical string construction described in Authentication, with one difference: the signature covers the path only of your webhook URL, not its query string. If your endpoint URL includes query parameters, exclude them when rebuilding the canonical string, or the signature will not match.
You decide the acceptable timestamp age. Meridian stamps
X-Meridian-Timestamp when it sends the webhook and does not enforce a window on its own deliveries. Choose a tolerance that suits your infrastructure. Meridian rejects inbound API requests more than 10 seconds old, which is a reasonable reference point. However, retries mean a redelivered webhook can legitimately arrive much later than its original timestamp.
Delivery and retries
Meridian considers a webhook delivered when your endpoint returns an HTTP2xx response. If the request times out or returns a non-2xx status, Meridian retries using exponential backoff. The first retry is after 2 seconds and the interval doubles each time, up to 10 attempts.
Payment link transaction events
Delivery ofpayment_link_transaction events is best effort. If your endpoint does not return a 2xx response, Meridian retries up to 3 times, a few hundred milliseconds apart. Meridian then raises an internal alert for undelivered payment_link_transaction_succeeded and payment_link_transaction_failed events. It is not a guaranteed, replayable queue, so reconcile through the API.
Meridian does not guarantee delivery order. Use transaction.updatedAt to order events for the same transaction.
Key your idempotency check on transaction.id plus transaction.status.