Why don't my Shopify draft order invoices hold inventory while wholesale customers pay?

Draft orders and invoices don't hold stock while you wait on a wholesale payment — here's why, and how to stop it from causing oversells.

inventorydraft-ordersB2Bwholesalenet-terms

What's going on

A wholesale buyer agrees to a deal, you send them a draft order invoice, and they take a few days to pay via wire transfer or net terms. In the meantime, your website (or another sales rep) sells the same units to someone else, because nothing in Shopify actually took that stock off the shelf when the invoice went out. By the time the wholesale payment clears, you're short — and now you're calling a customer to say their order can't be fulfilled.

This is a structural gap, not a bug: a draft order in Shopify is a quote/invoice object, not an order. It never creates a checkout session, so it never triggers Shopify's normal inventory reservation behavior (the same short hold a regular customer gets while paying at checkout). Nothing is deducted, committed, or reserved until the draft is actually completed into a real order — whether that happens because the buyer paid the invoice, you marked it as paid, or you collected payment with assigned net terms. Until that moment, the units on that draft look exactly as available as everything else in your store to every other channel and every other staff member.

The risk is highest exactly where wholesale and net-terms selling live: multi-day payment windows, multiple people creating drafts against shared stock, and thin-margin bulk SKUs where a handful of oversold units is a real cost, not a rounding error.

Why it happens

Shopify treats a draft order as a proposal — an editable quote you can send as an invoice — not as a commitment against stock. Inventory accounting only happens at the order level: available quantity drops (and committed quantity rises) when an order is created, whether through checkout completion or through completing a draft. A draft sitting unpaid, no matter how long, sits entirely outside that accounting.

This differs from the regular storefront checkout flow, where Shopify does apply a short-lived inventory reservation the moment a shopper starts paying, specifically to stop two customers from checking out with the last unit at the same time. Draft orders were never built with an equivalent hold, because they were designed for flexible, editable quoting (adjusting price, line items, shipping) up until the moment someone actually commits — and merchants relying on them as a de facto wholesale ordering system are stretching them past that original design intent.

5 ways to fix it

1

Complete the draft order into a real order as soon as terms are agreed (free, native)

Inventory is not touched at all while an order lives as a draft — draft orders don't create a checkout session and don't place any reservation, no matter how long an invoice sits unpaid. Inventory is only deducted once the draft is completed into an actual order, which you can do immediately by marking it as paid or by collecting payment with net terms (e.g. Net 30). This means the fix usually isn't a setting, it's a workflow change: for wholesale/net-terms deals, complete the draft (creating the order) at the moment the buyer commits, rather than leaving it as an open, unpaid draft while you wait for a wire transfer or check to clear. Once completed, the order deducts from available/committed inventory the same as any other order, regardless of its payment status.

2

Turn off "continue selling when out of stock" on wholesale-exposed variants

If a variant allows overselling, Shopify will let both a retail checkout and a completed draft order sell past zero available stock, which is exactly how double-booking happens across channels during a payment window. In each variant's Inventory section, disable the continue-selling toggle so the moment stock hits zero it can no longer be added to a new draft order or checkout without an explicit override, giving you a hard backstop while a wholesale deal is pending.

3

Use a manual inventory hold as your source of truth until the draft is completed

Because Shopify itself won't reserve stock for an open draft, you need your own convention for what counts as "spoken for." A common pattern: as soon as a wholesale draft is created, manually decrement on-hand/available inventory (or move the reserved quantity to a separate location such as "Wholesale Hold") so other sales channels can't sell it, then transfer it back or complete the order once payment lands. Document this as a rule for staff — e.g. "available inventory in the storefront location excludes anything sitting in an open wholesale draft" — so there's one clear source of truth instead of the storefront count and the sales team's mental tally disagreeing.

4

For recurring B2B/net-terms selling, move buyers onto Shopify B2B with payment terms instead of ad hoc drafts

If wholesale orders are a regular part of the business (not occasional), Shopify's B2B on Shopify Plus lets company buyers check out through a real order with assigned payment terms (Net 30/60/90, etc.), which deducts inventory at order placement just like any other order — removing the draft-order gap entirely because there's no draft stage to begin with. This is the most durable fix if net-terms wholesale is a core, ongoing sales motion rather than a one-off.

5

Set a short internal SLA for converting drafts and audit stale ones weekly

Since nothing in Shopify will expire or flag an old unpaid draft, oversell risk grows the longer a draft sits open. A lightweight operational fix is a rule of thumb — for example, invoices must be completed or cancelled within 3-5 business days — plus a recurring check of the Draft Orders list sorted by date, so no draft quietly sits open for weeks while its inventory looks available to everyone else.

Bottom line

There's no Shopify setting that reserves stock for an unpaid draft order — the platform simply doesn't touch inventory until a draft is completed into a real order, so the fix is procedural: complete drafts promptly (or use B2B payment terms so there's no draft stage at all), turn off overselling on the variants you sell wholesale, and agree internally on what counts as "spoken for" stock in the meantime. BesPoP doesn't have a dedicated inventory-holds app for this today; if the gap keeps causing oversells, a lightweight inventory-hold or B2B-terms app (from any developer) is the more scalable route than manual spreadsheet tracking.

Still Stuck?

Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.