Skip to main content
You don’t choose your QR code’s size. Your data length chooses it for you. That is the whole of it, and almost every “our QR code won’t fit on the pack” conversation ends there once someone says it out loud. You cannot shrink a QR code past the point where a checkout scanner can read it, so if the symbol is too big for the label, the answer is not a smaller symbol. The answer is less data.

What a QR code actually is

A QR code is a grid of small squares. Each square is a module, and the width of one module is the X-dimension — the single number that connects the digital symbol to the physical world. The grid only comes in fixed sizes, called versions. Version 1 is 21 × 21 modules. Every version after that adds 4 rows and 4 columns: More characters need more modules. More modules mean a bigger grid. And because each module has a minimum printed width, a bigger grid means a physically bigger code. That chain is one-directional and it has no escape hatch:
Version is not a setting you turn up or down. It falls out of your character count and error correction level. A generator that lets you “pick version 2” is really telling you it will refuse data that doesn’t fit.

The size tables

For retail point-of-sale, GS1 General Specifications section 5.12.3 (symbol specification table 1) sets the permitted X-dimension range: Multiply the module count by the X-dimension and you get the printed size of the symbol.

Metric (authoritative)

Imperial (converted)

X-dimensions of 0.0156” / 0.0195” / 0.0390”.
Metric is authoritative. The GS1 specification is defined in millimetres. The inch figures above are converted and rounded, and they are derived from the millimetre sizes, not from the rounded inch X-dimensions — multiplying 49 modules by a rounded 0.0195” gives 0.96”, where the real answer is 0.95”. If you are specifying artwork for a US printer, give them the millimetre value and let their RIP do the conversion once.
These tables stop at version 8 deliberately. If a consumer-unit Digital Link URI needs more than 49 modules, the URI is wrong, not the packaging.

Add the quiet zone before you measure your label

Every figure above is the symbol only. A QR code also needs a quiet zone of 4 modules of clear space on all four sides, and nothing may intrude into it — not artwork, not a keyline, not the edge of the label. Four modules on each side means adding 8 × X-dimension to both width and height: So a version 3 symbol at the target X-dimension is 14.4 mm of code, but needs 18.4 mm of label.
This is why published GS1 sizing examples sometimes look larger than the table above. A 29-module version 3 code is often quoted as 14.65 mm minimum — that is 29 + 8 = 37 modules at 0.396 mm, the symbol with its quiet zone. Both numbers are right; check which one you are reading before you hand it to a designer.

What actually decides your version

Here is the same GTIN encoded at error correction level M, with different hosts and different amounts of extra data. Printed sizes are at the 0.495 mm target X-dimension, symbol only. Read the first row. The same GTIN, on a short host, is a version 2 code. On a long branded host it is version 3 — two millimetres wider before you have added a single attribute. That gap does not close further down the table; it compounds. This is the practical envelope for a consumer unit: version 2 to 4. If you are landing at 5 or higher, something in the URI is carrying data that does not need to be on the pack.

The knobs you actually have

Version is downstream. These are the inputs you control.

1. Host length

Every character in the domain is a character in the symbol. A GTIN-only Digital Link on an 8-character host encodes to version 2; the same GTIN on a 22-character host is version 3.

2. Uppercase your URI

QR has an alphanumeric encoding mode that packs 5.5 bits per character, against byte mode’s 8. It is uppercase-only — its character set is 0-9, A-Z, space, and $ % * + - . / :. A lowercase URI cannot use it. The same GTIN-only Digital Link:
Two millimetres, for a change that costs nothing. Hosts and schemes are case-insensitive, so nothing breaks.
Uppercasing is not a universal win — it only helps when it drops you across a version boundary, and it does not apply to every part of the URI. Lot (AI 10) and serial (AI 21) values are case-sensitive GS1 data and must never be case-folded. Uppercase the scheme, host, and path structure; leave the identifier values exactly as issued.

3. Watch the query string

Digital Link puts key qualifiers like lot and serial in the path, but data attributes like expiry date (AI 17) go in the query string. The ? and = characters are not in the alphanumeric character set, so adding a query string forces part of the symbol into byte mode:
That is a real cost, not a rounding error. Put on the code what a scanner needs to identify the item, and serve everything else from the resolver.

4. Error correction level

Higher error correction means more redundancy and fewer usable data bits, which pushes the version up. On a GTIN + 10-character lot + expiry: Level M is the sensible default for retail packaging: it tolerates real-world scuffing without the size penalty of Q or H. Drop to L only if you have measured the print quality you will actually get.

Two rules that are not about size, but will fail you anyway

Never design to the minimum. 0.396 mm is the floor at which a compliant scanner can read a perfectly printed symbol. Flexible film, gusseted pouches, curved bottles, and press variation all eat into that. Design at the 0.495 mm target or above, and treat the minimum as a limit you never approach on purpose. Placement, if it has to scan at checkout. The complete 2D symbol and its quiet zone should sit within a 50 mm (roughly 2”) radius of the centre of the linear barcode. That is a maximum radius, not a minimum separation — closer is fine, as long as both symbols keep their own quiet zones intact. See the GS1 2D barcodes at retail point-of-sale guideline for the full placement picture.

Where this leaves you

The number of characters in your resolver domain is a packaging decision. It gets made once, usually by someone who is not thinking about millimetres, and then it is printed on every unit you ship for the next several years. Closient’s resolver host is short on purpose. A GTIN-only Digital Link on GTIN.ONE encodes to version 2 where most branded hosts land on version 3, and that difference is real packaging area you get back — on the front of a small pack, it can be the difference between fitting and redesigning.

Printing QR labels

Build a print-ready label sheet and see the exact Digital Link that will be encoded.

Digital Link resolution

What happens after the scan, and why keeping data off the symbol costs you nothing.