Skip to content

order/completed

Overview

PropertyValue
Webhook typeorder/completed
Kafka topicorder.completed
DirectionPlatform → 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 OrderLine entries for the order reach FULFILLED or DELIVERED status
  • The order state transitions from OPENED to COMPLETED
  • 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:

FieldExpected value
stateCOMPLETED
lockedfalse (unlocked after completion)
lines[].statusFULFILLED or DELIVERED for all lines
lines[].fulfilledQuantityEqual 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"
      }
    ]
  }
}

Notes

  • order/completed is a terminal event — no further order/updated events 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 COMPLETED state once remaining lines are fulfilled.

HappyColis API Documentation