# Connect Reverse ETL Source to Bing Ads Offline Conversions


This guide takes you through the steps to connect a Reverse ETL source to the Bing Ads Offline Conversions destination.

## Set up connection 

{{< warning >}}
**The Reverse ETL feature supports only source-driven pipeline configuration.**

Make sure you have [set up a RETL source]({{< ref "sources/reverse-etl/_index.md" >}}) and connected it to your Bing Ads Offline Conversions destination before following the below steps.
{{< /warning >}}

1. [Confirm the connection settings]({{< ref "destinations/reverse-etl-destinations/bing-ads-offline-conversions/setup-guide.md#connection-settings" >}}) for Bing Ads Offline Conversions destination and click **Continue**.
2. In the [Data Mapping]({{< ref "data-pipelines/reverse-etl/developer-guides/visual-data-mapper.md" >}}) section, select the **Object**.
3. Specify the [Sync mode]({{< ref "data-pipelines/reverse-etl/developer-guides/sync-modes.md" >}}) to specify how RudderStack should sync the data to Bing Ads.
4. In **Choose identifier**, specify the warehouse column that RudderStack uses to identify your records.

{{< info >}}
You can map this warehouse column to any of the following Bing Ads fields:

- `EMAIL`
- `MICROSOFT_CLICK_ID`
- `PHONE`
{{< /info >}}

5. Map the other warehouse columns to specific Bing Ads fields using the **Map fields** setting.

{{< image src="images/event-stream-destinations/bingads-offlineconversions-map-fields.webp" >}}

## Supported mappings

RudderStack automatically maps the following schema fields to the corresponding Bing Ads properties depending on the type of operation:

### Create

For any field `x` of type `record`:

| RudderStack property | Bing Ads property | 
| :----| :----| 
| `x.conversionCurrencyCode` | [Conversion Currency Code](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversioncurrencycode) | 
| `x.conversionName` | [Conversion Name](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversionname) |
| `x.conversionTime` <br/> <span style="color: #4D4DFF;font-size:12px;">Should be in ISO 8601 or Bing Ads-supported format</span><br /><span style="color:rgb(0, 0, 0);font-size:12px;">Examples:<br /><ul><li>`2006-01-02T15:04:05Z` (ISO 8601)</li><li>`02/01/2006 3:04:05 PM` (Bing Ads format)</li></ul></span> | [Conversion Time](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversiontime)  |
| `x.conversionValue` | [Conversion Value](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversionvalue) |
| `x.clickId` | [Microsoft Click ID](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#microsoftclickid) |
| `x.userId` or `x.customerId` | Client ID |
| `x.externalAttributionCredit` |  [External Attribution Credit](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#externalattributioncredit) |
| `x.externalAttributionModel` | [External Attribution Model](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#externalattributionmodel) |
| SHA256(`x.email`) <br/> <span style="color: #4D4DFF;font-size:12px;">Required for enhanced conversions.</span> | [Hashed Email Address](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#hashedemailaddress) |
| SHA256(`x.phone`) <br/> <span style="color: #4D4DFF;font-size:12px;">Required for enhanced conversions.</span> | [Hashed Phone Number](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#hashedphonenumber) |

### Update

For any field `x` of type `record`:

| RudderStack property | Bing Ads property | 
| :----| :----| 
| `restate` | [Adjustment Type](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#adjustmenttype) |
| `x.conversionCurrencyCode` | [Adjustment Currency Code](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#adjustmentcurrencycode) |
| `x.conversionName` | [Conversion Name](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversionname) |
| `x.conversionTime` <br/> <span style="color: #4D4DFF;font-size:12px;">Should be in ISO 8601 or Bing Ads-supported format</span><br /><span style="color:rgb(0, 0, 0);font-size:12px;">Examples:<br /><ul><li>`2006-01-02T15:04:05Z` (ISO 8601)</li><li>`02/01/2006 3:04:05 PM` (Bing Ads format)</li></ul></span> | [Conversion Time](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversiontime)  |
| `x.adjustmentTime` <br/> <span style="color: #4D4DFF;font-size:12px;">Should be in ISO 8601 or Bing Ads-supported format</span><br /><span style="color:rgb(0, 0, 0);font-size:12px;">Examples:<br /><ul><li>`2006-01-02T15:04:05Z` (ISO 8601)</li><li>`02/01/2006 3:04:05 PM` (Bing Ads format)</li></ul></span>| [Adjustment Time](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#adjustmenttime) |
| `x.conversionValue` | [Adjustment Value](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#adjustmentvalue) | 
| `x.clickId` | [Microsoft Click ID](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#microsoftclickid) |
| SHA256(`x.email`) <br/> <span style="color: #4D4DFF;font-size:12px;">Required for enhanced conversions.</span> | [Hashed Email Address](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#hashedemailaddress) |
| SHA256(`x.phone`) <br/> <span style="color: #4D4DFF;font-size:12px;">Required for enhanced conversions.</span> | [Hashed Phone Number](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#hashedphonenumber) |

### Delete

For any field `x` of type `record`:

| RudderStack property | Bing Ads property | 
| :----| :----| 
| `retract` | [Adjustment Type](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#adjustmenttype) |
| `x.conversionName` | [Conversion Name](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversionname) |
| `x.conversionTime` | [Conversion Time](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#conversiontime) |
| `x.clickId` | [Microsoft Click ID](https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#microsoftclickid) |

### Mapping considerations

- `conversionName` must exactly match the goal's **Name** in Microsoft Advertising. The payload does not include a goal ID — linkage is by name only, so a mismatch silently drops the conversion.
- `conversionTime` must fall within the goal's conversion window measured from the click time, and you should express it in the ad account's timezone (not UTC).
- `conversionTime` must be later than the recorded click time.

## `record` event structure

The Bing Ads Offline Conversions destination supports only `record` events.

A sample `record` event that RudderStack sends to Bing Ads Offline Conversions is shown:

```json
{
  "action": "insert",
  "context": {
    "sources": {
      "job_run_id": "<job_run_id>",
      "task_run_id": "<task_run_id>",
      "job_id": "<job_id>",
      "version": "<version>"
    }
  },
  "recordId": "2",
  "rudderId": "2",
  "fields": {
    "microsoftClickId": "<microsoft_clickid>",
    "conversionTime": "2006-01-02T15:04:05Z",
    "conversionName": "<conversion_name>",
    "conversionValue": 100,
    "externalAttributionCredit": "0.5",
    "externalAttributionModel": "<goal_name>",
    "email": "<email>",
    "phone": "<phone>"
  },
  "identifiers": {
    "Email": "alex@example.com"
  },
  "type": "record"
}
```

## FAQ

#### Why can't I add a Reverse ETL source from the destination page?

The Reverse ETL feature supports only source-driven pipeline configuration. It means that you must configure a Reverse ETL source in RudderStack and then connect it to a new or existing destination. Note that this destination should not be connected to any other source.

See [Reverse ETL FAQ]({{< ref "data-pipelines/reverse-etl/developer-guides/faq.md" >}}) for more information.

<br />
