Smart Affiliate Revenue Estimator

Smart Affiliate Revenue Estimator

Forecast your potential affiliate earnings based on your campaign data.

Affiliate Revenue Forecast

Campaign / Product Projected Sales Commission Est. Monthly Revenue

Campaign Management

Total Est. Monthly Revenue

$${totalRevenue.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}

Best Performing Campaign

${bestCampaign.name}

Highest Campaign Revenue

$${bestCampaign.revenue.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}

`; // Render Table dashboardTableBody.innerHTML = ''; results.sort((a, b) => b.revenue - a.revenue).forEach(r => { const tr = document.createElement('tr'); tr.className = 'bg-white border-b hover:bg-gray-50'; const commissionText = r.commissionType === 'percent' ? `${r.commissionValue}%` : `$${r.commissionValue.toFixed(2)}/sale`; tr.innerHTML = ` ${r.name} ${r.projectedSales.toLocaleString()} ${commissionText} $${r.revenue.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})} `; dashboardTableBody.appendChild(tr); }); document.getElementById('dashboard-date').textContent = `Forecast based on current configuration`; }; const renderAll = () => { renderConfig(); renderDashboard(); updateNavButtons(); }; // --- Row Creation for Config --- const createCampaignRow = (campaign = {}) => { const id = campaign.id || nextId++; const div = document.createElement('div'); div.className = 'campaign-row border rounded-lg p-4 space-y-3'; div.dataset.id = id; div.innerHTML = `
`; div.querySelector('.remove-btn').addEventListener('click', () => { div.remove(); saveConfig(); renderDashboard(); }); campaignsList.appendChild(div); }; // --- Event Handlers --- addCampaignBtn.addEventListener('click', () => createCampaignRow()); // --- Tab & Navigation Logic --- function switchTab(targetTabId) { if (currentTab === 'config') { saveConfig(); } currentTab = targetTabId; tabs.forEach(tab => tab.classList.toggle('active', tab.dataset.tab === currentTab)); tabContents.forEach(content => content.classList.toggle('active', content.id === currentTab)); renderAll(); } tabs.forEach(tab => tab.addEventListener('click', () => switchTab(tab.dataset.tab))); nextBtn.addEventListener('click', () => currentTab === 'dashboard' ? switchTab('config') : switchTab('dashboard')); prevBtn.addEventListener('click', () => currentTab === 'config' ? switchTab('dashboard') : switchTab('config')); function updateNavButtons() { if (currentTab === 'dashboard') { nextBtn.textContent = 'Configure Data'; prevBtn.style.display = 'none'; pdfButtonContainer.style.display = 'block'; } else { nextBtn.textContent = 'Update Estimator'; prevBtn.style.display = 'inline-flex'; pdfButtonContainer.style.display = 'none'; } } // --- PDF Download --- downloadPdfBtn.addEventListener('click', async () => { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const content = document.getElementById('pdf-content'); await new Promise(r => setTimeout(r, 100)); doc.setFont('helvetica', 'bold'); doc.setFontSize(18); doc.text('Affiliate Revenue Forecast', 105, 22, { align: 'center' }); const canvas = await html2canvas(content, { scale: 2 }); const imgData = canvas.toDataURL('image/jpeg', 1.0); const imgProps = doc.getImageProperties(imgData); const pdfWidth = doc.internal.pageSize.getWidth() - 28; const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width; doc.addImage(imgData, 'JPEG', 14, 35, pdfWidth, pdfHeight); doc.save(`Affiliate-Forecast-${new Date().toISOString().slice(0,10)}.pdf`); }); // --- Initial Load --- renderAll(); });
Scroll to Top