Templates and the label editor
A template decides what goes on the label and where. It holds the label's size, its resolution, and a list of elements — text, price, barcode, image, box, line — each bound to a field of your catalog. The same template printed for a thousand products produces a thousand different labels of the same design.
Templates are free on every plan, including the editor, custom sizes and Avery sheets.
Make your first template
- Press New template.
- Under Start from, pick a ready-made design or Blank label. Every tile is a live preview drawn with your own worst-case product, so you are judging the actual label, not a description of it.
- Under Label size, search for your stock. Type a part number (
30252,5160), a brand (Dymo,Avery), a printer model, or a size (2x1,50x25mm). There are 104 stocks in the list, ordered with the common ones first. - Press Create template. You land in the editor.
The design is re-scaled onto the stock you chose, proportionally per axis, with type following the smaller axis. That works well across similar shapes and is honestly wrong across very different ones — which is why the editor then shows you warnings rather than pretending the fit is perfect.
The ready-made designs
Seventeen in total. Fourteen are Markio's own:
Jewellery butterfly · Apparel tag · Food — batch and expiry · Shelf price tag · Carton — ITF-14 · Code only · Price only · Deli — weighed goods · Care and origin · QR square · Wine shelf tag · Small 2-up — price and code · Warehouse bin · Returns / RMA
Three more are marked Recreated from another app. They are reconstructions of the layouts Shopify's own Retail Barcode Labels printed on Dymo 30252, Dymo 30336 and Avery 5160, so a shop with a case of labels bought for that app does not have to redraw them. They are reconstructions, not verified copies — compare one against an old roll before you commit to a batch.
Import a label you already print in ZPL
If your Zebra is already fed a ZPL program — from an old system, from your warehouse software, or written by hand — you do not have to redraw it here.
- Press Import ZPL at the top of the Templates screen.
- Paste the program, or press Choose a file and pick your
.zpl/.txt/.prnfile. Nothing is uploaded until you press Create. - Say which printer it was written for: 203, 300 or 600 dpi. This is not a detail. ZPL positions everything in printer dots, and a dot is only a length once the printer is named — a 300 dpi program read as 203 comes out half again too big. Most desktop Zebras (GK420, GX420, ZD410, ZD420, LP2844) are 203 dpi.
- The label appears on the right as you type, together with a list of anything that could not be imported, naming the command and the line it sat on.
- Press Create template. You land in the editor with the design in place.
What comes across
The label size (^PW / ^LL), the home offset (^LH), mirroring (^PM) and label inversion (^PO); every field's position (^FO and ^FT, including rotation); fonts and their size (^A, ^CF); text (^FD, including ^FH hex-escaped UTF-8 under ^CI28) and text blocks (^FB, with their width, line limit and alignment); boxes and lines (^GB); and the barcodes — Code 128 (^BC, including GS1-128 in mode D), EAN-13 (^BE), EAN-8 (^B8), UPC-A (^BU), UPC-E (^B9), Code 39 (^B3), Code 93 (^BA), ITF (^B2), Codabar (^BK), MSI (^BM), QR (^BQ), Data Matrix (^BX) and PDF417 (^B7), with their module width from ^BY.
What does not, and why
- Graphics.
^GF,^XG,^IMand~DGare bitmaps compiled for one printer. They are named in the warning list; add the picture as an image element in the editor instead. - Barcode width. ZPL states how wide one bar is and lets the bars grow to the right, so the width of an imported barcode box is arithmetic, not a measurement. It is close; check it on the canvas.
- Fonts. Every ZPL resident font is a condensed grotesque, and a
^A@font is a file living on the printer. Both import as Helvetica at the same size. - Printer settings. Darkness, speed, media sensor and copy count are not part of a design here — they live on Printers and on the print job — so they are read and ignored rather than baked into the template.
- Reverse print (
^FR), serialisation (^SN) and anything else we have no equivalent for is listed by name. Nothing is ever dropped in silence. - A file holding several labels imports the first
^XA…^XZonly.
The text comes in fixed — that is the important step
A ZPL program says what to print, not where it comes from: ^FDBlue Widget^FS is the words, not "the product title". So everything imports as fixed text, and the label prints the same words for every product until you change it.
Open the editor, select each text and barcode element, and bind it to a field — Product title, SKU, Barcode, Price. That one pass is what turns your ZPL label into a template that prints your whole catalogue.
The imported label also starts on Custom size… rather than on a stock, because ^PW / ^LL is a measurement, not a part number. If it matches a roll you buy, pick it under Label size in the editor.
The editor
Open a template from the Templates list. The screen has the canvas on the left and a panel on the right holding Element (when something is selected), Label, Preview and Version history.
Moving things around
- Click an element to select it. Drag it to move; drag a corner handle to resize.
- Arrow keys nudge the selected element. Delete or Backspace removes it. Escape deselects.
- Grid and snapping snaps to 1 mm, or to 1/16 inch if your unit is inches. Turn it off for free positioning.
- The zoom control has True size — at 100% the label on screen is the size it will be on paper.
Adding an element
The row of Add buttons under the canvas creates one of six kinds:
| Element | What it is |
|---|---|
| text | Any catalog field, a metafield, or fixed text. |
| price | A price, formatted with a currency symbol, separators and decimals. |
| barcode | A symbol in any of seventeen symbologies. |
| image | The product's own image, or a fixed image URL. See the caveat below. |
| rect | A box — an outline, a filled block, a rounded corner. |
| line | A rule. |
Binding an element to your data
Every text, price and barcode element gets its value from one of three places:
- A product field — Product title, Variant title, Option 1/2/3, SKU, Barcode, Price, Compare-at price, Unit cost, Vendor, Product type, Tags, Location, Print date, Batch number, Expiry date, PO number, Supplier, Serial number, Quantity.
- A metafield — the picker lists every
namespace.keyMarkio actually found on your products, and you can type one it has not seen. - Fixed text — what you type, on every label.
Each binding can carry a prefix and a suffix (so SKU: in front and nothing behind), and an If it is empty, print fallback. Leave that fallback blank and the element simply disappears on labels where the field is empty — which is usually what you want for something like a batch number.
Batch number, expiry date, PO number, supplier, serial number and quantity are not Shopify fields. They are filled in by a receiving import, or you bind them to a metafield, or you type fixed text.
Making text fit
Text elements have When the text does not fit with four answers:
- Shrink the text until it fits — with a floor you set under Never shrink below, because past a certain size it does not read
- Wrap onto more lines — with a maximum-lines cap
- Cut it and add …
- Cut it at the edge
Whatever you choose is applied the same way every time. A title that shortens one way today will shorten the same way tomorrow and on every label of the same job.
Fonts
Four are available: Helvetica, Times, Courier and Roboto.
Helvetica, Times and Courier cover Western European characters. Roboto is the one to choose for Cyrillic or Greek.
Chinese, Japanese, Korean, Hebrew and Arabic are not in the picker, and do not need to be. Markio looks at the characters themselves and switches to a font that covers them — you do not have to know which. A product title in Chinese prints in Chinese whichever of the four you picked.
Two limits worth knowing:
- There is no bold in those scripts. Bold Chinese, Korean, Hebrew or Arabic text prints at the normal weight rather than not at all.
- Arabic that begins with a Latin word ("Nike قميص") comes out with its letters disconnected, and the editor warns about it. The cause is the direction being decided by the first word. Put the Arabic first, or split it into its own text element.
Anything no font covers at all — Devanagari, Thai and the rest — still raises "No embedded font covers …" rather than printing boxes. There is no font upload.
Price elements
Beyond the font and size, a price element controls: the currency, whether the symbol goes before or after the number, whether there is a space after the symbol, the number of decimals, the thousands and decimal separators, and whether to print the tax-inclusive figure at a tax rate you supply.
Currency takes three kinds of value:
| Value | What prints |
|---|---|
shop (the default) | your catalog price, in your shop's currency |
market | what a market charges, in that market's currency |
an ISO code such as EUR | your catalog price, formatted as that currency |
market needs one more choice, and it is made at print time rather than here: a Price for this market picker appears in the right-hand panel of Print labels whenever the chosen template asks for a market price. The price is frozen into the job when you print, so reprinting an old job from History gives you the price that was on the shelf that day, not today's.
Barcode elements
Choose from seventeen symbologies:
Code 128 · EAN-13 · EAN-8 · UPC-A · UPC-E · Code 39 · Code 93 · Codabar · ITF-14 · Interleaved 2 of 5 · GS1-128 · MSI Plessey · QR code · Data Matrix · PDF417 · EAN-13 with price embedded · EAN-13 with weight embedded
You also control:
- Narrow bar (mils) — the width of the thinnest bar, in thousandths of an inch. 13 mil is the retail EAN nominal; 7.5 mil is a common thermal minimum. Narrower is smaller and harder to scan.
- Quiet zone (modules) — the blank margin either side. Standards want 10. Shaving it is a classic cause of a code that scans on the third try.
- Human-readable digits — below the bars, above them, or not at all.
For EAN-13 with price embedded and EAN-13 with weight embedded, two extra settings appear. The element's own binding supplies the item code (up to five digits); the In-store prefix is which of 20–29 your till expects; and Price comes from / Weight in kg comes from says where the embedded amount is read. Neither can be guessed for you — the prefix is a decision your POS made, and there is no weight column in a Shopify catalog, so a scale weight always comes from a metafield.
Conditions
Any element can be given conditions, and it prints only when all of them pass. The tests are: has a value, is empty, equals, does not equal, contains, is greater than, is less than. The thing compared against can be a value you type or another field — which is how "only show the old price when the compare-at price is greater than the price" is built.
Whole-label settings
The Label section on the right holds:
- Template name and a Rename button
- Inner margin — the border the editor keeps elements out of
- Print resolution — 203 dpi (most thermal printers), 300 dpi, or 600 dpi (laser and inkjet). This is what makes bar widths land on whole printer dots, which is what makes a thermal label scan first time.
- Rotate the whole label — 0°, 90°, 180°, 270°
- Change label size — reopens the stock picker
Changing the stock changes the canvas only. Your elements keep their positions, and anything that no longer fits is called out by the out-of-bounds warning. Silently rescaling a design you had finished would be worse.
The preview, and why it uses your worst product
The Preview panel does not show a random product. It shows your worst case, assembled from your own catalog: the longest product title, the longest SKU, the widest price it holds, taken across the 300 most recently updated variants. If the design fits there, it fits everywhere.
To check one specific product, type into Preview a specific product and pick it from the results. Back to the worst case returns.
Two warning banners sit above the canvas:
- "Something is hanging off the label" — an element reaches past the die cut and will be cut off. Move or shrink it.
- "This design will not print as drawn" — a list of what the renderer will actually do: text that was shortened, text no font can render, a barcode with no value, a barcode whose value is not valid for its symbology, an element with no size.
Version history
Every save is a version. The panel lists the last 25 with their date and any note, and Restore puts one back.
A restore does not rewind the list — it writes a new version on top, noted "Restored version N", so the history keeps showing that a restore happened.
If you navigate away with unsaved changes, the browser warns you.
Managing templates
From the Templates list, each card's overflow menu (⋯) offers:
- Duplicate — a copy named "… copy", opened in the editor
- Make default — the one pre-selected on the Print screen
- Lock / Unlock — a locked template can be printed with by anyone, and changed by nobody until it is unlocked. Only an Owner or a Template admin can lock or unlock. This is how you stop a busy shop's shelf-tag design drifting.
- Archive — hidden from the pickers but not deleted, because print history has to keep naming what it printed
Troubleshooting
The product image does not print
Images do print. Every image on a label is fetched and embedded when the print job is built, so what comes out is what the preview showed — and a reprint months later prints the same picture even if the product image has changed since.
A logo works the same way: upload it once under Settings → Shop logo, and every template with a Your logo image element uses it.
Two things will still leave a gap where an image should be, and the print tab now says so instead of leaving you to notice:
- an image the app could not fetch when the job was built (a broken address, a private CDN);
- a format other than PNG or JPEG — those are the only two a label PDF can embed.
The barcode is cut off on paper
Check, in this order:
- The print dialog's scale. Set it to 100% / Actual size, never "Fit to page". This is the most common cause by far.
- The quiet zone. If you reduced it below 10 modules, put it back.
- The element's box in the editor. If the out-of-bounds warning is showing, the barcode genuinely reaches past the die cut.
- The narrow-bar width against the printer. At 203 dpi a module has to be a whole number of dots; very narrow bars on a low-resolution printer are how a symbol becomes unreadable. Widen the narrow bar or raise the resolution.
Text in another script prints as blanks
Switch the font to Roboto for Cyrillic and Greek. Chinese, Japanese, Korean, Hebrew and Arabic need no font choice at all — Markio picks a font that covers them from the characters themselves.
If the warning "No embedded font covers …" is showing, the script really is one we cannot print (Devanagari, Thai and others), or one text element mixes two scripts that need different fonts — split it into two elements and each gets the font it needs.
Arabic whose first word is Latin prints with its letters disconnected and warns separately; see Fonts.
The title is truncated differently on different labels
It is not — the same input always produces the same output. What varies is the input: a longer title shrinks or wraps further than a short one. If you want every label identical, cap it with Maximum lines plus Cut it and add …, or make the box big enough for the worst case shown in the preview.
I changed the label size and everything is in the wrong place
That is by design: the canvas changed and the elements did not. Use the out-of-bounds warning to find the strays, or Restore the previous version and duplicate the template instead so you keep the original.
I cannot edit — the buttons are greyed out
Either the template is locked (a banner at the top says so, with an Unlock button if you have the right), or your role is Print operator, which can print with templates but not change them. See Settings → Users and roles.
I need a size that is not in the list
Type it. The stock picker has a Custom size… entry, and the template editor has Type a size instead — both give you width and height fields, and the size you enter is validated on the server before it is saved.
Searching by size works too (50x25mm), and the picker ranks near matches, so it is worth looking for the real stock first: a stock knows its own die-cut grid, and a custom size does not. For small differences between what you typed and what the printer actually does, use the calibration offsets on Printers.
The design was made in another app and I need it here
If you have the ZPL program, paste it into Import ZPL. Other apps' template files cannot be read. The three Recreated from another app starters cover the layouts Shopify's own Retail Barcode Labels printed on the two Dymo stocks and Avery 5160; anything else has to be rebuilt in the editor.
Related
- Print labels — using a template on a job
- Printers — which channels can print which symbologies
- Barcodes & SKUs — what goes into the barcode field