How to Set Up Hightouch for Reverse ETL
Last updated Apr 23, 2026

Reverse ETL flips the traditional data pipeline. Instead of moving raw data into a warehouse for analysis, you move clean, model-ready data out of the warehouse and into the operational tools your team uses every day. Hightouch is the leading platform for this workflow. This guide walks through setting up a working sync from a data source to a downstream destination in under an hour, with no coding required beyond writing a basic SQL query.
What Hightouch Actually Does
Most data teams spend significant effort getting data into a warehouse. Hightouch solves the next problem: getting that data back out and into tools like Salesforce, HubSpot, Braze, Intercom, or Google Ads.
The core workflow has three components. First, a source: your database or warehouse such as PostgreSQL, Snowflake, BigQuery, Redshift, or Databricks. Second, a model: a SQL query or dbt model that defines which rows and columns to use. Third, a sync: the mapping between your model's fields and the destination's fields, plus a schedule.
Each sync tracks changes between runs using a primary key, so Hightouch only pushes records that are new or updated. This makes syncs efficient even on datasets with millions of rows. According to Hightouch, their platform processes syncs for companies like Spotify, Autotrader, and the NBA, handling hundreds of millions of rows per sync cycle.
Prerequisites
Before starting, confirm you have three things: a data source with the data you want to sync (PostgreSQL works, as does any cloud warehouse), admin credentials for your destination (HubSpot, Salesforce, etc.), and a Hightouch account. The free tier allows one sync with up to 5,000 rows per month, which is enough to validate the setup before committing to a paid plan.
Step 1: Connect Your Source
After signing into Hightouch, go to Sources in the left sidebar and click Add Source.
Hightouch supports more than 25 sources. For a self-hosted PostgreSQL database, choose PostgreSQL and fill in your host, port, database name, username, and password. For cloud warehouses, Hightouch uses read-only credentials to avoid touching your production data directly.
Hightouch creates a read-only connection to each source. It does not write back to your source under any circumstance. For PostgreSQL specifically, you will need to grant the Hightouch database user SELECT privileges on the tables you plan to query. Hightouch provides the exact SQL grant statement in the setup UI.
Once the connection is saved, Hightouch runs a test query to confirm access. If the test succeeds, the source shows as healthy in the dashboard.
Step 2: Create a Model
A model is the query that defines what data gets synced. Navigate to Models and click Add Model.
Select the source you just connected, then write your SQL query in the built-in editor. A simple example for syncing contacts to HubSpot might look like this:
SELECT
id AS customer_id,
email,
first_name,
last_name,
plan_name,
created_at
FROM customers
WHERE email IS NOT NULL
Every model requires a primary key, which Hightouch uses to track which records have been added or changed since the last sync. In this example, customer_id would be the primary key. If your source table does not have a stable unique identifier, generate one using a hash of two or more columns.
You can also connect a dbt project directly and use existing dbt models instead of writing raw SQL. This is the recommended approach if your team already maintains a dbt project, since it keeps transformation logic in one place instead of duplicating it in Hightouch.
Run a preview to confirm the query returns the expected columns and row count before saving.
Step 3: Connect Your Destination
Go to Destinations and click Add Destination. Hightouch supports more than 200 destinations, including Salesforce, HubSpot, Google Ads, Facebook Ads, Braze, Iterable, Intercom, Zendesk, and Slack.
For HubSpot, click Connect HubSpot and authorize via OAuth. No API key setup is required; Hightouch requests only the permission scopes it needs for the objects you plan to sync. For Salesforce, you provide your Salesforce org URL and complete OAuth authorization. Hightouch supports both production and sandbox Salesforce environments.
Step 4: Configure the Sync
With source and destination connected, go to Syncs and click Add Sync. This step ties everything together.
Select your model, then select your destination. Next, choose the object type in the destination. For HubSpot that would be Contacts. For Salesforce it might be Lead or Contact.
Then choose the sync behavior. Hightouch supports three modes: upsert (creates new records and updates existing ones, which is the most common choice), update only (only modifies records that already exist in the destination), and insert only (creates new records but never modifies existing ones).
After choosing a behavior, map your model's columns to the destination fields. For a HubSpot contact sync, you would map email to the Email field (this is typically the match key), first_name to First Name, last_name to Last Name, and plan_name to a custom HubSpot contact property. If the custom property does not exist in HubSpot yet, you can create it directly from the Hightouch mapping interface without leaving the setup flow.
Finally, set your sync schedule. Options include manual runs, interval-based syncs (every 15 minutes, hourly, or daily), and cron expressions for custom schedules. The free tier supports daily syncs. Paid tiers support 15-minute intervals, which is sufficient for most operational use cases.
Step 5: Run and Monitor
Click Run Sync to trigger your first sync manually. Hightouch shows a real-time log of the run with a summary at the end: how many records were added, updated, or skipped, and any rows that failed with the specific error returned by the destination API.
If a record fails because of a missing required field or a type mismatch, you can filter to failed rows in the UI, fix the underlying data in your warehouse, and re-run without touching any configuration. This feedback loop is one of Hightouch's practical advantages over custom sync scripts, which typically require reading log files to diagnose failures.
For ongoing monitoring, Hightouch can send alerts to Slack or email when a sync fails or when the row error rate exceeds a threshold you define.
Common Issues
A destination field type mismatch is the most frequent issue on first runs. If your model sends a string value to a HubSpot number field, Hightouch flags the mapping at configuration time and again in the run log. Fix the type in your SQL model and re-run.
Some destinations, particularly Salesforce, enforce API rate limits. Hightouch manages throttling automatically, but very large initial syncs on Salesforce may take longer than subsequent incremental runs.
If your primary key column contains duplicate values, Hightouch will error and report which rows collided. Make sure your model's primary key uniquely identifies each row before saving the model.
When Reverse ETL Makes Sense
Hightouch works best when data is already centralized in one place. If your team stores customer data in PostgreSQL or a cloud warehouse and regularly exports CSVs to import into HubSpot or Salesforce by hand, Hightouch replaces that manual step with an automated sync that runs on a schedule and alerts you when something breaks.
It is not the right tool for teams that have not yet centralized their data. In that case, the prerequisite step is getting data into one place. If your goal is to analyze messy data files and generate insights or charts from them directly, a tool like VSLZ handles that step from a plain file upload without requiring warehouse infrastructure first.
Practical Summary
Setting up Hightouch takes four steps: connect a source, define a model using SQL or a dbt project, connect a destination via OAuth, and configure a sync with field mappings and a schedule. Most teams complete a working first sync in under an hour. From that point, Hightouch runs on its schedule, pushes only changed records, and alerts your team when something goes wrong. For any team that has reliable data in a warehouse and business tools that need to reflect that data in near real time, reverse ETL is the most maintainable approach available.
FAQ
What is reverse ETL and how does it differ from standard ETL?
Standard ETL (extract, transform, load) moves raw data from operational systems into a data warehouse for storage and analysis. Reverse ETL runs in the opposite direction: it takes clean, model-ready data from the warehouse and syncs it into downstream business tools like Salesforce, HubSpot, or ad platforms. The result is that insights derived from your warehouse automatically appear in the tools your sales, marketing, and ops teams use without manual exports or custom scripts.
Does Hightouch require coding to set up?
Hightouch requires writing a SQL query to define your data model, but everything else is configured through a UI. Connecting sources, mapping fields to destination objects, and scheduling syncs all happen without code. If your team uses dbt, you can import existing dbt models directly and skip writing SQL in Hightouch entirely. No server setup or infrastructure management is required.
What data sources does Hightouch support?
Hightouch supports more than 25 data sources including PostgreSQL, MySQL, Snowflake, BigQuery, Redshift, Databricks, Azure Synapse, Amazon Athena, ClickHouse, and Google Sheets. It also integrates directly with dbt Cloud and dbt Core projects so you can use your existing data models without duplicating transformation logic.
What destinations can Hightouch sync data to?
Hightouch supports more than 200 destinations including Salesforce, HubSpot, Marketo, Braze, Iterable, Intercom, Zendesk, Google Ads, Facebook Ads, LinkedIn Ads, Slack, and many others. New destinations are added regularly. For destinations without a native connector, Hightouch offers a generic HTTP destination that can push data to any REST API endpoint.
How much does Hightouch cost?
Hightouch offers a free tier that supports one sync with up to 5,000 rows per month, which is sufficient for testing and small-scale workflows. Paid plans start based on the number of destinations and sync frequency. Team and Business plans unlock shorter sync intervals (down to 15 minutes), unlimited syncs, priority support, and advanced monitoring features. Pricing is available on request for enterprise volumes.


