Reverse ETL Tools Compared

Data Activation Options (2026)

Reverse ETL tools read modeled data from your warehouse and sync it into the apps your teams work in, such as a CRM or an ad platform. Data activation tools do the same and add audience building. They differ in where sync state lives, what they're bundled with and how much warehouse access they ask for, and those differences decide which one fits a team.

Last updated: Proudly published by: Jeff Wahl10 min read

What are reverse ETL tools and data activation tools?

Reverse ETL tools read modeled data from your warehouse and write it into operational apps such as a CRM or an ad platform. Data activation tools do the same sync and add audience building on top, so a marketer can pick customers without writing SQL. The main options are Hightouch, Fivetran Activations (Census, now documented under that name), Segment Reverse ETL, RudderStack, Polytomic, loaders built into the destination such as Braze Cloud Data Ingestion, and a job you write yourself.

The job exists because the warehouse holds the best version of a customer: lifetime value, churn score, plan, last order. The app a salesperson or a campaign tool reads holds a stale copy. Moving the warehouse's answer into the app turns an analysis into an action, and keeps the logic in 1 tested model instead of in a CRM's rules.

Every tool in this comparison shares 1 shape: a source, a model that is a query, and a mapping to destination fields that runs on a schedule in a chosen sync mode. They differ in where sync state lives, what they're bundled with, which destinations they reach and how much access they ask your warehouse for. Those differences decide the fit.

Reverse ETL tools at a glance

Hightouch
  • Sync state keptIts servers or yours
  • Sync behavioursInsert, update, upsert
  • Schedule optionsInterval, cron, triggers
  • Sold alongsideCustomer Studio
Fivetran Activations
  • Sync state keptYours, or its servers
  • Sync behaviours6 modes incl. Mirror
  • Schedule optionsCron, API, dbt Cloud
  • Sold alongsideFivetran ELT
Segment Reverse ETL
  • Sync state keptYour warehouse
  • Sync behavioursAdded, updated, deleted
  • Schedule options15 min to 1 day
  • Sold alongsideSegment CDP
RudderStack
  • Sync state keptYour warehouse
  • Sync behavioursUpsert, mirror
  • Schedule optionsBasic, cron, manual
  • Sold alongsideEvent collection

How a reverse ETL sync decides which rows to send

Every tool in this comparison avoids resending the whole model. Each run executes the model's query, compares the result with what it sent last time, and sends only the rows that changed since then, including rows that were added or removed. Hightouch's documentation says it compares the current results with the previous run only, and Fivetran Activations says every sync is incremental. Segment compares a checksum of each record against the one it stored.

A model of 250,000 rows: 248,750 rows unchanged and 1,250 moved; the diff finds 400 added, 800 changed and 50 removed rows, so 1,250 rows are sent, 0.5% of the modelA model of 250,000 rows: 248,750 rows unchanged and 1,250 moved; the diff finds 400 added, 800 changed and 50 removed rows, so 1,250 rows are sent, 0.5% of the model

Take a customer_attributes model of 250,000 customers. Between 2 runs 400 customers are added, 800 change a field and 50 drop out of the query. The diff sends 1,250 rows, 0.5% of the model. Run hourly, a tool that resent everything would push 6,000,000 records a day to cover the same 1,250 changes, 4,800 times as many. That gap is why the diff exists, and why pricing per record processed follows how much of your model moves.

A diff can only see rows that are still in the model, so a row that leaves the result is the hard case. Whether the destination record is deleted or kept, and whether its fields are cleared, is a setting called delete behaviour or sync mode.

Prepare for the interview
01 / Open invite
02min.

Know Reverse ETL Tools the way the interviewer who asks it knows it.

a Reverse ETL Tools query, the same shape a screen would give you.
The diff against expected. Where ties broke. What you missed.
sandbox
1source → bronze → silver → gold
2 ingest : CDC + Kafka
3 transform : dbt + Airflow
4 serve : Snowflake
5
Execute your solution0.4s avg.
MetaInterview question
Solve a Reverse ETL Tools problem

Where sync state lives, and what access the tool needs

To diff, a tool has to remember what it sent. Where it keeps that memory decides how much access your warehouse team must grant, and where a copy of customer data ends up.

Hightouch offers 2 engines. The Basic engine computes the diff on Hightouch's infrastructure and needs only read access. The Lightning engine computes it inside your warehouse and needs read and write access. It keeps previously synced data in schemas it manages there: hightouch_planner and hightouch_audit. Its documentation recommends Lightning for syncs over 100 thousand rows, and says you can't move back to Basic once it's configured. Fivetran Activations mirrors that split: its Advanced Sync Engine caches state in a scratch schema in your warehouse, and its Basic engine stores state outside the warehouse when it has no write access.

