Marketing data · 20 min · reviewed 2026-09-06
How do I connect Microsoft Ads (Bing Ads) to a CRM?
Register an app in Microsoft Entra, get a refresh token with the msads.manage scope, request a developer token in Microsoft Advertising, and note the customer id and account id. One JSON bundle goes under Settings → Other keys → Microsoft Ads.
What you will need
- Admin on the Microsoft Advertising account.
- A Microsoft account to register the app (https://portal.azure.com).
Steps
- 1
Step 1
In Azure: Entra ID → App registrations → New registration. Any name; account type *Personal and work accounts*; redirect URI https://login.microsoftonline.com/common/oauth2/nativeclient. Copy the Application (client) id; create a client secret under Certificates & secrets.
- 2
Step 2
In Microsoft Advertising: Tools → Developer token → Request. Copy it once granted.
- 3
Step 3
Get a refresh token: open in a browser https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=<id>&response_type=code&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient&scope=https://ads.microsoft.com/msads.manage offline_access, sign in, copy the code from the address bar, and exchange it for tokens with any HTTP client at https://login.microsoftonline.com/common/oauth2/v2.0/token.
- 4
Step 4
Find Customer id and Account id under Settings → Accounts in Microsoft Advertising.
- 5
Step 5
Build the bundle: {"client_id": "…", "client_secret": "…", "refresh_token": "…", "developer_token": "…", "customer_id": "…", "account_id": "…"}
- 6
Step 6
Settings → Other keys → Microsoft Ads → Set key. Paste. Save. Test.
Common errors
- **auth ok
- bundle lacks developer_token/customer_id/account_id**: the token works but reporting fields are missing. Add them.
- invalid_grant
- the refresh token was issued without offline_access. Repeat step 3.
How you know it worked
Test connection returns yesterday's spend and clicks.
Where this goes in SalesCrew
Settings → Other keys → Microsoft Ads → Test connection. In your own workspace the same how-to opens beside the field, with your callback URLs filled in.