Deal Assumptions

$500
$

Net profit generated from one closed customer.

20%

Percentage of leads that turn into paying jobs.

20

Your Offer

$

Adjust this to find the "sweet spot"

Break-Even CPL

$100

Max they can pay per lead before losing money.

Total Value Generated

$2,000

Based on inputs

Your Cost Per Lead

$25.00

At your rental price

Business Owner's ROI

300% Return

Business Owner keeps:

$1,500

Net Profit after paying rent

Deal Quality:

Excellent

You are leaving them plenty of margin.

Value Pitch Script

"Based on your close rate, a single lead is worth $100 to your business. I'm offering these exclusive leads for just $25 each. If you close just 1 out of these 20 leads, you've paid for the entire month. Everything else is pure profit."
[bot_catcher] + jobValue.toLocaleString(); document.getElementById('closeRateDisplay').innerText = closeRate + '%'; document.getElementById('leadsDisplay').innerText = leads; // Calculations // 1. Break-even Cost Per Lead (Value of a lead) // If they close 20%, it takes 5 leads to get 1 job. // So 5 leads are worth $JobValue. 1 Lead = JobValue * (CloseRate/100) const leadValue = jobValue * (closeRate / 100); // 2. Total Revenue Generated const totalRevenue = leadValue * leads; // 3. Effective Cost Per Lead (What you are charging them) const effectiveCPL = leads > 0 ? rent / leads : 0; // 4. Client Profit const clientProfit = totalRevenue - rent; // 5. ROI Multiplier const roi = rent > 0 ? ((totalRevenue - rent) / rent) * 100 : 0; // Update DOM Results document.getElementById('breakevenCPL').innerText = '
[bot_catcher] + leadValue.toFixed(2); document.getElementById('totalValue').innerText = '
[bot_catcher] + totalRevenue.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); document.getElementById('effectiveCPL').innerText = '
[bot_catcher] + effectiveCPL.toFixed(2); document.getElementById('clientProfit').innerText = '
[bot_catcher] + clientProfit.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); const roiBadge = document.getElementById('roiBadge'); roiBadge.innerText = Math.round(roi) + '% Return'; // Deal Quality Logic const dealQuality = document.getElementById('dealQuality'); const dealMessage = document.getElementById('dealMessage'); // Rent to Revenue Ratio const ratio = rent / totalRevenue; if (clientProfit < 0) { dealQuality.innerText = "Negative ROI"; dealQuality.className = "text-lg font-bold text-red-600"; dealMessage.innerText = "The price is too high for their close rate."; roiBadge.className = "mt-2 md:mt-0 px-4 py-1 rounded-full text-sm font-bold bg-red-100 text-red-700 border border-red-200"; } else if (ratio < 0.15) { dealQuality.innerText = "No-Brainer Deal"; dealQuality.className = "text-lg font-bold text-emerald-600"; dealMessage.innerText = "You are underpricing. You could charge more."; roiBadge.className = "mt-2 md:mt-0 px-4 py-1 rounded-full text-sm font-bold bg-emerald-100 text-emerald-700 border border-emerald-200"; } else if (ratio < 0.30) { dealQuality.innerText = "Fair / Standard"; dealQuality.className = "text-lg font-bold text-blue-600"; dealMessage.innerText = "Good balance for both parties."; roiBadge.className = "mt-2 md:mt-0 px-4 py-1 rounded-full text-sm font-bold bg-blue-100 text-blue-700 border border-blue-200"; } else { dealQuality.innerText = "Aggressive"; dealQuality.className = "text-lg font-bold text-yellow-600"; dealMessage.innerText = "High asking price relative to value."; roiBadge.className = "mt-2 md:mt-0 px-4 py-1 rounded-full text-sm font-bold bg-yellow-100 text-yellow-700 border border-yellow-200"; } // Update Script const jobsToBreakEven = Math.ceil(rent / jobValue); document.getElementById('pitchScript').innerHTML = `"Based on your close rate, a single lead is mathematically worth ${leadValue.toFixed(0)} to your business. I'm offering these exclusive leads for effectively ${effectiveCPL.toFixed(0)} each.

Put another way: If you close just ${jobsToBreakEven} job${jobsToBreakEven > 1 ? 's':''} out of the ${leads} leads I send, you've paid for the entire month. Everything else is profit."`; // Update Chart updateChart(rent, clientProfit); } function updateChart(cost, profit) { const ctx = document.getElementById('roiChart').getContext('2d'); // If profit is negative, we need to handle chart gracefully const displayProfit = profit < 0 ? 0 : profit; if (roiChart) { roiChart.destroy(); } roiChart = new Chart(ctx, { type: 'bar', data: { labels: ['Cost (Rent)', 'Your Net Profit'], datasets: [{ label: 'Monthly Value', data: [cost, displayProfit], backgroundColor: [ 'rgba(59, 130, 246, 0.5)', // Blue for Cost 'rgba(16, 185, 129, 0.6)' // Green for Profit ], borderColor: [ 'rgba(59, 130, 246, 1)', 'rgba(16, 185, 129, 1)' ], borderWidth: 1, borderRadius: 5 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false }, tooltip: { callbacks: { label: function(context) { let label = context.dataset.label || ''; if (label) { label += ': '; } if (context.parsed.y !== null) { label += new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(context.parsed.y); } return label; } } } }, scales: { y: { beginAtZero: true, ticks: { callback: function(value) { return '
[bot_catcher] + value; } } } } } }); } function copyPitch() { const text = document.getElementById('pitchScript').innerText; const tempInput = document.createElement('textarea'); tempInput.value = text; document.body.appendChild(tempInput); tempInput.select(); document.execCommand('copy'); document.body.removeChild(tempInput); const btn = document.querySelector('button[onclick="copyPitch()"]'); const originalHTML = btn.innerHTML; btn.innerHTML = ' Copied!'; setTimeout(() => { btn.innerHTML = originalHTML; }, 2000); } // Initialize document.addEventListener('DOMContentLoaded', () => { updateCalculator(); });
[bot_catcher]