Why is print harder than screens?
Because print removes every advantage a screen gives a camera: backlight, perfect sharpness, a fixed short distance and guaranteed contrast. A code that scans flawlessly in your browser can fail entirely on a poster.
Almost everything that decides the outcome is locked in before the file reaches the printer. You cannot patch a print run.
What size should a printed QR code be?
Make the code roughly one tenth as wide as the distance it will be scanned from. Scanned from one metre, make it ten centimetres across; from ten metres, make it a metre.
This rule of thumb is widely used and genuinely conservative — it assumes a mid-range phone camera, imperfect lighting, and someone who will not hold still. It is worth knowing that it appears in no standard: ISO/IEC 18004 deliberately leaves module size to the application, and vendors who publish a ratio do not all agree on it. Use it as a floor, not a law.
| Where it lives | Typical scan distance | Minimum code size |
|---|---|---|
| Business card, product label | 20–30 cm | 2–3 cm (0.8–1.2 in) |
| Table tent, menu, flyer | 30–50 cm | 3–5 cm (1.2–2 in) |
| Poster, shelf talker | 1–2 m | 10–20 cm (4–8 in) |
| Window display, wall graphic | 3–5 m | 30–50 cm (12–20 in) |
| Trade show banner | 5–8 m | 50–80 cm (20–32 in) |
| Billboard, building wrap | 20 m+ | 2 m+ (80 in+) |
There is also a practical floor of about 2 × 2 cm (0.8 × 0.8 in) for short content, below which printer resolution and phone focus limits start to bite. That floor is a convention rather than a specified minimum — and it only holds for short content. The minimum QR code size guide works through the distance table and the content-length trap in detail.
Why content length changes everything
A QR code is a fixed grid. More data means a bigger grid in the same physical space, so each module gets smaller and harder to resolve. At medium error correction, a 25-character URL is a 25 × 25 grid; push it to 100 characters with campaign parameters and it becomes 41 × 41 — each module about 60% of its former width at identical print dimensions. At 150 characters you are at 49 × 49, roughly half.
Shorten what you encode before you enlarge what you print:
- Drop
https://andwww.where the scanner resolves it anyway, and prefer a short path. - Use a clean URL on your own domain —
example.com/menu— rather than a long parameterised one. - Put UTM parameters on the destination’s own redirect rather than in the code, if you can.
This is also the strongest legitimate argument for a redirect, covered in static vs dynamic QR codes — along with why a redirect on your own domain usually beats a vendor’s.
How big should the quiet zone be?
Four modules of clear space on all four sides of a standard QR code. This is specified, not advisory — scanners use that empty border to locate where the code begins and ends.
4 modules
The quiet zone width required on every side of a standard QR code symbol. ISO/IEC 18004 defines it as a region that “shall be free of all other markings”, with a nominal reflectance equal to the light modules. (Micro QR codes require 2 modules.)
This is the second most common cause of a printed code that will not scan, after size — and it is almost always introduced at layout time rather than at export. A designer places the code, decides it looks cramped, and crops it tight to the pattern. Or a background image runs right to the edge, or the code goes into a coloured box with no breathing room.
“Clear” means clear. A subtle gradient, a watermark or a low-opacity photograph in the quiet zone all reduce the contrast the scanner relies on. If you must place a code on imagery, put it on a solid light panel with the quiet zone inside that panel.
What DPI should a QR code be printed at?
At least 300 DPI at final print size for raster files. A code printing at 5 cm needs roughly 590 pixels across; at 20 cm, about 2,360.
The better answer is to make DPI irrelevant by exporting vector. SVG and PDF describe the squares as geometry rather than pixels, so the printer’s RIP renders crisp edges at any size. No resolution to get wrong, no re-export when the layout changes, no soft edges.
The common failure is taking a 300 × 300 pixel PNG from a website, dropping it into a poster at 25 cm, and sending it to print. It looks acceptable on screen at 25% zoom. In print the module edges are visibly soft, and soft edges are exactly what a scanner struggles with.
Which export format should you send to print?
Hand the printer SVG or PDF. Use PNG only for screens, and never use JPEG.
| Format | Use it for | Avoid it for |
|---|---|---|
| SVG | Anything going to print; placing into design files | Sending to people without design tools |
| Sending straight to a printer; anything with page dimensions | Embedding into a web page | |
| PNG | Screens, slides, email, social, app UI | Print at any size where quality matters |
| JPG | Almost nothing — compression blurs module edges | Print, and any small on-screen use |
JPEG deserves a specific warning: its compression is designed for photographs, where soft gradients hide the artefacts. A QR code is the opposite — hard black-and-white edges — so compression produces visible fringing exactly where the scanner needs a clean transition. The full format comparison covers how each one behaves in a real print workflow.
Which colours still scan?
Dark pattern, light background, and a decisive difference between the two. ISO/IEC 15415, the print-quality standard for 2D symbols, grades symbol contrast as (Rmax − Rmin) / Rmax and puts the grade-C pass mark — the minimum most industries accept — at 40%. Treat 40% as a floor and aim well above it.
Three rules cover almost everything:
- Print dark-on-light. The standard does permit light-on-dark — ISO/IEC 18004 explicitly provides for reflectance reversal — but decoder support is inconsistent. Some phones handle inverted codes; enough do not that it is not worth the risk on a print run.
- Avoid red for the pattern, and avoid light yellows and oranges entirely. Red is a specific trap: laser and red-LED scanners illuminate at around 660 nm, and red ink reflects that light, so red modules read as white. GS1 tells brand owners never to print bars in red or brown for exactly this reason. Light yellow and orange fail for a simpler reason — they are nearly as bright as the paper, so there is no contrast left.
- Watch the CMYK shift. The colour on your monitor is RGB and the colour on paper is CMYK. A saturated RGB blue can come back from press lighter and duller than it looked on screen, eating the contrast margin you thought you had. If the job is colour-critical, ask for a proof.
Styling the three corner finder patterns separately is safe as long as their structure — a ring with a solid centre — stays intact and high contrast. They are what the scanner uses to orient the code, so they are the last place to get experimental.
Error correction and logos
Every QR code carries redundant data so it can still be read when part of it is damaged, dirty or obscured. Four levels are defined:
| Level | Recoverable codewords | Use when |
|---|---|---|
| L (Low) | ~7% | Clean digital display, plenty of space, no logo |
| M (Medium) | ~15% | The sensible default for most print work |
| Q (Quartile) | ~25% | Industrial labels, or a small logo overlay |
| H (High) | ~30% | A logo in the centre, or a harsh environment |
Those percentages are shares of codewords, not of the picture — that is how ISO/IEC 18004 Table 8 states them. And because a single flipped module corrupts a whole codeword, and a misread codeword costs two correction codewords rather than one, a logo covering 30% of the area at level H is well past the budget, not exactly at it.
Higher correction is also not free: the redundant data occupies the grid, so moving from M to H makes the grid denser at the same physical size, shrinking the modules and working against you. The trade is worth it when something will genuinely obscure part of the code, and a waste when nothing will. The error correction guide works through how to choose a level, and the logo guide covers placement without breaking the scan.
Substrate: paper, vinyl, fabric, curves
The surface matters as much as the file:
- Glossy and laminated stock reflects light straight back into the camera. A glare spot over the code is as good as a hole in it. Prefer matte or satin finishes.
- Uncoated and textured paper lets ink spread — dot gain — thickening dark modules and narrowing light ones. Print a little larger than you would on coated stock.
- Fabric distorts the grid as it moves and stretches. Increase the size generously and use a higher error correction level.
- Curved surfaces — bottles, cans, tubes — foreshorten the code. Keep it within the flattest region available, and test on the actual object rather than a flat proof.
- Vinyl and outdoor signage faces sun fade and dirt. Start at Q or H error correction and keep contrast margin in hand.
Ask your printer for a proof on the real stock, and scan the proof.
Pre-flight checklist
Run this before the file leaves your hands.
- Code is at least one tenth of the intended scan distance, and no smaller than 2 × 2 cm.
- Quiet zone of four modules is clear and uniform on all four sides, in the placed layout.
- Artwork is vector (SVG or PDF), or raster at 300 DPI or more at final size.
- Pattern is dark on a light background, with contrast that survives CMYK conversion.
- Error correction matches the risk — M by default, Q or H with a logo or outdoors.
- Logo, if any, covers no more than about a quarter of the code (a convention, not a spec).
- Encoded content is as short as it can reasonably be.
- Final artwork scanned successfully from at least two different phones — one iPhone, one Android — at the real distance.
- Where possible, a physical proof on the real substrate has been scanned too.
- The destination URL works, and will still work for the life of the print run.
Printing a batch rather than one code — table tents for every table, labels for every product — is a job for bulk export, which generates them from a list or CSV and hands back a ZIP. For the most common print case of all, see how to make a Wi-Fi QR code.