Integration BlueprintUse case: sales collaborationUpdated 2026-10-19

Salesforce & Microsoft Teams Integration for Sales Teams

Integrating Salesforce Enterprise with Microsoft Teams streamlines sales collaboration by broadcasting Opportunity stage changes, high-value deal alerts, and account updates directly into dedicated channel threads. Using Salesforce Change Data Capture (OpportunityChangeEvent) paired with Microsoft Graph API and Incoming Webhooks, engineering teams eliminate cross-app context switching and reduce manual pipeline reporting delays to sub-second automated notifications.

Explore: CRM · Team Communication

Comparison matrix

FeatureSalesforceMicrosoft TeamsEdge
Entry Pricing$25/user/month (Starter Edition)$4/user/month (Microsoft Teams Essentials)Microsoft Teams
Authentication ProtocolOAuth 2.0 via Connected App / JWT Bearer TokenOAuth 2.0 via Azure AD / Entra ID App RegistrationsTie
Base API Endpointhttps://yourorg.my.salesforce.com/services/data/v60.0https://graph.microsoft.com/v1.0Tie
API Rate Limits100,000+ API calls per rolling 24-hour window per orgGraph API tenant-level throttling (10,000 req/10 min window)Salesforce
Real-time Event StreamingPub/Sub API and CometD (Bayeux) via Change Data CaptureGraph Change Notifications via Webhooks / Event HubsSalesforce
Interactive UI ExtensibilityLightning Web Components (LWC) & Screen FlowsAdaptive Cards schema v1.5 with Action.ExecuteMicrosoft Teams
App Ecosystem Catalog5,000+ listings on Salesforce AppExchange1,500+ apps on Microsoft AppSourceSalesforce
Self-Hosting CapabilityCloud-only multi-tenant / Hyperforce architectureCloud-only (M365 cloud infrastructure)Tie
Start freeTry Salesforce →Try Microsoft Teams →

ROI metrics

Hours saved / mo

48

Salesforce / mo

$1,650

Microsoft Teams / mo

$125

Break-even

3.2 wks

Annual savings

$34,560

Integrating Salesforce CDC with Microsoft Teams provides immediate ROI within 4 weeks by eliminating daily sync standups and manual deal notifications for a 10-person sales team.

Step-by-step setup guide

  1. 1.Enable Change Data Capture in Salesforce

    Navigate to Setup > Integrations > Change Data Capture in Salesforce. Move 'Opportunity' from Available Entities to Selected Entities. This automatically exposes real-time streaming events on the '/data/OpportunityChangeEvent' bus.

    /* Validated via Salesforce Tooling API */
    GET /services/data/v60.0/tooling/query/?q=SELECT+Id,DeveloperName+FROM+PlatformEventChannelMember+WHERE+EventChannel='ChangeEvents'
  2. 2.Provision an Azure AD App Registration for Graph API

    In the Microsoft Entra admin center, register a new application. Add Application permissions for 'ChannelMessage.Send' and 'Teamwork.Migrate.All' under Microsoft Graph. Generate a client secret and record the Directory (Tenant) ID, Application (Client) ID, and secret value.

    curl -X POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token \
      -H 'Content-Type: application/x-www-form-urlencoded' \
      -d 'client_id={client-id}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret={client-secret}&grant_type=client_credentials'
  3. 3.Create an Incoming Webhook Connector in Microsoft Teams

    Open the target deal room channel in Microsoft Teams, select 'Connectors' from the channel settings, add 'Incoming Webhook', configure the display name to 'Salesforce Deal Bot', and capture the generated webhook URL.

    https://yourorg.webhook.office.com/webhookb2/xxxx-xxxx/IncomingWebhook/yyyy/zzzz
  4. 4.Configure Apex Callout or Middleware Worker

    Deploy an Apex trigger on OpportunityChangeEvent or a Node.js/Python listener consuming the Salesforce Pub/Sub API. Map the Opportunity data into an actionable Microsoft Adaptive Card JSON payload.

    trigger OpportunityCDC on OpportunityChangeEvent (after insert) {
      for (OpportunityChangeEvent event : Trigger.new) {
        EventBus.ChangeEventHeader header = event.ChangeEventHeader;
        if (header.changetype == 'UPDATE' && event.StageName != null) {
          SalesforceTeamsDispatcher.sendCard(event.StageName, event.Amount, header.getRecordIds());
        }
      }
    }
  5. 5.Post the Formatted Adaptive Card to Teams Channel

    Dispatch the formatted HTTP POST payload directly to the Teams Webhook URL or execute via Graph API POST to /v1.0/teams/{team-id}/channels/{channel-id}/messages.

    curl -X POST https://yourorg.webhook.office.com/webhookb2/xxxx-xxxx/IncomingWebhook/yyyy/zzzz \
      -H 'Content-Type: application/json' \
      -d '{"type":"message","attachments":[{"contentType":"application/vnd.microsoft.card.adaptive","content":{"$schema":"http://adaptivecards.io/schemas/adaptive-card.json","type":"AdaptiveCard","version":"1.4","body":[{"type":"TextBlock","text":"Sales Alert: Opportunity Won!","weight":"Bolder","size":"Medium"}]}}]}'

