GS1-128 and FNC1 explained

GS1-128 is not a separate symbology. It is Code 128 with an FNC1 character directly after the start character. That FNC1 tells the scanner: the data that follows is GS1 data made of Application Identifiers (AIs).

Element strings

GS1 data is a chain of element strings: an AI followed by its data.

(01)09521234543213(10)ABC123(17)251231

The parentheses are only for people. They appear in the human-readable text under the barcode but are never encoded. Encoded, the example becomes the digits and letters without parentheses, with FNC1 characters where needed.

When is an FNC1 separator needed?

  • AIs with a predefined length, such as (01) GTIN or (17) expiry date, need no separator. The scanner knows where they end.
  • AIs with variable length, such as (10) batch/lot or (21) serial number, must be followed by an FNC1 separator if another element string comes after them.
  • The last element string never needs a separator.

Tip: put predefined-length AIs first and variable-length AIs last. That saves separators and makes the barcode shorter. Which AI has which length is listed in the Application Identifier table.

What the scanner sends

A scanner with symbology identifiers enabled transmits:

  • ]C1 at the start for GS1-128 (]d2 for GS1 DataMatrix, ]Q3 for GS1 QR Code)
  • the AIs and data without parentheses
  • each separator FNC1 as the ASCII group separator GS (byte 29)
]C1010952123454321310ABC123<GS>17251231

If a scanner reports ]C0, the barcode is plain Code 128 without the leading FNC1, and software will not recognise it as GS1 data.

Common mistakes

  • Parentheses encoded as data. The barcode then contains ( and ) characters and is not valid GS1.
  • Plain Code 128 instead of GS1-128. The FNC1 in first position is missing.
  • Missing separator after a variable-length field. The next AI is read as part of the previous field, for example the batch number swallows the expiry date.
  • Wrong check digit in (00) or (01). Validate with the GTIN Validator first.

Related tools