Customer Match & Audience Uploads
What Customer Match actually does
Customer Match (Google Ads) and its equivalents across platforms let you upload your own first-party customer list — hashed emails, phone numbers, or mailing addresses — and have the platform match it against its own signed-in user base, turning your CRM data directly into a targetable (or exclude-able) ad audience. It's the activation layer for first-party data: the list itself is useless for targeting until it's matched against a platform's identity graph.
Hashing requirements are strict and platform-specific
Every platform requires SHA-256 hashing of PII before upload, but the normalization rules preceding the hash differ subtly and matter a lot for match rate: emails must be lowercased and trimmed; Google additionally strips periods from the local part of Gmail addresses before hashing (since Gmail treats john.doe@gmail.com and johndoe@gmail.com as the same inbox); phone numbers must be in E.164 format with the leading + and country code. Getting normalization wrong doesn't throw an error — it just silently produces no match, because the hash of a slightly malformed string never equals the hash of the correctly formatted one.
import { createHash } from "crypto";
function normalizeEmailForMatch(rawEmail: string): string {
let email = rawEmail.trim().toLowerCase();
const [local, domain] = email.split("@");
// Google-specific: strip dots from the local part for gmail.com addresses
const normalizedLocal = domain === "gmail.com" ? local.replace(/\./g, "") : local;
return `${normalizedLocal}@${domain}`;
}
function hashForUpload(rawEmail: string): string {
return createHash("sha256").update(normalizeEmailForMatch(rawEmail)).digest("hex");
}Match rates are never 100%, and platforms won't tell you which records failed
Audience upload policy constraints by platform
| Platform | Minimum list size for activation | Key policy note |
|---|---|---|
| Google Ads Customer Match | ~1,000 matched users for most campaign types | Requires account history and policy compliance review; restricted for some verticals |
| Meta Custom Audiences | No hard minimum, but very small audiences underperform | Hashed upload via Ads Manager or Conversions API-adjacent audience endpoints |
| LinkedIn Matched Audiences | 300 matched members minimum to activate | Strict B2B data-source policy; company-list matching also supported |
Refresh cadence and audience decay
A Customer Match list uploaded once and never refreshed decays — customers churn, emails change, and the audience's relevance to current targeting drifts. Treat audience uploads as a pipeline, not a one-time export: a scheduled job (daily or weekly, depending on data volatility) that re-exports the current qualifying segment from the CRM/warehouse and re-uploads via the platform's API keeps the audience reflecting reality, rather than a snapshot from whenever someone last remembered to export a CSV.
Exclusion audiences are as valuable as inclusion audiences
What's Next?
Customer Match uploads are the seed audience; from there, most platforms let you expand reach significantly further using lookalike or similar-audience modeling built from that seed, trading some precision for scale.
I build these systems professionally.
Whether it's a RAG pipeline, analytics migration, or AI workflow — let's talk.