Skip to content
Stockroom
Documentation menu

Shopify integration

Connect your Shopify store and sell online out of the same stock you sell at the counter. You choose which products are listed, Stockroom keeps the counts in step, and web orders come back here to pick, pack and ship.

The integration is entirely independent of Square. You can run either, both or neither, and neither one needs the other. Connecting is additive: nothing in Stockroom is gated behind it.

Connecting

Go to Settings → Integrations and authorize your store. Your access token is encrypted at rest and you can disconnect at any time.

Then map the locations whose stock feeds the storefront. Note this is not a per-storefront split: see How the counts stay right below for exactly what gets sent where.

Already selling on Shopify?

You do not have to re-key your catalog. Run the catalog import once and Stockroom brings your existing Shopify products and variants in as real, costed products.

  • Nothing duplicates. Products are matched first by the link Stockroom stores against them, then by SKU, so a second run updates what it already found rather than creating a shadow copy.
  • Re-running is safe. This matters more than it sounds: if an import is interrupted, the fix is to run it again.
  • From then on, Stockroom is the source of truth and pushes changes out to the storefront. The import is a starting point, not an ongoing two-way catalog sync.

Choosing what sells online

Nothing is listed until you say so. On each product you set:

  • Listed — whether it sells online at all.
  • Hold back — a buffer of units reserved for walk-in customers, kept off the storefront.

Both resolve variant first, then product, then your connection default, and each field resolves independently. So you can set a store-wide hold-back of 2, override it to 0 on one product, and set a different value again on a single variant, without any of those choices disturbing the others.

Delisting pushes a zero. It does not simply stop sending updates. If it did, the last number Shopify saw would sit there selling stock you have stopped offering online.

How the counts stay right

Stock reaches Shopify on the request that moved it, inside the same transaction as the stock movement itself. Sell one at 5pm and the storefront knows at 5pm. There is no overnight batch and no scheduled job to wait for, and nothing accumulates to be reconciled later.

What gets sent is your availability: the on-hand across the locations you mapped, minus anything already reserved by unfulfilled orders, minus your hold-back.

Stock is not synced per Shopify location. This is deliberate and worth being precise about. Stockroom sends one pooled availability figure to a single Shopify location and actively holds every other mapped Shopify location at zero. The total Shopify can sell against is therefore always your real availability, but it is not divided across storefronts. Sending the pooled figure to each of several locations would have Shopify add them up and believe you hold several times the stock you actually do.

There is also no pull-inventory mode, in any direction or configuration. Stockroom is the source of truth for stock. A storefront knows nothing you did not tell it, so letting it write counts back into your ledger would be letting it guess.

This is the clearest difference between the two integrations: Square genuinely does sync per location, because Square counts are per location on both sides. See the Square integration for how that side works.

Stockroom owns your stock

Because online and counter sales draw on the same pool, one system has to be the record of truth, and that system is Stockroom. This is enforced structurally rather than left to convention:

  • Turning the Shopify stock mirror on switches Square's inventory sync to push, so your counts flow out to Square rather than Square's counts flowing in.
  • While the mirror is running, Stockroom refuses to set Square's inventory back to pull.

Without that, a web sale would decrement here and then be quietly undone the next time Square's counts were pulled in. The rule covers stock only: catalog and customer directions are yours to set as you like, because a catalog difference is visible and fixable while a stock difference silently oversells.

Web orders

An order from your storefront arrives as a real sales order, confirmed but not yet fulfilled.

That state is doing the work. Because the order is confirmed, it reserves its stock immediately, so availability drops and the storefront stops selling those units the moment the order lands, not when you get round to picking it. You then fulfil it from the normal sales order screen exactly like a counter sale.

  • The money is recorded as the channel charged it, including the tax Shopify calculated, with a payment attached so the order is never shown as unpaid.
  • If a line does not match a product here, the order still comes in with its totals intact and the unmatched line is logged for you to sort out. An order is never dropped.
  • On Growth and above, an order you are short on ships what you have and records the remainder as a tracked backorder that your reorder list already knows about. On Starter it fulfils in full.

Fulfilment & tracking

Fulfil the order in Stockroom and Shopify emails your customer on its own.

Enter a carrier and tracking number on the sale and it goes into that email. You can enter it before or after fulfilling — after is the normal case, since you usually print the label once the box is packed, and Stockroom updates the fulfilment Shopify has already created rather than needing a fresh one.

Tracking is optional. With no number, Shopify still tells your customer it shipped, just with nothing to track.

Cancellations, returns and refunds

These are three different events with three different effects on stock. Treating them as one is how systems end up inventing stock that never existed.

  • Cancelled before you fulfilled it — the order is cancelled and its stock becomes available again. Nothing is written to the ledger, because nothing ever left: the reservation simply disappears.
  • Cancelled after you fulfilled it — the goods are with the customer, so the order's status is left alone and the event is logged for a human to deal with. Stock does not come back on its own.
  • A return (RMA) — the customer sends the goods back and you record a return here, which is what restocks them, at the original cost.

A refund is money only and never moves stock by itself. When the goods actually come back, record the return.

Running alongside Square

Both integrations can run at once, and most of the time they do not interact at all: they touch different tables, and each can be connected, disconnected or reconfigured without reference to the other. The one exception is the stock source-of-truth rule described above.

If Shopify ever disconnects, or its access is revoked, Stockroom marks the connection and shows you, rather than failing silently. Use Sync now on the Integrations tab to catch up after any outage: it re-reads a deliberately overlapping window of recent orders, and re-importing an order you already have is harmless.