order/cancelled
Overview
| Property | Value |
|---|---|
| Webhook type | order/cancelled |
| Kafka topic | order.cancelled |
| Direction | Platform → Your endpoint |
Description
Fired when an order is cancelled. Cancellation can be initiated by an operator, by the customer, or automatically by the system (e.g. payment failure, inventory exhaustion with inventoryPolicy: DENY).
Trigger Conditions
- An operator cancels the order via the GraphQL API
- All order lines transition to
CANCELEDstatus - Automatic cancellation due to inventory policy or other business rules
- Note: cancellation of individual lines does not trigger this event; it triggers
order/updated
Message Envelope
json
{
"header": {
"organizationId": "org_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"messageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"webhookId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"type": "order/cancelled",
"date": "2024-03-15T12:00:00.000Z"
},
"body": { ... }
}Body — Property Table
The body has the same shape as order/created. See order-created.md for the full property table.
In a cancelled order, the following fields will always be set:
| Field | Expected value |
|---|---|
lines[].status | CANCELED for all cancelled lines |
locked | false |
Note: the state field does not have a dedicated CANCELLED enum value in the OrderState enum. The cancellation is reflected at the line level (status: CANCELED) rather than in the top-level order state.
Full JSON Payload Sample
json
{
"header": {
"organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"messageId": "a7b8c9d0-e1f2-3456-abcd-678901234567",
"webhookId": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"type": "order/cancelled",
"date": "2024-03-15T12:00:00.000Z"
},
"body": {
"id": "d4e5f6a7-b8c9-0123-defa-234567890123",
"externalReference": "SHOP-12345",
"organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"tpAppId": "e5f6a7b8-c9d0-1234-efab-345678901234",
"shippingMethodId": "f6a7b8c9-d0e1-2345-fabc-456789012345",
"shippingMethodName": "Colissimo Domicile",
"collectPointId": null,
"collectPointCountry": null,
"collectPointZipCode": null,
"type": "B2C",
"dispatchingType": "AUTOMATIC",
"total": 85.00,
"totalTaxInclusive": 102.00,
"totalShipping": 5.99,
"totalDiscount": 0.00,
"totalVat": 17.00,
"totalInsurance": null,
"currency": "EUR",
"invoiceNumber": "INV-2024-001234",
"invoiceUrl": "https://cdn.example.com/invoices/INV-2024-001234.pdf",
"gift": false,
"inventoryPolicy": "DENY",
"issuedAt": "2024-03-15T09:00:00.000Z",
"prepareAt": null,
"receivedAt": "2024-03-15T10:23:45.000Z",
"fulfillmentRequestedAt": null,
"buyer": {
"id": "a7b8c9d0-e1f2-3456-abcd-567890123456",
"type": "PERSON",
"organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"fullname": "Alice Dupont",
"email": "alice.dupont@example.com",
"address": "12 Rue de la Paix",
"addressComplement": "Apt 4B",
"zipcode": "75001",
"country": "FR",
"city": "Paris",
"state": null,
"phone": "+33612345678",
"comments": null,
"metadata": null,
"taxId": null,
"eori": null,
"form": null,
"capital": null,
"companyId": null,
"registration": null
},
"billingContact": {
"id": "a7b8c9d0-e1f2-3456-abcd-567890123456",
"type": "PERSON",
"organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"fullname": "Alice Dupont",
"email": "alice.dupont@example.com",
"address": "12 Rue de la Paix",
"addressComplement": "Apt 4B",
"zipcode": "75001",
"country": "FR",
"city": "Paris",
"state": null,
"phone": "+33612345678",
"comments": null,
"metadata": null,
"taxId": null,
"eori": null,
"form": null,
"capital": null,
"companyId": null,
"registration": null
},
"deliveryContact": {
"id": "b8c9d0e1-f2a3-4567-bcde-678901234567",
"type": "PERSON",
"organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"fullname": "Alice Dupont",
"email": "alice.dupont@example.com",
"address": "12 Rue de la Paix",
"addressComplement": "Apt 4B",
"zipcode": "75001",
"country": "FR",
"city": "Paris",
"state": null,
"phone": "+33612345678",
"comments": null,
"metadata": null,
"taxId": null,
"eori": null,
"form": null,
"capital": null,
"companyId": null,
"registration": null
},
"seller": null,
"comment": "Cancelled by customer request",
"meta": null,
"state": "OPENED",
"priority": "NORMAL",
"locked": false,
"opening": false,
"sourceType": "CMS",
"deliveryType": "HOME",
"lines": [
{
"id": "c9d0e1f2-a3b4-5678-cdef-789012345678",
"orderId": "d4e5f6a7-b8c9-0123-defa-234567890123",
"status": "CANCELED",
"label": "T-Shirt Blanc Taille M",
"sku": "TSHIRT-WHITE-M",
"price": 25.00,
"vatRate": 0.20,
"total": 50.00,
"totalTaxInclusive": 60.00,
"fulfillableQuantity": 2,
"quantity": 2,
"fulfilledQuantity": 0,
"meta": null,
"locationId": null,
"shippingMethodId": null,
"number": "1"
},
{
"id": "d0e1f2a3-b4c5-6789-defa-890123456789",
"orderId": "d4e5f6a7-b8c9-0123-defa-234567890123",
"status": "CANCELED",
"label": "Pantalon Bleu Taille 38",
"sku": "PANTS-BLUE-38",
"price": 35.00,
"vatRate": 0.20,
"total": 35.00,
"totalTaxInclusive": 42.00,
"fulfillableQuantity": 1,
"quantity": 1,
"fulfilledQuantity": 0,
"meta": null,
"locationId": null,
"shippingMethodId": null,
"number": "2"
}
]
}
}Related Events
order/created— initial order creationorder/updated— partial cancellations and intermediate state changesorder/completed— alternative terminal state (success)
Notes
order/cancelledis a terminal event. Once an order is cancelled, no further order events will be emitted.- The
statefield on the order object does not change to a "cancelled" value — cancellation is expressed at the line level (status: CANCELED). - Partial cancellations (only some lines cancelled) emit
order/updated, notorder/cancelled. - If cancellation occurs while a delivery order is already in progress, the fulfillment service may receive a cancellation request — check for corresponding
delivery_order/cancelledevents. - A cancelled order may still have associated delivery orders in terminal states — check their events for the full picture.