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?
- One store is in charge. That store's stock is copied to your other stores. Sales in the other stores don't change it. Needs two or more stores. For example, a supplier's shop and the shops that resell its goods.
- Everything shares one stock. Every product with the same SKU shows the same count, and selling one anywhere lowers all of them. Works with one store or many. For example, one mug sold as ten different products.
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.
- One main store can feed as many connected stores as you like. A connected store follows one main store at a time.
- A connection syncs one location per store. You choose the main store's location when you set it up, and each connected store's when it joins.
- Only available quantities change. Products, variants, prices and everything else in a connected store are never created, edited or deleted.
- Products are matched by SKU, so the same product needs the same SKU in both stores.
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:
- You run both stores. Press Install on your other store. Shopify asks which store, installs StockUnison there if needed, and the code is copied to your clipboard on the way. In that store press Enter code, paste, and pick the location the counts should go into.
- Someone else runs the other store. Send them the invite link shown beside the code. It works whether or not they already have StockUnison, and it holds the code across the install, so nothing gets lost.
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.
| Mode | What happens |
|---|---|
| Preview | Changes are calculated and written to the activity log, but the connected store's stock is never touched. This is where every connection starts. |
| Live | Stock changes in the main store reach the connected store within seconds. |
| Paused | Nothing 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
- Someone edited stock directly in the connected store.
- A change happened while the connection was paused or in preview mode. (Going live doesn't change these — fix them from the SKUs page.)
- A write failed — the activity log will show it.
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.
- One store or many. To share across stores, each other store installs StockUnison and joins with your code. A SKU on only one product has nothing to share and is left alone. There is a fuller guide to the one-store case.
- The check comes first. Nothing is written until you have seen exactly which products would change, and by how much. Going live sets the products of each SKU to their lowest count, because showing more stock than you have is what causes overselling.
- One location per store. Stock is counted at the location you pick; your other locations are left alone.
- It checks itself. Your catalogue is checked again when a store joins or changes its location, a few minutes after a product change that puts a SKU on another product, and once a day while live. Once you're live, a check also brings every product with a shared SKU to the same count. Check now on the SKUs page does it straight away.
- It stops rather than guesses. If the numbers stop adding up — a CSV import, another app writing stock — StockUnison stops updating that SKU and says why, instead of spreading a wrong count.
- Any store can pause. Every store sharing the stock can pause from its dashboard. Counts stop moving; nothing is forgotten, and resuming catches up.
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:
- The activity log carries a row for every change StockUnison handled, and the ones that didn't land say Failed with the reason. Filter by result to see only those.
- The difference check compares every matched SKU across both stores and lists the gaps — which is what a failed write leaves behind. It runs by itself once a day while a connection is live, and the SKUs page says when it last ran.
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.
| Plan | Price | Live connected stores |
|---|---|---|
| Free | $0 | None — matching, preview mode, checks and the log all still work |
| Starter | $19/mo | 1 |
| Growth | $39/mo | Up to 5 |
| Scale | $79/mo | Unlimited |
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.
- Pause — stops updates immediately. Matches and history stay. Resuming catches the connected store up.
- Switch to preview mode — keeps calculating and logging without touching stock.
- Stop following (from the connected store) or Remove (from the main store) — ends the connection. The matched products and activity log are kept, and the store can join again later with your code.
- Stop being the main store — disconnects every store still following, and each of them is told. The code stops working and the store goes back to the first page.
- Stop sharing stock — for shared stock. Every product keeps the count it has now; nothing is rewritten and the history stays readable.
- Uninstall — from Shopify's Apps page. Connections are dissolved and the other store keeps its history readable. Reinstalling the main store picks up where it left off.
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:
- 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.
- Was it the synced location? A connection syncs one location per store. A change at any other location is ignored.
- Is that SKU matched? Search for it on the SKUs page. Duplicates and one-sided SKUs are never synced.
- Does the main store have a plan? Live writes need one. Matching and preview mode don't.
- 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
- Only stock counts. Products, variants, titles, prices, images and orders are never created, changed or deleted.
- One way, when one store is in charge. Connected stores never write back to the main store, and never sync to each other.
- Never guesses. An ambiguous SKU is skipped and reported, not resolved by guesswork.
- One location per store.
- Catalogues up to 250,000 variants per store. Both shapes have been run on stores of 100,000.
- No bundles or kits, and no channels outside Shopify. If you need either, the category side by side says which apps do.
- No customer data. The app never requests or stores it. See the privacy policy.
Still stuck? Email [email protected].