StockUnison setup and help

StockUnison keeps stock counts in sync wherever you sell the same item: one store in charge and the others copying it, or every product with the same SKU sharing one stock.

Updated 25 September 2026 · questions this doesn't answer → [email protected] · background reading → guides

Two ways to share stock, and which is yours

The first page of the app asks one question: when the other store sells one, should this store's count go down too?

Not sure? If a sale in any store should lower the stock everywhere, share one stock. If only one store's stock should count, put that store in charge. Nothing changes until you go live, whichever you pick.

One store in charge: how it works

One store is the main store. Its stock counts are the ones everybody follows. Every other store is a connected store, and gets updated to match.

Stock moves one way only, from the main store to the connected stores. StockUnison never writes back to the main store, so no loop is possible, and editing a count in a connected store never changes the main store.

Nothing is written until you say so. Every new connection starts in preview mode, where changes are calculated and logged but no stock moves.

Setting up two stores

Set the main store up first.

1. Put the main store in charge

Open StockUnison in that store's admin and press Put this store in charge. Pick the location whose counts should be copied. If the store has one location, it's chosen for you.

2. Carry the code to the other store

The main store's home page then shows a numbered guide with a six-character code. There are two ways to use it:

Codes last seven days and can be regenerated at any time from Settings. Regenerating stops the old code working immediately; stores that have already joined keep syncing.

3. Match, check, go live

StockUnison matches products by SKU as soon as the store connects, then checks their counts. The guide shows the list; look it over, then go live. Nothing changes in the connected store until that last step.

Matching products by SKU

A SKU is the identifier on a product variant — the "SKU (Stock Keeping Unit)" field on Shopify's product page. StockUnison matches products across stores by it. Capitals and stray spaces don't matter: abc-1 and ABC-1  count as the same SKU.

The list is built when a store connects, and built again a few minutes after a product is added, edited or deleted in either store — only changes to which products carry which SKUs count, so orders don't set it off. Match now, beside when products were last matched on the SKUs page, does it straight away. Matching is free and never writes anything to either store.

Matched
Found in both stores, so it can be synced. These are the only products that ever move.
Duplicate in main store / Duplicate in connected store
Two or more variants share this SKU, so there is no way to tell which one is meant. These are never synced, deliberately — guessing is how other tools overwrite the wrong product. Fix the duplicate in Shopify, and it's matched again within a few minutes.
Missing in connected store
The main store has this SKU and the connected store doesn't. Add it in the connected store if it should sync, or ignore it.
Missing in main store
The connected store has this SKU and the main store doesn't, so StockUnison isn't managing it. Usually fine — it just means that product isn't part of the sync.

Variants with no SKU at all can't be matched. The SKUs page counts them in its Variants with no SKU card, says which store they're in, and See which names some from each store, so a catalogue with thousands of blanks tells you the number rather than listing every title. Only variants that track stock are counted, so a gift card or a service that doesn't track stock never shows up there: it has nothing to sync.

If the list has more duplicates than you expected, the guide on duplicate SKUs covers where they come from and how to find them all in a product export.

Preview mode, live and paused

Every connection is in exactly one of three modes, and you can change it at any time from either store.

ModeWhat happens
PreviewChanges are calculated and written to the activity log, but the connected store's stock is never touched. This is where every connection starts.
LiveStock changes in the main store reach the connected store within seconds.
PausedNothing syncs. Changes in the main store are logged as skipped and not made.

Going live doesn't change counts that already differ. From then on, each change in the main store reaches the connected store within seconds — but anything that changed while the connection was paused or in preview mode stays as it is. The SKUs page lists them — counts are checked after every match and once a day while live — and Fix N differences there brings them back in line. The main store can also choose Fix differences from a connected store's ⋯ menu on its Home. The result is reported on screen, and each write appears in the activity log.

Pausing loses nothing permanently. Matches, history and the connection are all kept. Resuming sends changes from then on; fix whatever changed while paused from the SKUs page.

Checking the counts still agree

