---
title: "DPP QR Codes: Sizing, Error Correction & GS1 (a developer's guide) — qr3.app Blog"
description: "The QR code on a Digital Product Passport is not just any QR — it carries a GS1 Digital Link, has to survive printing on a product, and must resolve to the passport. The engineering details most guides skip, with print-ready generation code."
canonical: "https://qr3.app/en/blog/dpp-qr-code-guide/"
lang: "en"
robots: "index,follow,max-image-preview:large,max-snippet:-1"
---

# DPP QR Codes: Sizing, Error Correction & GS1 (a developer's guide) — qr3.app Blog

> The QR code on a Digital Product Passport is not just any QR — it carries a GS1 Digital Link, has to survive printing on a product, and must resolve to the passport. The engineering details most guides skip, with print-ready generation code.

Canonical: <https://qr3.app/en/blog/dpp-qr-code-guide/>

[← Blog](/en/blog/) [Tutorials](/en/blog/category/tutorials/)

May 30, 2026 4 min read [Tutorials](/en/blog/category/tutorials/) [dpp](/en/blog/tag/dpp/)[qr-code](/en/blog/tag/qr-code/)[gs1-digital-link](/en/blog/tag/gs1-digital-link/)[error-correction](/en/blog/tag/error-correction/)[labeling](/en/blog/tag/labeling/)

# DPP QR Codes: Sizing, Error Correction & GS1 (a developer's guide)

The QR code on a Digital Product Passport is not just any QR — it carries a GS1 Digital Link, has to survive printing on a product, and must resolve to the passport. The engineering details most guides skip, with print-ready generation code.

by **QR3 Redaktion**

