order/completed
Overview
| Property | Value |
|---|---|
| Webhook type | order/completed |
| Kafka topic | order.completed |
| Direction | Platform → Your endpoint |
Description
Fired when an order transitions to the COMPLETED state. This happens when all order lines have been fulfilled (shipped or delivered). It is the terminal success state for an order.
Trigger Conditions
- All
OrderLineentries for the order reachFULFILLEDorDELIVEREDstatus - The order
statetransitions fromOPENEDtoCOMPLETED - Internal completion is triggered by the fulfillment pipeline after all shipments are confirmed
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/completed",
"date": "2024-03-16T14:30: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 completed order, the following fields will always be set:
| Field | Expected value |
|---|---|
state | COMPLETED |
locked | false (unlocked after completion) |
lines[].status | FULFILLED or DELIVERED for all lines |
lines[].fulfilledQuantity | Equal to quantity for all lines |
Full JSON Payload Sample
json
{
"header": {
"organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"messageId": "f6a7b8c9-d0e1-2345-fabc-567890123456",
"webhookId": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"type": "order/completed",
"date": "2024-03-16T14:30: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": "2024-03-15T11:00:00.000Z",
"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": null,
"meta": null,
"state": "COMPLETED",
"priority": "NORMAL",
"locked": false,
"opening": false,
"sourceType": "CMS",
"deliveryType": "HOME",
"lines": [
{
"id": "c9d0e1f2-a3b4-5678-cdef-789012345678",
"orderId": "d4e5f6a7-b8c9-0123-defa-234567890123",
"status": "FULFILLED",
"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": 2,
"meta": null,
"locationId": "f0a1b2c3-d4e5-6789-f0ab-123456789012",
"shippingMethodId": null,
"number": "1"
},
{
"id": "d0e1f2a3-b4c5-6789-defa-890123456789",
"orderId": "d4e5f6a7-b8c9-0123-defa-234567890123",
"status": "FULFILLED",
"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": 1,
"meta": null,
"locationId": "f0a1b2c3-d4e5-6789-f0ab-123456789012",
"shippingMethodId": null,
"number": "2"
}
]
}
}Related Events
order/created— initial order creationorder/updated— intermediate state changesorder/cancelled— alternative terminal state
Notes
order/completedis a terminal event — no furtherorder/updatedevents will be emitted after this.- An order can only complete once. This event is guaranteed to fire exactly once per order (if it completes successfully).
- For split shipments (multiple delivery orders), completion is triggered only when the last delivery order is fulfilled.
- If an order is partially cancelled (some lines cancelled, remaining fulfilled), the order can still reach
COMPLETEDstate once remaining lines are fulfilled.