What a QR code is made of
A QR code is a grid of dark and light squares called modules. The grid comes in 40 sizes, called versions: Denso Wave, the company behind the QR Code, lists Version 1 at 21 × 21 modules up to Version 40 at 177 × 177, with each version adding 4 modules per side. You do not pick the version here. The generator picks the smallest one your link fits in, and shows it under the preview.
Shorter links make smaller grids, and a smaller grid has bigger modules at the same printed size, which is easier for a phone to read from across a room. So keep the link tight. UTM tags add length, which is why the tags here use short lowercase values.
Error correction: L, M, Q or H
QR codes carry spare data so a phone can still read one that is scuffed, folded or partly covered. Denso Wave’s error correction page lists four levels, restoring about 7% (L), 15% (M), 25% (Q) and 30% (H) of the code. Raising the level also makes the code bigger. The same page says Level M is the one most often picked, Q or H suit places where codes get dirty, and L suits clean settings with a lot of data.
A practical way to use that: M for a flyer or a menu, Q or H for packaging that gets handled or a sticker that lives outdoors, L only when a long link will not fit any other way.
Leave the margin alone
The empty border around a code is part of the code. Denso Wave’s guide to code size says: “QR Code requires a four-module wide margin at all sides of a symbol.” That is why the margin here starts at 4. The same page works an example: at 0.254 mm per module, a Version 3 code is 29 modules, 7.366 mm across, and 9.398 mm with the margin added. The tool lets you go below 4 for a design that already has white space around it, and warns you when you do.
Colours and contrast
Brand colours work as long as the code stays clearly darker than its background. The tool measures the contrast ratio with the WCAG formula and flags anything under 4:1. That line is our own cautious rule, not a number from the QR standard, which is why the only real test is a scan. It also warns when the code is lighter than the background (a reversed code), because scanners are built around dark on light and reading the reverse is an extra step some decoders skip. Test every printed code on a few different phones.
UTM tags, so a scan is not just “direct”
A scan arrives with no referring page, so without tags your analytics has nothing to say it came from a flyer. Tick the UTM box and the generator adds the tags to your link before it is encoded, using the same rules as our UTM link builder: it keeps any parameters already in the address, replaces old UTM values, and keeps a #section anchor at the end. Google Analytics says to always use utm_source, utm_medium and utm_campaign, and that values are case sensitive, so the tool lowercases them.
Use utm_content to tell placements apart: table-tent-a and table-tent-b, or box-insert and shipping-label. One campaign, one code per placement, and the report shows which one people scanned.
PNG or SVG
The PNG is drawn with whole pixels per module, so every edge is sharp. Its final size is the nearest multiple of the grid that fits your number, and the tool prints the exact size. The SVG is a vector: it scales to a billboard or a business card without blurring, and it is the one to send to a printer or drop into a design file.
What this tool does not do
It does not shorten links, track scans itself or let you change where a code points after printing. Those “dynamic” codes need a server in the middle, and this page has none: your code holds your link directly, so it keeps working as long as the page it points to does. It does not add logos in the middle of the code, and it does not check that the link loads. Scan the downloaded file with your own phone before anything goes to print.
If you would rather not do this by hand
Hermoso is marketing on autopilot: it researches the ads already working in your market, makes on-brand image and video ads, schedules the posts and runs paid campaigns on your own ad accounts. It works in the web app, or inside Claude, ChatGPT and Cursor through its MCP server.
Free tools: UTM link builder · ·
Frequently asked questions
Do these QR codes expire?
No. They are static codes: the link is stored in the code itself, with no redirect service in between. The code works for as long as the page it points to exists.
Which error correction level should I use?
Denso Wave, the company behind the QR Code, says Level M (about 15% restoration) is the one most often picked, Q or H suit codes that get dirty, and L suits clean settings with a lot of data. Higher levels make a bigger code.
How big should the white border be?
Four modules on every side. Denso Wave states that QR Code requires a four-module wide margin at all sides of a symbol, so the margin here starts at 4.
How do I track scans from a flyer or package?
Tick the UTM box and fill in source, medium and campaign. The tags are added to your link before it is encoded, so each scan arrives in Google Analytics with those labels. Use utm_content to tell placements apart.
Can I make a coloured QR code?
Yes. Keep the code clearly darker than the background. The tool warns when the contrast is low or the colours are reversed, and you should scan a printed proof on a few phones.
Is anything I type sent anywhere?
No. The code is drawn in your browser. Nothing is uploaded or stored, and reloading the page clears it.
Hermoso makes the ads, schedules the posts and runs the campaigns. Start free, 250+ earnable free credits, no card.
Start free → See pricing