Published:
ERP systems are good at knowing what should be on a label and weak at knowing whether the label will physically print. The gap shows up in the same place every time: a template edited on a Tuesday, a shift that starts on Wednesday, and a pallet of labels that came out wrong because nothing between the ERP and the printer ever looked at the output.
Whatever the system — Odoo, NetSuite, a homegrown WMS — the shape is the same: business data is merged into a label template, the result is emitted as ZPL, and the ZPL is delivered to a printer, usually raw over TCP port 9100. Three failure points sit in that chain and none of them is the printer's fault:
The fix is a step, not a product: between "ERP produced ZPL" and "send to printer", run a structural check and refuse to queue anything that fails. In practice that means one HTTP call in whatever service already handles the printing.
curl -X POST "https://api.labelixa.com/v1/diagnostics?dpmm=8&w=4&h=6" --data-binary @merged-label.zpl
The response lists findings with severity and position. Treat
error as a hard stop — the label will not render as intended —
and log warning even when you proceed, because warnings are
what turn into "why did last month's labels scan worse" questions. The
same gate exists as a command line step for a cron or CI job
(npx labelixa validate merged-label.zpl exits non-zero on
errors), which is the easiest way to check a template against a batch of
real records before a release.
Rendering is the second half. A gate catches structural problems; a render shows the human what the label will look like, which is what you want when a template changes and someone has to approve it.
Odoo's label output is template-driven and can be emitted as ZPL to a network printer. The practical advice is independent of version: keep the ZPL template in version control rather than only in the database, test it against your longest real values (not the demo data), and put the validation gate in the same code path that sends to the printer. Because Odoo deployments differ so much between versions and modules, confirm the exact configuration screens against your own version's documentation rather than a screenshot from another release.
NetSuite generates label output from saved searches and scripts, so the label is assembled where business logic lives. That makes it easy to add a validation step in the same script that produces the ZPL, and it makes the "longest real value" test especially important: a saved search that works on today's data can produce an overflowing label the first time a longer item name appears. As with Odoo, treat the exact record and script setup as version-specific and check it against current documentation.
If a label still prints wrong after all three, the symptom triage narrows it to a cause without spending media on guesses.
Between "the ERP produced ZPL" and "send to printer", inside the service that already handles printing: one diagnostics call, refuse to queue on error-level findings, log warnings. It is a step, not a product.
Because the merge produces content the layout cannot hold: a longer product name, a fourth address line, a batch code with more digits. Test every variable field with the longest real value, not the demo data.
No. ZPL coordinates are dots, so a layout drawn for 203 dpi prints at roughly two-thirds size on a 300 dpi head. Keep a template per density or convert it, and validate at the density the target printer actually has.
No. The pattern — template in version control, longest-value test, validation gate in the printing code path — is independent of version. Confirm the exact configuration screens against your own version's documentation.
Carrier APIs hand back ZPL, not a picture. How to decode it, check it before it burns media, and what you must not change.
How to Print ZPL Labels from Excel or CSV DataTurn a spreadsheet into hundreds of ZPL labels: template variables, CSV column mapping, batch generation and the honest limits of each step.
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.