QR codes had a false start in 2011 and a real comeback in 2020, when every restaurant menu and checkout counter adopted them. The difference this time: people scan. In practice, QR now drives measurable offline-to-online journeys — but only when the code scans reliably and the destination is worth the click. This guide covers the decisions that determine both.
Static vs dynamic: the fork in the road
A static QR code encodes the destination directly into the pattern. It cannot be changed — reprint or redo. A dynamic QR code encodes a short link, and the short link redirects to the real destination.
| Static | Dynamic | |
|---|---|---|
| Destination | Fixed forever | Change any time |
| Analytics | None (scan counts only) | Scans, devices, referrers, series |
| Print risk | Must be right first time | Re-target without reprinting |
| Best for | Permanent, tiny surfaces | Menus, packaging, posters, campaigns |
The killer scenario for dynamic: you print 50,000 flyers with a QR to "winter campaign", the campaign URL changes after launch, and you don't want to throw away the flyers. With a dynamic code you edit the destination in the dashboard and every printed code instantly points to the new page. The deep comparison is in static vs dynamic QR.
Print quality: the four rules that make codes scan
Most scanning failures are print failures, not camera failures. Four rules cover 95% of them:
1. Size scales with viewing distance. Minimum 2cm per 1m of viewing distance. A shelf label viewed from 30cm can be tiny; a billboard needs a code measured in decimeters.
2. Contrast must be dark-on-light. The scanner reads modules (dark squares) against the background. Black on white is unbeatable; any color pair works if contrast ratio stays above ~4:1. Never invert (white code on black background) — many scanners fail on it.
3. Quiet zone is sacred. The white margin around the code must be at least 4 modules wide (the QR spec). Designers routinely crop it for aesthetics and break scanning.
4. Source resolution matters. Generate at 1024px and downscale, never upscale. The QR API serves PNG at 128–1024px and SVG for vector print — SVG is the right choice for large-format printing.
# 1024px PNG for packaging
curl "https://yas.sh/api/v1/qr?url=https://yas.sh/menu&size=1024&format=png" -o menu-qr.png
# SVG for a 2m poster — infinitely sharp
curl "https://yas.sh/api/v1/qr?url=https://yas.sh/poster&size=1024&format=svg" -o poster-qr.svg
Design: logos and color without breaking scans
A logo in the center of a QR code is a scanability risk paid for in brand recognition. The safe version: embed a small logo (≤15% of code width) with error correction level H (30% recovery), and test on real devices. The QR logo overlay guide covers sizing, placement, and what error correction actually buys you.
For colors, tinting the background slightly is safe; tinting the modules toward mid-tones is risky. When in doubt, run a scan test with the actual printer's output — ink absorbs and reflects differently than screens.
Measuring scans: what the data says
A scan is a redirect hit with context: device type, referrer (empty for camera scans — that's normal), and timestamp. The daily series answers the operational questions:
- When do scans spike? Dinner service for menus, launch week for products, event days for badges.
- Which placement performs? Compare a code on the front door vs the checkout counter — the series makes it visible.
- Did the print run arrive? A clean jump in scans on the date stock hits stores confirms logistics.
Because scans arrive in the same analytics pipeline as clicks, one dashboard shows email, social, and print on the same axis. No separate QR tool needed.
The business playbook
- Menu / in-store: dynamic QR → daily specials page. Re-target every morning; measure by hour.
- Packaging: static or dynamic depends on SKU lifetime. Long-lived SKU → dynamic (recipe page, loyalty program, product registration).
- Events: dynamic QR on badges and signage → agenda or check-in; the event case study shows a real setup.
- Posters / OOH: dynamic QR, large SVG, generous quiet zone, test-scan at actual viewing distance.
The campaign playbook: QR in the marketing mix
QR codes work best when they're part of a measurement system, not a standalone stunt. The playbook that produces measurable campaigns:
1. Assign the channel a taxonomy. Print and QR need tags like any other channel. The UTM campaign guide gives the standard: utm_source=qr, utm_medium=qr, utm_campaign=<name>. The campaign manager builds the tagged destination before the code is generated, so scan analytics land in the same reports as email and social.
2. Decide static vs dynamic per surface. The decision rule from the deep comparison: will the surface outlive the destination? Menus, packaging, posters → dynamic. Engravings, labels, offline data payloads → static.
3. Design for the viewing distance. Posters at 3m need a code that's a significant fraction of the design — generate at 1024px and let the print layout scale down, never up. The quiet zone is a design requirement, not a suggestion.
4. Test on the actual medium. A code that scans on a monitor can fail on matte paper, textured boxes, or under shrink-wrap. Print one, scan with two phones, then approve the run.
5. Close the loop with an action. A QR to a generic homepage is a wasted scan. Every code should land on a page with one clear action — menu, booking, signup, discount — and that action should be measurable. The conversion tracking guide shows the join.
The API for QR at scale
QR generation is a production endpoint, not a design-tool download. Teams print hundreds of codes per campaign; the API makes that a loop:
# one code per SKU, print-ready
while read -r url slug; do
curl "https://yas.sh/api/v1/qr?url=https://go.brand.com/$slug&size=1024&format=png" \
-o "print/$slug.png"
done < urls.txt
// TypeScript — generate and save
const res = await fetch(
`/api/v1/qr?url=${encodeURIComponent(url)}&size=1024&format=svg`
);
const svg = await res.text();
The contract: url (http/https only — validated), size (128/256/512/1024), format (png/svg), error-correction level M, cached for 1 hour. SVG is the right format for large-format print; PNG for digital and small surfaces. The API reference documents the full contract, and the EventFlow case study shows the loop in production.
Common QR mistakes and the fixes
| Mistake | Symptom | Fix |
|---|---|---|
| Code too small for viewing distance | Scans fail at distance | Size rule: ≥2cm per 1m of distance |
| Quiet zone cropped | Scanners "can't find" the code | Keep 4+ modules of margin |
| Low-contrast colors | Intermittent failures | Dark modules on light background |
| Logo too large | Failures near the center | ≤15% of width, level H, light plate |
| Static code for a changing destination | Dead code after campaign | Dynamic link instead |
| No UTM tags | Scans invisible in reports | Tag before generating (taxonomy) |
| Code to a generic homepage | Low value scans | Land on a page with one action |
Conclusion
QR codes are the most reliable offline-to-online bridge in marketing — when they scan. Static vs dynamic is a reprint-cost decision; print quality is a discipline; analytics is what turns a scannable code into a measurable channel. All three are table stakes, and all three are minutes away with the dashboard and QR API.
