Field notes

GS1 Digital Link: How smart QR codes power product passports

8 min readGS1 / QR / Standards
GS1 Digital Link: How smart QR codes power product passports

A QR code on a hang-tag isn't a Digital Product Passport. What turns it into one is the URL the QR points to, and the standard that URL follows. The standard at the centre of every credible DPP implementation is GS1 Digital Link — an ISO-recognised syntax that lets a single QR resolve to both a human-readable passport and a machine-readable record, with no second URL and no API key.

This post is the implementation-level explanation. It covers what makes a Digital Link URL different from an ordinary URL, how serialisation works at the item level, why governments and retailers converged on this standard, and what the resolver looks like end-to-end. Everything in this post is implemented in production at textilepass.app.

Why a regular QR code isn't enough

A "QR code" is just an encoding format — a 2D barcode that holds bytes. What it holds can be anything: a URL, a vCard, a Wi-Fi credential, a short text. There is no inherent product-passport semantics.

A handful of brands have shipped textile QR codes that point to a marketing landing page. That's not a passport. The page is a webpage. There is no defined data structure for an inspector to extract, no defined identifier scheme, no guarantee that the URL still resolves in five years, no way for a national Market Surveillance Authority's scanner to pull structured data without a human visiting the page.

For a Digital Product Passport to work at EU scale across millions of products and hundreds of thousands of brands, the URL behind the QR has to follow a specification: stable identifiers, defined data attributes, machine-readable representations, predictable resolver behaviour. That specification is GS1 Digital Link.

GS1 Digital Link is a URI syntax — first published as a GS1 standard in 2018, since adopted under ISO/IEC — that encodes GS1 Application Identifiers (AIs) directly in a URL path.

The base form is:

https://example.com/{AI}/{value}[/{AI}/{value}]*

The Application Identifiers come from the same registry that has powered the EAN/UPC barcode for decades. The most important ones for textile DPPs:

  • 01 — GTIN (Global Trade Item Number). Identifies a product variant — a specific colour, size, and SKU. 14 digits.
  • 21 — Serial Number. Identifies one individual physical item within a GTIN. Variable length.
  • 10 — Batch / Lot Number. Identifies a production batch.
  • 17 — Expiration Date.
  • 8200 — URL extension for additional content.

The textile DPP working pattern uses AI 01 + optional AI 21:

https://textilepass.app/01/09506000164908/21/A12B34C56D78

This URL is:

  • A valid URL. A consumer phone scanner opens it like any other web link.
  • A structured identifier. Each path segment carries machine-readable meaning — the 01 says "the next value is a GTIN," the 21 says "the next value is a serial number."
  • Resolvable. Any compliant GS1 Digital Link resolver can parse it and return data.

Content negotiation — the same URL, two representations

The innovation that makes Digital Link useful for DPPs is content negotiation. The same URL can return different representations depending on what the client asks for.

When a consumer's phone opens the link, the browser sends an Accept header like text/html,application/xhtml+xml,… and the server returns the HTML passport — a styled page with composition, certifications, carbon footprint, supply chain, brand story.

When a regulator's headless scanner or a national MSA's compliance tool fetches the same URL with Accept: application/ld+json, the server returns the same data as a JSON-LD document — structured, machine-readable, schema-typed.

GET /01/09506000164908/21/A12B34C56D78 HTTP/1.1
Host: textilepass.app
Accept: application/ld+json
{
  "@context": "https://gs1.org/voc/",
  "@type": "Product",
  "gtin": "09506000164908",
  "serial": "A12B34C56D78",
  "brand": "Sample Brand",
  "productName": "Charcoal Hoodie",
  "composition": [
    { "fibre": "Organic Cotton", "percent": 80 },
    { "fibre": "Recycled Polyester", "percent": 20 }
  ],
  "certifications": ["GOTS", "GRS"],
  "carbonFootprint": { "value": 8.2, "unit": "kgCO2e", "scope": "cradle-to-gate" },
  "supplyChainTiers": "/01/09506000164908/21/A12B34C56D78/supply-chain"
}

One URL. Two clients. No API key. No developer onboarding. This is what makes Digital Link a regulator-friendly standard — surveillance authorities do not need to integrate with every brand's bespoke API.

Why governments and retailers prefer GS1

The EU did not pick GS1 by accident. The decision was influenced by four properties of the GS1 system:

Existing identifier infrastructure

Every retailer that sells physical goods in Europe is already issuing GTINs. The GS1 registry is the largest product identifier system in the world — hundreds of millions of GTINs are in active commercial use. Mandating a new identifier system from scratch would have created a parallel database that the supply chain would have to maintain alongside its existing one. Mandating GTINs reuses infrastructure.

