FIELD NOTES · ACCEPTANCE EXERCISES

Does a Shopify quote actually hold the stock?

A quotation can show four units without holding four units. Before commissioning a quote-to-checkout feature, specify whether staff are promising a price, reserving stock, or merely inviting payment. Those are different commitments. This brief is for shop owners and their website team, not a promise that a draft-order integration prevents every oversell.

What the platform evidence establishes

Shopify’s draft-order guidance distinguishes reserved inventory from units that remain available and requires inventory tracking for a reservation. Read on 16 October 2026. This supports a timed hold in the native workflow; it does not establish atomic allocation across competing integrations or warehouses.

Filled stock ledger

Synthetic example: one tracked SKU at one location has 12 units on hand. Three are committed to other orders. Quote Q17 requests four; its proposed reservation ends at 14:00 AEDT. The three existing commitments explicitly exclude Q17.

On narrow screens, scroll sideways to read the full table.

StateQ17 holdAvailable calculationCustomer message
Draft only012 − 3 = 9Quote sent; availability unconfirmed
Active reservation412 − 3 − 4 = 5Four units held until 14:00 AEDT
Reservation expires without order012 − 3 = 9Hold ended; recheck before paying

Choose the scope before choosing an app

Use the native timed reservation when the real store’s workflow supports the required stock hold. A draft without a reservation can still suit an indicative quote, provided its wording never says stock is secured. If the business requires allocations across locations, partial quantities or bespoke approval stages, ask for a separate design and a concurrent-order test rather than assuming a quote app supplies those guarantees.

Run the handover test

  1. Record SKU, location, on-hand quantity and existing commitments in an authorised test environment.
  2. Create the four-unit quote without a hold. Confirm its status says unreserved.
  3. Reserve the four units to a recorded expiry and check the available quantity becomes five in this fixture.
  4. Test expiry without payment, successful completion and a second competing order. Reconcile each reservation once; a completed order must not be released again as an expired quote.

Acceptance output

Keep quote ID, location ID, reservation expiry with timezone, observed available quantity and completion status in one redacted row. The expected output is a traceable stock promise, not an email screenshot. A negative quantity, an unknown expiry or a reservation that cannot be tied to its quote blocks an “in stock and held” message.

Limits and next decision

The downloadable arithmetic is a serial teaching model, not a Shopify API client or evidence that any shop was tested. It excludes backorders, bundles, transfers and multi-location routing. Confirm the current store’s features and inventory behaviour before rollout. Price consistency is a separate acceptance task: see the five-layer price-evidence resource.

Replay the teaching example

These files run locally without network access. They model only the stated cases, not a live vendor integration. Filled inputs and expected results · Inspectable teaching functions

Save both files in one folder. With Node 22.13 or newer, run:

node decision-check.mjs draft-order-stock-hold.json