# Reverse ETL Quickstart Guide


The easiest way to set up a Reverse ETL pipeline is to configure your warehouse source, connect it to a downstream destination, and specify the data mappings and sync settings.

{{< info >}}
You can set up to:

- 10 connections in the RudderStack [Free](https://rudderstack.com/pricing/) plan
- 25 connections in the [Growth](https://rudderstack.com/pricing/) plan
- Unlimited connections in the [Enterprise](https://www.rudderstack.com/enterprise-quote/) plan
{{< /info >}}

For most use cases, you can set up and activate your Reverse ETL pipeline by following these steps:

1. [Add a source](#step-1-add-source)
2. [Add destination](#step-2-connect-destination)
3. [Define mappings](#step-3-create-mappings)
4. [Schedule syncs](#step-4-schedule-syncs)
5. [Activate connection](#step-5-activate-connection)

## Step 1: Add source

{{< info >}}
RudderStack lets you set up a Reverse ETL source from a warehouse table, [Model]({{< ref "data-pipelines/reverse-etl/features/models.md" >}}), or [Audience]({{< ref "data-pipelines/reverse-etl/features/audiences.md" >}}).
{{< /info >}}

{{< customreadfile "/includes/retl/add-source.md" >}}

## Step 2: Connect destination

Once you have set up the Reverse ETL source, the next step is to connect it to a downstream destination.

{{< success >}}
RudderStack supports syncing data to over 200 [Event Stream]({{< ref "destinations/streaming-destinations" >}}) and [Reverse ETL-only]({{< ref "destinations/reverse-etl-destinations" >}}) destinations.
{{< /success >}}

You can connect the Reverse ETL source to an existing or new [destination]({{< ref "destinations/overview.md" >}}) to start using it. To connect to a destination later, click **Done** on the top right. 

{{< image src="images/retl-sources/created-source.webp" alt="Next steps" >}}

You will then be redirected to the **Overview** page of the source where you get the option of connecting it to an existing or new destination.

{{< image src="images/retl-sources/add-destination.webp" alt="Add destination" >}}

See [Set up Reverse ETL Connections]() section for more information.

## Step 3: Create mappings

{{< customreadfile "/includes/retl/create-data-mappings.md" >}}

## Step 4: Schedule syncs

{{< customreadfile "/includes/retl/schedule-syncs.md" >}}

## Step 5: Activate connection

Once your source and destination are set up, activate the connection by clicking **Turn on the connection**.

{{< image src="images/data-pipelines/turn-on-connection.webp" alt="Turn on Reverse ETL connection" >}}

Once you activate the connection, RudderStack automatically triggers the syncs as per the [sync schedule](#step-4-schedule-syncs). 

{{< info >}}
When you sync data from the source for the first time, RudderStack performs a full sync by default, irrespective of the sync mode you specified while [setting the mappings](#step-3-create-mappings). It then incrementally syncs any new data since the last sync.
{{< /info >}}

### Trigger syncs

Go to the **Syncs** tab of your Reverse ETL source and click the **Sync Now** button to trigger a new sync. To force a full data sync, choose the **Reset History and Full Sync** option.

{{< image src="images/data-pipelines/trigger-full-sync.webp" alt="Trigger new syncs" >}}

To stop a running sync, click the **Stop Now** button.

{{< image src="images/data-pipelines/stop-sync.webp" alt="Stop syncs" >}}

{{< warning >}}
Note the following before stopping a sync:

- Once you stop a sync, any data that RudderStack reads from the warehouse and is on the fly may not be stopped or dropped from being delivered to the destination. It will only stop reading and sending any new data from the warehouse to the destination and stop the sync from progressing.
- For a very low number of deltas (new data since the last attempted sync), you may sometimes see a "0 deltas succeeded" after you stop the sync.
- Once you cancel a sync, the behavior of the next sync depends on the type of the previously cancelled sync. For example, if a cancelled sync is an incremental sync, then the next sync will be incremental too. Similarly, if the cancelled is a full sync, then the next sync will be a full sync.
{{< /warning >}}

### Update your mappings

In cases where your warehouse schema has changed, RudderStack lets you update the mappings to ensure the data is synced to the destination correctly.

Go to the **Schema** tab of your connection page and click **Update** to update your mappings. Make sure to save the updated mappings.

{{< warning >}}
You cannot update the mappings while a sync is in progress.
{{< /warning >}}

{{< image src="images/data-pipelines/update-mappings.webp" alt="Update connection mappings" >}}

## Sync data from SQL models

RudderStack's [Models]({{< ref "data-pipelines/reverse-etl/features/models.md" >}}) feature lets you create models by defining custom SQL queries. You can then run these queries on your warehouse and send the resulting data to specific destinations.

Follow these steps to set up a Reverse ETL pipeline using a model:

1. [Create a new model]({{< ref "data-pipelines/reverse-etl/features/models.md#create-model" >}})
2. [Connect the model to a destination]({{< ref "data-pipelines/reverse-etl/features/models.md#connect-model-to-destination" >}})
3. [Set up the data mappings]({{< ref "data-pipelines/reverse-etl/developer-guides/json-data-mapping.md" >}})

## Sync data from Audiences

RudderStack’s [Audiences]({{< ref "data-pipelines/reverse-etl/features/audiences.md" >}}) feature lets you create customer lists or a subset of users satisfying specific criteria with easy-to-use filters on your warehouse tables. Once created, you can connect and activate them in your downstream destinations.

Follow these steps to set up a Reverse ETL pipeline using an audience:

1. [Set up a new audience]({{< ref "data-pipelines/reverse-etl/features/audiences.md#create-audience" >}})
2. [Connect the audience source to a destination]({{< ref "data-pipelines/reverse-etl/features/audiences.md#connect-audience" >}})
3. [Set up the data mappings]({{< ref "data-pipelines/reverse-etl/developer-guides/json-data-mapping.md" >}})

<br />

