# How to Set Up Reverse ETL Connection


This guide explains how to set up a Reverse ETL connection in RudderStack.

{{< info >}}
RudderStack has the following connection limits for Reverse ETL:

- **Free plan**: You can set up to 10 connections.
- **Growth plan**: You can set up to 25 connections.
- **Enterprise plan**: You can set up unlimited connections.
{{< /info >}}

## Overview

Follow these steps to set up a Reverse ETL connection in RudderStack:

1. [Create a Reverse ETL source](#add-source)
2. [Connect it to a destination](#connect-destination)
3. [Specify the data mappings](#specify-data-mappings)
4. [Define a sync schedule](#schedule-syncs)
5. [Configure advanced settings](#configure-advanced-settings)
6. [Activate the connection](#activate-connection)

## Required permissions

- [Admins]({{< ref "access-management/member-management.md#member-roles" >}}) have full access to set up and manage Reverse ETL connections.
- [Members]({{< ref "access-management/member-management.md#member-roles" >}}) must have the following [permissions]({{< ref "access-management/policies-overview.md#resource-permissions" >}}) in their workspace policy:

| Resource | Permission | 
| :----| :-----| 
| Tables / SQL Models / Audiences | **Edit**, **Connect** | 
| Destinations | **Edit**, **Connect** | 

#### Permissions for legacy RBAC system

In the [legacy Permissions Management (RBAC) system]({{< ref "archive/dashboard-guides/user-management.md" >}}), only [Org Admins]({{< ref "archive/dashboard-guides/user-management.md#organization-roles" >}}) and members with the **Connections Editor** or **Connections Admin** role in their workspace policy can set up Reverse ETL connections.

{{< image src="images/access-management/data-catalog-permissions-legacy-framework.webp" alt="Reverse ETL connections permissions in the legacy framework" >}}

## Add source

{{< info >}}
Reverse ETL connections are source-driven, meaning you must first create a source and then connect it to a destination.
{{< /info >}}

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

## Connect destination

Once you have created a [Reverse ETL source]({{< ref "sources/reverse-etl/" >}}), you can connect it to: 

- A new [destination]({{< ref "destinations/overview.md" >}}), or
- An existing destination that is **not already connected** to any other source.

To connect a destination:

1. Click **Use existing destination** or **Set up a new destination** depending on your requirement.

{{< warning >}}
You can connect an [Audience]({{< ref "data-pipelines/reverse-etl/features/audiences.md" >}}) source only to [Audience and List destinations]({{< ref "destinations/reverse-etl-destinations/" >}}).
{{< /warning >}}

{{< image src="images/retl-sources/connect-destination.webp" alt="Connect destination options" >}}

2. Enter the connection settings for the destination. See the [destination-specific documentation]({{< ref "destinations/streaming-destinations/" >}}) for more details on these settings.

### 1:many connections

RudderStack supports connecting a Reverse ETL source to multiple destinations.

{{< info >}}
**Event usage/billing in 1:many connections**

When sending data from a Reverse ETL source to multiple destinations, RudderStack sends the record to each destination separately — this means you will be charged on a **per connection basis**.
{{< /info >}}

### Many:1 connections

RudderStack also supports connecting **multiple** Reverse ETL sources to a single downstream destination. However, this feature is available only for the below destinations currently — support for more integrations is coming soon.

{{< destinations manytoonesupport="yes" >}}

## Specify data mappings

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

## Schedule syncs

You can configure the schedule settings and sync frequency at the connection level. This is because a source might be connected to multiple destinations and the sync interval and frequency might need to be configured differently for each connection.

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

{{< image src="images/retl-sources/schedule-syncs.webp" alt="Sync schedule" >}}

## Configure advanced settings

{{< warning >}}
This option is available only if you have set up a new destination.
{{< /warning >}}

Once you create a connection successfully, you can configure the optional advanced settings to receive the data correctly in your destination.

{{< image src="images/retl-sources/advanced-config-destination.webp" alt="Advanced destination configuration" >}}

1. Click **Configure your destination**.
2. Specify the advanced settings and click **Save**.

## Activate connection

{{< tabs tabTotal="2" >}}
{{% tab tabName="For new destination" %}}
1. Activate the destination by turning on the toggle.
2. Turn on the connection to activate the connection.

{{< figure src="images/retl-sources/activate-destination.webp" alt="Activate destination" >}}

You will be redirected to the connections page.

{{< figure src="images/retl-sources/connections-page.webp" alt="Connections page" >}}

RudderStack will send data to your destination as per the specified [sync frequency](#schedule-syncs). Click **Sync now** to manually trigger a new sync.
{{% /tab %}}
{{% tab tabName="For existing destination" %}}
Click **Turn on the connection** to activate the connection.

{{< figure src="images/retl-sources/activate-connection.webp" alt="Activate connection" >}}

You will be redirected to the connections page.

{{< figure src="images/retl-sources/connections-page.webp" alt="Connections page" >}}

RudderStack will send data to your destination as per the specified [sync frequency](#schedule-syncs). Click **Sync now** to manually trigger a new sync.

{{% /tab %}}
{{< /tabs >}}

## Stop data syncs for connection

Go to the connection page and turn off the connection toggle to stop data syncs for the connection. 

Note that the **Sync Now** button is greyed out and the connection status is **Paused** until you turn on the connection again.

{{< image src="images/retl-sources/disable-connection.webp" alt="Turn off connection" >}}

## Update mapping configuration

Go to the **Schema** tab of your connection and click **Update** to change the mapping configuration and update your column selection. Then, click **Save** to update and save the configuration.

{{< warning >}}
The **Object** (for VDM mapping), **Sync mode**, **Event type**, and **User identifier** fields are not editable. 
{{< /warning >}}

{{< image src="images/retl-sources/update-connection-configuration.webp" alt="Update connection configuration" >}}

## Update connection settings

Go to the **Settings** tab of your connection to:

- Get the **Connection ID**.
- Change the sync schedule and frequency.
- Specify the settings to retain sync logs in your warehouse and retry syncing failed records. See [Syncs Observability]({{< ref "data-pipelines/reverse-etl/developer-guides/sync-observability.md" >}}) for more information.
- Delete the connection permanently.

{{< image src="images/retl-sources/retl-connection-settings.webp" alt="Update connection settings" >}}

## View all connections for Reverse ETL source

Go to the **Overview** tab of your Reverse ETL source. Here, you will see all the destinations connected to that source. Click the required destination or click **View** > **Connection details** to go to the connection's page.

{{< image src="images/retl-sources/connection-details.webp" alt="Connection details" >}}

RudderStack automatically redirects you to the **Syncs** tab where you can view the latest sync details or check past syncs.

## View sync details

Go to the **Syncs** tab to see detailed metrics on the latest sync. You can also view details of the past syncs (up to 1 month). These details include:

| Metric | Details |
| :----| :---|
| Status | The sync status. It can be one of the following:<br /><br /> <ul><li>**Aborted**: The sync ended unsuccessfully before completing, for example, when you [stop it manually]({{< ref "data-pipelines/reverse-etl/developer-guides/start-stop-syncs.md" >}}).</li><li>Completed, with failures</li><li>Completed, no failures</li></ul> |
| Sync mode | Defines how RudderStack syncs data to the destination. It can be one of the following: <br /><br /><ul><li>Upsert</li><li>Mirror</li></ul> |
| Sync type | Determines the scope of the sync. It can be one of the following: <br /><br /><ul><li>Incremental: RudderStack syncs only the newly added data in the warehouse since the last sync.</li><li>Full: RudderStack syncs all the data irrespective of whether it was synced to the destination previously.</li></ul>  |
| Trigger | Determines how the sync was triggered. It can be one of the following:<br /><br /> <ul><li>Manual</li><li>Scheduled, as per the [sync schedule](#schedule-syncs)</li></ul> |
| Sync start time | Determines when the sync was triggered. |
| Duration | The sync duration. |

You can also see the following source and destination-specific metrics:

{{< tabs tabTotal="2" >}}
{{% tab tabName="Source" %}}
- Number of synced rows.
- Deltas (new records since last sync) with the number of records inserted, deleted, and updated.
- [Invalid records](#view-invalid-records) not synced to destination.
{{% /tab %}}
{{% tab tabName="Destination" %}}
- Successfully synced records with the number of records inserted, deleted, and updated.
- Number of dropped records.
- Number of records that failed to sync.
{{% /tab %}}
{{< /tabs >}}

{{< image src="images/retl-sources/sync-details-1.webp" alt="Sync details" >}}

### View invalid records

{{< warning >}}
**Required permissions**

- [Admins]({{< ref "access-management/member-management.md#member-roles" >}}) have full access to view the invalid records resulting during a Reverse ETL sync.
- [Members]({{< ref "access-management/member-management.md#member-roles" >}}) must have the [**Reverse ETL Sync Failure Samples**]({{< ref "access-management/policies-overview.md#pii-permissions" >}}) PII permission to see these invalid records.
{{< /warning >}}

Click **View invalid records** and click a row to see all the invalid records that RudderStack did not sync to the destination.

You also see the error message and sample erroneous rows in this view.

{{< image src="images/retl-sources/invalid-records.webp" alt="View invalid records" >}}

### View sync graph

{{< warning >}}
This graph is only available for: 

- The latest sync.
- Syncs performed using [Upsert mode]({{< ref "data-pipelines/reverse-etl/developer-guides/sync-modes.md#upsert-mode" >}}).
{{< /warning >}}

RudderStack provides an intuitive visual graph detailing the records sent to the destination over time. The X-axis represents the time of the day and the Y-axis represents the number of records classified as:

- Successfully synced records
- Dropped records
- Records that failed to sync

{{< image src="images/retl-sources/sync-graph.webp" alt="View sync graph" >}}

Switch to the **Retries** tab to get a graphical view of the retries over time. The X-axis represents the retry time of the day and the Y-axis represents the number of retry attempts.

{{< image src="images/retl-sources/sync-retries.webp" alt="Sync retries graph" >}}

<br />
