Microsoft Teams Error Guide: 'Manifest parsing has failed' App Package Upload — Fix the manifest.json
Fix Microsoft Teams 'manifest parsing has failed' errors: correct the schema version, fix invalid IDs and URLs, and match package contents to pass validation.
- #microsoft-teams
- #adaptive-cards
- #troubleshooting
- #errors
Fixing errors like this? Get 500 free DevOps AI prompts
500 copy-paste AI prompts for the stack you actually run — one PDF, free.
Overview
Uploading or publishing a Teams app package fails when the manifest.json doesn’t conform to the declared schema. The Teams admin center, Developer Portal, or teamsapp CLI reports the validation error and refuses the package.
Manifest parsing has failed.
"manifestVersion" is required. | "id" must be a valid GUID. |
"icons.color" file "color.png" was not found in the package. |
"validDomains" must not contain a wildcard at the top level.
Symptoms
- Sideloading a
.zipapp package returns “Something went wrong” / “manifest parsing has failed”. - The Developer Portal flags specific fields red on import.
- The package uploads to one tenant but is rejected by the store validation.
- Icons appear broken or the app installs but tabs/bots don’t wire up.
- CI packaging succeeds but the produced zip fails validation.
Common Root Causes
- Wrong or missing
manifestVersion— the$schemaandmanifestVersiondon’t point at a version Teams accepts. - Invalid
id— the appidisn’t a valid GUID, or doesn’t match the registered app ID. - Package/manifest mismatch — icon filenames in the manifest don’t exist in the zip, or the manifest isn’t at the zip root.
- Bad URLs/domains —
contentUrl/configurationUrlnot HTTPS, orvalidDomainscontains a wildcard or a domain not covering your URLs. - ID mismatches —
bots[].botId,webApplicationInfo.id, orcomposeExtensions[].botIddon’t match the real registrations.
Diagnostic Workflow
Validate the manifest JSON and its schema before packaging:
# Is it even valid JSON?
jq empty manifest.json && echo OK
# Validate against the declared schema with the Teams CLI
teamsapp validate --manifest-path ./appPackage/manifest.json
Check the declared version and required IDs:
{
"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.17/MicrosoftTeams.schema.json",
"manifestVersion": "1.17",
"id": "11112222-3333-4444-5555-666677778888",
"developer": { "name": "...", "websiteUrl": "https://example.com",
"privacyUrl": "https://example.com/privacy",
"termsOfUseUrl": "https://example.com/terms" },
"icons": { "color": "color.png", "outline": "outline.png" },
"validDomains": ["tab.example.com"]
}
Confirm the package structure matches — manifest and both icons at the zip root:
unzip -l appPackage.zip
# Archive: appPackage.zip
# manifest.json
# color.png (192x192)
# outline.png (32x32, transparent)
Verify referenced IDs exist:
# botId in the manifest must match a real Azure Bot registration
az bot show --name "$BOT_NAME" -g "$RG" --query properties.msaAppId
Example Root Cause Analysis
A team automated app packaging in CI. The build templated manifest.json from environment variables, and a misnamed variable left manifestVersion empty in production packages. Sideloading returned “manifest parsing has failed” with no obvious cause because the CI logs showed a successful zip.
Running teamsapp validate locally against the produced package immediately flagged the missing manifestVersion and, separately, that validDomains had picked up a wildcard (*.example.com) that top-level validation rejects. Fixing the template variable, pinning manifestVersion/$schema to a supported version, and replacing the wildcard with the explicit tab domain made the package validate. They then added teamsapp validate as a required CI gate so a malformed manifest could never ship again.
Prevention Best Practices
- Pin
$schemaandmanifestVersionto a version Teams currently supports and keep them in sync. - Ensure the app
idis a valid GUID matching your Developer Portal registration. - Keep
manifest.json,color.png(192x192), andoutline.png(32x32 transparent) at the zip root with names matching the manifest. - Use HTTPS everywhere and list every host your URLs use in
validDomains(no top-level wildcards). - Match
botId,webApplicationInfo.id, and compose-extension IDs to real registrations. - Run
teamsapp validate(or the Developer Portal validator) as a required CI step before packaging.
Quick Command Reference
# Validate JSON + schema
jq empty manifest.json && teamsapp validate --manifest-path manifest.json
# Inspect package layout (manifest + icons at root)
unzip -l appPackage.zip
# Check icon dimensions
identify color.png outline.png # ImageMagick
# Confirm bot/app IDs referenced actually exist
az bot show -n "$BOT_NAME" -g "$RG" --query properties.msaAppId
Conclusion
“Manifest parsing has failed” is a schema-conformance problem: a missing version, an invalid GUID, a URL/domain violation, or a package whose files don’t match the manifest. Validate the manifest against its declared schema, confirm the zip contains the right files at the root, and make every referenced ID and domain real. Wiring teamsapp validate into CI turns manifest errors into a fast, pre-upload failure instead of a mysterious rejection in the admin center.
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.