Sign In
Products
ZPL ViewerBarcode GeneratorImage → ZPLZPL cheat sheetLabel DesignerTemplate Gallery
Developers
API QuickstartAPI ReferenceMCP ServerBulk GenerationWebhooksSDKs & ExamplesLimitsDirectPrint agent NewGitHub ActionVS Code extensionOn-Premise
Solutions
Logistics & ShippingE-CommerceERP & WMSManufacturingRetailHealthcare & LaboratoryAll solutions
Tools
ZPL Diagnostics HubZPL DebuggerSize & DPI AnalyzerDPI ConverterBarcode fit calculatorShipping Label AnalyzerFont InspectorOrientation DebuggerCalibration AssistantPrinter Compatibility CheckerBarcode Readability CheckerPrinter Language DetectorThermal Printer Test PackZPL ToolsEPL ToolsTSPL ToolsCPCL ToolsPrinter Language ConverterAll ToolsGuidesPricing
Language
EnglishTürkçeDeutsch
Home›Guides›ZPL dots, millimetres and inches

ZPL dots, millimetres and inches

Published: · Updated:

ZPL has no unit. ^FO50,50 means fifty dots from the left and fifty from the top, and a dot is as big as the print head makes it. That single fact explains most "the label came out the wrong size" tickets, so here are the numbers, computed rather than copied.

Dots per millimetre and per inch

Printers are sold by dots per millimetre (dpmm) or dots per inch (dpi); the pairs below are the industry's nominal values. The heads are really 8, 12 and 24 dots per millimetre — 203.2, 304.8 and 609.6 dpi — and "203" and "300" are rounded names. The engine, the converter and these tables all work in dots per millimetre, exactly as the printer does.

Measured, not assumed. On 2026-09-04 we printed a ruler ladder on a Zebra GK420d (203 dpi nominal) and measured it on paper: a 300-dot bar came out 37.96 mm against 37.50 expected, and seven 100-dot steps spanning 700 dots measured 87.36 mm against 87.50 — head axis and feed axis, both inside the ±1.2 % the photo method allows, and deviating in opposite directions, which is what measurement noise looks like rather than a scaled head. The 8 dots/mm figure this page rests on holds on real hardware. What that measurement cannot tell you is sub-1 % accuracy; that needs a flat label and a caliper.

Then we did exactly that. On 2026-09-14 the same GK420d printed a 400-dot bar along each axis — 50.00 mm by design at 8 dots/mm — and a vernier caliper read each one three times: head axis 50.0 mm, feed axis 49.5 mm, and the 80-dot bar thickness 10.0 mm. The head axis is exact; the feed axis runs 1 % short on this printer, repeatably, and that sign was already visible in both ruler rounds. One printer, one firmware, one media — not a statement about every GK420d — but it settles what the ruler could not: the dot pitch the tables rest on is what the head produces, and a small length error comes from the feed, not from the dots. (A first print measured 45.0 mm and it was not the head: a 560-dot print width left behind by an earlier EPL job clipped the bar. Worth checking before blaming the printer.)

Densitydpidots / mmdots / inch1 mm10 mm
6 dpmm152 dpi6152.4660
8 dpmm203 dpi8203.2880
12 dpmm300 dpi12304.812120
24 dpmm600 dpi24609.624240

Common label sizes in dots

Width × height, computed the way the engine sizes its canvas: inches × dpmm × 25.4, rounded down. Note that 4 inches on a "300 dpi" head is 1219 dots, not 1200 — the head is 12 dpmm, and 12 × 25.4 × 4 = 1219.2.

Label152 dpi203 dpi300 dpi600 dpi
4 × 6 in609 × 914812 × 12191219 × 18282438 × 3657
4 × 3 in609 × 457812 × 6091219 × 9142438 × 1828
2 × 1 in304 × 152406 × 203609 × 3041219 × 609
100 × 150 mm600 × 900800 × 12001200 × 18002400 × 3600
57 × 32 mm342 × 192456 × 255684 × 3841368 × 768

Migrating a file between densities

A file written for 203 dpi and sent to a 300 dpi head prints at 8/12 of its size — exactly two thirds — with a wide empty margin. The reverse overflows and clips. Nothing in the file is wrong; the dots simply mean a different physical distance. To move a design, every dot value scales by the ratio of the two densities in dots per millimetre — 1.5, not the 1.478 you get from dividing the rounded dpi names:

MigrationFactor4 in width in dots^BY2 becomes
203 → 300 dpi (8 → 12 dpmm)× 1.500812 → 12183
300 → 203 dpi (12 → 8 dpmm)× 0.6671219 → 8131
203 → 600 dpi (8 → 24 dpmm)× 3.000812 → 24366
300 → 600 dpi (12 → 24 dpmm)× 2.0001219 → 24384
152 → 203 dpi (6 → 8 dpmm)× 1.333609 → 8123

Three things do not scale cleanly, and this is where a mechanical find-and-replace fails:

The DPI converter applies the factor to every coordinate and flags the values it had to round; the size analyzer reads a file and reports which density makes its declared dimensions come out as a standard label.

Quick mental arithmetic

Frequently asked questions

How many dots is one millimetre in ZPL?

It depends on the printer: 8 dots at 203 dpi, 12 at 300 dpi and 24 at 600 dpi (6 at 152 dpi). ZPL itself carries no unit — a coordinate is a dot, and the print head decides how large a dot is.

Why does my 203 dpi label print small on a 300 dpi printer?

Because the file's dot values now mean shorter physical distances: 8/12 of the original, exactly two thirds, leaving a wide margin. Scale every coordinate by 1.5 (the dpmm ratio, not 300/203) or use the DPI converter, then re-check barcode module widths, which must stay integers.

Is 203 dpi exactly 8 dots per millimetre?

Nominally. 8 dots per millimetre is 203.2 dpi; printers and software round to 203. The difference is under a tenth of a percent — about half a dot over a full 4-inch width — and never the cause of a visibly wrong label.

Related guides

How to center text in ZPL

ZPL 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.

How to preview a ZPL file without a printer

A 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.

Using custom fonts in ZPL

Two 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.

How to open a ZPL file

A .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.

Try your own ZPL code →