Savings Calculator

See the true cost of your next accounting hire.

Compare the fully-loaded annual cost of hiring an accounting professional locally in the US or Canada against a fully managed Caribbean hire through Synapse Global. Select a role and location to see your breakdown instantly.

⚡ 30-second estimate

Most companies overpay for accounting talent by tens of thousands every year and never realise it. See exactly what your team could save.

Calculate my savings ↓
Select an accounting role and a location above to see a full side-by-side cost comparison.
'; } // Download the report as an .html file (reliable; no popup blockers) function downloadReport(lead){ var blob = new Blob([buildReportHTML(lead)], { type: 'text/html' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'Synapse-Global-Savings-Report.html'; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function(){ URL.revokeObjectURL(url); }, 1000); } var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; /* Validate, then POST lead + calculation to the Netlify Function which builds the filled PowerPoint and emails it to the prospect (BCC sales). Team mode falls back to the previous local HTML download because the PPTX template is built around a single role/location. */ function handleExport(form){ var error = form.querySelector('#exportError'); var required = ['firstName', 'lastName', 'email', 'company']; var valid = true; required.forEach(function(name){ var field = form.querySelector('[name="' + name + '"]'); var ok = field.value.trim().length > 0; if (name === 'email') ok = EMAIL_RE.test(field.value.trim()); field.classList.toggle('is-error', !ok); if (!ok) valid = false; }); if (!valid){ error.hidden = false; error.textContent = 'Please enter your first and last name, a valid work email, and your company.'; return; } error.hidden = true; var btn = form.querySelector('[type="submit"]'); btn.disabled = true; btn.textContent = 'Sending…'; var lead = { firstName: form.firstName.value.trim(), lastName: form.lastName.value.trim(), email: form.email.value.trim(), phone: form.phone.value.trim(), company: form.company.value.trim(), teamSize: form.teamSize.value.trim() }; // Success / error UI helpers function showSuccess(email){ var wrap = document.getElementById('exportFormWrap'); wrap.innerHTML = '
' + '
' + '
Your proposal is on the way.
' + '
We just emailed your tailored savings proposal to ' + escapeHtml(email) + '. Check your inbox in the next minute or two. Our team has been notified and will follow up shortly.
' + '
'; } function showError(msg){ btn.disabled = false; btn.textContent = 'Send my report'; error.hidden = false; error.textContent = msg || 'Something went wrong sending your proposal. Please try again or email sales@synapseglobalsolutions.com.'; } /* ---- Build the payload: team mode sends a hires[] array; single sends local/caribbean. ---- */ var payload; if (lastResult && lastResult.mode !== 'Single role'){ if (!lastResult.hires || !lastResult.hires.length){ showError('No team data found. Please add at least one role.'); return; } payload = { lead: lead, calc: { location: lastResult.location, hires: lastResult.hires } }; } else { if (!lastResult || !lastResult.local || !lastResult.caribbean){ showError('No calculation found. Please run the calculator first.'); return; } payload = { lead: lead, calc: { role: lastResult.role, location: lastResult.location, local: lastResult.local, caribbean: lastResult.caribbean, savings: lastResult.savings, pct: lastResult.pct } }; } fetch('/.netlify/functions/send-proposal', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }) .then(function(res){ return res.json().then(function(body){ return { ok: res.ok, body: body }; }); }) .then(function(r){ if (r.ok && r.body && r.body.ok) { showSuccess(lead.email); } else { showError((r.body && r.body.error) || 'Email service error. Please try again.'); } }) .catch(function(){ showError('Network error. Please try again in a moment.'); }); } // Delegated export events (the output container is re-rendered each calculation) output.addEventListener('click', function(e){ if (e.target.closest('[data-export-open]')){ var intro = document.getElementById('exportIntro'); var wrap = document.getElementById('exportFormWrap'); if (intro) intro.style.display = 'none'; if (wrap){ wrap.hidden = false; var first = wrap.querySelector('input[name="firstName"]'); if (first) first.focus(); } } }); output.addEventListener('submit', function(e){ if (e.target && e.target.id === 'exportForm'){ e.preventDefault(); handleExport(e.target); } });