MarkioHelp center → Barcodes & SKUs

Barcodes & SKUs

This screen is about the codes themselves rather than the labels they end up on. It reads top to bottom as one job in four sections: it issues new codes to variants that have none, it imports codes you already have, it lists the codes your staff scanned that found nothing, and it registers an older code a product should also answer to. Export all codes (CSV) sits in the page header, next to the title.

Generating and importing codes is free on every plan, with no limit on how many. The scan journal and adding an extra code are paid.


Numbering rules

A rule says what a generated code looks like. Create at least one before issuing anything — the bulk fixer in the Catalog audit needs one too.

The rules live inside the issue section below, behind the folded Numbering rules line: they are set once and then only picked from a list. Press Create a rule (or Add another rule) — the form opens as a dialog — and fill in:

  • Rule name — how you refer to it later.
  • Pattern — the shape of the code. As you type, the form shows exactly what it produces from a sample product, so you never save a rule that only fails on the thousandth variant.
  • Next number — where the counter stands.
  • Zero-pad to — how many digits the bare counter is padded to (0–12).
  • Scope (optional) — a note for yourself: the location or supplier this rule is for. It does not create a separate pool. Each RULE owns its own counter, so two rules never hand out the same number — pick the right rule when you issue codes.
  • Stop at (optional) — a ceiling. For a GS1 prefix, this is how many numbers it holds.

Pattern tokens

TokenWhat it inserts
{seq} / {seq:5}The counter, optionally zero-padded to N digits.
{vendor} / {vendor:3}Vendor, optionally cut to N characters.
{productType}Product type.
{title}Product title.
{option1} {option2} {option3}The variant's options — size, colour.
{sku}The variant's existing SKU.
{date} / {date:YYYYMMDD}The date the code is issued.
{random:4}Random digits, 1 to 12 of them.

Text tokens are folded to what the target symbology can actually encode, so a title with an accent or an ampersand in it does not produce a code that will not print. A width after a colon cuts a text token to that many characters, and zero-pads a numeric one.

Example: {vendor:3}-{option1}-{seq:5} on a grey medium T-shirt from Acme produces ACM-M-00042.

The counter is handed out inside a transaction, so two people pressing Issue at the same moment get different ranges rather than the same numbers. That is the exact damage the audit exists to clean up, and it is not left to luck.


Issue codes to variants that have none

The section says how many variants in your shop have no barcode. If that is zero, there is nothing to do here.

  1. Pick a Numbering rule.
  2. Pick Issue as: - Code 128 — an internal code, any characters. Needs no registration and scans anywhere. This is the right answer for most shops. - Code 39 — an internal code for older scanners. - EAN-13 from your own GS1 prefix — only selectable once you have saved a prefix below.
  3. Press Preview what would be written. Up to 500 variants are covered in one pass, oldest first, and a table shows a sample of what each would get. Anything the pattern cannot encode is flagged and will be skipped.
  4. Press Write these codes to Shopify.

Nothing is written until that second button. A bulk write onto a live catalog is never one click.

Only variants with an empty barcode are ever touched. Run it again to continue past 500; because the order is stable, a re-run picks up where the last one stopped.


Your GS1 company prefix

This one lives in Settings → Barcodes & SKUs: it is set once and then forgotten, so it sits with the other settings rather than on the working screen.

If you already pay GS1, put your own company prefix in — 6 to 12 digits, exactly as GS1 issued it. Markio then builds valid EAN-13s from it, check digit included, and tells you how many numbers the prefix holds and when it is running out.

Markio does not sell barcode numbers. A real EAN-13 or UPC-A is registered to whoever bought it from GS1. Apps that resell numbers cheaply are selling codes Amazon and Bol reject, and Amazon has been checking them against the GS1 database since 2026. A single GTIN from GS1 US is about $30 one-off; 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 — issue Code 128.


Issue a code automatically to new products

In Settings → Barcodes & SKUs, under Issue automatically, choose what happens when a product arrives — from the admin, an import, or another app:

  • Off — the default. New products and variants are left as they arrive.
  • A barcode, when the variant has none
  • A SKU, when the variant has none
  • Both, each when the variant has none

It uses the first numbering rule, so create one first.

Two things it deliberately does not do:

  • It is off unless you turn it on. It writes into your live catalog, and a code nobody asked for on a product you just created is worse than no code.
  • It only ever fills an empty field. Anything the product came with — including something another app just wrote — is left exactly as it is.

A new variant added to a product you already have counts as new, because that is the same event to whoever is holding the label printer.

The three settings underneath

Each one widens what gets written back to Shopify, so each one is its own switch and each starts off.

Also fill in a code when a product is edited. Without it, a variant only ever gets a code on the day it first appears — which is no use if you installed Markio after your catalog was already in Shopify. With it, saving any change to a product tops up whatever is still empty on it. Nothing that already has a code is touched either way.

Treat 0 and N/A as an empty field and replace them. A spreadsheet import leaves 0, 000000, -, N/A, none, null or TBD where a code should be. None of those scans, so none of them is a code, and this setting replaces them. It is the only setting here that overwrites something you can see, which is why it is separate. Anything that could plausibly be your own internal code — 1, X, TEST, 01 — is left alone even when it looks odd.

Only products with this tag. One tag, matched whatever the capitals. Choose whether to issue only for products with that tag, or for every product except those. Blank means every product. This is not the tag filter on the print screen: that one picks what goes on paper, this one picks what gets written back to Shopify.

Every automatic write is in the activity journal with the rules that let it through, so "why did this barcode change?" has an answer.


Import codes you already have

Paste a CSV with a sku column and a barcode column (code or gtin also work as the header for the second one). Press Check the file, read the report, then Import N codes.

