Direct integration setup with Microsoft Ads
This is the Microsoft Ads walkthrough for our native integration.
Once it's set up, we upload your conversions straight to Microsoft Ads as offline conversions, pull campaign spend into your reports, and swap campaign, ad group and ad IDs for their names.
If you're unsure about any of the settings below, use our Microsoft Ads traffic source template when you create the traffic source. Everything will be configured correctly.
The general concepts (connections, linking, event mapping, Classic Options vs Integrations) are explained in Using traffic source integrations. This article only covers what's specific to Microsoft Ads, so read that one first if you haven't.
Note that the older method -- a Microsoft Ads custom scenario with a refresh token from our Microsoft login page -- is still documented in Using S2S with Microsoft Ads for anyone who needs it. For new setups, use the native integration below.
Step 1: Connect your Microsoft account
Go to Settings > Integrations > Traffic Sources.
Click Connect on the Microsoft Ads card [1]. If you already have a Microsoft Ads connection, the button says Add account instead -- use it to connect a second Microsoft login.
You'll be sent to Microsoft to sign in and approve access. When you come back, the login appears under Connections with an Active status [2].

Sign in with the Microsoft login that has access to the ad accounts you advertise from.
If the connection ever shows Expired or Auth error, click Reauth to sign in again.
Step 2: Make sure the msclkid is captured
Microsoft Ads matches offline conversions using the visitor's msclkid, and also using hashed email and phone number when you pass those to us with the conversion.
With auto-tagging on, Microsoft appends msclkid to your ad's landing URL by itself. We capture it in the traffic source's External Click ID field.
If you created the traffic source from our Microsoft Ads template, this is already done. On the Tracking Fields tab, External Click ID has the URL parameter msclkid and a blank source token:
![]()
The blank token is intentional -- Microsoft adds the msclkid itself, so we don't put a placeholder in your links, we just read it when it arrives.
If you built the traffic source by hand, rename the External Click ID parameter to msclkid, and make sure auto-tagging of the click ID is on in your Microsoft Ads account. Without an msclkid, a conversion can only be matched if it comes with an email or phone number.
Step 3: Link the traffic source to your ad account
Open the traffic source and go to the Integrations tab.
In Platform Integration:
- Traffic Source Integration Type -- pick Microsoft Ads. For a traffic source made from our Microsoft Ads template, this is usually pre-selected.
- Connection -- the Microsoft login from Step 1.
- Ad Account -- the Microsoft Ads account this traffic source spends from. Accounts show with their currency, e.g. "My Ad Account · USD".

Under the ad account you'll see a Delayed 2h badge.
This is Microsoft's rule, not ours: Microsoft won't accept an offline conversion until 2 hours after the click. We hold each conversion in a queue and send it once it's due, with its original conversion time.
So if a test conversion isn't in Microsoft Ads straight away, give it at least 2 hours, plus whatever time Microsoft takes to process it on their side.
View delivery logs takes you to Integration Logs for this setup (see Step 6).
If the ad account you pick shows an access error, the connected login can't reach that account. Reconnect with a login that does, or choose another ad account.
Step 4: Map your conversions to Microsoft Ads conversion goals
Go to the Conversion Tracking tab and switch the toggle at the top from Classic Options to Integrations.
This works the same way as Google Ads: you pick from the conversion goals that already exist in your ad account.

For each event you want Microsoft to see:
- Pick a Triggering Event -- Conversions or one of your custom events.
- Pick a Destination Event -- this lists the conversion goals in your Microsoft Ads account, with their ID in brackets, e.g. "Offline Conversion Test Goal (175015172)".
- Leave Value Override blank to send the revenue FunnelFlux tracked, or set a value if you want Microsoft to receive something different. Currency Override works the same way for the currency code.
Each conversion goal can only be used once per traffic source. A goal that is already used shows as "(mapped to ...)" and can't be picked again.
The conversion goal must already exist in Microsoft Ads. We load the list live from your account, we don't create goals. If the list is empty or the one you want is missing, create an offline conversion goal in Microsoft Ads first, then reopen the traffic source. The Microsoft side of creating that goal is covered in Using S2S with Microsoft Ads.
Then click Save.
Note that saving in Integrations mode removes the traffic source's classic postback settings, so the same conversion isn't sent twice. If you are moving from the old custom scenario, take a note of its settings first.
Step 5: Turn on cost sync and dictionary sync
Back in the Integrations tab, below Platform Integration, you'll find Cost Sync and Dictionary Sync.

