vCard Contact QR Code Generator

One scan puts your name, number, email, and company into the other person's address book — no typos, no "I'll save it later". The card is generated in your browser; your details are never sent to us.

Adds a contact to the address book.

Contact card details

Style & export options

A logo hides part of the code, so it is capped at 16% of the code area (a decode-tested limit) and error correction is forced to level H.

Fill in the form — the code appears as you type.

Codes render on light backgrounds for reliable scanning.

What the code contains
 

Keep this code

Optional — the downloads above already work without saving anything.

Device saves stay in this browser; account saves need a free account. Both appear in My codes.

Save this code to an account

A free account keeps your codes in one library you can open from any device. Your code is ready — sign up or sign in, and it will be saved automatically.

Sign up free Sign in

Before this leaves your device

vCard vs MECARD — and why this generator uses vCard

Two text conventions carry contact details inside a QR code: MECARD, a compact convention with a short list of fields, and vCard, the format address books exchange contacts in. This generator emits vCard 3.0 as specified in RFC 2426 — chosen over MECARD for broader field support and better scanner coverage. The specification sources behind every builder on this site were verified against the live documents on 2026-07-20, and the vCard builder is tested against independently constructed reference strings, including hostile inputs such as names with commas and backslashes.

The price of the richer format is length. A vCard payload is longer than a link, so the symbol has more modules, and that is the one fact about contact codes worth understanding before printing one. The sections below show exactly what the generator writes, line by line, how the escaping rules protect punctuation, and how payload length becomes the version and module count printed under each example.

Guide: vCard contact QR codes covers the convention, its escaping rules and more engine-built cards in depth. The guides index has the rest of the series.

Worked example

A card for Ada Lovelace, Chief Engineer at Analytical Engines Ltd, encodes as:

BEGIN:VCARD
VERSION:3.0
N:Lovelace;Ada;;;
FN:Ada Lovelace
TEL;TYPE=CELL:+442079460958
EMAIL:ada@example.com
ORG:Analytical Engines Ltd
TITLE:Chief Engineer
END:VCARD

Every line ends with CRLF as the vCard standard requires, and characters like commas and semicolons in names are escaped automatically — a company called "Smith, Jones & Co" will not break the card.

What each line of the payload contains

The builder writes one content line per field, in a fixed order, and only for the fields you filled in. The smallest card it will produce needs a first or a last name; with neither, the form reports "Enter at least a first or last name." The firms, numbers and addresses in every card on this page are invented; the worked example above borrows a historical name as a placeholder, with an invented firm, an example.com address and a reserved-range number. A card for Mira Quill with nothing else filled in is 5 lines:

BEGIN:VCARD
VERSION:3.0
N:Quill;Mira;;;
FN:Mira Quill
END:VCARD

Version 5, 37×37 modules, error correction M — the symbol facts are read back from the encoder, as explained below.

  • BEGIN:VCARD and END:VCARD bracket the card, and VERSION:3.0 declares which edition of the format the lines between them follow.
  • N is the structured name. Its components are separated by semicolons in the order RFC 2426 fixes — family name, then given name, then three components (additional names, honorific prefixes, honorific suffixes) that this generator leaves empty. That is why a name-only card still shows a run of semicolons: the empty components are part of the format, not a defect.
  • FN is the formatted name: the first and last name joined by a space, or whichever one of them you entered.
  • TEL;TYPE=CELL carries the phone number, labelled as a mobile number, after normalization to E.164 — the plus-prefixed international form that the tel: URI scheme (RFC 3966) uses. Spaces, dots, dashes and parentheses are accepted and removed, a leading 00 is accepted as an alias for +, and a number without a country code is refused rather than guessed. The 7-field card below was typed as +44 20 7946 0123 and is stored as TEL;TYPE=CELL:+442079460123.
  • EMAIL is checked for the shape of an address — something, an @, something, a dot, something — and then escaped like any other text value.
  • ORG and TITLE are escaped text values; the next section shows what the escaping does to them.
  • URL passes through the same validation as the URL generator: the protocol must be present and must be http or https. It is then written as the trimmed text, unchanged — never wrapped in a shortener or tracking redirect.

Every line, including the last, ends with the two-character CRLF sequence the standard requires (RFC 2426 §2.4.2). The line endings are invisible in the boxes on this page but are part of the payload: the name-only card is 69 characters long, of which 10 are line endings. A card with all 7 fields filled in — the most this generator can carry — looks like this:

BEGIN:VCARD
VERSION:3.0
N:Quill;Mira;;;
FN:Mira Quill
TEL;TYPE=CELL:+442079460123
EMAIL:mira@example.com
ORG:Quill Cartography
TITLE:Head of Maps
URL:https://example.com/mira
END:VCARD

Version 10, 57×57 modules, error correction M. 195 characters across 10 lines.

Escaping: commas, semicolons, backslashes and line breaks

