Half of outreach operators lose contacts at the upload stage - not because of a ban, but because of a badly built file or tapping a VCF directly on iPhone. The topic looks technically simple, but "dump 50,000 contacts and start outreach right away" is a misconception that kills both the account and the list. After this article you'll have a working workflow for prep, conversion, and batched import on both platforms.
VCF (Virtual Contact File, aka vCard) is a plain text file. Each contact is wrapped in a block:
BEGIN:VCARD
VERSION:3.0
FN:John Client
TEL;TYPE=CELL:+14155552671
END:VCARD
Critical details:
3.0 or 4.0. Version 2.1 doesn't support UTF-8 in the standard, and Cyrillic or accented names turn into garbled characters on import. Cause - encoding conflict without an explicit CHARSET=UTF-8 tag.+, then country code, up to 15 digits. Format (415) 555-2671 vCard saves as-is - WhatsApp won't recognize it, outreach to those entries won't run.FN (Full Name) field - required. Without a name the contact may not import or creates an empty record.Minimum table structure before conversion:
| Name | Number (E.164) | Prefix (optional) |
|---|---|---|
| John Client | +14155552671 | Lead_01 |
| Maria Sample | +14155552672 | Lead_02 |
Why a prefix. Add a unique marker to the name - e.g. Lead_23_ - and after the campaign you can find the whole upload in address book search with one query and delete in bulk. Without a prefix you'll be cleaning manually from thousands of records.
Before conversion: remove empty rows, extra columns, check every number format. Batch normalize local format to E.164 - via Ctrl+H in Excel or a formula like ="+1"&RIGHT(A2,10) for US numbers (adjust country code for your market).
Three working approaches:
1. Excel macro (VBA). Generates VCF straight from the table, fully under your control. Fits if lists are regular and you need a repeatable process. Plenty of examples on GitHub.
2. Python + vobject library. Full control over fields, encoding, version. Best for operators with large lists or non-standard fields (groups, tags, notes).
3. Online converters (tovcf.com and similar). Fastest for a one-off - upload Excel, download VCF. Convenient, but with a serious limitation: uploading a client list to a third-party service means handing numbers to someone else. For third-party client data that's a privacy policy violation and may conflict with local data-protection rules in your jurisdiction. Use online converters only for your own test lists or where explicitly allowed.
Either way, manually check the first 10–20 lines of the generated VCF in a text editor - before import.
Android reads VCF natively through the Contacts app. Workflow:
Where to save - debated. Some practitioners prefer local storage: less risk of Google antifraud firing when uploading thousands of contacts at once. Others think Google sync looks "more natural" to WhatsApp algorithms. No definitive data - choose based on scale and acceptable risk.
Important for budget Android (< 6–8 GB RAM): importing a file with 30,000+ contacts can push background process android.process.acore and WhatsApp sync into Out-of-Memory crash. Device heats up, process restarts in a loop. Fix - split the list before import, not after.
Common myth: "I sent the VCF in Telegram, tapped - all 20,000 contacts saved." Not true. iOS opening a multi-contact VCF from a messenger or mail shows only the first contact card. The system silently ignores the other thousands.
Working methods for iPhone:
Via iCloud (recommended as primary):
Via AirDrop: send VCF from Mac or another iPhone → confirm adding contacts. Works for small batches.
Via mail: attach VCF to an email → on iPhone open attachment → Add All Contacts. "Add All" appears only with correct vCard 3.0 format.
Official iCloud limit - 50,000 contacts. In practice you won't upload that in one file.
What happens when you try 30,000 contacts in one file via iCloud.com: browser hangs 10+ minutes, then timeout - contacts don't save. Standard fix from practice: split into 6 files of 5,000 records, import sequentially with ~10 minute pauses between batches.
Recommended batch size:
| Platform | Recommended batch | Reason |
|---|---|---|
| Android (flagship) | up to 10,000 | Native import stable |
| Android (budget, < 6 GB RAM) | 3,000–5,000 | OOM crash at larger volumes |
| iPhone / iCloud.com | 2,000–5,000 | Browser timeout at > 10,000 |
Split VCF manually in a text editor at BEGIN:VCARD tags or with a script. Each output file must end with a complete END:VCARD block.
When contacts appear in the phone book and WhatsApp has contact access, the app runs background Contact Discovery - hashes numbers and matches against Meta's database. Standard mechanics.
What matters:
Per operator observations (Meta publishes no official thresholds), the system tracks not only message sends but also abnormal address book change speed. An account that historically had 50 contacts and gained 40,000 new ones in one sync cycle gets hard pre-moderation status (Sandbox). In that mode address book protective properties (visibility as a "known" sender) are neutralized even before outreach starts.
Practical rule: don't start outreach right after importing a large list - especially on a new account. Let the account "digest" sync. Ideal - stretch batched import over several hours, send first messages no sooner than 24 hours later.
Numbers without +: WhatsApp doesn't recognize contacts without country code in E.164. Entry 4155552671 in the phone book is invisible to outreach. Check the list before conversion, not after.
Garbled names. Cause - vCard 2.1 without explicit CHARSET=UTF-8. Fix: always generate version 3.0 or 4.0.
Contacts didn't appear after iPhone import. Cause - opened VCF via messenger, iOS saved only the first. Fix: import via iCloud.com or AirDrop.
WhatsApp doesn't see contacts after import. Cause - numbers without country code or non-standard format. Fix: normalize in Excel before conversion.
iCloud import timeout. Cause - file too large. Fix: split into 2,000–5,000 batches, 10 minute pause between.
OOM crash on Android. Cause - RAM < 6–8 GB, file > 30,000 records. Fix: batches of 3,000–5,000.
Prepare an Excel template with three columns (name, E.164, prefix), set up one conversion method, and run a 500-contact test list through the full cycle - Excel to WhatsApp verification. Takes 20 minutes and closes technical questions before a real campaign.
Practical rule:
One VCF for thousands of contacts isn't one import - it's a dozen sequential ones, with pauses and checks after each.