How to Upload Phone Numbers to Meta Custom Audiences: Complete Guide (2026)

Amir Arsalan Sharifi
How to Upload Phone Numbers to Meta Custom Audiences: Complete Guide (2026)

TL;DR — Quick Summary

  • Phone numbers must be in E.164 format (+countrycodenumber, no spaces) or your match rate will be 10–15% instead of 40–60%.
  • Via Ads Manager: create a Customer List custom audience, upload a CSV, map columns. Via API: hash first with SHA-256, then POST to the audience endpoint.
  • Always include a second identifier (email or name) alongside phone — multi-identifier lists consistently outperform phone-only uploads.
  • You need 100 matched users minimum for the audience to activate. Aim for 1,000+ before building lookalikes.

How to Upload Phone Numbers to Meta Custom Audiences: Complete Guide (2026)

Uploading a phone list to Meta and getting a 10% match rate is not a success. It is a symptom of a formatting problem. The contacts are real. The people are on Meta. But Meta cannot match your data to its users because the phone numbers are formatted differently from how Meta stores them — and SHA-256 hashing means even a single character difference produces a completely different hash that will never match.

This guide covers everything you need to upload phone numbers to Meta custom audiences correctly — the format spec, the column requirements, the step-by-step process via Ads Manager, the programmatic API path via n8n, and the specific mistakes that silently destroy match rates without throwing an error.

What You Need Before Starting
  • A Meta Business account with Ads Manager access
  • A phone number list in CSV or TXT format
  • Country codes for all numbers (mandatory for acceptable match rates)
  • Optionally: email addresses and/or first/last names to boost match rate

Step 1: Format Your Phone Numbers Correctly (This Is Where Most People Fail)

Before you open Ads Manager, your phone numbers need to be in E.164 format. This is the international standard for phone numbers: country code prefix, followed by the full national number, no spaces, no dashes, no parentheses, no leading zeros after the country code.

Country Wrong Format Correct E.164 Format
UAE 050 123 4567 / 0501234567 +971501234567
Saudi Arabia 0501234567 / 05 0123 4567 +966501234567
UK 07911 123456 / +44 7911 123456 +447911123456
US (555) 123-4567 / 1-555-123-4567 +15551234567
India 9876543210 / +91 98765 43210 +919876543210
The silent match killer: Trailing spaces. A phone number that looks correct — +971501234567 — but has an invisible trailing space will hash to a completely different value and never match. Run a trim operation on every field in your CSV before uploading. This single step consistently recovers 5–15% of match rate in otherwise well-formatted lists.

How to Clean Your Phone List in Google Sheets

If your list is in Google Sheets, use this formula in a new column to standardize UAE numbers:

// Assumes UAE mobile numbers in column A (format: 05X XXX XXXX or 05XXXXXXXX) ="+" & "971" & REGEXREPLACE(TRIM(A2), "^0|[\s\-\(\)]", "") // For mixed-country lists: use a lookup table mapping country to dial code // Then concatenate: "+" & VLOOKUP(country_col, dial_code_table, 2, 0) & local_number

For Python users processing larger lists:

import phonenumbers def to_e164(raw_number, default_country="AE"): try: parsed = phonenumbers.parse(raw_number, default_country) if phonenumbers.is_valid_number(parsed): return phonenumbers.format_number( parsed, phonenumbers.PhoneNumberFormat.E164 ) except: pass return None # flag invalid numbers for review

Step 2: Prepare Your CSV — What Columns Meta Accepts

Meta accepts a CSV with one or more identifier columns. The more identifiers you include, the higher your match rate. Phone alone will match some users. Phone + email + name will match significantly more, because Meta attempts to verify the match across multiple identifiers before including a user in the audience.

Column Name Meta Identifier Format Required Impact on Match Rate
phone PHONE E.164 (+countrycodenumber) Primary — high impact
email EMAIL Lowercase, trimmed Strongest identifier — very high impact
fn FN (First Name) Lowercase, no accents Medium impact as secondary
ln LN (Last Name) Lowercase, no accents Medium impact as secondary
country COUNTRY ISO 3166-1 alpha-2 (ae, gb, us) Low individual impact, improves overall
dob DOBY / DOBM / DOBD Year: YYYY, Month: MM, Day: DD Medium — useful for consumer lists
gen GEN m or f (lowercase) Low individual, useful in combination

A minimal high-performing CSV for a UAE phone list looks like this:

phone,email,fn,ln,country +971501234567,john@example.com,john,smith,ae +971507654321,sara@example.com,sara,al-rashidi,ae +971509876543,,ahmed,hassan,ae

Empty cells are fine — Meta simply cannot use that identifier for that record. A row with phone + email + name gives Meta three chances to match. A row with only phone gives it one.

Arabic names: If your contact list includes Arabic names (common for UAE-based consumer lists), include both the transliterated English version in fn/ln and, where possible, the email as the primary matcher. Meta's matching is based on how users registered their account — many UAE users registered with an English transliteration of their name, not the Arabic script.

