2025-08-05
Customize Microsoft 365 Apps Deployment with ODT XML

-
Default Click-to-Run = chaos: wrong apps installed, missing features, noisy updates.
-
XML is the lever: exclude bloat, set Update Channel, define Languages, control InstallLocation, enable SharedComputerLicensing, and keep users out of update hell.
-
Segment by persona: finance ≠ marketing ≠ call center. Use per-department XMLs and pilot via Intune/MECM.
🧩 Why “Next, Next, Finish” Breaks at Scale
-
One-size-fits-none bundle (Access/Publisher everywhere, Teams where it shouldn’t).
-
Inconsistent updates: laptops grab builds overnight, others lag; prompts hit at the worst time.
-
Language pack drift and add-in surprises (Power Query/Solver “missing”).
-
Support burn: tickets for licensing prompts, mystery icons, and broken macros after channel changes.
🛠️ The One-Line (Plus a Few More) That Changes Everything
Below are copy-paste-ready snippets for your Office Deployment Tool (ODT) XML. Mix and match.
1) Exclude bloat & pin the update pace
<Configuration>
<Add OfficeClientEdition="64" Channel="MonthlyEnterprise">
<Product ID="O365ProPlusRetail">
<Language ID="en-us"/>
<ExcludeApp ID="Access"/>
<ExcludeApp ID="Publisher"/>
<!-- Add or remove as needed: Teams, OneDrive, Groove, Lync, etc. -->
</Product>
</Add>
<Updates Enabled="TRUE" Channel="MonthlyEnterprise"/>
<Display Level="None" AcceptEULA="TRUE"/>
</Configuration>
2) Finance persona (Excel power features, no fluff) + French fallback
<Configuration>
<Add OfficeClientEdition="64" Channel="MonthlyEnterprise" DownloadPath="\\dfs\office\cache">
<Product ID="O365ProPlusRetail">
<Language ID="en-us"/>
<Language ID="fr-fr"/>
<ExcludeApp ID="Publisher"/>
<ExcludeApp ID="Teams"/>
</Product>
</Add>
<Property Name="FORCEAPPSHUTDOWN" Value="FALSE"/>
<Property Name="SharedComputerLicensing" Value="FALSE"/>
<Updates Enabled="TRUE" Channel="MonthlyEnterprise"/>
<Display Level="None" AcceptEULA="TRUE"/>
</Configuration>
3) Call center/lab (Shared Computer Activation + quiet installs)
<Configuration>
<Add OfficeClientEdition="64" Channel="SemiAnnualEnterprise">
<Product ID="O365ProPlusRetail">
<Language ID="en-us"/>
<ExcludeApp ID="Publisher"/>
<ExcludeApp ID="Access"/>
</Product>
</Add>
<Property Name="SharedComputerLicensing" Value="TRUE"/>
<Property Name="DeviceBasedLicensing" Value="FALSE"/>
<Property Name="AUTOACTIVATE" Value="TRUE"/>
<Updates Enabled="TRUE" Channel="SemiAnnualEnterprise" />
<Display Level="None" AcceptEULA="TRUE"/>
</Configuration>
4) Keep installs off C: (tight images/VDI)
<Property Name="InstallLocation" Value="D:\Apps\MicrosoftOffice"/>
🧭 Channel Cheat Sheet (pick per group, not per org)
| Channel | Use For | Cadence | Risk |
|---|---|---|---|
| Current Channel | IT/Pilots, early adopters | ~2–4 weeks | Highest change velocity |
| Monthly Enterprise | General knowledge workers | Monthly, predictable | Balanced |
| Semi-Annual Enterprise | Finance/Legal/Regulated | 2x per year | Slow, stable |
Rule of thumb: IT and a small pilot sit on Current, most users on Monthly Enterprise, high-risk workflows on Semi-Annual.
🌍 Languages & Regions (stop the “how do I change UI language?” tickets)
Add multiple languages up front; Office picks the right UI:
<Product ID="O365ProPlusRetail">
<Language ID="ja-jp"/>
<Language ID="en-us"/>
</Product>
-
Quebec sites:
fr-fr+en-us -
Tokyo:
ja-jp+en-us -
Miami:
es-es+en-us
🧪 Rollout Pattern (copy/paste plan)
-
Prototype XML for each persona (Finance, HR, Marketing, Call Center).
-
Pilot 10–25 users per persona via Intune or MECM; collect add-in/app feedback.
-
Validate: Power Query/Solver/LOB add-ins, language UI, activation, macros.
-
Stage by channel: pilots (Current), broad (Monthly Enterprise), sensitive (Semi-Annual).
-
Enforce via Intune/MECM apps or Win32 package with detection rules.
-
Report & refine: track install success, crashes, add-in failures, ticket volume.
-
Document XML versions (Git/Repo) per department + change log.
🔍 Troubleshooting Quick Hits
-
“Unlicensed product” on shared PCs → Ensure
<Property Name="SharedComputerLicensing" Value="TRUE"/>. -
Missing Power Query/Solver → Verify SKU (Microsoft 365 Apps for enterprise), not legacy MSI; re-add via Programs and Features > Modify or redeploy with correct XML.
-
Mid-meeting update prompts → Move persona to Monthly Enterprise; set Display Level=None; schedule maintenance window; consider
FORCEAPPSHUTDOWN=FALSE. -
Wrong apps show up → Confirm ExcludeApp IDs, and that no older MSI Office remains (remove with OffScrub/setup /uninstall MSI).
-
Language mismatch → Ensure multiple
<Language>entries; confirm user’s Windows display language if Office follows OS.
🧯 “We Picked Wrong” Rollback Plan
-
Re-deploy with the corrected XML (same Product ID) to change channel/exclusions in place.
-
For bloat removal, add
<Remove>block or run a modify deployment:
<Remove>
<Product ID="O365ProPlusRetail">
<ExcludeApp ID="Access"/>
<ExcludeApp ID="Publisher"/>
</Product>
</Remove>
📈 KPIs That Prove It Worked
-
Ticket volume: install/activation/update issues (trend ↓).
-
Add-in failures detected by telemetry (trend ↓).
-
Time-to-patch critical updates by persona (SLA met).
-
% devices on intended Channel (compliance ↑).
-
Language-related support tickets (trend ↓).
❓FAQ
Q: Do I need separate installers per department?
A: No—use one ODT with multiple XMLs, or package multiple Win32 apps in Intune with per-group targeting.
Q: Can I switch channels later?
A: Yes—redeploy XML with a new Channel; Office moves to the new cadence.
Q: Teams/OneDrive in VDI?
A: Often exclude and deliver via VDI-optimized packages or machine-wide installers tailored for your platform.
Q: MSI remnants causing conflicts?
A: Remove legacy Office MSI first. Mixed MSI/Click-to-Run equals pain.
✅ Admin Checklist (print this)
-
Base XML per persona with Channel, ExcludeApp, Languages
-
SharedComputerLicensing set where needed
-
Display Level=None + AcceptEULA=TRUE
-
InstallLocation defined (VDI/low C: scenarios)
-
Intune/MECM detection rules + rollback plan
-
Pilot cohorts + schedule
-
Git repo for XML versions + change log
Host: Mirko Peters