{
"id": "event_xxxxx",
"object": "event",
"created": 1750062041000,
"type": "order.succeeded",
"data": {
"object": {
"orderId": "order_xxxxx",
"sessionId": "sess_xxxxx",
"type": "onetime",
"merchantReferenceId": "pay_ref_123",
"customerId": "cus_xxxxx",
"customerEmail": "customer@example.com",
"amountSubtotal": 19.99,
"amountTotal": 9.99,
"paymentCurrency": "USD",
"originalCurrency": "USD",
"discount": {
"couponId": "coupon_1",
"couponName": "Ten off",
"couponTerms": "10 USD off",
"promotionCode": "SAVE10",
"discountAmount": 10,
"originalDiscountAmount": 10
},
"status": "success",
"paymentTime": 1750062041000,
"paymentMethod": {
"paymentMethodType": "CARD",
"paymentInstrumentId": "pi_xxxxx",
"cardScheme": "Visa",
"cardLastFour": "4242",
"issuerRegion": "US",
"issuerBank": "Chase Bank"
},
"metadata": {
"orderNo": "ORDER-10001"
}
}
}
}order
Handles order lifecycle events.
For orders created through Universal Commerce Protocol (UCP), data.object.metadata.checkoutId identifies the originating Checkout throughout the order lifecycle. When OMS creates a third-party order through a connected merchant order channel and the merchant returns its order ID, data.object.merchantReferenceId contains that merchant-side order ID, not an OMS internal order ID. If no third-party merchant order was created, merchantReferenceId is omitted from the UCP terminal event.
{
"id": "event_xxxxx",
"object": "event",
"created": 1750062041000,
"type": "order.succeeded",
"data": {
"object": {
"orderId": "order_xxxxx",
"sessionId": "sess_xxxxx",
"type": "onetime",
"merchantReferenceId": "pay_ref_123",
"customerId": "cus_xxxxx",
"customerEmail": "customer@example.com",
"amountSubtotal": 19.99,
"amountTotal": 9.99,
"paymentCurrency": "USD",
"originalCurrency": "USD",
"discount": {
"couponId": "coupon_1",
"couponName": "Ten off",
"couponTerms": "10 USD off",
"promotionCode": "SAVE10",
"discountAmount": 10,
"originalDiscountAmount": 10
},
"status": "success",
"paymentTime": 1750062041000,
"paymentMethod": {
"paymentMethodType": "CARD",
"paymentInstrumentId": "pi_xxxxx",
"cardScheme": "Visa",
"cardLastFour": "4242",
"issuerRegion": "US",
"issuerBank": "Chase Bank"
},
"metadata": {
"orderNo": "ORDER-10001"
}
}
}
}Headers
Timestamp sent by Clink for webhook signature verification.
Hex-encoded HMAC-SHA256 signature generated with the webhook signing secret over the string ${X-Clink-Timestamp}.${rawRequestBody}. Use the raw request body bytes/string exactly as received; do not parse and re-serialize the JSON before verifying.
Signature algorithm used to generate X-Clink-Signature. The current value is SHA256.
SHA256 Body
Order event payload in json
Unique identifier for the event
Type of event that occurred
order.created, order.next_action, order.succeeded, order.failed Type of this json payload, 'event' if this is an event
"event"
Unix timestamp in milliseconds when the event occurred
Show child attributes
Show child attributes
Response
Return a 200 status to indicate that the data was received successfully.
Account response
Only needed for orders that buy credits on your service, such as a top-up bought through a Skill Marketplace Skill. When order.succeeded arrives for such an order, create or top up the user's account, then return the result in the response body.
type | Return it when |
|---|---|
account.created | No account matched data.object.customerEmail. You created the account and applied the purchase as its first top-up. |
account.reloaded | An existing account matched data.object.customerEmail, and you applied the purchase to it. |
{
"object": "event",
"type": "account.created",
"data": {
"customerEmail": "customer@example.com",
"webSite": "https://merchant.example.com",
"userId": "usr_xxxxx",
"amount": 19.99,
"currency": "USD"
}
}
An account.reloaded response has the same shape.
| Field | Requirement |
|---|---|
object | Always event. |
type | account.created or account.reloaded. |
data.customerEmail | Must match data.object.customerEmail in the event. |
data.webSite | Your website's absolute URL, including http:// or https://. |
data.userId | The user's ID in your system, not the Clink customerId. |
data.amount | Copy data.object.amountTotal from the event. |
data.currency | Copy data.object.paymentCurrency from the event. |
- Commit the account change before you respond. A non-2xx status or a timeout makes Clink retry the event.
- Deduplicate on the event
id. For a repeated delivery, return the stored response without creating another account or applying the top-up again. - Clink uses this body only for orders paid through Agent Payment, and makes the result available to the buyer's agent. For other orders and other order events, an empty body is enough.
For the full processing sequence, see Handle Skill payment webhooks.