Catalog audit
The audit reads every variant in your shop and reports what is wrong with its barcodes and SKUs: duplicates, broken check digits, lost leading zeros, invisible characters, and anything sitting in stock that cannot be rung up at the till.
Reading the whole report is free, on every plan, and always will be. Rewriting the codes in bulk — with a before-and-after preview, an undo and a log of every value changed — is the Pro half.
Run it
Press Run audit at the top right. The screen updates as the run finds things. If your catalog is still being read after install, a banner says so and the number will move as the rest arrives — nothing is wrong.
You can also have it run on its own: Settings → Catalog audit offers daily or weekly, with an email when something new breaks. That is on Pro; the report itself is not.
Read the report
Catalog health
One number out of 100 with a badge next to it, plus when it was last checked and across how many variants.
The number is arithmetic you can check. Every problem type carries a weight of 1, 2 or 3, and the weights are statements about the till rather than about tidiness:
- 3 — the item cannot be sold correctly right now: it will not scan, or it scans as the wrong thing
- 2 — the code is wrong or missing, but nothing is mis-selling today; it fails the moment someone prints, exports or sells it
- 1 — real, worth fixing, harmless at the counter
Health is 100 × (1 − total damage ÷ (variants scanned × 3)). So a catalog where every variant carries one critical problem scores 0; where a tenth do,
- An empty catalog scores 100, because nothing is wrong with nothing.
What is wrong
A table of the problem types actually present, worst first, with a count and a severity badge. Each row has two buttons: Show filters the list below to that problem, and Fix starts a bulk fix for it.
Every problem
The row-by-row list, 50 at a time, showing the product, its SKU, its barcode and a sentence naming the defect. Filter it by severity, by problem type, or by a free-text search over code, SKU and product name.
When several variants share one code, each row carries a See everything sharing this code link that narrows the list to that group.
Export CSV downloads exactly what the filters are showing.
The fourteen problems, and what each one means
Critical — the till is wrong today
Same barcode on different variants. Two or more variants carry one code, so a scan at the till picks one of them and it may not be the one in the customer's hand. This is the single most damaging state a catalog has, and it is what "my inventory does not match" usually turns out to be. Every member of the collision is shown as one group.
Collides with another product's GTIN. Reported in two situations. Either the code once belonged to a variant that no longer exists — labels printed with it are still out there in the stockroom — or the code is registered as a scan alias of a different variant, so one scan has two answers.
Different codes for the same item in two locations. Shopify keeps one barcode per variant, so this happens the way merchants actually cause it: the same item is duplicated per location (a "Warehouse" copy and a "Store" copy) and the two drifted apart. Recognised by a shared SKU with stock in more than one location and different barcodes. Such a group is also reported as a duplicate SKU, deliberately: the duplicate SKU is a reporting problem, the diverging barcodes are a till problem, and fixing one does not fix the other.
Has stock but no barcode. Units on the shelf that cannot be rung up.
Wrong check digit. The last digit of an EAN or UPC is computed from the others. When it does not match, the code is either mistyped or was truncated, and scanners reject it.
Will not scan as printed. The value contains characters the symbology cannot encode, uses an application identifier that is not a GS1 one, or is simply longer than any label can carry a linear symbol for (past 48 characters the symbol is wider than the labels we print on).
Leading zero lost (the Excel problem). A code that started with a zero was opened in a spreadsheet, treated as a number, and came back one digit shorter. The report names the code it should have been. This one hides a wrong check digit behind it, so when Markio finds a lost zero it does not also shout about the check digit — fixing the front fixes the back.
Warning — wrong, but not mis-selling right now
Wrong length for its symbology — an EAN-13 with twelve digits, an ITF with an odd number of them.
Letters in a digits-only code — the character is named.
Invisible or non-printable characters — non-breaking spaces, zero-width characters, Unicode dashes instead of hyphens, full-width digits, and Cyrillic or Greek letters that look identical to Latin ones. Each offending character is shown as its Unicode code point (U+00A0), because that is the only unambiguous way to show something you cannot see.
No barcode.
Same SKU on different variants.
Info — real, but harmless at the counter
No SKU.
SKU and barcode disagree with your rule. This fires only for a shop that has declared a SKU-to-barcode rule — a rule invented for you and then enforced against your whole catalog would be worse than no check. There is no screen for declaring that rule yet, so today this check does not fire for anyone.
Fix problems in bulk
(On the Pro plan. The report stays free.)
- Choose When two variants share a code: - Keep the oldest, mint a new code for the newer ones — the default. The oldest variant keeps the code; the rest get freshly minted ones. - Keep the oldest, clear the newer ones — the rest are emptied and you issue codes yourself later. - Ask me which one keeps the code — see the caveat below.
- Press Fix on a problem row.
- Nothing is written yet. A section appears headed Review before anything changes, listing every variant, which field, the value before and the value after.
- Press Apply these N changes. The catalog updates in the background.
- If it was wrong, press Undo this batch. Every code goes back to what it was.
Only the most recent batch is kept on screen. "Undo the last one" is the promise; a list of every batch ever is a different screen.
What the fixer does per problem
| Problem | The fix |
|---|---|
| Same barcode / SKU on different variants | The keeper is left alone. The others are cleared, and given a new code unless you chose "clear". |
| Collides with another GTIN, will not scan, wrong length, letters in a digits-only code | The code is replaced outright with a freshly minted one. |
| Leading zero lost, wrong check digit | Corrected to the value the audit already computed. |
| Invisible characters | The cleaned value is written back. |
| SKU and barcode disagree with your rule | The SKU is rewritten to what the rule says. |
| No barcode, stock without a barcode, no SKU | A new code is minted. |
| Different codes in two locations | Not fixed automatically — deciding which of two real items is which is not something an app should do for you. Merge or renumber them yourself. |
Minting always goes through the numbering rules on Barcodes & SKUs. If no numbering rule exists, the fix stops with "No code sequence is configured for this shop" — create one first. If you own a GS1 company prefix, new codes are valid EAN-13s built from it, check digit included; if you do not, they are internal Code 128 codes. Markio never invents a GTIN.
Caveat: "Ask me which one keeps the code" has nowhere to answer
The strategy exists in the picker, but there is currently no screen for supplying the per-group decision, so choosing it produces "Nothing to change: the selected issues need a decision". Use one of the two automatic strategies, or fix that group by hand in Shopify.
Common tasks
Fix a barcode that scans as two different products
- Run the audit.
- Filter to Same barcode on different variants.
- Click See everything sharing this code on one of the rows to see the whole group.
- Decide which one keeps the code — normally the oldest, which is what the default strategy assumes — then press Fix on that problem row and review the preview.
- Apply, then reprint the labels for whatever changed. The changed variants now carry new codes, and the old labels on the shelf are wrong.
Find everything that cannot be rung up
Filter severity to critical and look for Has stock but no barcode. Then go to Print labels, tick Only without a barcode, and print for those.
Get the report out to someone else
Export CSV at the top right. It carries the current filters, so you can hand a supplier a file of only the codes that came from them.
Troubleshooting
The health score dropped and I did not change anything
An audit run is a snapshot. If your catalog was still being indexed on the previous run, that one was measured on fewer variants. Also check whether another app writes codes — Markio's live check runs on every product update, so a bulk import by something else shows up here immediately.
Every EAN-13 in my shop is flagged with a wrong check digit
Your codes are probably internal, not retail GTINs. Markio guesses the symbology from the shape of the value when it has not been told, and a 13-digit internal number is indistinguishable from an EAN-13. Nothing in the audit screen sets this; if this is your situation, use Code 128 for internal codes going forward and treat the check-digit rows as noise until then.
"Nothing to change — those issues need a decision or a code source first"
One of three things: you chose the "Ask me" strategy (see above), you have no numbering rule to mint replacement codes from, or the issues you selected are of a type that carries no automatic fix (cross-location mismatches).
A fix said "Code sequence … is exhausted"
The numbering rule hit its Stop at ceiling. Raise it on Barcodes & SKUs, or use a different rule.
"The GS1 company prefix has no capacity left"
Your prefix has issued every number it holds. A shorter prefix holds more numbers; buying more capacity is a conversation with GS1, not with us.
Some changes say "failed"
Shopify rejected the write. The reason is shown on the row. The usual causes are a code another app claimed in the same second, or a variant that was deleted between the preview and the apply. Re-run the audit and fix the remainder.
I applied a fix and the shelf labels are now wrong
They are — the codes changed. Reprint them. The Reprint just what changed button after a batch takes you to the Print screen with the condition Only what the last bulk fix changed already in force, so the list holds exactly those variants and nothing else. Tick them, pick your template and print as usual.
Only what actually landed is in that list. A change Shopify rejected left the variant carrying its old code, so its label on the shelf is still right; and after Undo this batch the list is empty, because every code went back to what it was.
Where do legal barcodes come from?
A real EAN-13 or UPC-A belongs to whoever bought the number from GS1. No app can mint one out of thin air, and codes resold cheaply are rejected by Amazon and Bol. A single GTIN from GS1 US is about $30; a company prefix starts near $250 plus a yearly fee. If the code only ever has to work inside your own shop you need none of that — print Code 128, which needs no registration and scans anywhere.
Related
- Barcodes & SKUs — issuing and importing codes
- Print labels — reprinting what changed
- Settings → Catalog audit — schedule and alerts