Public vs Private Market Valuation Comparison Tool

Public vs. Private Market Valuation Comparison

Analyze valuation differences based on key financial metrics and market assumptions.

Valuation Overview

Key Takeaways

Side-by-Side Comparison

Valuation Metric Public Market Valuation Private Market Valuation

This represents a difference of ${formatCurrency(diff)} (${diffPercent}%), primarily driven by lower private market multiples and a ${(valuationData.assumptions.illiquidityDiscount * 100).toFixed(0)}% illiquidity discount.

`; // Update Chart const chartCtx = document.getElementById('valuationChart').getContext('2d'); if (valuationChartInstance) valuationChartInstance.destroy(); valuationChartInstance = new Chart(chartCtx, { type: 'bar', data: { labels: ['Revenue Based', 'EBITDA Based', 'Average'], datasets: [ { label: 'Public Market ($)', data: [results.pubValRevenue, results.pubValEbitda, results.avgPublicVal], backgroundColor: '#38bdf8', // sky-400 borderColor: '#0ea5e9', // sky-500 borderWidth: 1 }, { label: 'Private Market ($)', data: [results.privValRevenue, results.privValEbitda, results.avgPrivateVal], backgroundColor: '#475569', // slate-600 borderColor: '#1e293b', // slate-800 borderWidth: 1 } ] }, options: { responsive: true, plugins: { legend: { position: 'top' } }, scales: { y: { beginAtZero: true, ticks: { callback: (value) => formatCurrency(value) } } } } }); }; const updateSliderValue = (sliderId, spanId) => { const slider = document.getElementById(sliderId); const span = document.getElementById(spanId); if (slider && span) { span.textContent = slider.value; } }; // --- EVENT LISTENERS --- Object.values(inputs).forEach(input => { input.addEventListener('input', calculateValuations); }); Object.keys(valueSpans).forEach(key => { const inputEl = inputs[key]; const spanEl = valueSpans[key]; if (inputEl && spanEl) { inputEl.addEventListener('input', () => spanEl.textContent = inputEl.value); } }); downloadPdfBtn.addEventListener('click', () => { const { financials, assumptions, results } = valuationData; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const primaryColor = '#0284c7'; // sky-600 const secondaryColor = '#475569'; // slate-600 const margin = 15; let cursorY = margin; // --- PDF TEMPLATE --- // Header doc.setFontSize(22); doc.setFontStyle('bold'); doc.setTextColor(primaryColor); doc.text(`Valuation Report: ${financials.name}`, margin, cursorY); cursorY += 8; doc.setFontSize(10); doc.setFontStyle('normal'); doc.setTextColor(secondaryColor); doc.text(`Generated on: ${new Date().toLocaleDateString('en-US')}`, margin, cursorY); cursorY += 15; // Summary Section doc.setFontSize(16); doc.setFontStyle('bold'); doc.setTextColor(primaryColor); doc.text("Executive Summary", margin, cursorY); cursorY += 8; const takeawaysText = document.getElementById('key-takeaways-content').innerText; doc.setFontSize(11); doc.setFontStyle('normal'); doc.setTextColor(secondaryColor); const splitSummary = doc.splitTextToSize(takeawaysText, doc.internal.pageSize.getWidth() - margin * 2); doc.text(splitSummary, margin, cursorY); cursorY += splitSummary.length * 5 + 10; // Chart Image const chartImg = valuationChartInstance.toBase64Image('image/png', 1.0); doc.addImage(chartImg, 'PNG', margin, cursorY, 180, 90); cursorY += 100; // Detailed Comparison Table doc.autoTable({ startY: cursorY, head: [['Valuation Metric', 'Public Market Value', 'Private Market Value']], body: [ ['Revenue Multiple Based', formatCurrency(results.pubValRevenue), formatCurrency(results.privValRevenue)], ['EBITDA Multiple Based', formatCurrency(results.pubValEbitda), formatCurrency(results.privValEbitda)], [{ content: 'AVERAGE VALUATION', styles: { fontStyle: 'bold', fillColor: '#f1f5f9' } }, { content: formatCurrency(results.avgPublicVal), styles: { fontStyle: 'bold', fillColor: '#f1f5f9' } }, { content: formatCurrency(results.avgPrivateVal), styles: { fontStyle: 'bold', fillColor: '#f1f5f9' } }] ], theme: 'grid', headStyles: { fillColor: primaryColor } }); cursorY = doc.autoTable.previous.finalY + 15; // Assumptions Tables doc.addPage(); cursorY = margin; doc.setFontSize(16); doc.setFontStyle('bold'); doc.setTextColor(primaryColor); doc.text("Valuation Assumptions", margin, cursorY); cursorY += 10; doc.autoTable({ startY: cursorY, head: [['Input Financials', 'Value']], body: [ ['Annual Revenue', formatCurrency(financials.revenue)], ['Annual EBITDA', formatCurrency(financials.ebitda)] ], theme: 'striped', headStyles: { fillColor: secondaryColor } }); cursorY = doc.autoTable.previous.finalY + 10; doc.autoTable({ startY: cursorY, head: [['Market Assumption', 'Public', 'Private']], body: [ ['Revenue Multiple', `${assumptions.pubRevMultiple.toFixed(1)}x`, `${assumptions.privRevMultiple.toFixed(1)}x`], ['EBITDA Multiple', `${assumptions.pubEbitdaMultiple.toFixed(1)}x`, `${assumptions.privEbitdaMultiple.toFixed(1)}x`], ['Illiquidity Discount', 'N/A', `${(assumptions.illiquidityDiscount * 100).toFixed(0)}%`] ], theme: 'striped', headStyles: { fillColor: secondaryColor } }); // Footer const pageCount = doc.internal.getNumberOfPages(); for (let i = 1; i <= pageCount; i++) { doc.setPage(i); doc.setFontSize(8); doc.setTextColor(150); doc.text(`Page ${i} of ${pageCount}`, doc.internal.pageSize.getWidth() / 2, 285, { align: 'center' }); } doc.save(`${financials.name}-Valuation-Report.pdf`); }); // --- INITIALIZATION --- Object.keys(valueSpans).forEach(key => { const inputEl = inputs[key]; const spanEl = valueSpans[key]; if (inputEl && spanEl) spanEl.textContent = inputEl.value; }); calculateValuations(); setActiveTab('dashboard'); });
Scroll to Top