![DPP QR Codes: Sizing, Error Correction & GS1 (a developer](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/dpp-qr-code-guide/hero.png)

The QR code on a Digital Product Passport looks like any other black-and-white square. It is not. It has to carry a **GS1 Digital Link**, survive being printed small on a curved, scuffable product, and reliably resolve to the passport for the product's whole life. Here is what actually matters when you generate one — the parts most "DPP QR code" articles skip.

## It is a GS1 Digital Link, not a plain URL

A DPP QR encodes a structured GS1 URL, not `example.com/product/123`:

```
https://id.gs1.org/01/09520000000011/21/DEMO-BAT-01
```

`01` is the GTIN, `21` the serial. Any camera opens it; a resolver returns the right representation per caller (see *The GS1 Digital Link Resolver, Explained*). Point the QR at your resolver and the GTIN/serial stay stable forever.

## Error correction level: pick Q or H for products

QR codes have four error-correction levels — the higher, the more of the symbol can be damaged and still scan:

| Level | Recovery | Use for a DPP? |
| --- | --- | --- |
| L | ~7 % | No — too fragile on physical products |
| M | ~15 % | Web/screen only |
| **Q** | ~25 % | **Yes** — labels, packaging |
| **H** | ~30 % | **Yes** — small, curved or harsh-wear products |

A passport label may get scratched, bent around a battery cell, or partially worn. Use **Q or H** so it still scans after a year in the field. Higher correction means a denser symbol, so balance against print size.

## Quiet zone and minimum print size

- **Quiet zone:** keep a clear margin of at least **4 modules** around the symbol. No logos, no text in it.

- **Minimum size:** rule of thumb, the module size should be **≥ 0.33 mm** for close-range phone scans; bigger if scanned from a distance. On a typical 300 DPI label printer that is roughly a **2 × 2 cm** symbol for a serial-bearing Digital Link — verify with your worst-case scanner and lighting.

## Dynamic, not static — or it is not compliant

A *static* QR bakes the data into the symbol. A DPP's data changes over the product's lifetime (carbon footprint re-measured, recycled-content target reached, repair info updated). If the data is baked in, you cannot update it without reprinting every label — and an out-of-date passport is non-compliant.

So a DPP QR must be **dynamic**: it carries a stable resolver URL (immutable GTIN/serial), and the data behind it is updated via API. Print once, update forever.

## Generate a print-ready DPP QR (code)

Creating a passport returns the QR in four formats — no separate QR step:

```
import { QR3 } from "@qr3/sdk";

const client = new QR3({ apiKey: process.env.QR3_API_KEY! });

const passport = await client.dpp.create({
  gtin: "09520000000011",
  serial: "SN-00012345",
  product_name: "PowerCell 5 kWh LFP",
  manufacturer: "ExampleTech GmbH",
  origin_country: "DE",
  category: "battery",
  battery_data: { capacity_kwh: 5, carbon_footprint_kg: 62, recycled_content_pct: 12, recyclability_pct: 95, manufacturer_warranty_years: 8 },
});

console.log(passport.qr.svg); // vector — scales to any label size, no pixelation
console.log(passport.qr.pdf); // CMYK PDF for print
// qr.png for the web, qr.eps for professional label printers
```

Use **SVG or EPS** for labels (vector survives any scaling); **PNG** for the web. The QR already encodes the GS1 Digital Link to the passport.

## Tiny products: GS1 Data Matrix

When there is no room for a QR (small electronics, jewellery), a **GS1 Data Matrix** carries the same Digital Link in less space and is supported by the same standards. Same URL, smaller symbol.

## FAQ

**Can I add my logo in the middle?**
Yes, within the error-correction budget — at level Q/H a small centered logo is recoverable. Keep the quiet zone clear and test-scan.

**Does the QR contain the product data itself?**
No — it contains the GS1 Digital Link. The data lives behind the resolver and stays updatable. That is what makes the passport durable.

**SVG vs PNG for labels?**
SVG/EPS (vector) for anything printed — it scales cleanly to any size. PNG only for fixed-size web use.

## Sources

- [GS1 Digital Link standard](https://www.gs1.org/standards/gs1-digital-link)

- [ISO/IEC 18004 — QR Code symbology](https://www.iso.org/standard/62021.html)

- [EU Battery Regulation 2023/1542](https://eur-lex.europa.eu/eli/reg/2023/1542/oj)

**Start for free** and generate a print-ready DPP QR: [app.qr3.app/sign-up](https://app.qr3.app/sign-up)

These are working demos with fictitious product data and example GTINs from GS1 prefix 952. They do not represent assigned product identifiers, a registry entry or a certification.

## Related posts

- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/gs1-resolver-test-suite-dpp-links/hero.png) Tutorials GS1 Resolver Test Suite: Reliably Test DPP Links Before Go-Live The stable GS1 test suite makes Resolver 1.2 testable. Verify redirects, linksets, CORS, languages, and error handling before go-live.](/en/blog/gs1-resolver-test-suite-dpp-links/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/ppwr-one-data-carrier-dpp/hero.png) QR Code Tech PPWR, QR Codes and DPPs: Why One Data Carrier Should Be Enough The PPWR introduces open digital data carriers for packaging information. How to connect packaging, sorting and a product DPP through one stable entry point.](/en/blog/ppwr-one-data-carrier-dpp/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/dpp-battery-passport-2027-20260715/hero.png) Industry News BatteryPass-Ready Launches Test Environment for the Digital Battery Passport The BatteryPass-Ready consortium launched a public test environment for the Digital Battery Passport on June 24, 2026 — ahead of the EU mandate taking effect in February 2027.](/en/blog/dpp-battery-passport-2027-20260715/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/sector-20260713/hero.png) Industry News Digital Battery Passport 2027: What Manufacturers Need to Know Now Webinars, open-source tools, and new standards: the EU Battery Passport is gaining momentum. A July 2026 status overview and the open questions ahead of the February 2027 deadline.](/en/blog/sector-20260713/)

[← All articles](/en/blog/) [Start for free](https://app.qr3.app/sign-up)
