
vCard QR Codes Explained: The Format, the Fields, and What Phones Ignore
Print 500 business cards with a QR code that saves your contact details, and the gap between a clean import and a garbled one comes down to a text format from the 1990s. That code almost always contains a vCard: a plain-text block the phone parses into a new contact. Get it right and saving your details takes two taps. Get it wrong and the phone files your job title as a fax number.
A vCard is just structured text
A vCard (the .vcf file format) is a set of lines, one property each, wrapped between a BEGIN:VCARD line and an END:VCARD line. A line like "TEL;TYPE=CELL:+994501234567" says: here is a phone number, label it mobile. There is no binary format and no server involved. The QR code stores this text directly, which is why a static vCard code works with zero internet connection, in a basement conference hall or on a plane.
Three versions matter. Version 2.1 (1996) is legacy and handles non-Latin text through a clunky quoted-printable system. Version 4.0 (2011) is the newest and still has patchy phone support in 2026. Version 3.0 is the practical choice: every mainstream iOS and Android release parses it, and in practice it carries UTF-8 text without extra parameters. If a generator lets you choose, choose 3.0.
The fields phones actually import
Phones do not treat every vCard property equally. This is what you can count on when the scan happens on a stock iPhone or a mainstream Android phone:
| Field | What it carries | How imports go |
|---|---|---|
| FN and N | Display name and structured name | Reliable on both platforms |
| TEL | Phone numbers with type labels | Reliable; stick to standard labels like CELL and WORK |
| Email addresses | Reliable | |
| ORG | Company name | Reliable |
| TITLE | Job title | Reliable |
| URL | One website | Reliable; a second URL is often dropped |
| ADR | Postal address | Usually works; pieces sometimes land in the wrong sub-field |
| NOTE | Free text | Inconsistent; line breaks get stripped |
| PHOTO | Base64 image data | Rarely fits in a printable code; leave it out |
| X- properties | Social profiles, custom data | Ignored by most importers |
The top seven rows are the dependable core, and conveniently they are also everything a business card needs: name, numbers, email, company, title, website, address. Build the code from those and nothing else.
Why photos do not belong in a printed vCard
A vCard carrying a name, two numbers, an email, company, title and URL runs about 250 to 350 bytes. That lands in a QR code around version 11 to 13 (61 to 69 modules per side), which prints cleanly at 2 to 2.5 cm on a card and scans at arm's length.
A photo changes the math completely. Images ride in the PHOTO field as base64 text, which inflates them by a third: even a tiny 2 KB thumbnail becomes roughly 2,700 characters, and the absolute ceiling for a QR code is 2,953 bytes at the lowest error correction level. So a photo either fails to fit at all or produces a near-capacity code with a 177-module grid. At business card size those modules are about a tenth of a millimeter, below what office printers render and phone cameras resolve. The full capacity breakdown is in how much data a QR code can hold; the short version for cards is text only, and the sparser the better, because fewer bytes mean bigger modules and faster scans.
iOS and Android import quirks
On iOS, the Camera app recognizes a vCard code, shows a banner, and opens a contact preview with options to create a new contact or add to an existing one. It respects standard TEL labels, quietly renames unknown ones to "other", and often keeps only the first of several URLs.
Android is where consistency ends, because scanning is handled by Google Lens on Pixels, by Samsung's own camera scanner, and by dozens of manufacturer variants. Most offer an add-contact action, but some third-party scanner apps show the raw vCard text and make the user pick, some importers drop the NOTE field entirely, and address sub-fields (street, city, postal code) occasionally merge or shuffle. None of this is a reason to skip the code; it is a reason to keep the payload to the dependable fields and test before printing.
Non-ASCII names and character encoding
If your name is Əliyev, Müller, or 田中, encoding decides whether it survives the scan. The QR standard's default text interpretation is Latin-1, but modern phones expect UTF-8, and readers that guess wrong turn characters into question marks or garbage. vCard 3.0 handles UTF-8 cleanly on the format side; the code side depends on the generator actually writing UTF-8 bytes.
The practical defense is simple: build the code with a vCard QR code generator instead of hand-assembling the text, then scan the result on a real phone and open the saved contact. If the name renders correctly there, it will render correctly for everyone on the same platform.
Static vCard or hosted contact page
Everything above describes a static vCard: the contact data physically lives in the printed code. That gives you offline scanning, zero ongoing cost, and a code that never expires. It also means the data is frozen at print time. New phone number, new title, new employer: every card in circulation still saves the old details, forever.
The alternative is a code that carries a short URL to a hosted contact page. The page shows your details and offers a save button that downloads a fresh .vcf, so you can change the number after printing and every existing card updates instantly. The costs: the scan needs internet, there is a browser step before the save, and hosted codes are a paid feature on most platforms. On QRolling, dynamic codes come with a 7-day trial and add scan analytics, so you can also see when and where cards get scanned. A business card QR code generator that supports both lets you match the choice to the card: stable details, encoded straight into the pattern; details that change, hosted.
Before anything goes to the printer, generate your vCard code, scan it with one iPhone and one Android phone, and read every field in the saved contact. Two minutes of testing is cheaper than 500 reprinted cards.

