Published: · Updated:
The most common real-world labelling job is not one label — it is one design and a spreadsheet of rows: products, shipments, shelf locations. This guide shows the whole path from an Excel/CSV file to a stack of printable ZPL labels.
Wherever a value changes per row, replace it with a
{{name}} placeholder:
^XA
^FO40,40^A0N,35^FD{{product}}^FS
^FO40,90^BY2^BCN,80,Y,N,N^FD{{sku}}^FS
^XZOpen this label in the ZPL viewer →
Placeholders can be typed ({{qty:sayi}} for numbers)
and can carry defaults ({{note|—}} keeps a row valid when
the cell is empty). The bulk tool detects
the placeholders automatically when you paste the template.
In Excel: File → Save As → CSV (UTF-8). The first row must be headers. Header names do not have to match the placeholder names — the next step maps them — but matching names map themselves.
In the bulk generator, upload the CSV and match each placeholder to a column. You get a per-row preview before anything is generated, so a mismatched column shows up as a wrong label on screen, not as a wasted roll of media.
The batch runs as a job: you see progress, can cancel, and download the result as a ZIP. Each generated label counts against your plan's quota — a 500-row sheet is 500 operations, and the tool says so before you start rather than surprising you at the invoice.
The same flow exists as REST endpoints for recurring jobs:
POST /v1/variables/csv parses the file,
POST /v1/bulk/jobs starts the batch — see the
API reference. What worked in the browser
works identically over the API; it is the same engine.
Rendering shows what the server draws, not what your printer's darkness and media will do with it — proof one label physically before committing a large batch. Formulas in cells are treated as plain text (deliberately: CSV formula injection is a real attack), so compute values in the sheet before exporting.
If you store the template on the printer with ^DF and recall it with ^XF instead, only the data sent to numbered ^FN fields changes between labels. A stored format with no ^FN prints the same label every time, often because a design program exported text or barcodes as a ^GF image. The linter flags this as ZPL2003.
Not directly — export the sheet as CSV (UTF-8) first, then upload it to the bulk generator. Placeholders like {{sku}} in your ZPL template are mapped to CSV columns, previewed per row, and generated as a batch job.
No — cell content is treated as plain text on purpose (CSV formula injection is a real attack). Compute the values in the spreadsheet before exporting; only the results travel.
Each generated label counts as one operation against your plan's quota, so 500 rows are 500 operations. The tool states the count before you start the job.
Where ERP label pipelines break, and the validation gate that stops a bad template before it reaches a warehouse printer.
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.
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.