GS1-128 vs Code 128: Stop Confusing Them
GS1-128 and Code 128 look identical but mean very different things. Here is the difference, when each one is required, and which generator to use.
Every GS1-128 is a Code 128. A Code 128 only becomes a GS1-128 when it starts with FNC1 and follows the GS1 data rules. GS1-128 is a rulebook layered on top of Code 128, with the same bars and the same scanners. What changes is what the numbers mean and how a receiving system is allowed to parse them.
If you're printing shipping cartons for a retailer, a third-party logistics warehouse (3PL), or a regulated supply chain, you almost certainly want GS1-128. If you're printing an internal asset tag, a work-order ticket, or anything that stays inside your four walls, plain Code 128 is fine.
The difference
| Code 128 | GS1-128 | |
|---|---|---|
| Symbology | Code 128 | Code 128 (identical bars) |
| Data format | Anything you want | GS1 Application Identifiers (AIs) |
| Start character | Start A, B, or C | Start A, B, or C, then FNC1 |
| Who validates it | Nobody | GS1 standards + trading partner |
| Typical use | Internal labels, tickets, asset tags | Shipping cartons, pharma, foodservice, retail logistics |
| Generator | Code 128 | GS1-128 |
What the FNC1 start character does
A GS1-128 begins with a hidden control character called FNC1. It's not printed as a human-readable digit, but every compliant scanner recognizes it. FNC1 tells the scanner that the data after it is structured and follows the GS1 Application Identifiers. Without FNC1, a scanner reading the same bars passes your software a raw string with no structure attached. For the full mechanics of FNC1 and the rest of Code 128's control characters, see FNC1 through FNC4 in the Code 128 reference.
That one control character is the whole difference between "Code 128 with numbers on it" and GS1-128. If your generator doesn't prepend FNC1 automatically, it isn't producing a GS1-128, and a receiving system that checks will reject the label.
Application Identifiers, briefly
GS1 AIs are two-to-four digit prefixes that tell the scanner what the following data represents. These are the ones you'll see most often.
(00)- SSCC (Serial Shipping Container Code), 18 digits. The universal pallet/carton license plate.(01)- GTIN (the 14-digit product identifier). Same number system as your UPC, zero-padded.(10)- Batch / lot number, variable length.(17)- Expiration date, YYMMDD.(21)- Serial number, variable length.(310n)- Net weight in kilograms.
A pallet label encoded as GS1-128 might read (01)10614141999993(17)260601(10)LOT-4421(21)000001. One barcode, four pieces of structured data, parsed automatically by the receiving warehouse management system (WMS). That is what the extra complexity buys you.
When you must use GS1-128
If any of these apply, the choice is made for you.
- Walmart, Costco, Kroger, and Home Depot require GS1-128 carton labels, with an SSCC-18 inside an
(00)AI on every advance ship notice (ASN). Target accepts an SSCC-18 in GS1-128, a GTIN-14 in ITF-14, or a UPC-A, depending on the shipment. - Pharmaceutical distribution under the US Drug Supply Chain Security Act (DSCSA) uses GS1 Application Identifiers for unit-of-sale traceability.
- Sysco publishes a GS1-128 labeling spec for foodservice suppliers, and GS1 US publishes a voluntary GS1-128 case and carton guideline for the sector.
- The FDA's Unique Device Identification (UDI) rule for healthcare devices accepts GS1 as an issuing agency.
- Anything that has to move across a GS1-compliant supply chain without a human re-keying it.
Use Code 128 when the label only needs to scan inside a system you control. GS1 compliance is overhead, and you only need it on a barcode that leaves your building.
Mistakes that get labels rejected
Encoding GS1 AIs in a plain Code 128 symbol fails silently. You can type (01)10614141999993 into a Code 128 generator and it will render it, and it will scan. The receiving system won't parse it as structured data, because there's no FNC1. It's a string with parentheses in it, and you find out on a Walmart dock.
Printing the parentheses as part of the barcode data is the next one. Parentheses in AI notation are a human-readable convention and never get encoded in the bars. A correct GS1-128 generator takes (01)10614141999993 as input and encodes 0110614141999993, AI plus value, no brackets. Use a real GS1-128 generator and let it handle the encoding rules.
Inventing your own SSCC gets your ASN rejected. The SSCC is 18 digits in a fixed structure, an extension digit, then a GS1 Company Prefix (which you must own through a GS1 membership), then a serial reference you assign, then a check digit. Made-up numbers produce duplicate SSCCs in the retailer's system, which gets your ASN rejected, which gets you chargebacks.
Variable-length AIs need a separator. Some AIs, like the (10) batch number, are variable length. When a variable-length AI is followed by another AI in the same barcode, you need an FNC1 separator character between them. Skip the separator and the scanner reads everything as one giant batch number. Again, use a generator that enforces the rules.
So which do you print?
Internal ticket, asset tag, a quick scannable label for something on your own shelves? Code 128. Done. Need to print a lot of them? Use the batch generator.
Carton label for a trading partner, an SSCC, anything that encodes a GTIN plus a lot number or expiration? GS1-128. If you're printing pallet license plates at volume, use the GS1-128 batch generator, because typing SSCCs by hand is how duplicates happen.
If a supplier asks you for "a Code 128 barcode" on a shipping carton headed for a big-box retailer, they mean GS1-128 and don't know the name for it. Print GS1-128.