# Facebook Conversions Cloud Mode Integration


RudderStack supports sending event data to Facebook Conversions only in [cloud mode]({{< ref "destinations/rudderstack-connection-modes.md#cloud-mode" >}}).

## Page

RudderStack sends the [`page`]({{< ref "event-spec/standard-events/page.md" >}}) call to Facebook Pixel with the event type as `pageView`. 

You can also pass properties in your `page` call - RudderStack automatically sends them along with the event ID to Facebook.

A sample `page` call is shown:

```javascript
rudderanalytics.page()
```

## Track

{{< warning >}}
This destination does not strictly adhere to the [RudderStack Ecommerce Event Spec]({{< ref "event-spec/ecommerce-events-spec/" >}}).
{{< /warning >}}

You can use the [`track`]({{< ref "event-spec/standard-events/track.md" >}}) call to custom events as they occur in your web application.

A sample `track` call is shown:

```javascript
rudderanalytics.track("Product Added", {
  order_ID: "123",
  category: "boots",
  product_name: "pink_boots",
  price: 49.99,
  currency: "EUR",
  checkinDate: "Thu Mar 24 2018 17:46:45 GMT+0000 (UTC)",
})
```

## `data` object format

Whenever you make a `track` call, RudderStack sends a request to Facebook's `/events` endpoint with a `data` object. 

A sample `data` object is shown:

```json
data = [{
  "event_name": "Product Purchased",
  "event_time": 1697553987,
  "user_data": {
    "em": [
      "309a0a5c3e211326ae75ca18196d301a9bdbd1a882a4d2569511033da23f0abd"
    ],
    "ph": [
      "254aa248acb47dd654ca3ea53f48c2c26d641d23d7e2e93a1ec56258df7674c4",
      "6f4fcb9deaeadc8f9746ae76d97ce1239e98b404efe5da3ee0b7149740f89ad6"
    ],
    "client_ip_address": "<ip>",
    "client_user_agent": "$CLIENT_USER_AGENT",
    "fbc": "fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890",
    "fbp": "fb.1.1558571054389.1098115397"
  },
  "custom_data": {
    "currency": "USD",
    "value": 123.45,
    "contents": [{
      "id": "product123",
      "quantity": 1,
      "delivery_category": "home_delivery"
    }]
  },
  "event_source_url": "http://example.com/product/123",
  "action_source": "website"
}]
```

The `data` object has the following parts:

### Common data

The common data parameters are set at the root level of the `data` object sent as a part of the event payload.

The following table lists the mappings between the RudderStack properties and the Facebook properties included in `common_data`:

| RudderStack property | Facebook property | 
| :---| :----| 
| `event` <br/> <span style="color: #4D4DFF;font-size:12px;">Required</span> | `event_name` | - |
| `timestamp` <br/> `originalTimestamp` <br /> <span style="color: #4D4DFF;font-size:12px;">Required</span> | `event_time` | 
| `context.page.url` <br /> `properties.url`  | `event_source_url` | 
| `traits.opt_out` <br /> `context.traits.opt_out` <br /> `properties.opt_out` | `opt_out` | 
| `traits.event_id` <br /> `context.traits.event_id` <br /> `properties.event_id` <br /> `messageId` | `event_id` | 
| `traits.action_source` <br /> `context.traits.action_source` <br /> `properties.action_source` | `action_source` | 

RudderStack expects the `timestamp` and `originalTimestamp` fields at the **root** level of the `track` event payload in the **ISO 8601** format (for example, `2024-04-22T12:34:56.789Z`).

#### Important considerations

- When you connect a Reverse ETL source to this destination and map your warehouse columns using the [JSON mapper]({{< ref "data-pipelines/reverse-etl/developer-guides/json-data-mapping.md" >}}), the `timestamp`/`originalTimestamp` fields get placed inside the `properties` object. In this case, you need to use a [transformation]({{< ref "transformations/overview.md" >}}) and move them to the root level so RudderStack can map them correctly to Facebook's `event_time`.
- If your event does not contain any of `traits.action_source`, `context.traits.action_source`, or `properties.action_source`, then RudderStack falls back to the value specified in the **Action Source** dashboard setting.
- Do not set `action_source` to any value other than the following - otherwise you will get a **Invalid Action Source type** error:

  - `email`
  - `website`
  - `phone_call`
  - `chat`
  - `physical_store`
  - `system_generated`
  - `app`, and
  - `other`

