QuickUse Generator

QR Code Generator

Scannable QR codes for URL, Wi-Fi, vCard, text, email and more — 9 payload types, color customization, PNG/SVG export. Runs entirely in your browser.

0 characters

Customize colors
Good contrast(ratio 21.00:1)
  • Enter some text to generate a QR.
Fill in the form to generate the QR code.

Editorial guide

About this generator

An honest technical read on what is happening behind the Generate button.

QR codes went from gimmick to infrastructure faster than anyone predicted. Restaurant menus, payment rails, Wi-Fi onboarding, vaccine passports, parking meters, conference badges — the same 21-by-21 to 177-by-177 grid of black squares now sits behind transactions that move money and identity. The generator above produces all nine of the standard payload types in your browser, with the same wire formats every smartphone camera already knows how to read.

The nine payload types

Text is a raw string — useful for ticket IDs, asset tags, or anything that just needs to round-trip through a scan. URL is the marketing workhorse, with an optional UTM-builder so the same poster can attribute campaign conversions cleanly. Wi-Fi uses the ZXing-style WIFI:T:WPA;S:…;P:…;; format that iOS 11+ and Android 10+ honour natively from the camera app — scan, tap the notification, you're on. Email (RFC 2368 mailto), SMS (SMSTO scheme), and phone (RFC 3966 tel) cover the contact triad. vCard 3.0 (RFC 2426) is the electronic business card — name, organisation, role, channels — that conference badges have used since the late 90s. Geo (RFC 5870) drops a pin. And Pix is the BR-specific killer, covered separately below.

How a QR code actually works

The grid you see is not just data — it's data plus a substantial chunk of redundancy. Reed-Solomon error correction, the same family of codes that lets a scratched DVD play and a deep-space probe phone home, lets a partially obscured QR still decode. The standard defines four levels: L recovers 7% of damage, M 15%, Q 25%, H 30%. Higher recovery costs you capacity: a Version 10 grid at level M holds 395 alphanumeric characters; at level H, it drops to 213. The default in this generator is M — a good balance for screen and small-print use.

Capacity scales by version, where each version adds 4 modules per side. Version 1 is 21×21 and holds 25 alphanumeric chars at L. Version 40 is 177×177 and holds 4,296. The library picks the smallest version that fits your payload at the chosen error-correction level, which is why the same URL can render as a tight 33×33 grid or a sprawling 73×73 grid depending on how much redundancy you ask for.

The three big squares in the corners are the finder patterns — they tell the scanner where the code is and which way is up. The smaller squares scattered throughout larger codes are alignment patterns, used to correct for the perspective skew of a phone held at an angle. None of that is content; all of it is structure. The format was published by Denso Wave in 1994 and standardised as ISO/IEC 18004 in 2000.

A different family of QR sits on top of the same symbology for payments: the EMVCo "Merchant Presented Mode" standard (EMV-QRCPS) that Brazil's Pix, India's UPI, Singapore's SGQR and several other national instant-payment rails all customise. EMV payloads are TLV strings — two-digit tag, two-digit length, value — closed by a CRC-16/CCITT-FALSE checksum in the last field. The symbology is standard QR; the semantics are the payment scheme's. This generator writes native Pix payloads via the Pix form (see the PT-BR editorial for the wire-format breakdown); for other schemes, paste the TLV string into the Text form and it renders unchanged.

Color customization without breaking the scan

Cameras read contrast, not colour. The WCAG 2.1 contrast formula compares relative luminance — black on white scores 21:1, the maximum. For QR scanning the practical floor is about 3:1; below that, autofocus and the camera's auto-exposure start fighting each other and the decoder gives up. This generator computes the WCAG ratio in real time and warns at 3:1, blocks the download at 2:1. The five presets all clear the threshold; the colour pickers let you go anywhere within reason. Dot-style and logo-embed customisation are deferred — they have legitimate uses but introduce a fragility surface that's hard to QA in a privacy-first, no-server-roundtrip context.

Why a client-side generator is the privacy bar

When you paste a URL into a hosted QR generator, you've handed that URL to a server. A legitimate operator logs it for abuse prevention; a less scrupulous one builds a side business out of the traffic patterns. The same is true of vCards (you've just leaked an executive's direct contact details), Wi-Fi codes (you've leaked the password), and Pix payment codes (you've leaked who's getting paid). This generator runs entirely in your browser. There are no fetch calls in the QR-generation path, no analytics events that capture the payload, and the QR library is loaded via dynamic import so even the round-trip to fetch its bytes happens from your browser cache once you've used it.

Print-poster use cases

