QR codes are a given in 2026
What was still a Japanese special case in 2019 has been global everyday life since the COVID pandemic: menus, event tickets, city guides, payment, vaccination certificates. Every smartphone has a scanner built in. But: generating a QR code is trivial, generating a QR code correctly — print-ready, error-tolerant, with tracking — takes some knowledge.
How a QR code is built
QR (Quick Response) was developed in 1994 by Denso Wave, originally for car manufacturing. The basic structure:
- Position markers in three corners (the large squares). These let the scanner detect orientation and scale.
- Alignment markers (smaller squares) for correction on angled shots.
- Timing pattern (dotted lines between position markers).
- Data modules (the actual content).
- Error-correction modules (Reed-Solomon codes).
Versions and capacity
A QR code comes in 40 versions. Version 1 is 21×21 modules, version 40 is 177×177 modules. More modules = more capacity, but also more work for the scanner. Rule of thumb for common use cases:
- URL up to 25 characters: version 1–2, 21×21 or 25×25 modules.
- URL up to 50 characters: version 3, 29×29.
- vCard with all fields: version 8–12.
- Wi-Fi configuration: version 4–5.
Practical tip: shorter content = smaller codes = better scannability. A 200-character URL produces a QR code that's barely readable at 3 m distance. This is exactly where a short-link platform like ScanGo.me comes in — it shortens URLs to 15–20 characters and thus enables dramatically smaller QR codes.
Error-correction levels
QR codes can reliably decode damaged areas too — thanks to Reed-Solomon error correction. Four levels:
- L (Low): 7% recovery. Lowest data overhead.
- M (Medium): 15%. The default recommendation for web.
- Q (Quartile): 25%. For print with a logo overlay.
- H (High): 30%. Maximum protection, larger QR codes.
To put a logo in the center of the QR code, you need at least level Q (better H), because the logo covers up to 25% of the data modules. More on that in our QR design post.
Print resolution
A QR code is a vector structure — rendered as SVG or a high-resolution PNG it stays sharp. Rules of thumb for print size:
- Minimum module size: 0.4 mm per module for reliable capture.
- Business card: 1.5 × 1.5 cm at version 3 (29 modules → 0.5 mm/module).
- Flyer: 2.5 × 2.5 cm.
- Poster (A1): at least 8 × 8 cm.
- Bus advertising: 30 × 30 cm.
- Shop-window sticker: 10 × 10 cm.
Format: SVG is always the best choice, because it's vector-scalable. For PNG export, choose at least a 1000 px edge length.
Static vs. dynamic
A static QR code contains the target URL directly. On scan it's called 1:1. Advantage: independent, no platform binding. Disadvantage: the URL can't be changed after printing, no tracking possible.
A dynamic QR code contains a tracking URL (e.g. scango.me/abc12) that redirects in the background to the actual target URL. Advantages:
- Editable: the target URL can be changed after printing — important for seasonal campaigns, A/B tests, corrected landing pages.
- Tracking: number of scans, device type, location, time of day.
- Shorter URL = smaller QR code. Better scannability, less print area.
- Fallback URL: for when the original link ever breaks.
Platforms like ScanGo.me offer dynamic QR codes with tracking and an edit function. More on short links and their advantages in our short-link post.
Browser-local generation
If you don't need a tracking platform, you can generate QR codes browser-local — the most common open-source libraries are qrcode and qr-code-styling:
import QRCode from "qrcode";
const url = "https://my-site.com";
const svgString = await QRCode.toString(url, {
type: "svg",
errorCorrectionLevel: "M",
margin: 2,
color: { dark: "#000", light: "#fff" }
});Advantage: no external service dependency, no tracking. Disadvantage: static, not editable.
QR code types beyond URLs
- Wi-Fi:
WIFI:S:NETWORKNAME;T:WPA;P:PASSWORD;;— a guest scans, is on the Wi-Fi. - vCard: contact details straight into the address book.
- SMS:
SMSTO:+1234567890:Text— pre-fill for a reservation SMS. - Phone call:
tel:+1234567890. - Email:
mailto:info@example.com?subject=…. - Geo location:
geo:52.5,13.4— opens the maps app. - Calendar event: iCal format.
- SEPA payment: in the EBA payment-hint format.
The most common QR code mistakes
- Too little contrast. A light-gray QR code on a white background — scanners can't do that reliably. At least 50% brightness difference.
- QR code scaled too small in print. Rule of thumb: 2 cm on a business card, 5 cm on a flyer.
- Inverted QR (light code on a dark background). Works in theory, but many smartphones can't do it. Classic black-on-white is safer.
- Quiet zone forgotten. The QR code needs 4 modules of clear margin all around. If it sits right at the image edge, the scan often fails.
- Very long URL without a short link. The QR code gets too complex.
Tracking privacy
Dynamic QR codes generate tracking-relevant data. To stay GDPR-compliant:
- Aggregated statistics instead of personal tracking.
- Anonymize IP addresses or don't store them at all.
- On print materials, a privacy notice near the QR code.
- Platform choice: providers that run servers in the EU (like ScanGo.me).
Recommendation matrix
- A Wi-Fi card for the guest bathroom: static QR with Wi-Fi content, generated browser-local.
- Business card: dynamic QR with ScanGo.me — if the target page changes, the card stays valid.
- Print marketing campaign: dynamic with tracking. Knowing when and where it's scanned is campaign gold.
- Restaurant menu: dynamic — the menu changes, the QR doesn't.
- Seasonal promotion on a poster: dynamic with an expiry date.
Sources
Denso Wave — Original QR code specification · ISO/IEC 18004 — QR Code Spec · qrcode (npm) · qr-code-styling · ScanGo.me — dynamic QR codes & short links · Wikipedia — QR Code.