### User data

The following table lists the mappings between the RudderStack properties and the Facebook properties included in `user_data`:

| RudderStack property | Facebook property | Hashing needed? | 
| :---| :----| :---|
| `userId` <br /> `traits.userId` <br /> `context.traits.userId` <br />` traits.id` <br /> `context.traits.id` <br /> `anonymousId` <br/> <span style="color: #4D4DFF;font-size:12px;">Required</span> | `externalId` | Yes | 
| `traits.email` <br/> `context.traits.email` | `em` |  Yes | 
| `traits.phone` <br/> `context.traits.phone` | `ph` |  Yes | 
| `traits.gender` <br/> `context.traits.gender` | `ge` |  Yes | 
| `traits.birthday` <br/> `context.traits.birthday` | `db` |  Yes | 
| `traits.lastname` <br/> `traits.lastName` <br/> `traits.last_name` <br/> `context.traits.lastname` <br/> `context.traits.lastName` <br/> `context.traits.last_name`  | `ln` |  Yes | 
| `traits.firstname` <br/> `traits.firstName` <br/> `traits.first_name` <br/> `context.traits.firstname` <br/> `context.traits.firstName` <br/> `context.traits.first_name`  | `fn` |  Yes | 
| `traits.name` <br/> `context.traits.name` | `name` |  - | 
| `traits.address.city` <br/> `context.traits.address.city` | `ct` |  Yes | 
| `traits.address.state` <br/> `context.traits.address.state` | `st` |  Yes | 
| `traits.address.zip` <br/> `context.traits.address.zip` | `zp` |  Yes | 
| `traits.address.country` <br/> `context.traits.address.country` | `country` |  Yes | 
| `context.ip` <br /> `request_up` | `client_ip_address` | - |
| `context.userAgent` | `client_user_agent` | - |
| `context.fbc` | `fbc` | - |
| `context.fbp` | `fbp` | - |
| `context.subscription_id` | `subscription_id` | - |
| `context.lead_id` | `lead_id` | - |
| `context.fb_login_id` | `fb_login_id` | - |
| `context.device.advertisingId`| `madId` | - |
| `properties.anon_id` <br />  `context.device.advertisingId` | `anon_id` | - |

After the payload is formed, Facebook checks if `name` field exists. If yes, it is split into `fn` and `ln` fields. Facebook does not hash the values of `user_data` parameters if you send an `integrations` object in your event as below:

```javascript
"integrations": {
  "fb_conversions": {
    "hashed": true
  }
}
```

{{< info >}}
RudderStack accepts any of the following names for Facebook Conversions in the `integrations` object:

- `fb_conversions`
- `fb conversions`
- `FacebookConversions`
- `Facebook Conversions`
- `FB Conversions`
- `Facebook_Conversions`
{{< /info >}}

### Custom data

RudderStack flattens the `custom_data` object before sending it Facebook along with the `user_data` and `common_data` fields in the `data` object. 

Note that:
- RudderStack sends the properties present in `custom_data` as is, without any change.
- It also excludes `opt_out`, `event_id`, and `action_source` from the event properties.

The following table explains how RudderStack maps and sets the properties in the specific Facebook fields:

{{< warning >}}
Each of the below parameters are applicable/valid only for certain events.