The "Print poster" button opens a new window with the QR centred on A4 paper, sized for a comfortable scan distance of roughly 30–80 cm. Real-world places that benefit: restaurant tables (menu URL), conference badges (vCard), public Wi-Fi displays in cafés and Airbnb welcome books, museum exhibits, parking-lot payment posts, and event signage that needs to survive being printed once and read for a year. The minimum module size for a reliable phone scan is usually 0.5 mm; the poster sizing here clears that with a safety margin.

A practical checklist before you send a QR to the printer: pick error-correction Q or H if any part of the surface risks damage (outdoor posters, laminated menus, sticker labels that get scuffed), test the printed sample from the actual scan distance you expect (a poster comfortable at 80 cm is illegible at 3 m), and give the code a quiet-zone margin equal to at least four modules on every side — bordering the code straight against text or a photo is one of the top reasons cameras fail to detect the finder patterns. The scan-back validation described in the FAQ catches the size and error-correction issues at generation time; the quiet zone is on you at layout time.

UTM tracking and campaign attribution

A QR code on a physical surface is the cleanest attribution channel a marketing team ever gets — a scan is intent expressed by a human who physically stood in front of your poster. To make that intent trackable, the URL form has an optional UTM builder that appends utm_source, utm_medium, utm_campaign, utm_term and utm_content to the destination URL before the QR is generated. Poster A in the subway carries ?utm_source=subway&utm_medium=poster&utm_campaign=jul2026; poster B at bus stops carries utm_source=busstop; both point at the same page, and GA / Plausible / Umami separates the origin in the acquisition report. Without UTMs, every offline scan collapses into "Direct" traffic and the attribution is gone.

A common trap: printing UTM-tagged QRs without versioning by print batch. If you reprint posters quarterly, add utm_content=batch-q3 or a similar discriminator — you'll want to tell traffic from the old batch still stuck on walls apart from the fresh batch when you calculate campaign ROI. It's campaign hygiene, not technology, but nobody discovers it until the first quarterly report.

Frequently asked questions

How small can a printed QR code be before phones stop reading it?

For a phone held 20–30 cm away, modules below 0.5 mm get unreliable. Smaller prints (business cards, sticker labels) should use error-correction level Q or H so a misprint or smudge doesn’t kill the code.

Why do some QR codes fail to scan even though they look fine?

Usually one of three things: low contrast (printed on coloured paper, faded ink), too much shine (laminated menus reflecting overhead light back into the lens), or the payload was edited after generation — even one character changed without recomputing the QR breaks the Reed-Solomon block.

Is there a maximum length for the payload?

The format tops out at 4,296 alphanumeric chars (Version 40 at error level L), but anything past ~1,500 chars produces a grid so dense that phone cameras struggle. Shorten the URL or split the payload.

Can a QR code carry malware?

The QR itself is just text. The risk is what the text points to — a URL to a phishing site, a Wi-Fi handshake to a hostile access point, a vCard with an unexpected "exec-me-please" attachment. Treat QRs the same way you treat shortened URLs: trust the context, not the code.

What’s the difference between static and dynamic QR codes?

Static QRs encode the payload directly — what you see is what scans. Dynamic QRs encode a short URL that redirects through a server, letting the owner change the destination after printing. Dynamic codes are convenient and trackable; they’re also a privacy hole and aren’t supported here.

Why does the page validate by re-scanning my own QR?

A customised QR (colour, logo embed, corner styles) can quietly drop below the Reed-Solomon redundancy threshold and become unscannable. We render the PNG, run `jsQR` against it, and compare the decoded payload to the input. If they don’t match, the Download button is disabled with a clear error — better to fail loudly here than ship a poster nobody can scan.

Does the QR generation send my payload anywhere?

No. The QR encoder, the canvas render, the scan-back validation, and the file export all run in your browser. The network tab is silent when you click Generate. We don’t want to know what URL you’re encoding.

I need to generate an EMV / Pix QR from code — what CRC does it use?

The EMV Merchant Presented Mode payload (used by Brazil’s Pix, India’s UPI, Singapore’s SGQR and other national instant-payment rails) closes with a CRC-16/CCITT-FALSE checksum in the last field: polynomial 0x1021, initial value 0xFFFF, no bit reflection, final XOR of zero. The CRC is computed over every byte of the payload string including the CRC field’s own two-byte prefix (`6304`), then written into the field body as four upper-case hex digits. This is the parameter combination roughly 90% of first-attempt implementations get wrong — most default CRC-16 libraries use init=0x0000 or reflect bits, which produce different results the payment app rejects. The Pix form in this generator implements it correctly; if you want to check your own implementation, generate a Pix QR here and diff the payload bytes against yours.