Standards/upc-a
UPC-A
Overview
UPC-A (Universal Product Code, type A) is the 12-digit 1D retail product barcode used in the United States and Canada [1, 2]. It was invented by George Laurer at IBM in 1973 [3] and first scanned commercially on 26 June 1974 at a Marsh Supermarket in Troy, Ohio — a pack of Wrigley's chewing gum [4, 5] — an event widely considered the foundational moment of the global retail-scanning era. UPC-A is governed by GS1 US and standardised internationally as part of ISO/IEC 15420 alongside its 13-digit international counterpart ean-13 [6].
UPC-A is functionally the 12-digit predecessor that EAN-13 extended: every UPC-A is exactly an EAN-13 with an implicit leading 0, and modern POS scanners handle both transparently as the same underlying GS1 GTIN.
History
1948 — Bullseye prototype: Norman Joseph Woodland and Bernard Silver patented a circular bullseye-pattern barcode after observing that Morse code's dots and dashes could be visualised as bars [3, 5]. The bullseye design didn't reach commercial use because printers of the era couldn't accurately reproduce the circular pattern at scale.
1971 — Uniform Grocery Product Code Council formed: US grocery industry leaders formed the council to standardise a barcode for retail use, addressing the operational need to speed up supermarket checkout [5].
1973 — George Laurer's IBM design selected [3, 4, 5]: IBM engineer George Laurer redesigned the barcode as a rectangle with vertical stripes rather than the bullseye — fundamentally because vertical bars print accurately with the printing technology of the early 1970s, while bullseye patterns smudged. The Uniform Grocery Product Code Council selected Laurer's design from a last-minute submission round in 1973. The result: Universal Product Code (UPC-A) with 12 digits.
26 June 1974, 8:01 a.m. — First commercial scan [4, 5]: Clyde Dawson, head of research and development for Marsh Supermarkets, ceremonially scanned a pack of Wrigley's chewing gum at a Marsh Supermarket in Troy, Ohio. The scanner was made by Photographic Sciences Corporation. The Wrigley's pack is now in the Smithsonian Institution as the first commercially scanned UPC product. The barcode's pricing-and-inventory automation rapidly spread across US supermarkets in the late 1970s.
1976 — EAN-13 extension [ean-13-ref]: The 12-digit UPC was extended to 13 digits to allow international identification beyond the US numbering space — leading to the EAN-13 standard developed by the European Article Numbering Association in 1977.
1990 — UCC-EAN global cooperation [1]: The Uniform Code Council (US UPC governance) and EAN International (European EAN-13 governance) signed a global cooperation agreement to coordinate standards.
2005 — GS1 unified rebrand [1]: UCC and EAN International merged into GS1 (Global Standards 1). UPC-A and EAN-13 continue as parallel symbology variants under unified GS1 governance.
George Laurer's recognition [3]: Laurer was inducted into the Engineering Innovation Hall of Fame. He died in 2019 at age 94; his obituary called him "the father of the modern barcode."
Technical specification
UPC-A is a fixed-length 12-digit 1D linear barcode [1, 6, 7]:
| Parameter | Value |
|---|---|
| Symbology family | 1D linear |
| Length | Fixed 12 digits (no variable length) |
| Character set | Digits 0–9 only |
| Module ("bar") encoding | 7 modules per digit |
| Bars per digit | 2 bars + 2 spaces |
| Total width (at 100 % nominal) | 95 modules (37.29 mm) |
| Total height (at 100 % nominal) | 25.93 mm |
| Quiet zone | 9 × module width on each side |
| Check digit | Last digit (modulo-10 weighted by 3, 1, 3, 1, …) |
| Magnification factor | 80 % – 200 % of nominal |
| Position(s) | Meaning |
|---|---|
| 1 | Number System Character (NSC) — identifies the product category. 0, 1, 6, 7, 8, 9 = standard UPC; 2 = variable-weight items (meat, produce); 3 = pharmaceutical / drug; 4 = in-store / non-food coupons; 5 = manufacturer coupon |
| 2–6 | Manufacturer / company prefix (assigned by GS1 US to the brand owner) |
| 7–11 | Product reference number (assigned by the manufacturer within their prefix) |
| 12 | Check digit (modulo-10) |
UPC-A ↔ EAN-13 equivalence [1, ean-13-ref]: A 12-digit UPC-A is exactly equivalent to a 13-digit EAN-13 with leading 0. UPC-A 036000291452 = EAN-13 0036000291452. POS scanners treat them as the same code; inventory systems store either as the 14-digit GTIN-14 (GTIN-14 = 00036000291452 with two leading zeros for UPC-A, or 00036000291452 etc.).
Variants [1]:
- UPC-A — standard 12-digit (this report).
- UPC-E — short 8-digit variant for small packages, with leading number system always
0; the missing digits are reconstructed from a compression / expansion rule. - UPC-A with add-on — UPC-A + 2-digit or 5-digit supplemental for periodicals or books (legacy; mostly superseded by EAN-13 + add-on).
Use cases
UPC-A's use case is US/Canadian retail point-of-sale product scanning, near-universal across consumer-packaged goods [1, 6]:
- Supermarkets and grocery retail — every food / beverage / household product sold in US supermarkets carries a UPC-A. The foundational use case since 1974.
- Big-box retail (Walmart, Target, Costco, etc.) — universal UPC-A scanning at checkout.
- Drugstores and pharmacy retail — OTC pharmaceuticals, personal care, beauty (alongside data-matrix for prescription drugs).
- Convenience stores — packaged snacks, beverages, tobacco.
- Electronics retail (Best Buy, etc.) — consumer-electronics packaging.
- Apparel and department stores — softgoods tagging.
- Books — older books used UPC-A with ISBN-derived numbering; modern books use ean-13 with
978/979prefix. - Coupons — UPC-A with NSC
5(manufacturer coupon) is the standard coupon barcode in the US. - Variable-weight items — UPC-A with NSC
2for meat, produce, deli where the price varies by weight (the in-store scale prints a UPC-A with embedded weight/price data). - Online retail — Amazon, eBay, etc. use UPC-A as a primary product-matching identifier alongside ean-13.
Why UPC-A dominates the US/Canadian retail context [1, 6]:
- Universal scanner support — every US POS scanner reads UPC-A.
- 50+ years of installed-base supply-chain integration.
- GS1 US numbering hierarchy uniquely identifies any retail product.
- Public domain — no per-scan royalties.
- Backward-compatible with ean-13 — globalised supply chains work seamlessly.
Implementations
UPC-A shares the universal library and scanner support of ean-13 — every commercial scanner reads UPC-A, every barcode library generates it [8]:
- Java + many ports — zxing/zxing — 34 000★, active 2025. Decodes UPC-A alongside EAN-13, Code 128, QR, etc.
- C / C++ —
libzint(generator);zbar(decoder). - Python —
python-barcode,treepoem,pyzbar. - PHP —
picqer/php-barcode-generator. - JavaScript —
JsBarcode,bwip-js. - C# / .NET —
ZXing.Net,Aspose.BarCode,Dynamsoft Barcode Reader(commercial). - OS-level mobile — iOS AVFoundation, Android CameraX / ML Kit all decode UPC-A natively (and most expose it under a unified "EAN/UPC" symbology type).
- POS scanners — every commercial 1D and 2D POS scanner reads UPC-A (NCR, Datalogic, Honeywell, Symbol/Zebra, Cognex, Diebold).
- Mobile SDKs — Scanbot, Scandit, Anyline, Dynamsoft.
Reference documentation [6, 1]:
- GS1 US Get-Started Guide — for US brands acquiring UPC-A numbering.
- ISO/IEC 15420:2009 — formal symbology specification.
Comparison
vs. ean-13 — Structurally identical; UPC-A is 12 digits, EAN-13 is 13. EAN-13 with leading 0 is UPC-A. Geographically: UPC-A is US/Canadian-domestic-retail-oriented; EAN-13 is the international rest-of-world standard. In practice, modern global retail treats them as equivalent — Amazon's product database stores both as the same GTIN [ean-13-ref].
vs. UPC-E — Short 8-digit variant of UPC-A for small packages; expandable to a corresponding UPC-A via a compression rule. UPC-E is increasingly rare; small packages now often use gs1-databar which is more flexible.
vs. code-128 / GS1-128 — Different supply-chain level. UPC-A is the item-level retail SKU; Code 128 / GS1-128 is the shipping carton + pallet level identification. Both GS1-governed; complementary [code-128-ref].
vs. data-matrix (GS1 DataMatrix) — GS1 DataMatrix encodes the same GTIN as UPC-A but in 2D. US pharmaceutical packaging under DSCSA (Drug Supply Chain Security Act) is gradually requiring GS1 DataMatrix on prescription drug packaging — UPC-A continues as the consumer-readable identifier alongside [data-matrix-ref].
vs. qr-code and payment QRs — Completely different domain. UPC-A is for product identification at retail POS; QR codes are for various consumer-facing scanning (payment, marketing, app downloads). Often coexist on consumer packaging.
Fun facts
On 26 June 1974 at 8:01 a.m. Eastern Time, Clyde Dawson scanned a pack of Wrigley's Juicy Fruit gum at a Marsh Supermarket in Troy, Ohio — the first commercial UPC-A scan in history [4, 5]. The Wrigley's gum pack is now part of the Smithsonian Institution collection as an artefact of the digital-commerce era's origin. The scanner that read it was made by Photographic Sciences Corporation. Every annual "barcode anniversary" media coverage refers back to this moment.
George Laurer's design beat the bullseye-pattern alternative because the rectangle could be printed accurately by 1970s commercial printing [3, 5]. The bullseye prototype (Norman Joseph Woodland and Bernard Silver, 1948 patent) had been the original concept for almost 25 years before retail-grade printing technology could reliably produce it. Laurer's reframing of the barcode as a vertical-stripe rectangle was the engineering breakthrough that made commercial-scale deployment economically possible. The technology constraint that defined modern barcoding was 1970s printing precision, not optical scanning.
The UPC-A symbol can be split into two halves and read separately [1, 7] — the left 6 digits and right 6 digits each have their own start / centre / stop patterns. This is structural to enable omnidirectional scanning (scanner reads it correctly even at 90° rotation when scanned by a slot scanner — by reading each half independently). A consequence: every UPC-A bar pattern is rotationally symmetric in a specific way that supermarket conveyor-belt scanners exploit.
The "first digit" Number System Character (NSC) encoding is one of the underappreciated organisational features of UPC-A [7]:
| NSC | Category |
|---|---|
| 0, 1, 6, 7, 8, 9 | Standard UPC-A (most retail products) |
| 2 | Variable-weight (in-store-scaled deli, meat, produce) |
| 3 | Pharmaceutical / drugstore |
| 4 | In-store / non-food coupons |
| 5 | Manufacturer coupons |
This 6-categories-from-one-digit organisation predates database-driven product taxonomies by decades and is still used in US retail backend systems today.
Status
Active, foundational, universal in North American retail [1, 6]:
- ISO/IEC 15420:2009 is the current spec
- GS1 US continues to assign and govern UPC-A numbering
- Universal POS scanner support — every commercial US/Canadian POS reads UPC-A natively
- Functionally interchangeable with ean-13 for global commerce
- Public domain — no licensing fees
Strategic context:
- GS1 SunRise 2027 initiative — multi-year roadmap to migrate primary retail item-level identification from EAN-13 / UPC-A to 2D codes (GS1 DataMatrix or QR) by 2027 in some product categories. UPC-A's role in this transition is to remain as the consumer-readable identifier while regulated categories (pharma, healthcare) migrate to 2D for serialisation.
- US DSCSA (Drug Supply Chain Security Act) phased rollout requires GS1 DataMatrix on prescription pharmaceutical packaging by 2027; UPC-A continues as the retail-scan identifier on OTC drugs and non-prescription products.
- Coexistence with 2D successors is the structural pattern; complete UPC-A retirement is not on the planning horizon.
No deprecation. UPC-A is 50+ years old and is still adding new packaging applications every year; the global retail supply chain's installed base is too large to migrate wholesale, and the consumer-recognisable rectangle of black bars is part of consumer-product-design culture.
Sources
- Universal Product Code — Wikipedia
- Barcode — Wikipedia
- The UPC — IBM History
- Pack of gum first item scanned 26 June 1974 — HISTORY
- How the Barcode Was Invented — HISTORY (IBM/Laurer)
- UPCs and Barcodes Get-Started Guide — GS1 US
- UPC scanned for first time 26 June 1974 — EDN
- zxing/zxing — GitHub
- ISO/IEC 15420:2009
Deployments
No country reports mention this standard by name.
Regions / aggregations not mapped to a single country
- Universal