Why Your QR Codes Are Bigger Than They Need To Be (And How To Shrink Them)
I was helping a buddy print some QR codes for an event last week. He had them slapped on little table tents, and half the time my phone just sat there squinting at it like it forgot how to read.
So we dug in. And it turns out the QR code was WAY denser than it needed to be. All those tiny squares packed in tight? Most of them didn’t need to be there.
The fix was almost silly. We changed a few lowercase letters to uppercase, and the code got noticeably simpler.
Have you ever run into a QR code that just refuses to scan? There’s a decent chance it’s doing this exact thing to itself.
Now on with the show. 😃
The thing nobody tells you about QR codes
A QR code doesn’t store your text the same way every time. It picks an encoding mode based on what characters you throw at it. And each mode packs characters at a totally different density.
Here are the three you actually care about:
- Numeric (just
0-9): about 3.33 bits per character - Alphanumeric (
0-9, UPPERCASEA-Z, space, and a handful of symbols like$ % * + - . / :): about 5.5 bits per character - Byte (anything else, including lowercase letters, most symbols, emojis): 8 bits per character
See the jump? The second you include a single lowercase letter, the QR code shrugs and switches the WHOLE thing to byte mode at 8 bits a pop.
Stick to uppercase and numbers, and it stays in alphanumeric mode at 5.5 bits. That’s roughly 30% less data for the exact same message.
Wait, why such weird numbers?
The cool thing is QR codes cheat a little to save space.
In alphanumeric mode there are 45 possible characters. Instead of storing them one at a time, it grabs two characters and packs them into 11 bits. Two characters, 11 bits, so 5.5 bits each.
Numeric mode cheats even harder: three digits crammed into 10 bits. That’s the 3.33.
You don’t have to do any of this math yourself. The encoder handles it. You just have to NOT sabotage it by tossing in a lowercase a.
The free win for URLs
Here’s where this actually pays off in real life.
Domain names don’t care about case. EXAMPLE.COM and example.com go to the same place. So if you’re encoding a link, you can uppercase the whole thing and the QR code gets simpler for FREE.
So instead of:
example.com/promo
Encode:
EXAMPLE.COM/PROMO
Same destination. Smaller code. Nothing lost.
And if you’re making your own short codes or IDs (invoice numbers, coupon codes, tracking IDs), design them as uppercase and digits from the start. Something like INV-2026-AX9 stays in the efficient lane. ⚡
Practical QR code tips I wish I’d known sooner
Once you fix the encoding thing, here are the other gotchas that bite people:
Keep the payload short. Less text equals a simpler code. Use a short link instead of a giant URL stuffed with tracking junk like ?utm_source=.... All that gunk bloats the code for no real benefit.
Leave the quiet zone alone. That blank margin around the code (about 4 squares wide) is not decoration. It’s how scanners find the edges. Crowding it with text or a border is the number one reason codes fail to scan.
Mind the error correction level. QR codes can survive damage because they store backup data. The levels are L, M, Q, and H (roughly 7% up to 30% recovery). Higher means tougher, but also denser.
- For a clean screen or a nice flyer, M is the sweet spot.
- Putting your logo in the middle? Use H. That’s literally why you can cover the center and still scan, the backup data fills in the gap.
Dark code, light background. Scanners expect this. Flip it to light-on-dark and a lot of phones just give up.
Don’t blow up a tiny image. Generate it at the final size, or use a vector (SVG) so it stays crisp. A blurry, upscaled QR code is a sad QR code.
Use a redirect link if the destination might ever change. Point the QR code at a short URL YOU control, then point that short URL wherever you want. Static codes bake the destination in forever. Wrong link on 5,000 printed flyers is an expensive lesson. Don’t ask me how I know. 😅
Test it for real. Different phones, iPhone and Android, in real lighting, at the actual size you’re printing. Thirty seconds of testing beats a reprint every single time.
Tell people why to scan. A naked QR code gets ignored. “Scan for the menu” or “Scan for 20% off” gets scanned. Give folks a reason.
One quick heads-up on safety
QR codes hide where they’re sending you, which makes them a favorite trick for scammers (people call it “quishing” now).
The takeaway
QR codes feel like magic, but they’re really just following a few simple rules. Learn the rules and you can make them smaller, cleaner, and far more reliable, with almost no extra effort.
Uppercase plus numbers equals alphanumeric mode equals less data equals a code that actually scans on the first try.
It’s a tiny tweak. But tiny tweaks that save time and prevent headaches? That’s pretty much my whole thing. 🤖
How about you? Next time you make a QR code, try uppercasing the link and see how much simpler it gets. Then go scan it from across the room just to feel good about yourself.

