Two places a logo can go
Most generators offer one. FigQR offers both, and the difference is not cosmetic.
- In the middle. The familiar one. A square is cleared in the centre of the pattern and your logo sits in it. Modules are genuinely removed, so the code has to survive with a hole in it.
- Behind the whole code. Your logo fills the code and the pattern is drawn on top of it. Nothing is removed. The picture shows through the gaps between the modules.
The first is safe and the second is striking. If you are printing something you cannot reprint, use the first.
Does a logo break the code?
A QR code carries redundant data so it can still be read when part of it is dirty, creased or covered. That redundancy is error correction, and it comes in four levels:
- L recovers about 7% of the code
- M about 15%
- Q about 25%
- H about 30%
A logo in the middle is damage you inflicted deliberately. The scanner cannot tell the difference between your mark and a coffee stain, so the modules underneath it have to be reconstructed from the redundancy. FigQR moves to H automatically as soon as a logo is added, which is why the code gets a little denser when you drop one in. That density is the price of the logo, and it is worth paying.
If you set the level by hand and leave a logo in place, the generator warns you. It is the one setting where overriding the default reliably produces a code that looks fine and fails on a phone.
How big the logo can be
The middle placement is capped at 28% of the code's width. The cap is arithmetic rather than caution. H recovers around 30%, and a mark covering more than about a quarter of the code leaves less redundancy than the damage requires, whatever level you choose. Sliding past the cap would produce codes that scan on the screen you designed them on and nowhere else.
In practice 15% to 20% is the sweet spot. The logo is clearly visible, the code keeps a margin for real-world damage, and the pattern does not have to grow to accommodate it.
Putting the logo behind the code
This one works differently and it is worth understanding, because the settings only make sense once you know the mechanic.
A QR code is dark modules and light ones. The light ones normally show the paper. Here they are painted in the paper colour instead, and your logo is placed underneath everything. The picture then appears in the gaps between the painted modules. Nothing is cut out, so no error correction is spent and there is no hole for the code to survive.
Two controls follow from that:
- Logo size sets how much of the code the picture spans, from 30% up to the full width.
- How much of the logo shows shrinks the light modules. Smaller light modules mean wider gaps and more picture. This is the real contrast control, and turning it up is what eventually breaks the code.
Why only some module shapes are offered
Switch the placement to behind and the shape list shortens to 10. That is not an arbitrary restriction. The picture can only appear in the space between modules, so a shape that fills its cell leaves no space at all. The default square shows less than half a percent of the image, which is a blank code with a slower render.
The shapes that remain are the ones that genuinely leave room: small dots, small squares, vertical and horizontal bars, diamonds, stars and hearts. If your current shape is not one of them, the generator moves you to the nearest offered one and tells you it did.
Colour decides more than size does
This is the part nobody publishes, and it is the single most useful thing on this page.
A scanner reads a QR code by deciding, for every point, whether it is dark or light. Your logo sits in the middle of that decision. A logo in one strong colour close to the code's ink reads as the same side of the threshold as the modules around it, and the code stays legible. A logo in mid-tone colours lands halfway between the ink and the paper, and every light cell becomes ambiguous.
We measured this against finished images rather than bare codes. A single-colour mark inked in the code's own colour decoded across a wide band of settings. The same code carrying a four-colour brand mark passed at exactly one combination out of fifty-four, and that one flipped depending on which JPEG encoder wrote the file.
So if you want a logo behind the code and you want it to work: use one colour, make it dark, and keep it clear of the three big squares in the corners. Those are the finder patterns and they are what a scanner locks onto first. Pulling the logo in to about 80% of the width leaves them alone and is usually the difference between a code that reads and one that does not.
Testing it before you print
FigQR decodes the preview in your browser after every change, so a warning appears the moment a choice breaks the code. Take it seriously. It is the same check a scanner performs and it is stricter than a phone, which means a warning is a reason to look rather than proof of failure.
Before anything goes to print:
- Scan it off your screen with a phone, at the distance people will actually use.
- Scan it again after printing, on the real material.
- Try a second phone. That separates a marginal code from an unusual camera.
Download the SVG for anything printed, since it stays sharp at any size. PDF and EPS are there for print shops, and the PNG is for screens.
If it does not scan
- Shrink the logo. The first thing to try, and it fixes most cases on its own.
- Check the error correction level. With a logo it should be H. If you set it by hand, set it back.
- Raise the contrast. A pale logo on a pale background is the usual culprit, and it looks fine on screen right up until it does not work.
- Move the logo off the corners. The three corner squares are how a scanner finds the code at all.
- Print it larger. A code with a logo carries the same data in a denser pattern, so it needs more width than a plain one.