See [Standard events mapping](#standard-events-mapping) for more information on the properties mapped for each Facebook property according to the event.
{{< /warning >}}

| RudderStack property | Facebook property |
| :---| :----|
| Array of product IDs from `properties.products` like `product.product_id`, `product.sku`, `product.id`. | `content_ids` |
| Array of object containing `id`, `quantity`, and `item_price` formed for each product in `properties.products`. | `contents` |
| `properties.content_type` | `content_type` |
| `properties.category` | `content_category` |
| <ul><li>`properties.content_name` or `properties.contentName` if `properties.products` array is **not** present.</li><li>`properties.name` or `properties.product_name` if `properties.products` array is present. </li></ul> | `content_name` |
| `properties.currency` - defaulted to `USD` if no value is present. | `currency` |
| `properties.revenue` <br />`properties.value` <br />`properties.price` <br />`properties.total`  | `value` |
| `content_ids.length` | `num_items` |
| `properties.query ` | `search_string` |

Note that `content_category` must be of type String. For more information on this field, see [Facebook developer documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data).

- If `content_category` is passed as an array, RudderStack merges the array elements as a comma-separated string.
- If `content_category` is passed as an object, RudderStack throws an error: `"Category must be a string."`

### Allowlist/denylist PII

Facebook identifies the following standard fields as PII:

- `email`
- `firstName`
- `lastName`
- `first_name`
- `last_name`
- `gender`
- `city`
- `country`
- `phone`
- `state`
- `zip`
- `birthday`

{{< info >}}
The PII allowlist/denylist checks (configurable via the [Event mapping settings]({{< ref "destinations/streaming-destinations/fb-conversions/setup-guide.md#pii-properties" >}})) apply only to the standard Facebook PII fields listed above. They **do not affect** any other properties or top-level RudderStack identifiers like `anonymousId` or `userId`.
{{< /info >}}

If any of the above PII properties are present in an event, RudderStack checks whether they are allowlisted or denylisted in the dashboard settings, and processes them accordingly:

- If the property is not allowlisted, RudderStack drops it.
- If the property is denylisted, RudderStack checks if the [Hash Denylist PII Property]({{< ref "destinations/streaming-destinations/fb-conversions/setup-guide.md#pii-properties" >}}) toggle is enabled in the dashboard:

  - If the toggle is disabled, RudderStack drops the property
  - If the toggle is enabled, RudderStack hash-encrypts the property before sending it to Facebook

As mentioned [above](#userdata), if you send an `integrations` object within your event with `hashed` set to `true`, RudderStack does not hash the property again.

```javascript
"integrations": {
  "fb_conversions": {
    "hashed": true
  }
}
```

### App data

{{< info >}}
RudderStack includes this data only if `action_source` in the `data object` is set to `app`.
{{< /info >}}

The following table lists the mappings between the RudderStack properties and the Facebook properties:

| RudderStack property | Facebook property |
| :---| :----|
| `a2` if  `context.device.type` = `android` <br />`i2` if  `context.device.type` = `ios` <br/> <span style="color: #4D4DFF;font-size:12px;">Required</span> | `extinfo.0` |
| `context.device.adTrackingEnabled` <br/> <span style="color: #4D4DFF;font-size:12px;">Required</span> | `advertiser_tracking_enabled` |
| `context.os.version` <br/> <span style="color: #4D4DFF;font-size:12px;">Required</span> | `extinfo.4` |
| `properties.application_tracking_enabled` <br/> <span style="color: #4D4DFF;font-size:12px;">Required</span> | `application_tracking_enabled` |
| `anonymousId` | `user_data.anon_id` |
| `context.app.namespace` | `extinfo.1` |
| `context.app.build` | `extinfo.2` |
| `context.app.version` | `extinfo.3` |
| `context.device.model` | `extinfo.5` |
| `context.device.advertisingId` | `user_data.madid` |
| `context.locale` | `extinfo.6` |
| `context.abv_timezone` | `extinfo.7` |
| `context.network_carrier` | `extinfo.8` |
| `context.screen_width` |`extinfo.9` |
| `context.screen_height` |`extinfo.10` |
| `context.screen_density` |`extinfo.11` |
| `context.cpu_cores` |`extinfo.12` |
| `context.ext_storage_size` |`extinfo.13` |
| `context.avl_storage_size` | `extinfo.14` |
| `context.timezone` |`extinfo.15` |
| `properties.campaignId` <br /> `context.traits.campaignId` <br /> `context.campaign.name` | `campaign_ids` |
| `properties.install_referrer` | `install_referrer` |
| `properties.installer_package` |  `installer_package` |
| `properties.url_schemes` | `url_schemes` |
| `properties.windows_attribution_id` | `windows_attribution_id`|

## Standard events mapping

RudderStack maps the following events to the Facebook standard events by default:

| RudderStack Event    | Facebook Standard Event |
| :-------------------- | :---------------------- |
| `Checkout Started`    | `InitiateCheckout`      |
| `Order Completed`     | `Purchase`              |
| `Product Added`       | `AddToCart`             |
| `Product Added to Wishlist` | `AddToWishlist ` |
| `Payment Info Entered` | `AddPaymentInfo` |
| `Product List Viewed` | `ViewContent`           |
| `Products Searched`   | `Search`                |
| `Product Viewed`      | `ViewContent`           |

{{< info >}}
You can also use the [Custom Event Mapping]({{< ref "destinations/streaming-destinations/fb-conversions/setup-guide.md#event-mapping" >}}) dashboard setting to override the above default mappings.
{{< /info >}}

See the [Ecommerce Events Specification]({{< ref "event-spec/ecommerce-events-spec/_index.md" >}}) for more information on the above events.

Note that:

- For the `Purchase` standard event (mapped to `Order Completed` event), `properties.revenue` is a required field. Also, RudderStack sends the `delivery_category` field along with `id`, `item_price` and `quantity` as a part of the [`custom_data.contents`](#data-object-format) object.
- For the `Products Searched` event, the `query` property must be a string.
- If you map an event with the `ViewContent` standard event using the RudderStack dashboard setting and don't send the `products` array in the `message.properties` object:

  ```javascript
  "properties": {
    "phone": 1-202-555-0146,
    "email": "alex@example.com",
    "category": "clothing",
    "list_id": "1234",
    "testDimension": true,
    "testMetric": true
  }
  ```

  Then, `content_ids` is mapped to `properties.category` value (`clothing` in this case) and `quantity` is set to `1` inside the `contents` object.

The below table elaborates the property mappings between RudderStack and Facebook corresponding to the RudderStack event:

<table>
  <tr>
    <th>RudderStack event</th>
    <th>RudderStack property</th>
    <th>Facebook property</th>
  </tr>
  <tr>
    <td rowspan="4">Checkout Started</td>
    <tr>
       <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code></td>
      <td><code class="inline-code">content_ids</code></td>
    </tr>
     <tr>
      <td><code class="inline-code">category</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">revenue</code></td>
      <td><code class="inline-code">content_category</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
    </tr>
    <tr>
       <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code><br /><code class="inline-code">products.$.quantity/quantity</code><br /><code class="inline-code">product.$.price/price</code></td>
      <td><code class="inline-code">contents.id</code><br /><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
      </tr>
  </tr>
  <tr>
    <td rowspan="4">Product List Viewed</td>
    <tr>
      <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code></td>
      <td><code class="inline-code">content_ids</code></td>
    </tr>
    <tr>
      <td><code class="inline-code">category</code><br /><code class="inline-code">contentName</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
      <td><code class="inline-code">content_category</code><br /><code class="inline-code">content_name</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
    </tr>
    <tr>
      <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code><br/><code class="inline-code">products.$.quantity/quantity</code><br /><code class="inline-code">product.$.price</code></td>
      <td><code class="inline-code">contents.id</code><br/><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
      </tr>
  <tr>  
    <td rowspan="3">Product Viewed</td>
     <tr>
      <td><code class="inline-code">product_id/sku/id</code><br /><code class="inline-code">product_name/name</code><br /><code class="inline-code">category</code><br /><code class="inline-code">currency</code></td>
      <td><code class="inline-code">content_ids</code><br /><code class="inline-code">content_name</code><br /><code class="inline-code">content_category</code><br /><code class="inline-code">currency</code></td>
      </tr>
     <tr>
      <td><code class="inline-code">product_id/sku/id</code><br /><code class="inline-code">quantity</code><br /><code class="inline-code">price</code></td>
      <td><code class="inline-code">contents.id</code><br /><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
     </tr>
  </tr>
  <tr>
    <td rowspan="3">Product Added</td>
   <tr>
      <td><code class="inline-code">product_id/sku/id</code><br /><code class="inline-code">product_name/name</code><br /><code class="inline-code">currency</code></td>
      <td><code class="inline-code">content_ids</code><br /><code class="inline-code">content_name</code><br /><code class="inline-code">currency</code></td>
     </tr>
     <tr>
      <td><code class="inline-code">product_id/sku/id</code><br /><code class="inline-code">quantity</code><br /><code class="inline-code">price</code></td>
      <td><code class="inline-code">contents.id</code><br /><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
      </tr>
  </tr>
   <tr>
    <td rowspan="4">Order Completed</td>  
    <tr>
       <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code></td>
      <td><code class="inline-code">content_ids</code></td>
      </tr>
     <tr>
      <td><code class="inline-code">contentName</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">revenue</code></td>
      <td><code class="inline-code">content_name</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
   </tr>
    <tr>
       <td><code class="inline-code">products.$.delivery_category</code>/<code class="inline-code">properties.delivery_category</code><br /><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code><br/><code class="inline-code">products.$.quantity/quantity</code><br /><code class="inline-code">product.$.price/price</code></td>
      <td><code class="inline-code">contents.delivery_category</code><br /><code class="inline-code">contents.id</code><br /><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
     </tr>
  </tr>
   <tr>
    <td rowspan="2">Products Searched</td>
    <td><code class="inline-code">query</code><br /><code class="inline-code">product_id/sku/id</code><br /><code class="inline-code">category</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
    <td><code class="inline-code">search_string</code><br /><code class="inline-code">content_ids</code><br /><code class="inline-code">content_category</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code><br /></td>
   </tr>
    <tr>
       <td><code class="inline-code">product_id/sku/id</code><br /><code class="inline-code">quantity</code><br /><code class="inline-code">price</code></td>
      <td><code class="inline-code">contents.id</code><br /><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
     </tr>
   <tr>
    <td rowspan="4">Product Added to Wishlist </td>
    <tr>
      <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</td>
      <td><code class="inline-code">content_ids</code></td>
    </tr>
    <tr>
      <td><code class="inline-code">category</code><br /><code class="inline-code">contentName</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
      <td><code class="inline-code">content_category</code><br /><code class="inline-code">content_name</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
    <tr>
       <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code><br/><code class="inline-code">products.$.quantity/quantity</code><br /><code class="inline-code">product.$.price/price</code></td>
      <td><code class="inline-code">contents.id</code><br /><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
     </tr>
    </tr>
  </tr>
  <tr>
    <td rowspan="4">Payment Info Entered</td>
    <tr>
      <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</td>
      <td><code class="inline-code">content_ids</code></td>
    </tr>
    <tr>
      <td><code class="inline-code">category</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
      <td><code class="inline-code">content_category</code><br /><code class="inline-code">currency</code><br /><code class="inline-code">value</code></td>
    </tr>
    <tr>
       <td><code class="inline-code">products.$.product_id/products.$.sku/products.$.id</code><br/><code class="inline-code">products.$.quantity/quantity</code><br /><code class="inline-code">product.$.price/price</code></td>
      <td><code class="inline-code">contents.id</code><br /><code class="inline-code">contents.quantity</code><br /><code class="inline-code">contents.item_price</code></td>
     </tr>
    </tr>
  </tr>
</table>

{{< info >}}
For all the standard events mentioned above:
- Default values for the `currency` and `quantity` properties are `USD` and `1` respectively.
- `content_ids` field is populated from the `products` array. If the `products` array is not present in the `properties`, `content_ids` is set to an empty array resulting in `num_items` being set to `0`.
{{< /info >}}
 
### Other standard events

If you map your event to any of the following Facebook standard events, then RudderStack treats it as a standard event as well:

- `Lead`
- `CompleteRegistration`
- `Contact`
- `CustomizeProduct`
- `Donate`
- `FindLocation`
- `Schedule`
- `StartTrial`
- `SubmitApplication`
- `Subscribe`

For any properties you want to send with these events, you must specify them in the [Event Mapping]({{< ref "destinations/streaming-destinations/fb-conversions/setup-guide.md#event-mapping" >}}) settings.

{{< info >}}
For the above-mentioned events and [custom events]({{< ref "destinations/streaming-destinations/fb-conversions/setup-guide.md#custom-event" >}}), RudderStack sends `content_ids` and `num_items` to Facebook as a part of `properties` in the appropriate format.
{{< /info >}}

## Deduplication

Facebook allows you to send events via your web browser and your server via the Conversion API. 

Depending on how you send your events with this dual setup, there is a possibility of Facebook receiving redundant/duplicate events. Hence, to get an accurate representation of your data, Facebook [deduplicates the incoming events](https://www.facebook.com/business/help/823677331451951?id=1205376682832142).

### Using `event_id`

Facebook's (and RudderStack's) **recommended** deduplication strategy is to leverage the `event_name` and `event_id` properties. When two events coming into Facebook meet the following criteria, they are deduplicated.

- They are sent within 48 hours of each other.
- They are received by the same Facebook Pixel ID.
- They have the same `event_name`, for example, `Purchase`.
- They have the same `event_id`.
  - The `event_id` must be unique to that specific event and same for both of the events. For example, the `event_id` could be a purchase order number.

You can set the `event_id` as a unique identifier in the event's `traits`, `context.traits`, or  the `properties` object. RudderStack automatically picks up the `event_name` from the event. 

{{< info >}}
If you don't set the `event_id`, RudderStack uses `messageId` and maps it to Facebook's `eventId`.
{{< /info >}}

For more information on the `event_id` deduplication logic, see the [Facebook developer documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/#event-id-and-event-name---recommended).

### Using `fbp` and `external_id`

{{< warning >}}
This deduplication strategy is not recommended as it has a few drawbacks:

- It will always discard the server event if Facebook identifies a redundant event.
- It only works for deduplicating events sent first from the browser and then the server.
- There is no deduplication if two consecutive browser events with the same information are sent to Facebook. The same is true if two server events with the same information are sent to Facebook.
{{< /warning >}}

For this approach, it is necessary to send an event, first from the browser and then from the server. Note that both events must have the same `event_name`, the same `fbp` parameter, and the same `external_id`. 

If the browser event is received before the server event and both events have the same `event_name` and the same `fbp` and `external_id`, then the server event is discarded.

RudderStack maps the `event_name` from the event sent to Facebook. The `fbp` parameter is taken from the `context.fbp` key-value pair. Finally, the `external_id` will be the `userId` or `anonymousId` (if `userId` is not present).

For more information on the `fbp` and `external_id` deduplication logic, see the [Facebook developer documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/#fbp-or-external-id).

## Sending custom `content_type`

You can send a custom [`content_type`](https://developers.facebook.com/docs/meta-pixel/get-started/advantage-catalog-ads#content-type) field by specifying it in the `properties.content_type` field of your event.

RudderStack sets the value of `content_type` in the following priority order:

1. It gives the highest priority to `properties.content_type` in your event.
2. If `properties.content_type` is absent, RudderStack sets the `content_type` to `product` by default, except in the following cases:

  - If **Product List Viewed** event is sent:
      - with `products` array, then the `content_type` is set to `product`.
      - without the `products` array, then the `content_type` is set to `product_group`.
  - If **Product Viewed** event is not mapped in RudderStack dashboard (default mapping is set to **View Content** event) but is sent:
      - with `products` array, then the `content_type` is set to `product`.
      - without the `products` array, then the `content_type` is set to `product_group`.
  - If any other event is mapped to the Facebook standard event **View Content** in the RudderStack dashboard and is sent:
      - with `products` array, then the `content_type` is set to `product`.
      - without the `products` array, then the `content_type` is set to `product_group`.

{{< info >}}
`product` and `product_group` are the only two acceptable values for `content_type`.
{{< /info >}}

## FAQ

#### How can I view the conversion events in my Facebook Ads dashboard?

1. Log in to your [Facebook Ads Manager](https://www.facebook.com/adsmanager) account.
2. Click the **All tools** hamburger menu in the left sidebar.

{{< image src="images/event-stream-destinations/fb-conversions-events-manager.webp" alt="Events Manager in Facebook dashboard" >}}

3. Select **Events Manager**.
4. Select the data source associated with your ad campaign. 

{{< image src="images/event-stream-destinations/fb-conversions-events.webp" alt="Events Manager data sources" >}}

Here, you can view your conversion events tracked by Facebook Pixel, app, or offline event sets - this includes the standard and custom events that you have set up.

See the [Events Manager documentation](https://en-gb.facebook.com/business/help/898185560232180?id=1205376682832142) for more information on viewing and managing your events.
