GS1-128 SSCC label: how the barcode is built and what size to print it
GS1-128 is the barcode a GS1 logistic label carries on a pallet or carton: a Code 128 symbol with a special first character that tells the scanner the data follows GS1 rules. This page explains the structure, the separators, and the sizes GS1 specifies for shipping units.
What makes a Code 128 barcode a GS1-128
One thing: the character straight after the start character is Function 1, written FNC1. The GS1 General Specifications put it plainly in section 5.4.3.7: a Code 128 symbol that begins with a start character followed by FNC1 is always a GS1-128 barcode, and one that does not is never a GS1-128 barcode. A scanner uses that character to decide whether to read the data as GS1 application identifiers.
The FNC1 in that first position is not sent to your system as a character. The scanner reports it through the symbology identifier ]C1 in front of the data (section 5.4.7.4).
Application identifiers
The data inside is a chain of element strings. Each one is an application identifier (AI), two to four digits that say what the value is, followed by the value. (00) is an SSCC, (01) a GTIN, (10) a batch or lot. The parentheses appear only in the printed text under the bars. They are not encoded. The application identifier table lists the ones used on shipping labels with their formats.
Inside an SSCC barcode
Here is the symbol for (00) 006141410000000012, character by character, as this site's encoder builds it. Code set C packs two digits into each character, which is why 20 digits take only ten data characters.
| Position | Character | Carries | Value |
|---|---|---|---|
| 1 | Start C | 105 | |
| 2 | FNC1 | 102 | |
| 3 | Data (set C) | 00 | 0 |
| 4 | Data (set C) | 00 | 0 |
| 5 | Data (set C) | 61 | 61 |
| 6 | Data (set C) | 41 | 41 |
| 7 | Data (set C) | 41 | 41 |
| 8 | Data (set C) | 00 | 0 |
| 9 | Data (set C) | 00 | 0 |
| 10 | Data (set C) | 00 | 0 |
| 11 | Data (set C) | 00 | 0 |
| 12 | Data (set C) | 12 | 12 |
| 13 | Symbol check character | 4 | |
| 14 | Stop | 106 |
The symbol check character is a second, separate check from the SSCC's own check digit. It is the weighted sum of the character values, modulo 103 (section 5.4.7.5.1). It is never printed in the text under the bars.
Separators between element strings
When one barcode carries several element strings, the scanner has to know where each ends. GS1 handles this with a short fixed list. Element strings whose AI starts with one of the two-digit pairs in table 7-6 of the General Specifications have a predefined length and need nothing after them. Every other element string must be followed by a separator, FNC1, unless it is the last one in the barcode (sections 7.8.3 to 7.8.6).
The catch is that "fixed length" and "predefined length" are not the same thing. GS1 states that AIs outside the table are treated as variable length even when their data field has a fixed size. The count AI (37), the PO number (400) and the postal code (420) all need a separator when something follows them. The separator never appears in the printed text.
Limits
- At most 48 data characters, counting the AIs and any separators (section 5.4.4.3).
- At most 165.10 mm (6.5 inches) long, quiet zones included (section 5.4.4.3).
- A quiet zone of at least ten modules on each side (section 5.4.4.2).
- The symbol is 11 modules per character plus 46, where the count covers data, FNC1 separators and code set switches (section 5.4.7.2).
Print size for pallets and cartons
For logistic units scanned in general distribution, table 5-51 of the General Specifications (section 5.12.3.5) sets the width of one module, the X-dimension, at 0.495 mm minimum and 0.940 mm maximum, with bars at least 31.75 mm (1.25 inch) tall.
A thermal printer can only draw whole dots, so the module width is a whole number of dots, set in ZPL with ^BY. This site uses the smallest value that lands inside the GS1 range at each resolution:
| Printer | Dots per module | X-dimension | SSCC barcode with quiet zones |
|---|---|---|---|
| 203 dpi | 4 | 0.500 mm | 88.1 mm |
| 300 dpi | 6 | 0.508 mm | 89.4 mm |
The arithmetic is dots times 25.4 divided by the dpi. Both widths fit across a 4 inch (101.6 mm) label. This is also why ZPL written for a 203 dpi printer cannot simply be sent to a 300 dpi one: the same dot counts print about two thirds the size, and the bars fall below the GS1 minimum.
The text under the bars
GS1 requires a human readable interpretation of each element string in a GS1-128 on a logistic label (section 6.6.4.1.2), with parentheses around the AIs and no separator characters shown (section 4.14). Zebra's ZPL guide for the ^BC command notes that to get the parentheses you turn the printer's own interpretation line off and write a separate text field, which is what the generator does. The annotated ZPL example shows it.
Older documents and many retailer manuals call this same barcode UCC-128. See UCC-128 barcode for the names, and the SSCC label guide for the label built around it.
Make this label now: fill in the shipment, preview it, and copy or download the ZPL.
Open the label generatorSources
- GS1 General Specifications Standard. GS1. Release 26.0, ratified January 2026. Read 9 October 2026.
- GS1 Application Identifiers reference. GS1. Online reference. Read 9 October 2026.
- ZPL II Programming Guide: ^BC, Code 128 Barcode (Subsets A, B, and C). Zebra Technologies. Online guide. Read 9 October 2026.