A QR code is a bridge between a printed surface and a countable web visit. Done right, every flyer, poster or box gives you a click record you can compare against the others. Done wrong, you get a permanent artifact pointing at a dead URL. The workflow that works is short: one goal, a UTM-tagged destination, one short link per placement, a code printed from that short link, and analytics read per placement.
This guide walks those steps in order and says plainly what Elido does and doesn't do at each one. I checked each product claim against the code on 2026-10-24.
Start With One Goal and Tagged URLs
Write one sentence before opening any generator: what does a successful scan look like? "Product registrations from in-box inserts" and "scans per store for a poster run" lead to different setups. A scan count alone is a leading indicator. A conversion needs a landing page that only the QR sends people to, so its visits stand in for intent.
Then plan the destination URLs. UTMs are query parameters that your analytics tool reads from the final URL, and they survive the redirect. The common mistake is putting the UTM-tagged URL straight into the code. That makes a long, dense grid and freezes the tags into the print. Put UTMs on the destination and print the short link.
A template that works for print:
utm_source flyer | poster | packaging | businesscard | sticker | menu
utm_medium print
utm_campaign spring-2026
utm_content the placement: storefront-a3 | in-box-insert | counter-card
utm_content carries the offline attribution. Ten poster locations get ten values, ten short links and ten codes that look identical. For the tagging detail, see tracking UTMs end to end.
Make the Code From a Short Link
Create one Elido short link per placement, with the UTM-tagged URL as its destination. A dynamic code then encodes links.acme.example/spring-mitte instead of the full URL. The destination lives in the shortener, so changing it later updates every printed copy. Dynamic vs static QR codes explains why.
Here's what exists today:
- In the links list, each link has a QR action that opens the designer with the short URL locked in as the content. You can save that design against the link.
- The QR designer at
/dashboard/qrhas one free-text content field, foreground and background colours, module, eye and pupil shapes, an uploaded logo (up to 512 KB) with a size slider and padding, an optional frame label such as "SCAN ME", error correction L to H, and PNG or SVG download. Saved templates let you reuse a brand style. - The mobile app has a QR screen that takes a URL or text, colours, error correction and size, and shares the result.
- The free QR generator works without an account, offers PNG and SVG, and warns about low contrast. It has no logo option and no scan counting.
What it doesn't do: there's no bulk QR export (one code at a time), and PDF or EPS output isn't available, only PNG and SVG. I've put both on our backlog.
Two settings are worth choosing at creation. Use your own domain if your plan has one, because the code then survives a change of vendor and a short branded link makes a smaller grid. And give the slug something readable, which helps when someone types it by hand. Custom domains are on paid plans.
Design for the Print, Not the Screen
Most failed campaigns fail on design choices made without knowing the limits.
Contrast. Dark modules on a light background is the safe pairing. Inverted codes read worse on older cameras, and two mid-tone colours fail in dim light even when they look fine to you. The free tool shows the contrast ratio as you pick colours. Keep a quiet zone of at least four modules on every side, which is part of ISO/IEC 18004. Layout tools often crop it.
Error correction. Denso Wave, who invented the format, describes level M (15 percent recovery) as the most frequently chosen, and recommends Q or H where the code may get dirty (accessed 2026-10-24).
| Level | Recovery | Use it for |
|---|---|---|
| L | 7% | Clean screens, no overlay |
| M | 15% | Standard print, no logo |
| Q | 25% | Small logo, packaging |
| H | 30% | Larger logo, outdoor signs, rough handling |
Elido's designer defaults to M and hints to keep H when a logo grows past about 20 percent of the code. A short link keeps the version low even at H, so there's rarely a reason to skimp.
Logo. A logo hides modules and the error correction pays for it. Keep it under a fifth of the area, keep the padding option on so modules don't show through, and leave the three corner squares alone.
Size. A rule that holds up: minimum width is about a tenth of the scan distance. A shelf tag at 20 cm can be 2 cm. A package at arm's length wants 3 to 4 cm, a counter card at least 5 cm, and a poster read from a metre needs 10 cm. Always export SVG for print. If a printer insists on raster, ask for the size in pixels at their print resolution rather than guessing.
Place One Code Per Placement
Where the code sits decides whether anybody scans it. Put it in the lower third of a poster, on flat matte areas of packaging, and at a steady height on counter displays. Add one line of text beside it saying what happens on scan, because a bare code gives the reader no reason to act. I have yet to see a bare code beat one with a caption.
Each physical placement gets its own short link and its own code. A single code works technically anywhere, but with six stores and one code you know the campaign total and nothing about which store worked. Offline campaign tracking covers print, outdoor and broadcast side by side. On a business card, also print the short URL as text underneath, so a failed scan can still be typed.
Read the Scans Per Placement
Every visit through the short link is a redirect that Elido records server-side: time, country, device class, referrer, and the destination. Nothing runs in the visitor's browser, so there's no script to block. The link's page shows clicks over time, and geography and device breakdowns. Comparing links inside one campaign shows which placement earned its spot.
Three honest limits:
- A QR scan is stored as an ordinary click. Today you can't filter analytics to "QR only", so a link you share both in print and online mixes the two. Keep QR-only links QR-only.
- There's no general conversion postback from a landing page. Elido records conversions from Stripe and Shopify webhooks tied to the link, and campaigns can carry UTM fields. For form submissions, count them in your own analytics using the UTMs.
- Scans from far outside your market usually mean someone photographed the code and shared the picture.
For consent and form basics on the landing page, see QR codes for data collection, and for reading the numbers, how to track QR code scans.
Change the Destination After Print
This is the point of a dynamic code. Materials are in circulation and the printer is done, yet you can still act on what the numbers say.
Swap the page first if the numbers point there: healthy scans with weak conversions mean the landing page is the problem. Edit the link's destination and every later scan goes to the new page. No reprint.
Or split the traffic. Links support weighted destination variants, so you can send, say, half the scans to page A and half to page B while the code stays the same. Compare results in your analytics using the UTMs, then move the weight to the winner. A/B testing landing pages with short links walks through it.
Whatever you change, never delete a live link. A code on packaging can sit in a kitchen for years. Deleting the link sends those scans to an error page. Point it at an evergreen page and leave it running. The same goes for fixtures like menus and entrance posters: change the destination for each season and keep the print.
Related on the Blog
Frequently asked questions
How do I run a QR code campaign?
Write one goal, tag a destination URL with UTMs, create one short link per placement, put each short link in a QR code, print with enough contrast and size, then read scans per placement. Because the code holds a short link, you can change the destination after printing without touching the materials.
Should a campaign QR code be static or dynamic?
Dynamic, in almost every case. A dynamic code encodes a short link, so the destination stays editable and every scan is a counted redirect. A static code bakes the full URL into the pattern, which makes a denser grid and means a typo or a retired landing page forces a reprint.
Can I tell which poster or flyer a scan came from?
Only if each placement has its own short link and QR code. Give every poster, insert or card a separate link, tag it with a distinct utm_content value, and compare the per-link click counts. One shared code gives you a campaign total and nothing finer.
Does Elido separate QR scans from regular link clicks?
Not today. A scan is recorded as an ordinary click on the short link, with time, country, device class and referrer. To keep QR traffic apart, use a dedicated short link that you only ever print as a QR code, and read that link's analytics on its own.
What error correction level should I use for a printed QR code?
Level M, which recovers about 15 percent damage, suits clean print with no logo. Choose Q or H when a logo covers the centre or the surface will get scuffed, as on packaging or outdoor signs. Higher levels add modules, so keep the short link short.
What should I do with a QR link after the campaign ends?
Leave it live and point it at a relevant evergreen page. Printed codes outlast campaigns, and a deleted link sends every later scan to an error page. Archive the campaign in your reports, not the redirect.
Try Elido
Paste a URL, get a working short link
No signup. Link lives for 30 days. Sign up to keep it forever.
No signup needed. Sign up free for 50 links a month.