{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Fulfilment"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"fulfilment","__idx":0},"children":["Fulfilment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Applies to the Fulfilment API only."]}," Host ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["platform-api.quiqup.com"]},". If you hold your own stock and just need it delivered, you want ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/lastmile"},"children":["Last-mile"]}," instead."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Quiqup stores your stock in a warehouse, picks it, packs it and ships it. Four objects, in the order you meet them."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Object"},"children":["Object"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"What it is"},"children":["What it is"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"You create it"},"children":["You create it"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Product"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A SKU we can hold. Weight, dimensions, price, whether it is batch or expiry managed."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Once, before anything else"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Inbound"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A booked delivery of stock into the warehouse."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Every time you send us stock"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Inventory"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["What is actually on the shelf, per SKU, split into buckets."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Never. You read it."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Fulfilment order"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["An instruction to pick, pack and ship to a customer."]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Per customer order"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Nothing works until products exist. Inventory only appears after an inbound is received. An order for a SKU with no stock cannot be fulfilled."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-shortest-path-to-a-shipped-order","__idx":1},"children":["The shortest path to a shipped order"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create your products."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/fulfilment/products"]},", or upload a CSV. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/products"},"children":["Products"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Book stock in."]}," Find a slot, book an inbound, send the stock. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/inbound"},"children":["Inbound"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wait for receipt."]}," The warehouse counts what arrived and inventory appears. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/inventory"},"children":["Inventory"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create an order."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/fulfilment/orders"]},". See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/orders"},"children":["Fulfilment orders"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Track it."]}," The order carries a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tracking_url"]}," and runs the same states as any other Quiqup shipment. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/order-lifecycle"},"children":["Order lifecycle"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Steps 1 to 3 happen once per catalogue and once per restock. Step 4 is the loop you build."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-is-shared-with-last-mile","__idx":2},"children":["What is shared with Last-mile"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["More than you might expect."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Credentials."]}," The same token works on both hosts. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/authentication"},"children":["Authentication"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Order states."]}," A fulfilment order reports the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," values as a last-mile order, because once it is picked it becomes a Quiqup shipment. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/order-lifecycle"},"children":["Order lifecycle"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["order.*"]}," webhooks."]}," Same events, same payload shape, same signing. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/webhooks"},"children":["Webhooks"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Service kinds."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_next_day"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_same_day"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_4hr"]}," mean the same thing on both."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-is-not-shared","__idx":3},"children":["What is not shared"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The host."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["platform-api.quiqup.com"]},", not ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["api-ae.quiqup.com"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The error envelope."]}," Fulfilment returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{code, message, details}"]},", with no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," field: read the HTTP status. Last-mile returns something else entirely. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/errors"},"children":["Error responses"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The order object."]}," A fulfilment order ID is not a last-mile order ID. You cannot pass one to the other API's endpoints."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Two extra webhook families."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inbound.*"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inventory.*"]}," only exist here."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Extra states."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["picking_started"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wms_on_hold"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["problematic"]}," only occur on fulfilment orders, before the warehouse hands the order over."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"testing-on-staging","__idx":4},"children":["Testing on staging"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Build against ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://platform-api.staging.quiqup.com"]}," with a staging credential. Paths, fields and errors are the same as in production."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Your staging account has to be enabled for fulfilment."]}," Until it is, booking an inbound fails with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed_precondition"]}," and the message \"This account is not activated for fulfilment yet\". Ask your account manager to enable it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Products and inbound bookings behave as in production."]}," Create the SKUs you will test with first, then book an inbound for them."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["No API call receives an inbound."]}," Stock appears only when the warehouse records a receipt, so on staging an inbound stays ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]}," and your inventory stays at zero until Quiqup receives it. To get stock onto a staging SKU, email ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"mailto:apisupport@quiqup.com"},"children":["apisupport@quiqup.com"]}," with the inbound ID or the SKUs and quantities you need."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["An order for a SKU with no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["available"]}," stock cannot be fulfilled"]},", on staging as anywhere else. Check ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/inventory/{sku}"]}," before you create test orders."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"pages-in-this-section","__idx":5},"children":["Pages in this section"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/products"},"children":["Products"]},". Loading your catalogue, one at a time or in bulk."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/inventory"},"children":["Inventory"]},". Reading stock, buckets, batches and expiry."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/inbound"},"children":["Inbound"]},". Booking stock into the warehouse."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/fulfilment/orders"},"children":["Fulfilment orders"]},". Creating and updating orders."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi"},"children":["Fulfilment API reference"]},". Every operation."]}]}]},"headings":[{"value":"Fulfilment","id":"fulfilment","depth":1},{"value":"The shortest path to a shipped order","id":"the-shortest-path-to-a-shipped-order","depth":2},{"value":"What is shared with Last-mile","id":"what-is-shared-with-last-mile","depth":2},{"value":"What is not shared","id":"what-is-not-shared","depth":2},{"value":"Testing on staging","id":"testing-on-staging","depth":2},{"value":"Pages in this section","id":"pages-in-this-section","depth":2}],"frontmatter":{"seo":{"title":"Fulfilment"}},"lastModified":"2026-10-16T10:31:15.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/fulfilment","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}