Migration Estimator
Know the starting price before the first call. Tell us where your mail and files live today and how many people are moving. You get our fixed-price migration packages that fit and an estimate at our published starting prices.
What the packages include
Mailbox migration
Mail, calendars and contacts moved to Exchange Online, domain cutover planned around your business hours, and Outlook and phones re-pointed. Priced per mailbox.
File server to SharePoint
Your shares mapped to SharePoint sites and Teams, permissions cleaned up on the way, and content moved with versions kept where possible.
Autopilot rollout and Windows 11 upgrades
New devices ship straight to people and set themselves up through Intune; existing Windows 10 devices are upgraded in place where the hardware qualifies.
Why “from”
Starting prices assume typical data sizes. The migration questionnaire collects the details that firm up your fixed price; you approve it before any work starts.
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 MBX = 45, FILES = 3000, AUTOPILOT = 4500, W11 = 35, $ = C2N.money; var SRC = { google: 'Google Workspace', exchange: 'Exchange on-premises', imap: 'hosted mail', tenant: 'another Microsoft 365 tenant' }; C2N.mount(document.getElementById('mg'), function (v) { var scoped = v.src === 'tenant' || v.src === 'imap', rows = [], total = 0; if (v.mbx) { if (scoped) rows.push([v.mbx + ' mailboxes from ' + SRC[v.src], 'scoped', 'quote']); else { total += v.mbx * MBX; rows.push([v.mbx + ' mailboxes from ' + SRC[v.src], 'from ' + $(MBX), $(v.mbx * MBX)]); } } if (v.files === '1') { total += FILES; rows.push(['File server to SharePoint', 'from', $(FILES)]); } if (v.ap === '1') { total += AUTOPILOT; rows.push(['Windows Autopilot rollout', 'from', $(AUTOPILOT)]); } if (v.w11) { total += v.w11 * W11; rows.push([v.w11 + ' Windows 11 upgrades', 'from ' + $(W11), $(v.w11 * W11)]); } C2N.render(document.getElementById('mg-out'), { title: 'Migration estimate', unit: ' · Cloud2Networks services', lead: (scoped ? 'Migrations from ' + SRC[v.src] + ' are scoped individually; the questionnaire gets you a fixed price within a day. ' : '') + (total ? (scoped ? 'Everything else' : 'Your migration') + ' starts at <strong>' + $(total) + '</strong>, fixed price, approved by you before work begins.' : scoped ? '' : 'Choose what is moving to see an estimate.'), kpis: [['Estimated from', total ? $(total) : (scoped ? 'Quote' : '$0'), 'one-time, fixed price'], ['Per mailbox', scoped ? 'Scoped' : $(MBX), 'starting price']], head: ['Service', 'Unit', 'Estimate'], rows: rows.length ? rows : [['Nothing selected', '', '']], total: ['Estimated total', '', total ? 'from ' + $(total) : 'quote'], note: 'Cloud2Networks starting prices. Microsoft licenses are separate. Your fixed price follows the migration questionnaire.', cta: ['Get my fixed price', v.src === 'tenant' ? '/tools/forms/?f=tenant-to-tenant' : '/tools/forms/?f=m365-migration'] }); }); })();