Copilot Studio Capacity Estimator
Agents are billed by what they do. Estimate sessions and the mix of answers and actions, turn them into monthly Copilot Credits, and compare prepaid capacity packs with pay-as-you-go.
How Copilot Studio is billed
Copilot Credits
Every agent event consumes credits: a simple scripted answer costs least, a generative answer more, and actions and answers grounded in your organization’s data cost the most.
Capacity packs or pay-as-you-go
A capacity pack buys 25,000 credits a month for a fixed price and is pooled across the tenant. Pay-as-you-go bills through an Azure subscription for what you use. Packs win once usage is steady; pay-as-you-go suits pilots and spiky use.
Microsoft 365 Copilot users
When people with a Microsoft 365 Copilot license use your agents inside Microsoft 365, those sessions are not billed against your credits.
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 Copilot Studio":{"c":[2400,210,240]}}; var $ = C2N.money, PACK = 25000; C2N.mount(document.getElementById('cs'), function (v) { var packPrice = P['Microsoft Copilot Studio'].c[0] / 12; var perSession = v.classic * v.rc + v.gen * v.rg + v.act * v.ra + v.graph * v.rt; var billed = v.agents * v.sessions * (1 - Math.min(100, v.lic) / 100), credits = Math.round(billed * perSession); var packs = Math.ceil(credits / PACK), packCost = packs * packPrice, paygCost = credits * v.payg; var mixPacks = Math.floor(credits / PACK), mixCost = mixPacks * packPrice + (credits - mixPacks * PACK) * v.payg; var best = Math.min(packCost, paygCost, mixCost), name = best === mixCost ? 'packs + pay-as-you-go overflow' : best === packCost ? 'capacity packs' : 'pay-as-you-go'; C2N.render(document.getElementById('cs-out'), { title: 'Copilot Studio', lead: '<strong>' + credits.toLocaleString('en-US') + ' credits a month</strong> from ' + Math.round(billed).toLocaleString('en-US') + ' billed sessions at ' + perSession.toFixed(1) + ' credits each. Cheapest: <strong>' + name + '</strong>.', kpis: [['Lowest monthly cost', $(best), name], ['Credits per month', credits.toLocaleString('en-US'), Math.round(credits / PACK * 100) + '% of one pack']], head: ['Option', 'Monthly', 'Yearly'], rows: [[packs + ' capacity pack' + (packs === 1 ? '' : 's') + ' (' + (packs * PACK).toLocaleString('en-US') + ' credits)', $(packCost), $(packCost * 12)], ['Pay-as-you-go', $(paygCost), $(paygCost * 12)], [mixPacks + ' pack' + (mixPacks === 1 ? '' : 's') + ' + pay-as-you-go overflow', $(mixCost), $(mixCost * 12)]], total: ['Best option', $(best), $(best * 12)], note: 'Capacity pack at Microsoft US list price (' + $(packPrice) + ' per pack per month, annual). Credit rates and pay-as-you-go price are editable; Azure meters bill pay-as-you-go use.', cta: ['Plan an agent pilot', '/tools/forms/?f=quote&items=' + encodeURIComponent('Copilot Studio: ' + v.agents + ' agents, ~' + credits + ' credits/month')] }); }); })();