# Connect Reverse ETL Source to Braze Audiences


This guide takes you through the steps to connect a [Reverse ETL source]({{< ref "sources/reverse-etl/" >}}) to your Braze Audiences destination.

{{< success >}}
You can connect multiple Reverse ETL sources (and audience syncs) to the same Braze account. Each sync uses its own custom attribute name.
{{< /success >}}

## Setup

1. Set up and configure your Reverse ETL source.
2. In the **Overview** tab of the source page, click **Add destination** > **Create new destination**. You can also select an already-configured destination here.
3. From the list of destinations, select **Braze Audiences** and click **Continue**.
4. Specify a unique name to identify this destination in RudderStack.
5. In the **Braze account** section, click **Select** to choose an existing account. To add a new account, click **Add account**, and specify the following settings:

| Setting | <div style="width: 350px;">Description</div> |
| :----| :-----|
| Account Name | Specify a unique account name. |
| REST API Key | Enter your Braze [REST API key](https://www.braze.com/docs/api/basics/#rest-api-key-permissions) with permission to call `users.track` / `users.track.bulk`. {{< info >}}Braze's `/users/track/bulk` endpoint may require [early access](https://www.braze.com/docs/api/endpoints/user_data/post_user_track_bulk/). Confirm access with your Braze account team before using it in production.{{< /info >}} |
| Data Center | Select the [Braze data center](https://www.braze.com/docs/user_guide/data/data_centers/#list-of-data-centers) for your workspace (same options as the event-stream Braze destination — for example `US-01` … `US-08`, `EU-01` … `EU-03`, `AU-01`). Match the region shown in your Braze dashboard URL. |

6. Proceed to configure the mapping settings.

## Mapping settings

This section lists the settings to correctly map data from your Reverse ETL source to the Braze Audiences destination.

### Audience attribute name

Enter the Braze **custom attribute** name that represents membership in this audience (for example, `rs_high_value_customers`).

- Edit the auto-suggested sanitized name from your audience or connection name before saving if needed.
- Allowed characters: letters, numbers, and underscores (`/^[a-zA-Z0-9_]+$/`), maximum length **255**.
- Do not use `external_id` — that name is reserved.
- The attribute is not selected from a Braze catalog. Braze creates the custom attribute on the first successful write.

### Sync mode

RudderStack supports only [Mirror mode]({{< ref "data-pipelines/reverse-etl/developer-guides/sync-modes.md#mirror-mode" >}}) for this integration. There is no sync-mode selector in the UI.

### Map identifiers

Map exactly one warehouse column to Braze **`external_id`**. `user_alias` and additional identifier rows are not supported for this destination.

## Sync settings

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

#### Sync observability settings

{{< customreadfile "/includes/retl/sync-observability-settings.md" >}}

## How membership is written to Braze

In mirror mode, audience membership changes map to boolean custom-attribute updates via Braze [`POST /users/track/bulk`](https://www.braze.com/docs/api/endpoints/user_data/post_user_track_bulk/):

| Action | <div style="width: 350px;">Braze custom attribute value</div> |
| :---- | :---- |
| Insert or update | `true` (user is in the audience) |
| Delete | `false` (user left the audience) {{< warning >}}Leaving the audience sets the attribute to **`false`**. It does **not** delete the custom attribute key from the Braze profile.{{< /warning >}} |

Note that:

- Requests are batched (up to **1000** attribute updates per bulk request, subject to Braze payload limits).
- One Braze account can back many syncs; each sync should use a **different** custom attribute name.

#### Identifier validation

Before sending data to Braze, each row is validated:

| Identifier | <div style="width: 350px;">Validation</div> |
| :---- | :---- |
| `external_id` | Must be a non-empty string or finite number after trim. Missing, empty, whitespace-only, or non-scalar values are not sent. |

Rows with no valid identifier are skipped and reported as **failed records** in the sync report. The sync completes with failures rather than stopping entirely.

## FAQ

#### Where can I find the Braze REST API key?

In the Braze dashboard, go to **Settings** > **APIs and Identifiers** > **API Keys**, and create or copy a REST API key with track/bulk permissions.

For more information, see [Braze REST API key permissions](https://www.braze.com/docs/api/basics/#rest-api-key-permissions) and the event-stream [Braze setup guide]({{< ref "destinations/streaming-destinations/braze/setup-guide.md#where-can-i-find-the-braze-rest-api-key" >}}).

#### How is Braze Audiences different from the Braze destination?

| | **Braze** (event stream) | **Braze Audiences** |
| :---- | :---- | :---- |
| Typical use | Tracks, identifies, pages, screens | Audience / Reverse ETL membership |
| Payload | Event stream messages | `record` membership updates |
| Braze surface | Events and profile traits | Boolean **custom attribute** per sync |
| Sync mode | N/A (streaming) | Mirror only |

#### Does leaving the audience remove the custom attribute in Braze?

No. Delete / leave actions set the attribute to `false`. The key remains on the profile so campaigns and segments can still target "not in audience".

#### Why did Test connection succeed with a 400 from Braze?

Credential checks may call Braze with an empty attributes payload. Braze can respond with `400` (**No data parsed**) for a valid API key. Treat that as a successful credential check. A `401` means the key or data center is wrong.

<br />
