# vCard QR codes — how they work

> A vCard QR code stores a complete contact record — name, phones, emails, company, address, website — which the phone offers to save straight into its address book. It is the largest common payload type, so keep it lean: every extra field makes the code denser and harder to scan.

Source: https://useqr.app/vcard-qr-code · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## The payload

A literal vCard file, encoded as text:

```
BEGIN:VCARD
VERSION:3.0
N:Lovelace;Ada;;;
FN:Ada Lovelace
ORG:Analytical Engines Ltd
TITLE:Mathematician
TEL;TYPE=CELL:+14155552671
EMAIL;TYPE=WORK:ada@example.com
URL:https://example.com
END:VCARD
```

`N` is the structured name in the order *family;given;middle;prefix;suffix* — the
semicolons are positional and must all be present even when empty. `FN` is the display
name. Omitting `FN` is the most common reason a contact imports with a blank name.

## 3.0 versus 4.0

| | vCard 3.0 | vCard 4.0 |
|---|---|---|
| Phone type syntax | `TEL;TYPE=CELL:` | `TEL;TYPE="cell":` |
| Support on iOS/Android cameras | universal | good, not universal |
| Older scanner apps | universal | patchy |

Use 3.0 unless you have a specific reason not to. The extra fields in 4.0 rarely
survive the round trip into a phone address book anyway.

## Escaping and folding — where it goes wrong

Inside a value, four characters must be escaped with a backslash: comma, semicolon,
backslash and newline (written `\n`). A job title of "Director, Engineering" written
unescaped splits into two values, and most address books then show only "Director".

The spec also folds lines longer than 75 octets by inserting CRLF followed by a single
space. Some scanners are strict about this. UseQR folds and escapes automatically —
the failure mode when hand-rolling is a contact that imports half-populated.

## Size is the real constraint

A full vCard with two phones, two emails, an address, a job title and a website runs
about 300–400 bytes, which is a version-11 to version-13 code — 61 to 69 modules
across. Add a photo (`PHOTO;ENCODING=b`) and you exceed the entire capacity of a QR
code; base64 image data is measured in kilobytes and the maximum payload is 2,953 bytes.

Practical rules:

- Never embed a photo. Link to one with `PHOTO;VALUE=URI:`.
- One phone number and one email unless you genuinely need more.
- Skip the postal address on a business card — it costs ~80 bytes and is rarely used.
- On a printed card, a vCard code should be at least **2 cm square**; below that the
  module size falls under what a phone camera resolves at arm's length.

If you need it smaller, use [MeCard](/mecard-qr-code), which encodes the same essentials
in roughly 40% fewer bytes.

## What phones do on scan

iOS shows a contact preview with an *Add to Contacts* option. Android offers the same
via Google Contacts. Neither saves anything without confirmation. Fields the address
book does not recognise are silently dropped, which is why obscure vCard properties are
not worth the bytes.

## FAQ

### Should I use vCard 3.0 or 4.0?
Use 3.0. It is universally supported by phone cameras and older scanner apps, and the extra 4.0 properties rarely survive import into a phone address book anyway.

### Why does my contact import with missing fields?
Usually unescaped commas or semicolons inside a value, or a missing FN line. Both split or blank the record. Generating the vCard rather than hand-writing it avoids this.

### Can I put my photo in a vCard QR code?
No. Base64 image data runs to kilobytes and a QR code holds at most 2,953 bytes. Link to a hosted image with PHOTO;VALUE=URI: instead.

### How big should a vCard QR code be printed?
At least 2 cm square on a business card. vCards are dense payloads, so a code that is small enough to look tidy is often too small for a phone camera to resolve at arm's length.

### What is the difference from MeCard?
MeCard encodes the same essential fields in about 40% fewer bytes, producing a visibly less dense code. vCard carries more field types and is the richer format.

## Try it

- https://useqr.app/vcard
- https://useqr.app/mecard
- https://useqr.app/social
