QR codes on promos.

Verified October 2026

Why printed QR codes fail

A QR code is the one element on a promo with a hard pass/fail state. A headline that is slightly too small still reads; a code that is slightly too small simply does not scan, and nobody tells you. Almost every failed code in the wild traces back to one of four causes: something crowding the quiet zone, a code printed too small for its viewing distance, weak or inverted contrast, or placement under interface elements on screen. All four are checkable before you export, and this guide covers each one.

The figures added here are computed by the engines behind the free QR tool and the Studio — not typed — on two fixed, fictional links: https://example.com/go and https://example.com/events/2026/harvest-fair/tickets?ref=poster&src=lobby (see the methodology).

The quiet zone: four modules of nothing

The QR standard (ISO/IEC 18004) requires a quiet zone of four modulesof clear space on every side of the code. A module is the smallest square in the pattern, so the quiet zone scales with the code — it is not a fixed pixel margin. Scanners use that empty border to find the edges of the symbol; anything that intrudes on it can break detection even when the code itself is perfect.

DENSO WAVE states it publicly: “QR Code requires a four-module wide margin at all sides of a symbol.” (source, 2026-10-02). The engine always draws 4 modules of margin; nothing in the tool can switch it off.

  • Do not run a decorative border, keyline, or frame tight against the code.
  • Keep body text, logos, and busy background patterns out of the margin.
  • Place the code on a solid light panel if the artwork behind it is textured or photographic.

Error correction: pick the level for the job

QR codes carry built-in redundancy, so a partially damaged or obscured code can still decode. There are four levels, and the trade-off is simple: more recovery means more modules, which means a denser code that needs more physical size for the same URL.

LevelRecoverable damagePick it whenExample link
L≈7%Clean on-screen use at close range, where you want the sparsest, most scannable pattern.Version 4, 33×33 modules
M≈15%The sensible default for most promo work, print or screen.Version 5, 37×37 modules
Q≈25%Print that will live rough: folded flyers, outdoor posting, table tents that get wiped down.Version 6, 41×41 modules
H≈30%A logo overlaid on the center of the code, small stickers, or anything likely to be scuffed.Version 8, 49×49 modules

The percentages are the reference encoder’s own (source, 2026-10-02). The engine encodes at level M unless another level is chosen; a centre logo forces H — see the decode-margin guide.

That rule, worked on the short link: asked for level L on its own, the engine returns level M, version 2, 25×25 modules. Asked for level L with a logo option attached, it returns level H, version 3, 29×29 modules, and marks the result ecForcedByLogo: true so a caller can see the request was overridden. The level you pick is a floor, not a ceiling: the encoder may also raise it on its own when doing so costs no extra version, which is why the table asks for a level and reports the one encoded.

One related habit pays off at every level: keep the destination URL short. A long URL forces a denser code before error correction even enters the picture, and a dense code at level H can get finicky at small sizes.

The right-hand column is that cost, computed: 33×33 modules at level L become 49×49 at level H, 41 to 57 across with the quiet zone. The short link encodes at level M as version 2, 25×25modules — fewer than the long link needs at any level. How a payload’s length sets the version is the subject of how the QR maker encodes ten payload types.

How big to print: the 2 cm floor and the 10× rule

For close-range scanning — a flyer in someone’s hand, a business card — print the code at least 2×2 cm (0.8×0.8 in). Below that, ordinary phone cameras struggle to resolve the modules.

For everything else, use the rule of thumb that a code scans reliably from about 10× its printed width. Work backwards from where the viewer will actually stand. A poster meant to be scanned from across a room at 3 m needs a code around 30cm wide — far larger than most people’s instinct. Flip it around and the same rule is reassuring: a flyer read at 30 cm only needs a 3 cm code, comfortably above the print floor. The rule is approximate, but if your layout is an order of magnitude off it, no amount of error correction will save it.

No official source was found for either figure, so both keep their original wording and date (August 2026).

