Skip to content

Blog / Operations in practice

Reverse ETL: why reps never see warehouse data

The warehouse knows which accounts are slipping. Why reverse ETL syncs stop reaching reps, what that costs, and what to fix first.

Three weeks before the renewal, the warehouse marked the account as at risk. Usage was down 30%, an urgent ticket had been open for a week, and the last survey score had dropped from 9 to 6. The rep found out on the renewal call, from the customer.

The data team had done its part. The score existed, with its reasons, in a table in Snowflake. Getting it from there into the CRM record the rep opens is reverse ETL: copying what the warehouse has worked out back into the tools people use every day. That last step is where most customer 360 projects stall.

Why the first sync is the easy part

Getting a Snowflake table into Salesforce is a solved problem. Reverse ETL vendors publish tutorials that do it in an afternoon, and most data teams could script it without one. The tutorials end when the first sync succeeds.

The trouble starts a week or two later, and it rarely comes from the code. Two teams share the result. The data team owns the model and decides what “at risk” means. RevOps or business systems owns the CRM: the fields, the page layouts, the validation rules and the reps’ trust in what they see. The people asking for the data sit closer to the process than to the pipeline, and the fields where the two teams meet usually have no owner at all.

Where reverse ETL breaks after go-live

  1. A synced value overwrites something a person typed. A customer success manager sets the health field to red after a bad call. At 2 a.m. the sync writes the warehouse’s green back over it. They change it again, the sync wins again, and by the third time they’ve stopped trusting the field. Soon after, the CRM admin switches the sync off.
  2. Forty columns become forty fields. The model has 40 useful columns, so the sync adds 40 fields to the account. Reps read none of them, because nothing tells them which three matter.
  3. A partial sync reports success. CRMs cap how many API calls they accept. A run hits the cap, writes 9,000 of 12,000 rows and finishes with a green check. The 3,000 accounts it skipped keep last week’s values, and nothing on the record says so.
  4. The value lands where nobody looks. The score sits on a tab of the account page. The rep works from a list view, a sequence and Slack, and never opens that tab.

Not every value needs to be a field

Reverse ETL comes in two shapes, and most teams only build the first. A scheduled sync copies values from the warehouse into CRM fields every hour or every night. A lookup runs inside a process: when a lead arrives or a deal reaches a stage, the workflow asks the warehouse one question and acts on the answer.

Many of those forty fields exist because one process needed one value. Lead routing needs to know whether the company is already a customer. An order approval needs the account’s payment history. Neither needs a field a rep will scroll past. Asking the warehouse at the moment the process runs gets the current answer, and the CRM stays readable.

Lookups need different plumbing from syncs. They start from an event in the CRM rather than a schedule, they arrive in bursts that spike with a campaign or a quarter-end, and they’re usually built by the RevOps or marketing ops team that owns the process.

What the manual version costs

Before anything is automated, the same job runs by hand. Every Monday, someone in ops exports the at-risk list from the warehouse, tidies it in a spreadsheet and uploads it to the CRM with a data loader. It works, and it costs three things:

  1. The values are up to a week old by the time a rep reads them.
  2. It takes part of one person’s week, every week.
  3. It stops the week that person is out, and nobody notices until a renewal goes wrong.

What to fix first

  1. Agree in writing which fields the warehouse owns. Do it with whoever owns the CRM, before anything is built. Every field not on that list is off-limits to the sync. The reverse ETL guide covers how to make that claim stick.
  2. Write computed values to their own fields. Label them as calculated, and never point the sync at a field a person edits. When a manager’s judgment and the model disagree, both stay visible.
  3. Send a few plain labels, and look up the rest. “At risk”, the top reason and the date it changed are worth more to a rep than 40 raw columns. A value only one process uses can be fetched when that process runs.
  4. Sync only the rows that changed. Full pushes use up the API cap and bury the change that mattered.
  5. Count every run. Compare rows attempted with rows written, and alert on any gap, so a partial sync can’t pass as a success. The guide shows how to reconcile the counts.
  6. Put the value where the person already works. That might be the record header, the list view a rep filters every morning, or a message in Slack. At Zuora, teams ask for a customer brief in Slack, and an agent pulls CRM, support and usage data into it in under five minutes. The same brief used to take about 23 hours by hand.

Read it in place, buy a tool, or run it on one platform

Read the data where it sits. Some teams skip the copy and let the CRM read warehouse tables directly, so there’s no second copy to keep in step. Before choosing it, check whether your CRM’s assignment rules, automation and reports can use data that isn’t stored in it, because those are usually what a rep actually sees.

A dedicated reverse ETL tool. These tools are built for this one job, and they do it well: point them at a model and they’ll sync it to dozens of destinations. The trade-off is another tool, with its own access rules and its own logs, beside whatever already moves data into the warehouse and between apps.

One platform for both directions. Loading the warehouse, scheduled syncs back out, lookups triggered from the CRM and the app-to-app syncs all run in one place, with the same error handling, logging and access control. That’s how Tray.ai runs reverse ETL. The RevOps and marketing ops teams who own each process build its syncs and lookups, and IT governs them alongside every other integration.

What reverse ETL depends on

Sending a score back is the last step of a customer 360, and it only works if three earlier steps held:

  1. Each customer has one id across systems, so every row knows which record to update. See how to build a customer 360 and master data sync.
  2. CRM data reaches the warehouse on schedule, with history kept, so the model is current. See how to build a CRM to warehouse sync.
  3. The health score carries its reasons, so a rep can act on “at risk” without opening a dashboard. See how to build customer health signals.

For why a single customer view rarely holds up once four teams need something different from it, read Why the customer 360 never sticks.

For six places reverse ETL usually pays off first, see Reverse ETL use cases, team by team. For how it differs from loading the warehouse, see Reverse ETL vs ETL.