A QR code either scans in under a second or it does not scan at all, and the difference is almost never the generator you used. It is four physical properties: size per module, quiet zone, contrast, and how much data you crammed in. Get those right and even a cheap encoder produces a code that works from across a room.
The four levels recover roughly 7 percent (L), 15 percent (M), 25 percent (Q) and 30 percent (H) of damaged codewords. Higher levels sound safer but cost capacity: the same URL at level H needs a physically larger symbol or smaller modules than at level M. For print, M is the right default. Go to Q or H only when you are punching a logo into the middle — and even then, keep the logo under about 20 percent of the code's area and centred, because the finder patterns in three corners and the timing patterns along the edges must stay untouched.
The working rule of thumb is a scan distance of roughly ten times the code's width. A 2 cm code scans reliably at about 20 cm; a poster meant to be read from 3 m needs a code around 30 cm across. For print, no module (the smallest black square) should be smaller than about 0.4 mm at 300 DPI or ink spread starts merging them. On screen, render at an integer multiple of the module size — a 21×21 version-1 symbol drawn at 210 px gives exactly 10 px per module and stays crisp; drawing it at 200 px introduces resampling blur that costs you real scan reliability.
The specification requires four modules of blank margin on all sides. Designers delete it constantly because it looks like wasted space, and the result is a code that fails against a busy background. If your code is 10 px per module, that is 40 px of clear margin. This is the most common single reason a code that worked in the design file stops working on the printed flyer.
Dark modules on a light background, always. Inverted codes — light on dark — are supported by some scanners and rejected by others, so they are a coin flip on your customer's phone. Aim for a contrast ratio of at least 4:1 between module and background; pure black on white is 21:1 and there is no prize for being clever here. Avoid printing on glossy stock that produces specular reflection under the phone's flash, and never place a code across a fold or a curved bottle seam.
Capacity scales with version, and version scales the symbol from 21×21 modules up to 177×177. A short URL might fit in version 2 or 3 with big, forgiving modules; a 300-character tracking URL forces version 10 or higher, which means the same physical square now has modules a third the size. Shorten links before encoding. Also encode HTTPS://EXAMPLE.COM/X in uppercase where you can — alphanumeric mode packs 5.5 bits per character against 8 bits in byte mode, and domain names are case-insensitive.
QR is not only for URLs. WIFI:T:WPA;S:NetworkName;P:password;; joins a network, tel: and SMSTO: prefill actions, and vCard payloads add a contact — though a full vCard usually exceeds sensible capacity, so link to a hosted card instead. Test each scheme on both iOS and Android; native camera handling of non-URL payloads differs.
Before anything goes to print: scan the final exported file, not the preview, from the actual intended distance, on at least one iPhone and one Android, in dim light, at a 30-degree angle, and after printing on the real substrate. Also confirm the destination works — a perfectly encoded link to a 404 is the most expensive QR failure there is, and the one people only discover after 5,000 flyers are printed.