Hightouch Meta Ads Audience Sync: Complete 2026 Setup Guide
Step-by-step guide to syncing your data warehouse to Meta Custom Audiences via Hightouch. Covers setup, sync modes, troubleshooting, and when to upgrade.

Sections
Hightouch Meta Ads Audience Sync: Complete 2026 Setup Guide
You have clean customer data in BigQuery, Snowflake, or Redshift. Meta has 3.2 billion monthly active users you want to reach. The gap between those two facts is a custom audience sync — and Hightouch is the reverse-ETL layer that closes it.
TL;DR: Hightouch lets you define a SQL model or no-code audience in your warehouse, map identifier columns to Meta's match keys, and keep that audience continuously in sync with your warehouse state. This guide covers source setup, field mapping, sync mode selection, match rate benchmarking, and the suppression pattern that cuts wasted ad spend on converted customers.
This is not a trivial integration to do right. Meta's Custom Audience API accepts hashed PII, enforces minimum audience sizes, throttles updates, and has its own data retention rules. Hightouch abstracts a lot of that friction — but the decisions you make in your warehouse model and field mapping still determine whether you get a 60% match rate or a 20% one.
Let's go from blank canvas to live syncing audiences in Meta Ads Manager.
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 works like this:
- 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.
What you get on the Meta side is a Custom Audience that reflects your warehouse segment — not a one-time upload that goes stale, but a living audience that updates as your data does.
This matters for retargeting (keep audience membership current as users convert or churn), prospecting (seed high-quality Lookalike sources), and suppression (remove customers from acquisition campaigns the moment they convert).
Prerequisites Before You Touch Hightouch
Do not skip this section. Missing one of these prerequisites is the most common reason the integration fails silently on first sync.
On the warehouse side:
- A table or view with at least one identifier column that Meta accepts: email, phone number, first/last name + date of birth, external ID, or mobile advertiser ID (MADID).
- The account running Hightouch has SELECT access on that table.
- PII is either stored in plaintext (Hightouch hashes it) or pre-hashed as SHA-256 hex strings (you mark them pre-hashed in the field map).
On the Meta side:
- A Meta Business account with ad account admin or advertiser role.
- The Custom Audiences Terms of Service accepted under Business Settings > Data Sources.
- The ad account ID you want to target — format
act_XXXXXXXXXX.
On the Hightouch side:
- A Hightouch account with at least the Starter plan (free tier supports limited sync frequency). Business plan unlocks 15-minute schedules and dbt Cloud triggers.
- Admin or Editor workspace permissions.
Get all three in order before continuing. Half the "it's not syncing" support tickets trace back to missing TOS acceptance or insufficient ad account permissions.
Step 1: Connect Your Data Source to Hightouch
In the Hightouch UI, navigate to Sources and click Add source. Select your warehouse type: BigQuery, Snowflake, Redshift, Databricks, PostgreSQL, or one of the 30+ others Hightouch supports.
BigQuery setup: Hightouch needs a service account with BigQuery Data Viewer and BigQuery Job User roles. Download the JSON key file and paste it into the Hightouch source configuration. Select the project and default dataset.
Snowflake setup: Create a dedicated Hightouch role with USAGE on the database and USAGE + SELECT on the schemas you'll query. Use a separate warehouse for Hightouch queries to avoid competing with production workloads.
Redshift setup: Create a Hightouch database user with SELECT on the target schema. If your cluster is in a VPC, you'll need to whitelist Hightouch's egress IP ranges.
Test the connection before moving forward. The test runs a SELECT 1 — if it passes, Hightouch can reach your warehouse. It does not validate that the user has access to your specific tables.
Step 2: Define Your Audience Model
This is where the quality of your Meta Ads targeting is actually determined — not in Ads Manager, but in your SQL.
Hightouch offers two ways to define what goes into a sync:
SQL Model: Write a SELECT query that returns one row per user. You control everything. Best for teams comfortable with SQL and needing complex logic (joins across event tables, time-window filters, multi-step funnels).
Hightouch Audiences (visual builder): A no-code interface that lets you combine conditions, events, and computed traits. Requires the Hightouch Audiences add-on. Good for non-technical teams or rapid iteration.
For the SQL model approach, your query needs one column that will serve as the primary key for deduplication and diff tracking. Hightouch calls this the primary key. It can be user_id, email, or any stable unique identifier — as long as 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 simultaneously — more identifiers per user means a higher match rate. A user with email + phone + name + DOB will match at 3-4x the rate of a user with email alone.
For LTV-based segments, keep the LTV threshold in SQL rather than filtering post-sync. This keeps the Hightouch model as the single source of truth and makes the logic auditable.
Step 3: Connect Meta Ads as a Destination
In Hightouch, go to Destinations > Add destination > search for Facebook Custom Audiences.
Hightouch uses OAuth to authenticate with Meta. Click Connect and you'll be redirected to Meta's OAuth flow. Grant the following permissions:
ads_managementads_readbusiness_managementpublic_profile
After authorisation, Hightouch stores the access token. Select the ad account — this is the account where the Custom Audience will live. If you manage multiple ad accounts, create one Hightouch destination per account (you cannot sync a single audience to multiple accounts in one sync).
Name the destination something identifiable: Meta Ads – Brand Ad Account rather than just Facebook.
Step 4: Map Your Identifier Fields
Field mapping is where most match rate problems originate. Meta's matching algorithm is strict: phone numbers must be in E.164 format (+12125550100), emails must be lowercase, names must be split into first and last. Any deviation reduces match rate.
Hightouch's field mapping UI shows a dropdown of your SQL columns on the left and Meta's accepted match key types on the right. Map each column to the correct key type:
| 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 |
For columns you know are pre-hashed (SHA-256 hex), toggle the "Pre-hashed" option. Do not double-hash — it will zero your match rate.
Phone normalisation tip: if your warehouse stores phones in local formats ((212) 555-0100 or 2125550100), clean them to E.164 in your SQL model before Hightouch picks them up:
CONCAT('+1', REGEXP_REPLACE(phone_number, '[^0-9]', ''))
This single transformation can lift match rates by 15-25 percentage points for US phone datasets.
Step 5: Choose Your Sync Mode
Hightouch supports three sync modes for Meta Custom Audiences. The right choice depends on how you're using the audience.
Upsert: Adds new users and updates existing ones. Never removes users. Use for cumulative lists — newsletter subscribers, all-time purchasers, app installers. The audience grows over time and users are never deleted from Meta's side.
Mirror: Adds new users, updates existing ones, and removes users who drop out of the model. Use for active-state lists — current trial users, subscribers with active status, the top 20% LTV cohort. Mirror is the correct mode for retargeting lists and suppression audiences.
Append: Only adds users, never updates or removes. Useful for one-way event-based feeds (e.g., users who triggered a specific conversion event today). Rare for audience sync use cases.
For suppression audiences — where the goal is to exclude converted customers from prospecting campaigns — mirror is non-negotiable. A suppression list that never removes users will eventually include everyone, defeating the purpose.
Step 6: Set the Sync Schedule
Hightouch supports several scheduling options:
Interval-based: Every 15 minutes, hourly, every 6 hours, daily. Available intervals depend on your plan. The Hightouch pricing page shows which intervals are available per tier.
Cron: Custom cron expression for precise timing (e.g., 0 2 * * * for 2am UTC daily).
dbt Cloud trigger: After a dbt job completes. The most accurate option if your warehouse transforms run on a dbt schedule — syncs always fire on fresh data rather than on a clock.
Airflow / API trigger: Via Hightouch's sync trigger API. Useful if you orchestrate with Airflow, Prefect, or Dagster and want the Meta sync to run as part of a broader DAG.
For most teams, a daily sync at 2-4am UTC covers the attribution window and keeps audiences fresh without hammering Meta's API. High-velocity ecommerce with frequent conversion events may want 6-hourly. For suppression, daily is usually fast enough — a converted customer spending one extra day in your prospecting pool costs far less than the engineering overhead of 15-minute refreshes.
Sync Modes and Match Rate: What to Expect
Meta does not expose per-upload match rates in real time. You'll see the audience size update in Ads Manager 24-72 hours after the initial sync, and subsequent updates propagate within a few hours.
Benchmark match rates by identifier type:
| 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 your match rate is below 30%, diagnose in this order:
- Double-hashing (if you pre-hashed and Hightouch is hashing again)
- Phone format issues (not E.164)
- Email case issues (uppercase in warehouse)
- Country mismatch (phone numbers without country code)
Hightouch's sync log shows the number of rows synced and any API errors. Meta API error codes are documented in Meta's error reference.
For broad targeting campaigns, match rate matters less — you're using the synced list as a lookalike-audience seed. Meta recommends 1,000-50,000 matched users for Lookalike quality. For direct targeting (showing ads to exactly these users), match rate directly sets your reach.
The Suppression Pattern: Stop Paying to Acquire Existing Customers
The most underused Hightouch + Meta pattern is suppression. The setup:
- Create a Hightouch model that returns all users who have converted (purchased, subscribed, activated).
- Sync this to a Meta Custom Audience in mirror mode.
- In every prospecting ad set, add this audience as an Exclusion.
Every dollar you spend reaching people who already bought is wasted CAC. A well-maintained suppression list — synced daily from your warehouse — eliminates this class of waste automatically. You don't have to remember to update the exclusion manually. The warehouse state is the truth; Hightouch keeps Meta in sync with it.
For ecommerce with high repeat-purchase rate, you may want two suppression lists: "purchased in last 30 days" (suppress from prospecting) and "purchased ever" (suppress from discount-first acquisition creatives). Both are trivial to express in SQL and run as separate Hightouch syncs.
Monitoring Syncs and Alerting
Hightouch provides a sync log per sync showing:
- Rows queried from the warehouse
- Rows added / removed / updated
- Errors and error messages
- Sync duration
For production audience syncs, set up Hightouch alerting. Under Sync Settings > Alerts, you can send sync failure notifications to Slack, PagerDuty, or email. A failed suppression sync that goes unnoticed for three days means you've been paying to retarget customers for three days.
Also monitor on the Meta side. In Ads Manager > Audiences, check that the audience size is roughly what you expect. If a 50,000-user segment produces a Meta audience of 8,000, something is wrong with field mapping or PII quality.
For teams using Meta Pixel and Conversions API alongside warehouse audiences, cross-reference your Event Match Quality (EMQ) scores in Events Manager. High EMQ on server events + high match rate on warehouse audiences = maximum Meta signal strength.
Connecting to the Broader Data Stack
Hightouch sits in the middle of a stack that increasingly looks like this:
CRM / Product DB → Transform (dbt) → Warehouse → Hightouch → Meta Ads
The Conversions API handles event-level signals (purchase events, add-to-cart, page views). Hightouch handles audience membership. They are complementary, not competing.
If you're already sending server-side events via CAPI, the Hightouch audience sync adds the identity layer: Meta knows what users did (from CAPI events) AND which segment they belong to (from the warehouse sync). Together, they enable precise advantage-plus audience signals without relying on browser-based Meta Pixel data that iOS privacy changes have degraded.
For teams tracking attribution window accuracy across channels, warehouse-based audience membership is auditable in a way that pixel-based audiences are not. You can query your warehouse to see exactly who was in a given segment on a given date — something Meta's native audience tools do not support.
adlibrary and Audience Intelligence
Hightouch syncs your first-party audience data to Meta. But what competitors are doing with their audiences — which creatives they're running to warm audiences, which formats they're scaling to cold audiences, which offers they're testing — that's a different layer of intelligence.
adlibrary surfaces competitor ad creative across Meta, TikTok, YouTube, Instagram, and Snapchat in a single search interface. Where Meta's free Ad Library shows you that an ad exists, adlibrary enriches each ad with creative metadata, audience signals, and platform coverage that Meta's API does not return.
Meta's Ad Library API is adequate if you're monitoring one brand on one platform. The moment you want multi-platform coverage, richer fields per ad, or programmatic access without app review friction, you need something built for that workflow. The adlibrary API is that upgrade — paid, built for serious research, and designed for the kind of competitive intelligence that feeds your audience and creative strategy.
For practical workflow: use adlibrary's saved-ads feature to build a swipe file of competitor creatives running to audiences similar to yours. Run those creatives through AI enrichment to extract hooks, angles, and offers. Feed those insights into your own creative briefs. Then use Hightouch to put those creatives in front of precisely the right warehouse-defined audiences on Meta.
The adlibrary Business plan at €329/mo includes API access, 1,000+ credits/mo, and multi-platform coverage — sized for the team that treats competitor intelligence as a system, not a one-off lookup.
Common Errors and Fixes
"Audience size too small" in Meta Ads Manager Meta needs 100 matched users minimum before an audience is usable. If your model returns fewer than 200 rows, the match rate may not clear the threshold. Broaden your model or check for deduplication errors.
Sync fails with Meta API error 100
Error 100 is a validation error. Usually caused by malformed phone numbers or invalid date-of-birth format (Meta expects YYYYMMDD). Check your field mapping and warehouse data.
Match rate dropped 20 points after a warehouse schema change A renamed or dropped column in your model will cause Hightouch to stop sending that identifier. Check the sync log for "column not found" warnings. Re-map the field in the Hightouch destination configuration.
Sync completes but audience size in Meta doesn't update Meta processes uploads asynchronously. Allow 24-72 hours for the first sync. Subsequent syncs process faster (usually 1-6 hours). If the audience hasn't updated after 72 hours, check Meta's Audiences API status for platform-side issues.
Learning phase resets after audience update Meta's algorithm treats large audience composition changes as a significant edit. If you're in mirror mode and your segment fluctuates significantly between syncs, you may see learning limited status. Either reduce sync frequency or switch to upsert mode for audiences used in active campaigns near the end of learning phase.
Tools to Validate Your Setup
Before trusting a live audience sync for production campaigns, validate it:
- adlibrary's EMQ Scorer: Check your event match quality benchmark to understand how Meta is receiving your identity signals overall.
- Meta's Audience Diagnostics in Business Manager: Shows match rate breakdown by identifier type after the first upload.
- Hightouch's built-in sync alerting: Set failure alerts to Slack so you know within minutes if a sync breaks.
- Learning Phase Calculator: Estimate how many conversion events your synced audience needs before Meta exits the learning phase.
- Frequency Cap Calculator: Once your audience is live, calculate the right frequency cap to avoid ad fatigue in a tightly defined Custom Audience.
Frequently Asked Questions
Does Hightouch hash PII before sending to Meta?
Yes. Hightouch normalises and SHA-256 hashes email, phone, name, and date-of-birth fields automatically before transmitting 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 becomes usable for ad targeting. Hightouch syncs all records it receives; the audience will appear in Ads Manager but remain inactive until the threshold is crossed.
Can Hightouch sync audiences to Meta in real time?
Not in true real time, but Hightouch Business and Enterprise plans support 15-minute sync intervals. Event-triggered syncs via dbt Cloud or Airflow webhooks can reduce effective latency further. True streaming is not currently supported.
What happens to users removed from the warehouse segment?
In mirror sync mode, Hightouch removes users from the Meta Custom Audience when they drop out of the warehouse model. In upsert mode, removed users are not deleted. Choose mirror if you need strict audience membership hygiene — for example, 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 Meta Ads Manager. Hightouch does not create Lookalike Audiences directly — the seed audience must reach Meta's minimum size and quality threshold first.
Conclusion
Hightouch Meta Ads audience sync is the right tool when your custom audience strategy has outgrown manual CSV uploads or pixel-based audience building. The warehouse is the most accurate representation of who your customers are and what they've done — syncing that state to Meta continuously means your ads always target the right people, not the people who happened to visit your site in the last 30 days.
The setup is four hours of engineering work. The payoff is continuous: suppression that eliminates wasted CAC, retargeting audiences that reflect real customer state, and lookalike-audience seeds built from your highest-quality cohorts rather than pixel visitors.
If you're at the stage where first-party data is your competitive advantage and you want to know what competitors are running to their equivalent audiences, adlibrary is the intelligence layer that completes the picture. Try the Business plan for API access and multi-platform coverage — or start with the ad intelligence free trial to see what the data looks like before committing.

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
Learn how to analyze X (Twitter) ads across four tracks: campaign metrics, competitor creative research, multi-platform context, and briefing new creatives. Practical 2026 guide.

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.