Step 3: Uploading via Meta Ads Manager — Step by Step

Step 1 — Open Audiences

In Meta Ads Manager, click the grid icon → Audiences. Or navigate directly to business.facebook.com/adsmanager/audiences. You need Business Manager access, not just a personal ad account.

Step 2 — Create Audience

Click "Create Audience" → "Custom Audience" → "Customer List". This is the option for uploading external contact data. Do not select "Website" or "App Activity" — those are pixel-based audiences.

Step 3 — Prepare File

Meta will ask if you want to include a Customer Value column (LTV for value-based lookalikes). Skip this for your first upload unless you have reliable LTV data — incorrect LTV data can degrade lookalike quality. Click "No, upload a customer list without customer value".

Step 4 — Upload Your CSV

Upload the CSV you prepared in step 2. Meta will auto-detect column headers if they match its standard names (phone, email, fn, ln, country). If your headers are different (e.g., "mobile", "first_name"), the next screen will ask you to map them manually.

Step 5 — Column Mapping

Review the column mapping screen carefully. Each column should show a green checkmark and the correct identifier type. If a column shows "Do Not Upload", change the dropdown to the correct identifier. The phone column must be mapped to "Phone" — not "Other".

Step 6 — Agree to Terms and Upload

Check the data use agreement (confirming you collected this data lawfully and have permission to use it for advertising). Click "Upload and Create". Meta will begin hashing and matching immediately. Allow 30 minutes to 24 hours for large lists to fully process.

Step 7 — Check Match Rate

Return to the Audiences screen. Your new audience will show an estimated size once processing is complete. The audience detail will show the percentage of uploaded records that matched — your match rate. If it's below 20%, revisit your phone formatting.

Meta custom audience match rates for phone number lists: 10–15% for basic un-enriched lists → 40–60%+ for enriched lists with country codes, emails, and name fields. Segment-specific benchmarks: recent buyer lists achieve 60–80%, 12-month CRM contacts 45–60%, older or cold records 20–40%. Source: Versium — How to Improve Match Rates with Facebook Custom Audiences

Step 4: Automating the Upload with n8n and the Meta Marketing API

The Ads Manager upload works, but it is a manual process that does not scale. Every time your contact list grows, someone has to export, upload, and re-trigger the audience refresh. The Meta Marketing API solves this by allowing programmatic audience updates — your n8n workflow handles the upload automatically, on a schedule, whenever new contacts are added.

Critical difference: When uploading via Ads Manager, Meta hashes your data automatically after upload. When using the Marketing API programmatically, you must SHA-256 hash all identifier values yourself before sending them. Sending raw, un-hashed data to the API will result in errors or audience pollution.

The n8n Workflow: Automated Weekly Audience Refresh

Node 1 — Schedule Trigger

Set a weekly cron schedule (e.g., every Monday at 6am GST). This fires the workflow automatically without any human action required.

Node 2 — Google Sheets: Read New Contacts

Read all rows from your contact sheet where "Synced_to_Meta" column is empty. Filter to only new contacts since the last run using a stored timestamp.

Node 3 — Code Node: Normalize and Hash

Run the normalization and SHA-256 hashing logic on each record. Key rules: lowercase before hashing, trim whitespace, E.164 for phone. Output: array of hashed payloads in Meta's schema format.

The hashing code in n8n's Code node (JavaScript):

