React to claim updates
Keep your records in sync with every claim status change using the CLAIM_UPDATE webhook.
Mulberry sends a CLAIM_UPDATE webhook to your claim_update_url every time a claim's status changes, so you can mirror the claim lifecycle in your own system without polling. This page is the operational recipe: receive the event, verify it, correlate it to your records, update your state, and acknowledge.
ACLAIM_UPDATEalso arrives when a claim is auto-closed
CLAIM_UPDATEfires on any status change — including the system auto-closing a claim because its underlying order was cancelled. That arrives withstatusCLOSEDandreasonCLOSED_CANCELLED_BY_CUSTOMER. Don't assume auto-closures are silent: handle aCLOSEDevent the same way whether a human or the system triggered it. See Cancel a warranty.
For the CLAIM_UPDATE payload shape, signing, headers, and retry behavior, this page links to the Webhook catalog rather than repeating them — that page is the single source of truth for the contract. Here we cover only what you do with the event.
Prerequisites
Before you can react to claim updates, confirm:
- Your
claim_update_urlis configured and webhook delivery is enabled for your account. See Configuration. - You have your
mulberry_access_token— the HMAC signing secret. See Get your credentials. - You registered the sale with your own order ID, so incoming events can be matched back to it. See Register the sale.
- Your endpoint captures the raw request body before any JSON middleware touches it (required to verify the signature).
React to a claim update
-
Receive the
POSTat yourclaim_update_url. Each delivery carries the headers and JSON body documented in the Webhook catalog. TheX-Webhook-Topicheader isCLAIM_UPDATE.You should now have the raw request body and the request headers in hand.
-
Verify the signature before trusting anything in the payload. Recompute the HMAC-SHA256 over the raw body with your
mulberry_access_tokenand compare it againstX-Signature-SHA256using a constant-time comparison. See Verify the signature for the exact procedure and code examples.On a match, the request is authentic — continue. On a mismatch, respond
401and stop; do not process the payload. -
Correlate the event to your records. Match the claim by
data.claim.id(the claim UUID), and tie it back to the order you registered usingdata.claim.order.external_order_id— that is the order ID you supplied. (data.claim.order.idis Mulberry's internal order ID, not yours.)You should now have resolved the event to a specific claim and order in your own system.
- The first
CLAIM_UPDATEyou see for a claim may arrive before you've recorded the claim locally — upsert ondata.claim.idrather than assuming the record already exists. - Deliveries can repeat. Deduplicate on the
X-Idempotency-Keyheader (the event'sevent_id) so reprocessing is harmless. See Retries.
- The first
-
Update your records from the partner-facing status in
data.claim.status. Branch on this published subset:statusWhat it means Typical action SUBMITTEDThe claim was filed and received Open/record the claim UNDER_REVIEWMulberry is adjudicating the claim Mark it in progress APPROVEDThe claim was approved for a resolution Record the outcome; check reason,payout_amount, andissued_replacementDENIEDThe claim was not approved Close it as denied RESOLVEDThe claim's resolution is complete Mark it resolved CLOSEDThe claim is closed (including order-cancellation auto-close) Close it; inspect reasonThe supporting fields refine an
APPROVEDoutcome:reasonis an opaque classification string (e.g.FINANCE_APPROVED_REPLACEMENT),payout_amountis the settlement amount when one applies, andissued_replacementistruewhen the resolution is a replacement unit.reasonandpayout_amountarenulluntil they apply.You should now have your local claim record reflecting the new status.
Treat unknown statuses as forward-compatibleThe six statuses above are the published partner subset, but Mulberry's internal lifecycle has more. If you receive a
statusyou don't recognize, don't error or reject the event — acknowledge it and either ignore it or fall through to a safe default. Branch only on the values you know.reasonis a string, not an enum to switch onTreat
reasonas a human-readable label for logging and display. New reason values are added over time, so don't hard-code branching logic against the full set — branch onstatus, and readreason/payout_amount/issued_replacementas detail. -
Acknowledge with a
2xx. Once you've durably recorded the update, return any2xx. That is the entire success contract forCLAIM_UPDATE— unlikeCLAIM_REPLACEMENT, no response body is required.Mulberry treats any non-
2xx(or a timeout) as a failed delivery and may retry it with exponential backoff ifmax_retriesis set. See Retries.The event is now acknowledged and will not be retried.
Keep the handler thin and fastVerify, correlate, persist the status, return
2xx— and do heavier work (notifications, fulfillment routing) asynchronously. Replacements are driven by a separateCLAIM_REPLACEMENTwebhook with its own confirmation contract; don't try to trigger fulfillment from aCLAIM_UPDATE. See the Webhook catalog.
Related
- Webhook catalog — the
CLAIM_UPDATEpayload, signing, headers, and retries - How claims work — the claim lifecycle this webhook reports on
- File a claim — how a claim is filed in the first place
- Cancel a warranty — why an auto-close
CLAIM_UPDATEarrives - Get your credentials — where your signing secret comes from
Updated 20 days ago
