Microsoft Ads offline conversions let you send outcomes from your CRM, such as qualified leads and closed deals, back to Microsoft Advertising and match them to the Bing ad click that started them. You save the MSCLKID with each lead, create an offline conversion goal, then upload each outcome by file, schedule or API.
This guide is part of our offline conversions series. It covers the Microsoft Advertising side only. Facts come from Microsoft’s own help pages and API reference, as of October 2026.
How Microsoft Ads offline conversions work
Microsoft’s offline conversion guide describes a short chain:
- Someone clicks your ad. With auto-tagging on, the landing page URL carries a unique
msclkid. - Your site keeps that ID and sends it with the lead form into your CRM.
- The lead becomes a sale later, on a call or in a meeting.
- You upload the click ID, the goal name and the conversion time to an offline conversion goal.
- Microsoft matches the row to the click and counts it as a conversion for that goal.
Microsoft recommends offline conversions for lead generation, where the sale happens offline. It says not to use them for store visits or in-store purchases. Offline goals don’t need a UET tag. The goals grid shows a dash for the tag ID and tracking status.
MSCLKID import vs enhanced conversions matching
Each uploaded row needs a way to match it to an ad. You can send the MSCLKID, hashed customer data, or both. The OfflineConversion reference says the MSCLKID “is optional when you provide a hashed email address or phone number for enhanced conversions.”
1 / 6
Send both when you can. The click ID gives an exact match, and the hashed data covers leads whose click ID was lost. Microsoft’s enhanced conversions page says formatting and hashing are mandatory for offline uploads, and that unhashed data returns an error in the upload status. In the API, the goal setting is IsEnhancedConversionsEnabled. If you don’t see an enhanced conversions option on your offline goal, check with Microsoft Advertising support before you rely on hashed-only rows.
What you need before you start
- Auto-tagging of Microsoft Click ID turned on. It is on by default, under Campaigns, then Settings, then Account level options, with the checkbox “Add Microsoft Click ID (MSCLKID) to URLs to allow conversion tracking”.
- Code on your landing pages that reads msclkid from the URL and stores it, because it isn’t carried to the next page.
- A lead form with a hidden msclkid field, plus the email, phone, a timestamp and the consent choice, saved on the CRM contact and linked to every deal.
- A conversion window that fits your sales cycle. Microsoft says a conversion uploaded more than 90 days after the last click won’t be imported.
- A transparency notice and user consent for the data you collect, as Microsoft’s offline conversion guide requires.
- For the API route only: a developer token, OAuth access to the account, and its account and customer IDs.
Microsoft’s auto-tagging page says the click ID appears as ?msclkid= on the landing page URL, and each click gets a new one. Its sample code sets a 90-day cookie. The Conversions API guide gives the same advice: keep the most recent value in a first-party cookie, local storage or a server-side store, overwrite it when a new one arrives, and keep it for 90 days.
Our default is to set that cookie from your own tracking domain, such as a server-side Google Tag Manager container on a subdomain like sgtm.example.com. Google recommends serving the server container from the same origin as your site, because cookies the server sets need the two to share a domain (custom domain guide). The server-side tagging guide covers the setup.

