Hero
Get started
No signup No watermark Runs in your browser Commercial use fine

Build your code

What should the code do?

No scheme? We will add https:// for you.

Style
Logo
Output and reliability

The blank border. Scanners need it. Do not set it to zero.

Batch generate

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

Use SVG for anything going to print. PNG is for screens.

This is a static QR code, and that is a real limitation

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 work

What the code you just made cannot do

Same 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.

Static and dynamic QR codes are not two settings, they are two things

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.

How to make a QR code that actually scans

Six steps. The last one is the one people skip and regret.

  1. 1

    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.

  2. 2

    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.

  3. 3

    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.

  4. 4

    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.

  5. 5

    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.

  6. 6

    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.

Print sizing and placement

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.

Nothing you type here leaves your browser

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.

Before you send this to print, check none of these apply

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.

Frequently asked questions

Is this QR code generator actually free?

Yes. No account, no watermark, no limit on how many codes you make, and no restriction on commercial use. The generated image is yours.

Do these QR codes expire?

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.

Can I edit a static QR code after printing it?

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.

Can I track scans on a code made here?

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.

PNG or SVG for printing?

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.

Can I put my logo in the middle?

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.

Can I make a QR code for my Instagram, TikTok or WhatsApp?

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.

Are my WiFi password and contact details sent anywhere?

No. Everything is generated in your browser with client-side JavaScript. Nothing you type or upload is transmitted to QR Hero or stored anywhere.

What size should I print a QR code?

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.

Why does my code look different every time I change the text?

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.

How do I make a QR code I can change 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.

Read next

The features that a static code cannot have.

Stop reprinting your QR codes.

Your first dynamic code is live in minutes, on your own domain.

Get started Free trial - card required, nothing charged