July 6, 2026
How QR Codes Work (and How to Use Them Without Regret)
A practical guide to how QR codes encode data, how error correction keeps them scannable, and how to choose between static and dynamic codes so the one you print today still works in five years.

QR codes look like pixel art, but they are a structured 2D matrix barcode. Unlike a traditional one-dimensional barcode, which encodes data along a single horizontal axis, a QR code stores data along both the horizontal and vertical axes. That is why a scanner can read the same payload from a small square whether it is printed on a business card or projected on a stadium screen, and it is also why the format is called "Quick Response" — the matrix is designed to be decoded fast, from any orientation, even when part of it is damaged.
The matrix itself is built from black modules on a white background, surrounded by fixed structural patterns that help the decoder locate, orient, and calibrate the image. Three large finder patterns in the corners let a scanner detect the code at any rotation. A smaller alignment pattern corrects skew, and a quiet zone — a margin of solid white — separates the code from surrounding text or artwork. The remaining modules encode the actual payload along with error-correction data.
Error correction: the reason QR codes survive wear
Every QR code uses one of four Reed–Solomon error-correction levels: L, M, Q, and H. Each level can recover a different share of damaged or obscured modules: roughly 7 percent at L, 15 percent at M, 25 percent at Q, and 30 percent at H. Higher levels buy resilience but consume more modules, so the same payload produces a larger matrix at H than at L. For a printed menu wiped down daily, M or Q is a sensible default. For a one-time digital display, L is usually enough and keeps the code compact.
Choose the error-correction level before you worry about physical size. If you plan to overlay a logo or place the code somewhere it will be scuffed, set the level to Q or H so the lost modules are recoverable. If the code sits on clean, protected media, L keeps the matrix small and fast to scan.
Static vs dynamic QR codes
A static QR code encodes its payload directly into the matrix. Whatever URL or text you supply at generation time is what the code contains forever — there is no redirect, no server, and no expiry. Scan a static code in ten years and it will still resolve, as long as the destination URL itself still works. Static codes are the right choice for links to content you control and intend to keep stable: a homepage, a Wi-Fi credential, a vCard, or a permanent document.
A dynamic QR code, by contrast, encodes a short redirect URL that points to a backend you or a vendor controls. The destination can be changed later without reprinting, and the backend can record scan counts and device types. The tradeoff is dependency: dynamic codes rely on a service staying online. If the vendor shuts down, changes pricing, or sunsets the redirect domain, every printed code stops working overnight. For high-volume print runs, prefer static codes unless analytics or retargeting genuinely justify the risk.
Try it: QR Code Generator
Turn any text or URL into a downloadable QR code — customizable colors and error correction.
Keep payloads small and URL-encoded
The physical size of a scannable QR code grows with the amount of data it carries. A short URL scans faster, tolerates lower print quality, and survives smaller physical dimensions than a long one. Use the shortest stable URL you can — clean paths, short slugs, and trimmed query strings all help.
If the payload includes query parameters — tracking codes, search terms, or values with spaces and special characters — URL-encode it before generating the code. Raw spaces, ampersands, and non-ASCII characters inflate the encoded length and can break the destination when different scanners re-encode them inconsistently. Encode and inspect payloads with a URL encode/decode tool before committing the QR code to print.
# Encoded payload — compact and scanner-safe
https://example.com/event?utm_source=poster&name=Spring%20Sale
# Raw payload — spaces and special chars inflate the matrix
https://example.com/event?utm source=poster&name=Spring Sale&rsvp=true&plus=guest
Design and failure modes
Most QR codes that appear to "not work" share a handful of root causes. The destination URL has gone offline, especially for codes printed years ago on packaging or signage. The matrix is too small for the scanning distance, or the contrast between modules and background is too low for the decoder. A centered logo has overwritten too many modules. Or the payload contains unencoded characters that one scanner handles and another does not.
Design around the quiet zone. Logos, colors, and inverted backgrounds are tempting, but every modification trades resilience for style. Keep a clear quiet zone on all four sides — most scanner failures come from crowding the code against other artwork rather than from the code itself. If you must embed a logo, raise the error-correction level first so the lost modules are recoverable.
Test with multiple devices before printing in volume. A code that scans perfectly on a flagship phone may struggle on an older device under dim lighting, and a quick field test is cheaper than a reprint.
A short checklist before you print
Keep the URL short and stable, URL-encode anything with query strings, pick an error-correction level that matches the wear the code will take, leave a generous quiet zone, and confirm the destination URL will still resolve for the full expected lifetime of the printed material. If you get those five things right, a static QR code will outlast the campaign it was printed for.
You can generate static QR codes with full control over size and error correction using the QR generator. For payloads with query strings, pair it with URL encode/decode so the matrix stays compact and the destination stays predictable.