I've worked with five different barcode symbologies across three different warehouse management systems. Each serves a specific purpose, and using the wrong one creates real problems — scanners that can't read your labels, inventory that won't check in, and packages that get routed to the wrong dock. Here's a practical breakdown based on actual warehouse and retail experience.
UPC-A (Universal Product Code, 12 digits) is the standard for retail products sold in the US and Canada. Every product on a Walmart or Target shelf has a UPC-A. The encoding is numeric-only, 12 digits with a check digit. A UPC barcode encodes exactly 12 digits — no letters, no symbols. The encoding uses fixed patterns (L-code for left half, R-code for right half) that scanners have been reliably reading since the 1970s.
EAN-13 (European Article Number, 13 digits) is the international equivalent. Same encoding logic — it's essentially a UPC-A with an extra digit for the country code. Most modern scanners read both interchangeably. The key difference on the barcode itself: the human-readable text under an EAN-13 has a digit to the left of the guard bars, while UPC-A doesn't.
I've seen a surprising number of small sellers confuse these. If you're selling in US retail stores, you need UPC-A. If you're selling on European marketplaces, you need EAN-13. If you have both markets, buy a GS1 prefix that works for both — most GS1 US prefixes can be used to create UPC-As, and those same numbers (with a leading zero) become valid EAN-13s.
Code 128 is the workhorse of every warehouse I've worked in. It's a high-density alphanumeric barcode — it can encode all 128 ASCII characters in a compact format. Every modern shipping label (UPS, FedEx, USPS) uses Code 128. Amazon's internal tracking barcodes are Code 128. The format is incredibly efficient for numeric data because it has a "Code C" mode that packs two digits into one character — a 20-digit tracking number takes up less physical space in Code 128 than a 12-digit UPC.
Code 39 is the older, simpler cousin. It only encodes 43 characters (A-Z, 0-9, and a few symbols), and it takes more physical label space than Code 128 — a barcode that's 4 inches long in Code 128 might be 6 inches in Code 39 with the same font size. That said, Code 39 is still used in military logistics and automotive manufacturing because it's extremely tolerant of poor print quality. The US Department of Defense standard MIL-STD-1189 specifies Code 39. If you're a defense contractor, you don't get to choose which barcode you use — the contract requirement chooses for you.
ITF-14 (Interleaved 2 of 5, 14 digits) is specifically designed for corrugated shipping boxes. The thick black bars are readable even when printed directly on brown cardboard with a low-quality printer. If you've ever received a case of product from a distributor with a barcode printed on the outside of the box (not on a label), that's an ITF-14. The encoding is numeric-only, and the barcode includes the product's GTIN-14 identifier plus packaging level information.
| Type | Digits | Data | Primary Use | Space Efficiency |
|---|---|---|---|---|
| UPC-A | 12 | Numeric | Retail (US/CA) | Medium |
| EAN-13 | 13 | Numeric | Retail (Global) | Medium |
| Code 128 | Any | Alphanumeric | Logistics/Shipping | High |
| Code 39 | Any | A-Z,0-9 | Military/Industrial | Low |
| ITF-14 | 14 | Numeric | Case/Box labels | Medium |
If you're selling a product at retail, the answer is determined by your market: UPC-A for US/Canada, EAN-13 for everywhere else. If you're printing labels for internal warehouse use or shipping, use Code 128 — it's the most space-efficient and universally readable. If your customer requirement specifies Code 39 or ITF-14, use that.
You can generate Code 128, UPC-A, and EAN-13 barcodes on GenBarcode. Type any data — the tool auto-detects UPC (12 digits) and EAN (13 digits) and defaults to Code 128 for everything else.