const crypto = require('crypto'); function sha256(value) { return crypto.createHash('sha256').update(value.trim().toLowerCase()).digest('hex'); } const contacts = $input.all().map(item => { const row = item.json; const entry = {}; if (row.phone) entry.phone = sha256(row.phone.replace(/\s/g, '')); if (row.email) entry.email = sha256(row.email); if (row.fn) entry.fn = sha256(row.fn); if (row.ln) entry.ln = sha256(row.ln); if (row.country) entry.country = row.country.toLowerCase(); // NOT hashed return entry; }); return contacts.map(entry => ({ json: entry }));
Node 4 — HTTP Request: Push to Meta API

POST the hashed payload to the Meta Marketing API audience endpoint. Include your access token in the Authorization header. Batch up to 10,000 records per API call.

The API call structure:

POST https://graph.facebook.com/v19.0/{AUDIENCE_ID}/users { "payload": { "schema": ["PHONE", "EMAIL", "FN", "LN"], "data": [ ["hashed_phone_1", "hashed_email_1", "hashed_fn_1", "hashed_ln_1"], ["hashed_phone_2", "", "hashed_fn_2", "hashed_ln_2"] ] } } // Authorization: Bearer {YOUR_ACCESS_TOKEN} // Content-Type: application/json
Node 5 — Google Sheets: Mark as Synced

Update the "Synced_to_Meta" column to the current timestamp for all processed records. This prevents double-uploading on the next run.

Audience ID: Find your audience ID in Ads Manager → Audiences → click your audience → the URL contains the ID (e.g., …/audiences/123456789). You can also create a new audience programmatically via POST /act_{AD_ACCOUNT_ID}/customaudiences and store the returned ID for subsequent updates.

Common Upload Errors and How to Fix Them

Problem Likely Cause Fix
Match rate under 20% Missing country codes, inconsistent phone format Reformat to E.164, add country code to all numbers
Audience stuck at "Processing" Large file size or Meta backend delay Wait 24 hours. If still stuck, re-upload a smaller batch
API returns "Invalid hash" Data not normalized before hashing Ensure lowercase + trim before SHA-256
Audience shows "<1,000" size List too small or too few matched users Upload more contacts or improve enrichment to raise match rate
"This audience can't be used" Policy restriction (housing/employment/financial ads) Check Meta's Special Ad Categories — customer lists restricted for these since March 2025
Column mapping shows "Other" Column header not recognized by Meta Rename headers to Meta standard names (phone, email, fn, ln) or map manually

After Upload: Building Lookalike Audiences from Your Phone List

A custom audience of matched phone contacts is the seed. The lookalike audience built from it is where the scale comes from. Once your custom audience has 1,000+ matched users, Meta has enough signal to identify users who share similar characteristics — even people whose phone numbers are not in your list.

Creating a Lookalike from Your Custom Audience

In Ads Manager → Audiences → Create Audience → Lookalike Audience. Select your phone list custom audience as the source. Choose 1% similarity for the highest-quality, most targeted lookalike. Select your target country (UAE, GCC, or globally). Meta will build the lookalike within 6–24 hours.

At 1% similarity in the UAE, Meta finds approximately 50,000–80,000 users who most closely resemble your matched phone contacts. This is your highest-ROI expansion audience — Meta has validated these people against real contact data, not interest tags or demographic guesses.

Build Your Phone List First AED 176 one-time

LinkedIn Lead Generation Agent — Automated Contact Sourcing

Before you can upload phone numbers to Meta, you need them. The LinkedIn Lead Gen Agent identifies your target decision-makers or business contacts, reaches out automatically, and collects structured contact data — including phone and email — that goes directly into your pipeline for Meta upload. It replaces the manual work of building a prospect list from scratch.

  • Identifies 50–200 qualified contacts per week matching your ICP
  • Exports structured data (name, company, LinkedIn URL, email where available) for Clay enrichment
  • Runs outreach sequences that prompt contacts to share their details
  • Integrates with Google Sheets for direct pipeline input
The fastest way to build a qualified phone list for your first Meta custom audience — without data broker fees
Get the LinkedIn Lead Gen Agent →

Want the Full Pipeline — Not Just the Upload?

Read our complete guide to building an agentic lead gen pipeline: from AI contact sourcing through to Meta campaign launch — fully automated with n8n.

Read the Full Pipeline Guide Get the LinkedIn Agent — AED 176

Questions about setup? WhatsApp us — we respond within the hour.

Frequently Asked Questions

How do I upload phone numbers to Meta custom audiences?

Go to Meta Ads Manager → Audiences → Create Audience → Custom Audience → Customer List. Prepare a CSV with phone numbers in E.164 format (e.g., +971501234567). Upload the file, map the phone column to the Phone identifier, and let Meta hash and match the records. You need at least 100 matched users for the audience to go live.

What format do phone numbers need to be in for Meta?

E.164 format: country code followed by the full national number, no spaces, dashes, or parentheses. UAE example: +971501234567. UK example: +447911123456. Numbers without country codes will match at a fraction of their potential rate.

Does Meta hash phone numbers automatically?

Yes — when uploading via Ads Manager, Meta hashes data automatically. When using the Marketing API programmatically, you must SHA-256 hash all identifier values yourself before submitting. Sending raw un-hashed data to the API will cause errors.

What is a good match rate for phone number custom audiences?

A well-formatted, enriched phone list should achieve 40–60% match rate. Raw lists typically match at 10–15%. If you're below 20%, the most common causes are missing country codes, inconsistent formatting, or using business landlines instead of personal mobile numbers.

Can I automate the phone number upload to Meta?

Yes. The Meta Marketing API supports programmatic custom audience updates. Using n8n, you build a workflow that takes new contacts from a Google Sheet, hashes their identifiers with SHA-256, and POSTs the payload to Meta automatically on a weekly schedule. No manual CSV uploads required once the workflow is live.

How many contacts do I need to start running Meta ads against a custom audience?

Meta requires a minimum of 100 matched users for a custom audience to be eligible for ad delivery. For meaningful campaign optimization and lookalike audience creation, aim for 1,000+ matched users. At a 40% match rate, this means uploading approximately 2,500 contacts.

Amir Arsalan Sharifi — AI Consultant & Marketing Psychologist
Amir Arsalan Sharifi AI Consultant & Marketing Psychologist · PhD · Dubai & MENA

Amir is the founder of PEESHEE Ai and a PhD-level marketing psychologist specializing in AI automation, Shopify strategy, and agentic AI systems for businesses across the MENA region.

custom audience phone list E.164 format Meta Meta ads UAE Meta custom audience Meta Marketing API phone list upload upload phone numbers Meta