PayPal Fee Calculator

PayPal Fee Calculator

Calculate fees to determine what you'll send or receive.

Generated on:

Transaction Summary

`; updateCalculatorUI(); attachCalculatorListeners(); lucide.createIcons(); }; const updateCalculatorUI = () => { // Determine calculation direction if (calculatorState.lastEdited === 'receive') { calculateFromReceive(); } else { calculateFromSend(); } // Update input fields document.getElementById('receive-amount').value = calculatorState.receiveAmount.toFixed(2); document.getElementById('send-amount').value = calculatorState.sendAmount.toFixed(2); // Update results display const resultsDisplay = document.getElementById('results-display'); if (!resultsDisplay) return; const fee = getFeeStructure(); const feeAmount = calculatorState.sendAmount - calculatorState.receiveAmount; resultsDisplay.innerHTML = `
Customer Pays (Gross) ${formatCurrency(calculatorState.sendAmount)}
PayPal Fee (${fee.percentage}% + ${formatCurrency(fee.fixed)}) -${formatCurrency(feeAmount)}
You Receive (Net) ${formatCurrency(calculatorState.receiveAmount)}
`; }; const attachCalculatorListeners = () => { const receiveInput = document.getElementById('receive-amount'); const sendInput = document.getElementById('send-amount'); const feeTypeSelect = document.getElementById('fee-type'); receiveInput.addEventListener('input', (e) => { calculatorState.receiveAmount = parseFloat(e.target.value) || 0; calculatorState.lastEdited = 'receive'; updateCalculatorUI(); }); sendInput.addEventListener('input', (e) => { calculatorState.sendAmount = parseFloat(e.target.value) || 0; calculatorState.lastEdited = 'send'; updateCalculatorUI(); }); feeTypeSelect.addEventListener('change', (e) => { calculatorState.feeType = e.target.value; updateCalculatorUI(); }); document.getElementById('download-pdf-btn').addEventListener('click', generatePdf); }; const renderDataConfig = () => { const configContent = document.getElementById('content-config'); if (!configContent) return; const feesHtml = appData.feeStructures.map((fee, index) => `
`).join(''); configContent.innerHTML = `

Fee Configuration

Transaction Types
Name
Fee %
Fixed Fee
${feesHtml}
`; attachConfigListeners(); lucide.createIcons(); }; const attachConfigListeners = () => { document.getElementById('add-fee-btn').addEventListener('click', () => { appData.feeStructures.push({ name: 'New Fee Type', percentage: 0, fixed: 0 }); renderDataConfig(); }); document.getElementById('fees-container').addEventListener('click', e => { const removeBtn = e.target.closest('.remove-fee-btn'); if (removeBtn && appData.feeStructures.length > 1) { appData.feeStructures.splice(parseInt(removeBtn.dataset.index), 1); renderDataConfig(); } }); document.getElementById('apply-settings-btn').addEventListener('click', () => { appData.currency = document.getElementById('default-currency').value || '$'; const newFees = []; document.querySelectorAll('.fee-row').forEach(row => { const name = row.querySelector('[data-prop="name"]').value; const percentage = parseFloat(row.querySelector('[data-prop="percentage"]').value) || 0; const fixed = parseFloat(row.querySelector('[data-prop="fixed"]').value) || 0; if(name) newFees.push({ name, percentage, fixed }); }); appData.feeStructures = newFees; if (!appData.feeStructures.some(f => f.name === calculatorState.feeType)) { calculatorState.feeType = appData.feeStructures[0]?.name || ''; } alert('Settings updated!'); renderCalculator(); }); }; const generatePdf = () => { loadingOverlay.style.display = 'flex'; const { jsPDF } = window.jspdf; const pdfContent = document.getElementById('pdf-content-area'); const pdfHeader = document.getElementById('pdf-header'); document.getElementById('pdf-generated-date').textContent = new Date().toLocaleDateString('en-US'); pdfHeader.classList.remove('hidden'); html2canvas(pdfContent, { scale: 2, useCORS: true, logging: false }) .then(canvas => { pdfHeader.classList.add('hidden'); const imgData = canvas.toDataURL('image/jpeg', 0.95); const pdf = new jsPDF({ orientation: 'portrait', unit: 'px', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pageMargin = 60; const contentWidth = pdfWidth - (pageMargin * 2); const imgProps = pdf.getImageProperties(imgData); const imgHeight = (imgProps.height * contentWidth) / imgProps.width; pdf.addImage(imgData, 'JPEG', pageMargin, pageMargin, contentWidth, imgHeight); pdf.save('PayPal-Fee-Statement.pdf'); loadingOverlay.style.display = 'none'; }).catch(err => { console.error("PDF generation failed:", err); pdfHeader.classList.add('hidden'); loadingOverlay.style.display = 'none'; alert('An error occurred generating the PDF.'); }); }; // --- TAB NAVIGATION & INITIALIZATION --- const initializeTabs = () => { const tabsContainer = document.getElementById('tabs-container'); const prevTabBtn = document.getElementById('prev-tab-btn'); const nextTabBtn = document.getElementById('next-tab-btn'); let activeTabIndex = 0; const tabs = [ { name: 'Calculator', id: 'calculator' }, { name: 'Configuration', id: 'config' } ]; tabsContainer.innerHTML = tabs.map(t => ``).join(''); mainContent.innerHTML = tabs.map(t => `
`).join(''); const tabButtons = tabsContainer.querySelectorAll('.tab-btn'); const tabContents = mainContent.querySelectorAll('.tab-content'); const switchTab = (index) => { activeTabIndex = index; tabButtons.forEach((btn, i) => btn.classList.toggle('active', i === index)); tabContents.forEach((content, i) => content.classList.toggle('hidden', i !== index)); prevTabBtn.disabled = activeTabIndex === 0; nextTabBtn.disabled = activeTabIndex === tabs.length - 1; }; tabButtons.forEach((btn, index) => btn.addEventListener('click', () => switchTab(index))); prevTabBtn.addEventListener('click', () => { if (activeTabIndex > 0) switchTab(activeTabIndex - 1); }); nextTabBtn.addEventListener('click', () => { if (activeTabIndex < tabs.length - 1) switchTab(activeTabIndex + 1); }); switchTab(0); renderCalculator(); renderDataConfig(); }; initializeTabs(); });
Scroll to Top