How QR Codes Work & How to Make One That Scans
A QR code is just a compact way to hand a phone a short piece of text. Everything useful about them follows from that one fact.
What's actually inside a QR code
A QR code is a 2D barcode that encodes a string of text — most commonly a URL, but it can equally be plain text, a phone number, an email address, wifi credentials, or a contact card. The three large squares in the corners are position markers that let a scanner find and orient the code from any angle. The rest of the pattern is the encoded data plus error-correction data, laid out in a grid whose size grows with how much information you're storing.
That's the whole concept. A QR code doesn't "contain a website" — it contains the address of one, exactly as if you'd typed it. Everything a QR code can and can't do follows from this.
Static vs dynamic codes
Static
The destination is encoded directly into the pattern. Point it at https://example.com/menu and that URL is physically part of the code. It's free to generate, works forever, has no dependency on any service, and can't be tracked or edited. If the destination URL needs to change, you generate and print a new code.
Dynamic
The pattern encodes a short redirect URL (like qr.service.com/x7k2) that a third-party service resolves to your real destination. You can change where it points without reprinting, and the service records each scan (time, rough location, device). The tradeoffs: it usually costs money, the code stops working if the service goes down or the subscription lapses, and scan data flows through that third party.
Rule of thumb: use static for anything where the destination is stable — a website, a wifi password, a business card. Use dynamic only when you genuinely need to change the target after printing, or you need scan analytics.
Error correction, and the logo-in-the-middle question
QR codes build in redundancy so a partially obscured or damaged code still scans. The four levels recover approximately:
- L (Low): ~7% — densest, smallest code, least tolerant of damage
- M (Medium): ~15% — a common default
- Q (Quartile): ~25%
- H (High): ~30% — most tolerant, but the code has more squares packed into the same area
This is what makes a centre logo possible: if the logo covers less than the recovery percentage of the code's area, the error correction reconstructs the hidden data. For a logo overlay, level H (or at least Q) gives you the headroom. But higher error correction means a denser pattern, which is harder to scan when printed small — so don't reach for H unless you actually need the damage tolerance.
Making a code that reliably scans
- Keep the quiet zone. Leave a clear margin of at least four "modules" (the width of four small squares) of blank space on all sides. Text or graphics butting right up against the code break scanning.
- Dark on light, high contrast. Black on white is ideal. Coloured codes can work if the contrast is strong, but light-on-dark (inverted) codes fail on many scanners.
- Size for the scan distance. A rough guide: the code should be about 1/10th of the scanning distance in size — a code scanned from 1 metre away wants to be around 10cm across. On a screen or small print, bigger is safer.
- Shorter data = simpler code. A short URL encodes into a lower-density pattern that scans more easily than a long one. Use a URL shortener for the destination if the real link is long and messy.
- Test before you print in bulk. Scan the final artwork with two or three different phones, from the distance and lighting it'll actually be used in.
Generate a QR code now
ToolQiva's QR Code Generator creates static codes for any text or URL, in your browser, with no tracking and no expiry. For specific formats there are dedicated tools: URL QR Code, WiFi QR Code (share a network without reading out the password), and vCard QR Code (a scannable contact card).
Frequently asked questions
What is the difference between a static and a dynamic QR code?
A static QR code encodes the destination directly — the URL (or text, or wifi details) is literally in the pattern, and it can never change. A dynamic QR code encodes a short redirect link that points to a destination you can edit later without reprinting the code, usually via a paid service that also tracks scans. For a fixed URL that won't change, static is simpler, free, and has nothing that can break or expire.
What is QR code error correction?
Error correction adds redundant data so the code still scans even if part of it is dirty, damaged or covered — for example by a logo in the middle. There are four levels (L, M, Q, H) recovering roughly 7%, 15%, 25% and 30% of the code respectively. Higher levels make the code denser (more squares in the same space), which can make it harder to scan if printed small.
Why won't my QR code scan?
The usual causes: it's printed too small for the scanning distance, there isn't enough plain margin ("quiet zone") around it, the contrast is too low (light code on a busy or coloured background), it's distorted or blurry, or a logo overlay is too large for the error correction level used. QR codes need dark-on-light with clear space around them.
Do QR codes expire?
A static QR code never expires — it's just a pattern encoding fixed text, and it works forever as long as the destination it points to still exists. A dynamic QR code depends on the third-party service that hosts its redirect; if that service shuts down or you stop paying, the code stops working.