<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insurance Consulting Pricing Calculator</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 20px;
}
.container {
max-width: 1400px;
margin: 0 auto;
}
.header {
background: white;
padding: 30px;
border-radius: 10px;
margin-bottom: 20px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.header h1 {
color: #2d3748;
font-size: 28px;
margin-bottom: 8px;
}
.header p {
color: #718096;
font-size: 14px;
}
.grid {
display: grid;
gap: 20px;
margin-bottom: 20px;
}
.grid-2 {
grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
}
.grid-3 {
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}
.card {
background: white;
border-radius: 10px;
padding: 25px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.card-header {
font-size: 20px;
font-weight: 600;
color: #2d3748;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 2px solid #e2e8f0;
}
.form-group {
margin-bottom: 16px;
}
.form-group label {
display: block;
font-size: 14px;
font-weight: 500;
color: #4a5568;
margin-bottom: 6px;
}
.form-group input, .form-group select {
width: 100%;
padding: 10px;
border: 1px solid #cbd5e0;
border-radius: 6px;
font-size: 14px;
transition: border-color 0.2s;
}
.form-group input:focus, .form-group select:focus {
outline: none;
border-color: #667eea;
}
.help-text {
font-size: 12px;
color: #718096;
margin-top: 4px;
}
.section-divider {
border-top: 1px solid #e2e8f0;
margin: 20px 0;
padding-top: 20px;
}
.section-title {
font-weight: 600;
font-size: 16px;
color: #2d3748;
margin-bottom: 16px;
}
.info-box {
background: #ebf4ff;
border: 1px solid #bee3f8;
border-radius: 6px;
padding: 16px;
margin-top: 16px;
}
.info-box h3 {
font-size: 14px;
font-weight: 600;
color: #2c5282;
margin-bottom: 12px;
}
.info-row {
display: flex;
justify-content: space-between;
padding: 6px 0;
font-size: 13px;
}
.info-row.total {
border-top: 2px solid #bee3f8;
margin-top: 8px;
padding-top: 12px;
font-weight: 600;
font-size: 14px;
}
.info-row.negative {
color: #c53030;
}
.info-row.positive {
color: #2f855a;
}
.stat-card {
text-align: center;
padding: 25px;
border-radius: 10px;
}
.stat-card.green {
background: linear-gradient(135deg, #d4fc79 0%, #96e6a1 100%);
}
.stat-card.blue {
background: linear-gradient(135deg, #a1c4fd 0%, #c2e9fb 100%);
}
.stat-card.purple {
background: linear-gradient(135deg, #fbc2eb 0%, #a6c1ee 100%);
}
.stat-card h3 {
font-size: 14px;
color: #2d3748;
margin-bottom: 12px;
font-weight: 500;
}
.stat-card .value {
font-size: 36px;
font-weight: 700;
color: #1a202c;
margin: 8px 0;
}
.stat-card .subtext {
font-size: 12px;
color: #4a5568;
}
.breakdown-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 30px;
}
.breakdown-section h3 {
font-size: 16px;
font-weight: 600;
color: #2d3748;
margin-bottom: 16px;
padding-bottom: 8px;
border-bottom: 2px solid #e2e8f0;
}
.breakdown-row {
display: flex;
justify-content: space-between;
padding: 10px 0;
font-size: 14px;
}
.breakdown-row.total {
border-top: 2px solid #e2e8f0;
margin-top: 8px;
padding-top: 16px;
font-size: 16px;
font-weight: 700;
}
.calculator-section {
background: #f7fafc;
padding: 20px;
border-radius: 8px;
margin-bottom: 16px;
}
.result-box {
background: #ebf4ff;
border-left: 4px solid #4299e1;
padding: 16px;
margin-top: 16px;
border-radius: 4px;
}
.result-box .main-result {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.result-box .main-result span:first-child {
font-weight: 600;
color: #2d3748;
}
.result-box .main-result span:last-child {
font-size: 24px;
font-weight: 700;
color: #2b6cb0;
}
.market-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 16px;
margin-bottom: 20px;
}
.market-box {
background: #f7fafc;
padding: 20px;
border-radius: 8px;
}
.market-box h4 {
font-size: 14px;
font-weight: 600;
color: #4a5568;
margin-bottom: 8px;
}
.market-box .value {
font-size: 28px;
font-weight: 700;
color: #2d3748;
margin: 8px 0;
}
.market-box .current {
font-size: 13px;
color: #718096;
margin-top: 4px;
}
.market-box .status {
font-size: 11px;
color: #a0aec0;
margin-top: 4px;
}
.recommendations {
background: #ebf4ff;
border: 1px solid #bee3f8;
padding: 20px;
border-radius: 8px;
margin-top: 16px;
}
.recommendations h4 {
font-size: 16px;
font-weight: 600;
color: #2c5282;
margin-bottom: 12px;
}
.recommendations ul {
list-style: none;
}
.recommendations li {
padding: 8px 0;
font-size: 13px;
color: #2c5282;
line-height: 1.6;
}
.alert {
background: #fef5e7;
border: 1px solid #f9e79f;
padding: 16px;
border-radius: 6px;
margin-top: 16px;
}
.alert.success {
background: #d5f4e6;
border-color: #81c995;
}
.alert p {
font-size: 14px;
font-weight: 500;
color: #2d3748;
}
@media (max-width: 768px) {
.grid-2, .breakdown-grid, .market-grid {
grid-template-columns: 1fr;
}
.stat-card .value {
font-size: 28px;
}
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Insurance Consulting Pricing Calculator</h1>
<p>Comprehensive pricing strategy for your consulting practice</p>
</div>
<div class="grid grid-2">
<!-- Financial Targets & Expenses -->
<div class="card">
<div class="card-header">💰 Financial Targets & Expenses</div>
<div class="form-group">
<label>Target Annual Income (£)</label>
<input type="number" id="targetIncome" value="200000">
</div>
<div class="form-group">
<label>Existing NED Fee (£/year)</label>
<input type="number" id="existingNEDFee" value="60000">
</div>
<div class="form-group">
<label>Existing NED Days (days/year)</label>
<input type="number" id="existingNEDDays" value="24">
</div>
<div class="section-divider">
<div class="section-title">Additional Revenue Streams</div>
<div class="form-group">
<label>Additional NEDs</label>
<input type="number" id="additionalNEDs" value="0">
</div>
<div id="additionalNEDFields" style="display: none;">
<div class="form-group">
<label>Additional NED Fee (£/year each)</label>
<input type="number" id="additionalNEDFee" value="60000">
</div>
<div class="form-group">
<label>Days per Additional NED (days/year)</label>
<input type="number" id="additionalNEDDays" value="24">
</div>
</div>
<div class="form-group">
<label>Interim Days (days/year)</label>
<input type="number" id="interimDays" value="0">
</div>
<div id="interimFields" style="display: none;">
<div class="form-group">
<label>Interim Day Rate (£)</label>
<input type="number" id="interimDayRate" value="2500">
</div>
</div>
</div>
<div class="section-divider">
<div class="section-title">Annual Expenses</div>
<div class="form-group">
<label>Insurance (£/year)</label>
<input type="number" id="insurance" value="1000">
</div>
<div class="form-group">
<label>Software (£/year)</label>
<input type="number" id="software" value="1000">
</div>
<div class="form-group">
<label>Marketing (£/month)</label>
<input type="number" id="marketingMonthly" value="3000">
</div>
<div class="form-group">
<label>Other Expenses (£/year)</label>
<input type="number" id="otherExpenses" value="0">
</div>
</div>
</div>
<!-- Time & Capacity Planning -->
<div class="card">
<div class="card-header">📊 Time & Capacity Planning</div>
<div class="form-group">
<label>Holiday Days</label>
<input type="number" id="holidays" value="30">
</div>
<div class="form-group">
<label>Admin/Business Dev Days</label>
<input type="number" id="adminDays" value="40">
</div>
<div class="form-group">
<label>Target Billable Days (Consulting)</label>
<input type="number" id="billableDaysTarget" value="120">
<div class="help-text" id="maxDaysHelp"></div>
</div>
<div class="form-group">
<label>Target Utilization Rate (%)</label>
<input type="number" id="targetUtilization" value="65">
</div>
<div class="form-group">
<label>Profit Margin (%)</label>
<input type="number" id="profitMargin" value="15">
</div>
<div class="info-box">
<h3>Capacity Breakdown</h3>
<div class="info-row">
<span>Working days/year:</span>
<span id="workingDays">260 days</span>
</div>
<div class="info-row negative">
<span>NED commitments:</span>
<span id="totalNEDDays">-24 days</span>
</div>
<div class="info-row negative">
<span>Interim work:</span>
<span id="interimDaysDisplay">-0 days</span>
</div>
<div class="info-row negative">
<span>Holidays:</span>
<span id="holidaysDisplay">-30 days</span>
</div>
<div class="info-row negative">
<span>Admin/BD:</span>
<span id="adminDaysDisplay">-40 days</span>
</div>
<div class="info-row total positive">
<span>Available for consulting:</span>
<span id="availableDays">166 days</span>
</div>
</div>
</div>
</div>
<!-- Results Section -->
<div class="grid grid-3">
<div class="card stat-card green">
<h3>Recommended Day Rate</h3>
<div class="value" id="dayRate">£1,500</div>
<div class="subtext" id="dayRateSubtext">Based on 120 billable days</div>
</div>
<div class="card stat-card blue">
<h3>Recommended Hourly Rate</h3>
<div class="value" id="hourlyRate">£200</div>
<div class="subtext">Based on 7.5 hour day</div>
</div>
<div class="card stat-card purple">
<h3>Revenue Gap to Fill</h3>
<div class="value" id="revenueGap">£180,000</div>
<div class="subtext">From consulting work</div>
</div>
</div>
<!-- Financial Breakdown -->
<div class="card">
<div class="card-header">📈 Financial Breakdown</div>
<div class="breakdown-grid">
<div class="breakdown-section">
<h3>Revenue Target</h3>
<div class="breakdown-row">
<span>Target Income:</span>
<span id="targetIncomeDisplay">£200,000</span>
</div>
<div class="breakdown-row">
<span>Total Expenses:</span>
<span id="totalExpensesDisplay">£38,000</span>
</div>
<div class="breakdown-row">
<span id="profitLabel">Profit Margin (15%):</span>
<span id="profitAmount">£42,000</span>
</div>
<div class="breakdown-row total">
<span>Total Revenue Needed:</span>
<span id="totalRevenueNeeded" style="color: #2f855a;">£280,000</span>
</div>
</div>
<div class="breakdown-section">
<h3>Revenue Sources</h3>
<div class="breakdown-row">
<span>NED Fees:</span>
<span id="nedRevenue">£60,000</span>
</div>
<div class="breakdown-row">
<span>Interim Work:</span>
<span id="interimRevenue">£0</span>
</div>
<div class="breakdown-row">
<span>Consulting (Target):</span>
<span id="consultingRevenue">£180,000</span>
</div>
<div class="breakdown-row total">
<span>Total Revenue:</span>
<span id="totalRevenue" style="color: #2b6cb0;">£240,000</span>
</div>
</div>
</div>
<div id="surplusAlert" class="alert success" style="display: none;">
<p></p>
</div>
</div>
<!-- Pricing Tools -->
<div class="grid grid-2">
<div class="card">
<div class="card-header">🧮 Project Fee Calculator</div>
<div class="calculator-section">
<div class="form-group">
<label>Estimated Hours</label>
<input type="number" id="projectHours" value="40">
</div>
<div class="form-group">
<label>Complexity Multiplier</label>
<select id="projectComplexity">
<option value="0.8">Simple (0.8x)</option>
<option value="1" selected>Standard (1x)</option>
<option value="1.2">Complex (1.2x)</option>
<option value="1.5">Highly Complex (1.5x)</option>
<option value="2">Expert/Urgent (2x)</option>
</select>
</div>
<div class="result-box">
<div class="main-result">
<span>Recommended Project Fee:</span>
<span id="projectFee">£8,000</span>
</div>
<div class="help-text" id="projectCalc"></div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">📅 Retainer Calculator</div>
<div class="calculator-section">
<div class="form-group">
<label>Monthly Hours Included</label>
<input type="number" id="retainerHours" value="10">
</div>
<div class="result-box">
<div class="info-row">
<span>Standard Rate:</span>
<span id="retainerStandard">£2,000/month</span>
</div>
<div class="main-result">
<span>With 10% Discount:</span>
<span id="retainerDiscounted">£1,800/month</span>
</div>
<div style="margin-top: 12px; padding-top: 12px; border-top: 1px solid #bee3f8;">
<div class="help-text">Annual: <span id="retainerAnnual">£21,600</span></div>
<div class="help-text">Effective hourly: <span id="retainerEffective">£180</span></div>
</div>
</div>
<div class="alert" style="margin-top: 16px;">
<p style="font-size: 13px;">⚠️ Retainers provide predictable income and should include a discount for commitment</p>
</div>
</div>
</div>
</div>
<!-- Market Comparison -->
<div class="card">
<div class="card-header">🎯 Market Comparison & Recommendations</div>
<div class="market-grid">
<div class="market-box">
<h4>NED Range</h4>
<div class="value">£30k - £100k</div>
<div class="current">Your rate: <span id="yourNEDRate">£60,000</span></div>
<div class="status" id="nedStatus">Mid-range</div>
</div>
<div class="market-box">
<h4>Interim Day Rate</h4>
<div class="value">~£2,500</div>
<div class="current">Market standard</div>
</div>
<div class="market-box">
<h4>Your Consulting Rate</h4>
<div class="value" id="yourConsultingRate">£1,500</div>
<div class="current">Calculated day rate</div>
<div class="status" id="consultingStatus">Competitive range</div>
</div>
</div>
<div class="recommendations">
<h4>Strategic Recommendations</h4>
<ul id="recommendationsList">
<li>• Consider positioning consulting work at £1,500 per day for easier communication</li>
<li>• For complex projects (market entry, carrier setup), consider value-based pricing at 2-3x your day rate</li>
<li>• Bundle retainers with a 10-15% discount to encourage longer commitments</li>
<li>• Review rates quarterly as you build portfolio and reputation</li>
<li>• Premium services (CEO/CUO interim) should maintain the £2,500/day market standard</li>
</ul>
</div>
</div>
</div>
<script>
function calculate() {
// Get all input values
const targetIncome = parseFloat(document.getElementById('targetIncome').value) || 0;
const existingNEDFee = parseFloat(document.getElementById('existingNEDFee').value) || 0;
const existingNEDDays = parseFloat(document.getElementById('existingNEDDays').value) || 0;
const additionalNEDs = parseFloat(document.getElementById('additionalNEDs').value) || 0;
const additionalNEDFee = parseFloat(document.getElementById('additionalNEDFee').value) || 0;
const additionalNEDDays = parseFloat(document.getElementById('additionalNEDDays').value) || 0;
const interimDays = parseFloat(document.getElementById('interimDays').value) || 0;
const interimDayRate = parseFloat(document.getElementById('interimDayRate').value) || 0;
const insurance = parseFloat(document.getElementById('insurance').value) || 0;
const software = parseFloat(document.getElementById('software').value) || 0;
const marketingMonthly = parseFloat(document.getElementById('marketingMonthly').value) || 0;
const otherExpenses = parseFloat(document.getElementById('otherExpenses').value) || 0;
const holidays = parseFloat(document.getElementById('holidays').value) || 0;
const adminDays = parseFloat(document.getElementById('adminDays').value) || 0;
const billableDaysTarget = parseFloat(document.getElementById('billableDaysTarget').value) || 0;
const targetUtilization = parseFloat(document.getElementById('targetUtilization').value) / 100 || 0;
const profitMargin = parseFloat(document.getElementById('profitMargin').value) / 100 || 0;
// Show/hide conditional fields
document.getElementById('additionalNEDFields').style.display = additionalNEDs > 0 ? 'block' : 'none';
document.getElementById('interimFields').style.display = interimDays > 0 ? 'block' : 'none';
// Calculate total expenses
const totalAnnualExpenses = insurance + software + (marketingMonthly * 12) + otherExpenses;
// Calculate revenue needed
const revenueNeeded = targetIncome + totalAnnualExpenses;
const revenueNeededWithProfit = revenueNeeded / (1 - profitMargin);
// Calculate existing revenue streams
const totalNEDRevenue = existingNEDFee + (additionalNEDs * additionalNEDFee);
const interimRevenue = interimDays * interimDayRate;
const existingRevenue = totalNEDRevenue + interimRevenue;
// Calculate remaining revenue needed
const remainingRevenueNeeded = revenueNeededWithProfit - existingRevenue;
// Calculate available days
const workingDays = 260;
const totalNEDDays = existingNEDDays + (additionalNEDs * additionalNEDDays);
const unavailableDays = holidays + adminDays + totalNEDDays + interimDays;
const availableDaysForConsulting = workingDays - unavailableDays;
const targetBillableDays = Math.min(billableDaysTarget, availableDaysForConsulting * targetUtilization);
// Calculate recommended rates
const recommendedDayRate = remainingRevenueNeeded / targetBillableDays;
const recommendedHourlyRate = recommendedDayRate / 7.5;
// Update capacity breakdown
document.getElementById('workingDays').textContent = `${workingDays} days`;
document.getElementById('totalNEDDays').textContent = `-${totalNEDDays} days`;
document.getElementById('interimDaysDisplay').textContent = `-${interimDays} days`;
document.getElementById('holidaysDisplay').textContent = `-${holidays} days`;
document.getElementById('adminDaysDisplay').textContent = `-${adminDays} days`;
document.getElementById('availableDays').textContent = `${availableDaysForConsulting} days`;
document.getElementById('maxDaysHelp').textContent = `Max available: ${Math.round(availableDaysForConsulting * targetUtilization)} days`;
// Update stat cards
document.getElementById('dayRate').textContent = `£${Math.round(recommendedDayRate).toLocaleString()}`;
document.getElementById('dayRateSubtext').textContent = `Based on ${Math.round(targetBillableDays)} billable days`;
document.getElementById('hourlyRate').textContent = `£${Math.round(recommendedHourlyRate)}`;
document.getElementById('revenueGap').textContent = `£${Math.round(remainingRevenueNeeded).toLocaleString()}`;
// Update financial breakdown
document.getElementById('targetIncomeDisplay').textContent = `£${targetIncome.toLocaleString()}`;
document.getElementById('totalExpensesDisplay').textContent = `£${totalAnnualExpenses.toLocaleString()}`;
document.getElementById('profitLabel').textContent = `Profit Margin (${Math.round(profitMargin * 100)}%):`;
document.getElementById('profitAmount').textContent = `£${Math.round(revenueNeededWithProfit - revenueNeeded).toLocaleString()}`;
document.getElementById('totalRevenueNeeded').textContent = `£${Math.round(revenueNeededWithProfit).toLocaleString()}`;
document.getElementById('nedRevenue').textContent = `£${totalNEDRevenue.toLocaleString()}`;
document.getElementById('interimRevenue').textContent = `£${interimRevenue.toLocaleString()}`;
document.getElementById('consultingRevenue').textContent = `£${Math.round(remainingRevenueNeeded).toLocaleString()}`;
document.getElementById('totalRevenue').textContent = `£${Math.round(existingRevenue + remainingRevenueNeeded).toLocaleString()}`;
// Show surplus alert if applicable
const surplusAlert = document.getElementById('surplusAlert');
if (remainingRevenueNeeded < 0) {
surplusAlert.style.display = 'block';
surplusAlert.querySelector('p').textContent = `✓ Your existing revenue streams exceed your target! You have £${Math.abs(Math.round(remainingRevenueNeeded)).toLocaleString()} surplus.`;
} else {
surplusAlert.style.display = 'none';
}
// Update project calculator
const projectHours = parseFloat(document.getElementById('projectHours').value) || 0;
const projectComplexity = parseFloat(document.getElementById('projectComplexity').value) || 1;
const projectFee = projectHours * recommendedHourlyRate * projectComplexity;
document.getElementById('projectFee').textContent = `£${Math.round(projectFee).toLocaleString()}`;
document.getElementById('projectCalc').textContent = `${projectHours} hours × £${Math.round(recommendedHourlyRate)} × ${projectComplexity}`;
// Update retainer calculator
const retainerHours = parseFloat(document.getElementById('retainerHours').value) || 0;
const retainerMonthlyFee = retainerHours * recommendedHourlyRate;
const retainerDiscountedFee = retainerMonthlyFee * 0.9;
document.getElementById('retainerStandard').textContent = `£${Math.round(retainerMonthlyFee).toLocaleString()}/month`;
document.getElementById('retainerDiscounted').textContent = `£${Math.round(retainerDiscountedFee).toLocaleString()}/month`;
document.getElementById('retainerAnnual').textContent = `£${Math.round(retainerDiscountedFee * 12).toLocaleString()}`;
document.getElementById('retainerEffective').textContent = `£${Math.round(retainerDiscountedFee / retainerHours)}`;
// Update market comparison
document.getElementById('yourNEDRate').textContent = `£${existingNEDFee.toLocaleString()}`;
let nedStatus = 'Mid-range';
if (existingNEDFee < 45000) nedStatus = 'Below mid-range';
if (existingNEDFee > 80000) nedStatus = 'Premium range';
document.getElementById('nedStatus').textContent = nedStatus;
document.getElementById('yourConsultingRate').textContent = `£${Math.round(recommendedDayRate).toLocaleString()}`;
let consultingStatus = 'Competitive range';
if (recommendedDayRate < 2000) consultingStatus = 'Lower than interim';
if (recommendedDayRate > 3000) consultingStatus = 'Premium positioning';
document.getElementById('consultingStatus').textContent = consultingStatus;
// Update recommendations
const recommendations = [
`• Consider positioning consulting work at £${Math.round(recommendedDayRate/100)*100} per day for easier communication`,
`• For complex projects (market entry, carrier setup), consider value-based pricing at 2-3x your day rate`,
`• Bundle retainers with a 10-15% discount to encourage longer commitments`,
`• Review rates quarterly as you build portfolio and reputation`,
`• Premium services (CEO/CUO interim) should maintain the £2,500/day market standard`
];
if (availableDaysForConsulting < billableDaysTarget) {
recommendations.push(`⚠ Warning: You may not have enough available days to meet your billable target. Consider reducing NED commitments or adjusting your target.`);
}
document.getElementById('recommendationsList').innerHTML = recommendations.map(r => `<li>${r}</li>`).join('');
}
// Add event listeners to all inputs
const inputs = document.querySelectorAll('input, select');
inputs.forEach(input => {
input.addEventListener('input', calculate);
});
// Initial calculation
calculate();
</script>
</body>
</html>