Orders
Orders involve two roles and two messages: as the selling shop the store sends SKUU the seller order, and as the shipping shop it receives a shipping order from SKUU. In between, SKUU decides which shop ships.
1. The online store sends order.created
order.created- The online store. A customer buys a coat the store does not have but that was available on its
SKUU_Networklocation, and pays. - The store's platform. Sends one
order.createdevent with the whole order: the store's order id, the delivery address, every line, and per line the location it is allocated to. The coat is on the store'sSKUU_Networkid; a pair of socks from the store's own stock is on the store's own location id. - SKUU. Checks the signature, that the order is paid and in the store's currency, and stores the seller order. It keeps only the lines allocated to
SKUU_Network; the store's own lines are ignored. - SKUU. Chooses the shipping shop for each network line: a shop that has the article in stock, ships to the destination country, and is not the selling shop itself. When several qualify, stock and distance decide. SKUU routes only to the destination countries on the environment sheet.
- SKUU. Creates the shipping order at that shop; that is direction 2 below.
- SKUU. Answers
200. Invalid payloads, unpaid orders and a mismatched currency receive a permanent4xx; see Errors and retries. A200confirms intake, not physical shipment.
Example: the order.created event
{
"spec_version": "1",
"event": "order.created",
"event_id": "evt_order_01JABC",
"occurred_at": "2026-09-01T10:15:00Z",
"data": {
"order_id": "ORD-10045",
"order_number": "10045",
"created_at": "2026-09-01T10:14:55Z",
"payment_status": "paid",
"currency": "EUR",
"tags": ["consumer-order"],
"shipping_address": {
"name": "A. Customer",
"company": null,
"address_line1": "Example Street 10",
"address_line2": null,
"zip": "1000 AA",
"city": "Amsterdam",
"province": null,
"country_code": "NL",
"phone": "+31000000000",
"email": "[email protected]"
},
"line_items": [
{
"line_item_id": "LINE-1",
"variant_id": "V-123-38-BLK",
"barcode": "8712345678901",
"sku": "WC-38-BLK",
"quantity": 1,
"unit_price": 249.95,
"fulfillment_location_id": "900"
}
],
"subtotal": 249.95,
"total_discounts": 0,
"shipping_cost": 0,
"total_tax": 43.38,
"total_price": 249.95
}
}All fields in `data`
Field in data | Required | What it means |
|---|---|---|
order_id | Required | The store's stable order id. SKUU uses it in the path when it adds tracking. An order is final once SKUU has received it; to stop it before it ships, send order.cancelled, see Cancellation. |
created_at | Required | When the order was placed. |
payment_status | Required | Must be paid. SKUU ignores anything else; send the order once it is paid. |
currency | Required | Must be the currency on the environment sheet. Another value discards the whole order. |
shipping_address | Required | Where the shipping shop sends the parcel, and the country that decides the VAT rate. |
shipping_address.address_line1, country_code | Required | Street and country. |
shipping_address.name, city, zip | Required | Without these SKUU cannot create the shipping order. |
shipping_address.phone | Optional | Passed on to the shipping shop for the carrier. Send it where available. |
shipping_address.email | Optional | Reaches the shipping shop as a SKUU relay address, never the customer's own. |
shipping_address.company, address_line2, province | Optional | Passed on to the shipping shop as given. |
shipping_address.latitude, longitude | Optional | Coordinates of the delivery address, always both. With them SKUU ranks shipping shops by distance to the customer. |
shipping_method | Optional | The delivery method the customer chose, as a code and a title. Shipping orders are created with standard in this version. |
skuu_external_ref | Optional | Loop guard for platforms without tags. If the store's platform sends order.created for an order SKUU created, put SKUU's external_ref from POST /orders here and SKUU skips the event. Leave it out on the store's own orders. |
line_items[] | Required | Every line of the order, including the ones the store's own locations ship. |
line_items[].line_item_id | Required | The store's stable line id. SKUU sends it back when it adds tracking. |
line_items[].variant_id | Required | The variant, by the store's variant_id from the catalogue. |
line_items[].quantity | Required | Quantity on the line. |
line_items[].unit_price | Required | Price per unit before discounts, VAT included. Send discounts separately in total_discounts; do not subtract them here. |
line_items[].fulfillment_location_id | Required | Which location ships the line. Only lines on the store's SKUU_Network id go to the network; the rest are ignored. |
line_items[].barcode, sku, title | Optional | Cross-checks and display. |
shipping_cost | Required | What the customer paid for shipping. Send an explicit 0 for free shipping. Omission or null is invalid. |
total_discounts | Required | Total product discount, VAT included. SKUU allocates it over all order lines by their gross value. Send 0 for no discount; omission or null is invalid. |
subtotal, total_tax, total_price | Optional | Stored for reconciliation. |
order_number, name, tags | Optional | Display and metadata. If the store's platform sends order.created for an order SKUU created, keep the skuu_ship tag on it: SKUU then skips the event instead of recording it as the store's own sale. |
Prices, discounts and shipping
The same SKUU pricing logic processes Shopify and Connect orders: product gross value minus the product discount, then VAT and the agreed revenue split. Shopify supplies discounts allocated per line; Connect supplies total_discounts, which SKUU allocates in proportion to each line's gross value across the whole order. Shipping is allocated by gross value too.
This is why order.created carries the whole order and not only the network lines. A customer who buys a coat the network ships and a pair of socks the store ships itself has one discount and one shipping charge across both. If only the coat were sent, SKUU would put the entire discount on that one line and pay the shipping shop too little.
For example, a customer buys one item the network ships for €121 and one item the store ships itself for €60.50, before discounts, with a €18.15 product discount and €6.05 shipping. Send unit_price: 121 and unit_price: 60.5, total_discounts: 18.15, shipping_cost: 6.05, and total_price: 169.4. Both lines have quantity 1. All these amounts include VAT.
The example in numbers
| Amount | Line the network ships | Line the store ships |
|---|---|---|
| Gross product value | €121.00 | €60.50 |
| Allocated discount | €12.10 | €6.05 |
| Product value after discount | €108.90 | €54.45 |
| Allocated shipping | €4.03 | €2.02 |
With 21% consumer VAT, the network product contributes €90 before VAT. If this example's agreed shipping-shop rate is 87%, its product payout is €78.30 before VAT. For a Netherlands shipping shop with 21% injection VAT, SKUU sends POST /orders with unit_price: 94.74. The actual rates come from the participating shops and variants; 87% is an example, not a value to hardcode. SKUU settles allocated shipping separately at its full value before VAT, without a revenue-split deduction. The Connect shipping-order payload contains the product payout lines; it does not carry a separate shipping-charge field.
Do not discount unit_price and then send the same discount again in total_discounts. Optional subtotal, total_tax and total_price are reconciliation values; they do not override the line-price calculation.
2. SKUU calls POST /orders
POST /orders- SKUU. Groups the network lines by shipping shop, one order per shop, and calls that shop's
POST /orders. The request carries SKUU's reference, the complete delivery address, and the lines with SKUU's line references. - The store's platform. Creates the order as paid and tagged
skuu_ship, so the store's own logic can tell it apart from the store's own orders. The store collects nothing from the customer: the customer paid the selling shop, and SKUU settles with the shipping shop. - The store's platform. Answers
200with the required receipt fields, including the store's ownorder_id. Store SKUU'sexternal_refnext to it; both are needed for tracking and returns. - The online store. Picks, packs and ships. The package goes to Fulfilment.
Example: the POST /orders request
{
"external_ref": "skuu-order-01JABC",
"tag": "skuu_ship",
"payment_status": "paid",
"currency": "EUR",
"ship_to": {
"name": "A. Customer",
"company": null,
"address_line1": "Example Street 10",
"address_line2": null,
"zip": "1000 AA",
"city": "Amsterdam",
"province": null,
"country_code": "NL",
"phone": "+31000000000",
"email": "[email protected]"
},
"shipping_method": {"code": "standard", "title": "Standard carrier delivery"},
"line_items": [
{"external_ref": "skuu-line-01JABC", "variant_id": "V-123-38-BLK", "barcode": "8712345678901", "sku": "WC-38-BLK", "quantity": 1, "unit_price": 249.95}
]
}All fields in the request
| Field in the request | Always present | What it means |
|---|---|---|
external_ref | Yes | SKUU's order reference and the idempotency key. The same reference must always return the same order; different data under it is a 409. |
tag | Yes | Always skuu_ship. Keep it on the order. |
payment_status | Yes | Always paid. |
currency | Yes | The currency of the amounts. |
ship_to | Yes | The complete delivery address. phone is null when the customer gave none. email is a SKUU relay address. |
shipping_method.code | Yes | Always standard in this version. title is a label for the store's screens. |
line_items[].external_ref | Yes | SKUU's line reference. Echo it in fulfillment.shipped. |
line_items[].variant_id, barcode, sku | Yes | Identify the item. At least one of variant_id and barcode is present. |
line_items[].quantity, unit_price | Yes | Quantity to ship and SKUU’s calculated payout price per unit, including any applicable injection VAT. This is not the customer’s retail price. |
{
"success": true,
"message": "Successfully created order.",
"external_ref": "skuu-order-01JABC",
"order_id": "5001",
"status": "created"
}The response, field by field
| Field in the response | What it must be |
|---|---|
success | true |
message | Optional text for people; SKUU does not check its wording. |
external_ref | The reference from the request, unchanged |
order_id | The store's stable id for the created order; send it as data.order_id in fulfillment.shipped |
status | created |
Return 200 with success: true, the references and status: "created". The message is optional and extra response fields are ignored. SKUU retries 429, 5xx and timeouts three times; any other 4xx stops the order and alerts SKUU customer service.
Need more on the order?
The request above is the minimum that creates a shippable order. If the store's platform needs more to create an order, for example the item title on each line, the order totals, a customer note for the carrier, or the selling shop's order number for customer service, SKUU adds those fields for the online store on request. Additions are agreed per shop and only ever add optional fields, so an integration never receives a field it did not ask for. Raise it on the onboarding call or with the SKUU contact.
The next page is Fulfilment. The exact contract is on Send an event and Create a shipping order.
Updated 22 days ago
