Azure Virtual Desktop Cost Optimization: 20-Point Checklist
By Sessionwright EngineeringPublished Updated 9 min read
Microsoft says it plainly: of all the AVD cost components, "virtual machine instances usually cost the most" (Understand and estimate costs). So this checklist runs in the order that saves real money: stop paying for hosts nobody is using, fix the license flags, right-size, and only then buy commitments. Each item names the setting and the gotcha that usually breaks it.
Scheduling and power state
1. Put every pooled host pool under a scaling plan. Autoscale works in four phases (ramp-up, peak, ramp-down and off-peak), and each host pool can have only one plan (autoscale scenarios). There's no extra charge for autoscale (autoscale FAQ). Before you create the plan, set a real MaxSessionLimit on the host pool instead of the default. Then assign Desktop Virtualization Power On Off Contributor to the AVD service principal or the host pool's managed identity at subscription scope. Microsoft says a lower scope "prevents autoscale from working properly" (create a scaling plan). Remove any Azure Automation runbooks or third-party scalers from the same pool. More detail is in our scaling plan guide.
2. Tune capacity threshold and minimum percentage of hosts per phase. Microsoft's example: two hosts with a max session limit of 20 give 40 sessions of capacity. At a 75% threshold, autoscale starts a third host once there are more than 30 sessions. The ramp-up threshold carries into peak, and the ramp-down threshold carries into off-peak. Minimum percentages round up (create a scaling plan). Gotcha: days left out of every schedule inherit the last off-peak settings until the next ramp-up.
3. Breadth-first up, depth-first down. Autoscale ignores the host pool's load-balancing setting and uses the one set for each phase (autoscale scenarios). Microsoft suggests breadth-first for ramp-up and peak, and depth-first for ramp-down and off-peak so sessions consolidate onto fewer hosts (autoscale FAQ).
4. Deal with disconnected sessions, or you'll never reach zero. Autoscale treats disconnected sessions as users who may reconnect. During ramp-down it keeps Total sessions / (Max session limit × Capacity threshold %) hosts running. Force logoff works only during ramp-down. If ramp-down is shorter than the logoff wait time, nobody is signed out. To scale to zero, set Set time limit for disconnected sessions (Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Session Time Limits) so it expires before ramp-down ends, and set off-peak minimum hosts to 0% (autoscale FAQ).
5. Use the exclusion tag, not drain mode, for maintenance. In pooled pools, autoscale overrides drain mode, whoever set it. Session hosts tagged with the plan's exclusion tag (for example excludeFromScaling) are left alone, but they still count toward the minimum percentage of hosts (create a scaling plan).
6. Give personal host pools a personal scaling plan. For each phase, choose what happens after a session has been disconnected or logged off for 0–360 minutes: deallocate, hibernate or do nothing (create a scaling plan). A hibernated VM isn't billed for VM usage, but its disks and networking still are (VM hibernation). Two gotchas. First, FSLogix and App Attach don't support hibernate (create a scaling plan). Second, if you choose hibernate on VMs that don't have hibernation enabled, autoscale does nothing at all (autoscale FAQ).
7. Turn on Start VM on Connect. Assign Desktop Virtualization Power On Contributor, then run Update-AzWvdHostPool -ResourceGroupName <rg> -Name <hostpool> -StartVMOnConnect:$true. In pooled pools it starts a VM only when none are running, and at most one every five minutes. Users who sign in during that window while there's no capacity see "No resources available" (Start VM on Connect). It never deallocates anything, so pair it with autoscale.
Billing hygiene
8. Make sure "off" means deallocated. A VM in the Stopped state (allocated) is billed. Deallocated isn't, although disks and networking still are (VM states and billing). If a user shuts down from the Start menu, the VM isn't deallocated (Start VM on Connect FAQ). Stop-AzVM deallocates by default. With -StayProvisioned, "the account is charged for the stopped virtual machine" (Stop-AzVM).
9. Don't let savings break hosts. A host left powered off for more than 90 days has its machine token expire, so power it on for at least 20 minutes every 90 days (add session hosts). Agent updates also fail on hosts that are deallocated during the scheduled maintenance window (Scheduled Agent Updates). Both show up as session host health problems; see our Unavailable / Needs Assistance guide.
Licensing
10. Set Windows_Client on Windows 10/11 Enterprise hosts. Microsoft 365 E3/E5/A3/A5/F3/Business Premium, Windows Enterprise E3/E5, Windows Education A3/A5 and Windows VDA per user all grant AVD access for internal users. RDS CALs are listed only for Windows Server hosts (licensing AVD). The portal and the ARM template apply the license flag automatically. Hosts built another way may not have it. Check Get-AzVM for LicenseType : Windows_Client, and set it with $vm.LicenseType = "Windows_Client" followed by Update-AzVM (apply Windows license).
11. Use Azure Hybrid Benefit only for Windows Server session hosts. It needs Windows Server core licenses with active Software Assurance or qualifying subscriptions, with a minimum of 8 core licenses per VM. Setting licenseType to Windows_Server changes only a metadata flag and doesn't restart the VM (Azure Hybrid Benefit). Microsoft also documents that the AVD host pool creation process can give Windows Server hosts the wrong license type, so check it (apply Windows license).
Commitments
12. Reserve only the always-on baseline. Reservations can cut costs "by up to 72% from pay-as-you-go prices" and apply hourly. Microsoft says to base purchases on "consistent base usage" (Azure Reservations). A VM reservation covers only compute, not Windows software costs (reserved VM instances). Hosts that autoscale deallocates every night aren't baseline.
13. Use a savings plan for compute when sizes or regions will change. You commit to an hourly spend for one or three years, and it applies across regions and eligible services. Unused commitment expires each hour, and purchases can't be canceled or refunded (savings plans). Microsoft's recommended order is to right-size first, then fix existing reservations, then buy new commitments (savings plan vs reservation).
Sizing and disks
14. Right-size against Microsoft's sizing guidelines. For multi-session hosts, the suggested maximums are 6 users per vCPU for light workloads, 4 for medium, 2 for heavy and 1 for power. Microsoft also prefers many smaller VMs, because idle ones are easier to shut down (session host sizing guidelines). Set MaxSessionLimit to match.
15. Choose the OS disk tier on purpose. Disks keep billing while VMs are deallocated, so the disk tier is a 24×7 cost. Microsoft positions Standard SSD for "lightly used enterprise applications" and Premium SSD for production workloads that need high performance. Premium SSD v2 can't be an OS disk (disk types). Changing the disk type needs a VM restart (convert disk types), so test logon times on a few hosts first.
16. Use ephemeral OS disks only where the design fits. Ephemeral OS disks live on the VM's cache or temp disk. In AVD they're supported only in pooled host pools with session host configuration. They can't be deallocated, so Microsoft recommends dynamic autoscaling with the minimum percentage of active hosts at 100%, which creates and deletes hosts instead (AVD ephemeral OS disks). The autoscale docs still label dynamic autoscaling as preview (autoscale scenarios). The image must fit in the VM's cache or temp disk, and snapshots, Azure Backup and Azure Site Recovery aren't supported (ephemeral OS disks).
17. Clean up orphans. Deleting a VM doesn't always delete its disks, and you keep paying for unattached ones (unattached disks). The PowerShell default, for example, detaches the OS disk, and detached resources keep incurring charges. Set -OSDiskDeleteOption and -NetworkInterfaceDeleteOption, or tick "Delete public IP and NIC when VM is deleted" (delete a VM). Public IPv4 addresses carry a nominal charge (public IPs). Advisor flags unattached disks (Advisor cost recommendations).
Storage, monitoring and governance
18. Match FSLogix storage to the workload. Microsoft recommends Azure Files for most customers. Standard shares suit light workloads with fewer than 200 users, and Premium is recommended for medium, heavy and power workloads (FSLogix storage options). With provisioned billing you pay for what you provision, whether you use it or not, and provisioned v2 is recommended for new shares (Azure Files billing). Azure NetApp Files needs a capacity pool of at least 1 TiB.
19. Keep AVD Insights to the default data set. In most cases, performance counters make up 80–99% of Insights ingestion. Microsoft's own example estimate is about 3–5 GB per VM every 31 days. The cost doc includes a KQL query that shows billed MB per counter. Microsoft recommends keeping the AVD diagnostics, which are under 1% of storage cost, and using a dedicated workspace (Insights costs). More in our AVD monitoring guide.
20. Tag, budget and review. Resources don't inherit tags from their resource group or subscription, so use Azure Policy to enforce them (tags). Tag VMs, disks, NICs and storage by host pool and cost center, set budgets in Cost Management (Cost Management best practices), and review Advisor's "Right-size or shutdown underutilized virtual machines" recommendation. Model every change in the Azure pricing calculator instead of trusting a blog's percentages.
FAQ
How much does Azure Virtual Desktop cost per user?
There's no flat price. You pay for Azure consumption (VMs, disks, storage and networking) plus licensing. Internal users need an eligible license, and per-user access pricing applies only for external commercial use (licensing AVD). The pricing calculator's AVD module estimates consumption (estimate costs).
Why is my AVD scaling plan not working?
Check the documented prerequisites first: the Power On Off Contributor role assigned below subscription scope, the default MaxSessionLimit, another scaling tool on the same pool, or disconnected sessions holding hosts up. Check autoscale's diagnostics in Insights before changing thresholds (monitor autoscale).
Does Azure Hybrid Benefit apply to AVD?
For Windows Server session hosts, yes (Windows_Server), if you have eligible licenses. Windows 10/11 Enterprise multi-session hosts use the separate Windows_Client license flag.
Savings plan or reserved instances for AVD?
Use reservations for a stable size and region that runs around the clock. Use a savings plan when sizes or regions will change. Neither helps hours that autoscale has already deallocated.
Why isn't Start VM on Connect working?
Check the Power On Contributor assignment, ANSI-only names for the host pool, hosts and resource group, and the five-minute limit in pooled pools.
Want a second pair of eyes?
Sessionwright's AVD assessment reviews your host pools against checks like these and gives you an expert-reviewed report. It's read-only by default. If you later let the Sessionwright for Azure Virtual Desktop make changes, you approve each one and every action is logged.
Sources
- Microsoft Learn: Understand and estimate costs for Azure Virtual Desktop
- Microsoft Learn: Autoscale scaling plans and example scenarios
- Microsoft Learn: Create and assign an autoscale scaling plan
- Microsoft Learn: Azure Virtual Desktop autoscale FAQ
- Microsoft Learn: Monitor Autoscale operations with Insights
- Microsoft Learn: Configure Start VM on Connect
- Microsoft Learn: Start VM on Connect FAQ
- Microsoft Learn: Hibernation for Azure virtual machines
- Microsoft Learn: States and billing status of Azure Virtual Machines
- Microsoft Learn: Stop-AzVM
- Microsoft Learn: Add session hosts to a host pool
- Microsoft Learn: Scheduled Agent Updates for Azure Virtual Desktop host pools
- Microsoft Learn: Licensing Azure Virtual Desktop
- Microsoft Learn: Apply Windows license to session host virtual machines
- Microsoft Learn: Explore Azure Hybrid Benefit for Windows VMs
- Microsoft Learn: What are Azure Reservations?
- Microsoft Learn: Save costs with Azure Reserved VM Instances
- Microsoft Learn: What are savings plans?
- Microsoft Learn: Decide between a savings plan and a reservation
- Microsoft Learn: Session host virtual machine sizing guidelines
- Microsoft Learn: Select a disk type for Azure IaaS VMs
- Microsoft Learn: Change the disk type of an Azure managed disk
- Microsoft Learn: Ephemeral OS disks on Azure Virtual Desktop
- Microsoft Learn: Ephemeral OS disks for Azure VMs
- Microsoft Learn: Find and delete unattached Azure managed and unmanaged disks
- Microsoft Learn: Delete a VM and its resources
- Microsoft Learn: Public IP addresses
- Microsoft Learn: Advisor cost recommendations
- Microsoft Learn: Storage options for FSLogix profile containers
- Microsoft Learn: Understand Azure Files billing
- Microsoft Learn: Estimate Azure Virtual Desktop monitoring costs
- Microsoft Learn: Use tags to organize your Azure resources
- Microsoft Learn: Cost Management best practices
Want the whole estate checked, read-only?
The Drop-in Assessment for Azure Virtual Desktop collects read-only data from your tenant, scores what it finds across session hosts, scaling plans, FSLogix and cost, and ends with an expert-reviewed report and a 60-minute readout. $2,500 fixed price, up to 500 users, one tenant.
Related guides
- AVD Session Host Unavailable or Needs Assistance: How to Fix
Fix an AVD session host stuck in Unavailable, Needs Assistance or Upgrade Failed: read the health checks, re-register the agent and test required URLs.
Microsoft, Azure and FSLogix are trademarks of the Microsoft group of companies. Sessionwright is not affiliated with or endorsed by Microsoft.