← Back to Blog
ZPL & Zebra Printing

ZPL vs EPL: Choosing the Right Zebra Label Language

Sydney LarssonAugust 27, 2026637 views

ZPL (Zebra Programming Language) and EPL (Eltron Programming Language) are the two native command languages used by Zebra thermal label printers. ZPL is the current standard, supported on virtually every modern Zebra device, and is the right choice for new deployments. EPL (usually EPL2) is a legacy language found on older Eltron-era printers from the 1990s and early 2000s; it still works on those machines but is not supported on Zebra's current printer lineup. Label Toolkit generates and exports ZPL, letting you design labels in a browser without installing anything.

  • ZPL is the modern, actively developed standard; EPL2 is legacy and limited to older Eltron-era hardware.
  • ZPL uses caret-based commands (^XA, ^FO, ^BC, etc.); EPL2 uses short two-letter ASCII commands (N, A, B, P).
  • ZPL supports scalable fonts, rich 2D barcodes, variable data, and networked printing; EPL2 supports only a fixed bitmap font set and basic 1D barcodes.
  • If you are buying or spec-ing a printer today, choose ZPL. If you own an older LP or TLP series Eltron printer, EPL2 may be your only option until hardware is refreshed.

What is EPL2 and where did it come from?

EPL stands for Eltron Programming Language. Eltron Technology was a label printer manufacturer that Zebra Technologies acquired in 1998. EPL2 (the second version) became the dominant language on Eltron's LP 2842, LP 2844, and TLP 2844 printers, which were extremely popular for small-parcel shipping labels throughout the late 1990s and 2000s. You will still find these printers in warehouses and small shipping operations today because they are physically durable.

EPL2 commands are compact ASCII strings. A label starts with the letter N (clear buffer), positions text with A commands, adds barcodes with B, and prints with P. A minimal EPL2 label looks like this:

N
A50,50,0,3,1,1,N,"Hello World"
B50,100,0,1,2,2,50,B,"12345678"
P1

Each parameter is positional and separated by commas. The format is terse, which suited the low-memory embedded controllers of 1990s hardware. The trade-off is that EPL2 is hard to read, hard to debug, and almost impossible to extend for complex layouts.

What is ZPL and why did it replace EPL?

ZPL was developed by Zebra Technologies independently of the Eltron acquisition. After the merger, Zebra standardized its entire product line around ZPL II (the second and current iteration), which added scalable fonts, graphics download, and richer barcode support. Every Zebra printer released after roughly 2003 speaks ZPL natively. Many of them can also emulate EPL2 through a firmware setting, but that emulation layer adds overhead and does not expose full printer capability.

ZPL uses caret (^) and tilde (~) prefixed commands. A label is wrapped in ^XA (start) and ^XZ (end). Fields are placed with ^FO (Field Origin), typed with ^FD (Field Data) and closed with ^FS (Field Separator). A comparable ZPL label to the EPL2 example above looks like this:

^XA
^FO50,50^A0N,30,30^FDHello World^FS
^FO50,120^BCN,50,Y,N,N^FD12345678^FS
^XZ

The syntax is more verbose, but each element is named and self-describing. ^A0N,30,30 means: use font zero (the built-in scalable font), orientation Normal, height 30 dots, width 30 dots. Debugging that six months later is far easier than decoding positional EPL2 parameters. You can read the full ZPL command reference in Label Toolkit's ZPL Commands hub for Zebra label printing.

ZPL vs EPL2: a structured comparison

FeatureZPL IIEPL2
Command prefixCaret (^) and tilde (~)Single or two-letter ASCII
Label start / end^XA ... ^XZN (clear) ... P (print)
Coordinate systemDot-based (origin top-left by default); adjustable with ^LHDot-based (fixed top-left origin)
FontsScalable fonts via ^A; downloadable TrueType via ^CW8 fixed bitmap fonts (A through H); no scalable fonts
1D barcodesCode 128 (^BC), Code 39 (^B3), ITF-14 (^B2), UPC-A (^BU), EAN-13 (^BE), and many moreCode 128, Code 39, UPC, EAN, Interleaved 2 of 5 (I2of5); no GS1-128 FNC1 support natively
2D barcodesQR Code (^BQ), Data Matrix (^BX), PDF417 (^B7), MaxiCode (^BD)PDF417 only (on select models); no QR, no Data Matrix
GraphicsDownload via ^GF (graphic field) or store to flash with ^ILBasic line and box drawing (LO, LE); no downloadable graphics
Variable data / mergeFull field substitution; host-supplied variables via ^FN and ^FDManual string replacement only; no named variables
Printer memory managementStore label formats to DRAM, Flash, or memory card; recall by nameNo persistent format storage
Network printingFull support over TCP/IP, USB, Bluetooth, Wi-Fi with status feedbackSerial and parallel only on original hardware
Active Zebra supportYes, all current printers (ZD220, ZD420, ZD620, ZT series, etc.)No; only via EPL emulation on select models
Tooling and ecosystemZebraDesigner, Label Toolkit, Labelary API, ZBI scriptingMinimal; legacy third-party only

