# QR Code Best Practices: Size, Contrast, Error Correction, and Testing

A QR code that won't scan is worse than no QR code at all. Most failures come from a handful of avoidable mistakes: too small, too little contrast, too much data, or a logo that covers too much. These are the rules worth following.

## Error correction levels

QR codes include redundancy so they can still be read when partly damaged or covered. You choose how much when you generate the code:

- L (Low): recovers about 7% of the data. Smallest, simplest code.
- M (Medium): about 15%. A sensible default.
- Q (Quartile): about 25%.
- H (High): about 30%. Best if you place a logo in the middle or expect wear, but the code gets denser.

## Design rules that matter

- Quiet zone: keep a blank margin of at least four modules (the small squares) around the code. Cropping it is a top cause of scan failures.
- Contrast: dark code on a light background works best. Inverted (light on dark) is not supported by every scanner.
- Size: as a rule of thumb, keep printed codes at least about 2 by 2 cm, and make them larger if people scan from a distance (roughly one-tenth of the scanning distance).
- Less data means a simpler code. Use a short URL rather than a long one with tracking parameters.
- Don't stretch or distort; keep it square.

## Static vs dynamic QR codes

A static code stores the data itself, so it never expires and needs no service, but you can't change it after printing. A dynamic code stores a short redirect link that you can edit later, at the cost of depending on the service that hosts the redirect. For printed material you can't easily replace, consider a link you control that redirects to the current destination.

## Test before you print

1. Scan with at least two different phones and camera apps.
2. Test at the real size and distance, in the real lighting.
3. Print a proof on the actual material, since glossy or curved surfaces can hurt scanning.
4. Check where the code leads on mobile data, and make sure the page is mobile-friendly.

> **Keep it private**
>
> Codes can contain WiFi passwords or personal contact details. Generate them with a tool that runs in your browser so the content isn't sent to a server.

## Frequently asked questions

### What error correction level should I use?

Medium (M) is a good default. Use High (H) if you add a logo or expect the code to get scuffed.

### How big should a QR code be?

At least about 2 by 2 cm for close scanning, and larger for posters or signs viewed from further away.

### Can I put a logo in a QR code?

Yes, with a high error-correction level and a logo that covers only a small central area. Always test it afterwards.

### Do QR codes expire?

A static QR code never expires, since it holds the data directly. Dynamic codes depend on the service that hosts the redirect.

**Try it:** [QR Code Generator](https://qr.ilovekit.app) — free, runs in your browser, nothing is uploaded.

*Originally published at [ilovekit.app](https://ilovekit.app/blog/qr-code-best-practices).*
