Guide
How to make a QR code (Wi-Fi, contact card, and more)
What a QR code actually encodes, the exact payload format behind a Wi-Fi, vCard, or WhatsApp code, and which type to use for what, with a generator built in.
A QR code is not a picture of the thing it represents; it is a grid encoding a text string, and everything useful about it comes from the exact format of that string. A plain URL payload just opens a page; switch to a Wi-Fi or contact-card payload and the format changes completely, which is what actually tells a phone to join a network or save a contact instead of opening a browser.
A plain URL or text code
The simplest case: the payload is the literal text or URL, nothing wrapped around it. A camera
app reads the string, recognizes https:// at the front, and offers to open it like any other
link. There is no size limit beyond what fits in the QR grid, but longer payloads produce a denser
code that needs more room to scan reliably (see "why does my QR code fail to scan" below).
A Wi-Fi code
Wi-Fi credentials use a small, well-defined scheme most modern phones understand out of the box (iOS 11+, Android 10+):
WIFI:T:WPA;S:Zaraar-Office;P:hunter2;;
T is the security type (WPA, WEP, or nopass for an open network), S is the network name,
P is the password. The trailing ;; closes the record. The part generators most often get wrong
is escaping: if the network name or password itself contains a semicolon, comma, quote, or
backslash, those characters have to be backslash-escaped or the payload gets misread partway
through: a network called Cafe;Bar has to become Cafe\;Bar inside the payload, for example.
Because the password sits in that string as plain text, a Wi-Fi QR code is exactly as sensitive as the password itself; see the FAQ below before pinning one up somewhere public.
A contact card (vCard) code
A contact card QR code embeds a vCard, the same format address books have exchanged for decades:
BEGIN:VCARD
VERSION:3.0
N:Lovelace;Ada;;;
FN:Ada Lovelace
ORG:Analytical\, Ltd
TITLE:Engineer
TEL;TYPE=CELL:+44 20 7946 0958
EMAIL;TYPE=INTERNET:ada@example.com
END:VCARD
N is the structured name (last;first;;;), FN is the display name, and each field after that is
optional. Two details break more vCard QR codes than anything else: the spec requires CRLF
(\r\n) line endings, not plain \n, and commas inside a field value (an organization name like
Analytical, Ltd) need escaping to \, or they get parsed as a field separator. The more fields
you add, the denser the resulting code: a vCard with a photo, notes, and several numbers can get
dense enough to need a noticeably larger printed size to stay scannable.
A WhatsApp chat code
This one isn't a special QR scheme at all; it's a normal https://wa.me/ link that happens to
deep-link into WhatsApp:
https://wa.me/447700900123?text=Hi%21%20got%20a%20question
The number after wa.me/ is the country code plus the number, digits only: no +, no spaces, no
leading zero after the country code. An optional ?text= parameter pre-fills the opening message,
percent-encoded the same way any URL query string is.
Static vs. dynamic QR codes
Everything above produces a static code: the full payload is baked directly into the image, it works offline forever, and nothing about it can be changed or tracked after the fact. Some paid QR services instead generate a dynamic code: a short URL they control that redirects to your real destination, which lets them swap the destination later or log every scan. That's a genuine trade-off, not a strictly better option: a dynamic code depends on that service staying online indefinitely, where a static one just... works, for as long as QR readers exist.
Which type to use
- Sharing a link, menu, or profile → a plain URL code.
- Letting guests join Wi-Fi without typing a password → a Wi-Fi code.
- Handing out contact details at an event → a vCard code.
- Getting people straight into a WhatsApp chat or support line → a WhatsApp code.