'); w.document.close(); w.print(); }, [cp, empN, op.scenario, idealBenefitsCostData, peoAnnual, currentPeoCost, peoChangeAmount, turnoverIdeal, turnoverPeo, attractionIdeal, attractionPeo, tthCalcIdeal, tthCalcPeo, prodValueIdeal, prodValuePeo, hrTimeSavings, hrChValue, compValue, wcSavings, currentSat, idealSat, peoSat, avgSal, hvSalary, replPctTyp, replPctHV, replCostTyp, replCostHV, hvExtraRevenue, totalLeaveC, totalLeaveIdeal, totalLeavePeo, hvLeaveC, hvLeaveIdeal, hvLeavePeo, hvPctC, hvPctIdeal, hvPctPeo, totalHires, turnoverHires, growthHires, tthC, tthIdeal, tthPeo, prodC, prodIdeal, prodPeo, totalPayroll, dailyProd, hoursSaved, hrRate, oppCost, pe, wcPremium, wcSavPct, replacedToolsCost, payrollAnnual, tier, tot, currentBenIds, idealBenIds, newBenIds, peoBenIdsAll, queueAdminNotify, td, ind]); const submitLead = useCallback(() => { if (!lf.name || !lf.email) return; const emailRe=/^[^\s@]+@[^\s@]+\.[^\s@]+$/; if(!emailRe.test(lf.email)){setEmailError('Enter a valid email address');return;} const phoneDigits=(lf.phone||'').replace(/\D/g,''); if(phoneDigits.length>0&&phoneDigits.length<10){setPhoneError('Enter a valid 10-digit phone number');return;} setLf(o => ({...o, done: true})); // Cancel any pending partial save to prevent it from recreating the partial entry if (partialTimerRef.current) { clearTimeout(partialTimerRef.current); partialTimerRef.current = null; } if (leadTimerRef.current) { clearTimeout(leadTimerRef.current); leadTimerRef.current = null; } // Send complete lead data to backend (also removes partial entry by session_id) const payload = { type: 'complete', session_id: sessionIdRef.current, data: { name: lf.name, email: lf.email, phone: lf.phone, company: lf.company, companyProfile: { name: cp.name, industry: cp.industry, state: cp.state, range: cp.range, exact: cp.exact }, benefitsSelected: { current: currentBenIds, ideal: idealBenIds }, benefitConfig: benConfig, peoInfo: { hasPeo: pe.hasPeo, peoName: pe.peoName, peoCost: pe.peoCost, hrChallenges: pe.hrCh, compliance: pe.comp, hrHoursSaved: pe.hrHoursSaved, hrHourlyRate: pe.hrHourlyRate, hrOpportunityCost: pe.hrOpportunityCost, wcPremium: pe.wcPremium, wcSavingsEst: pe.wcSavingsEst, payrollCost: pe.payrollCost, hrTools: pe.hrTools, hrToolOverrides: pe.hrToolOverrides, hrChOvr: pe.hrChOvr, compOvr: pe.compOvr, ft: pe.ft, pt: pe.pt }, turnoverData: { ...td }, roiSummary: { scenario: op.scenario, employee_count: empN, ideal_gross_value: turnoverIdeal.total + attractionIdeal.value + tthCalcIdeal.total + prodValueIdeal, ideal_benefits_cost: idealBenefitsCostData.totalMid, peo_annual_cost: peoAnnual, hr_time_savings: hrTimeSavings, compliance_value: compValue, wc_savings: wcSavings, turnover_savings_ideal: turnoverIdeal.total, turnover_savings_peo: turnoverPeo.total, attraction_value_ideal: attractionIdeal.value, attraction_value_peo: attractionPeo.value, tth_savings_ideal: tthCalcIdeal.total, tth_savings_peo: tthCalcPeo.total, productivity_value_ideal: prodValueIdeal, productivity_value_peo: prodValuePeo, current_satisfaction: currentSat, ideal_satisfaction: idealSat, peo_satisfaction: peoSat, replaced_tools_cost: replacedToolsCost }, userActions: userActions } }; fetch('submit.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }).catch(function(err) { console.log('Submit error:', err); }); queueAdminNotify('form_submit', { scenario: op.scenario, employee_count: empN, ideal_gross_value: turnoverIdeal.total + attractionIdeal.value + tthCalcIdeal.total + prodValueIdeal, ideal_benefits_cost: idealBenefitsCostData.totalMid, peo_annual_cost: peoAnnual, hr_time_savings: hrTimeSavings, compliance_value: compValue, wc_savings: wcSavings }); }, [lf, cp, td, empN, pe, op.scenario, currentBenIds, idealBenIds, turnoverIdeal, attractionIdeal, tthCalcIdeal, prodValueIdeal, idealBenefitsCostData, peoAnnual, hrTimeSavings, compValue, wcSavings, userActions, queueAdminNotify]); const generateShareText = useCallback(() => { const sMult = op.scenario === 'conservative' ? 0.7 : op.scenario === 'optimistic' ? 1.3 : 1.0; const sLabel = op.scenario === 'conservative' ? 'Conservative (70%)' : op.scenario === 'optimistic' ? 'Optimistic (130%)' : 'Base Case (100%)'; const sIdealGross = Math.round((turnoverIdeal.total + attractionIdeal.value + tthCalcIdeal.total + prodValueIdeal) * sMult); const sIdealNet = sIdealGross - idealBenefitsCostData.totalMid; const sIdealROI = idealBenefitsCostData.totalMid > 0 ? Math.round((sIdealGross / idealBenefitsCostData.totalMid) * 100) : 0; const sPeoGross = Math.round((turnoverPeo.total + attractionPeo.value + tthCalcPeo.total + prodValuePeo + hrTimeSavings + hrChValue + compValue + wcSavings) * sMult) + replacedToolsCost; const sPeoNet = sPeoGross - peoAnnual; const sPeoROI = peoAnnual > 0 ? Math.round((sPeoGross / peoAnnual) * 100) : 0; let txt = ''; txt += 'BENEFITS PACKAGE ROI ANALYSIS\n'; txt += '==============================\n'; txt += 'Company: ' + (cp.name || 'N/A') + '\n'; txt += 'Industry: ' + (cp.industry || 'N/A') + '\n'; txt += 'Employees: ' + empN + ' | State: ' + (cp.state || 'N/A') + '\n'; txt += 'Scenario: ' + sLabel + '\n'; txt += '\n'; txt += 'CURRENT BENEFITS SATISFACTION: ' + currentSat + '%\n'; txt += 'IDEAL PACKAGE SATISFACTION: ' + idealSat + '% (' + idealBenIds.length + ' benefits, ' + newBenIds.length + ' new)\n'; txt += '\n'; txt += '--- IDEAL BENEFITS PACKAGE ---\n'; txt += 'Projected Annual Value: ' + fmt(sIdealGross) + '\n'; txt += 'Estimated Annual Cost: ' + fmt(idealBenefitsCostData.totalMid) + '\n'; txt += 'Net ROI: ' + fmt(sIdealNet) + ' (' + sIdealROI + '% return)\n'; if (turnoverIdeal.total > 0) txt += ' - Turnover Savings: ' + fmt(Math.round(turnoverIdeal.total * sMult)) + '\n'; if (attractionIdeal.value > 0) txt += ' - High-Value Attraction: ' + fmt(Math.round(attractionIdeal.value * sMult)) + '\n'; if (tthCalcIdeal.total > 0) txt += ' - Time-to-Hire Savings: ' + fmt(Math.round(tthCalcIdeal.total * sMult)) + '\n'; if (prodValueIdeal > 0) txt += ' - Productivity Gains: ' + fmt(Math.round(prodValueIdeal * sMult)) + '\n'; txt += '\n'; if (peoAnnual > 0) { txt += '--- FULL PEO SOLUTION ---\n'; txt += 'Projected Annual Value: ' + fmt(sPeoGross) + '\n'; txt += 'Estimated Annual Cost: ' + fmt(peoAnnual) + '\n'; txt += 'Net ROI: ' + fmt(sPeoNet) + ' (' + sPeoROI + '% return)\n'; if (turnoverPeo.total > 0) txt += ' - Turnover Savings: ' + fmt(Math.round(turnoverPeo.total * sMult)) + '\n'; if (attractionPeo.value > 0) txt += ' - High-Value Attraction: ' + fmt(Math.round(attractionPeo.value * sMult)) + '\n'; if (tthCalcPeo.total > 0) txt += ' - Time-to-Hire Savings: ' + fmt(Math.round(tthCalcPeo.total * sMult)) + '\n'; if (prodValuePeo > 0) txt += ' - Productivity Gains: ' + fmt(Math.round(prodValuePeo * sMult)) + '\n'; if (hrTimeSavings > 0) txt += ' - HR Time Savings: ' + fmt(Math.round(hrTimeSavings * sMult)) + '\n'; if (hrChValue > 0) txt += ' - HR Challenges: ' + fmt(Math.round(hrChValue * sMult)) + '\n'; if (compValue > 0) txt += ' - Compliance Risk Reduction: ' + fmt(Math.round(compValue * sMult)) + '\n'; if (wcSavings > 0) txt += ' - Workers\' Comp Savings: ' + fmt(Math.round(wcSavings * sMult)) + '\n'; if (replacedToolsCost > 0) txt += ' - Replaced Tools Savings: ' + fmt(replacedToolsCost) + '\n'; txt += '\n'; } if (idealBenefitsCostData.erPaidBenefits.length > 0) { txt += '--- NEW BENEFITS (EMPLOYER COST) ---\n'; txt += 'Estimated range: ' + fmt(idealBenefitsCostData.totalLow) + ' - ' + fmt(idealBenefitsCostData.totalHigh) + '/yr\n'; idealBenefitsCostData.erPaidBenefits.forEach(function(b) { txt += ' ' + b.name + ': $' + b.costLow + '-$' + b.costHigh + '/emp/yr\n'; }); txt += '\n'; } if (idealBenefitsCostData.voluntaryBenefits.length > 0) { txt += '--- VOLUNTARY BENEFITS ($0 EMPLOYER COST) ---\n'; idealBenefitsCostData.voluntaryBenefits.forEach(function(b) { txt += ' ' + b.name + '\n'; }); txt += '\n'; } txt += '---\n'; txt += 'Generated by Benefitra Benefits ROI Calculator\n'; txt += 'https://benefitra.com\n'; txt += 'Data sources: KFF 2024, SHRM, BLS JOLTS, MetLife, Willis Towers Watson\n'; txt += 'This analysis is educational. Consult with a licensed benefits advisor for plan-specific projections.\n'; return txt; }, [cp, empN, op.scenario, idealBenefitsCostData, peoAnnual, turnoverIdeal, turnoverPeo, attractionIdeal, attractionPeo, tthCalcIdeal, tthCalcPeo, prodValueIdeal, prodValuePeo, hrTimeSavings, hrChValue, compValue, wcSavings, currentSat, idealSat, idealBenIds, newBenIds, replacedToolsCost]); const handleShareEmail = useCallback(() => { setUserActions(o=>({...o, shared:true})); const emailRe=/^[^\s@]+@[^\s@]+\.[^\s@]+$/; const emailList = share.emails.split(/[,;\s]+/).map(function(e){return e.trim();}).filter(Boolean); const invalid = emailList.filter(function(e){return !emailRe.test(e);}); if(invalid.length){setShareEmailError('Invalid email'+(invalid.length>1?'s':'')+': '+invalid.join(', '));return;} const toEmails = emailList.join(','); const txt = generateShareText(); const senderLine = share.senderName ? (share.senderName + ' has') : 'Someone on your team has'; const noteLine = share.senderNote ? ('\n\nNote from ' + (share.senderName || 'sender') + ':\n"' + share.senderNote + '"\n') : ''; const subject = 'Benefits ROI Analysis' + (cp.name ? ' for ' + cp.name : ''); const body = 'Hi,\n\n' + senderLine + ' shared a Benefits ROI analysis for your review.' + noteLine + '\n\n' + txt; const mailto = 'mailto:' + encodeURIComponent(toEmails) + '?subject=' + encodeURIComponent(subject) + '&body=' + encodeURIComponent(body); window.open(mailto, '_blank'); setShare(function(o){return Object.assign({}, o, {sent:true});}); if (lf.done) { // Already submitted via form — update existing complete entry with share details fetch('submit.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ type: 'update_actions', session_id: sessionIdRef.current, data: { userActions: {...userActions, shared: true}, shareDetails: { recipientEmails: toEmails, senderName: share.senderName || '', noteToRecipients: share.senderNote || '' } } }) }).catch(function(err) { console.log('Update share error:', err); }); } else { // Not yet submitted via form — create new complete lead from share if (partialTimerRef.current) { clearTimeout(partialTimerRef.current); partialTimerRef.current = null; } if (leadTimerRef.current) { clearTimeout(leadTimerRef.current); leadTimerRef.current = null; } const payload = { type: 'complete', session_id: sessionIdRef.current, data: { name: share.senderName || '', email: toEmails, phone: '', company: '', source: 'share_email', shareDetails: { recipientEmails: toEmails, senderName: share.senderName || '', noteToRecipients: share.senderNote || '' }, companyProfile: { name: cp.name, industry: cp.industry, state: cp.state, range: cp.range, exact: cp.exact }, benefitsSelected: { current: currentBenIds, ideal: idealBenIds }, peoInfo: { hasPeo: pe.hasPeo, peoName: pe.peoName, peoCost: pe.peoCost, hrChallenges: pe.hrCh, compliance: pe.comp }, turnoverData: { avgSalary: td.avgSalary, hvSalary: td.hvSalary, turnoverRate: td.turnoverRate, hvPct: td.hvPct, growthHires: td.growthHires }, roiSummary: { scenario: op.scenario, employee_count: empN, ideal_gross_value: turnoverIdeal.total + attractionIdeal.value + tthCalcIdeal.total + prodValueIdeal, ideal_benefits_cost: idealBenefitsCostData.totalMid, peo_annual_cost: peoAnnual, hr_time_savings: hrTimeSavings, compliance_value: compValue, wc_savings: wcSavings }, userActions: {...userActions, shared: true} } }; fetch('submit.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }).catch(function(err) { console.log('Share submit error:', err); }); } }, [lf.done, share, cp, pe, td, op.scenario, empN, currentBenIds, idealBenIds, turnoverIdeal, attractionIdeal, tthCalcIdeal, prodValueIdeal, idealBenefitsCostData, peoAnnual, hrTimeSavings, compValue, wcSavings, userActions, generateShareText]); const handleCopySummary = useCallback(() => { setUserActions(o=>({...o, copied:true})); const txt = generateShareText(); if (navigator.clipboard) { navigator.clipboard.writeText(txt).then(function(){ setShare(function(o){return Object.assign({}, o, {copied:true});}); setTimeout(function(){setShare(function(o){return Object.assign({}, o, {copied:false});});}, 2500); }); } else { // Fallback const ta = document.createElement('textarea'); ta.value = txt; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); setShare(function(o){return Object.assign({}, o, {copied:true});}); setTimeout(function(){setShare(function(o){return Object.assign({}, o, {copied:false});});}, 2500); } }, [generateShareText]); const hrChallenges = [ {id:"recruiting",l:"Recruiting and hiring"},{id:"onboarding",l:"Employee onboarding"},{id:"payroll",l:"Payroll processing"}, {id:"terminations",l:"Handling terminations"},{id:"disputes",l:"Employee disputes"},{id:"benefits",l:"Benefits administration"} ]; const complianceItems = [ {id:"epli",l:"Employment Practices Liability"},{id:"flsa",l:"FLSA/Wage & Hour"},{id:"harassment",l:"Harassment prevention"}, {id:"fmla",l:"FMLA administration"},{id:"ada",l:"ADA compliance"},{id:"iNine",l:"I-9 verification"}, {id:"osha",l:"OSHA/Workplace safety"},{id:"handbook",l:"Employee handbook"} ]; return ( <> {/* ═══ NAV ═══ */}
setMobileMenuOpen(false)}>
BENEFITRA
{/* ═══ HEADER ═══ */}
BENEFITRA

Benefits ROI Calculator for Ohio Dental Practice Companies

Built for Ohio dental practice employers using real OH wage data, workers' comp rates, and state-specific rules

Every number has a source. Hover any ⓘ to see the calculation. No email required.

{/* Pre-rendered data block for SEO */}
📊

Ohio Dental Practice Industry at a Glance

Ohio dental practice workers earn an average of $55,200/year ($26.54/hour), the industry has a 28.5% turnover rate in OH, and the average employer share of health insurance is $7,580/employee/year. Workers' compensation for dental practice in Ohio typically runs $1.75 per $100 payroll.

$55,200
Avg Dental Practice Salary (OH)
28.5%
Dental Practice Turnover
$7,580
Avg Health Premium (OH)
$10.45
State Minimum Wage
{/* State x Industry Commentary */}
🏗️

What Makes Ohio Dental Practice Different

Ohio's dental practice market spans a diverse economic landscape from the major metros of Columbus, Cleveland, and Cincinnati to rural Appalachian communities where dental access is critically limited. The hygienist shortage affects all regions but manifests differently: metro practices face wage competition and DSO poaching, while rural practices struggle with geographic isolation and limited candidate pools. Columbus, Ohio's fastest-growing metro, has seen the most intense competition as population growth drives new practice openings while hygienist training programs produce a fixed number of graduates. Ohio's EFDA program provides a valuable clinical workforce expansion tool, but the limited number of approved training programs and the cost of certification creates barriers for many practices.

DSO growth in Ohio has accelerated, with Heartland Dental, Aspen Dental, and multiple regional groups expanding across the state. Columbus has become a particular focus for DSO expansion given its strong population growth and favorable demographics. These organizations offer standardized benefit packages that set market expectations — health insurance, 401(k) matching, paid CE, and malpractice coverage are now baseline offerings that independent practices must match. The Ohio State Dental Board's EFDA licensing requirements add a unique dimension, as practices that invest in EFDA training and certification create highly productive team members who are less likely to leave when their employer has subsidized their professional advancement.

Ohio's monopolistic state fund workers' compensation system through the BWC creates a different cost management dynamic than competitive-market states. Dental practices cannot shop WC rates among private carriers but can qualify for BWC group rating programs that reduce premiums by 20-40% based on collective safety performance. Health insurance premiums averaging $7,580 for single coverage are below the national average, and Ohio's carrier market includes strong regional options like Medical Mutual and SummaCare alongside national carriers. The absence of state-mandated paid leave or employer health insurance requirements means that Ohio dental practices offering comprehensive voluntary benefits packages gain outsized recruiting advantages relative to competitors providing wages alone.

Sources: BLS Occupational Employment Statistics, May 2023 (OH dental workforce wages), KFF Employer Health Benefits Survey 2024 (OH employer premiums), Ohio State Dental Board licensing, EFDA certification, and CE requirements 2024

{/* State Rules */}
⚖️

Ohio-Specific Rules for Dental Practice Employers

  • Ohio State Dental Board requires dental hygienists to complete 24 CE hours biennially; expanded function dental auxiliaries (EFDAs) must hold board-issued licenses and complete approved training programs including clinical competency examinations
  • Ohio Bureau of Workers' Compensation (BWC) operates a monopolistic state fund — dental practices must obtain WC coverage through the state fund or qualify for self-insurance; private WC insurance is not available
  • Ohio has no state-mandated paid sick leave, no paid family leave, and no employer health insurance mandate for small employers — voluntary benefits offered by dental practices serve as powerful recruiting differentiators
  • Columbus and Cincinnati have local anti-discrimination and employment ordinances that may impose additional requirements on dental practices operating within city limits
  • OSHA Bloodborne Pathogen Standard compliance is enforced through federal OSHA; the Ohio State Dental Board conducts practice inspections focusing on infection control, sterilization procedures, and radiographic safety protocols
{/* Data Sources & Privacy */}
{/* Top bar — Data Sources with detailed descriptions */}

📊 Powered by Industry Data

{[ {icon:'💰', name:'KFF 2024', detail:'Employer Health Benefits Survey', desc:'The gold standard for U.S. employer health costs. Covers premiums, contributions, deductibles, and plan design across 2,000+ firms — the basis for our medical, dental, and vision cost estimates.'}, {icon:'👥', name:'SHRM & BLS', detail:'Workforce & Industry Benchmarks', desc:'SHRM\'s Human Capital Benchmarking and BLS JOLTS data provide turnover rates, hiring costs, and benefits adoption rates across 16 industries used in our ROI projections.'}, {icon:'⚖️', name:'EEOC & DOL', detail:'Compliance & Regulatory Data', desc:'Equal Employment Opportunity Commission and Department of Labor data on workplace claims, compliance costs, and employer liability — used to estimate risk-reduction value of PEO partnerships.'}, {icon:'📈', name:'MetLife & WTW', detail:'Employee Satisfaction Research', desc:'MetLife\'s Annual Benefits Trends Study and Willis Towers Watson\'s Global Benefits Attitudes Survey quantify how specific benefits drive employee satisfaction, engagement, and retention.'}, {icon:'🏢', name:'Work Institute', detail:'Retention & Turnover Research', desc:'Their annual Retention Report analyzes 250,000+ exit interviews to identify why employees leave and quantify the cost — our replacement cost and turnover reduction estimates are anchored here.'}, {icon:'🔒', name:'Hiscox', detail:'Employment Practices Liability', desc:'Hiscox\'s annual EPL study tracks the frequency and cost of employee lawsuits. Used to model liability-reduction savings when employers adopt compliant benefits through a PEO.'} ].map((s,i)=>(
{s.icon}
{s.name}
{s.detail}

{s.desc}

))}
{/* Bottom bar — How It Works & Privacy side by side */}
🛠️
How It Works— Every number has a source. Hover any icon to see the calculation, data source, and assumptions behind each figure.
Your Privacy— All calculations run in your browser. Nothing is sent to a server until you submit your info. We never sell your data.
{/* S1: Company Profile */}
uCp('name',v)} placeholder="Acme Corp"/>
Healthcare & Social Assistance / Dental Practices
Ohio
uCp('range',v)} options={empRanges.map(r=>({v:r,l:r+' employees'}))}/> uCp('exact',v)} placeholder="e.g. 47" optional type="number"/>
{s1Ok&&
Complete — continue below
}
{/* S2: Benefits Selection */}
Satisfaction Benchmarks: Health Only: 40-55% | +Dental+Vision: 50-65% | +Core 7: 60-75% | 30+ Benefits: 75-90%

