Skip to content
🎉 Launch sale:50% off everything over $22 — automatically applied at checkout· ends Aug 2Shop the sale →
DevOps AI ToolKit
Newsletter
All guides
AI for Microsoft Teams By James Joyner IV · · 8 min read Last reviewed Jul 2026

Microsoft Teams Error: 'Tenant does not have a SPO license' — Cause, Fix, and Troubleshooting Guide

Quick answer

Fix Microsoft Graph 403 'Tenant does not have a SPO license' on Teams files and sites: provision SharePoint Online and assign a plan that includes it.

  • #microsoft-teams
  • #troubleshooting
  • #errors
  • #graph-api
Free toolkit

Stuck on this Microsoft Teams error? Get the free incident triage checklist

A one-page PDF — the exact steps to isolate, fix, and verify a production error like this one. No spam, unsubscribe anytime.

What this error means

A Microsoft Graph call that touches storage backed by SharePoint Online or OneDrive fails with an HTTP 403 stating the tenant has no SharePoint license. Teams stores channel files in a SharePoint site and personal chat files in OneDrive, so any endpoint that reaches through to that storage — /drive, a channel’s filesFolder, /sites, or team creation that provisions a SharePoint site — fails when SharePoint isn’t licensed or provisioned in the tenant.

HTTP/1.1 403 Forbidden

{
  "error": {
    "code": "AccessDenied",
    "message": "Tenant does not have a SPO license."
  }
}

What users report

  • Graph returns 403 with “Tenant does not have a SPO license.” on /teams/{id}/channels/{id}/filesFolder, /drive, or /sites calls.
  • Creating a team or a group-connected site fails at the point SharePoint provisioning would happen.
  • Reading or listing channel files fails even though the team, channel, and messages exist.
  • The failure is consistent for the whole tenant, not intermittent throttling.
  • A brand-new tenant fails these calls while other Graph endpoints (users, messages) work fine.

Tenant and app configuration causes

  • No SharePoint Online in the tenant’s licensing — no assigned plan includes the SharePoint Online service, so the service was never provisioned.
  • Calling user lacks a SPO license — for delegated calls, the signed-in account has no plan that grants SharePoint/OneDrive.
  • SharePoint not yet provisioned — a newly licensed or newly created tenant where SharePoint provisioning hasn’t completed.
  • SharePoint service plan disabled — a plan is assigned but the SharePoint Online service plan within it is switched off.
  • OneDrive not provisioned for the user — personal-scope file operations hit OneDrive that has never been initialized for that account.
  • Trial or reduced SKU — a tenant SKU that intentionally excludes SharePoint/OneDrive.

Confirming tenant configuration

Confirm the call and the exact error, then check licensing and provisioning. Reproduce with curl so you can see the status and body precisely:

# Channel files folder -> reaches into the SharePoint-backed drive
curl -i -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/teams/$TEAM_ID/channels/$CHANNEL_ID/filesFolder"

Inspect the tenant’s subscribed SKUs and each user’s assigned service plans to see whether SharePoint is present and enabled:

# Tenant-level: which SKUs and service plans exist
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/subscribedSkus" \
  | jq '.value[] | {skuPartNumber, servicePlans: [.servicePlans[] | select(.servicePlanName|test("SHAREPOINT|ONEDRIVE"))]}'

# User-level: is a SharePoint service plan assigned and enabled for the caller?
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://graph.microsoft.com/v1.0/users/$USER_ID/licenseDetails" \
  | jq '.value[].servicePlans[] | select(.servicePlanName|test("SHAREPOINT|ONEDRIVE"))'

A servicePlanName in the SharePoint/OneDrive family with provisioningStatus of “Success” indicates it’s live; its absence or a disabled state explains the 403.

Resolution

Assign a plan that includes SharePoint Online to the tenant and to the relevant users, then let provisioning complete:

  • In the Microsoft 365 admin center, assign a license whose service plans include SharePoint Online (and OneDrive) to the calling account and to the users whose files you access.
  • If the plan is assigned but the SharePoint service plan is toggled off, re-enable that service plan within the license assignment.
  • For delegated Graph calls, ensure the signed-in user specifically holds a SharePoint-inclusive license, not just an app or a SharePoint-less SKU.

After assignment, SharePoint provisioning for the tenant and OneDrive provisioning for individual users can take time to complete. Re-check provisioningStatus until it reports success, then retry the Graph call. For a brand-new tenant, simply wait for initial provisioning to finish before treating the 403 as a bug.

Avoiding tenant drift

  • Provisioning is asynchronous — a freshly assigned license won’t clear the 403 instantly; poll provisioningStatus before retrying.
  • Delegated vs application context — under delegated auth, the specific signed-in user needs the license, not merely the tenant.
  • Service plan toggles — a license can include SharePoint yet have that service plan disabled per user; check the plan state, not just the SKU.
  • OneDrive for personal files — personal-scope file calls need OneDrive provisioned for that user, which happens on first use or admin pre-provisioning.
  • Not a retry/throttling case — this 403 is a licensing state, not a transient 429; retry loops won’t resolve it.
  • Distinguish from Authorization_RequestDenied — a missing Graph permission produces a different error; the SPO-license message is specifically about SharePoint provisioning/licensing.
Free download · 368-page PDF

Fixed it? Get 500 Microsoft Teams & DevOps AI prompts — free

500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.

  • 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
  • Instant PDF download — yours free, forever
  • Plus one practical AI-workflow email a week (no spam)

Single opt-in · unsubscribe anytime · no spam.

Did this fix your issue?

Free download · 368-page PDF

Get 500 Battle-Tested DevOps AI Prompts — Free

500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.

  • 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
  • Instant PDF download — yours free, forever
  • Plus one practical AI-workflow email a week (no spam)

Single opt-in · unsubscribe anytime · no spam.