Cost Sync
- Enable campaign-level cost sync -- imports your Microsoft Ads campaign spend every hour.
- Reconcile finalized daily costs -- Microsoft can adjust a day's spend after the fact. With this on, we recheck each finished day (in the ad account's time zone) once Microsoft has finalized it, so your costs end up matching Microsoft's own numbers. For Microsoft Ads the info icon says this runs 180 minutes after the day ends.
Cost sync is campaign-level ONLY -- the Campaign chip is highlighted, Adset and Ad aren't. If you need spend per ad group or per ad, that's available using Argosync.
For campaign costs to land on the right campaign, the campaign ID needs to be in your links. Our Microsoft Ads template already passes {CampaignId} in the Campaign ID field.
Dictionary Sync
Microsoft passes IDs in your URLs, not names, so by default your reports show campaign 123456789 rather than "US - Search - Brand".
Turn on Enable ID to name sync and we pull campaign, ad group and ad names from Microsoft Ads and show them in reporting.
The table shows each level and the URL value we look for:
Level | URL value |
|---|---|
Campaign |
|
Ad Group |
|
Ad |
|
We match on the URL value, not the field name, so it doesn't matter what you called the field. With our Microsoft Ads template all three show Field present. If a row says Add field, add a tracking field with that URL value.
Turn on Show original IDs after synced names if you still want to see the raw ID next to the name.
Once you save, a Sync status panel shows the last and next runs for each sync, with Sync hourly costs now, Reconcile daily costs now and Sync names now buttons if you don't want to wait.
Step 6: Check Integration Logs
Go to Logs > Integration Logs. There are two views at the top: Event Logs and Queue.
Event Logs shows each event we tried to send, its destination conversion goal and its outcome. If a conversion was rejected, this is where you'll see why. By default it doesn't list queued events -- those live in the Queue view.
Queue shows conversions that haven't been sent yet. With Microsoft Ads, that's every conversion during its 2-hour delay, so seeing them here is normal. By default it lists pending, processing, held and failed rows; completed ones are filtered out.
Each row shows when it was queued and last updated, the platform, integration and traffic source, the event type and its status. Pending rows show when the next attempt is due, e.g. "in 1 hr". An empty queue simply means nothing is waiting.
Held conversions
If your Microsoft connection expires, gets an auth error or is disconnected, we don't throw conversions away. They are held in the queue instead.
A held row shows a Hold Reason (e.g. "Credentials invalid") and a link to the fix, e.g. Reconnect Microsoft Ads integration, which takes you to Settings > Integrations > Traffic Sources. The next attempt shows as "After fix".
Click Reauth on the Microsoft Ads connection, and the held conversions are sent once it's active again.
Note that Microsoft only accepts offline conversions up to 90 days after they happened. If a connection stays broken past that, those conversions can no longer be sent and show "Expired while held". So if you get a connection warning, fix it sooner rather than later.
Troubleshooting
The Ad Account list doesn't show the account I want
The Microsoft login you connected doesn't have access to it. Check its access in Microsoft Ads, or connect another login with Add account.
The Destination Event list is empty
No conversion goals exist in that Microsoft Ads account yet. Create one in Microsoft Ads, then reopen the traffic source.
Conversions aren't showing in Microsoft Ads
Wait at least 2 hours after the click first. Then check Integration Logs -- Queue for anything still waiting or held, and Event Logs for rejected events. A missing click ID almost always means auto-tagging is off, or the msclkid is being dropped by a redirect before it reaches our tracking.
Costs or names aren't appearing
Check the Sync status panel on the Integrations tab. If it shows an error, the connection usually needs a Reauth or the login lost access to the ad account.
Updated on: 15/10/2026
Thank you!
