Testing Your Integration
You can send test conversions end to end — through validation, de-duplication, and storage — without the conversion ever reaching the ad platform. This lets you confirm your setup (payload shape, authentication, client resolution) against a live account without polluting your real conversion data.
How it works
Prefix the click identifier in your payload with TNT_TEST_. Any value that starts with TNT_TEST_ marks that conversion as a test:
- it runs the full ingest → validate → store → queue path, exactly like a real conversion, so anything misconfigured still surfaces as an error; but
- the final send to the ad platform is skipped, so your account's conversion data is never touched.
TNT_TEST_ is the only part that matters — append anything after it. TNT_TEST_1, TNT_TEST_smoke, and TNT_TEST_2026_01_15 all work.
Which field to prefix, per platform
Use the exact request field from your platform's guide. For Google Ads, any one of its three click-id fields works.
| Platform | Field(s) to prefix with TNT_TEST_ |
|---|---|
| Google Ads | gclid, gbraid, or wbraid |
| Meta | fbc |
| TikTok | ttclid |
clickId | |
liFatId | |
| Bing | microsoftClickId |
| OpenAI | oppref |
Only the click identifier changes — the rest of the payload is identical to a real submission (see the per-platform guides). Google Ads example:
curl -X POST https://flex.tntgrowth.io/api/google/conversions/add \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '[
{
"customerId": "4482546575",
"conversionActionId": "7567171084",
"gclid": "TNT_TEST_smoke_001",
"timeStamp": 1778043599,
"conversionValue": 1
}
]'
Some conversions match on hashed email/phone (Google enhanced conversions) or other user data instead of a click id — for example an OpenAI event sent without an oppref. There's no click identifier to prefix, so the TNT_TEST_ trick doesn't apply to those. To test them safely, ask your TNT contact to flag the account as a test account — that bypasses every outbound send regardless of click id.
Confirming a test succeeded
Every submission gets a status record you can query.
1. Grab the submission id from the POST response. Google's .../conversions/add returns them directly (other platforms return an equivalent id):
{
"message": "Conversions queued",
"submissionIds": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"],
"statusUrls": ["/api/conversions/submissions/3fa85f64-5717-4562-b3fc-2c963f66afa6"],
"batchStatusUrl": "/api/google/conversions/status"
}
2. Query the submission status with your client API key:
curl https://flex.tntgrowth.io/api/conversions/submissions/3fa85f64-5717-4562-b3fc-2c963f66afa6 \
-H "x-api-key: YOUR_CLIENT_API_KEY"
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"source": "GOOGLE_ADS",
"externalAccountId": "1234567890",
"expectedCount": 1,
"createdAt": "2026-01-15T15:30:00.000Z",
"counts": { "success": 1, "failed": 0 },
"status": "complete"
}
Reading the result
status | Meaning |
|---|---|
pending | Still being processed — poll again shortly. |
pending_delivery | Accepted; delivery is scheduled (e.g. a future-dated conversion). |
complete | Finished — check counts. |
complete_with_errors | Finished, but one or more conversions failed (counts.failed > 0). |
stalled | Processing didn't finish in time — reach out to us. |
A successful test shows status: complete with counts.success equal to the number you sent and counts.failed: 0. Because the ad-platform send is bypassed for tests, complete confirms the conversion passed cleanly through TNT's pipeline — it is intentionally not delivered to the ad platform.
GET /api/conversions/submissions/{id} requires your client-specific x-api-key and only returns your own submissions (others return 404).