Skip to main content
Unlisted page
This page is unlisted. Search engines will not index it, and only users having a direct link can access it.

Inventory Manager Technical Reference

This page explains how the Inventory Manager and its Reserve Inventory feature actually work: where the numbers come from, what Zubs asks Shopify to do, and what to expect at the edges. It is written for development teams, agency partners and systems integrators. For the merchant-facing walkthrough, read Inventory Manager instead.

Overview​

The Inventory Manager is two features sharing one daily pass over your subscription data:

  • Inventory Planner — a read-only forecast. It counts the units each variant needs over the next 7, 14 and 30 days across all active subscriptions, and shows that next to your live stock level.
  • Reserve Inventory — an active hold. It creates Shopify draft orders that set stock aside so it cannot be sold to anyone else before the billing date arrives.

Reserve Inventory is an extension of the planner: it can only be switched on while the planner is on, and it reuses the same data the planner already gathered.

Four-step daily flow: a background job runs once a day, reads contracts, billing cycles and stock from Shopify, works out demand, and writes one draft order per billing date

Everything happens in a single daily run. The Merchant Portal is a display surface only — it shows what that run last produced and never recalculates anything, which is why a change you make now appears in the tables tomorrow rather than immediately.


Inventory Planner​

What Feeds the Forecast​

For every active subscription contract, Zubs looks at the billing cycles coming up and totals the units each variant will need.

  • Skipped cycles are excluded. A customer who skips their next order stops contributing to the forecast on the next run.
  • A cycle counts until it bills. A cycle due today still counts until its order is created. Once it has billed, it drops out. A cycle whose payment failed drops out after its billing day, while payment retries run.
  • Cycle-level edits win over the standing contract. If a specific cycle has been edited — a one-off swap, an added item, a changed quantity — the forecast reflects the edit, not the contract's usual lines.
  • The horizons are cumulative. The 30-day figure includes the 14-day figure, which includes the 7-day figure.
  • Current Stock is the sellable total across all locations. Where a variant is not inventory-tracked, the column reads "Not tracked" and no stock figure is used.

Snapshot, Not History​

Each run replaces the whole table for your store at once. There is no partial state — either the new snapshot lands or the previous one stays untouched — and no history is retained.

If you need a time series of forecast versus actual, take the CSV export on a schedule. It includes both product and variant IDs specifically so it can be joined against an external planning or ERP system.


Reserve Inventory​

The Shopify Mechanism​

Zubs does not invent a reservation primitive. It uses the one Shopify already has: a draft order with an inventory reservation and an expiry time.

When such a draft order exists, Shopify moves its line-item quantities out of Available and into Unavailable, where the admin labels them Draft orders. The units stay there until the expiry passes, at which point Shopify releases them on its own.

Three stacked bars showing 100 units on hand: first all available, then 70 available with 30 unavailable while reserved, then 70 available with 30 committed after the order is created

Three consequences follow, and most questions about the feature resolve to one of them:

  1. A reservation is not a stock adjustment. On-hand quantity never changes and nothing is written to your adjustment history.
  2. Reserved units are genuinely unsellable. They are out of Available, so no channel — storefront, POS, another draft order — can take them.
  3. Reserved units are not Committed. Committed means a real order is waiting on fulfilment. A reservation only becomes committed stock once the subscription actually bills.

How Reservations Are Grouped​

One draft order per billing date, not per subscription. A store with 4,000 subscribers billing across 14 dates gets 14 draft orders, not 4,000. The grouping matches how fulfilment teams think, and it keeps the Shopify admin usable.

For each upcoming billing date inside the look-ahead window, Zubs adds up the units every subscription due that day will need, per variant. Skipped cycles are left out, variants without inventory tracking are dropped — Shopify cannot reserve what it does not track — and so is every variant of a product on the shop's excluded list. Exclusions apply to the reservation only: the planner's forecast and its shortfall figures still count that demand.

Each draft order is tagged zubs and carries a note naming its billing date and explaining that it should not be converted into an order.

Keeping Reservations in Sync​

Reconciliation flow: clear expired reservations, line up remaining ones against dates now due, then per date either delete, create, update or leave untouched

