Generators

How to Make a QR Code That Actually Scans, Every Time

7 min read

A QR code fails to scan for one of three reasons: the input data is too long and packs the pattern too densely, the printed or displayed version has poor contrast or no white margin around it, or the error-correction level does not match how the code will be used. All three are fixable before you ever hit print.

Why shorter input makes a simpler code

A QR code does not store a picture of your link. It stores the actual characters of whatever you encode, mapped into a grid of black and white modules. The more characters you feed in, the more modules the code needs to hold them, and the finer that grid has to become to fit on the same physical size.

A long tracking URL like https://analytics.example.com/campaign/summer-2026/promo?utm_source=instagram&utm_medium=social&utm_campaign=launch&ref=abc123xyz789 produces a visibly denser, more intricate QR code than a short redirect like https://pluri.tools/go/summer. Both can point to the same destination, but the short version needs far fewer modules to encode it.

Denser modules mean smaller individual squares for a given print size, and smaller squares are more sensitive to blur, printer resolution, low light, and the angle a phone camera is held at. A camera that reads a 200-character URL cleanly at arm’s length might need to move in close and hold still for the same code shrunk onto a business card. If you control the destination, route through a short URL on your own domain instead of pasting the full tracking string. It scans faster and the code looks cleaner on the page.

The error-correction tradeoff

Every QR code includes redundant data on top of the actual content, so a scanner can still read it even if part of the code is dirty, torn, or covered. That redundancy comes in four standard levels, and the level you pick changes how the code looks and behaves.

LevelDamage toleranceBest use case
L (Low)~7%Clean digital use: screens, slides, emails, anywhere the code has no risk of dirt or physical damage
M (Medium)~15%General purpose. The default most generators ship with
Q (Quartile)~25%Printed codes that get handled, placed outdoors, or exposed to wear
H (High)~30%Any code with a logo or icon overlaid on the middle, since the logo blocks part of the data and the code must tolerate the loss

The mechanism is simple: more error correction means more redundant data encoded alongside your content, and that redundant data takes up modules just like your actual text does. For the same input, a High-correction code is visually denser than a Low-correction code. It is not the same code made safer. It is a busier pattern squeezed into the same space.

This is where people over-correct. A long URL encoded at High “just to be safe” produces a dense, fussy pattern that is harder for a camera to resolve, not easier. If the code is going straight onto a phone screen or a webpage where nothing will ever scratch it, Low or Medium is the right call, and it keeps the pattern simple even with a longer string. Save High for the one case it actually solves: a logo sitting in the middle of the code. Save Quartile for a sticker on a delivery box that will get scuffed in transit. Match the level to how the code will actually be handled, not to the highest number on the list.

Make your own QR code

Paste a URL, adjust the size and colors, and download the result. The generator below runs entirely in your browser:

QR Code Generator
Free, no sign-up, works on any device.
Open the full tool

Common mistakes that break scans

Pasting a long tracking URL instead of a short link. Analytics platforms generate URLs with a dozen query parameters attached. Every one of those characters adds density to the code. Route through a short redirect you control and keep the tracking parameters on the server side of that redirect.

Low contrast or no quiet zone. Scanners rely on a clear white margin, the quiet zone, around the outer edge of the code to know where the pattern starts and stops. Dropping the code directly against a busy background, or trimming the margin to fit a tight design, breaks that detection. Keep at least four modules of plain background on all four sides, and use a clear light/dark contrast rather than two mid-tone colors a camera struggles to tell apart.

Skipping a real-device scan test before printing. A code that renders fine on a monitor can still fail once it is shrunk onto packaging, printed at low DPI, or laminated behind a glossy finish that throws glare. Print a sample at the actual size and material, then test it with two or three different phones and scanner apps before committing to a full print run.

Using a URL shortener you don’t control. A generic third-party shortener can go offline, get repurposed, or start injecting ads years after you printed thousands of codes pointing at it. A redirect on your own domain stays under your control indefinitely, and you can update where it points without reprinting anything.

Assuming every scanner handles WiFi or contact-card QR types like a URL. Plain URL codes are universally supported by every phone camera and scanner app. WiFi network codes and vCard contact codes use a different data format, and support varies more by device and app version. If the audience matters, test the specific QR type on the actual devices people will use, not just a generic phone camera app.

Frequently asked questions

Do QR codes expire? The code itself never expires. A static code, one where the destination text is baked directly into the pattern, works as long as the physical code is legible. A dynamic or trackable code points to a redirect URL you manage, and that redirect can stop working if you cancel the service behind it or let a domain lapse. If you need the code to work indefinitely, host the redirect somewhere you control.

What is the minimum print size for reliable scanning? A rough rule is that the code should be at least a tenth of the expected scanning distance. A code scanned from about 12 inches away needs to be roughly 1.2 inches per side at minimum, and more if the input data is long enough to require a dense pattern. Business cards, flyers meant to be scanned up close, and billboards meant to be scanned from a car all need very different physical sizes for the same underlying data.

Can I safely add a logo to the middle of my QR code? Yes, if you set the error-correction level to High before adding it. High tolerates roughly 30% of the code being obscured or damaged, which covers a modestly sized logo placed in the center. Keep the logo small relative to the whole code, usually under 20 to 25% of the total area, and always test the result on a real device afterward since logo placement varies by generator.

What’s the difference between a static and a dynamic QR code? A static code encodes the final destination directly and never changes. A dynamic code encodes a short redirect URL that you control on a server, and you can update where that redirect points after the code is already printed. Dynamic codes also let you track scan counts, which static codes cannot do on their own. The tradeoff is that a dynamic code depends on your redirect service staying online.

Why does my QR code look different every time I change the color? Contrast, not color choice, is what a scanner reads. Two colors that look distinct to a human eye can register as nearly identical brightness to a camera sensor, which breaks the scan. Stick to combinations with strong brightness contrast, ideally a dark foreground on a light background, and check the result with an actual scan test rather than judging by eye on a screen.

QR Code Generator
Now try it yourself with the full tool.
Try it now