Published: · Updated:
Paste code or load the sample — the result appears below, with the line and severity of each finding.
Thermal label problems are diagnosed backwards: you see the physical output, then work back to the line of ZPL that caused it. This page is the triage step — match what the printer actually did, get the usual cause, then follow the check that confirms it. Every symptom below links to a full walkthrough.
The instinct is to change a printer setting, print again, and see. That costs labels and hides the cause: a setting change can mask a file problem for one job and let it come back on the next printer. The ZPL is text you can read, and most failures are visible in it — declared size, coordinates, field terminators, orientation letters. Read the file first; touch the printer only when the file is proven clean.
| What you see | Usual cause | Walkthrough |
|---|---|---|
| Everything printed, but far too small on the media | The file was written in dots for one resolution and sent to a printer with a different one (203 vs 300 dpi) | Label prints too small |
| The right edge or the bottom is missing | Content extends past ^PW/^LL, or the media is
narrower than the file assumes |
Label cut off |
| A line of text runs past the edge, or wrapped lines print on top of each other | The field has no ^FB, so nothing wraps; or its
^FB allows fewer lines than the text needs and the overflow
overprints the last line |
Text runs off the label |
| The barcode prints but no scanner reads it | Module width too small for the resolution, missing quiet zone, or data the symbology cannot encode | Barcode not scanning |
| The whole label is rotated 180°, or one field lies sideways | Three separate switches rotate things: ^PO (whole label),
^FW (all following fields), the orientation letter in
^A (one field) |
Prints upside down |
| Accented or non-English characters print as garbage | Encoding mismatch — the file is UTF-8 but the printer was not told so
(^CI28), or the font has no glyph for the character |
Special characters not printing |
| An extra blank label feeds after every real one | The declared label length does not match the media, or the job carries a
^PQ nobody intended |
Extra blank label |
| The layout is right but everything sits at an offset | A global shift is in play: ^LH, ^LS or
^LT — or ^FT is being read as if it were
^FO |
Content shifted |
| The label comes out completely blank | Structural: unbalanced ^XA/^XZ, a broken
^FS chain swallowing later commands, or data with no
position |
Prints blank |
| Several graphics in the format, only the last one prints | A mobile printer running ZPL through an emulation layer — the format itself is usually valid | Only last graphic |
| Raw text and control characters instead of a label | Dump mode tripped during a feed-button sequence — or ZPL sent to an EPL-generation printer | Prints gibberish |
| The printer suddenly asks for ribbon, media handling changes between jobs | The format carries ^MT and the printer obeys job-side
configuration |
Media type from the format |
Status queries (~HS) take an age or never return |
Five printer states answer with silence; a query behind an open connection waits | Slow or silent status |
| Ping answers, nothing reaches port 9100 | ICMP passes but the raw service is off, filtered or held by another connection | Ping works, 9100 does not |
| Dots all over areas that should be white | A dithered bitmap in the file — or darkness, dirt and wear at the printhead | Dots in white areas |
| Thermal transfer print faint, smudged or rubs off | Ribbon type does not match the label material, or speed above the ribbon maximum | Faded or smudged transfer print |
A browser preview renders the same commands a printer would draw, so it
settles a large class of questions without wasting media: whether the
content fits the declared size, whether coordinates land where you think,
whether a barcode's data is encodable, whether ^FW and the
per-field ^A orientations do what you expect, and whether the
command stream is structurally sound.
It cannot prove the physical layer. Print orientation applied inside the
printer (^PO), top-of-form offset (^LT), media
tracking and gap sensing, darkness and speed, ribbon and head condition,
and RFID encoding all happen after the image is composed. A preview that
looks perfect narrows the problem to that layer — which is useful
information, not a failure.
"It looks fine in the viewer and prints blank (or rotated, or tiny)" is one of the most common questions about ZPL. Work down this list in order — each step rules out one layer between the file and the head:
^PO), top offset (^LT), label shift
(^LS) and print width can be saved in the printer's configuration
(^JUS); a saved value applies to every job that does not set it
itself — see label prints upside
down and content shifted.^PW and ^LL are in dots, not inches or millimetres.
A 4-inch label is 812 dots at 203 dpi and 1218 at 300 dpi.^FS makes
the following commands part of the previous field's data, so they vanish
from the output instead of erroring.^LH, ^LS, ^LT,
^PO and ^FW before you inspect individual
fields — one of them explains most "everything moved" reports.Paste a label into the ZPL viewer to run the structural checks and see the rendered result in one step.
Start from the file, not the printer. Declared size (^PW/^LL), coordinates, the ^FS chain and orientation letters are all readable text, and most failures are visible there. Changing a printer setting can mask a file problem for one job and let it return on the next printer.
It settles the composition layer: whether content fits the declared size, whether coordinates land where you expect, whether barcode data is encodable, and whether the command stream is structurally sound. It cannot prove the physical layer — ^PO print orientation, ^LT top offset, media tracking, darkness, ribbon and head condition all happen after the image is composed.
Three: does the file declare a size that matches the media (^PW/^LL are in dots — 812 at 203 dpi for 4 inches, 1218 at 300 dpi); is every field closed with ^FS; and is anything shifting or rotating globally (^LH, ^LS, ^LT, ^PO, ^FW).
The five failures behind most wrong ZPL labels: density mismatch, a missing ^FS, silent clipping, missing label dimensions and broken characters.
Every label in the job prints the same time (^FC, ^SL)A multi-label ZPL job stamps every label with the same clock value. That is ^SL's documented default, not a bug — and ^SLT changes it.
Zebra label prints too smallA 4x6 label printing at two-thirds size in the top-left corner is a 203-to-300 DPI mismatch. Confirm it, see why ^MU rarely helps, rescale the file.
The printer prints gibberishRaw text and control characters instead of a label point to dump mode; truly scrambled glyphs point to a language mismatch. Telling them apart takes a minute.