LetsBeBiz-Redesign/docs/sales/LetsBe_Biz_ROI_Calculator.html

814 lines
29 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LetsBe Biz — ROI Calculator</title>
<style>
:root {
--celes-blue: #449DD1;
--dark-navy: #1C3144;
--light-sky: #6CB4E4;
--pale-blue: #F0F5FA;
--steel-blue: #C4D5E8;
--mid-gray: #94A3B8;
--dark-gray: #334155;
--success: #22C55E;
--warning: #EAB308;
--error: #EF4444;
--white: #FFFFFF;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
color: var(--dark-navy);
background: var(--pale-blue);
line-height: 1.6;
}
.container {
max-width: 1100px;
margin: 0 auto;
padding: 20px;
}
/* Header */
.header {
text-align: center;
padding: 40px 20px 30px;
background: linear-gradient(135deg, var(--dark-navy) 0%, #2a4a6b 100%);
color: var(--white);
border-radius: 16px;
margin-bottom: 30px;
}
.header h1 {
font-size: 2.2rem;
margin-bottom: 8px;
font-weight: 700;
}
.header h1 span { color: var(--light-sky); }
.header p {
font-size: 1.1rem;
color: var(--steel-blue);
max-width: 600px;
margin: 0 auto;
}
/* Cards */
.card {
background: var(--white);
border-radius: 12px;
padding: 28px;
margin-bottom: 24px;
box-shadow: 0 1px 3px rgba(28,49,68,0.08);
border: 1px solid var(--steel-blue);
}
.card h2 {
font-size: 1.3rem;
color: var(--dark-navy);
margin-bottom: 6px;
display: flex;
align-items: center;
gap: 10px;
}
.card h2 .step {
background: var(--celes-blue);
color: white;
width: 32px;
height: 32px;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
font-weight: 700;
flex-shrink: 0;
}
.card .subtitle {
color: var(--mid-gray);
font-size: 0.9rem;
margin-bottom: 20px;
margin-left: 42px;
}
/* Tool Grid */
.tool-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 12px;
}
.tool-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 14px;
background: var(--pale-blue);
border-radius: 8px;
transition: all 0.15s;
border: 1px solid transparent;
}
.tool-row:hover { border-color: var(--steel-blue); }
.tool-row.active {
background: #e8f4fd;
border-color: var(--celes-blue);
}
.tool-left {
display: flex;
align-items: center;
gap: 10px;
flex: 1;
}
.tool-left input[type="checkbox"] {
width: 18px;
height: 18px;
accent-color: var(--celes-blue);
cursor: pointer;
}
.tool-name {
font-weight: 600;
font-size: 0.9rem;
color: var(--dark-navy);
}
.tool-desc {
font-size: 0.75rem;
color: var(--mid-gray);
}
.tool-price {
text-align: right;
min-width: 70px;
}
.tool-price input {
width: 70px;
padding: 4px 6px;
border: 1px solid var(--steel-blue);
border-radius: 6px;
text-align: right;
font-size: 0.85rem;
color: var(--dark-navy);
}
.tool-price input:focus {
outline: none;
border-color: var(--celes-blue);
box-shadow: 0 0 0 2px rgba(68,157,209,0.15);
}
/* Category headers */
.category-header {
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--celes-blue);
padding: 12px 0 6px;
grid-column: 1 / -1;
border-bottom: 1px solid var(--steel-blue);
margin-top: 8px;
}
.category-header:first-child { margin-top: 0; }
/* Custom entry */
.custom-entry {
margin-top: 16px;
padding: 16px;
background: var(--pale-blue);
border-radius: 8px;
}
.custom-entry h3 {
font-size: 0.9rem;
color: var(--dark-navy);
margin-bottom: 10px;
}
.custom-inputs {
display: flex;
gap: 10px;
flex-wrap: wrap;
align-items: flex-end;
}
.custom-inputs label {
font-size: 0.8rem;
color: var(--mid-gray);
display: block;
margin-bottom: 3px;
}
.custom-inputs input {
padding: 6px 10px;
border: 1px solid var(--steel-blue);
border-radius: 6px;
font-size: 0.85rem;
width: 200px;
}
.custom-inputs input[type="number"] { width: 90px; }
.btn-add {
padding: 6px 16px;
background: var(--celes-blue);
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 0.85rem;
font-weight: 600;
}
.btn-add:hover { background: #3a8bc0; }
/* Results */
.results-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 14px;
margin-bottom: 20px;
}
@media (max-width: 768px) {
.results-grid { grid-template-columns: repeat(2, 1fr); }
}
.tier-card {
border-radius: 10px;
padding: 20px;
text-align: center;
border: 2px solid var(--steel-blue);
background: var(--white);
transition: all 0.2s;
position: relative;
}
.tier-card.recommended {
border-color: var(--celes-blue);
box-shadow: 0 4px 12px rgba(68,157,209,0.2);
}
.tier-card.recommended::after {
content: 'BEST VALUE';
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
background: var(--celes-blue);
color: white;
font-size: 0.7rem;
font-weight: 700;
padding: 2px 12px;
border-radius: 10px;
letter-spacing: 0.05em;
}
.tier-name {
font-weight: 700;
font-size: 1rem;
color: var(--dark-navy);
margin-bottom: 2px;
}
.tier-spec {
font-size: 0.75rem;
color: var(--mid-gray);
margin-bottom: 10px;
}
.tier-price {
font-size: 2rem;
font-weight: 800;
color: var(--celes-blue);
}
.tier-price span { font-size: 0.9rem; font-weight: 400; color: var(--mid-gray); }
.tier-savings {
margin-top: 8px;
font-size: 0.85rem;
font-weight: 600;
}
.savings-positive { color: var(--success); }
.savings-negative { color: var(--error); }
.tier-percent {
font-size: 1.5rem;
font-weight: 800;
margin-top: 4px;
}
.tier-features {
text-align: left;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--steel-blue);
font-size: 0.8rem;
color: var(--dark-gray);
}
.tier-features div {
padding: 2px 0;
}
/* Summary bar */
.summary-bar {
background: linear-gradient(135deg, var(--dark-navy) 0%, #2a4a6b 100%);
border-radius: 12px;
padding: 24px 28px;
color: white;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 16px;
}
.summary-item {
text-align: center;
}
.summary-label {
font-size: 0.8rem;
color: var(--steel-blue);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.summary-value {
font-size: 1.8rem;
font-weight: 800;
}
.summary-value.highlight { color: var(--light-sky); }
.summary-value.savings { color: var(--success); }
/* Breakdown table */
.breakdown-table {
width: 100%;
border-collapse: collapse;
margin-top: 16px;
}
.breakdown-table th {
text-align: left;
padding: 8px 12px;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.03em;
color: var(--mid-gray);
border-bottom: 2px solid var(--steel-blue);
}
.breakdown-table td {
padding: 8px 12px;
font-size: 0.9rem;
border-bottom: 1px solid var(--pale-blue);
}
.breakdown-table tr:hover td { background: var(--pale-blue); }
.breakdown-table .cost-col { text-align: right; font-weight: 600; color: var(--error); }
.breakdown-table .total-row td {
font-weight: 700;
border-top: 2px solid var(--dark-navy);
font-size: 1rem;
}
/* VA comparison */
.va-compare {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-top: 16px;
}
@media (max-width: 600px) { .va-compare { grid-template-columns: 1fr; } }
.va-box {
padding: 20px;
border-radius: 10px;
text-align: center;
}
.va-box.va-human {
background: #fef3f2;
border: 1px solid #fecaca;
}
.va-box.va-letsbe {
background: #f0fdf4;
border: 1px solid #bbf7d0;
}
.va-box h3 { font-size: 0.9rem; margin-bottom: 6px; }
.va-box .va-price { font-size: 1.6rem; font-weight: 800; }
.va-box .va-detail { font-size: 0.8rem; color: var(--mid-gray); margin-top: 4px; }
.va-human .va-price { color: var(--error); }
.va-letsbe .va-price { color: var(--success); }
/* Footnotes */
.footnote {
font-size: 0.75rem;
color: var(--mid-gray);
margin-top: 16px;
padding-top: 12px;
border-top: 1px solid var(--steel-blue);
}
/* Toggle */
.toggle-group {
display: flex;
gap: 0;
margin-bottom: 16px;
background: var(--pale-blue);
border-radius: 8px;
padding: 3px;
width: fit-content;
}
.toggle-btn {
padding: 6px 18px;
border: none;
background: transparent;
color: var(--mid-gray);
font-size: 0.85rem;
font-weight: 600;
cursor: pointer;
border-radius: 6px;
transition: all 0.15s;
}
.toggle-btn.active {
background: var(--white);
color: var(--dark-navy);
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
</style>
</head>
<body>
<div class="container">
<!-- Header -->
<div class="header">
<h1>How much could you <span>save</span> with LetsBe?</h1>
<p>Select the SaaS tools you're currently paying for. We'll show you the real numbers.</p>
</div>
<!-- Step 1: Select Tools -->
<div class="card">
<h2><span class="step">1</span> What are you paying for today?</h2>
<p class="subtitle">Check the tools you use and adjust prices to match your actual spend. Pre-filled with typical SMB pricing.</p>
<div style="display: flex; align-items: center; gap: 14px; margin-bottom: 16px; padding: 12px 16px; background: var(--pale-blue); border-radius: 8px; border: 1px solid var(--steel-blue);">
<label for="teamSize" style="font-weight: 600; font-size: 0.9rem; color: var(--dark-navy); white-space: nowrap;">Team size:</label>
<input type="number" id="teamSize" value="3" min="1" max="100" step="1"
style="width: 60px; padding: 6px 8px; border: 1px solid var(--celes-blue); border-radius: 6px; text-align: center; font-size: 0.95rem; font-weight: 600; color: var(--dark-navy);"
onchange="calculate()" oninput="calculate()">
<span style="font-size: 0.8rem; color: var(--mid-gray);">Per-seat tools (marked <strong style="color: var(--celes-blue);">×N</strong>) are multiplied by team size. Flat-rate tools are not.</span>
</div>
<div class="toggle-group">
<button class="toggle-btn active" onclick="setView('preset')">Common Tools</button>
<button class="toggle-btn" onclick="setView('custom')">Custom Entry</button>
</div>
<div id="presetView">
<div class="tool-grid" id="toolGrid"></div>
</div>
<div id="customView" style="display:none;">
<div id="customList"></div>
<div class="custom-entry">
<h3>Add a tool or subscription</h3>
<div class="custom-inputs">
<div>
<label>Tool / Service Name</label>
<input type="text" id="customName" placeholder="e.g. Notion">
</div>
<div>
<label>Monthly Cost (€)</label>
<input type="number" id="customCost" placeholder="29" min="0" step="0.01">
</div>
<button class="btn-add" onclick="addCustomTool()">+ Add</button>
</div>
</div>
</div>
</div>
<!-- Step 2: Results -->
<div class="card">
<h2><span class="step">2</span> Your savings with LetsBe Biz</h2>
<p class="subtitle">All tiers include your tools, AI agents, hosting, backups, monitoring, and support.</p>
<div class="summary-bar" id="summaryBar">
<div class="summary-item">
<div class="summary-label">Current Monthly Spend</div>
<div class="summary-value highlight" id="currentTotal">€0</div>
</div>
<div class="summary-item">
<div class="summary-label">Best LetsBe Price</div>
<div class="summary-value" id="bestPrice">€45</div>
</div>
<div class="summary-item">
<div class="summary-label">Monthly Savings</div>
<div class="summary-value savings" id="monthlySavings">€0</div>
</div>
<div class="summary-item">
<div class="summary-label">Annual Savings</div>
<div class="summary-value savings" id="annualSavings">€0</div>
</div>
</div>
<div class="results-grid" id="tierCards" style="margin-top: 20px;"></div>
<!-- VA comparison -->
<div style="margin-top: 10px;">
<h3 style="font-size: 1rem; color: var(--dark-navy); margin-bottom: 4px;">Compared to a human virtual assistant</h3>
<p style="font-size: 0.85rem; color: var(--mid-gray); margin-bottom: 12px;">LetsBe replaces the tasks you'd outsource to a VA — scheduling, follow-ups, data entry, email management, reporting — 24/7.</p>
<div class="va-compare">
<div class="va-box va-human">
<h3>Part-Time VA (10 hrs/week)</h3>
<div class="va-price">€1,0002,500/mo</div>
<div class="va-detail">$2560/hr · Limited hours · Training required · Turnover risk</div>
</div>
<div class="va-box va-letsbe">
<h3>LetsBe AI Team (24/7)</h3>
<div class="va-price" id="vaLetsbePrice">€45/mo</div>
<div class="va-detail">All tools included · Always available · Learns your business · No turnover</div>
</div>
</div>
</div>
</div>
<!-- Step 3: Breakdown -->
<div class="card">
<h2><span class="step">3</span> Your current cost breakdown</h2>
<p class="subtitle">Every tool you selected, with the price you're paying.</p>
<table class="breakdown-table" id="breakdownTable">
<thead>
<tr><th>Tool / Service</th><th>Replaced By</th><th style="text-align:right">Monthly Cost</th></tr>
</thead>
<tbody id="breakdownBody"></tbody>
</table>
</div>
<!-- Footer -->
<div class="footnote" style="text-align: center; padding: 20px 0;">
<p><strong>LetsBe Biz</strong> — Your AI team, your private server, your rules.</p>
<p>Prices as of February 2026. Competitor pricing sourced from public pricing pages. LetsBe prices in EUR, billed monthly. Annual billing saves 15%.</p>
<p style="margin-top: 8px;">LetsBe Solutions LLC · 221 North Broad Street, Suite 3A, Middletown, DE 19709</p>
</div>
</div>
<script>
// ===== TOOL DATA =====
// Prices verified February 2026 (monthly billing)
// perSeat: true = price is per user/seat (multiplied by team size)
// perSeat: false = flat rate (same price regardless of team size)
const TOOLS = [
// CRM & Sales
{ cat: "CRM & Sales", name: "HubSpot CRM", desc: "Starter", price: 20, perSeat: true, replacement: "Odoo CRM" },
{ cat: "CRM & Sales", name: "Salesforce", desc: "Starter Suite", price: 35, perSeat: true, replacement: "Odoo CRM" },
{ cat: "CRM & Sales", name: "Pipedrive", desc: "Lite", price: 24, perSeat: true, replacement: "Odoo CRM" },
{ cat: "CRM & Sales", name: "Freshsales", desc: "Growth", price: 18, perSeat: true, replacement: "Odoo CRM" },
// Email & Communication
{ cat: "Email & Communication", name: "Google Workspace", desc: "Business Starter", price: 8, perSeat: true, replacement: "Stalwart Mail + Chatwoot" },
{ cat: "Email & Communication", name: "Microsoft 365", desc: "Business Basic", price: 6, perSeat: true, replacement: "Stalwart Mail" },
{ cat: "Email & Communication", name: "Slack", desc: "Pro", price: 9, perSeat: true, replacement: "Chatwoot / Mattermost" },
{ cat: "Email & Communication", name: "Intercom", desc: "Essential", price: 39, perSeat: true, replacement: "Chatwoot" },
{ cat: "Email & Communication", name: "Zendesk", desc: "Suite Team", price: 69, perSeat: true, replacement: "Chatwoot" },
// Email Marketing
{ cat: "Email Marketing", name: "Mailchimp", desc: "Essentials · 500 contacts", price: 13, perSeat: false, replacement: "Listmonk" },
{ cat: "Email Marketing", name: "Kit (fka ConvertKit)", desc: "Creator · 1k subscribers", price: 39, perSeat: false, replacement: "Listmonk" },
{ cat: "Email Marketing", name: "ActiveCampaign", desc: "Starter · 1k contacts", price: 19, perSeat: false, replacement: "Listmonk" },
// Project Management
{ cat: "Project Management", name: "Asana", desc: "Starter", price: 13, perSeat: true, replacement: "Plane" },
{ cat: "Project Management", name: "Monday.com", desc: "Basic (min 3 seats)", price: 12, perSeat: true, replacement: "Plane" },
{ cat: "Project Management", name: "Trello", desc: "Standard", price: 6, perSeat: true, replacement: "Plane" },
{ cat: "Project Management", name: "Basecamp", desc: "Pro Unlimited · flat rate", price: 349, perSeat: false, replacement: "Plane" },
{ cat: "Project Management", name: "ClickUp", desc: "Unlimited", price: 10, perSeat: true, replacement: "Plane" },
// File Storage & Docs
{ cat: "File Storage & Docs", name: "Dropbox", desc: "Plus", price: 20, perSeat: true, replacement: "Nextcloud" },
{ cat: "File Storage & Docs", name: "Google One", desc: "100GB", price: 2, perSeat: true, replacement: "Nextcloud" },
{ cat: "File Storage & Docs", name: "Notion", desc: "Plus", price: 12, perSeat: true, replacement: "Nextcloud + Wiki.js" },
// Invoicing & Accounting
{ cat: "Invoicing & Accounting", name: "QuickBooks", desc: "Simple Start", price: 38, perSeat: false, replacement: "Bigcapital" },
{ cat: "Invoicing & Accounting", name: "FreshBooks", desc: "Lite", price: 19, perSeat: false, replacement: "Bigcapital" },
{ cat: "Invoicing & Accounting", name: "Xero", desc: "Early (Starter)", price: 13, perSeat: false, replacement: "Bigcapital" },
{ cat: "Invoicing & Accounting", name: "Wave", desc: "Pro plan", price: 19, perSeat: false, replacement: "Bigcapital" },
// Website & CMS
{ cat: "Website & CMS", name: "Squarespace", desc: "Business", price: 25, perSeat: false, replacement: "Ghost" },
{ cat: "Website & CMS", name: "Wix", desc: "Business", price: 39, perSeat: false, replacement: "Ghost" },
{ cat: "Website & CMS", name: "WordPress.com", desc: "Business", price: 25, perSeat: false, replacement: "Ghost" },
// Scheduling & Calendar
{ cat: "Scheduling & Calendar", name: "Calendly", desc: "Standard", price: 16, perSeat: true, replacement: "Cal.com" },
{ cat: "Scheduling & Calendar", name: "Acuity Scheduling", desc: "Emerging", price: 20, perSeat: false, replacement: "Cal.com" },
// Analytics
{ cat: "Analytics", name: "Google Analytics", desc: "Standard (free)", price: 0, perSeat: false, replacement: "Umami (free, self-hosted)" },
{ cat: "Analytics", name: "Hotjar", desc: "Plus", price: 39, perSeat: false, replacement: "Umami" },
{ cat: "Analytics", name: "Mixpanel", desc: "Growth · ~1M events/mo", price: 20, perSeat: false, replacement: "Umami" },
// Automation
{ cat: "Automation", name: "Zapier", desc: "Professional · 750 tasks", price: 30, perSeat: false, replacement: "n8n + Activepieces" },
{ cat: "Automation", name: "Make.com", desc: "Core · 10k ops", price: 11, perSeat: false, replacement: "n8n + Activepieces" },
// Design
{ cat: "Design", name: "Canva", desc: "Pro", price: 15, perSeat: true, replacement: "Penpot" },
// Forms & Surveys
{ cat: "Forms & Surveys", name: "Typeform", desc: "Basic", price: 29, perSeat: false, replacement: "Formbricks" },
{ cat: "Forms & Surveys", name: "JotForm", desc: "Bronze", price: 39, perSeat: false, replacement: "Formbricks" },
// Documents & E-Signing
{ cat: "Documents & E-Signing", name: "DocuSign", desc: "Personal", price: 15, perSeat: false, replacement: "Documenso" },
{ cat: "Documents & E-Signing", name: "PandaDoc", desc: "Essentials", price: 25, perSeat: true, replacement: "Documenso" },
// Password Management
{ cat: "Password Management", name: "1Password", desc: "Teams (up to 10 users)", price: 20, perSeat: false, replacement: "Vaultwarden" },
{ cat: "Password Management", name: "LastPass", desc: "Teams", price: 4, perSeat: true, replacement: "Vaultwarden" },
// AI Assistants
{ cat: "AI Assistants", name: "ChatGPT Plus", desc: "Monthly", price: 20, perSeat: true, replacement: "LetsBe AI (included)" },
{ cat: "AI Assistants", name: "Claude Pro", desc: "Monthly", price: 20, perSeat: true, replacement: "LetsBe AI (included)" },
{ cat: "AI Assistants", name: "Microsoft Copilot", desc: "M365 add-on", price: 21, perSeat: true, replacement: "LetsBe AI (included)" },
];
// ===== LETSBE TIERS =====
const TIERS = [
{ name: "Lite", price: 29, annual: Math.round(29 * 0.85), spec: "4c / 8GB / 5-8 tools", tools: "5-8", tokens: "8M", target: "Solo freelancer" },
{ name: "Build", price: 45, annual: Math.round(45 * 0.85), spec: "8c / 16GB / 10-15 tools", tools: "10-15", tokens: "15M", target: "SMB (1-10 people)" },
{ name: "Scale", price: 75, annual: Math.round(75 * 0.85), spec: "12c / 32GB / 15-25 tools", tools: "15-25", tokens: "25M", target: "Agency / e-commerce" },
{ name: "Enterprise", price: 109, annual: Math.round(109 * 0.85), spec: "16c / 64GB / All tools", tools: "28+", tokens: "40M", target: "Power user / regulated" },
];
let customTools = [];
// ===== RENDER =====
function renderToolGrid() {
const grid = document.getElementById('toolGrid');
let currentCat = '';
let html = '';
TOOLS.forEach((tool, i) => {
if (tool.cat !== currentCat) {
currentCat = tool.cat;
html += `<div class="category-header">${currentCat}</div>`;
}
const seatBadge = tool.perSeat
? '<span style="font-size:0.7rem;font-weight:700;color:var(--celes-blue);margin-left:4px;vertical-align:middle;" title="Per seat — multiplied by team size">×N</span>'
: '';
const priceLabel = tool.perSeat ? '/seat' : '/mo';
html += `
<div class="tool-row" id="row-${i}" onclick="toggleTool(${i})">
<div class="tool-left">
<input type="checkbox" id="cb-${i}" onchange="calculate()" onclick="event.stopPropagation()">
<div>
<div class="tool-name">${tool.name}${seatBadge}</div>
<div class="tool-desc">${tool.desc} · Replaced by ${tool.replacement}</div>
</div>
</div>
<div class="tool-price">
<input type="number" id="price-${i}" value="${tool.price}" min="0" step="0.01"
onclick="event.stopPropagation()" onchange="calculate()" onfocus="this.select()"
title="${tool.perSeat ? 'Price per seat/user — multiplied by team size' : 'Flat monthly rate'}">
</div>
</div>
`;
});
grid.innerHTML = html;
}
function toggleTool(i) {
const cb = document.getElementById(`cb-${i}`);
cb.checked = !cb.checked;
const row = document.getElementById(`row-${i}`);
row.classList.toggle('active', cb.checked);
calculate();
}
function setView(view) {
document.querySelectorAll('.toggle-btn').forEach(b => b.classList.remove('active'));
event.target.classList.add('active');
document.getElementById('presetView').style.display = view === 'preset' ? '' : 'none';
document.getElementById('customView').style.display = view === 'custom' ? '' : 'none';
}
function addCustomTool() {
const name = document.getElementById('customName').value.trim();
const cost = parseFloat(document.getElementById('customCost').value) || 0;
if (!name) return;
customTools.push({ name, cost, enabled: true });
document.getElementById('customName').value = '';
document.getElementById('customCost').value = '';
renderCustomList();
calculate();
}
function removeCustomTool(i) {
customTools.splice(i, 1);
renderCustomList();
calculate();
}
function renderCustomList() {
const list = document.getElementById('customList');
if (customTools.length === 0) {
list.innerHTML = '<p style="color: var(--mid-gray); font-size: 0.85rem; padding: 10px 0;">No custom tools added yet. Use the form below to add your subscriptions.</p>';
return;
}
let html = '<div style="display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px;">';
customTools.forEach((t, i) => {
html += `
<div class="tool-row active">
<div class="tool-left">
<div>
<div class="tool-name">${t.name}</div>
<div class="tool-desc">Custom entry</div>
</div>
</div>
<div style="display: flex; align-items: center; gap: 10px;">
<span style="font-weight: 600;">€${t.cost.toFixed(2)}/mo</span>
<button onclick="removeCustomTool(${i})" style="background: none; border: none; color: var(--error); cursor: pointer; font-size: 1.1rem; padding: 2px 6px;">×</button>
</div>
</div>
`;
});
html += '</div>';
list.innerHTML = html;
}
// ===== CALCULATE =====
function calculate() {
let totalCurrent = 0;
let selectedTools = [];
const teamSize = Math.max(1, parseInt(document.getElementById('teamSize').value) || 1);
// Preset tools
TOOLS.forEach((tool, i) => {
const cb = document.getElementById(`cb-${i}`);
const priceEl = document.getElementById(`price-${i}`);
const row = document.getElementById(`row-${i}`);
if (cb && cb.checked) {
const unitPrice = parseFloat(priceEl.value) || 0;
const effectivePrice = tool.perSeat ? unitPrice * teamSize : unitPrice;
totalCurrent += effectivePrice;
const label = tool.perSeat ? `${tool.name} (×${teamSize})` : tool.name;
selectedTools.push({ name: label, replacement: tool.replacement, cost: effectivePrice });
row.classList.add('active');
} else if (row) {
row.classList.remove('active');
}
});
// Custom tools
customTools.forEach(t => {
if (t.enabled) {
totalCurrent += t.cost;
selectedTools.push({ name: t.name, replacement: "LetsBe (included)", cost: t.cost });
}
});
// Update summary
document.getElementById('currentTotal').textContent = `${totalCurrent.toFixed(0)}`;
// Find best tier
const toolCount = selectedTools.length;
let recommendedIdx = 1; // Default to Build
if (toolCount <= 8) recommendedIdx = 0;
else if (toolCount <= 15) recommendedIdx = 1;
else if (toolCount <= 25) recommendedIdx = 2;
else recommendedIdx = 3;
const bestPrice = TIERS[recommendedIdx].price;
const savings = totalCurrent - bestPrice;
document.getElementById('bestPrice').textContent = `${bestPrice}`;
document.getElementById('monthlySavings').textContent = savings >= 0 ? `${savings.toFixed(0)}` : `-€${Math.abs(savings).toFixed(0)}`;
document.getElementById('annualSavings').textContent = savings >= 0 ? `${(savings * 12).toFixed(0)}` : `-€${(Math.abs(savings) * 12).toFixed(0)}`;
document.getElementById('vaLetsbePrice').textContent = `${bestPrice}/mo`;
// Tier cards
let tierHTML = '';
TIERS.forEach((tier, idx) => {
const tierSavings = totalCurrent - tier.price;
const percent = totalCurrent > 0 ? Math.round((tierSavings / totalCurrent) * 100) : 0;
const isRec = idx === recommendedIdx;
tierHTML += `
<div class="tier-card ${isRec ? 'recommended' : ''}">
<div class="tier-name">${tier.name}</div>
<div class="tier-spec">${tier.spec}</div>
<div class="tier-price">€${tier.price}<span>/mo</span></div>
<div class="tier-savings ${tierSavings >= 0 ? 'savings-positive' : 'savings-negative'}">
${tierSavings >= 0 ? `Save €${tierSavings.toFixed(0)}/mo` : `${Math.abs(tierSavings).toFixed(0)} more/mo`}
</div>
${totalCurrent > 0 && tierSavings > 0 ? `<div class="tier-percent savings-positive">${percent}% less</div>` : ''}
<div class="tier-features">
<div>Up to ${tier.tools} tools</div>
<div>${tier.tokens} AI tokens/mo</div>
<div>Unlimited agents</div>
<div>${tier.target}</div>
</div>
</div>
`;
});
document.getElementById('tierCards').innerHTML = tierHTML;
// Breakdown table
let tableHTML = '';
selectedTools.sort((a, b) => b.cost - a.cost);
selectedTools.forEach(t => {
tableHTML += `<tr><td>${t.name}</td><td style="color: var(--celes-blue); font-size: 0.85rem;">${t.replacement}</td><td class="cost-col">€${t.cost.toFixed(2)}</td></tr>`;
});
if (selectedTools.length > 0) {
tableHTML += `<tr class="total-row"><td colspan="2">Total Current Monthly Spend</td><td class="cost-col" style="color: var(--dark-navy);">€${totalCurrent.toFixed(2)}</td></tr>`;
tableHTML += `<tr><td colspan="2" style="color: var(--success); font-weight: 600;">LetsBe ${TIERS[recommendedIdx].name} (replaces all above)</td><td style="text-align: right; color: var(--success); font-weight: 700;">€${bestPrice.toFixed(2)}</td></tr>`;
} else {
tableHTML = '<tr><td colspan="3" style="text-align: center; color: var(--mid-gray); padding: 20px;">Select tools above to see your breakdown</td></tr>';
}
document.getElementById('breakdownBody').innerHTML = tableHTML;
}
// ===== INIT =====
renderToolGrid();
renderCustomList();
calculate();
</script>
</body>
</html>