How to find duplicate barcodes in Shopify
Shopify will happily let two variants carry the same barcode. Your scanner will not tell you which one it picked.
What a duplicate barcode actually costs you
A barcode is supposed to be an answer, not a question. When two variants carry the same one, every scan of it becomes a coin flip that nobody sees happen:
- The till rings up the wrong item. The price may be right by luck; the stock movement is wrong by construction.
- Inventory drifts silently. One variant goes negative, another sits on phantom stock, and nothing in Shopify flags either.
- Receiving lands on the wrong SKU, so the drift compounds every delivery.
- Reports lie. Best-sellers, dead stock and reorder points are all computed from movements that went to the wrong row.
"My inventory does not match" is, more often than not, this. It is the single most damaging state a catalog can be in, and it is invisible from the Shopify admin — there is no duplicate-barcode report there.
Why Shopify lets it happen
The barcode field on a variant is a free-text field. Shopify does not check the value against anything: not against a check digit, not against a symbology, and not against your other variants. That is a reasonable decision for a platform that has to accept every numbering scheme in the world — but it means the uniqueness nobody enforces is yours to enforce.
Duplicates arrive by ordinary means, not by carelessness:
- A product is duplicated in the admin to make a similar one, and the barcode comes along with it.
- A CSV import fills the barcode column from a template row.
- The same item is kept twice, once per location — a "Warehouse" copy and a "Store" copy — and the two drift apart.
- A supplier re-uses a GTIN on a discontinued line.
- A code is retired from a deleted variant and issued again to a new one, while labels printed with the old code are still in the stockroom.
Finding them by hand, and why it does not scale
The manual route is a product export and a spreadsheet:
- In the Shopify admin, Products → Export → All products, CSV.
- Open it, sort by the
Variant Barcodecolumn. - Add a helper column comparing each row to the one above it, and filter to the matches.
That finds exact duplicates and nothing else. It will not see a barcode with a non-breaking space in it that scans differently from its twin, it will not see the leading zero a spreadsheet has already eaten while you were looking, and it tells you nothing about which of the colliding variants is the one with stock on the shelf. And it is a snapshot: two weeks later you do it again.
What Markio looks for instead
Markio mirrors your catalog and reports fourteen kinds of code problem, ranked by whether they are costing you money at the counter today. Four of them are duplicate-shaped:
- Same barcode on different variants — every member of the collision shown as one group, not as N separate rows you have to reassemble.
- Collides with another product's GTIN — the code belongs to a variant that no longer exists, or it is registered as a scan alias of a different variant. Either way one scan has two answers.
- Different codes for the same item in two locations — recognised by a shared SKU with stock in more than one place and barcodes that have diverged.
- Same SKU on different variants — a reporting problem rather than a till problem, and reported separately for exactly that reason.
Alongside them sit the near-duplicates a sort never catches: wrong check digits, lost leading zeros, and invisible characters — non-breaking spaces, zero-width joiners, Cyrillic letters that look identical to Latin ones — each shown as its Unicode code point, because that is the only unambiguous way to display something you cannot see.
Clearing a duplicate without breaking the shelf
Finding it is half the job. The other half is deciding which variant keeps the code, and that decision is yours — the labels already printed and stuck to boxes are a fact about the physical world that no app can read.
So Markio does not guess. For a collision it shows every variant holding the code, with the stock behind each, and offers to issue fresh codes to the others from a numbering rule you control. Before anything is written you see a before-and-after preview of every single change; after it is applied, the whole batch has an undo, and the undo re-reads the live value from Shopify first so it never overwrites something you changed in between.
The old code is retired, not forgotten: it is never handed out again, and it can be registered as an extra code that still scans to the right product — which is what lets a half-relabelled shelf keep working while you finish it.
Doing it once, then keeping it clean
A catalog that was clean this morning is not clean this evening. Markio can run the audit on a schedule and email you when something new appears, so the next duplicate is caught the week it is created rather than the quarter your stock count disagrees.
Markio finds every duplicate in one pass
The catalog audit groups each collision, tells you which variant has stock behind it, and lets you re-issue codes for the rest with a preview and an undo. The report is free on every plan.