Cover the center of a QR code with your logo and it will very likely still scan. That isn't luck. QR codes carry up to about 30% redundant data, so a chunk can be missing, smudged, or hidden and a phone still reads the whole thing. That single design choice โ baked in since 1994, when Denso Wave built these to track car parts on an assembly line โ explains most of what makes a QR code work or fail.
Here's what's actually going on, and how to make one that scans on the first try instead of the fifth.
What a QR code actually stores
A QR code is not a link. It's a container for a short string of text, and the scanning app decides what to do with that text based on how it's formatted. Point your camera at one and the phone reads the string, recognizes a pattern, and offers an action.
Common payloads:
- A URL:
https://everyboringtool.comโ the phone offers to open it. - Plain text: a note, a serial number, a password written out for a human to read.
- A Wi-Fi login: formatted as
WIFI:S:NetworkName;T:WPA;P:password;;โ the phone offers to join the network with no typing. - A contact card (vCard or MECARD): name, phone, email, company. The phone offers to save it.
- Others: an email draft, a phone number to dial, an SMS, a calendar event, map coordinates.
The format is a convention. WIFI: at the front tells the app it's a network. BEGIN:VCARD tells it it's a contact. Get one character wrong in that structure and the phone treats the whole thing as plain text.
The practical point: the less you cram in, the better. More characters means more dots (called modules), which means a denser, harder-to-scan grid. A 20-character URL makes a clean, forgiving code. A 300-character URL stuffed with tracking parameters makes a dense mess that phones fumble.
Why a damaged code still scans
QR codes use Reed-Solomon error correction โ the same math family that keeps a scratched CD playing. You pick one of four levels when you generate the code:
- L (Low): recovers about 7% damage
- M (Medium): about 15%
- Q (Quartile): about 25%
- H (High): about 30%
At level H, nearly a third of the code can be destroyed and the data still reconstructs. That's exactly why you can drop a logo in the middle โ you're deliberately "damaging" it within the recoverable margin.
The trade-off: higher correction adds more modules, so the code gets denser at the same physical size. For a code printed large and clean, L or M is fine and scans fastest. For a code that will carry a logo, get printed small, or live on a surface that scuffs โ a truck, a coffee cup, an outdoor sign โ go with Q or H. If you're not adding a logo, don't reflexively pick H. You're just making the grid busier for no benefit.
The white border nobody thinks about
Every QR code needs a quiet zone: a blank margin around all four sides, at least four modules wide (four "dots" of empty space). Scanners use it to find where the code starts and stops. Without it, the code blends into surrounding text or artwork and plenty of phones won't lock on.
This is the single most common reason a code that looked fine on screen fails in print. A designer crops it tight to fit a layout, or drops it onto a busy photo with no padding, and the quiet zone vanishes. Most generators include the margin by default โ keep it. If you're placing the code on a colored background, set it inside a light box with room to breathe.
Size and contrast for print
The rough rule for physical codes: scanning distance should be about 10 times the code's width. A 1-inch (2.5 cm) code scans comfortably from roughly 10 inches โ fine for a flyer or a business card. A billboard meant to be read from 30 feet needs a code around 3 feet wide. Undersize it and no amount of error correction saves you.
A practical floor for anything handheld is about 0.8 inch (2 cm) per side. Smaller than that and cheap phone cameras struggle, especially in poor light.
Contrast matters as much as size. Scanners expect dark modules on a light background. Stick to that:
- Dark code, light background. Black on white is the safe default.
- Avoid inverted codes (light on dark). Many scanners are built to reject them, and support is inconsistent across phones.
- Skip low-contrast color pairs โ grey on beige, pastel on pastel. If you must brand it, keep the modules clearly darker than the background.
- Watch reflective stock. Glossy laminate and metallic ink throw glare that blinds the camera.
Static vs dynamic codes
This is where people get burned. A static QR code encodes the destination directly โ the URL is literally baked into the pattern. It works forever, needs no service, tracks nothing, and can never be changed. If you print example.com/oldpage on 10,000 flyers and later move that page, every code is dead.
A dynamic QR code encodes a short redirect URL that points to a server you control, and that server forwards to the real destination. You can change where it points after printing, and you get scan analytics. The catch: the code depends on that redirect service staying alive. If the provider folds, you stop paying, or the short domain lapses, every code you printed breaks โ and you can't patch printed paper.
Rule of thumb: static for anything you want to last indefinitely with no dependencies (a Wi-Fi password on a wall, a permanent link, a contact card). Dynamic only when you genuinely need editability or tracking and you trust the provider to stick around. A plain static code from everyboringtool.com's QR Code Generator is built entirely in your browser โ nothing is uploaded, no account โ so the code is yours with no third party in the loop and nothing to expire.
When this isn't the right approach
QR codes are a poor fit in a few spots, and it's worth being honest about them. They need a camera and usually a data connection, so they exclude anyone without a smartphone. They fail where people can't physically aim a phone โ a code at the bottom of a TV ad that flashes for two seconds, or on a highway sign, is decoration, not a link. And a bare code with no "Scan for the menu" style prompt gets ignored; people need a reason to lift their phone.
The one rule that saves you, every time: scan-test before you print at scale. Generate the code, then actually scan it with at least two different phones โ one iPhone, one Android โ using the plain built-in camera app, not a special reader. Test at the real size, on the real material, under the real lighting. A code that scans crisply on your monitor can fail on matte cardstock under warehouse fluorescents. Ten seconds of testing beats reprinting 10,000 flyers.