---
title: Twitter Ads
slug: twitter-ads
docTags: 
createdAt: 2025-10-16T22:56:58.294Z
---

**Twitter Ads** (now X Ads) is X's advertising platform for promoted content, conversion campaigns, and audience targeting. This destination loads the X/Twitter Universal Website Tag (UWT) JavaScript SDK in the browser and forwards conversion events based on a configurable event mapping. Page and identify events are not forwarded. There is no server-side component.

# Getting Started

This is a device-mode destination. The Twitter/X UWT SDK is loaded automatically — no manual script installation is required. You will need:

- **Pixel ID** — your Twitter/X Pixel ID, found in your X Ads account under **Tools > Conversion Tracking**.

Optionally:

- **Event Mapping** — maps Chord event names to Twitter Event IDs (e.g., `{ "Product Added": "tw-abc12-def34" }`). **Only events with an explicit entry in this mapping are forwarded.** All unmapped events are silently skipped.
- **Identifier** — which product field to use as the content ID (`product_id`, `sku`, or `id`). Defaults to `product_id` > `id` > `sku` fallback chain.

# Connecting to the Twitter Ads CDP Destination

:::BlockQuote
**Warning:** Before connecting destinations in the Chord CDP, please verify with all Destination owners that all **non-Chord CDP** configured destinations are **disabled**. Running external destinations alongside configured Chord CDP destinations **can result in duplicate events downstream.**
:::

1. Log into the Chord data platform.
2. Navigate to the CDP.
3. Click the **"Add"** button next to Destinations.
4. Select **Twitter Ads** from the destination catalog.
5. Enter the destination name and your **Pixel ID**.
6. Configure the **Event Mapping** to specify which Chord events should fire which Twitter Event IDs.
7. Optionally configure the **Identifier** field.
8. Click **"Create"** to connect.

# Events

Page and identify events are **not** forwarded to Twitter Ads.

Only track events with an explicit entry in the **Event Mapping** configuration are forwarded. All unmapped events are silently skipped.

# Track Events

**Twitter SDK call:** `twq("event", twitterEventId, eventPayload)`

## User Parameters

| Twitter Attribute | Chord Source (Priority Order)                                | Notes                                   |
| ----------------- | ------------------------------------------------------------ | --------------------------------------- |
| `email_address`   | `properties.email` > `context.traits.email` > `traits.email` | Automatically hashed by the Twitter SDK |
| `phone_number`    | `properties.phone` > `context.traits.phone` > `traits.phone` | Automatically hashed by the Twitter SDK |

## Order Parameters

| Twitter Attribute | Chord Source (Priority Order)                                  | Notes                  |
| ----------------- | -------------------------------------------------------------- | ---------------------- |
| `value`           | `properties.revenue` > `properties.total` > `properties.value` |                        |
| `currency`        | `properties.currency`                                          | Defaults to `"USD"`    |
| `conversion_id`   | `properties.cart_id` / `properties.order_id`                   | Used for deduplication |

## Product Contents

Each product in `properties.products[]` is mapped to a Twitter content item:

| Twitter Attribute  | Chord Source (Priority Order)                                                            | Notes |
| ------------------ | ---------------------------------------------------------------------------------------- | ----- |
| `content_id`       | Configured `identifier` field from `properties.products[]` > `product_id` > `id` > `sku` |       |
| `content_name`     | `properties.products[].name`                                                             |       |
| `content_price`    | `properties.products[].price`                                                            |       |
| `num_items`        | `properties.products[].quantity`                                                         |       |
| `content_type`     | `properties.products[].category`                                                         |       |
| `content_group_id` | `properties.products[].variant_id`                                                       |       |

All undefined values are filtered out before sending.

# Initialization

The plugin sets up the `twq` function queue, then loads `https://static.ads-twitter.com/uwt.js`. After the script loads, it calls `twq("config", pixelId)` to initialize the pixel.

The plugin manages SDK loading state (`fresh` → `loading` → `loaded`/`failed`) to prevent duplicate script loads. If the script fails to load, subsequent events are silently dropped.

# CSP Requirements

If your site uses a Content Security Policy, allow the following domains:

| Directive     | Domain                           |
| ------------- | -------------------------------- |
| `script-src`  | `https://static.ads-twitter.com` |
| `connect-src` | `https://static.ads-twitter.com` |

***

**Updated 6 Apr 2026**
