Practical articles on ZPL, barcodes and label printing: how to read the commands, which barcode belongs where, and the mistakes people make most often.
The articles are grouped by job: pick the group that matches your problem first. Each article explains the cause and the fix; examples that contain a complete ZPL label open in the viewer with one click. Every article ends with related articles from the same group.
Learn ZPL and label basics · Fix a label that prints wrong · Barcodes and GS1 · Send ZPL to the printer · Spreadsheets, ERP and carriers · EPL, TSPL and CPCL
What ZPL is, how to open and preview a file, dots versus millimetres, fonts and layout.
ZPL is the language Zebra thermal printers understand. How to read the commands, how a label is put together, and the most common mistakes.
How to open a ZPL fileA .zpl file opens in any text editor, because ZPL is plain text. What the file contains, how to read it, and how to see the label it describes.
How to preview a ZPL file without a printerA ZPL file is just text — the label only exists once something draws it. Four ways to see and test a ZPL label without a printer, including CI.
ZPL dots, millimetres and inchesEvery ZPL coordinate is a dot. Conversion tables for 152/203/300/600 dpi, common label sizes in dots, and what really changes when a 203 dpi file moves to 300.
How to center text in ZPLZPL has no center command for plain text. Use a ^FB block with C justification, or measure the text width and compute the x position yourself.
Using custom fonts in ZPLTwo ways to print your own font on a Zebra printer: embed it in every label, or upload it once and call it with ^A@. The difference and the limits.
Why can a label format set media type?A label format can switch the printer to thermal transfer — by design. Why ^MT exists, when it helps, and what disabling it costs your fleet.
PDF or ZPL: choosing a label pipelineTwo pipelines for the same label: a rendered PDF through a driver, or native ZPL to the printer. What each costs in speed, fidelity and support.
Embed a ZPL Label Viewer in Your Own SiteShow rendered ZPL labels inside your own pages with one iframe — no server code, no libraries. How the embed works, the URL format, and its honest limits.
Can ChatGPT or Claude Render ZPL?Language models write and explain ZPL but cannot see the printed label. How a render and validation tool closes that loop — browser, API or MCP — with prompts.
Too small, cut off, shifted, upside down, blank, garbled or extra labels — cause and fix.
Eight common ZPL label failures mapped to their usual cause and the check that confirms it — plus what a preview can and cannot prove.
Why does my ZPL label print incorrectly?The five failures behind most wrong ZPL labels: density mismatch, a missing ^FS, silent clipping, missing label dimensions and broken characters.
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.
ZPL label cut off at the edgeA clipped ZPL label has two distinct causes: fields placed beyond ^PW/^LL, or a 300 DPI file on a 203 DPI printer. How to tell them apart and fix each.
ZPL text runs off the label edge (wrap it with ^FB)A long ^FD value prints past the label edge because plain ZPL text never wraps. ^FB turns it into a block: width, line count, line breaks, alignment.
ZPL label content shiftedA layout that prints shifted has four suspects in the file — ^LH, ^LS, ^LT and the ^FO/^FT difference — before any sensor is to blame.
ZPL label prints upside downA rotated ZPL label has three switches: ^PO flips the whole label, ^FW sets the default for every field, and each ^A rotates one field. Find which one is set.
ZPL prints a blank labelA completely empty label usually has a structural cause: a format that never opens or closes, fields swallowed by a missing ^FS, or data with no position.
Zebra prints an extra blank labelA blank label after every print, a skipped or half-printed label: two causes in the ZPL (^LL, ^PQ), two in the printer, one in the driver. Check in that order.
Only the last graphic printsA format with several ^GB boxes prints only the final one on a mobile printer. The file is usually innocent: check the active printer language first.
ZPL special characters print wrongUmlauts and accents printing as garbage is an encoding mismatch: the printer decodes your UTF-8 bytes with a legacy code page. ^CI28 fixes it — here is how.
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.
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.
Choosing a symbology, barcodes that do not scan, GS1-128 and check digits.
EAN-13, Code 128 or QR? Practical rules for picking a barcode based on your data, your space and the scanner that has to read it.
ZPL barcode not scanningWhen a printed ZPL barcode will not scan, the cause is usually in the file: wrong data, a module too narrow, or a clipped quiet zone. Check them in order.
GS1-128 vs Code 128GS1-128 is Code 128 plus one invisible character. What FNC1 changes, why parentheses are not data, and why a wrong encoding is worse than no barcode.
The check digit your printer silently rewritesSend an EAN-13 with a wrong check digit and the printer does not complain — it prints a different number. Measured, and how to catch it before the run.
Network, USB, browser, macOS and Linux printing, printer identity and print-quality problems.
Zebra network printers accept raw ZPL on TCP port 9100. How to send a file from Windows, macOS or Linux, from code, and what to check when nothing prints.
Printing ZPL Without a Printer DriverWhy ZPL needs no driver, three ways to send it raw — direct socket, CUPS raw queue, Windows Generic/Text Only — and when a driver helps.
Printing ZPL from an iPhone, iPad or Android DeviceWhy the phone's Print button sends documents, not ZPL, and the routes that carry raw ZPL: Zebra's setup app, port 9100, Bluetooth and Weblink.
Printing ZPL from a browserA browser cannot open a socket to port 9100. The three patterns that actually deliver ZPL from a web app, and what each one costs.
Printing ZPL on macOS and Linux with a CUPS Raw QueueSet up a raw CUPS queue with lpadmin, send ZPL with lp, and avoid the classic trap: a filtering queue that prints your ZPL code as plain text.
Label Prints Too Large, Cropped or Blank After a CUPS UpdateAfter a Linux update the label is enlarged, cropped, blank or the barcode is a black block. Why driver queues do this, and the raw-queue fix.
Printing TSPL to a Bluetooth Label Printer from a Phone or BrowserBLE or Bluetooth Classic, what Web Bluetooth can reach (Android Chrome yes, iPhone Safari no), how to write a TSPL job in chunks, and a tested example.
Printing ZPL to a USB Zebra printer from the cloudA USB label printer has no port 9100. How the operating system's print queue carries raw ZPL, and how the Labelixa agent connects that queue to a cloud API.
Why did my label print on the wrong printer?Labels landing on the wrong printer are an identity problem, not bad luck: queue names, DHCP leases and shared drivers. How to diagnose and stop it.
Printer identity: why queue names and IPs betray youEvery layer of the label printing stack identifies a printer by something mutable: a queue name, a port mapping, a DHCP lease. Anatomy of jobs going astray.
How Labelixa stops a label printing on the wrong printerHow the Labelixa agent pins a printer's identity, checks it before every job and prints nothing on a mismatch — measured on a real printer, limits included.
The printer answers ping, but port 9100 does notThe printer answers ping but nothing reaches port 9100: ICMP and the raw print service are different things. Four checks, in the order that isolates the cause.
Status requests take an age — or never come backA ~HS query that takes ages or never returns is rarely a slow printer: five printer states answer with silence, and a query behind an open connection waits.
Dots all over the white areas of the labelSpeckles where the label should be white come from the file or printhead: a dithered image in the ZPL, or darkness, dirt and wear. One preview separates them.
The print is faint, smudges or rubs off — ribbon, label or setting?Washed-out, smudged or patchy thermal transfer print usually means ribbon type, label material and speed do not match. Zebra's own checks, in order.
Labels from Excel, ERP systems and FedEx or UPS ZPL labels.
Turn a spreadsheet into hundreds of ZPL labels: template variables, CSV column mapping, batch generation and the honest limits of each step.
ERP label printing with ZPLWhere ERP label pipelines break, and the validation gate that stops a bad template before it reaches a warehouse printer.
Working with carrier ZPL labelsCarrier APIs hand back ZPL, not a picture. How to decode it, check it before it burns media, and what you must not change.
FedEx ZPL labels: request, preview and fixThe Ship API fields that decide the ZPL (image type, stock, 203 or 300 dpi), where the label sits in the response and the checks to run before printing.
UPS ZPL labels: request, preview and fixThe Shipping API fields behind a ZPL label (format code, stock size, character set), the per-package path to the payload and why density is read from the file.
Printing Trendyol and HepsiJet ZPL shipping labelsTrendyol's common label and HepsiJet's barcode API return ZPL, not a PDF. How to check it and send it to a Zebra-class thermal printer.
Print your carrier's ZPL label on any printerUPS, FedEx, USPS, DHL, Amazon, ShipStation and others return ZPL. Print it on any printer as PDF or PNG, and automate it with one API call per label.
Other printer languages: comparisons with ZPL, previewing and debugging.
Label size in dots versus real units, job structure, text and barcode syntax — the ZPL and TSPL differences that actually cost porting time.
ZPL vs CPCL: desk printers and mobile unitsWhich to use: ZPL unless the printer is a CPCL mobile unit. Side-by-side command table, how to check and switch the printer language, and how to port a label.
TSPL vs EPL: migrating off a legacy fleetMoving from EPL printers to TSC hardware: what the two languages share, what has no counterpart, and how to test the migration.
Previewing and debugging EPL without a printerLegacy EPL/EPL2 jobs, rendered in the browser: what each line does, which findings matter, and what a preview will not draw.
EPL label content shiftedAn EPL label that prints shifted sideways is usually a printer setting, not the form: q width, the R reference point, and stored forms that inherit both.
Previewing and debugging TSPL without a printerRender TSPL in the browser, read the diagnostics it produces, and know which commands a preview deliberately does not draw.
TSPL BITMAP prints a black boxA TSPL BITMAP that prints as a solid black square almost always has its bits inverted: in TSPL a 0 bit prints black. Check the data, then fix it.
Previewing and debugging CPCL without a printerMobile printer labels rendered in the browser: the session header that controls everything, the findings that matter, and what is not drawn.
Arabic text prints reversed or broken in CPCLArabic or Hebrew sent with CPCL TEXT can print reversed or with disconnected letters. Why it happens and three ways to print right-to-left text.