Short-Term Rental Cleaning Fee Estimator

Short-Term Rental Cleaning Fee Estimator

Calculate a fair and competitive cleaning fee for your rental property.

Your fee estimate will appear here. Please fill out the 'Data Configuration' tab first.

Property Details

Additional Services

$${results.totalFee.toFixed(2)}

Based on an estimated ${results.totalHours.toFixed(2)} hours of work.

Fee Breakdown

Base Cleaning Fee $${results.baseFee.toFixed(2)}
${extrasHtml}
`; downloadBtn.classList.remove('hidden'); const ctx = document.getElementById('feeChart')?.getContext('2d'); if(ctx) { if (feeChart) feeChart.destroy(); feeChart = new Chart(ctx, { type: 'doughnut', data: { labels: Object.keys(results.breakdown), datasets: [{ data: Object.values(results.breakdown), backgroundColor: ['#0ea5e9', '#10b981'], borderColor: '#ffffff', borderWidth: 3 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom' }, tooltip: { callbacks: { label: (c) => `${c.label}: $${c.raw.toFixed(2)}` } } } } }); } } function downloadPDF() { const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const contentToPrint = document.getElementById('dashboard-content'); if (!contentToPrint) return; html2canvas(contentToPrint, { scale: 2, useCORS: true, onclone: (doc) => { const chartCanvas = doc.getElementById('feeChart'); if (chartCanvas && feeChart) { const img = new Image(); img.src = feeChart.toBase64Image(); img.style.maxWidth = '100%'; img.style.height = 'auto'; chartCanvas.parentNode.replaceChild(img, chartCanvas); } } }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = (canvas.height * pdfWidth) / canvas.width; pdf.addImage(imgData, 'PNG', 10, 10, pdfWidth - 20, pdfHeight > 277 ? 277 : pdfHeight - 20); pdf.save('Cleaning-Fee-Estimate.pdf'); }); }
Scroll to Top