How Much Data Fits in a QR Code
The headline figure is 2,953 bytes. It is also almost useless, because it applies to one enormous symbol at the weakest error correction — and because what you encode changes the answer as much as how much of it you encode.
Four ways to encode the same characters
QR codes do not store text as text. The encoder picks a mode, and the mode decides how many bits each character costs.
| Mode | Character set | Bits per character | Max at version 40-L |
|---|---|---|---|
| Numeric | 0–9 only | 3⅓ | 7,089 digits |
| Alphanumeric | 0–9, A–Z, space, $ % * + - . / : | 5½ | 4,296 characters |
| Byte | Anything, usually UTF-8 | 8 | 2,953 bytes |
| Kanji | Shift-JIS double-byte | 13 | 1,817 characters |
The consequence is immediate and often surprising: PROMO2026 is nine alphanumeric characters and costs about 50 bits. promo2026 is nine characters too, but lowercase letters are not in the alphanumeric set, so the whole string falls back to byte mode and costs 72 bits — 44% more, for the same nine characters.
Numeric mode is more dramatic still. A 16-digit reference costs about 54 bits as digits and 128 bits as bytes.
The real numbers
Capacity in bytes, for the version and level you choose. These figures were measured by binary search against a reference encoder for this article, not transcribed.
| Version | Modules | Bytes at L | Bytes at M | Bytes at Q | Bytes at H |
|---|---|---|---|---|---|
| 1 | 21 × 21 | 17 | 14 | 11 | 7 |
| 2 | 25 × 25 | 32 | 26 | 20 | 14 |
| 3 | 29 × 29 | 53 | 42 | 32 | 24 |
| 4 | 33 × 33 | 78 | 62 | 46 | 34 |
| 5 | 37 × 37 | 106 | 84 | 60 | 44 |
| 6 | 41 × 41 | 134 | 106 | 74 | 58 |
| 7 | 45 × 45 | 154 | 122 | 86 | 64 |
| 8 | 49 × 49 | 192 | 152 | 108 | 84 |
| 9 | 53 × 53 | 230 | 180 | 130 | 98 |
| 10 | 57 × 57 | 271 | 213 | 151 | 119 |
| 15 | 77 × 77 | 520 | 412 | 292 | 220 |
| 20 | 97 × 97 | 858 | 666 | 482 | 382 |
| 25 | 117 × 117 | 1,273 | 997 | 715 | 535 |
| 30 | 137 × 137 | 1,732 | 1,370 | 982 | 742 |
| 40 | 177 × 177 | 2,953 | 2,331 | 1,663 | 1,273 |
Two patterns are worth reading out of that table.
The first is how brutal the small end is. A version 1 code at level H holds seven bytes. Not seven characters of a sentence — seven. Version 2 at H holds fourteen. The overhead of the finder patterns, timing, format information and error correction dominates completely at that size.
The second is that the cost of error correction is roughly constant in proportion but enormous in absolute terms at the top: at version 40, choosing H instead of L costs you 1,680 bytes.
What that means for a URL
Most codes carry a URL, so here is the table people actually need — the smallest symbol that will hold a link of a given length at each level.
| URL length | At level L | At level M | At level Q | At level H |
|---|---|---|---|---|
| 20 chars | v2 · 25×25 | v2 · 25×25 | v2 · 25×25 | v3 · 29×29 |
| 30 chars | v2 · 25×25 | v3 · 29×29 | v3 · 29×29 | v4 · 33×33 |
| 50 chars | v3 · 29×29 | v4 · 33×33 | v5 · 37×37 | v6 · 41×41 |
| 80 chars | v5 · 37×37 | v5 · 37×37 | v7 · 45×45 | v8 · 49×49 |
| 120 chars | v6 · 41×41 | v7 · 45×45 | v9 · 53×53 | v11 · 61×61 |
| 200 chars | v9 · 53×53 | v10 · 57×57 | v12 · 65×65 | v15 · 77×77 |
Read down the last column and the cost of long tracking URLs becomes concrete: a 20-character link at level H needs a 29×29 grid, a 200-character one needs 77×77. Printed at the same width, every module in the second code is 38% of the size of the first, and module size is what decides whether a phone can read it at all — see how small a QR code can be.
Mixed content and mode switching
An encoder can switch modes inside one symbol, and a good one will. HTTPS://EXAMPLE.COM/A1B2C3 is entirely inside the alphanumeric set and encodes efficiently; https://example.com/a1b2c3 is not, and costs more.
There is a subtlety here worth knowing about. Each mode switch carries its own header, so a string that alternates constantly — digits, letters, digits, letters — can end up larger than the same string encoded in one mode throughout. Encoders run an optimisation to decide where switching pays; this is one of the places where two generators produce genuinely different-sized codes from identical input.
For the specific structured formats, the string you encode is fixed by a standard rather than by you: the WiFi format and the vCard format both have their own rules about what has to be present.
Making a long payload fit
In order of how much they help:
- Shorten the URL. A redirect at your own domain is the single biggest win:
example.com/minstead ofexample.com/menu/2026/spring/dinner?utm_source=table-card. - Move the tracking into the path.
/t/menubeats a query string, and your analytics can still read it. - Drop a level of error correction if the code lives somewhere clean — a screen, a menu inside a plastic sleeve, an indoor sign.
- Uppercase any identifier that is not case-sensitive, to reach alphanumeric mode.
- Do not encode a document. A vCard with a photograph, or a whole menu as text, will produce a symbol so dense that no phone will read it at a sensible size. Encode a link to the thing.
The last one is the mistake worth naming twice. A QR code is an address, not a container. When people ask why their code is a solid grey rectangle, the answer is almost always that they put the content inside it instead of pointing at it.
Written by Manuel Llovet, who builds and maintains QR Code Free Forever. Published 2026-08-31, last checked 2026-09-08. Figures and measurements on this page were produced for this site; the method is described in each caption.