Segment and RudderStack always keep state in your warehouse. Segment writes a records_<id> table of record IDs and checksums and a checkpoints_<id> table of timestamps in a managed schema it needs write access to. RudderStack keeps snapshots and failure tables in a _RUDDERSTACK schema that you create before connecting a source, and its cursor watermarks live there too. The trade is plain: a warehouse team that won't grant write access narrows the field to the engines with a read-only mode, and a privacy team that wants no customer rows outside the warehouse favours the in-warehouse engines.

Read the retention behaviour too. Hightouch's Lightning planner keeps only the 2 most recent plan tables, while its Changelog table in the audit schema keeps history, including any PII, until you remove it.

Why every model needs a unique key

The diff matches a row in this run to the same row in the last run, so each model needs a column that identifies a row and never repeats. Hightouch calls it the primary key, Segment the Unique Identifier column, and both warn about duplicates. If the key repeats, 2 rows fight over 1 slot, and the destination flips between them on every run.

Pick the key the destination will also use to match the record, such as an email for a CRM contact or a customer ID stored in an external ID field. The same column then feeds the diff and the upsert. Keep the model narrow: select only the columns the destination consumes, because a wide model makes every unrelated column change look like a changed row.

A model query with its unique key

SELECT
  c.customer_id,
  c.email,
  c.plan,
  COALESCE(o.lifetime_value, 0) AS lifetime_value,
  o.last_order_at
FROM analytics.dim_customers AS c
LEFT JOIN analytics.customer_orders AS o
  ON o.customer_id = c.customer_id
WHERE c.email IS NOT NULL

customer_id is the unique key: the model returns exactly 1 row per customer, and only the columns the destination reads

Sync modes: upsert, mirror and what happens on delete

A sync mode says what the tool may do to the destination. Insert only creates records. Update only touches records that already exist. Upsert creates or updates, matching on a key. Mirror also deletes, so the destination ends up matching the model. Vendors name and bundle these differently. Hightouch has upsert alongside insert and update modes, plus a separate delete behaviour setting. Fivetran Activations lists 6 modes, including Mirror and Append Only. RudderStack offers upsert and mirror. Segment lets you sync added and updated records, or deleted ones.

Delete behaviour is the setting to read slowly. Hightouch's choices when a row leaves the model are to do nothing, clear the mapped fields, or delete the destination record. Fivetran notes that Mirror compares against what Activations already sent, not against the destination's current contents, so a record someone edited by hand in the CRM is not repaired until the model changes it again.

Choose the narrowest mode that does the job. An enrichment of existing CRM contacts wants update only, so a bad query cannot create thousands of junk contacts. A suppression list for an ad platform wants mirror, because staying in the audience after leaving the model costs money.

Standalone, bundled and destination native tools

Hightouch and Fivetran Activations are built around the sync itself. Both add an audience builder, called Customer Studio in Hightouch and Audience Hub in Fivetran Activations, which lets non-SQL users define segments over the models you maintain. Fivetran announced the Census acquisition on 1 May 2025, and Census's documentation now redirects to the Fivetran Activations pages, so the same product sits beside Fivetran's ingestion connectors in 1 vendor relationship.

Segment and RudderStack are customer data platforms that include a reverse ETL feature. If you already collect events with either one, the warehouse sync lives in the workspace and billing you already have. RudderStack bills per connection from a source to a destination, and its plans cap connections, so a source feeding 6 destinations counts as 6.

Polytomic splits the work differently. Its bulk syncs load untransformed data into data stores such as warehouses and databases, and its model syncs push a reusable model into business apps, so 1 tool covers both directions.

Some destinations pull for you. Braze Cloud Data Ingestion needs no separate vendor and reads up to 500 million rows per run from 5 platforms: Snowflake, Redshift, BigQuery, Databricks and Microsoft Fabric. It reaches Braze only, so a second destination needs a second solution.

Segment Reverse ETL limits per sync

Minimum time between syncs
15 minutes
Records per sync
150,000,000 records
Columns per record
512 columns
Record size
512 KiB as JSON
Single column value
128 KiB
Model SQL length
65,535 characters
Source: Segment Reverse ETL system documentation

Which reverse ETL tool fits which situation

No tool here fits every team. Match the constraint that binds first.

If ingestion already runs on Fivetran and your jobs trigger from dbt Cloud, Fivetran Activations keeps vendors to 1. Both it and Hightouch can trigger from dbt Cloud, so the trigger alone does not decide it. If marketers build their own audiences, compare Customer Studio and Audience Hub with RudderStack Audiences on who maintains the schema behind them, because the audience builder only shows fields the data team has exposed.

