QR Code Generator

Turn any text or URL into a QR code — drawn in your browser, with no tracking link in between.

Runs in your browser. Nothing is uploaded — your input is processed on this device and discarded when you close the tab.

Create a QR code

The code encodes exactly what you type here — no shortening, no redirect, no tracking link in between.

The pixel size of the preview and the PNG download. The SVG download is a vector and scales to any size.

Higher correction survives more damage (scratches, glare, a logo in the middle) but holds fewer bytes and packs the modules tighter.

Live preview at the size you selected. Test the downloaded file with your own phone camera before you print or publish it.

How to use the QR Code Generator

  1. Type or paste the exact destination. For a link, paste the full URL including https:// — the code stores the characters you give it, so a missing scheme or a typo is stored too, faithfully, forever.
  2. Pick an error-correction level. Start with M for screens and ordinary print. Choose Q or H when the code will live somewhere rough — a poster outdoors, packaging, a sticker that will get scratched — and L only when the content is long and the code will be shown large and clean.
  3. Watch the character and byte count. The counter under the form shows characters, UTF-8 bytes, and how many bytes the chosen level can still hold. If the input is too long for the level, the tool tells you the exact limit and which stronger-capacity level would fit instead.
  4. Choose a size and download. Take the PNG for documents, slides and websites, at 512 px for ordinary use or 1024 px when it will be printed large. Take the SVG for print work: it is built from the same module matrix and stays sharp at any size.
  5. Scan-test the file you downloaded. Open it on another device or print one copy at the real size and scan it in ordinary light. A code that scans on your desk may fail on a wall, in glare, or at a distance — testing the final artefact is the step that catches that.

Worked example

The sample loaded by the button below is the address of this very tool page. It is short, plain ASCII, and it shows how the counting works before you trust the tool with anything longer or more complicated. Select Load sample and the workspace fills with that URL at level M and 512 px, and the counter reports the figures in the box — every one of them calculated by the generator’s own code, not typed in by hand:

Text: https://atoztools.pro/tools/qr-generator/
Characters: 41
UTF-8 bytes: 41
Level M capacity: 2331 bytes — fits, 2290 bytes spare
Level H capacity: 1273 bytes — fits, 1232 bytes spare
Download filename (PNG): qr-code-atoztools-pro-tools-qr-generator.png

Because the text is plain ASCII, characters and bytes are the same number: 41 of each. That stops being true the moment the text uses accented or non-Latin characters. The word café is 4 characters but 5 bytes in UTF-8, because the é takes two bytes — and QR capacity is counted in bytes, in the byte mode this tool plans against. A long message in Arabic, Urdu or Chinese can therefore reach a level’s byte limit while the character count still looks modest, which is exactly why the counter shows both numbers. Note also what the spare capacity means in practice: this 41-byte URL fits even at level H, the densest and most damage-tolerant setting, so for a short link there is no capacity reason to accept the weaker correction of L or M — the only trade-off that remains is how dense the printed code looks.

What a QR code stores, and how error correction trades against density

A QR code stores characters — nothing more. The black and white squares (modules) are grouped into a grid whose size grows in steps called versions, from version 1 at 21 by 21 modules up to version 40 at 177 by 177. There is no server behind a QR code, no account, and no way for the code itself to know it was scanned. When a phone reads one, it simply decodes the stored text and then decides what to do with it: open it as a link if it looks like a URL, show it as text if it does not. Anything beyond that — a redirect, a scan counter, a changed destination — has to live on a server the code points at, which is why this tool is explicit about what it does: the code it generates encodes exactly the text you typed, character for character, with no short link or tracking service inserted in between. If the destination ever needs to change, the honest options are to reprint the code or to point it at a landing page you control from the start.

Error correction is the code’s insurance against the real world. Alongside your data, the encoder writes redundant information calculated with Reed–Solomon codes, so a reader can reconstruct the message even when part of the grid is dirty, torn, faded or covered. The four levels — L, M, Q and H — write increasing amounts of that redundancy. The trade is unavoidable and worth understanding: redundancy takes room, so at any given version a higher level holds less of your data, and holding the same data at a higher level pushes the encoder to a bigger, denser version. The version 40 byte-mode ceilings used by this tool are 2,953 bytes at L, 2,331 at M, 1,663 at Q and 1,273 at H. Those are ceilings, not targets: a code anywhere near them is a tight field of tiny modules that many cameras, especially older ones in poor light, will struggle to read.

