Published:
Put a GS1-128 label next to a Code 128 one and you cannot tell them apart: same bar patterns, same character set, often the same width. The difference is one character you never see, and systems downstream act on it.
GS1-128 is Code 128 with FNC1 in the first position. FNC1
prints nothing and adds no readable character; it changes what the symbol
declares itself to be. A scanner reports a symbology identifier with
the data — ]C1 for GS1-128, ]C0 for plain Code 128 —
and receiving systems branch on that identifier. The same is true in two
dimensions: GS1 Data Matrix reports ]d2, plain Data Matrix
]d1. A plain symbol carrying the same text is not GS1, no matter
how correct the text looks.
GS1 data is a sequence of Application Identifiers: (01) GTIN,
(17) expiry, (10) batch. The parentheses are a
human-readable convention only. They are printed under the
bars; they are not encoded. Send (01)09501101020917 as plain data
and the brackets are encoded as literal characters — the receiving system
either rejects the string or, worse, accepts a GTIN that has two stray
characters in it.
The second trap is separators. AIs with a fixed length ((01) is
always 14 digits) need nothing after them. Variable-length AIs (a batch code)
must be terminated with FNC1 when another AI follows — otherwise the batch code
swallows the next field and both are wrong, silently.
A missing barcode stops the line: someone notices immediately and fixes it. A structurally wrong one scans fine at your desk and fails at the counterparty — a distribution centre, a hospital system, a carrier hub — days later, on a pallet that has already shipped. The cost is not the reprint; it is the investigation, the chargeback and the trust.
Our engine refuses to fake it. If the GS1 encoder is unavailable, it does not draw a plain symbol and call it GS1 — it produces no barcode and returns a warning instead. That decision is worth copying in your own pipeline: a validation gate that fails loudly beats one that emits something plausible.
What to check before a run: does the symbol declare GS1 (identifier), are the parentheses absent from the encoded data, and are variable-length AIs terminated? Paste the label into the ZPL viewer to see what you produced, and use barcode verification on a printed sample to read back what the scanner will actually get. If the label came from a carrier, do not re-encode it at all — see working with carrier ZPL labels.
No. It is Code 128 with FNC1 in the first position. The bars are drawn the same way; what changes is the symbology identifier the scanner reports (]C1 instead of ]C0) and therefore how receiving systems treat the data.
No. They are a human-readable convention printed under the bars. If you send them as data they are encoded as literal characters and the receiving system sees a GTIN with two stray characters in it.
A missing barcode stops the line immediately. A structurally wrong one scans fine on your desk and fails days later at the counterparty, on goods that already shipped — the cost is the investigation and the chargeback, not the reprint.
ZPL is the language Zebra thermal printers understand. How to read the commands, how a label is put together, and the most common mistakes.
Which barcode symbology should I use?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.
How to preview a ZPL file without a printerA ZPL file is just text — the label only exists once something draws it. Three practical ways to see a ZPL label before it reaches the printer.