M&A Synergy Estimation Model

M&A Synergy Estimation Model

1. Assumptions

Company & Deal Details

Synergy Assumptions

Projection & Valuation Settings

Calculate the model to see the valuation impact.

'; preSynergyCombinedRevenueOutput.textContent = ''; preSynergyCombinedEbitdaOutput.textContent = ''; totalRevenueSynergiesOutput.textContent = ''; totalCostSynergiesOutput.textContent = ''; totalIntegrationCostsOutput.textContent = ''; netSynergyValueOutput.textContent = ''; preSynergyTargetEVOutput.textContent = ''; postSynergyCombinedEVOutput.textContent = ''; valueCreationOutput.textContent = ''; impliedPostSynergyMultipleOutput.textContent = ''; // Reset to the first tab openTab('inputs'); hideMessage(); } /** * Downloads the M&A Synergy Estimation Model results as a PDF. */ function downloadPDF() { if (!window.synergyResults) { showMessage('Please calculate the M&A Synergy model first.', 'info'); return; } const { jsPDF } = window.jspdf; const pdf = new jsPDF('p', 'mm', 'a4'); // 'p' for portrait, 'mm' for millimeters, 'a4' size const BLACK_COLOR = [31, 41, 55]; // Tailwind gray-900 equivalent const BLUE_HEADER_COLOR = [29, 78, 216]; // Tailwind blue-700 equivalent const RED_COLOR = [220, 38, 38]; // Tailwind red-600 equivalent const BLUE_TEXT_COLOR = [37, 99, 235]; // Tailwind blue-600 equivalent const GREEN_TEXT_COLOR = [22, 163, 74]; // Tailwind green-600 equivalent const GRAY_TEXT_COLOR = [75, 85, 99]; // Tailwind gray-700 equivalent let y = 15; // Y-coordinate for placing content // Title pdf.setFontSize(22); pdf.setFont('helvetica', 'bold'); pdf.setTextColor(BLACK_COLOR[0], BLACK_COLOR[1], BLACK_COLOR[2]); pdf.text('M&A Synergy Estimation Model Results', 105, y, { align: 'center' }); y += 15; // --- Input Parameters Section --- pdf.setFontSize(16); pdf.setFont('helvetica', 'bold'); pdf.text('1. Input Parameters', 15, y); y += 8; const inputs = window.synergyResults.inputs; const inputData = [ ['Acquirer Revenue', formatCurrency(inputs.acquirerRevenue)], ['Acquirer EBITDA Margin', `${inputs.acquirerEbitdaMargin * 100}%`], ['Target Revenue', formatCurrency(inputs.targetRevenue)], ['Target EBITDA Margin', `${inputs.targetEbitdaMargin * 100}%`], ['Target Purchase Multiple', `${inputs.purchaseMultiple}x`], ['Revenue Synergy (% of Target Revenue)', `${inputs.revenueSynergyPercentage * 100}%`], ['Cost Synergy (% of Target COGS)', `${inputs.costSynergyPercentage * 100}%`], ['One-Time Integration Costs (% of Purchase Price)', `${inputs.integrationCostPercentage * 100}%`], ['Synergy Realization Period', `${inputs.synergyRealizationYears} Years`], ['Projection Years', `${inputs.projectionYears} Years`], ['WACC', `${inputs.wacc * 100}%`], ['Terminal Growth Rate', `${inputs.terminalGrowthRate * 100}%`], ['Post-Synergy Multiple Expansion', `${inputs.postSynergyMultipleExpansion}x`] ]; pdf.autoTable({ startY: y, head: [['Parameter', 'Value']], body: inputData, theme: 'grid', styles: { fontSize: 9, cellPadding: 2, overflow: 'linebreak', lineColor: 200, lineWidth: 0.1 }, headStyles: { fillColor: BLUE_HEADER_COLOR, textColor: 255, fontStyle: 'bold' }, margin: { left: 15, right: 15 }, columnStyles: { 0: { cellWidth: 70 }, 1: { cellWidth: 'auto' } } }); y = pdf.autoTable.previous.finalY + 15; // --- Projections & Synergies Section --- pdf.setFontSize(16); pdf.setFont('helvetica', 'bold'); pdf.text('2. Projections & Synergies', 15, y); y += 8; const projectedTableBody = window.synergyResults.projectedData.map(row => [ row.year === 0 ? 'Current' : `Year ${row.year}`, formatCurrency(row.combinedRevenue), formatCurrency(row.combinedEBITDA), formatCurrency(row.revenueSynergy), formatCurrency(row.costSynergy), formatCurrency(row.postSynergyEBITDA) ]); pdf.autoTable({ startY: y, head: [['Year', 'Combined Revenue', 'Combined EBITDA (Pre-Synergy)', 'Revenue Synergy', 'Cost Synergy', 'Combined EBITDA (Post-Synergy)']], body: projectedTableBody, theme: 'grid', styles: { fontSize: 8, cellPadding: 2, overflow: 'linebreak', lineColor: 200, lineWidth: 0.1 }, headStyles: { fillColor: BLUE_HEADER_COLOR, textColor: 255, fontStyle: 'bold' }, margin: { left: 15, right: 15 }, didParseCell: function (data) { if (data.column.index >= 1) { // Align currency columns right data.cell.styles.halign = 'right'; } } }); y = pdf.autoTable.previous.finalY + 15; // --- Valuation Impact Section --- pdf.setFontSize(16); pdf.setFont('helvetica', 'bold'); pdf.text('3. Valuation Impact', 15, y); y += 8; // Add new page if needed if (y + 100 > pdf.internal.pageSize.height - 15) { pdf.addPage(); y = 15; } const financialSummary = window.synergyResults.financialSummary; const summaryItems = [ { label: 'Pre-Synergy Combined Revenue:', value: formatCurrency(financialSummary.preSynergyCombinedRevenue), color: GRAY_TEXT_COLOR }, { label: 'Pre-Synergy Combined EBITDA:', value: formatCurrency(financialSummary.preSynergyCombinedEBITDA), color: GRAY_TEXT_COLOR }, { label: 'Total Revenue Synergies (NPV):', value: formatCurrency(financialSummary.npvRevenueSynergies), color: BLUE_TEXT_COLOR }, { label: 'Total Cost Synergies (NPV):', value: formatCurrency(financialSummary.npvCostSynergies), color: BLUE_TEXT_COLOR }, { label: 'Total One-Time Integration Costs:', value: formatCurrency(financialSummary.totalIntegrationCosts), color: RED_COLOR }, { label: 'Net Synergy Value (NPV):', value: formatCurrency(financialSummary.netSynergyValue), color: GREEN_TEXT_COLOR }, { label: 'Pre-Synergy Target Enterprise Value:', value: formatCurrency(financialSummary.preSynergyTargetEV), color: GRAY_TEXT_COLOR }, { label: 'Post-Synergy Combined Enterprise Value:', value: formatCurrency(financialSummary.postSynergyCombinedEV), color: BLUE_TEXT_COLOR }, { label: 'Value Creation from Synergies:', value: formatCurrency(financialSummary.valueCreation), color: GREEN_TEXT_COLOR }, { label: 'Implied Post-Synergy Multiple:', value: `${financialSummary.impliedPostSynergyMultiple.toFixed(2)}x`, color: GRAY_TEXT_COLOR } ]; pdf.setFontSize(10); pdf.setFont('helvetica', 'normal'); summaryItems.forEach(item => { if (y + 7 > pdf.internal.pageSize.height - 15) { pdf.addPage(); y = 15; } pdf.setTextColor(BLACK_COLOR[0], BLACK_COLOR[1], BLACK_COLOR[2]); pdf.text(item.label, 15, y); pdf.setTextColor(item.color[0], item.color[1], item.color[2]); pdf.text(item.value, 150, y, { align: 'right' }); y += 7; }); pdf.save('MA_Synergy_Model_Results.pdf'); } /** * Initializes DOM element references once the document is fully loaded. */ document.addEventListener('DOMContentLoaded', () => { // Input Elements acquirerRevenueInput = document.getElementById('acquirerRevenue'); acquirerEbitdaMarginInput = document.getElementById('acquirerEbitdaMargin'); targetRevenueInput = document.getElementById('targetRevenue'); targetEbitdaMarginInput = document.getElementById('targetEbitdaMargin'); purchaseMultipleInput = document.getElementById('purchaseMultiple'); revenueSynergyPercentageInput = document.getElementById('revenueSynergyPercentage'); costSynergyPercentageInput = document.getElementById('costSynergyPercentage'); integrationCostPercentageInput = document.getElementById('integrationCostPercentage'); synergyRealizationYearsInput = document.getElementById('synergyRealizationYears'); projectionYearsInput = document.getElementById('projectionYears'); waccInput = document.getElementById('wacc'); terminalGrowthRateInput = document.getElementById('terminalGrowthRate'); postSynergyMultipleExpansionInput = document.getElementById('postSynergyMultipleExpansion'); // Output Elements (Valuation Tab) preSynergyCombinedRevenueOutput = document.getElementById('preSynergyCombinedRevenueOutput'); preSynergyCombinedEbitdaOutput = document.getElementById('preSynergyCombinedEbitdaOutput'); totalRevenueSynergiesOutput = document.getElementById('totalRevenueSynergiesOutput'); totalCostSynergiesOutput = document.getElementById('totalCostSynergiesOutput'); totalIntegrationCostsOutput = document.getElementById('totalIntegrationCostsOutput'); netSynergyValueOutput = document.getElementById('netSynergyValueOutput'); preSynergyTargetEVOutput = document.getElementById('preSynergyTargetEVOutput'); postSynergyCombinedEVOutput = document.getElementById('postSynergyCombinedEVOutput'); valueCreationOutput = document.getElementById('valueCreationOutput'); impliedPostSynergyMultipleOutput = document.getElementById('impliedPostSynergyMultipleOutput'); // Other Elements projectionsOutputDiv = document.getElementById('projectionsOutput'); valuationOutputDiv = document.getElementById('valuationOutput'); // Added for clarity messageBox = document.getElementById('messageBox'); // Initialize navigation button states updateNavigationButtons(); });
Scroll to Top