Free tool
Links, WiFi, contact cards, social profiles and messenger chats, with your own logo, colours and gradients. PNG or SVG, no account, nothing uploaded to a server. Every code this page produces is static, which means the destination is frozen the second you download it.
What should the code do?
No scheme? We will add https:// for you.
Just the handle, with no @ and no full address. The link is built for you.
Telegram, Messenger and Discord want a username or invite code. Signal and Viber want a phone number with country code. For LINE, start with @ for an official account.
Decimal degrees, for example 55.6761 and 12.5683.
A logo covers modules. Keep it under about a quarter of the width and switch error correction to High, then test the printed code on more than one phone.
The blank border. Scanners need it. Do not set it to zero.
One row per code. Either just the data, or a filename and the data separated by a comma. You get a ZIP of PNGs, built in your browser.
Up to 250 codes at a time. Uses the style settings above.
Your code
Fill in the form and your code appears here.
Use SVG for anything going to print. PNG is for screens.
Everything you typed above is baked into the pattern itself. There is no link in the middle, no dashboard behind it, nothing to log in to. Once this code is on a menu, a poster, a label or a vehicle, the destination it points at is fixed for the life of the print. If the page moves, the offer ends, or you spot a typo an hour after the print run, the only fix is new artwork and a new print run.
See how dynamic QR codes workSame square, same scan, very different asset. This is not a knock on the tool above, it is what static encoding means.
| The code from this page | A QR Hero dynamic code | |
|---|---|---|
| Change where it goes after printing | Never. Reprint everything. | Edit the destination in seconds. The printed code is untouched. |
| Fix a typo in the URL | The whole print run is scrap. | Correct the link. Same code, same artwork. |
| Know whether anyone scanned it | No data exists. Nothing to measure. | Scans over time, by city, device and referrer. |
| Send different people to different places | One destination for everyone, forever. | Route by language, country or device. Schedule and A/B test. |
| Survive the target page moving or the campaign ending | A printed sign pointing at a dead link. | Re-point it. Nobody scanning ever sees a 404. |
| Stay easy to scan with a long URL | Long data means a denser grid that needs a bigger print. | A short branded link keeps the grid sparse and scannable when small. |
| Carry your own domain | There is no domain. The data is the code. | Scans resolve on your domain, which is what people see in the browser bar. |
Static codes are generated locally and are not tracked or stored by QR Hero. That also means we cannot recover, redirect or measure one for you later.
A QR code is a grid of black and white modules that encodes a string of characters. When the string is the thing you actually want, a URL, a WiFi password, a phone number, the code is called static: the data lives in the pattern, the pattern is the data, and the two cannot be separated. That is what the generator above makes. It is also why a static code needs no account, no server and no subscription. There is nothing to run.
A dynamic code encodes something different. Instead of your destination, it encodes a short link on a domain you control, and that link resolves to wherever you currently point it. The printed square never changes. What it resolves to is a setting, not an engraving. That indirection is the entire product: it is what makes a code editable after printing, measurable at all, schedulable, testable, and recoverable when a page moves.
In practice, that indirection means the destination can be swapped in seconds, the link can resolve on Custom domains instead of an unfamiliar shortener, and every scan shows up in Scan analytics with location, device and time.
The practical consequence shows up at the worst possible time. A restaurant prints two hundred table cards pointing at a PDF menu. Six weeks later the PDF is replaced, the old URL 404s, and every card on every table is now a dead end that customers still scan. A conference prints five thousand badges pointing at an agenda page that gets restructured the week of the event. A property agent puts a static code on a for-sale board and has no idea whether the board generated a single enquiry. In each case the code worked perfectly. Encoding permanence was the problem, not print quality.
There is a second, quieter cost. Static codes carry your full URL, so a long link with tracking parameters produces a dense grid with many modules. Density is the enemy of a reliable scan: more modules in the same physical square means smaller modules, and smaller modules need better print, better light and a closer phone. A short branded link keeps the grid sparse, which is why the same physical sticker scans from further away.
Six steps. The last one is the one people skip and regret.
Pick the code type first
A link, WiFi credentials and a contact card are encoded in completely different formats. Choosing the right type is what makes a phone offer to join the network or save the contact instead of showing raw text.
Keep the data as short as you can
Every extra character adds modules. Strip tracking parameters you do not need and avoid encoding a paragraph of text when a link would do.
Keep strong contrast, dark on light
Dark modules on a light background is what scanners expect. Inverted codes and low-contrast pastels fail often enough in real light to not be worth it.
Leave the quiet zone alone
The blank margin around the code is part of the specification, not decoration. Cropping it tight is one of the most common reasons a printed code will not read.
Raise error correction if you add a logo
A logo destroys modules. High error correction rebuilds up to about 30% of the code, which is what buys you room for one. Without it, a centred logo can silently break the code.
Download SVG for print, then test the real thing
SVG stays sharp at any size. Test the actual printed proof, not the screen, with at least two phones and in the light the code will really live in.
Most unscannable codes are not badly generated, they are badly sized or badly placed.
The ten to one rule
Minimum code width is roughly the scanning distance divided by ten. A code read from two metres wants to be about 20 cm wide. A table card read from 30 cm can be 3 cm.
Never go below 2 cm
About 2 cm, or 0.8 inches, is the practical floor for print regardless of distance, and that is for a short URL at medium error correction. Dense codes need more.
Mind the surface
Glossy laminate, curved bottles and dark vinyl all cost you scans. Matte stock, a flat panel and a light background are worth more than any styling option.
Tell people why to scan
A bare square gets ignored. A short line of text next to it, saying what happens when they scan, reliably lifts scan rates more than the code design does.
The generator runs entirely as client-side JavaScript. Your URLs, WiFi passwords, contact details and uploaded logo are never sent to QR Hero or to anyone else, and no code you make here is stored, logged or tracked by us. The flip side is the honest one: because we never see it, we cannot re-point it, recover it or tell you how it performed.
If any of these are true, a static code will cost you more than it saves.
None of those apply? Then take the PNG and go. If any of them do, the same square can be a dynamic code instead, and the difference in effort is a few minutes.
Printing more than a handful of these?
Make it a code you can re-point, measure and fix after the print run, on your own domain.
Yes. No account, no watermark, no limit on how many codes you make, and no restriction on commercial use. The generated image is yours.
The image does not expire and neither does the pattern. What can die is the destination. A static code points at whatever you typed forever, so if that URL stops working, the code is dead even though the square is perfectly readable.
No, and no tool can. The destination is encoded in the arrangement of the modules themselves, so changing it means generating a different code and reprinting. Editing after printing is only possible when the code encodes a redirect you control, which is what a dynamic code is.
No. There is nothing in the middle to count them. Scanning goes straight from the phone's camera to your destination with no step in between, so no tool, including ours, can report on it after the fact.
SVG. It is vector, so it stays crisp at any size and your printer can scale it without softening the module edges. Use PNG for screens, email signatures and slides. JPEG is there for systems that demand it, but it is a lossy format and the compression artefacts around module edges make it the worst of the three for scanning.
Yes, upload one above. Switch error correction to High first, keep the logo under about a quarter of the code width, and test the printed result on more than one phone. A logo works by destroying modules that error correction then rebuilds, so there is a real limit to how much you can cover.
Yes. Pick Social profile or Messenger above, choose the platform and type your handle, and the tool builds the correct profile or chat link. The static limitation still applies though: if you change handle, rebrand or move to another platform, the printed code keeps pointing at the old one. That is one of the more common reasons people end up reprinting.
No. Everything is generated in your browser with client-side JavaScript. Nothing you type or upload is transmitted to QR Hero or stored anywhere.
Divide the distance people will scan from by ten to get a minimum width, and never go below about 2 cm no matter how close they stand. Dense codes, glossy surfaces and poor light all mean you should go larger than the minimum.
The pattern is a direct function of the data, so any change to the content, even one character, produces a different arrangement of modules. There is no stable identity to a static code. This is the same property that makes it impossible to edit later.
You need a code that encodes a redirect rather than your destination. QR Hero does that on your own domain, so you can re-point, schedule, A/B test and measure the code after it is printed, and the printed artwork never has to change.
The features that a static code cannot have.
Your first dynamic code is live in minutes, on your own domain.