2a. Select Your Current Benefits

{Object.entries(benefitsCatalog).map(([k,cat])=>{ const c=catClr[cat.color]; return
{cat.title}
{cat.items.map(b=>toggleCurrent(b.id)}/>)}
; })} {currentBenIds.length > 0 && <>
Current Employee Benefit Satisfaction Score
{currentSat}%

2b. Select Benefits to Add for Your Ideal Package

Check a benefit to add it. For some benefits, you can customize how it's funded or how much to invest.

{Object.entries(benefitsCatalog).map(([k,cat])=>{ const c=catClr[cat.color]; const available = cat.items.filter(b=>!currentBens[b.id]); if (available.length === 0) return null; return
{cat.title}
{available.map(b=>{ const cust = customizableBenefits[b.id]; const chk = idealBens[b.id]; const cfg = benConfig[b.id] || {}; const badgeText = chk && cust ? (cust.fundingModes ? (cust.labels[cfg.mode||cust.defaultMode]||'') : cust.amountInput ? fmt(parseFloat(cfg.amount)||cust.defaultAmount)+'/emp' : null) : null; return
toggleIdeal(b.id)} highlight={b.peo} value={badgeText}/> {chk && cust && cust.fundingModes &&
How will you offer {b.n}?
{Object.entries(cust.labels).map(([mode,lbl])=>{ const active = (cfg.mode||cust.defaultMode)===mode; const clr = mode==='voluntary'?'border-green-400 bg-green-50 text-green-700':mode==='split'?'border-amber-400 bg-amber-50 text-amber-700':'border-red-400 bg-red-50 text-red-700'; return ; })}
{(()=>{const m=cfg.mode||cust.defaultMode;const cs=cust.costs[m];return cs?(cs.mid>0?
90% confidence: ${cs.low}–${cs.high}/emp/yr (mid: ${cs.mid})
:
$0 employer cost — employee-paid via payroll deduction
):null;})()}
} {chk && cust && cust.amountInput &&
{cust.label}
$ {e.stopPropagation();uBen(b.id,'amount',e.target.value);}} className="flex-1 h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-bih-green"/> {e.stopPropagation();uBen(b.id,'amount',e.target.value);}} onClick={e=>e.stopPropagation()} onWheel={e=>e.target.blur()} className="w-24 px-2 py-1 border border-gray-300 rounded text-sm text-right"/> /yr
{cust.hint}
Total: {fmt((parseFloat(cfg.amount)||cust.defaultAmount)*empN)}/yr for {empN} employees
}
; })}
; })}
Ideal Package Employee Benefit Satisfaction
{idealSat}%
{idealBenIds.length} benefits total ({newBenIds.length} new)
{newBenIds.length > 0 && (
{/* Contribution Type Legend */}
Understanding Employer Cost Types:
Noncontributory — Employer pays 100%. All eligible employees enrolled automatically.
Contributory — Employer & employee share cost. Carriers often require 50%+ ER share, 75% participation.
Voluntary — Employee-paid. $0 employer cost possible. Employer provides access via payroll deduction.
Employer-Funded / Admin — Employer pays platform or program fee, or admin costs only.
{/* Important Notes */}
⚠️ Important Considerations:
  • Minimum participation: Most group benefit carriers require 75% employee participation for contributory plans (medical, dental). Voluntary lines typically need 10-25%.
  • Small group rules: Under 50 employees, ACA small group rules apply — community-rated premiums, essential health benefits required. Over 50, large group underwriting applies.
  • Employer contribution minimums: Most carriers require the employer to contribute at least 50% of employee-only premiums for group health. Some states require higher (e.g., Hawaii mandates 50%, some carriers require 75%).
  • Enrollment windows: Adding new benefits typically requires a qualifying event or annual open enrollment period.
  • Voluntary benefits at $0: Benefits marked "Voluntary" can genuinely cost the employer $0 — the employer simply provides access and payroll deduction. These still boost satisfaction and recruitment.
{idealBenefitsCostData.erPaidBenefits.length > 0 && (<>
Estimated Annual Employer Cost for New Benefits:
90% Confidence Interval (Employer Cost Only)
{fmt(idealBenefitsCostData.totalLow)} {fmt(idealBenefitsCostData.totalMid)} {fmt(idealBenefitsCostData.totalHigh)}
)} {/* All new benefits — ER-paid and voluntary together */} {idealBenefitsCostData.breakdown.length > 0 && (
{idealBenefitsCostData.breakdown.map(b => { const isVol = !b.hasERCost; const typeColor = isVol ? 'bg-green-100 text-green-700' : b.type === 'noncontributory' ? 'bg-red-100 text-red-700' : b.type === 'contributory' ? 'bg-amber-100 text-amber-700' : 'bg-blue-100 text-blue-700'; const typeLabel = isVol ? 'Employee-Paid' : b.type === 'noncontributory' ? 'ER-Paid' : b.type === 'contributory' ? 'Contributory' : b.type === 'admin-only' ? 'Admin Fee' : 'ER-Funded'; const textColor = isVol ? 'text-green-600' : 'text-blue-600'; return (
{typeLabel} {b.name} ${b.name}

Type: ${isVol ? 'Voluntary (employee-paid)' : b.type}
Employer cost: ${isVol ? '$0 — employee pays via payroll deduction' : '$'+b.costLow+'-$'+b.costHigh+'/emp/yr'}
Employer share: ${b.erShareRange}
Min participation: ${b.minParticipation}

Source: ${b.source}`}/>
{isVol ? '$0/emp' : '$'+b.costLow+'-$'+b.costHigh+'/emp'}
); })}
)} {idealBenefitsCostData.voluntaryBenefits.length > 0 && (
{idealBenefitsCostData.voluntaryBenefits.length} benefit(s) marked Employee-Paid add value to your package at no direct employer cost — employees get group pricing via payroll deduction.
)}
)}

2c. PEO Benefits Available

{allBens.filter(b=>b.peo).map(b=>
{b.n}
)}
Full PEO Employee Benefits Satisfaction
{peoSat}%
}
{/* S3: Turnover & Value Drivers */}
Industry ({cp.industry || 'default'}): {ind.turnover}% avg turnover, {fmt(ind.avgSalary)} avg salary
uTd('salTyp',v)} prefix="$" placeholder={String(ind.avgSalary)} optional type="number"/> uTd('replCostTyp',v)} suffix="%" placeholder={String(ind.replacement)} optional type="number" tip={replacementTip}/>

Total Employee Turnover

uTd('totalLeaveCurrent',v)} suffix="emp" placeholder={String(defTotalLeave)} optional type="number" tip={`Industry average: ${ind.turnover}% = ${defTotalLeave} employees/year`}/> uTd('totalLeaveIdeal',v)} suffix="emp" placeholder={String(Math.round(defTotalLeave * 0.85))} optional type="number" tip={turnoverPredTip('ideal')}/> uTd('totalLeavePeo',v)} suffix="emp" placeholder={String(Math.round(defTotalLeave * 0.75))} optional type="number" tip={turnoverPredTip('peo')}/>

High-Value Employee Analysis

uTd('hvSalary',v)} prefix="$" placeholder={String(Math.round(avgSal * 1.7))} optional type="number"/> uTd('replCostHV',v)} suffix="%" placeholder={String(ind.replacement * 2)} optional type="number" tip={replacementTip}/>
uTd('hvExtraRevenue',v)} prefix="$" suffix="/year extra" placeholder={String(Math.round(avgSal * 0.5))} optional type="number" tip={hvRevenueTip}/>
uTd('hvLeaveCurrent',v)} suffix="emp" placeholder={String(defHVLeave)} optional type="number"/> uTd('hvLeaveIdeal',v)} suffix="emp" placeholder={String(Math.round(defHVLeave * 0.7))} optional type="number"/> uTd('hvLeavePeo',v)} suffix="emp" placeholder={String(Math.round(defHVLeave * 0.6))} optional type="number"/>
uTd('hvPct',v)} suffix="%" placeholder="15" optional type="number"/> uTd('hvPctIdeal',v)} suffix="%" placeholder="20" optional type="number"/> uTd('hvPctPeo',v)} suffix="%" placeholder="25" optional type="number"/>
uTd('growthHires',v)} suffix="new positions" placeholder={String(Math.round(empN * 0.1))} optional type="number" tip="Net new positions (excluding turnover). Total hires = growth + turnover replacements."/>

Time-to-Hire

uTd('tthCurrent',v)} suffix="days" placeholder={String(defTTH)} optional type="number"/> uTd('tthIdeal',v)} suffix="days" placeholder={String(Math.round(defTTH * 0.85))} optional type="number"/> uTd('tthPeo',v)} suffix="days" placeholder={String(Math.round(defTTH * 0.75))} optional type="number"/>

Productivity & Engagement

Top productivity boosters: Financial Planning, Mental Health, Wellness, Caregiving, On-Demand Pay

uTd('prodCurrent',v)} min={0} max={100} showValue/> uTd('prodIdeal',v)} min={0} max={100} showValue color="accent-blue-500"/> uTd('prodPeo',v)} min={0} max={100} showValue/>
{/* Turnover Preview */}

Turnover Savings Preview

Your Ideal Benefits
{fmt(turnoverIdeal.total)}
{turnoverIdeal.fewerTotal} fewer employees leaving
Full PEO Benefits
{fmt(turnoverPeo.total)}
{turnoverPeo.fewerTotal} fewer employees leaving
{/* S4: PEO Value Analysis */}

Do you currently have a PEO?

{['yes','no'].map(v=>)}
{pe.hasPeo==='yes'&&(
uPe('peoName',v)} placeholder="e.g. ADP TotalSource" optional/> uPe('peoCost',v)} prefix="$" placeholder="5000" optional type="number"/>
)} {pe.hasPeo==='no'&&(
Current Payroll & HR Tool Costs

A PEO replaces these tools entirely. Enter your current costs so we can calculate your true net investment. Values are pre-filled with industry benchmarks for {empN} employees.

uPe('payrollCost',v)} prefix="$" placeholder={String(hrToolBenchmarks.payroll.cost(empN) * empN)} tip="Total monthly bill from your payroll provider (ADP, Paychex, Gusto, etc.). Not employee wages — just the service fee." optional type="number"/> {!pe.payrollCost &&
Industry avg for {empN} employees: ~{fmt(hrToolBenchmarks.payroll.cost(empN) * empN)}/mo (${hrToolBenchmarks.payroll.cost(empN)}/emp/mo)
}
HR Tools & Services (check all that apply):
{Object.entries(hrToolBenchmarks).filter(([id])=>id!=='payroll').map(([id,tool])=>{ const on = pe.hrTools[id]; const benchMo = tool.cost(empN); const ovr = pe.hrToolOverrides[id]; const effMo = ovr !== undefined && ovr !== '' ? parseFloat(ovr) : benchMo; const annTotal = effMo * empN * 12; return
toggleTool(id)} className="flex items-center gap-2 cursor-pointer flex-1">
{on&&}
{tool.label} {tool.hint}
{on && {fmt(annTotal)}/yr}
{on &&
$/emp/mo: {e.stopPropagation();uToolOvr(id,e.target.value);}} onClick={e=>e.stopPropagation()} onWheel={e=>e.target.blur()} className="w-20 px-2 py-1 border border-gray-300 rounded text-xs text-right" min="0" step="1"/> {ovr !== undefined && ovr !== '' && parseFloat(ovr) !== benchMo && } = {fmt(effMo * empN)}/mo for {empN} emp
}
; })}
{replacedToolsCost > 0 &&
Total Current Tools Cost:{fmt(replacedToolsCost)}/year
This amount is replaced by your PEO and counted as savings in the analysis below.
}
)}
uPe('ft',v)} placeholder={String(empN)} optional type="number"/> uPe('pt',v)} placeholder="0" optional type="number"/>
Estimated PEO Cost:${tier.pepm.toFixed(2)}/emp/mo
Annual:{fmt(peoAnnual)}
{pe.hasPeo==='yes' && currentPeoCost > 0 &&
vs Current: peoAnnual ? 'text-bih-green' : 'text-red-600'}`}>{currentPeoCost > peoAnnual ? `Save ${fmt(currentPeoCost - peoAnnual)}/yr` : `${fmt(peoAnnual - currentPeoCost)}/yr more`}
} {pe.hasPeo==='no' && replacedToolsCost > 0 && <>
Current tools replaced:{fmt(replacedToolsCost)}/yr
Net new PEO cost:{peoAnnual - replacedToolsCost <= 0 ? `Save ${fmt(Math.abs(peoAnnual - replacedToolsCost))}/yr` : `${fmt(peoAnnual - replacedToolsCost)}/yr`}
}

HR Time Savings

With guaranteed compliance, expert access, and unified integrations:

uPe('hrHoursSaved',v)} suffix="hrs" placeholder={String(benchmarkHours)} optional type="number"/> uPe('hrHourlyRate',v)} prefix="$" placeholder={String(ind.hrHourlyRate)} optional type="number"/> uPe('hrOpportunityCost',v)} suffix="%" placeholder="40" optional type="number"/>
Total HR Time Value: {fmt(hrTimeSavings)}/year

HR Challenges

Suggested values are based on your industry and headcount. You can adjust any value after selecting it.

{hrChallenges.map(c=>{ const sug=getHRVal(c.id); const on=pe.hrCh.includes(c.id); const ov=pe.hrChOvr[c.id]; const eff=ov!==undefined&&ov!==''?parseFloat(ov):sug; return
toggleArr('hrCh',c.id)} value={fmt(eff)} tip={getHRTip(c.id)}/> {on &&
Annual value: $ uHrOvr(c.id,e.target.value)} onWheel={e=>e.target.blur()} className="w-28 px-2 py-1 border border-gray-300 rounded text-xs text-right" min="0" step="500"/> {ov!==undefined&&ov!==''&&parseFloat(ov)!==sug && }
}
; })}
{hrChValue > 0 &&
Total: {fmt(hrChValue)}/year
}

Compliance Concerns

Values are expected annual risk cost (probability × typical claim cost). Adjust as needed.

{complianceItems.map(c=>{ const sug=getCompVal(c.id); const on=pe.comp.includes(c.id); const ov=pe.compOvr[c.id]; const eff=ov!==undefined&&ov!==''?parseFloat(ov):sug; return
toggleArr('comp',c.id)} value={eff>0?fmt(eff):'N/A'} tip={getCompTip(c.id)}/> {on && sug>0 &&
Annual risk value: $ uCompOvr(c.id,e.target.value)} onWheel={e=>e.target.blur()} className="w-28 px-2 py-1 border border-gray-300 rounded text-xs text-right" min="0" step="500"/> {ov!==undefined&&ov!==''&&parseFloat(ov)!==sug && }
}
; })}
{compValue > 0 &&
Total: {fmt(compValue)}/year
}

