Build a valid GS1 element string, render it in the symbology a real supply chain would use, and download a test label — together with the exact result a conformant scanner should report back.
Check digits are calculated for you on GTIN, SSCC and GLN. Dates are YYMMDD,
where day 00 means "the last day of that month" — the way GS1 encodes a
month-precision expiry.
Generating…
Full label renders a package label — product details, the symbol and the human readable interpretation — which is what a camera sees in the field. Symbol only exports the bare symbol with a quiet zone, for a decoder test or a laser scanner.
Element string (raw decoder output)
Human readable interpretation
Application identifiers
| AI | Data element | Value the scanner reads | Check digit |
|---|
GS1 Digital Link
This is the test oracle: scan the downloaded PNG with a GS1 reader and compare. A mismatch tells you which side is wrong — the symbol or the parser. An | in the element string marks a position where an FNC1 byte (0x1D) has to appear, which is only where a variable-length element needs terminating.
| Symbology | Kind | What it can carry |
|---|
Only one of these carries the GTIN without an application identifier: the DataBar
family and ITF-14 encode a bare GTIN-14. A decoder has to infer AI 01 from
the symbology, which is why a GS1 parser that ignores the format gets those symbols
wrong.
This page builds a well-formed GS1 element string and encodes it. Everything about the payload — the AI table, the length rules, the mod-10 check digits, the FNC1 placement — is implemented locally, and the symbologies come from bwip-js (the JavaScript port of BWIPP), loaded from a CDN. Nothing is uploaded and no SDK licence is involved.
The GS1 AI table is the part that decides whether a scan is read correctly, and it is
prefix-free by design: no two-digit AI is the beginning of a three- or
four-digit one. That single property is what makes a length-driven parser possible —
fixed-length data is consumed by length, variable-length data runs to the next FNC1 —
and it is why a generic barcode reader that only returns raw text cannot tell
010950600013435217270430 from a serial number starting
17270430.
A generated image is a fair test of a reader's decoding and of its AI parsing. It is not a test of authenticity: the payload is plaintext, so a parseable symbol proves only that it is well formed. Digitally signed carriers — an mDL, or the encrypted PDF417 on a South African driving licence — are the formats where a successful read says something about origin, and those cannot be generated from a web page at all.
Two limits worth knowing. GS1 Composite (a DataBar linear part plus a 2D part) is not offered — bwip-js has no composite encoder, and a composite is anyway two symbols that a reader must associate. And DataBar Limited, ITF-14 and EAN-13 encode the GTIN and nothing else; if the payload needs a batch or a date, the page says so instead of silently dropping it.