RFC 2426 reserves four things inside a text value: the backslash, the semicolon, the comma and the line break. The semicolon is the component separator visible in the N line, so a surname containing one would otherwise be read as a component break; the comma and the backslash are reserved by the format in the same way. The builder's escaping helper prefixes each of the three characters with a backslash and flattens a line break into the two characters \n. Three demonstrations, each computed by that helper when this page was built:

  • A company typed as Quill, Fern & Sons; Ltd is written as Quill\, Fern & Sons\; Ltd.
  • A value typed with a literal backslash, Finance\Audit; Ltd, becomes Finance\\Audit\; Ltd. The backslash is doubled first, and only then is the semicolon escaped, so a reader unescaping the line gets back exactly what was typed instead of a mangled sequence. That ordering is locked by a test.
  • A value containing a line break, Floor 2↵North wing (↵ marks the line break typed into the field), is flattened to Floor 2\nNorth wing — a backslash and the letter n, not an actual newline, so the one-line-per-field structure of the card survives whatever is pasted in.

Applied to a card, the escaping lands in the ORG and TITLE lines. A partner at an invented, heavily punctuated firm encodes as:

BEGIN:VCARD
VERSION:3.0
N:Ferncastle;Tobias;;;
FN:Tobias Ferncastle
ORG:Quill\, Fern & Sons\; Ltd
TITLE:Partner\, Audit
END:VCARD

Version 8, 49×49 modules, error correction M. The ampersand needs no escaping; the commas and the semicolon do.

Nothing is escaped in the URL line, because a URL has its own encoding rules and has already been validated as one, and nothing in the phone line can need escaping once E.164 normalization has reduced it to a plus sign and digits. The escaping exists so that punctuation in a name or a company cannot corrupt the card. Scan a test print and read what the phone shows.

Reading the symbol facts: version, modules and error correction

Under each example is a line of symbol facts. They come from the encoder, not from this page: the payload is handed to the vendored reference encoder, which chooses the smallest QR version that holds it at the requested error-correction level, and the page prints what came back. The interactive generator above runs the same engine, so the facts it shows for your own card are produced the same way.

  • Version is the symbol's size class, the encoder's choice from the versions it numbers 1 to 40. The engine's model documents the side length as a constant plus a fixed number of modules per version, and this page's build asserts that every card on it obeys that rule. Read off the cards here, the constant is 17 and each step up in version adds 4 modules to the width and to the height: for the name-only card, 17 + 4 × 5 = 37; for the 7-field card, 17 + 4 × 10 = 57.
  • Modules is that side length, excluding the quiet zone. Every download adds 4 modules of white on each side on top of it.
  • Error correction is the level actually encoded. The examples on this page request level M, the generator's default without a logo; the reference encoder raises the level when a higher one fits in the same version without growing the symbol, so an example can report Q or H although M was requested. The level is never lower than requested.
Card Fields Payload Version Modules EC
Name only first name, last name 69 chars 5 37×37 M
Punctuated firm name, organization, title 137 chars 8 49×49 M
Worked example above name, phone, email, organization, title 175 chars 9 53×53 M
All 7 fields name, phone, email, organization, title, URL 195 chars 10 57×57 M

The table is ordered by payload length, and the mechanism is visible reading down it: each extra field lengthens the payload, and a longer payload needs at least as high a version — more, and therefore smaller, modules at any given print size. The name-only card is version 5; the 7-field card is version 10, 57 modules on a side against 37. There is nothing to look up: enter the fields and the generator reports the version for exactly what you typed.

Print size at the PNG presets

The PNG download offers 3 pixel sizes, and the generator labels each with its printed size at 300 DPI — pixels divided by 300 gives inches, and inches times the millimetres in an inch gives millimetres:

  • 512 px — 1.71 in × 1.71 in (43.3 mm × 43.3 mm) at 300 DPI
  • 1024 px — 3.41 in × 3.41 in (86.7 mm × 86.7 mm) at 300 DPI
  • 2048 px — 6.83 in × 6.83 in (173.4 mm × 173.4 mm) at 300 DPI

The preset changes the number of pixels, not the number of modules. The exporter spreads the symbol's modules, plus the quiet zone, across the chosen width, placing module edges on rounded pixel boundaries so that adjacent modules never leave antialiasing seams. Dividing the printed width by the total module count gives the average module pitch, which is where payload length shows up on paper:

Preset Printed width Name-only card (37 modules) 7-field card (57 modules)
512 px 43.3 mm 0.96 mm per module 0.67 mm per module
1024 px 86.7 mm 1.93 mm per module 1.33 mm per module
2048 px 173.4 mm 3.85 mm per module 2.67 mm per module

