Hightouch Meta Ads Audience Sync: Complete 2026 Setup Guide
How to sync Meta Custom Audiences with Hightouch: field mapping, sync modes, match rate benchmarks, and the suppression pattern that cuts wasted spend.

Sections
Hightouch Meta Custom Audiences: Complete Sync Setup Guide (2026)
Hightouch syncs Meta Custom Audiences by reading a SQL model or visual audience from your warehouse, hashing the identifier columns, and pushing the diff to Meta's Custom Audience API on a schedule — as tight as one-minute intervals on paid plans. That's the direct answer. The rest of this guide is the setup work that determines whether your match rate lands at 25% or 80%.
TL;DR: Connect your warehouse (BigQuery, Snowflake, Redshift) as a Hightouch source, define an audience model in SQL, map identifier columns to Meta's match keys, authenticate with a system user token (not OAuth), pick a sync mode (Upsert, Mirror, or Append), and set alerting on match-rate drops. The suppression pattern — excluding converted customers from prospecting — is the single highest-leverage use case and the one most teams skip.
Meta's Custom Audience API accepts hashed PII, enforces minimum audience sizes, throttles updates, and has its own retention rules. Hightouch abstracts most of that friction, but the decisions you make in your warehouse model and field mapping still set the ceiling on match quality. Get those wrong and you're paying for ad spend against an audience that's a fraction of the size you think it is.
What Hightouch actually does for Meta audiences
Hightouch is a reverse ETL platform: it reads from your warehouse and writes to downstream destinations. For Meta Ads, that destination is the Custom Audiences API.
The sync loop:
- Hightouch runs your SQL model (or evaluates your Audiences visual query) on a schedule.
- It diffs the result against the previous sync state.
- It hashes any unhashed PII fields.
- It calls Meta's API to add new users and, in mirror mode, remove dropped users.
- Meta processes the upload and adjusts audience membership.
The output is a Custom Audience that mirrors your warehouse segment continuously, not a one-time CSV upload that goes stale. That matters for retargeting (membership stays current as users convert or churn), prospecting (seed high-quality Lookalike sources), and suppression (drop customers from acquisition campaigns the moment they convert).
Prerequisites before you touch Hightouch
Skipping one of these is the most common reason a sync fails silently on the first run.
Warehouse side:
- A table or view with at least one identifier column Meta accepts: email, phone, first/last name plus date of birth, external ID, or mobile advertiser ID (MADID).
- SELECT access for the account running Hightouch.
- PII either in plaintext (Hightouch hashes it) or pre-hashed as SHA-256 hex strings, marked as pre-hashed in the field map.
Meta side:
- A Meta Business account with ad account admin or advertiser role.
- Custom Audiences Terms of Service accepted under Business Settings > Data Sources.
- The target ad account ID, format
act_XXXXXXXXXX.
Hightouch side:
- A Hightouch account — Starter supports limited sync frequency; Business unlocks sub-hourly schedules and dbt Cloud triggers.
- Admin or Editor workspace permissions.
Confirm all three before continuing. Most "it's not syncing" support threads trace back to missing TOS acceptance or an ad account permission gap.
Step 1: connect your warehouse as a source
In Hightouch, go to Sources > Add source and pick your warehouse: BigQuery, Snowflake, Redshift, Databricks, PostgreSQL, or one of 30+ others.
BigQuery: Hightouch needs a service account with BigQuery Data Viewer and BigQuery Job User roles. Upload the JSON key and select your project and default dataset.
Snowflake: Create a dedicated Hightouch role with USAGE on the database and USAGE plus SELECT on the schemas you'll query. Use a separate warehouse for Hightouch queries so they don't compete with production workloads.
Redshift: Create a Hightouch database user with SELECT on the target schema. If your cluster sits in a VPC, whitelist Hightouch's egress IP ranges.
Test the connection before moving on. The test runs SELECT 1 — a pass confirms Hightouch can reach your warehouse, not that it has access to your specific tables.
Step 2: define your audience model
This is where your Meta Ads targeting quality actually gets decided — not in Ads Manager, in your SQL.
Hightouch offers two ways to define a sync:
SQL Model: A SELECT query returning one row per user. Full control — joins across event tables, time-window filters, multi-step funnels.
Hightouch Audiences (visual builder): A no-code interface for combining conditions, events, and computed traits. Requires the Audiences add-on. Good for non-technical teams or fast iteration.
Your query needs one primary key column for deduplication and diff tracking — user_id, email, or any stable unique identifier where the same user always produces the same value.
Example model for a high-value customer segment:
SELECT
user_id,
email,
phone_number,
first_name,
last_name,
date_of_birth,
lifetime_value
FROM analytics.users
WHERE lifetime_value >= 200
AND last_order_date >= CURRENT_DATE - INTERVAL '180 days'
AND email IS NOT NULL
Include every identifier column you have. Meta matches on up to seven keys at once — more identifiers per user means a higher match rate. A user with email, phone, name, and DOB matches at roughly 3-4x the rate of email alone.
For LTV-based segments, keep the threshold in SQL rather than filtering post-sync. That keeps the Hightouch model as the single source of truth and the logic auditable.
Step 3: connect Meta Ads as a destination
Go to Destinations > Add destination and search Facebook Custom Audiences.
Hightouch supports two authentication paths, and the choice matters more than most guides let on:
OAuth: Faster to set up, but the token expires and needs manual reconnection roughly every 60 days. Fine for testing, risky for production — a lapsed token means a suppression list silently stops updating.
System user token (recommended): Generated from a Meta Business System User, this token doesn't expire on the same cycle and survives individual employee access changes. It requires ads_management and business_management permissions. This is the path Hightouch's own documentation recommends for anything running unattended, and it's the one most setup guides skip.
Either way, after authorization Hightouch stores the credential. Select the ad account the audience will live in — if you manage multiple ad accounts, create one destination per account; a single sync cannot fan out to multiple ad accounts.
Name the destination something identifiable: Meta Ads – Brand Ad Account, not Facebook.
Step 4: map your identifier fields
Field mapping is where most match rate problems start. Meta's matching is strict: phone numbers need E.164 format (+12125550100), emails need to be lowercase, names need to be split into first and last. Any deviation costs match rate.
Hightouch's mapping UI pairs your SQL columns against Meta's accepted match key types:
| Your column | Hightouch match key |
|---|---|
email | |
phone_number | Phone |
first_name | First Name |
last_name | Last Name |
date_of_birth | Date of Birth |
user_id | External ID |
device_id | Mobile Advertiser ID (MADID) |
For columns already pre-hashed (SHA-256 hex), toggle "Pre-hashed." Do not double-hash — it zeroes your match rate.
If your warehouse stores phones in local formats ((212) 555-0100 or 2125550100), normalize to E.164 in your SQL model before Hightouch reads it:
CONCAT('+1', REGEXP_REPLACE(phone_number, '[^0-9]', ''))
This one transformation can lift match rates 15-25 percentage points for US phone datasets.
Step 5: choose your sync mode
| Mode | Adds new users | Updates existing | Removes dropped users | Best for |
|---|---|---|---|---|
| Upsert | Yes | Yes | No | Cumulative lists — subscribers, all-time purchasers |
| Mirror | Yes | Yes | Yes | Active-state lists — trial users, suppression, retargeting |
| Append | Yes | No | No | One-way event feeds (rare for audience sync) |
For suppression audiences — excluding converted customers from prospecting — mirror is the only mode that works. A suppression list that never drops users eventually includes everyone, which defeats the purpose.
Step 6: set the sync schedule and monitor it
Scheduling options:
- Interval-based: as frequent as once per minute on paid plans, down through 15-minute, hourly, 6-hourly, and daily. Check the Hightouch pricing page for which intervals your tier unlocks.
- Cron: a custom expression for precise timing, e.g.
0 2 * * *for 2am UTC daily. - dbt Cloud trigger: fires after a dbt job completes — syncs run on fresh data instead of a clock.
- Airflow / API trigger: via Hightouch's sync trigger API, for teams orchestrating with Airflow, Prefect, or Dagster.
For most teams, a daily sync at 2-4am UTC covers the attribution window without hammering Meta's API. High-velocity ecommerce may want 6-hourly. For suppression, daily is usually fast enough — a converted customer sitting one extra day in your prospecting pool costs far less than the engineering overhead of minute-level refreshes.
Set concrete alert thresholds rather than eyeballing the sync log:
- Rejection rate above 2% — investigate field mapping immediately.
- Match rate drop greater than 15% week-over-week — usually a warehouse schema change or a column that silently stopped populating.
- Two consecutive sync failures — page someone; don't wait for a third.
Under Sync Settings > Alerts, route failure notifications to Slack, PagerDuty, or email. A failed suppression sync that goes unnoticed for three days means three days of paying to retarget people who already bought.
Match rate benchmarks by identifier type
Meta doesn't expose per-upload match rates in real time. Audience size updates in Ads Manager 24-72 hours after the first sync; later syncs typically propagate within a few hours.
| Match key | Typical match rate |
|---|---|
| Email only | 40-60% |
| Phone only | 30-50% |
| Email + phone | 60-75% |
| Email + phone + name + DOB | 70-85% |
| External ID / MADID | 80-95% |
If match rate sits below 30%, check in this order:
- Double-hashing — pre-hashed column, Hightouch hashing again.
- Phone format — not E.164.
- Email case — uppercase characters in the warehouse.
- Country mismatch — phone numbers missing a country code.
Meta's API error codes are documented in Meta's error reference.
For broad targeting use cases, match rate matters less — you're using the synced list as a lookalike-audience seed, and Meta recommends 1,000-50,000 matched users for lookalike quality. For direct targeting, match rate is your reach ceiling.
The suppression pattern: stop paying to reacquire customers
The most underused Hightouch and Meta pattern is suppression:
- Build a Hightouch model returning every user who has converted — purchased, subscribed, activated.
- Sync it to a Meta Custom Audience in mirror mode.
- Add that audience as an Exclusion on every prospecting ad set.
Every dollar spent reaching someone who already bought is wasted CAC. A suppression list synced daily from the warehouse eliminates that waste automatically — the warehouse state is the source of truth, and Hightouch keeps Meta aligned with it without manual exclusion updates.
For ecommerce with high repeat-purchase rates, run two suppression lists: "purchased in last 30 days" (suppress from prospecting) and "purchased ever" (suppress from discount-first acquisition creatives). Both are a few lines of SQL and run as separate syncs.
Connecting to the broader data stack
Hightouch sits in a stack that increasingly looks like this:
CRM / Product DB → Transform (dbt) → Warehouse → Hightouch → Meta Ads
The Conversions API handles event-level signal — purchases, add-to-cart, page views. Hightouch handles audience membership. They complement each other rather than compete.
If you're already sending server-side events via CAPI, the Hightouch audience sync adds the identity layer: Meta knows what a user did (from CAPI events) and which segment they belong to (from the warehouse sync). Together they produce a stronger advantage-plus signal than relying on browser-based Meta Pixel data alone, which iOS privacy changes have degraded.
Warehouse-based audience membership is also auditable in a way pixel-based audiences aren't — you can query your warehouse to see exactly who was in a segment on a given date, something Meta's native audience tools don't support. For teams tracking attribution window accuracy across channels, that auditability is the underrated benefit of this whole setup.
Common errors and fixes
"Audience size too small" in Ads Manager. Meta needs 100 matched users minimum before an audience is usable. If your model returns fewer than 200 rows, match rate may not clear the threshold. Broaden the model or check for deduplication errors.
Sync fails with Meta API error 100. A validation error, usually a malformed phone number or invalid date-of-birth format (Meta expects YYYYMMDD). Check field mapping and source data.
Match rate dropped 20 points after a warehouse schema change. A renamed or dropped column stops Hightouch from sending that identifier. Check the sync log for "column not found" warnings and re-map the field.
Sync completes but Meta audience size doesn't update. Meta processes uploads asynchronously — allow 24-72 hours for the first sync, 1-6 hours after. If nothing changes after 72 hours, check Meta's Audiences API status for platform-side issues.
Learning phase resets after an audience update. Meta treats large composition changes as a significant edit. If mirror-mode audiences fluctuate heavily between syncs, you may see learning limited status. Reduce sync frequency, or switch to upsert for audiences feeding campaigns near the end of learning phase.
Tools to validate your setup
- adlibrary's EMQ Scorer — benchmark your event match quality to see how Meta is actually receiving your identity signal.
- Meta's Audience Diagnostics in Business Manager — match rate breakdown by identifier type after the first upload.
- Hightouch's sync alerting — route failures to Slack so a break surfaces in minutes, not days.
- Learning Phase Calculator — estimate how many conversion events a synced audience needs before exiting learning phase.
- Frequency Cap Calculator — set the right cap once a tightly defined Custom Audience goes live, to avoid ad fatigue.
What competitors are doing with their synced audiences
Hightouch gets your first-party data into Meta. It has no visibility into what competitors are running to their equivalent audiences — which creatives are working against warm segments, which hooks are scaling to cold traffic, which offers are being tested where.
That's a separate layer, and adlibrary covers it: competitor ad creative across Meta, TikTok, YouTube, Instagram, and Snapchat in one search interface. Meta's own Ad Library is free and tells you an ad exists. It doesn't enrich that ad with creative metadata, cross-platform coverage, or programmatic access without app review friction — which is where the adlibrary API sits, as a paid upgrade for teams that need more data and easier access than Meta's free API provides, not a replacement for it.
Practically: use adlibrary's saved-ads feature to build a swipe file of competitor creative running to audiences similar to yours, run it through AI enrichment to pull hooks and angles, and feed that into your own creative briefs — then use Hightouch to put the resulting creative in front of the warehouse-defined audience you built here.
Frequently asked questions
Does Hightouch hash PII before sending to Meta?
Yes. Hightouch normalizes and SHA-256 hashes email, phone, name, and date-of-birth fields automatically before sending to the Meta Custom Audiences API. You can also pre-hash in your warehouse and mark the column as pre-hashed in the Hightouch field mapping UI.
What is the minimum audience size for Meta Custom Audiences from a Hightouch sync?
Meta requires a minimum of 100 matched users before a Custom Audience is usable for targeting. Hightouch syncs every record it receives — the audience appears in Ads Manager but stays inactive until that threshold is crossed.
Can Hightouch sync audiences to Meta in real time?
Not true real time, but Business and Enterprise plans support intervals as tight as one minute, and event-triggered syncs via dbt Cloud or Airflow webhooks reduce effective latency further. Streaming sync is not currently supported.
What happens to users removed from the warehouse segment?
In mirror mode, Hightouch removes them from the Meta Custom Audience when they drop out of the model. In upsert mode, removed users stay in the audience. Use mirror for anything that needs strict membership hygiene, like suppressing converted customers from prospecting.
Does Hightouch support Lookalike Audience creation from warehouse data?
Hightouch syncs users to a Meta Custom Audience, which you then use as a Lookalike source inside Ads Manager. It doesn't create Lookalike Audiences directly — the seed audience has to clear Meta's minimum size and quality threshold first.
Should I use OAuth or a system user token to connect Hightouch to Meta?
Use a system user token for any production sync. OAuth is faster to set up but expires roughly every 60 days and requires manual reconnection; a lapsed token silently breaks the sync, which is especially costly for suppression lists. System user tokens don't carry that expiry cycle.
Conclusion
Hightouch Meta Custom Audiences sync is the right tool once manual CSV uploads or pixel-only audience building stop scaling. The warehouse holds the most accurate picture of who your customers are and what they've done — syncing that state to Meta continuously keeps your targeting aligned with reality instead of with a list that was accurate 30 days ago.
The setup is a few hours of engineering work: source connection, SQL model, field mapping, sync mode, schedule, and alerting. The payoff compounds — suppression that eliminates wasted CAC, retargeting audiences that reflect real customer state, and lookalike seeds built from your highest-quality cohort instead of pixel visitors.
If first-party data is already your edge and you want visibility into what competitors are running to their equivalent audiences, adlibrary is the layer that completes the picture — start with the ad intelligence free trial to see the data before committing to the Business plan.

