Microsoft 365 Cost Calculator
Same seats, three ways to commit. Enter your plan mix and see the yearly cost on annual upfront, annual billed monthly and monthly terms, plus a split that keeps your flexible seats on monthly so you can drop them without paying for the full year.
How the three terms work
Annual, paid upfront
One-year commitment, billed once. The lowest price per seat. You can add seats any time; you cannot remove them until the renewal date.
Annual, billed monthly
The same one-year commitment, paid in twelve installments. Microsoft charges about 5% more than paying upfront. Seats still cannot be removed mid-term.
Monthly
A rolling one-month term, about 20% above the annual upfront price. Cancel or reduce seats at the end of any month. Worth it only for seats you expect to drop.
The seven-day rule
After you buy or renew, you have seven days (168 hours) to reduce or cancel seats for a prorated refund. After that, annual seats are locked until renewal. Count carefully before day seven.
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 = {"Microsoft 365 Business Basic":{"c":[84,7.35,8.4]},"Microsoft 365 Business Standard":{"c":[168,14.7,16.8]},"Microsoft 365 Business Standard (Non-Profit Pricing)":{"n":[42,3.68,4.2]},"Microsoft 365 Business Premium":{"c":[264,23.1,26.4]},"Microsoft 365 Business Premium (Nonprofit Staff Pricing)":{"n":[66,5.77,6.6]},"Microsoft 365 E3":{"c":[468,40.95,46.8]},"Microsoft 365 E3 (Non-Profit Pricing)":{"n":[117,10.24,11.7]},"Microsoft 365 E5":{"c":[720,63,72]},"Microsoft 365 E5 (Non-Profit Pricing)":{"n":[288,25.2,28.8]},"Microsoft 365 F3":{"c":[120,10.5,12]},"Microsoft 365 F3 (Non-Profit Pricing)":{"n":[30,2.63,3]},"Office 365 E1":{"c":[120,10.5,12]},"Office 365 E1 (Non-Profit Pricing)":{"n":[30,2.63,3]},"Office 365 E3":{"c":[312,27.3,31.2]},"Office 365 E3 (Non-Profit Pricing)":{"n":[78,6.82,7.8]},"Microsoft 365 Copilot (add-on)":{"c":[360,31.5,null]},"Microsoft 365 Copilot (Non-Profit Pricing) (add-on)":{"n":[306,26.78,null]}}; var PLANS = [['bb', 'Business Basic', 'Microsoft 365 Business Basic', 'Microsoft 365 Business Basic'], ['bs', 'Business Standard', 'Microsoft 365 Business Standard', 'Microsoft 365 Business Standard (Non-Profit Pricing)'], ['bp', 'Business Premium', 'Microsoft 365 Business Premium', 'Microsoft 365 Business Premium (Nonprofit Staff Pricing)'], ['e3', 'Microsoft 365 E3', 'Microsoft 365 E3', 'Microsoft 365 E3 (Non-Profit Pricing)'], ['e5', 'Microsoft 365 E5', 'Microsoft 365 E5', 'Microsoft 365 E5 (Non-Profit Pricing)'], ['f3', 'Microsoft 365 F3', 'Microsoft 365 F3', 'Microsoft 365 F3 (Non-Profit Pricing)'], ['o1', 'Office 365 E1', 'Office 365 E1', 'Office 365 E1 (Non-Profit Pricing)'], ['o3', 'Office 365 E3', 'Office 365 E3', 'Office 365 E3 (Non-Profit Pricing)'], ['cp', 'Copilot (add-on)', 'Microsoft 365 Copilot (add-on)', 'Microsoft 365 Copilot (Non-Profit Pricing) (add-on)']]; var $ = C2N.money; C2N.mount(document.getElementById('mc'), function (v) { var flex = Math.min(100, v.flex) / 100, up = 0, bm = 0, mo = 0, split = 0, rows = [], items = [], missing = []; PLANS.forEach(function (pl) { var n = v[pl[0]]; if (!n) return; var row = (P[pl[v.seg === 'n' ? 3 : 2]] || {})[v.seg]; if (!row) { missing.push(pl[1]); return; } var a = row[0], b = row[1] * 12, m = row[2] === null ? b : row[2] * 12, fl = row[2] === null ? 0 : Math.round(n * flex); up += n * a; bm += n * b; mo += n * m; split += (n - fl) * a + fl * m; rows.push([n + ' x ' + pl[1], $(a / 12, 2), $(n * a), $(n * m)]); items.push(n + ' x ' + pl[2]); }); C2N.render(document.getElementById('mc-out'), { title: 'Microsoft 365', lead: rows.length ? 'Annual upfront is <strong>' + $(mo - up) + ' a year cheaper</strong> than going all-monthly. Keeping ' + Math.round(flex * 100) + '% of seats on monthly costs ' + $(split - up) + ' a year for that flexibility.' : 'Enter seats on the left to see your totals.', kpis: [['Annual, paid upfront', $(up), $(up / 12) + ' per month'], ['Annual + ' + Math.round(flex * 100) + '% monthly', $(split), 'per year, flexible seats can drop']], head: ['Plan', 'Per seat / mo', 'Annual', 'Monthly term'], rows: rows.length ? rows.concat([['Annual, billed monthly', '', $(bm), '']]) : [['No seats entered', '', '', '']], total: ['Total per year', '', $(up), $(mo)], note: 'Microsoft US list price, current month.' + (missing.length ? ' Not sold in this segment: ' + missing.join(', ') + '.' : '') + ' A person confirms every quote.', cta: ['Request a quote', '/tools/forms/?f=quote&items=' + encodeURIComponent(items.join('; ') + (items.length ? '; est. ' + $(up) + '/yr annual upfront' : ''))] }); }); })();