Same preset, same printed width — the fuller card simply spends that width on more modules. That is the whole of the "fill in only the fields you need" advice: every optional field you leave empty keeps the payload shorter, and a shorter payload never needs a higher version, so its modules are at least as large at the same size. What this page will not give you is a minimum size. The methodology is explicit that error correction helps a damaged code scan but print size and contrast still matter, and that a freshly generated code is untested until a real device has scanned it. Print one, scan it, then print the rest.

The SVG download is the same symbol as a single vector path with the module size as its scale factor, so it scales without pixelation and keeps module edges crisp at any output size. It includes the quiet zone, like the PNG.

What the generator cannot verify

The builder validates format, not truth. It can tell that a phone number has a country code and a plausible number of digits, that an email address has the shape of one, and that a URL has a protocol — and nothing more. It cannot know whether the number is reachable, whether the mailbox exists, whether the URL is safe, or whether the job title is still current. A number with two digits transposed encodes perfectly, scans perfectly, and saves a contact nobody can reach. Check each field against its source before printing, because the only way to find such a mistake afterwards is to scan the card and read what comes up.

The code is static: the contact details live in the image, with no redirect through our servers. That is why it never expires and cannot be held hostage — and also why it cannot be edited after printing and scans cannot be counted. A changed number means a new code, and the old printed cards keep handing out the old number for as long as they circulate.

The code itself cannot write to a contacts list — it carries text and nothing more, and saving that text is the scanning person's action, not the code's.

Common misreadings

  • Cropping the quiet zone. The 4-module white border is part of the symbol as the standard defines it. The renderer always draws it and offers no way to disable it; trimming it away in a layout program is the most common self-inflicted scan failure.
  • Inverting the colours. The style panel computes the contrast of your colour pair with the WCAG relative-luminance formula and warns below 4.5:1. It warns separately for light-on-dark (inverted) codes, which many scanners reject, however high the ratio.
  • Expecting a wrong number to fail. The card encodes whatever was typed. Format is checked; truth is not. A code that scans is not evidence that its contents are right.
  • Treating the logo as part of the contact. The optional logo in the style panel is drawn over the symbol, not written into the vCard. Adding one forces error correction H and is capped at 16% of the symbol area — a cap set by decode-testing a worst-case logo in the round-trip suite, not derived from the theoretical recovery ceiling of level H.
  • Expecting a larger PNG to be a different code. It is the same symbol at a larger module pitch; the version and the module count are fixed by the payload, as the tables above show.
  • Sharing the card as a message. The WhatsApp share in the delivery row sends text, and the engine's share plan for a vCard payload is a note rather than a link — a fact this page checks at build time. The note reads: "WhatsApp sharing sends text, not images — and this code’s content is not a link, so pasting it into a chat would be meaningless. Download the PNG and attach it in WhatsApp instead."

vCard QR code FAQ

Can I update the contact details after printing?

No — the details live inside the code itself, which is what makes it permanent and server-free. If your number changes, generate and print a new code. (Services that promise "editable" contact codes host your data on their servers and charge for the privilege; see the honest comparison on the about page.)

Which fields can the card carry?

7 fields: first name, last name, one phone number (written as TEL;TYPE=CELL), email, organization, job title and a website URL. At least a first or last name is required; every other field is optional and produces a line only when it is filled in. There is no field for a postal address, a second number, a birthday or a photo, so a card never has more than the 10 lines of the 7-field example on this page.

Is a photo or logo included in the contact?

No. The builder has no photo field, so nothing in the card is an image. The optional logo in the style panel decorates the code image itself: adding one forces error correction H, and the logo may cover at most 16% of the symbol area. It is not part of the contact data.

Why does the phone field want the international format?

Because the card travels. A contact saved as +44 20 7946 0958 dials correctly from any country; a local-format number breaks the moment the person who scanned it crosses a border. The builder stores the number in E.164 form — a plus sign, the country code and the national number with no spaces or punctuation — which is the form the tel: URI scheme (RFC 3966) uses. Spaces, dots, dashes and parentheses are accepted and removed; a number without a country code is refused rather than guessed.

Why does my code get denser when I fill in more fields?

Because every filled-in field adds a line to the payload, and the encoder chooses the smallest QR version that holds the payload. On this page the name-only card is version 5 (37 modules on a side) and the 7-field card is version 10 (57 modules on a side). At the same print size the denser card has smaller modules, which is why leaving optional fields empty is worth doing when you do not need them.

Does the generator check that the number, email or website is real?

No. It checks format only: a country code and a plausible digit count for the phone, the shape of an address for the email, a protocol for the URL. It cannot know whether the number is reachable, whether the mailbox exists or whether the site is safe. Scan a test print and read what the phone shows before you print the rest.

Where does my data go when I generate a card?

Nowhere. Encoding runs in your browser; this page sends nothing you type to any server. If you choose "Save to my account", that specific card is stored in your private library — and because contact details are personal data, the generator shows an explicit notice before the first such save.

Pair the card with a WhatsApp chat code or a plain phone call code for single-action alternatives, or an email code for a pre-addressed message.