The PNG presets, in millimetres

The engine defines 3 preset pixel sizes and a print readout for any of them: pixels divided by 300dots per inch gives inches, and inches give millimetres. The tool’s PNG download is 2048 px square, which is also the largest engine preset; the table shows what each engine preset would print as. The readout describes the whole image, quiet zone included.

PresetPrints asModule, short linkModule, long link at H
512 px1.71 in × 1.71 in (43.3 mm × 43.3 mm) at 300 DPI1.31 mm0.76 mm
1024 px3.41 in × 3.41 in (86.7 mm × 86.7 mm) at 300 DPI2.63 mm1.52 mm
2048 px6.83 in × 6.83 in (173.4 mm × 173.4 mm) at 300 DPI5.25 mm3.04 mm

Module width is the readout divided by the module count (33 and 57 across, respectively). The smallest preset is 2.2× the 2 cm floor. The 30 cm poster code would need 3544 pixels on a side at 300 DPI, more than the largest preset of 2048px: that is the SVG’s job.

Dark on light, always

Scanners are built to find dark modules on a light background. Inverted codes — light modules on a dark background — fail outright on many readers, because the detection step assumes the standard polarity before decoding even begins. A white code on black may look sharp in a layout and still be functionally broken. If the design is dark, place the code on a light panel rather than inverting it.

Contrast matters within the normal polarity too: two mid-tone brand colors can sit too close together for a camera in poor lighting. A useful benchmark is the WCAG AA text threshold of 4.5:1 (source, 2026-10-02) — the Studio’s color picker shows a live contrast advisory against that exact figure, and a color pair that fails it for text is a poor bet for a scannable code. The QR engine warns below the same 4.5:1 because readers binarise the image, so lower contrast measurably hurts decoding.

Contrast, computed on named colour pairs

On fixed pairs, with polarity checked separately:

PairColoursRatioThe engine
The Studio's default accent on its default panel#3f6f63 on #fbfcfa5.57:1passes
Teal on mint#0d9488 on #d1fae53.30:1warns
Crimson on blush#b91c1c on #fecaca4.47:1warns
White on the Studio's default image backdrop#ffffff on #14201c16.76:1flagged as inverted

The warnings are the engine’s own words. Teal on mint returns “Low contrast (3.30:1). Scanners may fail below 4.5:1 — darken the foreground or lighten the background.” White on the Studio’s backdrop measures 16.76:1 yet returns “Light-on-dark (inverted) codes are not reliably read by all scanners. Prefer dark modules on a light background.” A high ratio does not rescue an inverted code.

Crimson on blush fails by a hair at 4.47:1. The Studio’s colour picker runs the same arithmetic as an advisory, rounding its display to one decimal: it shows 4.5:1 for this pair yet reports the minimum unmet, because the test uses the unrounded ratio. Picked colours are never rewritten — the thumbnail’s overlay text, the kicker and the title, drawn over an unpredictable photo, is the one exception — per the colour doctrine in promo design basics.

Placement on story graphics

On a 1080×1920 story frame (source, 2026-10-02), the top and bottom bands can be covered by platform interface — profile chrome above, reply and action controls below. Meta’s guidance is to “consider leaving roughly 14% (250 pixels) of the top and bottom of the image free from text and logos.” (source, 2026-10-02). Those bands are approximate and vary by platform and device, but the practical rule is constant: keep the QR code and any instruction text in the middle of the frame, and treat the top and bottom bands as disposable background. A code that sits half-under a reply bar is a code nobody scans. These specs are current as of October 2026— verify against the platform’s own documentation before a critical print run or launch.

Fitting the title beside the code

