Free GS1 barcode generator

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.

Sample data only. Every value here is synthetic and the preview is stamped SAMPLE. A GS1 barcode is not a secret and not an authority — anyone with a phone can read what you encode, and a well-formed payload proves nothing about the goods it is attached to. Use it to test a scanner, not as a label for real stock.

Scenario

Data elements

Add an element:

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.

Preview

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.

What a scanner should report

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.

Symbologies

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.

Scope and notes

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.