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:
- Reads the payload from the input table.
- Performs simple validation.
- Performs ID translation as needed.
- Performs splitting and batching, and handles retries if needed.
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:
- You must use SQL to prepare data and copy it into the input table.
- For individual items in the
LINE_ITEMSobject, only theITEM_CODEvalue is required, but including theQTYandPRICEvalues enables us to report on revenue. These values enhance measurement and provide better accuracy for ROAS. - The uploaded data must be in a format consumable by the POST /providerapi/offlineconversion endpoint. For specific data requirements, see SQL objects.
- The native app supports multiple user ID types as well as raw email addresses and phone numbers for UID2 processing. For details, see Supported ID types.
- Data sent through The Trade Desk connector native app is attributed to campaigns on a 28-day lookback window. You can find attribution results for your campaign in many of the reporting features available from The Trade Desk, such as User-defined reports (formerly My Reports).
Here's what you need to know about processing the conversion data:
- The native app includes a Snowflake triggered task. If the user starts the triggered task, it checks regularly for new records in the input table and runs whenever it detects new data.
- The native app tracks changes in the table to determine which records are processed with each execution. Existing, unchanged records are not reprocessed; you don't need to delete existing records.
- The native app includes a user interface, but all functions can be automated with SQL commands via tables, views, and stored procedures. For details, see Stored procedures.
- There is no limit to how many conversion events you can upload. The native app takes care of splitting and batching if needed.
- The maximum batch size is 100,000,000 records.
Snowflake marketplace listing
The following listing from The Trade Desk for processing conversion events in Snowflake is available in the Snowflake marketplace:
- TTD Connector: Audience & Conversion Data
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:
- Grant permissions.
- Complete pairing steps.
- Specify the main partner you want to work with.
- For the specified partner, select one or more advertisers you want to work with.
For details, see Configure the native app.
Process data
Processing of new or changed conversion data starts in one of these ways:
- When you call the stored procedure
APP.SP_START_CONVERSION_TASK, which detects changes in the data and starts the Snowflake triggered task. - When you initiate processing via the Snowflake Native App UI or by running the
APP.SP_PROCESS_CONVERSIONSstored procedure.
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:
- 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.
- On the Conversions page, click Refresh to refresh the UI page. Ensure your conversions are displayed.
- Click Process Immediately. This triggers execution.
Verify data processing
There are several ways you can verify that your data was processed correctly:
In the native app, refresh the Conversions page and check for success and errors.
In Snowflake, check the
APP.VW_CONVERSION_RESULTview. If there are errors, see Error messages.For first-party conversions, after an hour or two, you can view the offline conversion events in the REDS conversions feed. For details, see REDS overview.
Confirm with your Technical Account Manager, who verifies that the data was successfully ingested and validates the data within The Trade Desk platform.
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:
- Conversion Summary: This table summarizes count and percentage for the following statuses: Unprocessed, Successful, Failed. It also shows totals.
- Most Recent Failed Conversions (by ERROR_CODE): Includes error codes and a count for each.
- Latest 10 Successful Conversions (by TIMESTAMP_UTC): Includes
EVENT_ID,IMPRESSION_ID, and other values for each record. - Latest 10 Unprocessed Conversions (by TIMESTAMP_UTC): Includes
EVENT_ID,IMPRESSION_ID, and other values for each record.
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_IDSarray in The Trade Desk connector native app corresponds toUserIdArrayin 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,phone,email_hash, andphone_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_IDin The Trade Desk connector native app corresponds toImpressionIdin 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:
- Checks authorization and validation.
- Uploads the records from the
INPUT.CONVERSIONtable to The Trade Desk. - Adds a result that appears in the
APP.VW_CONVERSION_RESULTview with the sameEVENT_IDvalue as in theINPUT.CONVERSIONrecord.
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:
- Do not process conversions manually and run the conversion task at the same time.
- You can trigger these operations either through the UI or by calling the respective stored procedure.
- Run only one of the following operations at a time. Do not call the same stored procedure multiple times concurrently—for example, from multiple worksheets or parallel extract, transform, load (ETL) jobs. The following stored procedures must be run to completion before starting another:
APP.SP_START_CONVERSION_TASK()APP.SP_PROCESS_CONVERSIONS(BATCH_SIZE INT, STOP_AFTER_SECONDS INT)
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:
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:
- Invalid or malformed data was inserted into the input table, causing the ingestion pipeline to fail repeatedly or throw exceptions.
- No new records are being ingested, and no new entries are appearing in the results table, even though data is incoming.
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.
- If there's any data in the input table that hasn't yet been processed, or is invalid or problematic, remove it.
- Run the
APP.SP_FORCE_RESET_CONVERSION_PIPELINE()stored procedure. - Insert new data into the
INPUT.CONVERSIONtable 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:
|
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:
TRUEindicates that upload of the conversion event was successful.FALSEindicates that there are errors. Examine theERROR_CODEandERROR_MESSAGEfields to determine the failure reason.
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.