Related Articles

Facebook Ads Library Search Tutorial 2026
A practitioner tutorial for the Facebook Ads Library search — filter stacks, advertiser lookup, country and media type filters, limitations, and when to go beyond the free tool.

How to Find Facebook Ads Besides Meta Ad Library: 8 Methods That Actually Work
Meta Ad Library has real limits. Here are 8 methods to find Facebook ads beyond it — manual tricks, third-party tools, and when to use which.

How to Find Search Ads of Competitors
Learn exactly how to find search ads of competitors — from Google's Ad Transparency Center to third-party spy tools. Step-by-step methods for paid search intelligence.

Competitor Ad Monitoring: Setup Guide
A practitioner setup guide for competitor ad monitoring — manual spot-checks, semi-automated tracking, alert cadences, and multi-platform coverage explained step by step.

How to Analyze X (Twitter) Ads: A Step-by-Step Creative and Performance Guide
How to analyze X (Twitter) ads: own campaign metrics, competitor research, cross-platform context, and creative briefing. 2026 guide with benchmarks.

How to Write Meta Ad Copy That Converts in 2026
Step-by-step guide to writing Meta ad copy that converts cold traffic. Covers hook-body alignment, offer framing, CTA mechanics, and a competitor research workflow.

How to Brief a Creative Team for Meta Ads
A step-by-step system for writing Meta ad creative briefs that produce on-brief work fast: fields, hook hypotheses, reference ads, and sign-off checklists.

How to Audit a Meta Ads Account in 2026
A practitioner's step-by-step Meta Ads account audit: pixel health, campaign structure, creative fatigue, attribution windows, audience overlap, and competitive benchmarking.