What offline verification can and cannot prove
Offline verification answers a narrow but important question: is this payload well-formed and encodable? A payload with a typo, a stray control character, or a length that exceeds the symbol's capacity will fail here before it fails in front of a customer. The symbol build on this page is a real one — it constructs the QR matrix and reports the version and module count — so a payload that cannot be encoded at your chosen error-correction level is caught honestly, in your browser, with no network involved.
Density is the finding most people overlook. A short URL encodes as a low-version symbol with large, forgiving modules. A long URL with tracking parameters encodes as a dense grid of small modules that demand a larger print size and a better camera. When the verifier reports a high version number, treat it as a design instruction: either shorten the payload — a short redirect you control is the usual fix — or print the code larger and test it on the weakest phone your audience uses. Density is not a defect, but it raises the price of every other mistake.
Encoding pitfalls are subtler. Plain ASCII text is the safest payload: every scanner handles it. Non-ASCII characters — accented letters, emoji, non-Latin scripts — encode as UTF-8 bytes and lengthen the payload, and some older scanners handle them poorly. Test non-ASCII payloads on real devices before printing. Leading and trailing whitespace is another quiet failure: some scanners trim it, some preserve it, and a URL with a trailing space can break in ways that are invisible on the printed page. Trim payloads, and compare the decoded text against the intended text character by character.
Error-correction level is a trade-off, not a quality score. Level L produces the least dense symbol for a given payload, which scans most easily on a clean print. Level H tolerates the most damage — scuffs, lamination, a logo in the centre — but makes the symbol denser. Match the level to the environment: clean indoor print gets M, rough handling and textured stock get Q or H, and anything with a logo overlay needs H plus a larger print size and a physical test.
None of this proves the printed code scans, which is why the self-test checklist exists. Print at the real size, with the real margin, on the real stock, and scan it at the real distance in the real light with the worst phone you can find. Check it after lamination, after mounting behind glass, and from a slight angle. A payload can be perfect and a printed code can still fail — verification is two halves, and the physical half is the one most teams skip.