Workers' Compensation

PEO savings: {isBlue ? '20-60%' : '0-30%'} ({isBlue ? 'blue' : 'white'}-collar)

uPe('wcPremium',v)} prefix="$" placeholder="25000" optional type="number"/> uPe('wcSavingsEst',v)} suffix="%" placeholder={String(Math.round(wcSavPct))} optional type="number"/>
{wcSavings > 0 &&
{fmt(wcSavings)} savings
}
{/* S5: Value Breakdown */} {/* Scenario Tabs */}
Projection Scenario
{[{k:'conservative',l:'Conservative',sub:'70%'},{k:'base',l:'Base Case',sub:'100%'},{k:'optimistic',l:'Optimistic',sub:'130%'}].map(s=>( ))}

{op.scenario === 'conservative' ? 'Showing 70% of projected improvements — your floor estimate' : op.scenario === 'optimistic' ? 'Showing 130% of projected improvements — with strong execution' : 'Showing base case — projected improvements from industry research'}

{/* Industry Benchmark */} {(() => { const ct = ind.compThreshold; // Map satisfaction to industry-relative percentile: compThreshold = 50th percentile const toPos = (sat) => { if (sat <= 35) return 5; if (sat < ct) return 5 + (sat - 35) / (ct - 35) * 45; // 35→5%, ct→50% return 50 + (sat - ct) / (95 - ct) * 45; // ct→50%, 95→95% }; const curPos = Math.min(95, Math.max(5, toPos(currentSat))); const idealPos = Math.min(95, Math.max(5, toPos(idealSat))); const peoPos = Math.min(95, Math.max(5, toPos(peoSat))); const curLabel = curPos < 25 ? 'Below Average' : curPos < 50 ? 'Approaching Average' : curPos < 75 ? 'Competitive' : 'Top Tier'; return (
📊 Benefits Competitiveness: {cp.industry || 'Your Industry'} INDUSTRY-SPECIFIC COMPETITIVENESS

This bar reflects what it takes to be competitive in ${cp.industry || 'your industry'} specifically — not a one-size-fits-all score.

How it works:
Different industries have different benefits expectations. In ${cp.industry || 'your industry'}, a satisfaction score of ~${ct}% represents the competitive midpoint where most employers sit.

${cp.industry || 'Your industry'} insight:
${ind.compNote}

What the positions mean:
• Left (red): Well below ${cp.industry || 'industry'} norms — high turnover risk
• Center line: Average for ${cp.industry || 'your industry'} (~${ct}% satisfaction)
• Right (green): Above ${cp.industry || 'industry'} peers — strong recruitment advantage

Your scores:
• Current: ${currentSat}% — ${curLabel}
• Ideal: ${idealSat}%
• PEO: ${peoSat}%

Sources: MetLife, SHRM, Willis Towers Watson industry benchmarks`}/>
{/* Industry average marker */}
{/* Current marker */}
{/* Ideal marker */}
{/* PEO marker */}
Below AverageIndustry Avg ({ct}%)Top Tier
Current: {currentSat}% — {curLabel} Ideal: {idealSat}% PEO: {peoSat}%
{ind.compNote}
); })()} {(() => { const sMult = op.scenario === 'conservative' ? 0.7 : op.scenario === 'optimistic' ? 1.3 : 1.0; const sLabel = op.scenario === 'conservative' ? 'Conservative' : op.scenario === 'optimistic' ? 'Optimistic' : 'Base Case'; // Scenario-adjusted values const sTurnoverIdeal = Math.round(turnoverIdeal.total * sMult); const sTurnoverPeo = Math.round(turnoverPeo.total * sMult); const sAttractionIdeal = Math.round(attractionIdeal.value * sMult); const sAttractionPeo = Math.round(attractionPeo.value * sMult); const sTthIdeal = Math.round(tthCalcIdeal.total * sMult); const sTthPeo = Math.round(tthCalcPeo.total * sMult); const sProdIdeal = Math.round(prodValueIdeal * sMult); const sProdPeo = Math.round(prodValuePeo * sMult); const sHrTime = Math.round(hrTimeSavings * sMult); const sHrCh = Math.round(hrChValue * sMult); const sComp = Math.round(compValue * sMult); const sWc = Math.round(wcSavings * sMult); const sIdealGross = sTurnoverIdeal + sAttractionIdeal + sTthIdeal + sProdIdeal; const sIdealNet = sIdealGross - idealBenefitsCostData.totalMid; const sReplacedTools = replacedToolsCost; // not scenario-adjusted — real spend const sPeoGross = sTurnoverPeo + sAttractionPeo + sTthPeo + sProdPeo + sHrTime + sHrCh + sComp + sWc + sReplacedTools; const sPeoNet = sPeoGross - peoAnnual; const sPeoChangeAmount = currentPeoCost > 0 ? peoAnnual - currentPeoCost : peoAnnual; const sPeoNetAdjusted = currentPeoCost > 0 ? sPeoGross - sPeoChangeAmount : sPeoNet; const sPeoROI = peoAnnual > 0 ? Math.round((sPeoGross / peoAnnual) * 100) : 0; const sIdealROI = idealBenefitsCostData.totalMid > 0 ? Math.round((sIdealGross / idealBenefitsCostData.totalMid) * 100) : 0; return (<>
{/* Ideal Benefits Column */}

Your Ideal Benefits

{sTurnoverIdeal > 0 && {turnoverIdeal.fewerTotal} fewer leaving} tip={turnoverPreviewTip(true)}/>} {sAttractionIdeal > 0 && {attractionIdeal.extraHV} extra high-value hires} tip={attractionTip(true)}/>} {sTthIdeal > 0 && {tthCalcIdeal.daysSaved} days saved × {totalHires} hires} tip={tthTip(true)}/>} {sProdIdeal > 0 && {prodC}% → {prodIdeal}%} tip={prodTip(true)}/>}
Gross Value ({sLabel}):{fmt(sIdealGross)}
{idealBenefitsCostData.totalMid > 0 && (
Benefits Investment90% CONFIDENCE INTERVAL

Low: ${fmt(idealBenefitsCostData.totalLow)}/yr
Mid: ${fmt(idealBenefitsCostData.totalMid)}/yr
High: ${fmt(idealBenefitsCostData.totalHigh)}/yr`}/>
({fmt(idealBenefitsCostData.totalLow)} - {fmt(idealBenefitsCostData.totalHigh)})
)}
Net Value {fmt(sIdealNet)}/yr
{idealBenefitsCostData.totalMid > 0 &&
ROI: {sIdealROI}%
}
{/* PEO Column */}

