You can recolour a QR code. Plenty of brands do, and it looks far better on a menu or a poster than a default black square. But there is a rule underneath it, and once you know the rule the whole thing stops being guesswork.

The rule is brightness, not hue

A scanner does not see colour the way you do. It converts the image to greyscale and looks for the boundary between dark and light. So what matters is not whether your code is teal or navy or maroon — it is how far apart the two colours are in brightness.

That gap is measured as a contrast ratio. Below about 3:1 the modules stop being reliably distinguishable, and our generator warns you.

Real numbers

Here is what common colours actually measure against a white background:

ColourContrast on whiteVerdict
Pure black #00000021.0:1Perfect
Default slate #1f293714.7:1Excellent, and softer than pure black
Strong blue #1d4ed86.7:1Safe
Dark red #b91c1c6.5:1Safe
Teal #0f766e5.5:1Safe
Mid grey #6b72804.8:1Works, but no margin for bad printing
Light grey #9ca3af2.5:1Fails
Green #22c55e2.3:1Fails
Amber #f59e0b2.1:1Fails

The pattern is clear once you see it: bright, saturated colours fail. Amber and mid-green look strong to the eye but sit in the middle of the brightness range, which is exactly where a scanner cannot tell them from white.

If you love a bright brand colour, use the dark version of it for the code and keep the bright one for everything around it.

Never invert it

Light modules on a dark background is the other common failure. It reads fine to a human and breaks a large number of scanners, which assume dark-on-light and do not all try the reverse. Our generator warns when the foreground is lighter than the background, and you should take that warning seriously.

If your design is dark, do not invert the code — put a normal dark-on-light code inside a light panel on the dark layout.

Gradients, photos and transparency

  • Gradients across the modules are risky. If the light end of the gradient loses contrast against the background, half the code stops working. If you must, keep the whole gradient inside the safe range.
  • A photo behind the code almost never works. Somewhere in that photo there is a light patch behind a dark module.
  • Transparent backgrounds are fine, but remember the background becomes whatever you place it on. A transparent code dropped onto a mid-tone brand colour is a low-contrast code. Check the contrast against the actual surface.

Print changes the numbers

Everything above is measured on screen. Printing subtracts from your margin:

  • Ink spreads slightly on uncoated paper, thickening dark modules and narrowing light gaps
  • Coloured stock is not white, so your real background is whatever the paper is
  • Cheap CMYK printing shifts colour, and a colour that was marginal on screen can drift under the line
  • Glossy lamination adds glare, which effectively lowers contrast wherever the light hits

So treat 3:1 as the failure line, not the target. Aim for 7:1 or better on anything that will be printed, handled or read outdoors.

The safest brand-friendly approach

  1. Use your darkest brand colour for the modules
  2. Keep the background white or a very pale tint of your brand colour
  3. Put the colour and personality into the frame, the caption and the surrounding design, not the pattern
  4. Leave the quiet zone plain

This gets you a code that is unmistakably yours and still scans from across a room.

Check it before you commit

Change the colours in the generator and watch for the warning. Then print one at final size on the final paper and scan it in the light it will actually live in — a code that passes on a bright monitor can fail on beige stock under warm lighting.

If something is already failing, work through the seven-point checklist; colour is the first item on it for a reason.