A difference is when a connected store's count no longer matches the main store's. StockUnison compares every matched SKU across both stores after each match, and once a day while the connection is live. Check now, beside when they were last checked on the SKUs page, compares them straight away.

If anything differs, the page lists each SKU with its main store count, its connected store count, and the difference — a positive number means the connected store is holding more than the main store says it should. Fix N differences pushes the main store's counts across and settles it. That button writes, so it only works while the connection is live.

A difference is only ever known as of the moment it was measured, so the app always shows the age of the last check — "In sync · 2 h ago". A fresh all-clear and a week-old one look different on purpose.

Where differences come from

Shared stock: how it works

Press Share this store's stock on the first page, in the store that holds the stock. StockUnison then reads every product and finds the SKUs that are on more than one product. Every product with the same SKU shows the same count, and when stock changes on one of them — a sale, a restock or an edit — the others change with it within seconds.

The SKUs page says what can't be shared, and in which store. Variants with no SKU have nothing to share by: See which names some from each store, each linked to its page in that store's admin. Variants with no count to keep in sync don't track stock, or hold none at the location their store shares from.

Shared stock is right only if these products really sell from one stock. If each store keeps its own stock, don't share — put one store in charge instead.

Setting up shared stock

Start in the store that holds the stock. If you only have one store, that is the whole setup — steps 1, 3 and 4.

1. Turn on sharing

Open StockUnison in that store's admin and press Share this store's stock. Pick the location the counts should be read from and written to. If the store has one location, it's chosen for you.

2. Add your other stores — optional

Skip this if you are sharing stock inside one store. Otherwise each other store installs StockUnison and joins with your code, exactly as a connected store does: the same six-character code, the same invite link, and the same choice of location on the way in.

3. Check your catalogue

Press Check my catalogue. StockUnison reads every product in every store sharing, and finds the SKUs that are on more than one product. Until you go live, nothing is written by a check — run it as often as you like, at any catalogue size, on the free plan.

4. Review, then go live

The check shows every SKU it found on more than one product and the count each product currently holds, so you can see exactly what would change and by how much before anything moves. Going live sets the products of each SKU to their lowest count, and from then on, when stock changes on one of them, the others change with it.

Going live writes inventory and there is no undo, so the review step is the one worth taking slowly. You can download what every product held at the moment of a check, from the same page, and keep it.

Reading the activity log

Every decision StockUnison makes is recorded, whether or not it wrote anything, and every store involved sees the same log. Each row shows the SKU, what happened, the before and after counts, what triggered it, and when.

Updated
The store's stock was updated. The row shows the change, for example 24 → 30.
Preview
The change was calculated and recorded, but the store wasn't touched because the connection isn't live yet.
Skipped
Nothing needed doing, or nothing could be done. The reason is in the row: the counts already agreed, the SKU isn't matched, the main store doesn't track that item, or syncing is paused.
Failed
The update couldn't be saved. The row says why. Most failures retry themselves on the next stock change.

You can search by SKU and filter by result, by what triggered the change, and by date.

Catching a failure you didn't see

Everything above assumes you opened the app — and a write that failed is exactly the thing nobody thinks to go and look for. Two places show it, both free on every plan:

Between them they also catch the failure that has no row at all — a catalogue where nothing matches any more, after a CSV re-import or a migration recreated the products.

There is an email field in Settings → Alerts, and it doesn't send yet. StockUnison stores the address and does nothing further with it, so don't treat it as cover — the two checks above are what finds a broken sync today. Write to [email protected] if you want telling when alerting ships.

Plans and who pays

Only the main store carries a subscription. Connected stores install free. (See the plans and prices.) Plans are limited by how many connected stores are live at once — a connected store in preview mode or paused doesn't count against the limit.

Shared stock works the same way: the store that started sharing carries the plan, the stores that joined are free, and the plan covers how many stores share with it. Sharing stock in one store on its own needs Starter.

PlanPriceLive connected stores
Free$0None — matching, preview mode, checks and the log all still work
Starter$19/mo1
Growth$39/moUp to 5
Scale$79/moUnlimited

