{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Testing on staging"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"testing-on-staging","__idx":0},"children":["Testing on staging"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Applies to direct API integrations."]}," There is no staging connector. To test a Shopify or WooCommerce connection, place a low-value real order and cancel it."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Staging is where every integration is built. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/environments"},"children":["Environments"]}," for why."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"drive-an-order-through-its-states","__idx":1},"children":["Drive an order through its states"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can move a staging order through its statuses yourself from the staging dashboard. Use it to exercise your webhook receiver without asking anyone to move an order for you."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Staging only."]}," The control appears on the production Orders screen but the action is not permitted there. Nobody moves a live order's state from the dashboard."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Open ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Orders"]}," in the staging dashboard, select the orders you want to move, then ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Admin Actions → Bulk Change State"]},". The dialog offers the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["state"]}," values as ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/order-lifecycle#order-statuses-and-their-events"},"children":["Order statuses and their events"]},", including ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["delivery_failed"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/quiqdash-09-bulk-change-state.9711e654cc192332d133974c5fb8844d0237439f7ea93ef560bc80f1f6694508.a8224ebd.png","alt":"The Orders list with the Admin Actions menu open, showing Bulk Change State"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Your webhook fires on each transition, so this is how you exercise a receiver end to end without waiting on a real courier."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"a-complete-test-pass","__idx":2},"children":["A complete test pass"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Run all of these on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.staging.quiqup.com"]}," before you ask for go-live."]},{"$$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":"#"},"children":["#"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Scenario"},"children":["Scenario"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"What proves it"},"children":["What proves it"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Authenticate"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["You hold a working token. On the Quiqdash path there is no call to make, so confirm the token you generated is accepted. On client credentials, confirm you cache it rather than re-authenticating per request."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["2"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Create a Next Day pre-paid order"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A success response with an order id"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Create a Next Day COD order"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payment_mode: paid_on_delivery"]}," with an amount above 1"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["4"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Create a Same Day order"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Confirms the service is enabled on the account"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["5"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Create a fourth order and cancel it"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /orders/batch/set_cancelled"]}," returns the order with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["state: cancelled"]},". Cancel works until collection starts, so this also works after release."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["6"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Mark the other three ready for collection"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["State moves off ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["7"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Download the AWB (shipping label) for each"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /order_label/{order_id}"]}," returns a PDF"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["8"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Retrieve an order"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /orders/{order_id}"]}," returns the current state"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["9"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Drive one order to delivered"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/webhooks"},"children":["webhook endpoint"]}," receives a callback at every transition"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["10"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Drive one order to a failed delivery"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your code handles the non-happy path"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["11"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Read an order's history"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /orders/{order_id}/history"]}," returns every state it passed through"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["12"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Retry a create after a simulated timeout, sending the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["uuid"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The retry returns HTTP 200 with the original order id, and no second order or AWB exists. Without a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["uuid"]}," the retry makes a duplicate, which you would have to find and cancel before collection starts."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Five orders in total, counting the create in scenario 12. Keep the order ids and your own ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_order_id"]}," values. Support asks for them at go-live."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"going-live","__idx":3},"children":["Going live"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Production use follows a commercial agreement and an activated production account. Ask early rather than at cutover: those are the gates that take time, not the key."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Checklist:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," Commercial terms agreed and the account activated (trade licence, bank card, finance details)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," The staging scenarios above all pass, with references sent to support"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," The services you use are enabled on the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["production"]}," account"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," A key for production, named after the environment, or production client credentials if you use the client-credentials flow"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," Base URL switched to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api-ae.quiqup.com"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Production webhook URL registered"]}," in ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/webhooks#register-your-endpoint"},"children":["Quiqdash"]},". Staging registrations do not carry over."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," One production order created, released and confirmed collected before your first real order"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-changes-between-environments","__idx":4},"children":["What changes between environments"]},{"$$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":""},"children":[]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Staging"},"children":["Staging"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Production"},"children":["Production"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Quiqdash key"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Generated on the staging dashboard"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Generated on the production dashboard. Use each key only on its own host: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/environments#which-credentials-cross-environments"},"children":["why"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Client credentials"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Separate pair"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Separate pair"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Base URL"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["api.staging.quiqup.com"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["api-ae.quiqup.com"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Webhook subscription"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Separate subscription, separate signing secret"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Separate subscription, separate signing secret"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Couriers"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Simulated"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Real"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Charges"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["None"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Real"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Nothing carries over automatically. Every item above is configured twice."]}]},"headings":[{"value":"Testing on staging","id":"testing-on-staging","depth":1},{"value":"Drive an order through its states","id":"drive-an-order-through-its-states","depth":2},{"value":"A complete test pass","id":"a-complete-test-pass","depth":2},{"value":"Going live","id":"going-live","depth":2},{"value":"What changes between environments","id":"what-changes-between-environments","depth":2}],"frontmatter":{"seo":{"title":"Testing on staging"}},"lastModified":"2026-10-16T10:31:15.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/lastmile/testing","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}