Design Blast

#db-pac{--blue:#1769e0;--navy:#102a56;--ink:#202b3c;--muted:#667085;--line:#e3e9f2;--soft:#f5f8fd;font-family:Inter,Arial,sans-serif;color:var(--ink);max-width:1050px;margin:auto;font-size:15px} #db-pac *{box-sizing:border-box} #db-pac .pac-card{background:#fff;border:1px solid var(--line);border-radius:16px;padding:24px;margin-bottom:18px;box-shadow:0 5px 24px rgba(16,42,86,.045)} #db-pac h2,#db-pac h3{color:var(--navy);margin:0 0 8px;line-height:1.35} #db-pac h2{font-size:28px}#db-pac h3{font-size:19px} #db-pac p{color:var(--muted);line-height:1.65;margin:0} #db-pac .pac-eyebrow{font-size:12px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;color:var(--blue);margin-bottom:8px} #db-pac .pac-intro{margin-bottom:22px} #db-pac .pac-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px} #db-pac .pac-field{margin-bottom:17px;min-width:0} #db-pac label{display:block;font-size:13px;font-weight:700;color:#344054;margin-bottom:8px} #db-pac input[type=number]{display:block;width:100%;min-width:0;border:1px solid #d5dce7;border-radius:9px;padding:12px;font:inherit;color:var(--ink);background:#fff} #db-pac input:focus-visible{outline:2px solid var(--blue);outline-offset:2px} #db-pac .pac-hint{font-size:12px;margin-top:7px} #db-pac .pac-total{display:flex;justify-content:space-between;gap:14px;align-items:center;background:var(--soft);border:1px solid var(--line);border-radius:12px;padding:16px;margin-top:2px} #db-pac .pac-total span{color:var(--muted);font-size:13px} #db-pac .pac-total strong{color:var(--navy);font-size:23px;text-align:right} #db-pac .pac-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:20px} #db-pac button,#db-pac .pac-cta{border:1px solid transparent;border-radius:9px;padding:12px 17px;font:inherit;font-size:14px;font-weight:750;cursor:pointer;text-decoration:none;display:inline-flex;align-items:center;justify-content:center} #db-pac .pac-primary{background:var(--blue);color:white} #db-pac .pac-primary:hover{background:#1056bd} #db-pac .pac-secondary{background:white;color:var(--navy);border-color:#d5dce7} #db-pac .pac-secondary:hover{background:var(--soft)} #db-pac button:focus-visible,#db-pac a:focus-visible{outline:3px solid #8ab8ff;outline-offset:2px} #db-pac .pac-results-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:13px;margin-top:20px} #db-pac .pac-stat{border:1px solid var(--line);background:var(--soft);border-radius:12px;padding:17px;min-width:0} #db-pac .pac-stat span{display:block;color:var(--muted);font-size:12px;margin-bottom:8px} #db-pac .pac-stat strong{display:block;color:var(--navy);font-size:27px;overflow-wrap:anywhere} #db-pac .pac-stat small{display:block;color:var(--muted);font-size:12px;margin-top:7px;line-height:1.5} #db-pac .pac-metric-title{margin-top:20px} #db-pac .pac-bar-row{margin-top:17px} #db-pac .pac-bar-head{display:flex;justify-content:space-between;gap:12px;margin-bottom:7px;font-size:13px} #db-pac .pac-track{height:9px;border-radius:20px;background:#e9eef6;overflow:hidden} #db-pac .pac-fill{height:100%;width:0;background:var(--blue);border-radius:20px;transition:width .25s} #db-pac .pac-scenario{background:#f5f8fd;border:1px solid var(--line);border-radius:12px;padding:20px;margin-top:18px} #db-pac .pac-scenario input[type=range]{width:100%;accent-color:var(--blue);margin:10px 0} #db-pac .pac-scenario strong{color:var(--navy)} #db-pac .pac-callout{padding:14px;border:1px solid var(--line);border-radius:10px;margin-top:14px;font-size:13px;color:var(--muted);line-height:1.65} #db-pac .pac-cta-wrap{background:var(--soft);border-radius:12px;padding:20px;margin-top:20px} #db-pac [hidden]{display:none!important} @media(max-width:650px){#db-pac .pac-card{padding:17px}#db-pac h2{font-size:23px}#db-pac .pac-grid{grid-template-columns:1fr;gap:0}#db-pac .pac-results-grid{grid-template-columns:1fr 1fr}#db-pac .pac-stat{padding:13px}#db-pac .pac-stat strong{font-size:22px}#db-pac .pac-actions button,#db-pac .pac-actions .pac-cta{flex:1 1 100%}#db-pac .pac-total strong{font-size:20px}}
Free Healthcare Business Tool