Every paid plan includes a 14-day free trial. Change or cancel from Settings → Plan → Change plan in the main store, which opens Shopify's own billing page — StockUnison never sees or handles your card.

Moving to a smaller plan never breaks anything: the oldest live connections stay live up to the new limit, any extras drop to preview mode, and the app tells you which. Nothing is disconnected and no history is lost.

Pressing Go live on a connected store and getting refused? The plan lives on the main store, not this one. Its Settings page is where the plan is chosen.

Adding more stores

Use Add another store on the main store's home page. It hands you the same three things as the first time: a button that opens Shopify's store chooser, the code, and a shareable invite link. One code connects as many stores as you like, and it doesn't expire when a store uses it.

Each new store goes through the same steps on its own — join, match, then go live — and appears on the main store's home page with its own mode, match count and differences.

Setting this up for a client? Every paid plan is free to select on a development store — see the partner program.

Pausing, disconnecting, uninstalling

All of it keeps your history. Only the last one has to be set up again afterwards — uninstalling dissolves the connections, though reinstalling picks your history back up.

To have everything deleted rather than archived, email [email protected]. Shopify also requires us to erase a store's data after uninstall, which happens automatically.

When something isn't working

I changed a quantity and the other store didn't move

Work down this list — it's ordered by how often each one is the answer:

  1. Is the connection live? Preview mode and paused both leave the connected store alone by design. The mode badge is at the top of the page.
  2. Was it the synced location? A connection syncs one location per store. A change at any other location is ignored.
  3. Is that SKU matched? Search for it on the SKUs page. Duplicates and one-sided SKUs are never synced.
  4. Does the main store have a plan? Live writes need one. Matching and preview mode don't.
  5. Check the activity log. If the change reached StockUnison at all there is a row for it, and the row says what happened.

Everything says "SKU not matched" and nothing syncs

This nearly always means the products were recreated since matching last ran — a CSV re-import, a bulk-edit app or a migration all do it. The stored matches point at products that no longer exist. StockUnison matches again a few minutes after products change, which relinks them, and Match now on the SKUs page does it straight away. The app watches for this and shows a warning when it sees a run of unmatched changes.

The counts don't agree

Open the SKUs page: the counts are checked after every match and once a day while live, and Check now, beside when they were last checked, checks them straight away. Then press Fix N differences to push the main store's counts across. If it keeps coming back, something is editing the connected store directly — another app, a POS, or a person.

I can't go live

Two things are checked, in that order. First, has anything matched? A connection with nothing matched cannot write anything, so going live is refused until matching finds at least one pair. Matching starts on its own when a store connects, so on a new connection this usually means it hasn't finished yet. Second, the plan: going live needs a plan on the main store, and a plan slot free. If every live connected store your plan covers is in use, either upgrade or switch a store you don't need live to preview mode — that frees the slot at no cost.

A product shows as a duplicate

Two variants in that store share one SKU. StockUnison won't guess between them, so it syncs neither. Give them distinct SKUs in Shopify, and they're matched again within a few minutes.

I need to change which location syncs

If the store shares stock with others, open Settings on that store and use Change location. Its products stop sharing stock, and a check of your catalogue starts straight away; when it finishes they share again from the new location. The move itself changes no stock, in either location.

On a one-store-in-charge connection the location is still fixed when a store joins. To change it there, disconnect that store and join it again with the location you want. The code is reusable.

A shared SKU says "Needs review"

The counts stopped adding up — usually a CSV import or another app rewriting stock — so StockUnison stopped updating that SKU rather than spread a wrong number. Each one says why on the SKUs page. Turn off whatever else is writing that stock, then, in the store that started sharing, use Start the numbers over in Settings: it rebuilds every shared count from what your products hold now and goes back to preview mode, so nothing is written until you go live again. A check can't clear it, because a check carries each shared count forward from the last one.

What it deliberately doesn't do

Still stuck? Email [email protected].