Print labels
This is the screen where a stack of labels comes from. You find the products, say how many labels each one needs, choose a template and a printer, and press Print. Everything else on the screen — the scanner, the delivery-file box, the CSV export — is a different way of filling the same list.
The screen is laid out top to bottom: Find products, Scan a barcode, the products table, Print from a receiving CSV. The panel down the right side — What will come out — holds the template, the printer, a true-size preview and the Save-this-job box, and it stays with you as you scroll.
Before you start
You need two things: at least one template (Templates) and somewhere for the labels to go. You do not need a saved printer — leaving the Printer picker on "PDF into the print dialog" works with every printer on every operating system, and it is the default for a reason.
The first time you open Markio after install it is still reading your catalog. A blue banner says so. You can build a job while it reads; products appear as they arrive.
Print labels for a shelf, a vendor, a collection
- Narrow the list in Find products. The search box matches product name, SKU or barcode. Everything else is a condition: pick one from Add condition and it appears as a chip above, so what is in force is always the short list on screen rather than the long list of what exists. The conditions are: - Vendor and Product type — these two only ever offer values that actually exist in your shop - Tag — matches one whole Shopify tag, letter for letter - Location - Changed after / Changed before — the date the variant last changed, which is how you get "everything I edited today" - Price changed after — only the variants whose price actually moved on or after that date, which is the shelf tickets that no longer match the till. It is not the same as Changed after: editing a photo or a tag changes a product without changing what it costs. Markio only knows about price changes it has watched happen, so nothing from before you installed it is listed. - Only in stock, Only without a barcode, Only duplicates the audit found, Include drafts and archived - Only what the last bulk fix changed — the variants your most recent bulk fix actually rewrote, which are the ones whose shelf labels are now wrong. See Catalog audit - Pick a collection — opens Shopify's own collection picker
Remove a condition by clicking its chip, or Clear all to start over.
- Tick the products you want. The tick box in the table header selects everything on the current page — the page is 50 rows, so on a longer result you tick page by page, and your selection survives paging.
- Choose How many of each (see below).
- Choose Print in this order if it matters (see below).
- Check the panel on the right: the right template, the right printer, and the preview showing what the label will look like.
- Press Print N labels at the top of the screen. The button carries the real total, so you always see how many are about to come out.
Drafts and archived products are excluded unless you ask for them. A shop with thousands of drafts must not get them in a print job by accident.
Save a set of conditions you use every week
Type a name under Name these conditions to reuse them and press Save. The set appears under Saved, and one click puts every condition back — "this vendor, no barcode, in stock" becomes one click instead of four. Saving again under the same name overwrites it; the ✕ beside a name deletes it.
Saved sets are free on every plan. They keep the question, not the products: saving a job with its products, counts and template is Save this job, which is on Pro.
Collections stop at 250 products
Markio does not store which products are in which collection, so a collection filter is resolved live against Shopify and reads the first 250 products. If your collection is larger, a warning says so — add a vendor or a tag to reach the rest.
Say how many of each
How many of each has four modes:
| Mode | What it does |
|---|---|
| Type a count on each row | You set each row by hand in the Copies column. |
| The same count for everything selected | One number applied to every ticked row. |
| One per unit in stock (all locations) | Copies = total on hand across every location. |
| One per unit in stock at one location | Copies = on hand at the location chosen in the filter above. |
The default count is zero, and that is deliberate. Select 400 variants, press Print without setting a count, and you get nothing — not 400 sheets of wasted stock. If zero is wrong for the way you work, change it once in Settings → Default copies per line; whatever you set there becomes the starting value on every row.
A row can carry at most 1,000 copies, and a whole job at most 20,000 labels. The 20,000 ceiling is not a quota and the paid plan does not raise it — it protects the renderer. Split the job and run the second half immediately.
Negative stock is treated as zero. Shopify reports oversold inventory as a negative number, and "one label per unit on hand" for −3 units means no labels.
Control the order the labels come off
Labels come off a roll in one strip and get stuck onto goods in the order they were laid out, so the order is a real setting, not a nicety. Print in this order offers:
- The order I picked them — no re-sorting at all
- Product name
- SKU
- Barcode
- Location
- Tag (first one, A-Z) — a product carries a set of tags but a stack of labels has one order, so the sort key is the alphabetically first tag
Sorting is numeric-aware: SKU-2 comes before SKU-10, not after it. Rows with nothing in the sorted field go to the end, so a barcode-less variant never heads a stack sorted by barcode.
Finishing a part-used sheet of Avery
When the template's stock is a sheet rather than a roll, the right-hand panel grows a Start on cell field and a picture of the sheet with the cells this job will fill shaded in.
The field is the cell to START ON, counting from 1. So if three labels have already been peeled off, the first free cell is number 4 — type 4, not 3. (Typing 3 prints over the third cell, which is one of the ones that is gone.) The app's own hint says the same thing: "count the labels already peeled off it and start on the next cell".
The picture updates as you type, and the line under it says either "N of M cells on this sheet" or how many sheets the job will take.
Scan a barcode
The Scan a barcode section answers a question a scanner cannot answer itself: which product does this code actually land on — and is it more than one?
- With a USB or Bluetooth scanner, click into "Scan or type a code" and scan. There is nothing to configure. Markio recognises a scanner by the speed of the keystrokes, not by an Enter suffix, so it works whether or not your scanner is set to send one. The field clears itself and keeps focus, so scan-scan-scan works without touching the mouse.
- By hand, type the code and press Look up.
- With a phone camera, press Photograph a code if the button is there.
A scan has exactly three outcomes, and Markio never folds them into two:
- Matched — the product drops into the table below, already ticked.
- Two or more products share this code — a red banner says so, every product holding it is listed unticked, and nothing is selected for you. Picking one would be exactly the guess your till makes. Fix it in Barcodes & SKUs or in the Catalog audit first.
- Nothing in this shop carries that code.
Scanned products sit in the same table as everything else, pinned to the top, so copies, sort order, export and the Print button work on them with no second route through the screen. A scan that landed outside your current filter is still visible rather than silently ticked off-screen.
Scanning matches the printed barcode, the SKU, and any extra code you registered in Barcodes & SKUs — which is what lets a supplier's number on a box still find the product while the shelf is only half re-labelled.
Every scan is recorded, matched or not, and the record is read back in Codes that were scanned and found nothing — so "which of our codes do not resolve" stops being a guess. The scan itself is free on every plan; that list is on Pro.
The camera button is missing
The camera uses the browser's own barcode decoder, and not every browser has one. Chrome on Android, ChromeOS and macOS does. Chrome on Windows and Linux does not — the decoding is handed to an operating-system service those two do not provide. Safari and Firefox do not either. When there is no decoder the button is not shown, and a line of text explains why. A USB or Bluetooth scanner works everywhere, and so does typing the code.
There is no live viewfinder, only "take one photo". A page embedded in the Shopify admin cannot open a camera stream at all — the browser only lets the top-level page grant that permission, and Shopify's admin does not grant it to apps. A photo taken by your phone's own camera app is the one camera path an embedded page still has.
Which symbologies your particular phone can decode is up to the device. If a photo of a code you know is good comes back as "No barcode in that photo", try filling more of the frame — and if it still fails, that format is probably one your device's decoder does not handle. Type the code instead.
Print labels for a delivery that just arrived
(On the Pro plan.)
Shopify's Admin GraphQL API does not expose its native purchase orders, so Markio does not read them directly. Purchase-order tools can export CSV, and that is the way in.
Coming from Stocky
If you are moving away from Stocky, Markio does not depend on a live Stocky connection. What you need is a CSV of the received lines:
- a Stocky export you already saved pastes in and works;
- so does an export from the purchase-order app you use now.
One thing to be honest about: Markio prints the labels, it is not a purchase-order system. You still need somewhere to raise and receive POs. This screen picks up at the moment the delivery is on the bench and the units need labels.
- Export what actually arrived from your PO tool.
- Paste it into the Print from a receiving CSV box.
- Press Check the file.
- Read the report, then press Print N received lines.
The file needs a quantity column and either a SKU column or a barcode column. Header names are matched loosely, so most exports work untouched:
| Column | Header names recognised |
|---|---|
| SKU | sku, variant sku, item sku, item, code, product code, item number, part number |
| Barcode | barcode, upc, ean, ean13, gtin, gtin13, isbn, product barcode |
| Quantity | qty, quantity, received, received qty, qty received, quantity received, count, units |
| Unit cost | unit cost, cost, price, cost price, unit price, buy price |
| PO number | po number, po, purchase order, purchase order number, order, order number, ref |
| Supplier | supplier, vendor, supplier name, vendor name, manufacturer |
Case, spaces, underscores and punctuation in header names are ignored. Columns Markio does not recognise are simply left alone.
The parser handles what real spreadsheet exports are actually full of: a UTF-8 byte-order mark from Excel, Windows and old-Mac line endings, quoted fields with commas inside them, and semicolon or tab delimiters (Excel on a European locale writes semicolons and never tells you). Quantities written 1 000 or 1,000 are read as one thousand; costs written 12,50 are read as twelve fifty.
37 received prints 37 labels, not the 50 that were ordered. The PO number, the supplier and the unit cost travel onto the label if your template has fields for them.
If the same SKU appears on two lines — two cartons, two batches — the lines are merged, not rejected, and the report tells you it happened.
Reading the check report
- "N of M rows match your catalog" — anything unmatched is listed by SKU or barcode. Those units would go on the shelf unlabelled, so deal with them before you print: they are usually a new product Shopify has not seen yet, or a supplier SKU that is not your SKU.
- "Barcode X is on N variants … not printed. Key those rows by SKU." — a barcode in the file that matches more than one variant is skipped rather than guessed at. Either fix the duplicate in the Catalog audit, or re-export the file keyed by SKU, which is unique in your catalog where a barcode is not.
Export your codes to a spreadsheet
Export codes (CSV) at the top of the screen downloads exactly what you are looking at — the same filters, and only the ticked rows if you ticked any. It covers products, SKUs and barcodes, for the things you cannot stick a label on but still have to scan. Free on every plan.
The columns match Markio's own importer, so an export can be edited and fed straight back in through Barcodes & SKUs → Import codes you already have.
The export takes the whole filtered result, not just the page you are looking at, up to 50,000 rows. It is CSV only — there is no XLSX.
Save a job and print it again
(Saved jobs are on the Pro plan. Reprinting from history is free.)
Type a name into Name this job in the right-hand panel and press Save this job. Saved jobs are listed underneath, and you reprint them from Print history without rebuilding the selection.
Have a sale's shelf tickets waiting on the morning
Each saved job takes a Sale date. Set one and press Schedule: at the start of that day in your shop's own time zone, Markio builds the job again — same products, same counts, same template — using the prices Shopify has by then, and the labels are waiting for you in Print history before you open.
Two things worth knowing:
- Change the prices in Shopify first. Markio does not move prices and does not guess at them; it prints what Shopify says on the morning it builds. If your new prices go live at midnight, the tickets are right. If you change them at ten, the tickets say what they said at midnight.
- The old price comes along for free. Markio remembers what a variant cost before its most recent change, and the Price before the last change field puts it on the ticket beside the new one — no need to fill Shopify's compare-at price just to show a "was".
Clear the date and press Clear to cancel a schedule. A schedule fires once; a sale starts on a day, not on a repeat.
What happens in the print tab
Pressing Print does not print from inside the Shopify admin. It opens a new browser tab on Markio's own address, and the printing happens there.
That is a hard requirement, not a design preference. Zebra Browser Print is a small service running on your own computer, and Chrome 142 closed web pages' access to the local network. The permission that would re-open it can only be granted to a top-level page — an app embedded inside the Shopify admin cannot be handed it. So the direct channels only work in a tab of their own, and Markio uses the same tab for every channel so that one habit covers all of them.
The tab shows you, in this order:
- the job name, the label count, the stock and the size in millimetres
- a status line
- Actual size — the label drawn at the size your browser calls that many millimetres, with real barcode symbols, not placeholder bars. Nothing is scaled to fit. If a barcode is clipped here, it will be clipped on paper.
- Sheet plan for sheet stock, showing which cells this job fills
- the channel picker and the Print button
- Download instead and Calibration sheet
- a calibration form for the X and Y offsets
- Something printed wrong? with the diagnostic report
For a plain PDF job the print dialog opens by itself the moment the page arrives — you do not have to press anything. For a direct channel the tab first talks to the local agent, and if it gets no answer within a few seconds it prints the PDF instead and says why on the status line.
Jobs of more than 500 labels are split into parts. A picker appears next to the Print button; print them one at a time.
The link to a print tab is valid for 12 hours. After that, reprint the job from Print history to get a fresh one.
Troubleshooting
The print tab never opened
Your browser blocked the pop-up. The Print button opens a new tab, and most browsers block that unless the site is allowed. Allow pop-ups for admin.shopify.com and press Print again. There is no way around this — the tab is not optional, see above.
The labels print at the wrong size, or a barcode is cut off
This is nearly always the print dialog's scaling, and it is the single most common cause of a cut-off barcode.
In the browser's print dialog set Scale to 100% or Actual size. Not "Fit to page", not "Shrink to fit". Then check that the paper size chosen in the dialog is your label stock and not A4 or Letter.
Confirm before you waste a roll: the print tab draws the label at true size under Actual size. Hold a label against the screen. If it matches there and comes out wrong on paper, the dialog is scaling it.
If the size is right but everything sits a few millimetres off the label, that is calibration, not scaling — see Printers → calibration.
Everything printed blank, or only some rows printed
Check the copy counts. The default is zero, so any row you ticked but never gave a count to prints nothing. If the whole job was zeros, Markio refuses it with "Every row is set to zero copies, so there is nothing to print yet" rather than sending an empty sheet.
"That is more than 5,000 rows in one job"
The Print screen accepts at most 5,000 selected rows in one go. Narrow the filter, print, then do the rest. This is separate from the 20,000-label ceiling — one is rows, the other is labels.
"This job is N labels. We print at most 20,000 in one job"
Split it. There is no monthly limit on how many labels you print, and the paid plan does not raise this ceiling — a PDF of 20,000 labels is already minutes of work, and one accidental "select everything" would stall the queue for everyone.
"You've printed N labels this month on the Free plan"
This is a warning, not a block. The job still prints; very large runs on the Free plan go to the back of the render queue and may take longer.
The product list is empty
If it is empty with no filters set and your shop is not new, the catalog index did not complete. Open Settings → Support, copy the diagnostic report and send it to us.
If it is empty with filters set, the message says "Nothing matches" — clear a filter, or search for the product by name, SKU or barcode.
"Only without a barcode" seems to ignore what I clicked from the home screen
The home screen's Print labels for these button under the "N variants have no barcode" banner does not currently carry the filter across — you land on the Print screen with everything showing. Tick Only without a barcode on the Print screen itself and you will get the same list.
A scan finds nothing, but the code is printed on the product
Three things to check, in order:
- Is the code actually in Shopify's barcode field for that variant, or only printed on the box by your supplier? If it is the supplier's number, add it as an extra code — one of the things Pro is for.
- Does the stored code have invisible damage — a lost leading zero, a non-breaking space, a Cyrillic letter that looks Latin? Run the Catalog audit; it names each of these individually.
- Is your scanner sending extra characters? Markio strips the usual prefix and suffix framing, but a scanner configured to add a made-up prefix will produce a code nothing matches. Compare what lands in the scan box against what is stored on the variant.
A scan says two products share this code
That is the defect the app exists to find, and it means your till is picking one of them at random. Open the Catalog audit, filter to Same barcode on different variants, and fix the group. On the Free plan you can see the whole report and fix the variants by hand in Shopify; the bulk fix with the preview and the undo is on Pro.
The template picker says "No templates yet"
Create one first — the panel offers a Create a template first button that takes you to Templates.
"That template has no label size attached"
Open the template and press Change label size. Markio will not print a job whose paper size is unknown.
Related
- Templates — what goes on the label
- Printers — channels, calibration, test prints
- Print history — reprint, print more of one line
- Barcodes & SKUs — where the codes come from
- Catalog audit — why a code does not scan