Create an offline conversion goal
Create one goal per CRM stage you want to send, such as qualified lead and closed won. The steps follow Microsoft’s offline conversion guide.
- In Microsoft Advertising, hover over Conversions in the left menu and select Conversion goals.
- Select Create conversion goal, then the Offline conversions type.
- Enter a goal name. Two goals can’t share a name, and your uploads must use this name exactly.
- Under Sharing, apply the goal to all accounts or one account.
- Under Revenue value, choose a fixed value, or a value that varies, with a default for rows sent without one.
- Set the Count and the Conversion window. The window can track up to 90 days in the past.
- Select Save, then wait 2 hours before the first upload.
Three settings are easy to get wrong:
- Conversion window. Through the API it defaults to 30 days, with a maximum of 90 (OfflineConversionGoal reference). A deal that closes after the window isn’t counted, and changing the window doesn’t affect past conversions. Set it before the campaign runs.
- Count. Unique counts only the first conversion after a click, a common choice for leads. All counts every conversion with a different time, a common choice for sales.
- Scope. A goal applies to one account or to every account under the customer. You can’t change the scope later. To change it, create a new goal and pause the old one.
Creating an offline goal also turns on auto-tagging, for every account under the customer if the scope is customer level.
How to upload offline conversions to Microsoft Advertising
Microsoft documents three ways in: a one-time file, a scheduled file, or the API. Pick the first one that fits. Microsoft recommends uploading daily, and warns that automated bidding can suffer otherwise.
1. Upload a file once
- Download Microsoft’s Excel or CSV template from the offline conversion guide.
- Fill in one row per conversion and set the time zone. Save the file.
- Hover over Conversions in the left menu and select Offline conversions.
- On the Uploads tab, select + Upload, then Browse, and choose the file.
- Select Upload and preview. Review the results, and download the errors if there are any.
- Select Apply changes.
Parameters:TimeZone=EasternTimeUSCanada Conversion Name,Conversion Time,Conversion Value,Conversion Currency,Microsoft Click ID,Hashed Email Address,Hashed Phone Number Closed won,2026-10-20 15:07:01,12000,USD,<MSCLKID>,<SHA-256 of the normalized email>,<SHA-256 of the E.164 phone>
Set the time zone once in the Parameters row, or add it to each conversion time when rows span time zones. Microsoft’s list of time zone names avoids errors around daylight saving changes. You can also give a GMT offset, such as 2026-10-20 15:07:01-0500.
2. Schedule recurring imports
Scheduled imports pull a file from a URL on a set frequency. Microsoft says they are available in the redesigned Microsoft Advertising experience only.
- Host your Excel or CSV file at an HTTPS, HTTP, SFTP or FTP location, and refresh it before each run.
- Hover over Conversions and select Offline conversions, then open the Schedules tab and select + Schedule.
- Choose the source type, then enter the File URL and the username and password if the file needs them.
- Pick the upload frequency and time.
- Select Save and preview. The schedule saves only if Microsoft can reach the file, and the preview lists any errors.
For Google Sheets, open the sheet, select File, then Publish to the web, choose CSV or Excel, and use the published link as the File URL. Publishing makes the file reachable by that link, so keep only the columns the import needs, with email and phone already hashed.
3. The Campaign Management API
For your own pipeline, call ApplyOfflineConversions. It takes up to 1,000 conversions per request. Microsoft suggests sending as many as possible in each request when you have a lot to upload.
POST https://campaign.api.bingads.microsoft.com/CampaignManagement/v13/OfflineConversions/Apply
Authorization: Bearer <ACCESS_TOKEN>
DeveloperToken: <DEVELOPER_TOKEN>
CustomerId: <CUSTOMER_ID>
CustomerAccountId: <ACCOUNT_ID>
{
"OfflineConversions": [{
"ConversionName": "Closed won",
"ConversionTime": "2026-10-20T20:07:01Z",
"ConversionValue": 12000,
"ConversionCurrencyCode": "USD",
"MicrosoftClickId": "<MSCLKID>",
"HashedEmailAddress": "<SHA-256 of the normalized email>",
"HashedPhoneNumber": "<SHA-256 of the E.164 phone>"
}]
}Send ConversionTime in UTC. Microsoft says all API uploads need to be in GMT, and that conversions can be lost if you don’t convert the time. The response returns PartialErrors for rows that failed, so the valid rows still go through. Microsoft also has a sandbox, but offline conversions uploaded there aren’t attributed in sandbox reports.
4. The Bulk API
If you already manage the account through Bulk files, the Offline Conversion record takes the same fields, with column names such as Microsoft Click Id, Conversion Name and Hashed Email Address. One record can add, restate or retract a conversion. As in the API, the conversion time is in UTC.
Call tracking and partner tools
For phone sales, Microsoft names call-tracking providers that can import call conversions: Avanser, CallTrackingMetrics, Delacon, DialogTech, Infinity, Invoca, ResponseTap and Wildjar. Microsoft’s Conversions API guide also lists partner integrations, including HubSpot, Segment, Tealium and Stape. Before you rely on any tool, ask which Microsoft route it uses and whether it sends the MSCLKID and hashed customer data.
Field mapping
The same data goes into every route under slightly different names.
| What | Upload file column | API field | Notes |
|---|---|---|---|
| Click ID | Microsoft Click ID | MicrosoftClickId | The 32-character GUID from msclkid. Required unless you send hashed email or phone for enhanced conversions. |
| Goal | Conversion Name | ConversionName | Must match the offline goal name exactly. |
| Conversion time | Conversion Time | ConversionTime | Later than the click. A time zone in the file; UTC in the API. |
| Value | Conversion Value | ConversionValue | Optional. 0 to 999999999999, up to 3 decimals, with a period, not a comma. Falls back to the goal’s value. |
| Currency | Conversion Currency | ConversionCurrencyCode | Optional. Falls back to the goal’s currency. |
| Hashed Email Address | HashedEmailAddress | Trim, lowercase, remove any +alias and any periods before the @, remove accents, then SHA-256. | |
| Phone | Hashed Phone Number | HashedPhoneNumber | E.164 format, such as +14255551234, then SHA-256. |
| Attribution credit | Not in the template | ExternalAttributionCredit, ExternalAttributionModel | Only for goals set to use your own attribution model, which you can set only through the API. |
Upload windows and timing
Most missing conversions come down to one of these rules.
| Rule | What Microsoft says | What to do |
|---|---|---|
| Upload age | The conversion time must be within the last 90 days, or the upload fails | Upload daily, not at quarter end. |
| Click order | The conversion time must be later than the click time | Check time zones. Use UTC in the API. |
| Conversion window | The conversion must fall inside the goal’s window: 30 days by default in the API, 90 at most | Set the window to your sales cycle before the clicks happen. |
| New goal | Wait 2 hours after creating a goal before uploading to it | Create goals the day before you start sending. |
| New click | Wait an hour after an ad click before uploading a conversion for it | Batch uploads rather than sending the second a form arrives. |
| Reporting delay | Uploaded data can take up to six hours to show | Check the next day before you debug. |
| Duplicates | The same click ID, goal name and conversion time import once. The first copy wins. | Keep the original conversion time when you resend a row. |
If deals close later than 90 days after the click, send an earlier stage too, such as qualified lead or opportunity created. That gives Microsoft a signal inside the window, and the closed deal adds value when it lands in time.
Update or retract a conversion
Refunds, cancelled orders and mistakes can be corrected after upload. There are two adjustment types:
- Restate changes the conversion’s value. Only the Conv. value and All conv. value columns change.
- Retract removes the conversion from the count and sets its value to 0.
In the web UI, use Microsoft’s adjustment template and upload it like a normal file, or on a schedule. This is available in the redesigned experience only. Each row needs the original click ID, goal name and conversion time, plus the adjustment type and adjustment time. A restate also needs the new value. Each upload takes up to 100,000 rows. In the API, ApplyOfflineConversionAdjustments takes up to 1,000 adjustments per request, and the adjustment time can’t be earlier than the original conversion time.
Offline conversion import vs the UET Conversions API
Microsoft also has a Conversions API for UET, which sends events from your server instead of the browser. Its guide, last updated in October 2026, says it can carry CRM and offline events as well as website events. For CRM outcomes, the two routes differ most in how old an event can be.
1 / 7
On access, Microsoft’s Conversions API help page says “Not everyone has this feature yet.” To check your account, open the UET section, edit a tag, select Save and next, and look for Use Conversions API under Set up tagging. That is where Microsoft says to copy the token. If the option isn’t there, plan CRM outcomes around offline conversion import.
If you use both, don’t send the same outcome twice to the same goal. The Conversions API deduplicates UET and server copies of an event by a shared eventId. Offline import deduplicates by click ID, goal name and conversion time. Pick one route for each CRM stage.
How to check that it works
- After a file upload, open Conversions, then Offline conversions, and read the Status column. Download the results to see any error messages.
- For scheduled imports, select Save and preview, then Download errors only to see rows that failed.
- For the API, log the PartialErrors and the TrackingId from each response, so you can trace a failed row later.
- Wait up to six hours, then look for conversions on the goal in your campaign reports.
- Compare goal conversions with the CRM for the same deals. Expect fewer: rows with old or other-account click IDs show as uploaded but don’t count.
- If nothing appears after a successful upload, review the file by hand and re-upload. Microsoft says to contact support if data is still missing.
Common errors and fixes
| Error or symptom | Likely cause | Fix |
|---|---|---|
OfflineConversionNotAcceptedForGoal (5615) | The goal was created less than 2 hours ago | Wait 2 hours, then resend. |
OfflineConversionNameInvalid (5606) | The name doesn’t match an existing offline conversion goal | Copy the goal name exactly, including capitals and spaces. |
OfflineConversionMicrosoftClickIdInvalid (5604) | The click ID is malformed or truncated | Send the msclkid value exactly as it appeared in the landing page URL. |
OfflineConversionTimeOutOfWindow (5609) or ClickIdDateTimeOutsideGoalConversionWindow (5617) | The conversion is outside the goal’s conversion window | Lengthen the goal’s window, up to 90 days, and send an earlier stage that falls inside it. |
ConversionTimeEarlierThanClickTime (5616) or FutureConversionTimeCannotBeSet (5614) | Usually a time zone mistake | Send UTC in the API. In files, set the Parameters time zone or add one to each row. |
OfflineConversionsLimitExceeded (5601) | More than 1,000 conversions in one API request | Split the batch. |
OfflineConversionPilotNotEnabledForCustomer (5613) | The customer isn’t enabled for offline conversions | Contact Microsoft Advertising support. |
| A file with hashed data and no click ID is rejected | The goal is a regular offline goal, not an enhanced one | Add the MSCLKID, or use a goal with enhanced conversions turned on. |
| Hashed data error in the upload status | Email or phone was sent unhashed | Normalize, then SHA-256 hash, before the file goes up. |
OfflineConversionAdjustmentTimeEarlierThanConversionTime (5620) | A restate or retract is dated before the original conversion | Use the time of the change, not the original conversion time. |
| Upload succeeds, but fewer conversions show | Duplicates, or click IDs that are too old or from another account | Remove duplicates and check you are uploading to the account that ran the ads. |
The full list of offline conversion errors runs from code 5600 to 5627 in Microsoft’s operation error codes.
How Microsoft Ads fits with your other platforms
The groundwork is the same on every platform: save the click ID and contact details when the lead arrives, keep them on the CRM record, and send each stage inside the platform’s window. Only the field names and upload routes change. Our guide to offline conversions compares the match keys, hashing and upload windows for Google Ads, Meta, Microsoft, LinkedIn and TikTok.
- Google Ads moved offline imports to Data Manager in 2026. See the Google Ads offline conversion import guide.
- Enhanced conversions on the website work the same way on Google Ads, with hashed customer data from the lead form. See the enhanced conversions guide.
- GoHighLevel users can follow the GoHighLevel offline conversions guide for Google Ads and Meta.
Maven sends CRM outcomes, such as qualified leads and closed-won deals, to Microsoft Advertising as offline conversions, with the MSCLKID or hashed email and phone. To check the website side first, a Free Tracking Scan shows which tags load on your lead pages today.
Get the next one before it hits.
Short emails when Meta, Google, GA4 or LinkedIn change something that moves your numbers.
Part of: Offline conversions
Also in By ad platform: ChatGPT Ads offline conversions: how to send CRM, phone and in-store sales to OpenAI, Google Ads offline conversion import: how to upload CRM conversions through Data Manager
Frequently asked questions
What is the MSCLKID and how do I capture it?
The MSCLKID is the Microsoft Click ID, a 32-character GUID that Microsoft Advertising adds to your landing page URL on each ad click when auto-tagging is on. It is only in the landing page URL, so save it in a first-party cookie when the visitor lands, copy it into a hidden field on your lead form, and store it on the CRM record.
How long after the click can I import a Microsoft Ads offline conversion?
The conversion time must be within the last 90 days, later than the click, and inside the goal’s conversion window. Through the API the window defaults to 30 days and can go up to 90 days, so a deal that closes 45 days after the click only counts if the goal’s window is longer than 45 days. Set it before you start sending.
Can I import offline conversions without an MSCLKID?
Yes, with enhanced conversions. Microsoft’s API docs say the MSCLKID is optional when you send a SHA-256 hashed email address or phone number. The goal needs enhanced conversions turned on: Microsoft’s FAQ says a file with hashed data and no MSCLKID is rejected when it goes to a regular offline goal.
How long until uploaded conversions show in Microsoft Advertising?
Microsoft says to wait 2 hours after creating a new offline conversion goal before the first upload, and that uploaded conversion data can take up to six hours to show. It also suggests waiting an hour after an ad click before uploading a conversion for it.
Do offline conversion goals need a UET tag?
No. Microsoft’s help says UET tags aren’t required for offline conversion goals, so the UET tag ID and tracking status show a dash in the goals grid. You still need auto-tagging, so ad clicks carry an MSCLKID, and a way to keep that ID with the lead.
Is the UET Conversions API available in every account?
Not yet, according to Microsoft. Its Conversions API help page says “Not everyone has this feature yet.” To check your account, edit a UET tag and look for the Use Conversions API option under Set up tagging. If it isn’t there, use offline conversion import for CRM outcomes.
Can I change or remove an offline conversion after uploading it?
Yes. Restate changes the conversion’s value, and Retract removes it from the count. Use the adjustment template in the web UI, which is available in the redesigned experience only, or the ApplyOfflineConversionAdjustments operation, with up to 1,000 adjustments per request. The adjustment time can’t be earlier than the original conversion time.
Why does Microsoft show fewer conversions than I uploaded?
Microsoft lists a few reasons. Rows with the same click ID, conversion name and conversion time are imported once. Click IDs that are too old or belong to another account still show as uploaded, because the format is valid, but they don’t match. Conversions outside the goal’s conversion window aren’t counted.
Sources and references
- Microsoft Advertising Help: Tracking offline conversions
- Microsoft Advertising Help: Auto-tagging of Microsoft Click ID
- Microsoft Advertising Help: Enhanced conversions
- Microsoft Advertising Help: Where can I find information about the Conversions API (CAPI)?
- Microsoft Advertising API: Conversions API (CAPI) guide
- Microsoft Advertising API: OfflineConversion data object
- Microsoft Advertising API: OfflineConversionGoal data object
- Microsoft Advertising API: ApplyOfflineConversions
- Microsoft Advertising API: ApplyOfflineConversionAdjustments
- Microsoft Advertising Bulk API: Offline Conversion record
- Microsoft Advertising API: Operation error codes
- Google Tag Manager: Map server-side tagging to a custom domain
