Blog

GS1 Digital Link vs. your part numbers: keeping GTINs sane in Fishbowl

Israel LopezJuly 9, 20264 min read

The 2D barcodes arriving with Sunrise 2027 carry more data than Fishbowl has an obvious place for. One QR code can encode a GTIN, a lot number, an expiry date, and a serial number in a single scan; Fishbowl stores those four things in three different places, under different rules. The work isn’t printing the barcode. It’s deciding where each piece of data lives and which system is right when they disagree.

What’s inside a Sunrise 2027 barcode

GS1 gives you two ways to pack the same data into a 2D symbol.

Element strings are the classic format, the same thing that’s been on GS1-128 case labels for decades, now in a GS1 DataMatrix or QR code. Each field is prefixed by an application identifier (AI):

(01) 00614141123452   GTIN — which product
(10) LOT2407A         batch/lot
(17) 270131           expiry date (YYMMDD)
(21) SN0001947        serial number

GS1 Digital Link encodes the same identifiers as a web URL, so one symbol works at the register and in a consumer’s phone camera:

https://id.example.com/01/00614141123452/10/LOT2407A/21/SN0001947?17=270131

GS1 DataMatrix of the element string QR code of the Digital Link URI

The same four fields both ways: element strings in a GS1 DataMatrix (left), and the Digital Link URI in a QR code (right).

The structure is fixed: the GTIN (AI 01) is the path’s primary key, qualifiers like lot (10) and serial (21) follow in order, and attributes such as expiry (17) ride in the query string. A retailer’s POS scanner extracts the GTIN and rings the sale. Everything else in the symbol is available to whoever wants it. Once your packaging carries lot and expiry in machine-readable form, your receiving dock, your 3PL, and your wholesale customers will all expect to scan it, and expect your data to match.

Three collisions between GS1’s model and Fishbowl’s

GS1’s world revolves around the GTIN. Fishbowl’s revolves around the part number. They are not the same thing.

1. Where does a 14-digit GTIN live?

GTINs in 2D symbols are always 14 digits (a 12-digit UPC-A left-pads with 00). Fishbowl stores the UPC as text on both parts and products, with room past 14 characters and leading zeros preserved, so a GTIN-14 fits in the UPC field directly. No custom-field workaround.

The flip side of a free-text field is that nothing stops garbage from living in it. The thing to distrust is what’s in transit: Excel will happily turn a leading-zero GTIN into a 13-digit number on open, so run one leading-zero GTIN-14 through your import/export path before committing thousands.

2. One part is not one GTIN.

Under GS1 rules, every packaging level gets its own GTIN: the each, the inner pack, the case. Fishbowl’s part/product split turns out to be the answer rather than the problem. A product is a sellable wrapper around a part at a specific UOM, and each product has its own UPC field. One part, an each-product and a case-product, each with its own GTIN.

The collision still bites at scan time: your retail customer scans the each, your warehouse scans the case, and stock Fishbowl workflows won’t resolve a scan to the right packaging level on their own. Our CloudPages platform and beep1 mobile app natively understand multi-UOM scans, resolving a case GTIN to the right part at the right quantity, but that’s a layer you add deliberately.

3. Can a scan populate lot and expiry?

Fishbowl tracks lot, expiry, and serial as tracking fields on inventory transactions. When a scanner reads (01)+(10)+(17) in one pass, can receiving split that into part lookup plus tracking values? Fishbowl has some support for structured scan input, but not enough to populate everything across its workflows, and what each screen tolerates varies. Test your own flows with a real GS1 symbol. In practice the parsing lives outside the ERP: on the scanner (extract-GTIN-only keeps stock workflows working) or in a layer like CloudPages or beep1, which parse the GS1 payload so Fishbowl receives clean data.

Three rules that keep the mapping sane

Pick one system of record for GTIN assignment. It probably isn’t Fishbowl: allocation is a licensing and product-catalog decision. Keep the ledger with your product master and sync into Fishbowl, or you’ll eventually issue a duplicate.

Don’t overload the part number. Part numbers are on every historical transaction and integration mapping you have; GTINs change when packaging changes. Keep identifiers in fields, not naming conventions.

Treat a Digital Link domain as a decade-long commitment. Once https://id.yourbrand.com/01/... is printed on packaging, that hostname has to resolve for the shelf life of everything carrying it. Use a dedicated subdomain, put a resolver or a simple redirect behind it, and document it as infrastructure. If you can’t commit to the domain, use plain element strings in a GS1 DataMatrix and skip Digital Link until you can.

What to do this quarter

Export your parts with UPC values and flag anything that isn’t a clean 12-digit UPC-A: blanks, duplicates, vendor part numbers living in the UPC field. Clean those up now, while there’s no deadline attached.

Related: