Merge VCF Files and Remove Duplicate Contacts

Load several .vcf files, see which contacts are duplicates, and decide what happens to each group before anything is written. Everything runs in the browser.

Or paste vCard text instead of loading files

Any one match links two cards into the same group. Phone matching compares the last nine digits after removing spaces, dashes, brackets, and country prefixes.

On keeps every phone, email, and address from every copy. Off keeps the first card in each group and discards the rest.

How the merge works

A VCF file is text. Each contact is a block that starts with BEGIN:VCARD and ends with END:VCARD, and the lines in between are properties such as FN for the display name and TEL for a phone number. A file can hold one card or twenty thousand. Merging is therefore a parsing problem, not a contacts app problem, and it does not need an account or a sync.

The tool reads every file, unfolds the lines, decodes quoted-printable values when the card declares vCard 2.1, and builds a list of cards. It then looks for links between cards using the match keys you enabled.

Links are resolved with a union-find structure. If card A matches card B on a phone number, and card B matches card C on an email, all three end up in one group even though A and C share nothing directly. That is the behaviour you want when the same person appears in an old phone export, a Google export, and a work directory with slightly different data in each.

Once the groups exist, the merge step walks the cards in each group and collects properties. Phone numbers, emails, URLs, addresses, and notes are all kept. A duplicate property with the same name and the same cleaned value is dropped once. For single-value fields, the longest non-empty value wins, which in practice means a card with a full name beats one with initials.

Nothing is written until you click a download button. The preview list is the point: you can see the groups, open one, read the copies side by side, and uncheck a group before it is collapsed. That review step is what separates a merge from a blind dedupe.

What counts as a match

Key Normalisation Example that matches Example that does not
Phone Keep digits only, compare the last nine +62 812 3456 7890 0812 3456 7891
Phone Spaces, dashes, and brackets removed (555) 123-4567 555 123 4568
Email Lowercase and trim John.Doe@Example.com john.doe@example.org
Name Lowercase, punctuation stripped, spaces collapsed José Álvarez Jose Alvarez (with a different email and no shared phone)

The nine-digit phone comparison is a deliberate trade. It is long enough that two different local numbers rarely collide, and short enough that a country code, a leading zero, or a trunk prefix does not prevent a match. Numbers shorter than seven digits are compared as-is, which covers short codes and extensions.

Name matching is off by default. It is the key most likely to over-merge, because common names are not unique. Turn it on when the phone numbers have changed and the emails are missing, and then read the preview before exporting.

Common inputs and what happens

Input Result Why
iPhone export and Android export of the same address book Groups form on phone and email. Both phone numbers survive in each merged card. Same people, different formatting. Field-level merge keeps both numbers.
One file that already contains internal duplicates Groups form inside the file. Same behaviour as across files. Grouping does not care which file a card came from.
Google Contacts zip with one card per file Load the unzipped .vcf files. A thousand single-card files merge the same as one big file. Each file is parsed independently, then grouped together.
Two different people both named John Smith If name matching is on and they share no phone or email, they group. Uncheck the group to keep both. Name matching is the over-merge case. The preview exists for it.
One contact with three phone numbers No group forms unless another card shares one of the numbers. All three numbers stay on the card. Grouping links cards, it does not trim properties within one card.
vCard 2.1 with quoted-printable accented names Decoded before matching, so José in 2.1 matches José in 3.0. The decoder runs before the keys are built.
Outlook export with a CHARSET parameter Read using the declared encoding, with a UTF-8 fallback. Outlook writes 2.1 or 3.0 depending on version.
Cards with base64 photos One photo kept per merged card. Duplicate photo data is dropped. Photo values are deduplicated by content prefix, not re-encoded.

When you would use this

You moved from an Android phone to an iPhone, exported both address books, and now have two VCF files with overlapping contacts. Importing both gives you duplicates in the new phone. Loading both here first and exporting one merged file skips that cleanup entirely.

You have a Google Contacts export, an iCloud export, and an old Outlook export from a previous job. Each holds a slightly different phone number for the same people. Merging at the field level keeps every number, which is usually the point of keeping old exports at all.

You are about to import into a CRM and the import tool refuses duplicates or, worse, silently creates them. A clean VCF with one card per person is the input the import expects.

You inherited a shared contacts file from a team and it has the same client listed three times with different spellings. The preview shows the three copies next to each other, so you can decide which name to keep rather than letting a script decide.

You want to check a file for duplicates without changing it. Analyze, read the groups, and stop. Nothing is written unless you click download.

What this does and does not handle

It handles:

It does not handle:

Questions

How do I merge VCF files into one file?

Drop two or more .vcf files into the box and click Analyze. Every contact from every file is read, duplicate groups are listed, and the download button writes one combined VCF. The merge happens in the browser tab, so the files are never uploaded to a server.

How do I remove duplicate contacts from a VCF file?

Load the file and open the duplicate groups in the result list. Each group shows every copy and which field matched. Leave a group checked to collapse it into one contact, or uncheck it to keep every copy. Then download the cleaned VCF. You can also review the groups without changing anything first, which is the step most duplicate removers skip.

What counts as a duplicate contact?

By default, two cards are treated as the same person if they share a phone number, an email address, or a normalised full name. Phone matching compares the last nine digits after removing spaces, brackets, dashes, and country prefixes, so 0812 3456 7890 and +62 812 3456 7890 match. Email matching is case-insensitive. Name matching lowercases and strips punctuation. Any one match links the cards into a group.

How do I merge vCard contacts that have different phone numbers?

Turn on name matching and turn phone matching off, or leave both on and check the group manually. If two cards share a name but no phone and no email, name matching links them. If the name is common, such as two different people both called John Smith, uncheck that group before exporting so both are kept.

Does merging keep both phone numbers and both email addresses?

Yes. Merging is field-level, not card-level. Every TEL and EMAIL value from every copy in the group is kept and written into the merged card. The same applies to URLs, addresses, and notes. For single-value fields such as the display name and organisation, the longest non-empty value wins.

Can I merge contacts from an iPhone and an Android phone?

Yes, that is the most common case. Export contacts from each phone as a .vcf and load both files. The parser handles vCard 2.1, which older Android exports use, and vCard 3.0, which iOS uses. Quoted-printable encoding and folded lines from 2.1 exports are decoded before matching, so accented names and long notes compare correctly.

Does it work with Google Contacts and iCloud exports?

Yes. Google Contacts exports either a single .vcf or a .zip containing individual cards, and iCloud exports a .vcf. Unzip the Google export first and load the .vcf files. Both use vCard 3.0 with UTF-8 values, which this tool reads without conversion.

Are my contact files uploaded to a server?

No. The page uses the browser File API to read the files locally and JavaScript to parse and merge them. There is no network request during analysis or export. You can confirm this by loading the page, switching the browser to offline mode, and running the merge.

What is the difference between merging and deduplicating?

Deduplicating drops extra copies. Merging combines them. If two cards for the same person each hold a different phone number, deduplicating keeps one card and loses the other number. Merging keeps one card and writes both numbers into it. This tool does the second by default, and you can switch to the first by unchecking Merge duplicate fields.

How do I combine vCard files that use different versions?

Load them together. Each file is parsed according to its own VERSION line, so a 2.1 file and a 3.0 file in the same batch are both read correctly. The output is always written as vCard 3.0, which iOS, Android, Google Contacts, Outlook, and macOS Contacts all import. Lines are folded at 75 octets with CRLF endings, which is what the spec requires.

Why did some contacts not merge?

Three common causes. First, the phone numbers differ in a way that survives normalisation, for example one card has an extension appended. Second, the names are spelled differently and name matching is off. Third, email matching is off and the emails differ. Turn on the extra match keys and rerun the analysis, or check the group list for a pair that looks like it should have matched and compare the fields shown under each copy.

Can I export the merged contacts as CSV instead of VCF?

Yes. There are two download buttons, one for VCF and one for CSV. The CSV includes name, first and last name, up to two phone numbers, up to two email addresses, organisation, title, notes, and a joined address. It is UTF-8 with a byte order mark, so Excel opens accented characters correctly without an import step.

Is there a limit on file size or number of contacts?

There is no hard limit in the code, and the practical limit is the browser tab's memory. Files totalling tens of megabytes and tens of thousands of contacts usually process without trouble on a desktop browser. The preview list is capped at 150 duplicate groups for rendering speed, but the export always includes every contact.

Will this work with VCF files exported from Outlook or Windows Contacts?

Yes. Outlook exports vCard 2.1 or 3.0 depending on the version, and Windows Contacts exports 2.1. Both are parsed. Outlook sometimes writes a CHARSET parameter on text fields; the decoder respects quoted-printable and falls back to UTF-8 when the charset is ambiguous.

What is a VCF file?

A VCF file is a plain text file holding one or more vCards. Each card starts with BEGIN:VCARD and ends with END:VCARD, and the lines between them hold properties such as FN for the display name, N for the structured name, TEL for phone numbers, and EMAIL for addresses. A single file can contain hundreds of cards, which is why merging them is a text problem rather than a contacts app problem.

Can I split a VCF file into separate files?

Not on this page. This tool merges and deduplicates. Splitting writes one file per contact or per group, which is a different output step. The merged VCF it produces can be split by any tool that accepts a standard vCard 3.0 file.