How do the coordinate systems actually differ in practice?

Both languages measure position in printer dots, which depend on print density. A 203 DPI (dots per inch) printer has roughly 8 dots per millimeter. A 300 DPI printer has about 11.8 dots per mm. So a ^FO100,200 command on a 203 DPI printer places a field 100 dots (12.4 mm) from the left edge and 200 dots (24.8 mm) from the top.

EPL2 uses the same dot grid, but the coordinate order for its A (text) command is A x,y,rotation,font,h_mult,v_mult,reverse,"data". Rotation is expressed as 0, 1, 2, or 3 (for 0°, 90°, 180°, 270°). ZPL uses ^FO x,y then a separate rotation parameter inside the font or barcode command (N for normal, R for 90°, I for inverted, B for bottom-up). The ZPL approach separates position from orientation, which is cleaner when you are templating labels programmatically.

One practical ZPL gotcha: the ^PW command sets label width in dots. If you forget it and your label is wider than the default, the printer will silently clip the right edge. EPL2 has no equivalent width declaration; it just prints whatever fits on the installed media.

Font handling: the biggest day-to-day difference

EPL2's fixed bitmap fonts (A through H) range from roughly 5 x 7 pixels (font A) to around 24 x 24 pixels (font H) before hardware magnification. The h_mult and v_mult multipliers (1 to 9) scale them up by pixel doubling, which looks blocky at large sizes. On a 203 DPI label this is usually acceptable for a single-line part number, but it falls apart on a compliance label where you need a 14pt font and a 7pt font side by side with precise sizing.

ZPL's ^A command targets named or numbered fonts. ^A0 is the built-in scalable CG Triumvirate font (a monospaced sans-serif). You specify height and width independently in dots, so ^A0N,56,56 gives you a 56-dot-tall (roughly 7mm on 203 DPI) text field that scales smoothly. Zebra also allows TrueType font download via ^CW plus the ~DY download command, giving you full typographic control that EPL2 simply cannot match.

Barcode support: where EPL2 falls furthest behind

For basic Code 128 shipping labels, EPL2 is adequate. But the modern label ecosystem has moved well past that. GS1-128 labels (used for SSCC carton labels and GS1 application identifiers) require an FNC1 character at the start of the barcode data. ZPL's ^BC command handles this automatically when you set the mode parameter to N and include the correct AI prefix. EPL2's Code 128 implementation does not insert FNC1 reliably across all firmware versions.

QR codes are entirely absent from EPL2. If your workflow involves QR codes for traceability, URLs, or product authentication, you need ZPL and ^BQ. A minimal QR code command in ZPL looks like ^BQN,2,4^FDQA,https://example.com^FS, where 2 is model 2, 4 is module size in dots, and QA, sets error-correction level Q with automatic data type selection. You can explore the full syntax in the ^BQ ZPL command reference.

Data Matrix (^BX) is similarly ZPL-only. This matters for pharmaceutical serialization under regulations like the FDA DSCSA and EU FMD, which often mandate Data Matrix codes on unit-of-use packaging. According to GS1 General Specifications, GS1 DataMatrix is the preferred 2D symbol for healthcare packaging, and no EPL2 printer can produce it natively.

Which printers speak which language?

The table below covers the most common models you will encounter in the field.

Printer modelNative languageEPL emulation available?Era
Eltron LP 2842 / LP 2844EPL2No (EPL2 only)Late 1990s
Zebra TLP 2844 / TLP 2844-ZEPL2 (TLP 2844) or ZPL (TLP 2844-Z)TLP 2844-Z: EPL emulation via firmwareEarly 2000s
Zebra GK420d / GX420dZPL II (EPL emulation optional)Yes, via Zebra Setup Utilities2010s
Zebra ZD220 / ZD230ZPL IINo EPL emulation on ZD220/ZD230Current
Zebra ZD420 / ZD620ZPL II (EPL emulation on some firmware)Yes, configurableCurrent
Zebra ZT411 / ZT421 (industrial)ZPL IIYes, via SGD command or front panelCurrent

To check whether a printer has EPL emulation enabled, send the ZPL Set/Get/Do (SGD) command ! U1 getvar "device.languages" over a TCP/IP connection on port 9100. The printer will return a string like "zpl, epl" if both are active. The Zebra ZPL II Programming Guide documents all SGD variables for printer configuration.

When should you still use EPL2?