That is why the practical advice runs the other way from the numbers. Keep the encoded text as short as the job allows — a clean landing URL rather than a paragraph of parameters — take the strongest correction level that still fits comfortably, print or display the code large enough that each module is clearly separated, and keep the quiet zone, the blank margin around the grid, intact when you crop or place the file. Contrast matters too: dark modules on a light background is the combination readers are built for, and inverting it or setting the code over a photograph is a reliable way to make a technically valid code that nobody can scan.

Common errors, and the limits of this tool

The most common error is encoding the wrong text and discovering it after printing: a URL with a typo, an old domain, a link missing its https://, or a page address that redirects somewhere the reader did not intend. The second is overloading the code — pasting a long paragraph, a whole vCard or a URL stacked with tracking parameters — until the grid is so dense it only scans at arm’s length in perfect light. The third is a layout error rather than an encoding one: codes printed too small for the scanning distance, cropped into their quiet zone, stretched out of square, or placed on curved or glossy surfaces that reflect the camera’s light back at it.

The limits are these. Capacity is a hard ceiling per level — 2,953 bytes at L, 2,331 at M, 1,663 at Q and 1,273 at H, counted as UTF-8 bytes — and no setting in this tool can extend it; longer content must be shortened or hosted at a short address the code points to. At level H in particular, even a few hundred bytes produce a dense code, so for print, choose size by scanning distance: the further away the reader stands, the physically larger the code needs to be, and a code that will be scanned from across a counter should be tested from across a counter. The tool draws the code and builds the PNG and SVG downloads in your browser from the text you enter; nothing is uploaded. It cannot verify that the page a URL points to exists, that it is safe, or that it will still be there next year — check the destination yourself, and remember that a QR code hides its destination from the person scanning it, which is a reason to use codes honestly and a reason readers are right to be cautious about strange ones.

Frequently asked questions

Which error-correction level should I choose?

M is the sensible default for codes shown on screens or printed on clean indoor material. Move to Q or H when the code will be scratched, faded, partly covered, or printed on packaging that gets handled a lot — the extra redundancy is what lets a damaged code still decode. Use L only when the content is long and every saved module helps, and the code will be displayed large and read at close range. Whatever you choose, a level that fits with room to spare beats a stronger level that only just fits, because the stronger level produces the denser grid.

Why does the tool count bytes when I typed characters?

Because QR capacity is specified in bytes, and in UTF-8 — the encoding used here — characters cost different amounts. Plain English letters, digits and common punctuation cost one byte each. An accented letter such as é costs two, many Arabic, Urdu and Chinese characters cost two or three, and an emoji costs four. The worked example above shows the smallest version of this: café is 4 characters and 5 bytes. The counter shows both numbers so a limit never arrives as a surprise.

Can I change where a printed code points later?

No — and any tool that implies otherwise is describing something else. The destination text is baked into the pattern of modules; once printed, it cannot be edited. What can change is a page you control: if the code points at a short address on your own site, you can redirect that address elsewhere later. Plan for that on day one if the destination might move, because reprinting is the only fix for a code that points directly at an address that has gone away.

What is the difference between the PNG and SVG downloads?

They carry the same code. The PNG is a picture at the pixel size you selected — 256, 512 or 1024 px — which suits documents, slides, emails and web pages. The SVG is a vector built from the code’s module matrix, so a print shop can scale it to a poster or a business card without it going soft. For anything that will be printed larger than a few centimetres, or handed to a designer, send the SVG.

Does this tool track scans or store my text?

No. The code is drawn in your browser, the downloads are built in your browser from the text you entered, and that text is not uploaded. There is also no scan tracking to offer: a plain QR code reports nothing back when it is scanned, so if you need to know how often a printed code was used, point it at an address on a site whose analytics you can read, and judge it there.

Why will a code not scan, even though it generated without errors?

Generation being valid and scanning being reliable are different things. The usual causes are size and context: printed too small for the distance, quiet zone cropped away, low contrast or a reversed-out design, glare on glossy stock, or a very dense code — long text at level H — being read by an older camera in poor light. Shorten the text, drop a correction level if the code is dense, print it larger with its margin intact, and test the actual printed piece where it will actually be used.

Related tools

UTM Campaign Builder

Create UTM-tagged URLs with validation, naming presets, bulk CSV mode and saved presets in your browser.

Business and Marketing

JSON Studio

Format, validate, minify, query and compare JSON in your browser, with precise line-and-column errors.

Developer Tools

Related articles

How to Build and Track UTM Parameters

UTM parameters label your links so analytics can tell one campaign from another. This guide defines all five parameters, gives a naming convention that survives real use, and shows tested URL output — including the uppercase and spaces mistakes that silently split your reports.

By AtoZTools Editorial Team · Last reviewed 2026-10-24