If events already flow through Segment or RudderStack, their reverse ETL features save a vendor and share permissions with the pipeline you run. Check connection or record based billing against your model sizes first. If your warehouse team grants read only access, only the Basic engines of Hightouch and Fivetran Activations fit; Segment and RudderStack need write access, so they are out unless that policy changes.

If everything goes to 1 destination, a native loader such as Braze Cloud Data Ingestion removes the sync vendor. If you need both warehouse loading and app syncing from 1 tool, look at Polytomic. If a model exceeds a vendor's per sync limit, read the limit: at 150,000,000 records per sync, 700,000,000 records take 5 syncs on Segment, so the first load is slower than the daily one.

If you need results in under a minute, none of these fits. Reverse ETL is batch, with schedules measured in minutes, so latency sensitive personalization belongs in an event pipeline that writes to the app directly.

When to build reverse ETL yourself

A script that runs a query, upserts rows into 1 destination keyed on an external ID and runs from your orchestrator is a few days of work, and it's a sound choice when there is 1 destination and the model is a small table. You keep it in the code review and alerting you already use.

The cost shows up later. You own the state that makes the diff work, so a crash between sending rows and recording them either resends or drops changes. You own each API's rate limits and partial failures, the rule for deletes, and backfills after a mapping change. Each added destination multiplies that work, and the vendors sell exactly that surface. A practical test is to count destinations and models: when the count passes a handful, or when non-engineers need to change audiences, buy; when it stays at 1 or 2, a scheduled job with idempotent writes is enough. Orchestration tools schedule it, and the ETL vs ELT guide covers where the load into the warehouse fits.

Whichever route you take, treat the sync as a pipeline with an owner: watch freshness and failed-row counts the way you would for any load, as in data observability.

How reverse ETL shows up in data engineering interviews

Interviewers rarely ask for a vendor. They ask a design question: the data science team has a churn score in the warehouse, so how does it reach Salesforce every morning? A strong answer names the model and its unique key, then explains the diff and where its state lives. It also settles delete behaviour and retries with idempotent writes, and says how you would notice a failed or partial sync.

That is the same reasoning the data engineering system design round tests, and ETL interview questions cover the load patterns underneath it. To practice the pipeline side, work through data pipeline interview questions and the data pipeline practice problems.

Reverse ETL tools FAQ

What is a reverse ETL tool?+
A reverse ETL tool runs a query on your warehouse on a schedule, works out which rows differ from the last run, and writes those rows into an operational app such as a CRM or an ad platform. It's ETL pointed the other way, from the warehouse out to the apps.
What is the difference between reverse ETL and data activation?+
Reverse ETL names the mechanism: warehouse rows synced to apps. Data activation is the wider job vendors describe, which adds audience building and identity matching on top of that sync, with campaign targeting as the end use. Most data activation tools are reverse ETL tools with an audience layer.
Is a customer data platform the same as a reverse ETL tool?+
No. A customer data platform collects events and builds profiles, and some, including Segment and RudderStack, ship a reverse ETL feature. Others keep the warehouse as the source of truth and add the sync on top. The practical difference is where the profile lives and who owns the model behind it.
Do reverse ETL tools store my data?+
They store sync state, and where depends on the tool and its engine. Segment keeps checksums and checkpoints in a schema inside your warehouse. RudderStack keeps cursor watermarks and snapshots in its own schema there. Hightouch and Fivetran Activations each offer an engine that does the diff in your warehouse and a basic one that does it on their side.
How real time is reverse ETL?+
It's batch. Segment spaces syncs at least 15 minutes apart, Braze Cloud Data Ingestion defaults to a 15 minute minimum in its dashboard, and RudderStack says Reverse ETL is not built for streaming or rapidly changing warehouse data. Sub minute personalization comes from an event pipeline, not from a warehouse sync.
Can I build reverse ETL myself?+
Yes. With 1 destination and 1 table it is a short job: a query and a keyed upsert on a schedule. The cost grows with the number of destinations, because each one brings its own rate limits and delete semantics, and you also own the diff state and retries.
02 / Why practice

The candidate who gets the offer

  1. 01

    Reading a solution is not the same as writing one

    Every engineer who has frozen on a query they had read a dozen times knows the gap. The only preparation that closes it is producing the answer yourself, under time, before the interview does it for you

  2. 02

    76% of hiring managers reject on the coding task, not the resume

    From HackerRank's 2024 Developer Skills Report. Candidates who look strong on paper still fail the live screen if they haven't done timed, executable practice

  3. 03

    System design comes down to the calls you defend out loud

    Ingestion, batch vs streaming, the bronze/silver/gold layers, idempotency, backfill and replay. Sketching the pipeline and naming the failure modes is the signal, not the boxes

Related guides