Windows Server Licensing Calculator
Every physical core is licensed, with minimums. Enter your hosts and VMs: the calculator applies the 8-core-per-processor and 16-core-per-server floors, stacks Standard to cover your VMs, compares it with Datacenter, and adds the CALs you need.
The rules this calculator applies
Every physical core is licensed, with minimums
Windows Server 2025 Standard and Datacenter are licensed per physical core. Each processor counts as at least 8 cores and each server as at least 16, even if it has fewer. Licenses are sold in 2-core and 16-core packs.
Standard covers two VMs; stack it for more
Licensing every core of a host with Standard lets you run two Windows Server virtual machines on it. To run two more, license all the cores again. Ten VMs on one host means five full sets of Standard licenses.
Datacenter covers unlimited VMs
License every core with Datacenter once and you can run as many Windows Server VMs on that host as it can hold. At list price the break-even is around 11 VMs per host for 16 to 32 cores; the calculator shows the exact point for your core count and purchase type.
CALs are still needed
Every user or device that accesses the server needs a Windows Server CAL, unless their Microsoft 365 E3, E5 or F3 license already includes the right. Remote Desktop Services needs its own RDS CAL on top.
window.C2N = (function () { function esc(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } function fire(el) { el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); } function enhance(form) { [].forEach.call(form.querySelectorAll('select[data-seg]'), function (sel) { var seg = document.createElement('div'); seg.className = 'c2n-seg'; seg.setAttribute('role', 'radiogroup'); seg.style.gridTemplateColumns = 'repeat(' + Math.min(sel.options.length, +sel.dataset.seg || sel.options.length) + ',1fr)'; [].forEach.call(sel.options, function (o) { var b = document.createElement('button'); b.type = 'button'; b.textContent = o.textContent; b.dataset.v = o.value; b.setAttribute('role', 'radio'); b.addEventListener('click', function () { sel.value = o.value; sync(form); fire(sel); }); seg.appendChild(b); }); sel.hidden = true; sel.parentNode.insertBefore(seg, sel.nextSibling); }); [].forEach.call(form.querySelectorAll('input[data-range]'), function (num) { var r = num.dataset.range.split(','), rg = document.createElement('input'); rg.type = 'range'; rg.min = r[0]; rg.max = r[1]; rg.step = r[2] || 1; rg.className = 'c2n-range'; rg.setAttribute('aria-label', num.name); rg.addEventListener('input', function (e) { e.stopPropagation(); num.value = rg.value; fire(num); }); num.parentNode.appendChild(rg); }); } function sync(form) { [].forEach.call(form.querySelectorAll('select[data-seg]'), function (sel) { [].forEach.call(sel.nextSibling.children, function (b) { var on = b.dataset.v === sel.value; b.classList.toggle('on', on); b.setAttribute('aria-checked', on); }); }); [].forEach.call(form.querySelectorAll('input[data-range]'), function (num) { num.parentNode.querySelector('.c2n-range').value = num.value; }); } function render(el, r) { var h = '<div class="c2n-cx-bar"><span>Results · ' + esc(r.title) + (r.unit === undefined ? ' · USD' : r.unit) + '</span><span class="c2n-cx-live">Live</span></div>'; if (r.lead) h += '<p class="c2n-cx-lead">' + r.lead + '</p>'; if (r.kpis) h += '<div class="c2n-cx-kpis">' + r.kpis.map(function (k, i) { return '<div class="c2n-cx-kpi' + (i ? '' : ' on') + '"><small>' + esc(k[0]) + '</small><b>' + k[1] + '</b><span>' + (k[2] || '') + '</span></div>'; }).join('') + '</div>'; if (r.rows) { var cell = function (tag) { return function (c, i) { return '<' + tag + (i ? ' class="n"' : '') + '>' + c + '</' + tag + '>'; }; }; h += '<div class="c2n-cx-scroll"><table class="c2n-cx-table">' + (r.head ? '<tr>' + r.head.map(cell('th')).join('') + '</tr>' : '') + r.rows.map(function (row) { return '<tr>' + row.map(cell('td')).join('') + '</tr>'; }).join('') + (r.total ? '<tr class="t">' + r.total.map(cell('td')).join('') + '</tr>' : '') + '</table></div>'; } h += '<div class="c2n-cx-foot"><p>' + (r.note || '') + '</p>' + (r.cta ? '<a class="c2n-cx-btn" href="' + esc(r.cta[1]) + '">' + esc(r.cta[0]) + '</a>' : '') + '</div>'; el.innerHTML = h; } function money(n, d) { return (n < 0 ? '-$' : '$') + Math.abs(n).toLocaleString('en-US', { minimumFractionDigits: d || 0, maximumFractionDigits: d || 0 }); } function values(form) { var v = {}; [].forEach.call(form.elements, function (el) { if (el.name) v[el.name] = el.type === 'number' ? Math.max(0, +el.value || 0) : el.value; }); return v; } function restore(form) { var q = new URLSearchParams(location.search); [].forEach.call(form.elements, function (el) { if (el.name) { if (q.has(el.name)) el.value = q.get(el.name); } }); } function save(form) { var o = {}; [].forEach.call(form.elements, function (el) { if (el.name) o[el.name] = el.value; }); history.replaceState(null, '', '?' + new URLSearchParams(o)); } function mount(form, calc) { enhance(form); restore(form); var run = function () { sync(form); calc(values(form)); save(form); }; form.addEventListener('input', run); form.addEventListener('submit', function (e) { e.preventDefault(); }); run(); } return { mount: mount, render: render, money: money, esc: esc, sync: sync, enhance: enhance }; })(); (function () { var P = {"Windows Server 2025 Standard - 2 Core":{"Education|One-time purchase (perpetual)":36.0,"Commercial|One-time purchase (perpetual)":147.0,"Nonprofit|One-time purchase (perpetual)":58.0},"Windows Server 2025 Standard - 16 Core License Pack":{"Nonprofit|One-time purchase (perpetual)":470.0,"Commercial|One-time purchase (perpetual)":1176.0,"Education|One-time purchase (perpetual)":294.0},"Windows Server 2025 Datacenter - 2 Core":{"Nonprofit|One-time purchase (perpetual)":338.0,"Commercial|One-time purchase (perpetual)":846.0,"Education|One-time purchase (perpetual)":211.0},"Windows Server 2025 Datacenter - 16 Core":{"Commercial|One-time purchase (perpetual)":6770.0,"Nonprofit|One-time purchase (perpetual)":2708.0,"Education|One-time purchase (perpetual)":1692.0},"Windows Server 2025 Standard - 2 Core License Pack 1 Year":{"Commercial|1-year subscription, billed annually":68.0,"Commercial|1-year subscription, billed monthly":71.4},"Windows Server 2025 Standard - 8 Core License Pack 1 Year":{"Commercial|1-year subscription, billed annually":275.0,"Commercial|1-year subscription, billed monthly":288.72},"Windows Server 2025 Datacenter - 2 Core License Pack 1 Year":{"Commercial|1-year subscription, billed annually":478.0,"Commercial|1-year subscription, billed monthly":501.84},"Windows Server 2025 Datacenter - 8 Core License Pack 1 Year":{"Commercial|1-year subscription, billed annually":1913.0,"Commercial|1-year subscription, billed monthly":2008.68},"Windows Server 2025 - 1 User CAL":{"Education|One-time purchase (perpetual)":12.0,"Nonprofit|One-time purchase (perpetual)":20.0,"Commercial|One-time purchase (perpetual)":50.0},"Windows Server 2025 - 1 Device CAL":{"Commercial|One-time purchase (perpetual)":39.0,"Nonprofit|One-time purchase (perpetual)":15.0,"Education|One-time purchase (perpetual)":9.0},"Windows Server 2025 CAL - 1 User CAL - 1 year":{"Commercial|1-year subscription, billed monthly":14.64,"Commercial|1-year subscription, billed annually":14.0},"Windows Server 2025 CAL - 1 Device CAL - 1 year":{"Commercial|1-year subscription, billed annually":12.0,"Commercial|1-year subscription, billed monthly":12.6},"Windows Server 2025 Remote Desktop Services - 1 User CAL":{"Nonprofit|One-time purchase (perpetual)":34.0,"Commercial|One-time purchase (perpetual)":174.0,"Education|One-time purchase (perpetual)":34.0},"Windows Server 2025 Remote Desktop Services - 1 User CAL 1 Year":{"Commercial|1-year subscription, billed annually":90.0,"Commercial|1-year subscription, billed monthly":94.44}}; var perp = 'Commercial|One-time purchase (perpetual)', yr = 'Commercial|1-year subscription, billed annually', $ = C2N.money; function p(name, key) { return (P[name] || {})[key]; } function coreCost(ed, cores, term) { if (term === 'p') return Math.floor(cores / 16) * p(ed === 'Standard' ? 'Windows Server 2025 Standard - 16 Core License Pack' : 'Windows Server 2025 Datacenter - 16 Core', perp) + (cores % 16) / 2 * p('Windows Server 2025 ' + ed + ' - 2 Core', perp); return Math.floor(cores / 8) * p('Windows Server 2025 ' + ed + ' - 8 Core License Pack 1 Year', yr) + (cores % 8) / 2 * p('Windows Server 2025 ' + ed + ' - 2 Core License Pack 1 Year', yr); } C2N.mount(document.getElementById('ws'), function (v) { var hosts = Math.max(1, v.hosts), perHost = Math.max(16, Math.max(1, v.cpus) * Math.max(8, v.cores)); perHost += perHost % 2; var stacks = Math.max(1, Math.ceil(v.vms / 2)), stdOnce = coreCost('Standard', perHost, v.term), dcOnce = coreCost('Datacenter', perHost, v.term); var std = stdOnce * stacks * hosts, dc = dcOnce * hosts, breakEven = 2 * Math.floor(dcOnce / stdOnce) + 1; var who = v.caltype === 'u' ? 'User' : 'Device', calN = Math.max(0, v.users - v.covered); var cal = calN * p(v.term === 'p' ? 'Windows Server 2025 - 1 ' + who + ' CAL' : 'Windows Server 2025 CAL - 1 ' + who + ' CAL - 1 year', v.term === 'p' ? perp : yr); var rds = v.rds * (v.term === 'p' ? p('Windows Server 2025 Remote Desktop Services - 1 User CAL', perp) : p('Windows Server 2025 Remote Desktop Services - 1 User CAL 1 Year', yr)); var best = std <= dc ? 'Standard' : 'Datacenter', total = Math.min(std, dc) + cal + rds, unit = v.term === 'p' ? 'one-time' : 'per year'; C2N.render(document.getElementById('ws-out'), { title: 'Windows Server 2025', lead: '<strong>' + best + ' is cheaper</strong> for ' + v.vms + ' VMs per host. With ' + perHost + ' licensed cores per host, Datacenter wins from ' + breakEven + ' VMs per host.', kpis: [['Total, ' + best, $(total), unit], ['Saving vs ' + (best === 'Standard' ? 'Datacenter' : 'Standard'), $(Math.abs(dc - std)), 'on server licenses']], head: ['Line item', 'Standard', 'Datacenter'], rows: [ ['Cores licensed per host', perHost, perHost], ['License sets per host', stacks + ' (' + stacks * 2 + ' VMs)', '1 (unlimited VMs)'], ['Server licenses, ' + hosts + ' host' + (hosts > 1 ? 's' : ''), $(std), $(dc)], [calN + ' Windows Server ' + who + ' CALs', $(cal), $(cal)], [v.rds + ' RDS User CALs', $(rds), $(rds)] ], total: ['Total, ' + unit, $(std + cal + rds), $(dc + cal + rds)], note: 'Microsoft US list price, Commercial, current month. A person confirms every quote.', cta: ['Request a quote', '/tools/forms/?f=quote&items=' + encodeURIComponent(hosts + ' hosts x ' + perHost + ' cores, Windows Server 2025 ' + best + (v.term === 'p' ? ' perpetual' : ' 1-year') + '; ' + calN + ' ' + who + ' CALs; ' + v.rds + ' RDS CALs; est. ' + $(total) + ' ' + unit)] }); }); })();