Patient Acquisition Cost Calculator

Calculate what your clinic spends to generate enquiries and acquire new patients. Explore how better enquiry conversion could affect your acquisition costs.

1. Monthly marketing costs

Enter your average monthly costs. Include only costs relevant to the period you're measuring.

Google Ads, Meta Ads, or other paid campaigns.

SEO, social media, content, or agency fees.

Relevant salaries, tools, or outsourced support.

Use the same period for costs, enquiries, and acquired patients.

Total marketing cost for the period ₹40,000

2. Enquiries and new patients

Use actual counts for the same period, if available. Count new patients attributable to the marketing activity being measured.

Relevant calls, forms, messages, or other enquiries.

New patients actually acquired, not just appointments requested.

(function(){ const root=document.getElementById('db-pac'); if(!root || root.dataset.ready==='1') return; root.dataset.ready='1'; const $=id=>root.querySelector('#pac-'+id); const costFields=['ads','agency','staff']; let latest=null;function num(id){ const el=$(id); const v=Number(el.value); return el.value.trim()==='' || !Number.isFinite(v) ? 0 : Math.max(0,v); } function money(v){ if(!Number.isFinite(v)) return 'N/A'; return '₹'+v.toLocaleString('en-IN',{maximumFractionDigits:2}); } function pct(v){ return Number.isFinite(v) ? v.toFixed(1)+'%' : 'N/A'; } function inputs(){ const period=Math.max(1,Math.min(60,Math.floor(num('period')||1))); const ads=num('ads'),agency=num('agency'),staff=num('staff'); const leads=Math.floor(num('leads')),patients=Math.floor(num('patients')); return {period,ads,agency,staff,cost:(ads+agency+staff),leads,patients}; } function updateTotal(){ $('total').textContent=money(inputs().cost); } function scenario(){ if(!latest) return; const r=latest; const rate=num('target'); const estimated=r.leads*rate/100; const estimatedCPA=estimated>0?r.cost/estimated:null; const currentCPA=r.patients>0?r.cost/r.patients:null; $('target-label').textContent=rate+'%'; $('s-patients').textContent=estimated.toLocaleString('en-IN',{maximumFractionDigits:1}); $('s-cpa').textContent=estimatedCPA===null?'N/A':money(estimatedCPA); const change=(currentCPA!==null && estimatedCPA!==null && currentCPA>0) ? (estimatedCPA-currentCPA)/currentCPA*100 : null; $('s-change').textContent=change===null?'N/A':(change>0?'+':'')+change.toFixed(1)+'%'; $('s-difference').textContent=(estimated-r.patients>0?'+':'')+(estimated-r.patients).toLocaleString('en-IN',{maximumFractionDigits:1}); $('s-note').textContent=rate===0 ? 'At a 0% conversion assumption, the model estimates no new patients from these enquiries; cost per patient cannot be calculated.' : 'This scenario assumes the same '+r.leads+' enquiries and ₹'+r.cost.toLocaleString('en-IN',{maximumFractionDigits:2})+' marketing cost. Actual outcomes may differ.'; } function calculate(){ const r=inputs(); if(r.cost===0){ $('status').textContent='Enter at least one non-zero marketing cost to calculate acquisition costs.'; $('results').hidden=true;return; } if(r.leads===0 && r.patients>0){ $('status').textContent='New patients cannot exceed zero enquiries. Check the figures.'; $('results').hidden=true;return; } if(r.patients>r.leads){ $('status').textContent='New patients cannot exceed enquiries in this calculator. Check that both counts use the same period and attribution method.'; $('results').hidden=true;return; } latest=r; const conversion=r.leads>0?r.patients/r.leads*100:null; const cpl=r.leads>0?r.cost/r.leads:null; const cpa=r.patients>0?r.cost/r.patients:null; $('results').hidden=false; $('subtitle').textContent='Measurement period: '+r.period+' month'+(r.period===1?'':'s')+'. All figures use the totals entered for that period.'; $('r-cost').textContent=money(r.cost); $('r-cpl').textContent=cpl===null?'N/A':money(cpl); $('r-cpa').textContent=cpa===null?'N/A':money(cpa); $('r-conversion').textContent=conversion===null?'N/A':pct(conversion); $('bar-label').textContent=conversion===null?'N/A':pct(conversion); $('bar-fill').style.width=(conversion===null?0:Math.min(100,conversion))+'%'; const notes=[]; if(r.leads===0) notes.push('No enquiries were entered, so cost per enquiry and conversion rate cannot be calculated.'); if(r.patients===0) notes.push('No acquired patients were entered, so cost per acquired patient cannot be calculated.'); if(r.leads>0 && r.patients>0) notes.push('Your figures imply '+r.patients+' acquired patients from '+r.leads+' enquiries.'); notes.push('For reliable comparisons, use the same attribution window and include relevant marketing costs consistently.'); $('validation').textContent=notes.join(' '); const target=$('target'); target.value=String(Math.max(0,Math.min(100,Math.round(conversion===null?35:conversion)))); const params=new URLSearchParams(); params.set('tool','patient-acquisition-cost'); params.set('monthly_cost',String(Math.round(r.cost/r.period))); params.set('period_months',String(r.period)); $('contact').href='https://designblast.org/contact/?'+params.toString(); scenario(); $('status').textContent='Calculation complete. Your report is ready below.'; $('results').scrollIntoView({behavior:'smooth',block:'start'}); } function summary(){ if(!latest)return ''; const r=latest; const rate=r.leads>0?r.patients/r.leads*100:null; const cpl=r.leads>0?r.cost/r.leads:null; const cpa=r.patients>0?r.cost/r.patients:null; const targetRate=num('target'); const targetPatients=r.leads*targetRate/100; const targetCPA=targetPatients>0?r.cost/targetPatients:null; return [ 'PATIENT ACQUISITION COST REPORT', 'Measurement period: '+r.period+' month(s)', 'Advertising spend: '+money(r.ads), 'Agency/service costs: '+money(r.agency), 'Staff/other costs: '+money(r.staff), 'Total cost: '+money(r.cost), 'Enquiries: '+r.leads, 'New patients: '+r.patients, 'Cost per enquiry: '+(cpl===null?'N/A':money(cpl)), 'Cost per acquired patient: '+(cpa===null?'N/A':money(cpa)), 'Enquiry-to-patient conversion: '+(rate===null?'N/A':pct(rate)), '', 'SCENARIO', 'Assumed conversion: '+targetRate+'%', 'Estimated patients: '+targetPatients.toLocaleString('en-IN',{maximumFractionDigits:1}), 'Estimated cost per patient: '+(targetCPA===null?'N/A':money(targetCPA)), '', 'Note: Estimates use user-entered figures and are not guarantees of marketing results.' ].join('\n'); } function download(){ if(!latest)return; const blob=new Blob(['\uFEFF'+summary()],{type:'text/plain;charset=utf-8'}); const url=URL.createObjectURL(blob); const a=document.createElement('a'); a.href=url;a.download='patient-acquisition-cost-report.txt'; document.body.appendChild(a);a.click();a.remove(); setTimeout(()=>URL.revokeObjectURL(url),1000); } async function copy(){ if(!latest)return; try{ if(navigator.clipboard&&navigator.clipboard.writeText){ await navigator.clipboard.writeText(summary()); }else{ const t=document.createElement('textarea'); t.value=summary();t.style.position='fixed';t.style.opacity='0'; root.appendChild(t);t.select(); const ok=document.execCommand('copy');t.remove(); if(!ok)throw new Error('copy failed'); } $('status').textContent='Summary copied.'; }catch(e){ $('status').textContent='Copy was blocked by your browser. Use Download Report instead.'; } } [...costFields,'period'].forEach(id=>$(id).addEventListener('input',updateTotal)); $('calculate').addEventListener('click',calculate); $('target').addEventListener('input',scenario); $('download').addEventListener('click',download); $('copy').addEventListener('click',copy); $('example').addEventListener('click',function(){ $('ads').value=20000;$('agency').value=15000;$('staff').value=5000; $('period').value=1;$('leads').value=100;$('patients').value=25; updateTotal();calculate(); }); $('reset').addEventListener('click',function(){ $('ads').value=0;$('agency').value=0;$('staff').value=0; $('period').value=1;$('leads').value=0;$('patients').value=0; $('target').value=35;latest=null; updateTotal();$('results').hidden=true; $('status').textContent='Calculator reset.'; }); updateTotal(); })();