Post-Event Report Generator
Fill in the details to generate a comprehensive report.
Event Details
Start by providing the basic information about your event. This context is crucial for anyone reading the report.
Attendance
Quantify your audience. This data helps measure event reach and the effectiveness of your marketing and registration efforts.
Budget & ROI
Track your financial performance. Compare planned expenses with actual spending to assess budgeting accuracy and calculate the event's return on investment.
Expense Breakdown
| Category | Planned ($) | Actual ($) |
|---|
Return on Investment (ROI)
Calculated ROI
0%
Participant Feedback
Capture qualitative and quantitative feedback to understand attendee satisfaction and identify areas for improvement.
Satisfaction Scores (out of 5)
Summary & Recommendations
Conclude with a high-level summary. What were the key successes? What were the challenges? And most importantly, what are the actionable recommendations for the future?
Report Preview
This is a preview of the final report generated from your inputs. Review the information below before downloading.
${summary.recommendations || 'Not provided.'}
`; } navLinks.forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); switchSection(link.dataset.section); }); }); document.getElementById('report-content').addEventListener('input', updateAllData); document.getElementById('add-budget-item').addEventListener('click', () => { createBudgetRow({ category: '', planned: 0, actual: 0 }); }); document.getElementById('download-pdf').addEventListener('click', () => { if (typeof jspdf === 'undefined' || !jspdf.jsPDF) { alert("PDF library not loaded."); return; } const { jsPDF } = jspdf; const doc = new jsPDF(); let y = 15; doc.setFontSize(22); doc.text(reportData.details.eventName || 'Event Report', 105, y, { align: 'center' }); y += 8; doc.setFontSize(12); doc.text(`Date: ${reportData.details.eventDate} | Location: ${reportData.details.eventLocation}`, 105, y, { align: 'center' }); y += 15; const addSection = (title, content) => { if (y > 260) { doc.addPage(); y = 20; } doc.setFontSize(16); doc.setTextColor(30, 58, 138); doc.text(title, 15, y); y += 8; doc.setFontSize(11); doc.setTextColor(51, 65, 85); const textLines = doc.splitTextToSize(content, 180); doc.text(textLines, 15, y); y += textLines.length * 5 + 8; }; addSection('1. Event Objective', reportData.details.eventObjective); const attendanceRate = reportData.attendance.registered > 0 ? (reportData.attendance.attended / reportData.attendance.registered * 100).toFixed(1) : 0; addSection('2. Attendance', `Registered: ${reportData.attendance.registered}\nAttended: ${reportData.attendance.attended}\nAttendance Rate: ${attendanceRate}%`); doc.addImage(attendanceChart.toBase64Image(), 'PNG', 60, y, 80, 80); y += 90; const totalPlanned = reportData.budget.reduce((s, i) => s + i.planned, 0); const totalActual = reportData.roi.totalCost; addSection('3. Financial Summary', `Total Planned: $${totalPlanned.toLocaleString()}\nTotal Actual: $${totalActual.toLocaleString()}\nRevenue/Value: $${reportData.roi.revenue.toLocaleString()}\nROI: ${reportData.roi.value.toFixed(1)}%`); if (y > 180) { doc.addPage(); y = 20; } doc.addImage(budgetChart.toBase64Image(), 'PNG', 30, y, 150, 75); y += 85; addSection('4. Feedback', Object.entries(reportData.feedback.scores).map(([k, v]) => `${k}: ${v}/5`).join('\n')); addSection('5. Key Successes', reportData.summary.successes); addSection('6. Challenges', reportData.summary.challenges); addSection('7. Recommendations', reportData.summary.recommendations); doc.save(`${reportData.details.eventName.replace(' ', '_')}_Report.pdf`); }); renderBudgetTable(); switchSection('details'); updateAllData(); });