Sessionwright

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

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

Microsoft, Azure and FSLogix are trademarks of the Microsoft group of companies. Sessionwright is not affiliated with or endorsed by Microsoft.