GS1 identifiers, and how one barcode carries several facts

A retail barcode holds one number. A logistics barcode often needs to hold four or five, with no ambiguity about which is which and no shared database to look them up in. Application Identifiers are how that works, and they are a surprisingly elegant piece of design.

Updated 8 September 2026

Start with the GTIN

The Global Trade Item Number is the identifier for a product. It is what a checkout reads, and it is unique worldwide, which is the property that makes retail work at all: a tin of beans scanned in one country resolves to the same product record as the same tin scanned anywhere else.

Uniqueness has to come from somewhere, and it comes from allocation. GS1 issues a company prefix to you. Everything after that prefix is yours to assign, and the last digit is a check digit computed from the rest.

The problem AIs solve

Now put yourself at a goods-in door. A pallet arrives, and you need the product, the batch it came from, the date it expires and the serial of that specific case. You could print four barcodes, but four labels get separated and mis-paired. You could concatenate the numbers into one long string, but then every reader has to be told, out of band, that characters 1 to 14 are the product and 15 to 20 are the batch, and that agreement breaks the moment anyone changes anything.

Application Identifiers solve it by making the data self-describing. Each field is prefixed by a short numeric code saying what the field is. The reader does not need prior agreement about layout; it needs only the published table of what each identifier means.

The identifiers you will actually meet

AIMeaningFormat
00Serial Shipping Container Code, identifies a logistic unit18 digits, fixed
01GTIN of the item14 digits, fixed
10Batch or lot numberUp to 20 characters, variable
11Production date6 digits, YYMMDD
17Expiry date6 digits, YYMMDD
21Serial numberUp to 20 characters, variable
30Variable count of itemsUp to 8 digits, variable
3103Net weight in kilograms, three decimal places6 digits, fixed
Common Application Identifiers

Read as an element string, a case label might carry the GTIN under 01, the batch under 10 and the expiry under 17. Printed in human-readable form beneath the bars those appear in brackets, which is a convention for people reading the label. The brackets are not encoded in the barcode itself.

FNC1, and the separator problem

Two mechanisms make the scheme unambiguous, and both revolve around a special non-data character called FNC1.

First, FNC1 in the opening position is the flag that says "this is GS1 data, not arbitrary text". A Code 128 symbol carrying it is a GS1-128 symbol. The bars are ordinary Code 128 either way; that first character is the entire difference.

Second, it acts as a field separator. Fixed-length identifiers need no separator, because the reader knows a GTIN under AI 01 is exactly fourteen digits and can simply count. Variable-length ones do: a batch number may be one character or twenty, and without a marker the reader cannot tell where it ends and the next identifier begins. So a variable-length field is terminated by FNC1 whenever something follows it.

GS1 Digital Link expresses the same identifiers as a web URL, so a single code can be both a machine-readable product record and something a shopper's phone can open. The identifiers survive: the GTIN and the batch appear as path segments in a defined structure rather than as an element string.

The reason it matters is that it collapses a long-standing split. Packaging has carried one code for the checkout and, increasingly, a second for the consumer. Digital Link is the attempt to make one code serve both, which is why you will see GS1-flavored QR codes appearing on retail packaging.