The Studio fits its title, event line and body text with one fitter: start at the preferred size, wrap, shrink a pixel at a time until the lines fit, and only at the floor cut with an ellipsis. The handle (in the content area) and the action text (in the footer bar) are drawn at sizes scaled from the canvas width and the chosen handle and action sizes, neither fitted nor cut. On a fictional 900×90px strip, at the Studio’s default title size of 72px, with the smallest title size the Studio’s settings accept, 28px, standing in as the fitter’s floor (in the Studio the floor is derived from the canvas width) and a flat stand-in measurer of 0.55 em per glyph (the Studio measures the real typeface on its canvas):

  • The title “Harvest Fair” fits at 72 px on 1 line, untouched.
  • “Harvest Fair at the Old Mill, Saturday from ten” comes down to 41 px over 2 lines, nothing lost.
  • A 27-word paragraph hits the floor at 28px and is cut; its last line reads “the full programme of forty stalls, and save the date to…”

PNG or SVG for print

PNG is raster: it has a fixed pixel size, and enlarging it for a poster softens the module edges. SVG is vector: it scales to any print size without quality loss, so the 30 cm poster code stays as crisp as the 3 cm flyer code. Hand your printer the SVG whenever one is available and keep the PNG for screens. The free QR tool exports both, and the Studio’s promo package ZIP includes the code as PNG and SVG side by side — the package anatomy guide walks through everything else in that ZIP.

What the package records about the code

The ZIP carries a manifest.json. On a fictional campaign its fields are: generatedBy, generatedAt, title, destination, routingDestination, campaignType, category, price, shortLink, startsAt, timezone, venue, sourceImage, captionPlatforms, design, designSchemaVersion, files; its designSchemaVersion is 3. destination holds the original address and routingDestinationthe one the campaign points at — here the long and the short link.

The package README describes the two QR files in its own words:

  • qr/*.png — digital posts, presentations, and on-screen scanning.
  • qr/*.svg — print, signage, and any workflow that needs lossless scaling.

Test-scan before anything prints

Every rule above is a way to avoid a failure you could also just catch directly: scan the thing. Print a proof at final size — not on screen, where brightness and backlight flatter the code — and test it at the real viewing distance, in lighting like the venue’s, with more than one phone. Confirm the URL that opens is the URL you meant, with any tracking parameters intact. It costs almost nothing and it is the only step that verifies the whole chain. If the code anchors an event campaign, fold that proof-scan into your run-up plan — it has a line of its own in the event promotion checklist.

Common misreadings

  • “The quiet zone is a pixel margin.” It is 4 modules, and a module is whatever size the code prints at.
  • “Level H makes a small code safer.” It adds modules: at the smallest preset the long link’s modules shrink from 1.06 mm at level L to 0.76 mm at level H.
  • “A ratio above 4.5:1 means the colours are fine.” Only with dark modules on a light background; polarity is checked separately.

Questions

How large should a QR code be on a poster read from 3 m?
About 30 cm, by the rule of thumb that a code scans from about 10× its printed width; the rule is approximate. At 300 DPI that is 3544 pixels on a side, beyond the largest PNG preset of 2048 px, so use the SVG.
Which error-correction level should I choose?
The default is M (≈15% recoverable damage), right for most promo work; Q (≈25%) for print that lives rough, H (≈30%) for stickers and scuffs; a centre logo forces H. Each step adds modules (the long example link: 33×33 at L, 49×49 at H), so a higher level wants a larger print.
Why does the tool warn about my colours?
It warns below a WCAG contrast ratio of 4.5:1, because readers binarise the image and lower contrast measurably hurts decoding, and it flags light modules on a dark background whatever the ratio. Your colours are never rewritten.
Can I put the QR code at the bottom of a story?
Better not. On a 1080×1920 story the top and bottom bands can be covered by platform interface; keep the code and its instruction in the middle band, as the placement section above sets out.
Does a short link really make a difference?
Yes, measurably: the short example link is version 2, 25×25 modules at level M; the long one at the same level is version 5, 37×37. At the same print size, fewer modules means larger modules.

Everything here runs in your browser: the tools compute on your device and the Studio’s package is assembled on the device. The methodology documents every rule the tools apply.