contact codes
How to make a contact (vCard) QR code
Build a business-card QR that saves your details with one scan — the vCard format, a copy-paste example, and how to keep it scannable.
A contact QR code is just a QR that holds a small block of text in the vCard format. Scan it and the phone offers to save the details straight to contacts — no app needed on most modern phones (iOS 11+ reads it from the camera, and most Android phones on 9+ do too via the camera or Google Lens).
What goes in a vCard
A vCard is plain text with a fixed wrapper: BEGIN:VCARD on the first line, END:VCARD on the last, and VERSION right after the start. Stick to version 3.0 — it has the widest device support. Here’s a clean, scannable one:
BEGIN:VCARD
VERSION:3.0
N:Doe;Jane;;;
FN:Jane Doe
TEL;TYPE=CELL:+15555550123
EMAIL:[email protected]
ORG:Example Co
URL:https://example.com
END:VCARD
A few things that trip people up:
Nis last-name-first, semicolon-separated. The five slots areFamily;Given;Additional;Prefix;Suffix, soN:Doe;Jane;;;. The trailing semicolons mark the empty slots — leave them in.FNis required. It’s the display name (FN:Jane Doe). Skip it and some phones save a blank-named contact or refuse the import.TYPEis optional.TEL;TYPE=CELL:is tidy, but a bareTEL:+15555550123works too and saves characters.- Escape commas and semicolons inside values. A surname like
Smith, Jr.must be writtenSmith\, Jr.or it’ll corrupt the fields.
The shorter option: MECARD
MECARD is a more compact alternative that lives on a single line:
MECARD:N:Doe,John;TEL:13035551212;EMAIL:[email protected];;
Note the differences: the name uses a comma (N:Doe,John), fields are separated by semicolons, and the whole thing ends in a double semicolon ;;. Because it’s smaller, it draws a less dense, easier-to-scan code. The trade-off: MECARD is a de-facto format (originally from NTT DoCoMo) rather than a published standard, so vCard is the safer pick for maximum compatibility. Don’t mix the two formats’ separators — that just produces a broken payload.
Trim it so it scans
More fields means more characters, which means a denser grid with smaller squares — harder to scan, especially printed small on a card. Keep to the essentials: name, phone, email, maybe company and a URL. As a rough guide, under ~150 characters scans very easily, and 500+ gets risky on small prints — treat those as ballpark figures, not hard limits.
Two things to never do:
- Don’t embed a photo. A base64
PHOTOcan add 10,000+ characters and make the code unscannable. Link to a hosted image withURLinstead. - Don’t cram in every phone number, your full address and social links. Bloat is the enemy of a reliable scan.
Static vCard, or a link you can change?
A raw vCard is baked into the squares — it can never be edited once printed. For a personal card that rarely changes, that’s fine. But for marketing, where details shift, the honest move is to point the code at a short link to a contact page you control, so you can update it without reprinting. That’s the whole static vs dynamic idea — and it keeps the code shorter too.
Making one in dottr
Paste your vCard (or MECARD) text into dottr, download the PNG or SVG, done. It’s a static, in-browser generator: the code holds exactly what you typed and nothing leaves your browser. Keep the contrast high and the quiet zone clear and it’ll scan first time.
Make yours at dottr — it’s free and runs in your browser.