The Square That's Lying To You
You're holding a conference lanyard, phone out, scanning the QR code on the back of someone's business card. It pops open a full contact record: name, two phone numbers, an email, a postal address, a LinkedIn handle, a little note about preferred pronouns. Then you scan the code on the event poster behind you. Just a URL. Seven characters.
Both squares are roughly the same size. You'd be forgiven for thinking the contact card one must be denser, somehow more compressed. It isn't. It just made smarter decisions before anyone hit print.
Capacity isn't fixed by physical dimensions. It's determined by three interlocking choices made at the moment of creation: the version number, the error correction level, and the encoding mode. Change any one of those and you can squeeze dramatically more, or far less, into the exact same printed square.
Versions Are Grid Sizes, Not Software Updates
A QR code's "version" has nothing to do with software. It's the grid.
Version 1 is a 21×21 module grid. Version 40, the largest in the standard, is a 177×177 grid. Each step up adds four rows and four columns, giving you 40 possible sizes, each storing progressively more data.
Here's where the visual confusion kicks in. A printer or screen can scale any version to any physical size, so a version 1 code can be printed large and a version 20 code can be printed small. What your eyes see is the physical rendering. What matters for capacity is the underlying grid count, and those are completely independent.
A version 1 code at its most generous holds 41 characters. A version 40 code at its most generous holds 7,089 numerical digits, or 4,296 alphanumeric characters, or 2,953 bytes of raw binary data. That's not a rounding difference. That's the gap between a locker combination and a short novel.
So when two codes look the same size but hold different amounts, one of them is almost certainly a higher version, printed small.
The Error Correction Tax
This is where most people's intuition collapses entirely.
QR codes are designed to survive damage: dirt, a crease, a coffee splash on the corner. To pull that off, they embed redundant data using Reed-Solomon error correction. The standard offers four levels, L, M, Q, and H. Level L recovers from about 7% data loss. Level H can reconstruct the full code even if 30% of it is obliterated.
Redundancy costs space. Every module devoted to error correction is a module not devoted to your actual content. A version 5 code using Level L can encode 106 alphanumeric characters. The same version 5 code using Level H can only encode 47. Same grid. Same physical size. Less than half the usable capacity.
Think of it like packing a suitcase where half the clothes are duplicates in case the originals get lost. You're still carrying one bag. It's just mostly backups.
The practical upshot is real. A QR code printed on a crisp white business card that will never leave a wallet can safely use Level L and carry almost twice the data of an identical-looking code printed on a warehouse box that will get wet, scuffed, and partially covered by a sticker. Same dimensions. Very different tradeoffs, and only one of them was made consciously.
The Encoding Mode Nobody Thinks About
Assume you've settled on a version and an error correction level. There's still one more lever: encoding mode.
QR codes have four modes, each optimised for a different kind of content. Numeric mode is the most efficient, packing three digits into roughly 10 bits because it only needs to represent 0 through 9. Alphanumeric mode handles digits plus uppercase letters plus a handful of symbols, and it's less efficient. Byte mode handles any character in the standard Latin-1 set, less efficient still. Kanji mode is optimised for Japanese double-byte characters.
Here's the concrete version. Take a version 3 code at Level M. In numeric mode it holds 77 digits. Switch to alphanumeric and it drops to 47 characters. Switch to byte mode and you're down to 32. Same version, same error correction, three completely different capacities.
This is why a QR code pointing to `HTTP://EXAMPLE.COM/A1B2` can actually be stored more efficiently than one pointing to `http://example.com/a1b2`. The all-caps version qualifies for alphanumeric mode. The mixed-case version forces byte mode. Many QR generators quietly uppercase URLs for exactly this reason, and honestly, they should.
Two Phones, One Poster, One Obvious Winner
Imagine two people designing QR codes for a conference poster. Both want to encode a WiFi password, a website URL, and a short event description. Together that's about 200 characters.
Sara uses an online generator with default settings: version auto-selected, Level M error correction, byte mode because her text has mixed case and punctuation. The generator lands on version 7, producing a 45×45 module grid. It works fine.
Dan uses a generator that lets him tweak settings. He uppercases everything he can, switches to Level L since the poster is professionally printed and laminated, and the generator drops to version 5, a 37×37 grid. Printed at the same physical size as Sara's, Dan's modules are bigger and easier for a struggling camera to read. The code encoding the same information is actually more scannable because it made room.
If you've found your own QR generator that shows you the version number it selected, anything below version 10 for a standard URL is a good sign you're not wasting capacity.
What People Consistently Misread
The widespread assumption is that a dense, busy-looking QR code must hold more data. Not necessarily. A visually complex code might just be a lower version with high error correction, generating a lot of redundancy pattern in a small grid. A cleaner-looking code at a higher version might actually hold more. Looks are close to useless as a signal here.
The logo-in-the-middle trend is the same logic made decorative. Placing a brand logo over the center of a QR code deliberately destroys data, which is fine only because the error correction is set high enough to reconstruct it. You're trading usable capacity for aesthetics. The code isn't broken. It's just working harder than it needs to, which is a reasonable description of most branding decisions.
The QR standard is genuinely clever engineering, built with enough variables that two identical-looking squares can have wildly different stories underneath. The one that looks simpler might be doing more. Usually, it is.