# Prepare a Meta Custom Audience File from Google Sheets

> Meta's phone format is not Google's – the same number needs two different hashes. Here's the Sheets workflow that follows Meta's documented rules exactly.

- Source: https://www.8apps.co/blog/meta-custom-audience-file-google-sheets
- Markdown: https://www.8apps.co/blog/meta-custom-audience-file-google-sheets.md
- Published: 2026-09-02
- Author: 8apps Team
- Language: en

---
## The trap this whole page exists to flag

If you already prepared a hashed list for Google Ads and are about to reuse the column for Meta: stop. Google documents E.164 with a leading `+`; Meta documents digits with country code and its own worked example is `(650)555-1212` → `16505551212` – **no plus sign**. Hashing is exact, so the two formats produce two unrelated digests. **One hashed phone column cannot serve both platforms.** If your Meta match rate has been mysteriously poor while Google's was fine, this is the first thing to check.

## Meta's documented rules, field by field

From Meta's customer information parameters documentation:

- **Email:** *"Trim any leading and trailing spaces. Convert all characters to lowercase."* That is the whole rule – no Gmail dot-stripping, unlike Google.
- **Phone:** *"Remove symbols, letters, and any leading zeros"*, and *"Always include the country code as part of your customers' phone numbers."* Digits only, country code in front, per the worked example above.
- **Hash encoding:** hex, lowercase – Meta's docs specify *"HEX representations… using lowercase for A through F."* An uppercase-hex digest is a valid hash that will not match.

## The Sheets workflow

1. **Plain-text the phone column before data lands** – otherwise leading zeros and long numbers are destroyed on paste, before any formula runs.
2. **Normalise per the rules above.** For phones: strip non-digits, drop leading zeros, prepend the country code without `+`. For emails: `=LOWER(TRIM(A2))`.
3. **Hash with SHA-256, lowercase hex.** Sheets has no built-in hash function – Google's function list contains no SHA256, MD5 or DIGEST anywhere – so this step is Apps Script or an add-on.
4. **Verify against Meta's own test vector.** Meta publishes the expected digest for `john_smith@gmail.com`:

```
62a14e44f765419d10fea99367361a727c12365e2520f32218d505ed9aa0f62f
```

Hash that exact string with your setup. Anything else back means fix the formula, not the list.

5. **Export as CSV and upload.** Keep the raw and hashed columns apart, and delete the raw column from anything you share.

## One honest note before you upload

A hashed list is pseudonymised, not anonymised – the number space behind a phone hash is small enough to brute-force, and ad-platform matching requires the hash unsalted. Treat the hashed file with the same care as the raw one; our hashing-and-privacy guide covers what SHA-256 does and does not protect.

## Where Hash Data fits

[Hash Data](/google-workspace/hash-data) runs the hashing inside the sheet, with the normalisation rules the platforms document applied per column rather than by memory. `=HASHPHONE()` normalises to E.164 and hashes in one step – which serves the Google-formatted column; for Meta's plus-less format, normalise per step 2 and hash the result.

## Sources

- [Meta – Conversions API customer information parameters](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters/) – read 2026-08-20
- [Meta – Custom Audiences guide](https://developers.facebook.com/docs/marketing-api/audiences/guides/custom-audiences/) – read 2026-08-20
- [Google Ads Help – Format your customer data file](https://support.google.com/google-ads/answer/7659867) – read 2026-08-20 (for the contrast)
- [Google Sheets function list](https://support.google.com/docs/table/25273) – read 2026-08-20
