QR code generator
https://tooltiki.com
A QR code carries its data inside the pattern itself, so nothing sits between the scan and the result. This one encodes ten payload types, from a plain link to Wi-Fi credentials, a vCard or a calendar event. At error-correction level H a code still reads with 30% of it damaged.
How to make a QR code
Free QR services usually give you a short redirect link rather than your own data, which lets them count scans — and lets the code stop working when they change their pricing. A code with the destination inside it is larger and denser, and that is the trade: a longer link makes a busier code. Shorten the URL before generating if density matters, and check that the shortener is one you trust to still exist in five years.
What each type actually encodes
The picker is not cosmetic. Each type writes a different string into the code, and the scanning phone acts on that string rather than on anything a generator claims about it. A link is the URL and nothing else. Wi-Fi is a WIFI: record naming the security type, the SSID and the password, read straight from the camera by iOS since version 11 and Android since 10; the semicolons and backslashes in your password are escaped for you, which is where hand-written Wi-Fi strings almost always break. A phone number becomes a tel: URI and an SMS becomes SMSTO:number:message, which is the one SMS form phones handle consistently. WhatsApp becomes a wa.me link, which is why it wants the country code with no plus and no leading zero. Email writes a mailto: with the subject and body percent-encoded, so a subject containing a space or an ampersand survives instead of truncating the rest.
The three structured types are worth knowing individually. A contact is a vCard 3.0 rather than 4.0, because both iOS and Android parse 3.0 reliably from a camera and 4.0 support is patchy; it carries the name twice because the format requires a structured name and a display name. A location is a bare geo: pair in decimal degrees, so it opens in whichever maps app the phone already uses rather than pinning you to one vendor. An event is a VEVENT whose timestamps take the form YYYYMMDDTHHMMSSZ with no separators, where the trailing Z means UTC — leave it off and the scanning phone reads the time as local, which is what you want for an all-day event and misleading for anything else.
What L, M, Q and H are
Every QR code carries a copy of its own data in a form that survives damage. That is the error-correction level, and the four settings say how much of the code can be unreadable before a scanner gives up: L about 7 per cent, M 15, Q 25, H 30. The redundancy is not free: it is stored in the code itself, so raising the level at a fixed data length adds modules, and the pattern gets denser. Going from L to H on the same URL can push a code up several versions, which means smaller squares at the same printed size, which is its own kind of unreadable.
Which one to pick
M is the sensible default and what most generators use: it survives a scuff or a thumbprint and stays reasonably open. Use L when the code is on a screen or a clean flat print that nothing will touch, and you want the loosest possible pattern. A long URL at L is much easier to scan than the same URL at H. Use Q or H when the code will live in the physical world and take damage: a label that creases, a sticker on a curved bottle, a menu that gets wiped down, signage that will fade. H is also the level to use when you are putting a logo in the middle, because that logo is damage. You are deliberately covering modules, and only the redundancy makes it still readable. Keep the covered area under roughly the level you chose and test the finished code with a real phone before printing a thousand of them.
What people use it for
- Wi-Fi details guests can join without typing the password
- A contact card that scans straight into a phone
- A WhatsApp chat that opens with a message ready
- An email draft with the subject and body filled in
- A phone number people scan rather than type
- A text message pre-addressed to a keyword shortcode
- Coordinates that open in whichever maps app the phone uses
- An event people scan to add to their calendar
- An app download link on a poster or a flyer
Questions
No. The data is in the pattern, so there is nothing to expire and nobody to keep paying.
No. Generation happens in this page and the finished code points straight at your data, with no redirect in between.
It works, but it puts a third party in the path who can change terms, start charging, or disappear. A code carrying your own data has none of those failure modes.
M unless you have a reason. L (7% recoverable) for screens and clean prints where you want the loosest pattern; M (15%) as the default; Q (25%) and H (30%) for labels that crease, curved surfaces, or anything outdoors. H is also what a logo overlay needs, because covering the middle is damage the redundancy has to absorb.
More data needs a higher version, which means more modules per side. The version number is shown under the preview.
SVG for anything going to print, because it is resolution-independent. PNG for slides, documents and messaging apps.
Yes. iOS has handled them from the camera since version 11 and Android since 10, with no app in between.
It is escaped for you. A hand-written Wi-Fi string breaks on exactly that character, because the semicolon is the field separator.
Yes, including case and spaces. The SSID is matched literally, so a code made from a mistyped name simply fails to join.
Country code and number, digits only: 31612345678. No plus, no spaces, and no leading zero from the national format.
Full international, with the plus and the country code. A national number fails silently for anyone scanning it abroad.
No. Every platform shows the number and asks first, which is why a tel code is not a way to make someone place a call.
No. Each opens the relevant app with the recipient and the text already filled in, and the person taps send.
Version 3.0, because iOS and Android both parse it reliably from a camera. Support for 4.0 is inconsistent enough to be a bad bet on printed material.
vCard requires both a structured name and a display name. That is the format, not duplication, and removing either breaks the import.
Decimal degrees with a dot, and a minus for south or west, not degrees-minutes-seconds. Four or five decimal places is plenty; six is about 11 cm.
YYYYMMDDTHHMMSSZ with no separators. The trailing Z means UTC, so convert from local time first, or leave it off to have the phone read the time as local.
Not on its own: a static code carries one URL. Point it at a page of your own that redirects by platform, which also lets you change the store links later without reprinting anything.