The Trade Desk connector for Snowflake: Conversions

Advertisers and data providers can use The Trade Desk connector native app to upload offline conversion data to The Trade Desk using Snowflake. The Trade Desk connector native app helps streamline data integration with The Trade Desk and includes support for UID2 mapping from email addresses and phone numbers. It provides a flexible, guided, and secure setup experience that works across all Snowflake-supported environments and a variety of advertising use cases.

Conversion batch upload processing is designed for volume and performance at scale. It works by processing conversions events that you populate into the input table. The native app performs the following actions to transfer data to The Trade Desk DSP for your use:

To see how to correctly configure offline conversion events in The Trade Desk connector for Snowflake, watch the conversions demo video.

What you need to know

Here's what you need to know about preparing your offline conversion data for processing:

Here's what you need to know about processing the conversion data:

Snowflake marketplace listing

The following listing from The Trade Desk for processing conversion events in Snowflake is available in the Snowflake marketplace:

Complete setup steps

Before processing the data, you must complete all the steps covered in The Trade Desk connector for Snowflake: Get started, including the following setup tasks:

For details, see Configure the native app.

Process data

Processing of new or changed conversion data starts in one of these ways:

TIP: When you're processing data for the first time, we recommend using a small amount of data, such as 100 conversion events. On a smaller dataset it's easier to make sure that processing goes smoothly, and to troubleshoot if needed. When you've confirmed that everything is working smoothly for this small amount, you can process large volumes of data.

To process conversions in the Snowflake Native App UI, follow these steps:

  1. Copy data from your own database into the input table, transforming the data as needed to meet the formatting requirements. For details, see SQL objects.
  2. On the Conversions page, click Refresh to refresh the UI page. Ensure your conversions are displayed.
  3. Click Process Immediately. This triggers execution.

Verify data processing

There are several ways you can verify that your data was processed correctly:

For important usage notes, see Stored procedures and SQL objects.

Reference information

The following sections provide reference information for using this connector, such as supported ID types, tables and views, stored procedures, and example commands.

Conversions page

The Conversions page shows dimensions of your conversion information, along with some simple controls to manage execution. The table schema was created during configuration (see Configure the native app), and includes fields for data elements such as EVENT_ID, IMPRESSION_ID, TRACKING_TAG_ID, and many more. For details, see SQL objects.

The following summary information is at the top of the page:

IMPORTANT: For information about the expected format of the data, see POST /providerapi/offlineconversion. The field names might not be identical. For example, the USER_IDS array in The Trade Desk connector native app corresponds to UserIdArray in the endpoint.

The following table lists the buttons on the Conversions page and what they do.

Button Function
Process immediately Checks the input table for conversions that haven't been processed yet, and immediately submits them to the authorized URL for processing, per the External Integration Binding permission (see Native app permissions).
Start task Starts a task that checks the input table for changes and submits new changes regularly to the authorized URL for processing, per the External Integration Binding permission (see Native app permissions).
Stop task
(Only present when a task is running)
Stops the current process from running. You could use this, for example, if you're getting errors and you want to stop and try to fix the problem.
Refresh Refreshes the page in The Trade Desk connector native app. This button refreshes only the UI; it does not affect the processing of data. It refreshes values displayed, such as the number of conversions processed.

Supported ID types

The Trade Desk connector native app supports a subset of the ID types supported by the POST /providerapi/offlineconversion endpoint, for the USER_IDS field, as well as additional ID types to support the processing of UID2s. The following table lists all supported ID types.

IMPORTANT: Only the ID types listed in this table are supported. The following ID types require UID2 signed paperwork and the associated additional permissions: UID2, UID2Token, email, phone, email_hash, and phone_hash.

ID Type Data Type Description
TDID GUID The Trade Desk 36-character GUID (including dashes) for this user.
DAID GUID The raw device ID for this user, sent in 36-character GUID format (including dashes). Use the iOS ID for advertisers (IDFA) or Android advertising ID (AAID).
UID2 String The raw UID2 value, also known as UID2. This value is case-sensitive. Raw UID2s are generated and managed using UID2 APIs. See also Unified IDs.
UID2Token String The encrypted UID2 token, also known as an advertising token. This token is case-sensitive. Tokens are generated and managed using UID2 APIs. For details about UID2 APIs, see UID2 Endpoints: Summary. For details about UID2 tokens, see Raw IDs vs. tokens.
RampID String The 49-character or 70-character RampID (previously known as IdentityLink).
IMPORTANT: This must be a RampID from LiveRamp that is mapped specifically for The Trade Desk. For details about mapping a RampID, see LiveRamp documentation.
email String A raw email address for conversion to a UID2. The native app normalizes and hashes the email address before sending the data to The Trade Desk. It never sends raw email addresses outside your Snowflake account.
phone String A raw phone number for conversion to a UID2. The native app normalizes and hashes the phone number before sending the data to The Trade Desk. It never sends raw phone numbers outside your Snowflake account.
email_hash String A hashed email address for conversion to a UID2. For requirements, see Email address hashing and encoding.
phone_hash String A hashed phone number for conversion to a UID2. For requirements, see Phone number hashing and encoding.

