---
title: TikTok Conversions API
slug: tiktok-conversions-api
docTags: 
createdAt: 2025-06-02T18:47:47.782Z
---

The **TikTok Conversions API** destination sends event data directly from Chord CDP to TikTok's servers, bypassing the browser entirely. Unlike the [TikTok Pixel (device mode)](#), server-side events are immune to ad blockers and browser tracking restrictions, providing more reliable signal for attribution and optimization.

Use this destination alongside the [TikTok Pixel destination](#) for maximum data coverage. TikTok deduplicates events using the `event_id` field.

# Getting Started

This is a cloud-mode destination. You will need:

- **Access Token** — generated via TikTok Ads Manager or the TikTok API. Found in **Assets > Events > Web Events > Settings**.
- **Pixel Code** — your TikTok Pixel ID, found in your TikTok Ads Manager under **Assets > Events > Web Events**.

Optionally:

- **Test Event Code** — a test event code from the TikTok Ads events manager. When set, events are tagged for test mode and will appear in the TikTok test events dashboard.

# Connecting to the TikTok Conversions API 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 **TikTok Conversions API** from the destination catalog.
5. Enter the destination name, **Access Token**, and **Pixel Code**.
6. Optionally enter a **Test Event Code** during initial setup.
7. Click **"Create"** to connect.

# Events

# Event Mapping

| Chord Event                 | TikTok Event                                              |
| --------------------------- | --------------------------------------------------------- |
| `page`                      | `PageView`                                                |
| `Order Completed`           | `CompletePayment`                                         |
| `Checkout Started`          | `InitiateCheckout`                                        |
| `Product Added`             | `AddToCart`                                               |
| `Product Viewed`            | `ViewContent`                                             |
| `Products Searched`         | `Search`                                                  |
| `Payment Info Entered`      | `AddPaymentInfo`                                          |
| `Product Added to Wishlist` | `AddToWishlist`                                           |
| `Product Clicked`           | `ClickButton`                                             |
| `Signed Up`                 | `CompleteRegistration`                                    |
| `Subscription Created`      | `Subscribe`                                               |
| *(any other track event)*   | Chord event name passed as-is<br />See [Custom Events](#) |

# User Data (All Events)

All user data fields are SHA-256 hashed before sending, except where noted.

| TikTok Attribute | Chord Source (Priority Order)                                                                       | Notes                                                   |
| ---------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| `external_id`    | `userId` > `anonymousId`                                                                            | SHA-256 hashed                                          |
| `email`          | `properties.email` > `context.traits.email`                                                         | SHA-256 hashed, lowercased                              |
| `phone`          | `properties.phone` > `context.traits.phone`                                                         | SHA-256 hashed, E.164 format                            |
| `first_name`     | `properties.first_name` > `context.traits.first_name`                                               | SHA-256 hashed                                          |
| `last_name`      | `properties.last_name` > `context.traits.last_name`                                                 | SHA-256 hashed                                          |
| `city`           | `properties.address.city` > `context.traits.address.city`                                           | Lowercased, non-alphanumeric chars removed (not hashed) |
| `state`          | `properties.address.state` > `context.traits.address.state`                                         | Lowercased, non-alphanumeric chars removed (not hashed) |
| `country`        | `properties.address.country` > `context.traits.address.country`                                     | Lowercased, non-alphanumeric chars removed (not hashed) |
| `zip_code`       | `properties.address.postal_code` / `properties.address.zip_code` > `context.traits.address.zipcode` | SHA-256 hashed                                          |
| `ip`             | `context.ip`                                                                                        | Not hashed                                              |
| `user_agent`     | `context.userAgent`                                                                                 | Not hashed                                              |
| `locale`         | `context.locale`                                                                                    | Not hashed                                              |
| `ttclid`         | `properties.ttclid` > URL query param `ttclid`                                                      | TikTok click ID                                         |
| `ttp`            | `properties.ttp`                                                                                    | TikTok cookie                                           |

# Page Data (All Events)

| TikTok Attribute | Chord Source (Priority Order)                   |
| ---------------- | ----------------------------------------------- |
| `url`            | `properties.url` > `context.page.url`           |
| `referrer`       | `properties.referrer` > `context.page.referrer` |

# Event Data (All Events)

| TikTok Attribute   | Chord Source                                     | Notes                                         |
| ------------------ | ------------------------------------------------ | --------------------------------------------- |
| `event`            | Mapped event name                                | See event mapping above                       |
| `event_time`       | `timestamp`                                      | Unix seconds; falls back to current time      |
| `event_id`         | `messageId`                                      | Used for deduplication with device-mode pixel |
| `limited_data_use` | `event.limited_data_use` (top-level event field) | Defaults to `false`                           |

# Order Properties (All Track Events)

| TikTok Attribute | Chord Source (Priority Order)                                                               | Notes                            |
| ---------------- | ------------------------------------------------------------------------------------------- | -------------------------------- |
| `currency`       | `properties.currency`                                                                       |                                  |
| `value`          | `properties.value` > `properties.revenue` > calculated from `contents` (`price × quantity`) |                                  |
| `order_id`       | `properties.order_id`                                                                       |                                  |
| `shop_id`        | `properties.shop_id`                                                                        |                                  |
| `content_type`   | `properties.content_type`                                                                   | `"product"` or `"product_group"` |
| `description`    | `properties.description`                                                                    |                                  |
| `query`          | `properties.query` > `properties.search_term`                                               | Relevant for Products Searched   |

# Multi-Product Events

For **Order Completed**, **Checkout Started**, and **Payment Info Entered**, products are read from `properties.products[]`:

| TikTok Attribute   | Chord Source                       |
| ------------------ | ---------------------------------- |
| `content_id`       | `properties.products[].product_id` |
| `content_name`     | `properties.products[].name`       |
| `content_category` | `properties.products[].category`   |
| `price`            | `properties.products[].price`      |
| `quantity`         | `properties.products[].quantity`   |
| `brand`            | `properties.products[].brand`      |

# Single-Product Events

For **Product Added**, **Product Viewed**, **Product Clicked**, **Products Searched**, and **Product Added to Wishlist**, product data is read from top-level `properties`:

| TikTok Attribute   | Chord Source            |
| ------------------ | ----------------------- |
| `content_id`       | `properties.product_id` |
| `content_name`     | `properties.name`       |
| `content_category` | `properties.category`   |
| `price`            | `properties.price`      |
| `quantity`         | `properties.quantity`   |
| `brand`            | `properties.brand`      |

# Custom Events

Any `track` event that does not match a Chord tracking plan event name is forwarded to TikTok using the Chord event name as-is. TikTok accepts arbitrary event names for reporting and audience segmentation, though only TikTok standard event names support campaign bid optimization.

The following non-tracking-plan events have explicit TikTok standard event name mappings and will be translated automatically if your storefront fires them:

| Chord Event             | TikTok Event | Notes                                                             |
| ----------------------- | ------------ | ----------------------------------------------------------------- |
| `Form Submitted`        | `SubmitForm` | Sends `form_name` from `properties.form_name` > `properties.name` |
| `Callback Started`      | `Contact`    |                                                                   |
| `Download Link Clicked` | `Download`   |                                                                   |

If the TikTok event name you want to fire does not match your Chord event name, use a property mapping in the Hub to rename the event before it reaches this destination.

# Testing and Validation

After connecting the destination:

1. Set a **Test Event Code** in the destination configuration.
2. Trigger events from your storefront or use the **Live Events** tab in the Chord CDP.
3. In TikTok Ads Manager, navigate to **Assets > Events > Web Events** and open the **Test Events** tab to verify events are received.
4. Remove the **Test Event Code** before going live to avoid events being excluded from campaigns.

# Custom Property Forwarding

Configure destination mappings in Hub with `properties.*` destination paths to forward additional event properties into the TikTok event's `properties` object (the same object that holds `currency`, `value`, `contents`, etc.). Only explicitly-configured non-schema fields are forwarded — nothing flows through automatically.

**How to configure:**

1. Open the destination's **Mappings** tab in Hub.
2. Add a mapping with source path `properties.loyalty_tier` and destination path `properties.loyalty_tier`.
3. On the next event, `loyalty_tier` will appear in the properties payload sent to TikTok.

**What is excluded:**

- Schema fields already handled by the destination transform (e.g. `currency`, `value`, `order_id`, `contents`) — these flow through the structured transform
- PII fields (`email`, `phone`, `first_name`, `last_name`) — these are handled via `user_data` with SHA-256 hashing

When a custom mapping targets a schema field (e.g. `properties.value → properties.value`), the customer-configured value overrides the destination's computed default. This allows schema fields to be sourced from a different event property — for example, mapping `properties.total → properties.value` to use your order total as the conversion value.

***

**Updated 27 May 2026**
