> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.funnelflux.pro/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# 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](https://help.funnelflux.pro/en/article/using-traffic-source-integrations-s4p02b/). 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](https://help.funnelflux.pro/en/article/using-s2s-with-microsoft-ads-1vv6zp9/) 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]`.

![Traffic Source Integrations settings: the Microsoft Ads card and an active Microsoft Ads connection](https://storage.crisp.chat/users/helpdesk/website/-/b/7/4/9/b749232d828ce800/01-settings-microsoft-ads-conn_ovqdil.png)

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:

![Tracking Fields tab of a Microsoft Ads traffic source: External Click ID set to msclkid with a blank source token](https://storage.crisp.chat/users/helpdesk/website/-/b/7/4/9/b749232d828ce800/03-msclkid-tracking-field_jn6dz7.png)

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**:

1. **Traffic Source Integration Type** -- pick **Microsoft Ads**. For a traffic source made from our Microsoft Ads template, this is usually pre-selected.
2. **Connection** -- the Microsoft login from Step 1.
3. **Ad Account** -- the Microsoft Ads account this traffic source spends from. Accounts show with their currency, e.g. "My Ad Account · USD".

![Integrations tab with Microsoft Ads, a connection and an ad account selected, and the Delayed 2h badge](https://storage.crisp.chat/users/helpdesk/website/-/b/7/4/9/b749232d828ce800/02-platform-integration_13wco14.png)

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.

![Integration Event Mapping for Microsoft Ads, with Conversions mapped to a Microsoft Ads conversion goal](https://storage.crisp.chat/users/helpdesk/website/-/b/7/4/9/b749232d828ce800/04-integration-event-mapping_1h9oho4.png)

For each event you want Microsoft to see:

1. Pick a **Triggering Event** -- **Conversions** or one of your custom events.
2. 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)".
3. 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](https://help.funnelflux.pro/en/article/using-s2s-with-microsoft-ads-1vv6zp9/).

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 and Dictionary Sync sections for Microsoft Ads, both enabled, with their sync status](https://storage.crisp.chat/users/helpdesk/website/-/b/7/4/9/b749232d828ce800/05-cost-and-dictionary-sync_1rnj3dh.png)

### 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 | `{CampaignId}` |
| Ad Group | `{AdGroupId}` |
| Ad | `{AdId}` |

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.