SQL objects

The Trade Desk connector native app creates a data table, INPUT.CONVERSION, for the offline conversions data.

TIP: Although many values are optional, including them improves measurement accuracy and unlocks more robust platform features. Sending rich, complete data helps ensure better optimization, reporting, and troubleshooting.

The following table lists the column names, in sequence.

NOTE: Although The Trade Desk connector native app is a separate interface, the uploaded data must be in a format consumable by the POST /providerapi/offlineconversion endpoint. With the exception of EVENT_ID, the column names correspond to field names used in this API (see Items object properties). The names aren't identical, but they are similar. For example, IMPRESSION_ID in The Trade Desk connector native app corresponds to ImpressionId in the endpoint.

Column Name SQL Data Type Notes
EVENT_ID INT A unique ID assigned to the conversion event. Each time a new row is added, the value increases.
USER_IDS ARRAY The USER_IDS array can include one or more user IDs supported by the POST /providerapi/offlineconversion endpoint, and additional ID types to support the processing of UID2s, which are listed at the bottom of the Supported ID types section. For field mapping examples and the array structure, see Insert a conversion with user IDs.
IMPRESSION_ID VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
TRACKING_TAG_ID VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
You can also do a quick lookup for available tracking tags within the native app: see The Trade Desk connector native app: Tracking tags.
TIMESTAMP_UTC TIMESTAMP_NTZ See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
EVENT_NAME VARCHAR See Event mapping in the POST /providerapi/offlineconversion endpoint documentation.
VALUE_AMOUNT FLOAT See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
VALUE_CURRENCY VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
COUNTRY VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
REGION VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
NielsenDMA* INT See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
NielsenDMA and CITY values are optional, but are required for geo lift and other measurement features.
CITY VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
NielsenDMA and CITY values are optional, but are required for geo lift and other measurement features.
ORDER_ID VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
PRIVACY_SETTINGS ARRAY See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
LINE_ITEMS ARRAY See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.
TD1-TD10 VARCHAR See Items object properties in the POST /providerapi/offlineconversion endpoint documentation.

* © 2026, The Nielsen Company (US), LLC. The DMA® data is used pursuant to a license from The Nielsen Company (US), LLC. Any use and/or reproduction of these materials without the express written consent of The Nielsen Company (US), LLC, is strictly prohibited. DMA® data is valid for the period 2025 - 2026. DMA® is a registered service mark of The Nielsen Company (US), LLC and is used pursuant to license.

Table maintenance

We recommend removing processed conversions from the input table after you have confirmed success.

This is true only for conversions, not audience segments.

Tables and views

The native app exposes the database objects shown in the following table.

Table/View Name Notes
Table INPUT.CONVERSION Populate this table with conversions that you want to upload for processing.
View APP.VW_CONVERSION_RESULT When records from the INPUT.CONVERSION table are processed, results appear in this view.

When processing a conversion record, the native app performs these steps:

  1. Checks authorization and validation.
  2. Uploads the records from the INPUT.CONVERSION table to The Trade Desk.
  3. Adds a result that appears in the APP.VW_CONVERSION_RESULT view with the same EVENT_ID value as in the INPUT.CONVERSION record.

Results view

The following table shows sample results in the APP.VW_CONVERSION_RESULT view.

+----------+-------------------------+------------+------------+---------------+
| EVENT_ID | LAST_PROCESSED_ON       | IS_SUCCESS | ERROR_CODE | ERROR_MESSAGE |
+----------+-------------------------+------------+------------+---------------+
| 54817    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 40438    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 38149    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 47101    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 21783    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 14502    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 63876    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 86838    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 29681    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 20467    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 42601    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 68455    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 82517    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 73125    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 83127    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 84326    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 83132    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 69606    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 48168    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 59515    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 83694    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 91868    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 95025    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
| 64237    | 2025-11-03 19:38:40.299 | TRUE       |            |               |
+----------+-------------------------+------------+------------+---------------+

