One thesis: a symbology is a transport encoding, not an identifier — and every persistent bug in a barcode program traces back to treating the two as one thing. The bars are a pipe. The identifier is the payload. They come from different registries, they version independently, and your system needs to model them as two columns, not one.
If you own the platform layer of a supply-chain stack, you have inherited a schema somewhere with a column called barcode. That column is the error. What was scanned — Code 128? QR? — and what it carried — a GTIN? a full AI map? — are orthogonal facts, and collapsing them means your data model cannot say what it knows.
Two registries, no overlap
Symbologies are ISO/IEC standards about optics and error correction: Code 128 is ISO/IEC 15417, QR Code is 18004, DataMatrix is 16022, PDF417 is 15438. They define how modules and bars encode bytes. They say nothing about what the bytes mean.
Identifier schemes are someone else's law entirely: GTIN grammar belongs to the GS1 General Specifications; the VIN belongs to US federal regulation (49 CFR 565). A GTIN can ride in a UPC-A symbol, a GS1-128, an ITF-14, a DataMatrix, or a QR code — one identity, five pipes. A VIN rides in Code 39 on a door jamb and in a QR on a dealer hang-tag — one identity, two pipes.
What each common 1D pipe actually carries:
| Symbology | Carries | Where you meet it |
|---|---|---|
| UPC-A / EAN-13 | one GTIN-12 / GTIN-13, nothing else | retail POS |
| ITF-14 | one GTIN-14 (case grade, printable on corrugate) | case marking |
| GS1-128 | AI element strings — GTIN, lot, expiry, SSCC, dates | logistics labels |
| QR / GS1 DataMatrix | a full AI payload, element-string or Digital Link URI form | 2D marks, pharma, Sunrise-era retail |
The 1D retail symbols are single-value pipes: twelve or thirteen digits, no fields, no structure beyond the check digit. What 2D adds is capacity — room for lot, expiry, serial alongside the GTIN. And capacity is not obligation: a 2D symbol carrying only a GTIN is legal and common. Which AIs travel is the GTIN owner's encoding decision, never the symbology's.
The proof, worked by hand
The check digit is the one piece of structure a retail symbol does carry, and it is public: GS1 General Specifications §7.9, served openly at ref.gs1.org. Take the UPC-A 036000291452. Weight the first eleven digits alternately 3 and 1, left to right:
0·3 + 3·1 + 6·3 + 0·1 + 0·3 + 0·1 + 2·3 + 9·1 + 1·3 + 4·1 + 5·3
= 0 + 3 + 18 + 0 + 0 + 0 + 6 + 9 + 3 + 4 + 15
= 58
Check digit = (10 − 58 mod 10) mod 10 = 2. The twelfth digit is 2. It validates — with a pencil, no vendor required.
Now run the same identity through three pipes with barcoding resolve. The digits off a UPC-A, the fourteen digits off an ITF-14 case mark, and a QR payload carrying an AI element string:
$ barcoding resolve 036000291452 --json
{ "scheme": "gs1.gtin", "carrier": "upc-a",
"canonical": "00036000291452", "check": "mod10 pass" }
$ barcoding resolve 00036000291452 --json
{ "scheme": "gs1.gtin", "carrier": "itf-14",
"canonical": "00036000291452", "check": "mod10 pass" }
$ barcoding resolve '(01)00036000291452(10)L23085(17)270901' --json
{ "scheme": "gs1.element-string", "carrier": "2d",
"canonical": "00036000291452", "check": "mod10 pass",
"ai": { "10": "L23085", "17": "2027-09-01" } }
Three carriers, one canonical identity. The 2D run returns the same GTIN plus the lot and expiry the 1D pipes had no room for. That is the entire 1D-to-2D transition in one transcript: the payload grows; the identity does not change.
Why the conflation costs real money
Every one of these production failures is the pipe/payload confusion wearing a different coat:
- A WMS that stores "the barcode" cannot tell an ITF-14 case scan from a UPC-A each scan — so case quantities post as eaches, and the count is wrong by a factor of twelve.
- A parser written for "QR codes" that chokes on a GS1 DataMatrix, though the payload grammar inside both is identical FNC1 element-string syntax.
- A team that hears the 2D transition as "reprint the barcodes" and misses that the actual decision is which AIs to encode — a data-model decision wearing a label-artwork costume.
- Test fixtures that validate digits but never framing, so the first scanner that prepends an AIM symbology identifier breaks ingestion in the field.
The fix is structural and small: model carrier and identity as separate facts, normalize every scan to a canonical identity plus an AI map at the door, and keep the carrier as metadata. That is what resolve does, and it is pure and local — no network, no account, no key. The registry behind it is pinned data, one file per scheme, digests printable with barcoding pins: the GTIN grammar and the AI table are dependencies with provenance, not folklore in a constants file.
Where this goes next
The reason this distinction stops being pedantry in 2026 is dated: GS1's Sunrise 2027 programme expects retail point-of-sale to scan and process 2D symbols by the end of December 2027 — which makes the payload question (element string or Digital Link URI? which AIs?) a live decision at every GTIN owner and every lane. What that programme actually requires, and the six things vendor copy keeps claiming it requires that it does not, is the next post in the arc.
Run resolve on whatever is on your desk. The pipe tells you how it arrived. The payload tells you what it is. Keeping those apart is the first correct decision a barcode program makes.
Keys open the network half of the verb set. Get an API key — say what arrives at your door, and the provisioning order follows the list.
We answer in writing. We take at most five conversations a month, only when you ask for one, and only after you already have the written read.