Skip to main content

Bing (Microsoft Ads) Conversions

This guide covers how to submit offline conversions to Microsoft Advertising (Bing) through the TNT Growth API.

Authentication

All requests require an x-api-key header with your client-specific API key provided by TNT Growth.

-H "x-api-key: YOUR_API_KEY"

Submitting a Conversion

Endpoint

POST /api/bing/conversions/offline/add

Request Body Schema

FieldTypeRequiredDescription
customerAccountIdstringYesYour Microsoft Ads customer account ID (provided during onboarding)
conversionNamestringYesThe name of the offline conversion goal in Microsoft Ads
microsoftClickIdstringConditionalMicrosoft Click ID (msclkid) captured from the ad click. Optional when you send email or phoneNumber for enhanced conversions.
conversionTimenumberYesUnix timestamp (seconds) of when the conversion occurred
conversionValuenumberNoMonetary value of the conversion
emailstringConditionalCustomer email address (hashed before sending to Microsoft). Enables enhanced conversions and can substitute for microsoftClickId.
phoneNumberstringConditionalCustomer phone number (hashed before sending to Microsoft). Enables enhanced conversions and can substitute for microsoftClickId.
ingestionSourcestringNoOrigin of the event (e.g. pixel, conversion-api)
tntIdstringNoThe attribution handle from the pixel. A resolved session fills microsoftClickId and any missing UTM fields
utmSourcestringNoUTM source parameter (e.g. bing) — stored for attribution reporting
utmMediumstringNoUTM medium parameter (e.g. cpc) — stored for attribution reporting
utmCampaignstringNoUTM campaign name — stored for attribution reporting
utmTermstringNoUTM search keyword — stored for attribution reporting
utmContentstringNoUTM content parameter (ad/creative variant) — stored for attribution reporting
At least one identifier is required

Provide at least one of microsoftClickId, email, or phoneNumber. A request with none of these is rejected with 400 Bad Request — Microsoft has nothing to attribute the conversion to.

Example Request

curl -X POST https://flex.tntgrowth.io/api/bing/conversions/offline/add \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"customerAccountId": "B012345678",
"conversionName": "Offline Purchase",
"microsoftClickId": "abc123def456ghi789",
"conversionTime": 1778043599,
"conversionValue": 150,
"email": "customer@example.com",
"phoneNumber": "+15551234567",
"tntId": "9f2b7c1e-4d3a-4f8b-9c2e-1a5d7e0b4c63",
"utmSource": "bing",
"utmMedium": "cpc",
"utmCampaign": "brand-search-q2",
"utmTerm": "best treatment center",
"utmContent": "expanded-text-ad-variant-b"
}'

Example Response

{
"message": "Offline conversion sent to bing Example Client B012345678 Offline Purchase",
"data": {
"submissionId": "8f3c2d10-7e6b-4a51-9d8c-3b2e1f0a9b8c",
"duplicate": false
}
}

When a conversion is dedup-skipped (the same event was submitted within the last 24 hours), submissionId is null and duplicate is true.

Checking Submission Status

After submitting a conversion, use the submission ID to check processing status.

Endpoint

GET /api/conversions/submissions/:submissionId

Example Request

curl https://flex.tntgrowth.io/api/conversions/submissions/8f3c2d10-7e6b-4a51-9d8c-3b2e1f0a9b8c \
-H "x-api-key: YOUR_API_KEY"

Example Response

{
"id": "8f3c2d10-7e6b-4a51-9d8c-3b2e1f0a9b8c",
"source": "BING",
"externalAccountId": "B012345678",
"expectedCount": 1,
"createdAt": "2026-05-11T12:00:00.000Z",
"scheduledFor": null,
"counts": {
"success": 1,
"failed": 0
},
"status": "complete"
}

Status Values

StatusDescription
pendingConversion is queued and waiting to be processed
pending_deliverySubmission is scheduled for future delivery. Currently only emitted by Google Ads ingest paths; Bing submissions never enter this state.
completeConversion processed successfully
complete_with_errorsProcessing finished but some conversions failed — use GET /api/conversions/bing/failed?submissionId=<id> to fetch the actual error messages
stalledProcessing has not progressed — contact support

The scheduledFor field is always null for Bing submissions and is included only for schema parity with Google Ads, which uses it for deferred delivery.

Inspecting Failed Conversions In Your Batch

When a submission ends with complete_with_errors, the submission status endpoint surfaces only the count of failed rows. Fetch the actual error messages with:

GET /api/conversions/bing/failed?submissionId=<submissionId>

The response payload mirrors the Google Ads failed-conversion shape — see Google Ads → Inspecting Failed Conversions In Your Batch.

Enhanced Conversions

Microsoft treats the msclkid as optional when you supply a hashed email or phone number — the same idea as Google Enhanced Conversions. This lets you attribute conversions where the click ID wasn't captured (e.g. a phone lead), using the customer's identifiers instead.

How attribution is chosen per conversion:

You sendAttributed by
microsoftClickId onlyClick ID
email / phoneNumber only (no microsoftClickId)Enhanced (hashed identifiers)
BothClick ID, with hashed identifiers attached to improve match rate

email and phoneNumber are always hashed on our servers before they leave (SHA-256 email, E.164 phone) — raw values are never sent to Microsoft.

Enable enhanced conversions in Microsoft Ads first

Hashed identifiers only match if enhanced conversions are enabled on the offline conversion goal in your Microsoft Advertising account. After enabling it, allow a couple of hours before relying on enhanced-only attribution. See Microsoft's OfflineConversion reference.

Example: enhanced conversion (no click ID)

curl -X POST https://flex.tntgrowth.io/api/bing/conversions/offline/add \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"customerAccountId": "B012345678",
"conversionName": "Offline Purchase",
"conversionTime": 1778043599,
"conversionValue": 150,
"email": "customer@example.com",
"phoneNumber": "+15551234567"
}'

Best Practices

  • Include microsoftClickId when you have it — the msclkid gives Microsoft the most reliable attribution to the originating click. When it isn't available, send email/phoneNumber so the conversion can still be attributed via enhanced conversions
  • Use accurate timestampsconversionTime should reflect when the conversion actually occurred; Microsoft rejects conversions older than its lookback window
  • Match conversionName exactly to the offline conversion goal configured in Microsoft Ads
  • Send email and/or phoneNumber to enable enhanced conversion matching (and to raise match rate even when a microsoftClickId is present)
  • Poll with a delay — wait 30-60 seconds after submission before checking status
  • Send tntId when your backend has it — the attribution handle recovers the click ID and UTMs captured on the visitor's original ad click, which is often the only thing that attributes an offline conversion at all