How to make a QR code that scans reliably
Most QR codes that fail to scan fail for the same few reasons. Here is how to avoid them.
A QR code is a pattern of small squares called modules. A phone camera has to see the pattern clearly, find its three corner markers and read it fast. Anything that makes the pattern harder to see makes scanning slower or fail. These are the things worth getting right.
1. Start with a short link
The more characters a code holds, the more modules it needs, and the smaller each one is at a given print size. A short link keeps the pattern simple and bold. A long web address with tracking parameters produces a dense pattern that needs more size and better print quality. Point the code at a short link and put the long address behind it.
2. Keep the contrast high
- Use dark modules on a light background. Black on white is the safest choice.
- Avoid inverted codes (light on dark) unless you have tested them. Some scanners struggle with them.
- Keep the background behind the code a single, solid color. Gradients, photos and patterns behind a code cause failures.
- If you use brand colors, make sure the dark color is dark enough and the light color is light enough.
3. Leave empty space around it
The blank border around a code is called the quiet zone. The common guidance is to leave at least four modules of empty space on every side. Don't let text, borders, folds or edges run into the code.
4. Choose the right size
A commonly quoted minimum is about 2 cm (0.8 in) across for a code scanned at arm's length, and bigger for anything scanned from further away. A handy rule of thumb is that the code should be roughly one tenth of the scanning distance. A code on a poster read from 2 meters away should be around 20 cm. Denser codes need more room, which is another reason to use a short link.
| Where it's scanned | Typical scan distance | Starting size |
|---|---|---|
| Business card, small label | 15–30 cm | 2–3 cm |
| Table tent, flyer, packaging | 30–60 cm | 3–4 cm |
| Poster, window | 1–2 m | 10–20 cm |
These are starting points, not guarantees. Always test at the final size.
5. Pick an error correction level
QR codes can include extra data so they still work when part of the code is damaged or covered. There are four levels, from L (about 7% recoverable) to H (about 30%). Higher levels make a denser code. A medium level is a sensible default for clean print. Use a high level if you add a logo, or if the code may get scuffed or dirty, and make it a little larger to compensate.
6. Be careful with logos and styling
- Keep a logo small. It covers part of the code, so it needs a high error correction level and plenty of margin.
- Keep the three corner markers clearly visible and don't distort them.
- Rounded or fancy module shapes are fine for many scanners, but test them. Plain squares are the most reliable.
7. Test before you print
Before a print run:
[ ] Scan the code on screen from a normal distance
[ ] Print a proof at the final size on the real material
[ ] Scan the proof with at least two different phones (iPhone and Android)
[ ] Scan in dim light and in bright light
[ ] Scan it from the real distance it will be used at
[ ] Open the link and check the page loads quickly on mobile data
[ ] Check the destination is the right pageCommon mistakes
- Stretching the code so the squares aren't square.
- Putting the code on a curved, glossy or crinkled surface without testing it.
- Making the code too small for the distance.
- Sending people to a page that isn't mobile-friendly.
- No call to action. Tell people what they'll get when they scan, for example “Scan for the menu.”
Every link you create in Qodeveo comes with its own QR code, and you can set its colors and size. Learn more about links and QR codes, or read the guide to QR codes on packaging.
This guide gives general practical advice based on common industry practice. Results depend on your print method, materials and scanners, so always test a proof before a print run.
1,000 New Links. 1,000 QR Codes. Every Month.
Every short link includes its own QR code, with a custom domain, team collaboration, smart regional routing and developer automation on one simple price.