Importing through Markio rather than pasting into Shopify buys you two things:

  • Cleaning. Leading zeros a spreadsheet ate, non-breaking spaces, invisible zero-width characters and Unicode dashes are stripped or repaired on the way in. A row whose code is empty once the invisible characters are removed is refused and named.
  • Collision refusal. A code that already belongs to a different variant is refused rather than written, and the report names both sides. Creating a duplicate on purpose is the one thing this screen will not help you do.

The report lists SKUs that are not in your catalog and every row that was refused, with the reason. Up to 500 rows per pass.


Codes that were scanned and found nothing

(The list is on the Pro plan, $9.99 a month. Scanning itself is free, on every plan, and always will be.)

Every scan Markio answers is written down — the ones at the till, the ones in the scan box on the Print screen, and the ones typed in by hand. This section reads that record back for the last 30 days and shows only the codes that are still a problem:

  • Nothing — no product in your catalog answers to that code. Somebody is scanning a box Markio cannot identify.
  • 2 products (or more) — the code sits on more than one variant, so a scan at the till picks the wrong one. That is a duplicate, and the Catalog audit is where it gets fixed.

Each row says how many times the code was scanned, when it was last scanned, and where from — at the till, a handheld scanner, a phone camera, or typed in. The list is sorted by how often the code was hit, so the top row is the box your staff keeps picking up.

A code drops off this list as soon as it resolves again — you added it as an extra code, or corrected the barcode, or the product finally synced. Nothing has to be ticked off by hand.

Nothing → Add it to a product puts the code into Code to add in the section below. Find the product it belongs to, then press Add this code.

On the Free plan you are told how many scans failed, but not which codes they were: the count is free, the journal is what Pro buys. Scan rows are deleted after 90 days.


A product that answers to an older code

(Adding one is on the Pro plan, $9.99 a month.)

Stock arrives with the supplier's number already on the boxes, and re-labelling it all takes months. Register that number here and a scan finds the product either way, while both codes are on the shelf. The code you print does not change, and nothing is written to Shopify.

  1. In Find the product by any code it already has, scan or type any code the product answers to — its printed barcode, its SKU, or an extra code you added earlier.
  2. Press Find the product.
  3. The panel shows the product, what it prints, its SKU, and every extra code already on it.
  4. Type the supplier's number into Code to add and press Add this code.

What these codes do and do not reach

A Shopify variant has exactly one barcode field, so an extra code lives in Markio only.

Markio finds it: the POS tile's scan, the scan box on the Print screen, receiving-CSV matching, and the audit's duplicate check all look through these codes.

Shopify does not: its admin search, its product exports and its own barcode scan resolve nothing but that single barcode field.

The rules around them

  • A code that already belongs to a different product is refused. That is the point of the feature, not a limitation of it.
  • If the code you search with resolves to more than one variant, Markio refuses to pick one — fix that duplicate in the Catalog audit first. Hanging an extra code off the wrong half of a duplicate makes the ambiguity permanent.
  • The audit flags a printed barcode that is registered as somebody else's extra code, and stays quiet about a product's own.
  • Codes you have already added keep scanning on every plan, and you can remove one at any time, free. If you stop paying you are not locked in with codes that work and cannot be taken out.

Export all codes

Export all codes (CSV), in the page header beside the title, downloads every active product with its SKU and barcode — for the things you cannot stick a label on but still have to scan. Free on every plan.

To narrow it down, or to include drafts, use the filters on Print labels and export from there instead. Both exports use the same columns as the importer above, so a file can be edited and fed straight back in. Up to 50,000 rows, CSV only.


Troubleshooting

The leading zero disappeared from my codes

This is a spreadsheet, not Markio. Excel and Google Sheets treat a column of digits as numbers and drop the leading zero, and the file you export afterwards carries the shortened code.

To repair it: run the Catalog audit and look for Leading zero lost (the Excel problem). The report names the code it should have been, and the bulk fix (Pro) restores it. Note that a lost zero also breaks the check digit — the audit deliberately reports only the lost zero, because fixing the front fixes the back.

To avoid it next time: import through this screen rather than through a spreadsheet round trip, or format the column as Text before you open the file.

"Nothing in your catalog answers to X"

The code is not in Shopify's barcode field, not a SKU, and not registered as an extra code. If it is a supplier's number, that is exactly what the extra-codes section is for.

"X answers to more than one variant. Fix that duplicate in the audit first"

Two products carry the same code. Open the Catalog audit, filter to Same barcode on different variants, and resolve the group. Then come back.

"This rule has run out of numbers"

The numbering rule hit its Stop at ceiling. Edit the rule and raise it, or issue from a different rule.

"Your GS1 prefix has no numbers left"

The prefix has issued every EAN-13 it can hold. A shorter prefix holds more; more capacity is bought from GS1.

"EAN-13 needs a GS1 company prefix that you own"

Correct — and Markio will not fabricate one. Issue Code 128 instead, which needs no registration and scans anywhere, unless you are selling through a channel that specifically demands a registered GTIN.

Some codes came back "rejected by Shopify"

Shopify refused the write on those variants. The usual cause is another app claiming the same code in the same moment, or a variant deleted between the preview and the write. Re-run the preview and issue the remainder.

I turned on automatic issuing and my old empty variants still have no code

By default it only touches variants Markio has just seen for the first time. Turn on Also fill in a code when a product is edited and they get filled the next time each product is saved — or use Issue codes to variants that have none above to do the whole catalog at once, now.

I need to overwrite a code that is already there

Neither the bulk issue nor automatic issuing will do it — both only fill empty fields. The one exception is Treat 0 and N/A as an empty field, and it only reaches a short list of strings that are not codes. Otherwise: clear the field in Shopify first, or use the Catalog audit's bulk fix, which replaces a code when the code itself is the problem.


← All Markio help topics