Full PEO Benefits

{sTurnoverPeo > 0 && {turnoverPeo.fewerTotal} fewer leaving} tip={turnoverPreviewTip(false)}/>} {sAttractionPeo > 0 && {attractionPeo.extraHV} extra high-value hires} tip={attractionTip(false)}/>} {sTthPeo > 0 && {tthCalcPeo.daysSaved} days saved × {totalHires} hires} tip={tthTip(false)}/>} {sProdPeo > 0 && {prodC}% → {prodPeo}%} tip={prodTip(false)}/>} {sHrTime > 0 && {hoursSaved} hrs/week freed} tip={hrTimeSavingsTip}/>} {sHrCh > 0 && {pe.hrCh.length} challenges addressed}/>} {sComp > 0 && {pe.comp.length} risks mitigated}/>} {sWc > 0 && {wcSavPct}% savings}/>} {replacedToolsCost > 0 && Payroll + {Object.keys(pe.hrTools).filter(k=>pe.hrTools[k]).length} HR tools replaced} tip={`TOOLS REPLACED BY PEO

A PEO bundles payroll, HRIS, benefits admin, compliance, and more into one platform.

Your current costs being replaced:
${payrollAnnual > 0 ? '\u2022 Payroll: ' + fmt(payrollAnnual) + '/yr
' : ''}${Object.keys(pe.hrTools).filter(k=>pe.hrTools[k]).map(id => {const b=hrToolBenchmarks[id];const ovr=pe.hrToolOverrides[id];const mo=ovr!==undefined&&ovr!==''?parseFloat(ovr):b.cost(empN);return '\u2022 '+b.label+': '+fmt(mo*empN*12)+'/yr';}).join('
')}

Total replaced: ${fmt(replacedToolsCost)}/yr

This is real budget you're already spending that the PEO absorbs.`}/>}
Gross Value ({sLabel}):{fmt(sPeoGross)}
{currentPeoCost > 0 && (
PEO Change: {sPeoChangeAmount < 0 ? `+${fmt(Math.abs(sPeoChangeAmount))} savings` : `(${fmt(sPeoChangeAmount)})`}
)} {!(currentPeoCost > 0) && (
PEO Investment:({fmt(peoAnnual)})
)} {!(currentPeoCost > 0) && sReplacedTools > 0 && (
Tools Replaced:+{fmt(sReplacedTools)}
)}
Net Value {fmt(sPeoNetAdjusted)}/yr
ROI: {sPeoROI}%
{pe.hasPeo === 'yes' && currentPeoCost > 0 && (
Switching Analysis
Your current PEO cost:{fmt(currentPeoCost)}/yr
Recommended PEO cost:{fmt(peoAnnual)}/yr
PEO cost difference:{sPeoChangeAmount < 0 ? `Save ${fmt(Math.abs(sPeoChangeAmount))}` : fmt(sPeoChangeAmount)}/yr
{sWc > 0 &&
Workers' comp savings:+{fmt(sWc)}/yr
}
0 ? 'text-bih-green' : 'text-amber-300'}`}> Total switching {switchingSavings > 0 ? 'saves' : 'costs'}: {fmt(Math.abs(switchingSavings))}/yr
)}
{/* Multi-Year Projection Inputs */}

Multi-Year Projection Settings

uTd('illustrateYears',v)} options={[{v:'1',l:'1 Year'},{v:'2',l:'2 Years'},{v:'3',l:'3 Years'},{v:'4',l:'4 Years'},{v:'5',l:'5 Years'},{v:'6',l:'6 Years'}]} tip="Select the number of years for your value projection (max 6 years)."/>
{Array.from({length: parseInt(td.illustrateYears||'3')}, (_,i)=> { const yr = i+1; const gby = td.growthByYear || {}; return
Year {yr}
{const v=e.target.value;setTd(p=>({...p,growthByYear:{...p.growthByYear,[yr]:v}}));}} onWheel={e=>e.target.blur()} placeholder={String(growthHires)} className="w-full px-3 py-2 border border-gray-300 rounded-bih focus:ring-2 focus:ring-bih-green font-body text-bih-charcoal text-sm pr-10"/> emp
; })}
{/* Side by Side Time Values */} {(() => { const illustrateYears = parseInt(td.illustrateYears) || 3; const gby = td.growthByYear || {}; const getYearGrowth = (yr) => { const v = gby[yr]; return (v !== '' && v !== undefined && v !== null && !isNaN(parseFloat(v))) ? parseFloat(v) : growthHires; }; // Base annual values WITHOUT HV attraction (attraction will be recalculated per year) const baseIdealNetNoAttraction = sIdealNet - sAttractionIdeal; const basePeoNetNoAttraction = sPeoNetAdjusted - sAttractionPeo; // Build year-by-year projection const yearRows = []; let cumulativeIdeal = 0; let cumulativePeo = 0; let cumulativeHVIdeal = 0; let cumulativeHVPeo = 0; let cumulativeNewEmps = 0; for (let y = 1; y <= illustrateYears; y++) { const growthThisYear = getYearGrowth(y); cumulativeNewEmps += (y > 1 ? getYearGrowth(y - 1) : 0); const empY = empN + cumulativeNewEmps; const empRatio = empN > 0 ? empY / empN : 1; // Recalculate hires for this year's employee count const turnoverHiresY = Math.round(empY * ind.turnover / 100); const growthHiresY = growthThisYear; const totalHiresY = turnoverHiresY + growthHiresY; // Calculate new extra HV employees attracted this year const currentHVY = Math.round(totalHiresY * hvPctC / 100); const targetHVIdealY = Math.round(totalHiresY * hvPctIdeal / 100); const targetHVPeoY = Math.round(totalHiresY * hvPctPeo / 100); const extraHVIdealY = targetHVIdealY - currentHVY; const extraHVPeoY = targetHVPeoY - currentHVY; // Accumulate HV employees (they persist and generate value each year) cumulativeHVIdeal += Math.max(0, extraHVIdealY); cumulativeHVPeo += Math.max(0, extraHVPeoY); // This year's value: scaled base + cumulative HV attraction value const yearIdealValue = baseIdealNetNoAttraction * empRatio + cumulativeHVIdeal * hvExtraRevenue * sMult; const yearPeoValue = basePeoNetNoAttraction * empRatio + cumulativeHVPeo * hvExtraRevenue * sMult; cumulativeIdeal += yearIdealValue; cumulativePeo += yearPeoValue; yearRows.push({ year: y, empCount: Math.round(empY), newHVIdeal: Math.max(0, extraHVIdealY), newHVPeo: Math.max(0, extraHVPeoY), cumHVIdeal: cumulativeHVIdeal, cumHVPeo: cumulativeHVPeo, annualIdeal: Math.round(yearIdealValue), annualPeo: Math.round(yearPeoValue), cumulativeIdeal: Math.round(cumulativeIdeal), cumulativePeo: Math.round(cumulativePeo) }); } return (

Value Comparison Over Time

{sLabel} scenario ({sMult === 1 ? '100%' : sMult === 0.7 ? '70%' : '130%'} of projected improvements) • {Array.from({length:illustrateYears},(_,i)=>getYearGrowth(i+1)).join('/')} employees added (by year)

{yearRows.map((r, i) => ( ))}
Period Your Ideal Benefits Full PEO Benefits
Monthly {fmt(Math.round(sIdealNet / 12))} {fmt(Math.round(sPeoNetAdjusted / 12))}
{r.year}-Year Total {r.empCount} employees • {r.cumHVIdeal > 0 || r.cumHVPeo > 0 ? `+${r.cumHVIdeal}/${r.cumHVPeo} HV` : ''} {fmt(r.cumulativeIdeal)} {fmt(r.cumulativePeo)}
{cumulativeHVIdeal > 0 || cumulativeHVPeo > 0 ? (

High-Value Employee Compounding Effect

Over {illustrateYears} year{illustrateYears > 1 ? 's' : ''}, your improved benefits attract {yearRows[yearRows.length-1].cumHVIdeal} additional high-value employees (Ideal) / {yearRows[yearRows.length-1].cumHVPeo} (PEO) who each generate {fmt(hvExtraRevenue)}/yr in extra revenue. Earlier hires compound value across all subsequent years.

) : null}
); })()} ); })()}
{/* S6: Your Report & Next Steps */} {/* Soft Optional Lead Capture */} {!lf.done ? (

Want a Custom Implementation Roadmap?

Optional — a benefits specialist can review your results and provide vendor-specific recommendations, carrier comparisons, and a phased rollout plan tailored to your budget.

uLf('name',v)} placeholder="Name"/>
uLf('email',v)} placeholder="Email"/>{emailError&&

{emailError}

}
uLf('phone',v)} placeholder="(123) 123"/>{phoneError&&

{phoneError}

}
uLf('company',v)} placeholder="Company"/>
Schedule a Call

🔒 Your information is private. We never sell your data to third parties.

) : (

Request Sent — Thank You!

A benefits specialist will review your analysis and reach out within 1 business day.

)} {/* Ungated PDF Download */}

Download Your Analysis

Your complete ROI breakdown — no email required.

{/* Share Panel */} {share.open && (
{!share.sent ? (<>

Share This Analysis

Email your ROI analysis to leadership, your CFO, or anyone who needs to see the numbers. A summary of your full analysis will be included in the email.

{setShare(o=>({...o,emails:v}));const emailRe=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;if(v.trim()){const parts=v.split(/[,;\s]+/).map(e=>e.trim()).filter(Boolean);const invalid=parts.filter(e=>!emailRe.test(e));setShareEmailError(invalid.length?'Invalid email'+(invalid.length>1?'s':'')+': '+invalid.join(', '):'');}else{setShareEmailError('');}}} placeholder="[email protected], [email protected]" tip="Separate multiple emails with commas"/>{shareEmailError&&

{shareEmailError}

}
setShare(o=>({...o,senderName:v}))} placeholder="Your name" optional/> setShare(o=>({...o,senderNote:v}))} placeholder="Take a look at this benefits analysis..." optional/>

This opens your default email app with the analysis pre-filled. You can review and edit before sending.

) : (

Email Opened!

Review the email in your mail app and hit send. The analysis summary is already filled in.

)}
)}
{/* Divider */} {s2Ok && (
)} {/* Content Hub: Other State Dental Practice Calculators */} {s2Ok && (

🗺️ Dental Practice Benefits ROI by State

See how dental practice benefits ROI compares in other states:

MA Massachusetts Dental Practice NY New York Dental Practice TX Texas Dental Practice CA California Dental Practice FL Florida Dental Practice IL Illinois Dental Practice PA Pennsylvania Dental Practice NJ New Jersey Dental Practice GA Georgia Dental Practice
← Back to National Dental Practice Benefits ROI Calculator
)} {/* Cross-Promo: Other Tools */} {s2Ok && (

💡 Go Deeper With Your Numbers

Use our other free tools to refine your analysis and find additional savings:

📈

Business Valuation Projection

See how your benefits investment affects what your business is worth

📉

Premium Renewal Stress Test

Model your next 6 years of renewals under different funding arrangements

📊

Health Funding Cost Projector

Compare fully insured, level-funded, self-funded, and captive side-by-side

🎯

Benefits Savings Strategy Builder

Explore 25+ strategies with savings estimates and employee impact ratings

)} {/* FAQ Section - Ohio Dental Practice */} {s2Ok && (

Frequently Asked Questions: Ohio Dental Practice Benefits

What is the average wage for dental staff in Ohio?

BLS data shows dental hygienists in Ohio earn an average of $78,800 annually ($37.88/hour), with Columbus and Cleveland metros trending slightly higher. Dental assistants average $42,800 ($20.58/hour) and front office staff average $38,600 ($18.56/hour). Ohio's moderate cost of living means these wages deliver strong purchasing power, though they may lag compared to neighboring states for top-tier hygienists.

How does Ohio's state fund workers' compensation work for dental practices?

Ohio operates a monopolistic state fund through the Bureau of Workers' Compensation — dental practices must obtain WC coverage through BWC, not private carriers. Rates range from $0.90 to $3.00 per $100 of payroll, with typical rates around $1.75. Practices can reduce premiums through BWC group rating programs that offer 20-40% discounts based on collective safety performance. These programs are managed by sponsoring organizations.

What is Ohio's EFDA program and how does it help dental practices?

Ohio's Expanded Function Dental Auxiliary (EFDA) program allows licensed auxiliaries to perform restorative procedures including placing fillings, adjusting crowns, and fabricating temporary restorations under dentist supervision. This extends clinical capacity and can partially offset hygienist shortages. EFDAs must complete approved training programs and pass clinical competency exams. Practices sponsoring EFDA training build loyal, highly productive team members.

How severe is the dental hygienist shortage in Ohio?

Ohio's hygienist shortage is moderate to severe, with vacancy rates exceeding 25% in major metros and much higher in rural Appalachian communities. The Columbus metro faces the most intense competition due to population growth outpacing training program output. Many practices operate reduced hygiene schedules. Benefits packages including health insurance, retirement matching, and CE reimbursement are essential for attracting candidates.

How do DSOs impact independent dental practices in Ohio?

DSO presence in Ohio is growing, particularly in Columbus and suburban Cleveland. National chains offer comprehensive benefits that set market expectations. Independent practices differentiate through clinical autonomy, community relationships, and personalized benefits. Ohio's EFDA program gives independent practices a productivity advantage when they invest in training and certifying team members.

What benefits strategies work best for Ohio dental practices?

Ohio has no state-mandated paid leave or employer health insurance requirements, making voluntary benefits powerful recruiting tools. Recommended strategies include group health insurance (average premium $7,580/year), 401(k) or SIMPLE IRA with employer match, EFDA training sponsorship, paid CE reimbursement, and BWC group rating participation for WC savings. Practices offering comprehensive packages report 20-30% lower turnover than wage-only competitors.

)} {/* Methodology & Sources (collapsible) */} {s2Ok && (
{op.methodology && (

Data Sources

Benefits Costs: KFF Employer Health Benefits Survey 2024, NADP Dental Benefits Report, VSP/EyeMed Vision Benchmarks. Turnover & Retention: SHRM Human Capital Benchmarking Report, Work Institute Retention Report, BLS Job Openings and Labor Turnover Survey (JOLTS). Compliance & Risk: Hiscox EPL Study, EEOC Charge Statistics, DOL Wage & Hour Division enforcement data, ICE Worksite Enforcement, OSHA penalty adjustments. Satisfaction & Engagement: MetLife Annual Employee Benefits Study, Willis Towers Watson Benefits Research, Gallup Employee Engagement Survey. PEO Data: NAPEO Industry Statistics, Pepperdine Private Capital Markets Project.

Key Assumptions

Turnover reduction from improved benefits: 10-25% (ideal), 20-30% (PEO), based on SHRM and Work Institute research. Satisfaction scoring follows MetLife/Willis Towers Watson tiered benchmarks (health only → core 7 → comprehensive). Replacement cost percentages sourced from SHRM, Center for American Progress, and Work Institute by role level. Benefit cost ranges represent 90% confidence intervals from cited industry surveys and do not reflect specific carrier quotes. All values are annualized estimates.

Important Limitations

This tool provides estimates based on industry benchmarks and published research. Actual costs and savings depend on plan design, carrier selection, geographic factors, workforce demographics, contribution strategy, participation rates, and regulatory requirements. Benefits cost ranges assume typical employer contribution levels; actual quotes will vary based on group size, claims history, and underwriting. Voluntary benefits show $0 employer cost but may have implicit costs (admin time, enrollment support). Small groups (under 50) are subject to ACA small group market rules; large groups (50+) have different underwriting and compliance obligations. This calculator is educational — consult with a licensed benefits advisor for plan-specific projections and carrier quotes.

Participation & Contribution Rules

Group health coverage: Most carriers require 75% eligible employee participation and 50%+ employer contribution for employee-only coverage. Some states have higher minimums (e.g., Hawaii 50% mandate, some carriers require 75% contribution). Voluntary lines: Typically 10-25% participation minimums, no employer contribution required. Under 2 enrolled: Many carriers will not issue group coverage with fewer than 2 enrolled employees. Section 125 / Cafeteria Plan: Pre-tax employee contributions require a Section 125 plan document — PEOs typically include this.

)}
)} {/* Footer */}
BENEFITRA
© {new Date().getFullYear()} Benefitra • Benefits ROI Calculator for Ohio Dental Practice Companies
Estimates based on industry data from KFF, SHRM, BLS, MetLife, Willis Towers Watson, Work Institute, and EEOC.
Consult with a licensed benefits advisor for plan-specific projections.
); } ReactDOM.render(React.createElement(App), document.getElementById('root'));