Webhook payload example

POST https://api.yourdomain.com/webhooks/salesforce/opportunity · event: OpportunityChangeEvent

{
  "schema": "N6g0XjWn9Vw4YkF7Jd1wLg",
  "payload": {
    "ChangeEventHeader": {
      "commitTimestamp": 1716912000000,
      "transactionKey": "0002b0c9-044d-f684-2f08-3e4b771e892c",
      "commitUser": "0055e000000XyZaAAK",
      "commitNumber": 1048576,
      "entityName": "Opportunity",
      "changeType": "UPDATE",
      "changeOrigin": "com/salesforce/api/soap/59.0",
      "recordIds": ["0065e000002A1bCAAS"]
    },
    "Name": "Acme Corp - Enterprise Expansion",
    "Amount": 120000.0,
    "StageName": "Closed Won",
    "Probability": 100.0,
    "CloseDate": "2024-05-31"
  },
  "event": {
    "replayId": 48102
  }
}

Salesforce: pros & cons

  • ✅ Granular Change Data Capture (CDC) streaming down to specific field modifications
  • ✅ Configurable Apex triggers and Flow Orchestrator for complex conditional logic
  • ✅ Supports dedicated Named Credentials for secure endpoint authentication without hardcoded keys
  • ⚠️ Requires Salesforce Admin or Developer certification to implement and maintain custom Apex
  • ⚠️ API call limits apply against the rolling 24-hour organizational cap

Microsoft Teams: pros & cons

  • ✅ Interactive Adaptive Cards support inline action buttons directly inside channel feeds
  • ✅ Native inclusion in existing Microsoft 365 business licensing plans
  • ✅ Deep cross-linking with Outlook, OneDrive, and SharePoint files
  • ⚠️ Graph API setup requires Microsoft Entra admin consent and security approvals
  • ⚠️ Connector webhooks are rate-limited to 4 requests per second per webhook URL

FAQ

Can I filter Salesforce OpportunityChangeEvent payloads so only Closed Won deals post to Teams?

Yes. You can write an Apex trigger on OpportunityChangeEvent that checks `if (event.StageName == 'Closed Won')` before firing the HTTP callout, or implement a filter directly in Salesforce Flow Orchestrator.

What is the difference between Teams Incoming Webhooks and Microsoft Graph API for sending alerts?

Incoming Webhooks provide a static, channel-specific POST URL that requires no token lifecycle management but is limited to posting messages. Graph API requires Azure AD OAuth token exchange but allows full CRUD operations on channels, tabs, chats, and files.

How do we handle Salesforce API request limits when sending high-volume updates?

Use Salesforce Pub/Sub API with CometD or a worker on an external host to listen to the CDC event stream instead of polling REST endpoints. Subscribing to event channels does not decrement your 24-hour REST API transaction limit.

Can sales reps update the Salesforce Opportunity stage directly from Microsoft Teams?

Yes. Teams Adaptive Cards support `Action.Execute` and `Action.Submit`. You configure the submit action to hit an endpoint or Azure Function that runs a PATCH request back to `/services/data/v60.0/sobjects/Opportunity/{Id}` via Salesforce REST API.

Related integrations & comparisons