Symbology chooser
Code 128 vs UPC vs EAN vs FNSKU: which barcode should you print?
A barcode is not a decoration. Retail checkout, Amazon inbound, and a warehouse bin location each expect a different symbology. Printing the wrong one is how cartons sit in “unfulfillable” or a register beeps no-match. This chooser is the one we wish we had printed above the pack bench.
LabelStack editors · August 28, 2026 · 16 min read
Retail shelf: UPC-A in North America, EAN-13 everywhere else
If a product will be scanned at a grocery or big-box register, you need a GS1 GTIN you licensed—not a number you invented in a spreadsheet. In the US and Canada that is usually a 12-digit UPC-A. In most other markets it is a 13-digit EAN-13. ISBN-13 for books is an EAN-13 with prefix 978 or 979. EAN-8 exists for very small packages. UPC-E is a compressed UPC-A for tiny packages; the check digit still has to match the expanded form.
LabelStack will encode the digits you type and will flag a wrong check digit before you print a sheet. It will not sell you a company prefix. If a marketplace asked for “your UPC,” they mean a licensed GTIN, not a Code 128 of your internal SKU. A 12-digit string with a valid modulo-10 check digit is not “your UPC.” It is a mathematically well-formed number that may already belong to someone else. See the companion guide on why not to invent UPC numbers.
Some software shows a UPC-A with a leading zero as EAN-13. The bars are not the same pattern. If you have 12 digits, encode UPC-A. If you have 13, encode EAN-13. Do not pad or strip digits to make a generator happy.
Amazon inbound: FNSKU is Code 128, not a UPC
FNSKU (Fulfillment Network SKU) identifies a specific seller, ASIN, and condition inside Amazon’s warehouses. It typically starts with X and is printed as Code 128. Amazon’s inbound scanners are looking for that Code 128, not for the manufacturer UPC that may still be on the retail box. Mixing them is a common source of stranded inventory: the unit is received against the wrong catalog ID.
If Seller Central already generated shipment labels, use those when Amazon requires them. Use LabelStack when you need extra copies, mixed-SKU 30-up sheets, or reprints after a jam—from your own CSV, without uploading that CSV to a random website. LabelStack’s FNSKU mode is Code 128 plus an X-prefix format check so a UPC accidentally pasted into the FNSKU column is flagged before you print.
Internal SKU, bins, and cartons: Code 128, Code 39, ITF-14
Code 128 is the workhorse for anything you control: SKU-2040, BIN-A, LOT-2026-08. It encodes letters, digits, and a compact control set. Code 39 is older, wider, and still required by some Department of Defense and industrial scanners; it is a poor fit for a 1″ 5160 label if the value is long. ITF-14 is a 14-digit carton code (GTIN-14) used on outer cases. It needs a bearer bar in some specs; LabelStack encodes the 14 digits with the GS1 check digit test so a mistyped case code does not ship.
Do not print ITF-14 on a unit-level sticker. Do not print a UPC on a warehouse tote unless that tote really is a sellable GTIN. The scanner at receiving is not “smart”—it will store whatever symbology you trained it to expect. If your WMS was trained on Code 128 bin tags, a Code 39 of the same letters is a different pattern of bars. Pick one house standard and keep it.
Code 128 subsets, and why you usually should not care
Code 128 has three code sets. Set A includes uppercase and control characters. Set B includes upper and lower case. Set C encodes digit pairs compactly. A competent encoder (LabelStack uses one in the browser) switches sets inside a symbol to keep the bars short. You do not pick A/B/C in the UI because picking wrong makes a wider label for no gain.
GS1-128 is Code 128 with an FNC1 in the first position and application identifiers in parentheses in the human-readable line. LabelStack’s Code 128 mode is the warehouse-SKU form, not a GS1-128 logistics label generator. If you need AI (01) GTINs in the GS1-128 sense, that is a different job than printing FNSKUs on 5160. Do not put parentheses into a Code 128 SKU just because a blog showed them.
A practical chooser
Selling a unit at US retail: UPC-A with a licensed number. Selling a unit at EU/UK retail: EAN-13. Book: EAN-13 (ISBN). Amazon FBA unit: FNSKU as Code 128, often overlaying the manufacturer code as Amazon instructs. Warehouse SKU or bin: Code 128. Outer case of a GTIN: ITF-14. Tiny cosmetics compact: EAN-8 or UPC-E only if you actually own that GTIN. Internal lot or serial that will never see a cash register: Code 128, always.
In LabelStack bulk CSV, put the symbology in its own column (code128, ean13, upca, fnsku, and the rest). A mixed sheet is normal: a confectionery EAN-13, a bin tag as Code 128, an FBA unit as FNSKU. The validator runs per row so one bad UPC does not poison the PDF. If a row is red, fix the cell; do not export “include invalid.”