Barcode Symbologies for Warehouse Labels, Explained

Two printed barcodes can be bar-for-bar, pixel-for-pixel identical as a physical pattern and still mean genuinely different things to whatever scans them. That’s not a hypothetical — it’s the ordinary relationship between two symbologies that show up constantly on warehouse labels, and knowing which one is actually in front of you is the difference between a label that’s understood inside one company’s four walls and one that’s understood by anyone downstream of it.

Code 128: a general-purpose way to encode text as bars

Code 128 is a linear barcode symbology, standardized as ISO/IEC 15417:2007, originally developed in 1981. What it actually does is narrow and general: it turns a string of characters into bars, capable of representing all 128 ASCII characters (letters, digits, punctuation, control characters) and, through an extension mechanism, the broader Latin-1 character set as well. It achieves that with three internal code sets — A and B between them cover the full ASCII range, while code set C packs pairs of digits into a single code position, which is why Code 128 produces noticeably more compact barcodes than an older symbology like Code 39 whenever the data being encoded is mostly numeric.

None of that says anything yet about what the encoded text means. A Code 128 barcode reading “A4471029” is, as far as the symbology itself is concerned, exactly that string and nothing more — what a business decides that string represents (an internal bin ID, a company-specific tote number, an arbitrary reference code) is entirely up to whatever system generated the label and whatever system is expected to read it back.

GS1-128: the same symbology, plus a shared vocabulary

GS1-128 — formerly known as UCC/EAN-128 — isn’t a separate physical barcode format. It’s Code 128 used under a specific, published convention: a special FNC1 character placed immediately after the barcode’s start character, which exists purely as a flag telling a reader “what follows isn’t just an arbitrary string — it’s structured according to GS1’s own rules.” Once that flag is present, the data that follows is organized into one or more Application Identifiers, each a short numeric prefix (typically two to four digits) that tells the reader exactly what kind of data comes next, in what format, and how long it runs — whether it’s a fixed length the reader can count out precisely, or a variable length that needs its own terminator before the next Application Identifier can be safely recognized.

A handful of the Application Identifiers that show up constantly on warehouse and shipping labels:

AIMeaningFormat
00Serial Shipping Container Code (SSCC)18 digits, fixed
01GTIN (product identifier)14 digits, fixed
10Batch or lot number1–20 alphanumeric characters, variable
11Production date6 digits, YYMMDD, fixed
17Expiration date6 digits, YYMMDD, fixed
21Serial number1–20 alphanumeric characters, variable

The distinction between fixed- and variable-length Application Identifiers matters mechanically: a reader parsing AI 01 knows exactly where the GTIN ends because it’s always 14 digits, but a reader parsing AI 10 (batch/lot) has no fixed length to count to — it needs a genuine separator, which is why the FNC1 character gets reused mid-string specifically to mark the end of a variable-length field before the next Application Identifier begins.

Reading a raw scan, worked through

A scan engine handling a GS1-128 label doesn’t see a table like the one above — it sees one continuous string, and it has to split that string into fields itself, using nothing but the Application Identifiers embedded in it. A label for Vellano Imports’ EVOO-500, encoding a case’s GTIN, its lot number, and its expiration date in one symbol, might decode to a raw string along the lines of:

010061414100001210L260117271115

Split correctly against the reference table above, that’s: AI 01 (fixed, 14 digits) → GTIN 00614141000012; AI 10 (variable) → lot L2601, with a separator marking where the variable-length lot number ends; then AI 17 (fixed, 6 digits) → expiration date 271115, read as 2027-11-15. Get the Application Identifier boundaries wrong — say, by treating AI 10 as if it were fixed-length, or losing track of where its separator falls — and every field after it misreads, silently producing a syntactically plausible but factually wrong lot number or date, with nothing about the barcode itself flagging that the split was wrong. The Application Identifiers aren’t a labeling nicety; they’re the only thing that makes a concatenated string like this parseable at all.

Why one label can carry several of these at once

Because Application Identifiers are just concatenated one after another inside the same barcode, a single GS1-128 symbol can carry several distinct pieces of data in one scan — a GTIN, a batch or lot number, and an expiration date together on one label, for instance, rather than three separate barcodes each needing its own pass. That’s the entire practical case for GS1-128’s dominance on shipping cartons and pallet labels: one physical scan, one motion, captures everything a receiving dock needs to identify what arrived, which production batch it came from, and how long it’s good for — instead of requiring a worker to scan three different codes and trust that all three actually belong to the same physical unit.

When plain Code 128 is the right choice, and when it isn’t

The practical dividing line is whether a label’s meaning needs to survive outside the system that printed it. A purely internal label — a company’s own bin location code, an internally generated tote or license-plate identifier meant to be looked up against that same company’s own database — has no real need for GS1’s structure; a plain Code 128 barcode encoding an arbitrary internal string is simpler to generate and entirely sufficient, because the receiving system already knows how to interpret its own convention. A label meant to be read by somebody outside that closed loop — a carrier’s scanner, a customer’s own receiving system, a regulator reconstructing a recall trace across several companies’ records — needs GS1-128 specifically because the Application Identifier is what lets a completely unrelated system understand the data without ever having seen that company’s internal conventions. AI 01 means “GTIN” to every GS1-128 reader on earth; an internal Code 128 string carries no such universal guarantee at all.

A barcode is only as trustworthy as the data it was built from

It’s worth being honest about the limit of what any of this actually guarantees. A barcode — Code 128, GS1-128, or otherwise — is a faithful encoding of whatever string it was given; it has no way to verify that the string is correct, only that it decodes back to exactly what was printed. A GS1-128 label that decodes perfectly to a well-formed batch number is not, by itself, proof that the batch number it carries was ever genuinely attached to that item’s real tracking record inside whatever inventory system receives the scan — that’s a question about how the receiving system handles item tracking once the barcode’s data reaches it, covered in full in item tracking in Business Central, explained. A correctly structured barcode and a correctly tracked item are two different claims, and a label passing the first doesn’t say anything about the second.

Where this goes next

For what actually happens once a scanned lot or serial number reaches Business Central — and the well-known way a system can accept a scan without genuinely recording its tracking — see item tracking in Business Central, explained. For the separate problem of a scan getting lost or replayed on a connection that drops mid-transaction, regardless of which symbology produced it, see why offline barcode scanners lose (or double-post) scans. For how a barcode’s encoded quantity relates to the unit of measure it’s actually counted in, see units of measure in warehouse operations, explained.

Key terms

New to the vocabulary? Barcode symbology and License plate are defined in the glossary.

Further reading

GS1-128 Barcode: Overview and Structure — GS1 US’s own explanation of the symbol structure and its logistics use cases. Code 128 — Wikipedia — the symbology’s origin, character set, and its relationship to GS1-128 via the FNC1 flag. GS1 Application Identifiers reference — the full table of Application Identifier codes, including the ones listed above.

Questions about WarehouseQ?

Support: support@dynamicspro.ca · 416-843-6575