Microsoft 365 Integration

Connect Outlook, Teams, and Microsoft 365

One Microsoft Graph connection covers calendar ingestion from Outlook, transcript ingestion from Teams meetings, and reply detection in Outlook mail. Designed for Microsoft 365 Business and Enterprise tenants.

What this connection covers

One OAuth flow, three Microsoft 365 surfaces

Outlook calendar

Ingest meetings from every connected user. Drives transcript fetch from Teams or Recall.

Microsoft Teams meetings

Pull Teams meeting transcripts via Graph callRecords API once a recording finishes.

Outlook email

Track reply detection on dispatched follow-ups and capture incoming replies as engagement signals.

Setup walkthrough

~20 minutes if you already have an Entra app; ~30 minutes from scratch

1

Register an app in Microsoft Entra ID (Azure AD)

In the Microsoft Entra admin center, go to App Registrations → New registration. Pick a name (e.g. "FastFollow") and the appropriate audience.

  • Supported account types: usually "Accounts in this organizational directory only" (single tenant)
  • For multi-tenant SaaS deployments, choose "Accounts in any organizational directory"
  • Redirect URI (Web): https://app.fastfollow.ai/api/integrations/microsoft/callback
2

Add API permissions

Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add the scopes below. For tenant-wide deployments, switch to Application permissions and grant admin consent.

  • Calendars.Read — read calendar events
  • OnlineMeetings.Read — read Teams meeting metadata
  • OnlineMeetingTranscript.Read.All — read meeting transcripts (admin consent required)
  • Mail.Read — detect reply threading on sent follow-ups
  • User.Read — identify the authorizing user
  • offline_access — long-lived refresh tokens
3

Create a client secret

Under Certificates & secrets, create a new client secret. Copy the value immediately — it is shown only once.

  • These map to MICROSOFT_CLIENT_ID and MICROSOFT_CLIENT_SECRET in FastFollow account settings
  • Set the secret expiry to 24 months and rotate it on a calendar
  • Application (client) ID and Directory (tenant) ID are visible on the Overview page
4

Authorize from FastFollow

In FastFollow, go to Integrations → Microsoft → Connect. Sign in with the Microsoft account whose calendar should be ingested.

  • For Workspace-wide ingestion, an admin must grant consent on behalf of the tenant
  • Refresh tokens last 90 days; FastFollow rotates them every time we use them
  • Subscriptions for push notifications are auto-created and renewed every 3 days via cron

Change notifications

Graph subscriptions by default, with polling fallback

Push notifications via Graph subscriptions

FastFollow creates Microsoft Graph subscriptions for /users/{id}/events and /users/{id}/messages. Graph posts every change to /api/webhooks/microsoft within seconds.

  • Real-time event detection
  • Subscriptions expire every 3 days (Graph limit) and auto-renew
  • Validation handshake handled automatically on subscription create
  • clientState is a tenant-scoped HMAC secret to prevent forgery

Delta query polling fallback

If subscription creation fails (network egress restrictions, conditional access policies), FastFollow falls back to Graph delta query polling every 5 minutes.

  • Higher latency (up to 5 minutes)
  • More API quota consumption
  • Useful for restricted Conditional Access environments

Tenant admin considerations

What an IT admin needs to know before approving FastFollow

  • Conditional Access

    If your tenant requires MFA or location restrictions for app-only auth, the FastFollow service principal must be excluded from those policies or granted an exception.

  • Teams transcription policy

    Transcripts only land if Teams admin has enabled Transcription in Meetings → Meeting policies. Without it, OnlineMeetingTranscript.Read.All returns 404 for every call.

  • Application vs Delegated permissions

    Delegated = per-user (recommended for self-serve). Application = tenant-wide (recommended for managed deployments). Choose one and stick with it — mixing causes scope mismatches.

  • Data residency

    Graph data is stored in your Microsoft 365 tenant region. FastFollow honors the regional routing of the Graph endpoint you authenticate against.

Troubleshooting

The most common Microsoft Graph errors

AADSTS65001

Admin consent has not been granted for the requested permissions.

Fix: For permissions requiring admin consent (OnlineMeetingTranscript.Read.All, Application-tier scopes), a tenant admin must visit the consent URL or grant consent in the Entra admin center under API permissions.

AADSTS50105

The signed-in user is not assigned to a role for the application.

Fix: If the app is configured to require user assignment in Enterprise applications → Properties, only assigned users can sign in. Either assign the user or disable "Assignment required".

InvalidAuthenticationToken

Token rejected by Graph immediately on every request.

Fix: Refresh token has expired (>90 days idle) or was revoked. Have the user reconnect from FastFollow → Integrations → Microsoft.

ResourceNotFound (transcripts)

Meeting events appear but transcripts never ingest.

Fix: Teams transcription was not enabled for the meeting, or OnlineMeetingTranscript.Read.All admin consent is missing. Confirm meeting policies in Teams admin center → Meetings → Meeting policies → Transcription = Enabled.

subscription_renewal_failed

Push notifications stop arriving after ~3 days.

Fix: FastFollow renews Graph subscriptions every 2 days via a cron job. If renewal fails for 2+ consecutive runs, the integration falls back to polling. Check /admin/health for subscription state.

TooManyRequests (429)

Initial backfill triggers throttling.

Fix: Microsoft Graph enforces per-app and per-tenant throttling. FastFollow honors Retry-After headers with exponential backoff. For large historical backfills, contact support to schedule outside business hours.