QR code vCard contact generator: the VCARD spec, field by field
A vCard QR is a contact card the phone can save in one tap. The format is RFC 6350 vCard 4.0 and the older 3.0 from 2011, both still in active use, and getting the field order and the line endings right is the entire job.
The minimal vCard, line by line
Phones recognise the vCard format by the literal first line BEGIN:VCARD. A working contact looks like this:
BEGIN:VCARD
VERSION:3.0
N:Lopez;Ana;;;
FN:Ana Lopez
ORG:Aldeacode
TITLE:Frontend Engineer
EMAIL:ana@example.com
TEL:+34600111222
END:VCARD
Field by field:
- VERSION declares the spec. Use 3.0 for maximum compatibility, 4.0 is cleaner but iOS Camera still parses 3.0 with fewer surprises in 2026.
- N is the structured name: Family;Given;Additional;Prefix;Suffix. The four trailing semicolons in the example are intentional, the field has five components and empty ones must still appear.
- FN is the formatted display name, the string the contacts app actually shows. Always include it.
- ORG is the organisation, TITLE is the role.
- EMAIL and TEL are the channels. You can repeat each one with a type, e.g. TEL;TYPE=CELL:+34600111222, the phone groups them sensibly.
The block ends with END:VCARD on its own line.
How phones add it to contacts
The Camera app on iOS and the Pixel and Samsung cameras on Android detect the BEGIN:VCARD prefix and surface an "Add to Contacts" sheet, with every field pre-filled. The user reviews and taps Save. No app, no clipboard.
On older Android the path is the same once a QR scanner runs, the parsing is identical. Browsers like Chrome on iOS that read the camera feed go straight to a download offer for a .vcf file, which the Contacts app then imports.
The CRLF trap
RFC 6350 says lines end with \r\n (CRLF). Most QR generators emit \n only (LF) and 95 percent of phones still parse it. The five percent are usually older BlackBerry style scanners and a handful of corporate Android builds with strict parsers.
If your QR works on iOS and fails on a partner's older device, regenerate with CRLF. Inside a JavaScript string that means \r\n between every line. If you are pasting into a tool, convert with a unix2dos pass on the source file before encoding.
Non-ASCII names and encoding
The vCard 3.0 default charset is UTF-8 in practice, even though the spec is fuzzy. Accents, eΓ±es, Cyrillic, CJK characters all encode fine inside the QR.
The two real failure modes: tools that escape commas inside FN (an FN:Lopez, Ana becomes FN:Lopez\, Ana and the phone shows the literal backslash) and tools that wrap long lines at 75 characters per RFC. Wrapping is allowed but iOS Camera in 2024 builds occasionally chokes. Keep each field on a single line and you avoid both.
Working example
text# vCard 3.0 payload, working on iOS Camera and Android default scanner
BEGIN:VCARD
VERSION:3.0
N:Lopez;Ana;;;
FN:Ana Lopez
ORG:Aldeacode
TITLE:Frontend Engineer
EMAIL;TYPE=WORK:ana@example.com
TEL;TYPE=CELL:+34600111222
URL:https://aldeacode.com
ADR;TYPE=WORK:;;Calle Mayor 12;Madrid;;28013;ES
END:VCARD Just need the result?
Fill the contact fields in the QR code generator on aldeacode.com and the tool emits a clean VCARD 3.0 block, escapes the commas and renders the code, all in your browser, nothing uploaded. Print it on the back of the business card or paste it on the website footer.
Open QR Code Generator βFrequently asked questions
vCard 3.0 or 4.0 inside a QR?
Stick to 3.0 for QR codes in 2026. iOS, recent Android and Outlook all parse it. Version 4.0 is fully supported on desktop but a few Camera builds on iOS show partial fields when the version is 4.0.
How long can a vCard QR be before it stops scanning?
Around 1500 ASCII characters at error correction level M before the QR becomes too dense for a phone camera to read at a comfortable distance. Drop the photo, drop spurious fields, keep one phone and one email.
Can I include a profile picture?
Technically yes via PHOTO;ENCODING=BASE64, in practice no. A 100x100 photo blows the QR out to 3000 plus characters, the code becomes a black square the camera cannot resolve. Link to the photo via URL: instead.