Release Timing​

Timeline of one reservation across a fourteen-day look-ahead window, then the order of events on the billing date: the hold is released, then the orders are created

The single rule worth internalising: on each billing date the reservation is released before that day's subscription orders are created.

That ordering is not cosmetic. Reserved units are not Available, and a subscription order draws from Available — so a hold that outlived its own billing run would block the very order it exists to protect. The consequence is a short window on the billing date during which the stock has been released but not yet claimed, and is sellable to anyone.

Every draft order carries its own expiry, set to the moment that billing date's subscription orders start being created. Shopify releases the held stock at that moment on its own, so the ordering holds even on a day the daily run is missed.

Turning It Off​

Switching Reserve Inventory off tears everything down immediately: every reservation draft order is deleted and the stock returns to Available within seconds. This does not wait for the next daily run.

Switching the planner off does the same: Reserve Inventory is switched off with it and the same teardown runs. Switching the planner back on leaves Reserve Inventory off until it is switched on again.


What Merchants See​

In the Merchant Portal​

Inventory Manager → Inventory Planner carries both toggles, the look-ahead selector, the forecast table with its totals row and CSV export, and — when reservations are on — a Reserved Inventory table listing each billing date, when the hold expires, a link to the draft order, and how many variants it covers. When reservations are on and a variant's free stock does not cover a billing date, the forecast table also shows a Shortfall column — total missing units and the first short date, with the per-date breakdown one click away — and the CSV export adds the same figures. A date drops out of the shortfall once that day's charge run has started.

The look-ahead window accepts 1 to 30 days and defaults to 14. A shorter window keeps more stock available for general sales; a longer one protects subscribers earlier at the cost of taking stock off the floor sooner.

In the Shopify Admin​

Reservation drafts appear under Orders → Drafts, tagged zubs. Held stock shows on the product's inventory breakdown under Unavailable, itemised as Draft orders.

Do not complete or delete these drafts by hand

Completing one turns a stock hold into a real, unpaid order. Deleting one releases the stock without telling Zubs, and the reservation will not be recreated until that date's demand happens to change — so the protection quietly stops existing. Switch Reserve Inventory or the planner off instead; those toggles are the only supported way to remove them.


Limits Worth Knowing​

Reservations update daily, not instantly. A cancellation, skip, quantity change or new subscription is reflected in the held quantities on the next run — up to 24 hours later. This is deliberate: the feature protects stock over days, not seconds. In practice held quantities are a slight over-estimate for most of the day.

Untracked variants are never reserved. They still appear in the forecast, marked "Not tracked", but nothing is held for them.

Current Stock reads net of your own reservations. Once Reserve Inventory is on, that column shows free stock rather than total stock — the units Zubs is already holding have been subtracted. Comparing it against the planned columns is therefore conservative: if the figure still looks sufficient, you have that much on top of what is already protected.

Multi-location stores. Zubs does not pin a reservation to a location; Shopify resolves that through your order-routing configuration. Treat a reservation as a guarantee about total sellable stock rather than about stock at a particular warehouse.

Reservations reduce stock failures without eliminating them. A cycle can still fail for insufficient inventory — an untracked item, a late change, a shortfall the window did not cover. Those failures are handled by the separate inventory retry settings described in Payment Failure Handling. Enabling reservations changes nothing about how such a failure is retried.


Verification Checklist​

A useful sequence when validating the feature on a test store:

  1. Enable both toggles and wait for the next daily run. Confirm draft orders appear under Orders → Drafts, grouped by billing date and tagged zubs.
  2. Check a reserved product's inventory breakdown. The held units should sit under Unavailable → Draft orders, with on-hand unchanged.
  3. Skip a billing cycle and confirm, after the next run, that the date's draft order no longer includes the skipped items.
  4. Cancel a subscription and confirm the affected date's quantities drop, or that the draft order disappears if nothing remains.
  5. Let a billing date pass and confirm its draft order is gone and the orders for that day were created successfully.
  6. Disable Reserve Inventory and confirm every draft order disappears immediately.

Need help? Contact support at support@zubs.app.