Service Picker
Three questions, a short list, prices up front. Tell us what you are trying to get done, how big you are and where you stand today. We match you with the fixed-price Cloud2Networks services that fit, in the order we would do them.
How we price
Fixed price, approved first
Every project has a written scope and a fixed price you approve before work starts. “From” prices grow only with size you can see, such as mailboxes or devices.
Start small
Most clients start with an assessment. It produces a prioritized list, and you choose what to fix, with us or on your own.
Not sure?
Book a free security assessment and an engineer will point you at the right first step.
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 S = { m365sa: ['Microsoft 365 Security Assessment', 1500, 'fixed', '/services/microsoft-365/microsoft-365-security-assessment/'], mfa: ['MFA Enablement', 700, 'fixed', '/services/managed-security/mfa-enablement/'], esb: ['Endpoint Security Baseline', 3000, 'fixed', '/services/intune/endpoint-security-baseline/'], sat: ['Security Awareness Training', 3, 'usermo', '/services/managed-security/security-awareness-training/'], nist: ['NIST CSF Assessment', 4000, 'fixed', '/services/managed-security/nist-csf-assessment/'], dlp: ['DLP Policy Configuration', 2500, 'fixed', '/services/managed-security/dlp-policy-configuration/'], ret: ['Compliance and Retention Policies', 2500, 'fixed', '/services/purview/compliance-retention-policies/'], lab: ['Sensitivity Labels', 3500, 'fixed', '/services/purview/sensitivity-labels/'], mig: ['Mailbox migration', 45, 'user', '/projects/migrations/'], files: ['File server to SharePoint', 3000, 'from', '/projects/migrations/'], tsp: ['Teams and SharePoint Optimization', 2500, 'from', '/services/microsoft-365/teams-sharepoint-optimization/'], mm365: ['Managed Microsoft 365', 25, 'usermo', '/microsoft-365-managed-service/', 'from '], mint: ['Managed Intune', 8, 'devmo', '/intune-managed-service/'] }; var PICK = { secure: { none: ['mig', 'mfa', 'm365sa'], basic: ['m365sa', 'mfa', 'esb', 'sat'], mature: ['m365sa', 'esb', 'sat'] }, comply: { none: ['mig', 'nist', 'ret'], basic: ['nist', 'ret', 'dlp', 'lab'], mature: ['nist', 'dlp', 'lab'] }, move: { none: ['mig', 'files', 'mfa'], basic: ['files', 'tsp', 'm365sa'], mature: ['tsp', 'm365sa'] }, manage: { none: ['mig', 'mm365', 'mint'], basic: ['m365sa', 'mm365', 'mint'], mature: ['mm365', 'mint', 'sat'] } }; var $ = C2N.money; C2N.mount(document.getElementById('sp'), function (v) { var users = Math.max(1, v.users), list = PICK[v.goal][v.today], once = 0, monthly = 0, from = false; var rows = list.map(function (k, i) { var s = S[k], unit = s[2], est = unit === 'user' ? s[1] * users : unit === 'usermo' ? s[1] * users : unit === 'devmo' ? s[1] * users : s[1]; if (unit === 'usermo' || unit === 'devmo') monthly += est; else { once += est; from = from || unit !== 'fixed'; } var label = unit === 'fixed' ? $(s[1]) + ' fixed' : unit === 'from' ? 'from ' + $(s[1]) : unit === 'user' ? 'from ' + $(s[1]) + ' / user' : unit === 'usermo' ? (s[4] || '') + $(s[1]) + ' / user / mo' : 'from ' + $(s[1]) + ' / device / mo'; return [(i + 1) + '. <a href="' + s[3] + '">' + s[0] + '</a>', label, (unit === 'usermo' || unit === 'devmo' ? $(est) + ' / mo' : (unit === 'fixed' ? '' : 'from ') + $(est))]; }); C2N.render(document.getElementById('sp-out'), { title: 'Your shortlist', unit: ' · Cloud2Networks services', lead: 'For ' + users + ' users, in the order we would do them. Click a service to read what is included.', kpis: [['One-time projects', once ? (from ? 'from ' : '') + $(once) : '$0', 'fixed price, approved first'], ['Ongoing', monthly ? $(monthly) + ' / mo' : 'None', monthly ? 'per month, cancel any time' : 'no recurring services']], head: ['Service', 'Price', 'For you'], rows: rows, note: 'Cloud2Networks published prices. Microsoft licenses are separate. Device counts assume one device per user.', cta: ['Talk to an engineer', '/tools/forms/?f=quote&items=' + encodeURIComponent(users + ' users, goal: ' + v.goal + '; shortlist: ' + list.map(function (k) { return S[k][0]; }).join(', '))] }); }); })();