Stored procedures

For processing conversions, the native app provides several stored procedures. Follow these key guidelines:

IMPORTANT: Violating these guidelines could lead to conflicts or inconsistent data.

The following table summarizes each procedure, its UI equivalent, and what it does.

Procedure UI Equivalent Description
APP.SP_PROCESS_CONVERSIONS(BATCH_SIZE INT, STOP_AFTER_SECONDS INT) Select Process Immediately. Processes BATCH_SIZE records in the INPUT.CONVERSION table immediately. The BATCH_SIZE parameter must be less than or equal to 100,000,000.
After processing of each batch of records is complete, the procedure checks whether the STOP_AFTER_SECONDS value has elapsed, and does one of the following:
  • STOP_AFTER_SECONDS value has elapsed: The procedure completes.
  • STOP_AFTER_SECONDS value has not elapsed: The procedure loops and processes another batch of records, using the BATCH_SIZE parameter.
If there are unprocessed rows remaining, call APP.SP_PROCESS_CONVERSIONS again until all rows are processed. For details, see Process unprocessed conversions.
APP.SP_START_CONVERSION_TASK() Select Start Task. Starts a task that runs the APP.SP_PROCESS_CONVERSIONS stored procedure whenever there are changes to the input table. The task is executed by the warehouse specified in the Permissions step of the app configuration.
APP.SP_STOP_CONVERSION_TASK() Select Stop Task. Stops the task that runs the APP.SP_PROCESS_CONVERSIONS stored procedure whenever there are changes to the input table, if the task is running.
APP.SP_GET_CONVERSION_TASK_STATE() View Task State. Returns a value indicating whether the conversion task is running.
APP.SP_CLEAN_CONVERSION_RESULTS() None Deletes all records from the APP.VW_CONVERSION_RESULT view where the EVENT_ID value no longer exists in the INPUT.CONVERSION table.
APP.SP_FORCE_RESET_CONVERSION_PIPELINE() None Forces a reset, clearing the ingestion pipeline state. For details, see Using the force reset procedure.
IMPORTANT: Use only as a last resort.

Using the force reset procedure

The APP.SP_FORCE_RESET_CONVERSION_PIPELINE() stored procedure is a last-resort fix that clears out the ingestion pipeline state.

IMPORTANT: Use this only in scenarios where the pipeline is stuck and cannot make progress.

Here are some sample scenarios:

If you absolutely have to use this stored procedure, follow these steps.

IMPORTANT: Any rows that were present before executing this stored procedure, in the input table or the pipeline, will not be picked up for processing afterwards. After running the stored procedure, only newly inserted rows are picked up for processing.

  1. If there's any data in the input table that hasn't yet been processed, or is invalid or problematic, remove it.
  2. Run the APP.SP_FORCE_RESET_CONVERSION_PIPELINE() stored procedure.
  3. Insert new data into the INPUT.CONVERSION table for processing, or re-send data if needed, after verifying that it is not invalid or malformed.

Error messages

If you're processing conversions, you might see one or more of the error messages shown in the following table.

Error Code Error Message
EmailOrPhoneNotAllowed The selected partner is not allowed to push email and phone data
UID2NotAllowed The selected partner is not allowed to push UID2 data
EUIDNotAllowed The selected partner is not allowed to push EUID data
IncorrectTrackingTagData No offline data provider ID or advertiser ID found for tracking tag {tracking_tag_id}
PermissionDenied You do not have permission to data provider {id} with advertiser {id}
InvalidUserId One of the following:
  • Invalid email address: bad email
    Action: Resolve the issue with the email and try again. For normalization details, see Email address normalization.
  • Phone number is not normalized: bad phone
    Action: Resolve the issue with the phone number and try again. For normalization details, see Phone number normalization.
  • USER_IDS must contain id_type and id_value.
    Action: Resolve the issue with the user IDs and try again.
MissingOrInvalidTDIDAndImpressionId A valid TDID, DAID, UID2, UID2Token, or RampID must be provided when there is no ImpressionId.
Action: Resolve the issue with the ID and try again.
HttpError HTTP error message

Example SQL commands

The following sample SQL commands show how to complete specific activities relating to conversions.

IMPORTANT: As an initial test, use only one row of data. This can help verify that the end-to-end flow is functioning correctly, or reveal areas that need adjustment, before processing large volumes of data.