Industry-neutral governance

GS1 is a not-for-profit standards body with member organisations in 116 countries. Unlike a single-vendor standard or a regional standard, GS1 cannot be captured by one government or one industry. The Commission's preferred standards strategy is to lean on existing neutral standards where they exist.

Multi-industry generalisability

Digital Link is being adopted by the medical-device sector (UDI), the food sector (origin and recall), the chemical sector (REACH), and the automotive sector. A single resolver pattern that works across product categories means the EU's eventual cross-cutting registry can use the same plumbing.

Forward compatibility

The AI registry has been extended consistently since the 1970s. New attributes can be added without breaking existing URLs. A textile DPP that uses Digital Link in 2027 will not need to reprint its QR codes when new fields are added in 2032.

Per-variant vs per-serial

The Digital Link standard supports both variant-level and item-level identification through the AI 01 / AI 21 pair.

A variant-level URL (AI 01 only) — https://textilepass.app/01/09506000164908 — resolves to a passport that is true for every physical item of that SKU. The passport carries composition, certifications, supply chain, footprint. This works for SKUs where every produced item is interchangeable — typical for textile finished goods.

A serial-level URL (AI 01 + AI 21) — https://textilepass.app/01/09506000164908/21/A12B34C56D78 — resolves to a passport that is unique to one physical item. This adds batch-level data: which production run produced this item, which dye lot was used, which mill receipt covers the yarn.

Textile brands generally start variant-level. The labelling cost difference (printing a unique serial on each tag) is non-trivial; the granularity benefit is only material if the brand is doing batch-level tracking already. For most use cases, variant-level satisfies the regulatory requirement.

The standard supports both, and the resolver can answer both. Brands can start at variant-level and migrate to serial-level without changing the URI syntax or the resolver — the AI 21 segment is appended.

What a resolver looks like

A GS1 Digital Link resolver is a web service that:

  1. Accepts a Digital Link URL.
  2. Parses out the AI segments.
  3. Looks up the underlying record.
  4. Returns the appropriate representation based on the Accept header.

In Next.js terms, the resolver is a route handler — at src/app/01/[gtin]/route.ts for variant-level and src/app/01/[gtin]/21/[serial]/route.ts for serial-level. Each handler:

  • Validates the GTIN against the GS1 check-digit algorithm.
  • Looks up the product (and the serial, when present) in the database.
  • Negotiates the response: HTML for browsers, JSON-LD for scanners.
  • Returns a structured 404 with Cache-Control: public, max-age=300 for unknown GTINs (so a viral bad QR code doesn't hammer the database).

The TextilePass production resolver does exactly this. The implementation runs on the Next.js App Router with content negotiation in middleware (the proxy.ts file in the Next.js 16 conventions). The 404 path returns a structured "GTIN not registered" JSON-LD with a support contact, so a scanner that finds an unknown code gets a useful response.

Why brands should care about the URI syntax now

Brands that print QR codes today pointing to ad-hoc URLs (brand.com/products/12345) will reprint their labels twice during the ESPR transition: once when the delegated act lands and they realise their URL scheme is non-compliant, and again when their resolver pattern doesn't match the EU's expected one.

Brands that adopt GS1 Digital Link URIs today will print their labels once. The same /01/{GTIN} URL that works on a hang-tag in 2026 will work in 2030. The resolver behind it can grow — more attributes, more languages, more tiers — without changing the carrier.

The cost of switching to Digital Link is one configuration change: where the QR generator writes the URL, replace the bespoke path with the GS1 path. The benefit compounds across every printed label for the next decade.

What TextilePass implements

TextilePass ships a production GS1 Digital Link resolver:

  • Variant-level at /01/{GTIN} — returns the per-variant passport.
  • Serial-level at /01/{GTIN}/21/{serial} — returns the per-item passport with batch granularity when the brand serialises.
  • Content negotiation — same URL, HTML for humans, JSON-LD for scanners.
  • Structured 404 — for unknown GTINs, returns a typed JSON-LD response with a support contact and 5-minute cache.
  • QR generation — every published variant gets a QR code encoded against the Digital Link URI, downloadable as PNG.

The simplest way to see it is to scan the demo. The live demo passport is hosted at a real GS1 Digital Link URL — the QR is real, the JSON-LD is real, the resolver is the same one a paid customer's printed labels would point at.

For a deeper read on the regulation behind why this matters, see the DPP guide or the ESPR compliance read. For why buyers ask for this exact format, see what EU retailers are asking textile suppliers for.

Try TextilePass

See a live Digital Product Passport.

A real GS1 Digital Link URL, a real JSON-LD resolver, a real Tier 0–4 chain. No signup needed.