There are a few legitimate situations where EPL2 remains the right answer, at least temporarily.

  • You own LP 2844 or TLP 2844 printers with no budget to replace them. These printers do not run ZPL natively, and the EPL emulation layer on the 2844-Z has known quirks with Code 128 subset switching. If the labels you print are simple (name, address, one barcode), EPL2 from your existing software is fine.
  • You are maintaining a legacy system that already generates EPL2 output. Rewriting the label generation module costs time. If the labels are working and the hardware is stable, the migration can wait. Just do not invest in expanding that system; plan the ZPL migration for your next hardware refresh.
  • Your integrator's middleware only speaks EPL2. Some older warehouse management systems (WMS) ship with fixed EPL2 print drivers. Modern WMS platforms have long since added ZPL support, but if you are locked into an older version, EPL2 may be the path of least resistance until the WMS upgrade.

How to migrate from EPL2 to ZPL: a practical approach

  1. Audit your current EPL2 labels. List every label type, its dimensions, the barcodes it uses, and which printers produce it. Note the DPI of each printer (usually 203 or 300).
  2. Map EPL2 elements to ZPL equivalents. Each A text line becomes a ^FO / ^A / ^FD / ^FS block. Each B barcode line becomes a ^FO / ^BC (or other barcode command) / ^FD / ^FS block. Coordinate values stay the same if you keep the same DPI printer.
  3. Rebuild the label in Label Toolkit's visual designer. Place fields graphically, then use the ZPL export to get clean, correct ZPL. This is faster than hand-translating EPL2 line by line and reduces transcription errors.
  4. Validate with Labelary or Label Toolkit's preview. Paste the exported ZPL into a ZPL viewer and compare the visual output to your original EPL2 label. Check field alignment in dots, not just pixels.
  5. Test on the physical printer. Send the ZPL over port 9100 (TCP/IP) or USB and do a physical scan of every barcode. Verify quiet zones meet the symbology minimums (10x the module width for Code 128, per ISO/IEC 15417).
  6. Update your system to output ZPL instead of EPL2. If your WMS or ERP generates EPL2 strings, update the template or print driver. Most modern label SDKs have ZPL templates.
  7. Retire or reconfigure EPL hardware. If you have ZD-series printers with EPL emulation active, disable emulation via the front panel or the SGD command ! U1 setvar "device.languages" "zpl" to ensure only ZPL is accepted going forward.

Label Toolkit and ZPL: what you can do right now

Label Toolkit is a browser-based label designer that exports production-ready ZPL without requiring software installation. You can design a label visually, add Code 128 (^BC), QR (^BQ), or any other supported symbology, set your label size in mm or inches, choose your target DPI (203 or 300), and export a ZPL file ready to send directly to your Zebra printer.

The ZPL output is clean and human-readable, which matters if you want to version-control your label templates or inspect what is being sent to the printer. If you already have ZPL code from another source, you can also import it and get an editable visual label back, as described in the guide to importing ZPL and converting Zebra code into an editable label.

For a broader understanding of ZPL before going deep on the ZPL vs EPL question, the complete guide to ZPL II is the best starting point in this cluster.

Frequently asked questions

Can a modern Zebra printer print EPL2 labels?

Many current Zebra printers (ZD420, ZT411, and others) include an EPL emulation mode that can be activated through the printer's settings. However, Zebra's entry-level current models like the ZD220 do not support EPL emulation at all, and even where emulation is available, it does not expose the printer's full ZPL feature set. If you are relying on EPL emulation long-term, plan a migration to native ZPL.

Is ZPL or EPL2 faster to render on the printer?

On modern printers, the difference is negligible for typical label volumes. ZPL's richer feature set does mean slightly more parsing work, but Zebra's current firmware handles thousands of labels per hour without ZPL being the bottleneck. On very old EPL2-native hardware, EPL2 can feel snappier because the firmware is purpose-built for it.

Can I convert EPL2 code to ZPL automatically?

There is no widely available automatic EPL2-to-ZPL converter that handles all edge cases reliably. The safest migration path is to recreate the label in a ZPL-native designer like Label Toolkit and export fresh ZPL, then compare the output visually and with a barcode scanner rather than trying to translate raw EPL2 commands one-for-one.

Does EPL2 support QR codes?

No. EPL2 does not support QR codes or Data Matrix codes natively. On EPL2-only printers like the original LP 2844 and TLP 2844, 2D barcodes simply cannot be produced. If QR codes are part of your labeling requirement, you need a ZPL-capable printer.

What port do I use to send ZPL to a Zebra printer over the network?

The standard raw port for ZPL is TCP 9100. Open a TCP socket to the printer's IP address on port 9100, write the ZPL string as plain bytes, and close the connection. The printer will begin printing immediately on receipt of the ^XZ end-of-label command. No handshake or header is needed for basic printing.

Ready to design ZPL labels without writing a single line of code? Create a free Label Toolkit account and start building labels that work with every modern Zebra printer.

#zpl vs epl #zpl commands #zebra printing #epl2 #label language #thermal label printing
SL
Written by Sydney Larsson
View profile →