How QR Codes Work: Error Correction and Data Explained
Look under the hood of a QR code: how data is encoded, how error correction lets damaged codes still scan, and what the version and mask really mean.
Published January 14, 2026 · LinkQRPro
A QR code looks like random noise, but every square is deliberate. Understanding the structure helps you make codes that scan reliably — especially when you add a logo or print at a small size.
Encoding: turning content into modules
When you enter text or a URL, the encoder converts it into binary and arranges it into the grid of black and white squares called modules. QR codes support several encoding modes — numeric, alphanumeric, byte and kanji — and pick the most efficient one for your content. Shorter, simpler content produces a smaller, denser-looking pattern that is easier to scan.
Versions and size
QR codes come in 40 “versions,” from Version 1 (21×21 modules) up to Version 40 (177×177 modules). The more data you store, the higher the version and the more modules appear. That is why a code holding a long paragraph looks far busier than one holding a short link.
Error correction: why damaged codes still work
QR codes use Reed–Solomon error correction, which adds redundant data so a code can be read even if part of it is missing or obscured. There are four levels:
- Level L (Low) — recovers about 7% of data. Densest, least resilient.
- Level M (Medium) — about 15%. A good default for screens and clean prints.
- Level Q (Quartile) — about 25%. A solid choice for real-world use.
- Level H (High) — about 30%. Best when adding a logo or printing on rough surfaces.
This redundancy is exactly what lets you place a logo in the center of a QR code: the scanner reconstructs the covered data from the surrounding modules. The trade-off is that higher error correction makes the code denser, so balance resilience against size.
Masking and the quiet zone
Encoders apply a “mask” pattern to avoid large blank areas or misleading shapes that could confuse a scanner, choosing whichever mask gives the most even distribution. Around every code sits the quiet zone — a blank margin at least four modules wide. Cropping it too tightly is one of the most common reasons a code fails to scan.
When you generate a code with LinkQRPro, you control the error-correction level and the margin directly, so you can tune both resilience and scannability for your use case.