Insert a conversion

The following sample shows the SQL command syntax for inserting a conversion event:

INSERT INTO INPUT.CONVERSION (TRACKING_TAG_ID, TIMESTAMP_UTC, IMPRESSION_ID) VALUES ('TRACKING_TAG_ID_PLACEHOLDER', SYSDATE(), 'IMPRESSION_ID_PLACEHOLDER');

Replace the placeholders with your own tracking tag ID and the impression ID. For example:

INSERT INTO INPUT.CONVERSION (TRACKING_TAG_ID, TIMESTAMP_UTC, IMPRESSION_ID) VALUES ('rt7ftg2', SYSDATE(), '49gCBlwj-9d33-0927-s9g7-sd7nF3D248d5');

Insert a conversion with user IDs

The following sample shows the SQL command syntax for inserting a conversion event with user IDs:

INSERT INTO INPUT.CONVERSION (USER_IDS, TRACKING_TAG_ID, TIMESTAMP_UTC) SELECT ARRAY_CONSTRUCT(OBJECT_CONSTRUCT('id_type', 'ID_TYPE_PLACEHOLDER', 'id_value', 'ID_VALUE_PLACEHOLDER'), OBJECT_CONSTRUCT('id_type', 'ID_TYPE_PLACEHOLDER', 'id_value', 'ID_VALUE_PLACEHOLDER')), 'TRACKING_TAG_ID_PLACEHOLDER', sysdate();

Replace the placeholders with the correct values for the conversion event, including ID types, ID values, and tracking tag ID. For example:

INSERT INTO INPUT.CONVERSION (USER_IDS, TRACKING_TAG_ID, TIMESTAMP_UTC) SELECT ARRAY_CONSTRUCT(OBJECT_CONSTRUCT('id_type', 'email', 'id_value', 'user@example.com'), OBJECT_CONSTRUCT('id_type', 'TDID', 'id_value', '123e4567-e89b-12d3-a456-426652340000')), 'rt7ftg2', sysdate();

Process unprocessed conversions

You can process unprocessed conversions as part of your ETL (extract, transform, load) workflow. Run the following:

CALL APP.SP_PROCESS_CONVERSIONS(BATCH_SIZE INT, STOP_AFTER_SECONDS INT);

The following example processes 1000 conversions at a time in a loop, and stops looping if 180 seconds or more have elapsed:

CALL APP.SP_PROCESS_CONVERSIONS(1000, 180);

Query the results

To query the results, run the following:

SELECT * FROM APP.VW_CONVERSION_RESULT;

When you run this query, the results are stored in the APP.VW_CONVERSION_RESULT view. In this view, the EVENT_ID data element corresponds to the EVENT_ID data element in theINPUT.CONVERSION table.

There are two possible results for the IS_SUCCESS status:

The native app UI shows a summary of errors, including a count of ERROR_CODE values and a recent example of each error.

Delete processed conversions

IMPORTANT: Review any errors, and make sure that all the records have been processed successfully before deleting them.

You can help improve performance and reduce storage costs by deleting processed conversions regularly.

The following sample shows the SQL command syntax for deleting processed conversions:

DELETE FROM INPUT.CONVERSION c WHERE EXISTS (SELECT 1 FROM APP.VW_CONVERSION_RESULT r WHERE r.EVENT_ID = c.EVENT_ID);

Delete results for processed conversions

After you've deleted processed conversions from the INPUT.CONVERSION table, you should also delete the results.

The following sample shows the SQL command syntax for deleting the results corresponding to processed conversions:

CALL APP.SP_CLEAN_CONVERSION_RESULTS();

FAQs

The following is a list of commonly asked questions about the Snowflake Native App.

Why can't I see all available procedures?

If you find that you cannot complete a key basic procedure, it's likely that you haven't been assigned the application role necessary to complete the task or procedure.

For example, if you don't have the APP_ADMIN application role, you might see the following error on trying to run the SP_START_SEGMENT_TASK task:

SQL compilation error: Unknown user-defined function APP.SP_START_SEGMENT_TASK.

If this happens, ask someone with the app owner's role (the role that installs the app) to assign the necessary application role to you.

For details, see Application roles.

Next steps

If you uploaded event data only for measurement, your integration is complete.

If you uploaded event data as part of a product catalog integration, the next step is to activate the data through your product catalog. To share access, continue to Step 4. Manage product catalog access. You can also create product lists to build audiences and measure sales performance.