Facebook Custom Audience File Format: Columns, Phone Rules and What Lowers Your Match Rate
A Facebook custom audience file is a CSV with one person per row and Meta's own column names: email, phone, fn, ln, ct, st, zip and country, each normalised to Meta's rules. The values matter as much as the headers: lower-case emails, phones as digits with a country code, names and cities in lower-case letters only. The Facebook custom audience file formatter writes that file from a CRM or lead export. Before you upload it, check the addresses. A closed mailbox can't match an account, and it was never going to lift your audience size.
Format a customer list for Meta →
What Meta's docs say about each column
These rules come from Meta's developer guide on custom audiences, read on 9 November 2026, in our words.
| Column | Normalisation rule |
|---|---|
| Trim spaces at the start and end; lower-case | |
| phone | Remove symbols, letters and leading zeros; add the country code if no country is given |
| fn (first name) | Lower-case, letters a to z, no punctuation |
| ln (last name) | Lower-case, letters a to z, no punctuation |
| ct (city) | Lower-case, a to z only, no punctuation, special characters or spaces |
| st (state) | US: two-character ANSI abbreviation, lower-case. Outside the US: lower-case, no punctuation or spaces |
| zip | Lower-case, no spaces; US: first five digits only |
| country | Lower-case ISO 3166-1 two-letter code |
Meta's docs also list other keys such as date of birth parts and gender. The formatter doesn't write those. One note in the docs: for first and last names, the table allows UTF-8 special characters, but the text recommends Roman-alphabet translations with no special characters for the best match rate.
Which columns matter most
Email or phone gives the strongest matches. Names, city, state, ZIP and country add context that helps Meta match the rest. Having more columns filled in for each row helps, but a row with only a good email still counts.
Rows with neither a usable email nor a usable phone are of little use, and the formatter leaves them out and counts them so you can see how much of the export was empty.
Hashing: when it's needed
Meta's developer docs say data must be hashed with SHA-256, with the hex output in lower case, for all keys except a few such as external identifiers, app user IDs, page-scoped user IDs and mobile advertiser IDs. They add that you normalise first, hash on your side, and send the hashed values.
That is the rule for the Marketing API. For a file you upload by hand in Ads Manager, we didn't verify Meta's current wording, so read its customer list help page before deciding. In both cases:
- Sending through the API, or giving the list to a partner who uploads it: hash the normalised values with SHA-256. The formatter has a tick box for that, and the email hasher hashes a plain address list.
- Uploading by hand: start from a well-formatted plain CSV and follow what Meta's page says about hashing.
Normalise first, then hash. Hashing [email protected] and [email protected] gives two different results, and only one can match.
The upload itself
In Ads Manager, the route is Audiences, then Create audience, then Custom audience, then Customer list. You upload the CSV, map columns if asked, and name the audience. If the headers are Meta's names, mapping is automatic.
Meta then matches the identifiers against its own data. You don't see who matched, and the audience can take a while to fill, so don't judge it in the first minutes.
What lowers a match rate
Match rate is the share of your rows that Meta could connect to an account. These problems pull it down:
- Raw phone formats. Numbers written as
(415) 555-0132or+1 415 555 0132with no consistent country code. - Mixed-case or padded emails. Fixed by trimming and lower-casing.
- Merged name columns. "Jane Doe" in one cell can't fill fn and ln. The formatter splits a single name column into first and last.
- Dead addresses. Nobody is on the other end. Old newsletter lists and trade-show exports are the worst for this.
- Addresses the person doesn't use on Facebook. Work emails in a consumer-facing audience, or a shared inbox like info@. You can't fix this with formatting, but phone numbers can help fill the gap.
- Typos.
gmial.comdoesn't match anything. Email typo correction shows how to find these. - Duplicates. Repeats inflate the file without adding a person. Run remove duplicate emails first.
Custom audience match rate looks at why match rates differ between lists.
A clean process, in order
- Export the contacts from your CRM or store as CSV or Excel.
- Verify the emails at /verify. Remove invalid rows. Keep risky ones out of audiences you pay to reach, unless you have no other contact data for those people.
- Format the file with the formatter: pick a default country for rows without one, check the columns it found, and tick SHA-256 only if you need hashed values.
- Upload in Ads Manager under Customer list.
- Wait for the audience to populate, then check its size against your row count to estimate the match.
- Refresh the audience from time to time. A list you uploaded a year ago has lost people, and gained none.
What to use for what
| Goal | Use |
|---|---|
| Build the audience from a CRM export | Facebook custom audience file formatter |
| Remove dead emails first | /verify or the email list cleaner |
| Hash a plain list for a partner | Email hasher |
| Remove opted-out people before upload | Scrub against your suppression list |
| Lead ads export with messy columns | Clean Facebook lead ads leads |
Limits of the formatter
- Columns are found by header name. Rename an unusual header like "Contact pt." to Email, Phone or Name first.
- It keeps one email and one phone per person; extra address columns aren't merged in.
- It doesn't write date of birth, gender or mobile advertiser IDs.
- Formatting can't make a closed or unused address match an account.
Quick answers
- CSV or Excel? Either can go into the formatter; it writes a CSV.
- Do capital letters matter? Yes. Meta's rules say lower-case for every identifier.
- Should I verify a customer list I already own? Yes, if it is more than a few months old. People change addresses, and a customer list is not immune.
Try it on your own list
Upload a sample at /verify. The first 100 checks are free with a Google sign-in, no card.
Pro, $39 a month: Unlimited email verification.* Never metered, never cut off. See pricing.
*Fair use: the first 100,000 checks a month at full speed, then slower, never cut off.
Common questions
What columns does a Facebook custom audience file need?
A header row with Meta's identifier names and one customer per row. Meta's developer docs list EMAIL, PHONE, FN, LN, CT, ST, ZIP and COUNTRY among them. Email or phone gives the strongest match; the rest help.
How should phone numbers be formatted?
Per Meta's docs: remove symbols, letters and leading zeros, and include the country code (or give a country column so it can be added). For a US number that looks like 14155550132.
Do I need to hash my customer list myself?
Meta's docs say hashing with SHA-256 is required for most identifiers when you send data through the API. For a file uploaded by hand in Ads Manager, check Meta's current customer list help page. Hash it yourself for the API or for a partner who uploads for you.
Why is my custom audience match rate low?
Common causes are unformatted phone numbers, mixed-case or padded emails, columns Meta can't map, and addresses that are dead or aren't the one the person uses on Facebook. Formatting fixes the first three. Verifying the list finds dead addresses.
Is my file uploaded to SimpleVerifier when I use the formatter?
No. The formatter reads and formats the file in your browser.
Check your list before you send
Real mailbox checks over SMTP, and nothing is sent to the address. Sign in with Google and your first 100 email checks are free, no card. Plans for bigger lists are on the pricing page.