Advanced Group Expense Splitter

Split bills, calculate shared expenses, and determine who owes whom. Perfect for trips, roommates, friends, and group activities.

Group Expense Splitter Calculator

Enter expenses for each person to calculate who should pay whom. Export results to Excel, PDF, Word.

Please add at least one expense and fill in all required fields.

Enter Group Expenses

Expenses

No Expenses Added Yet

Click "Add Expense" below to start adding expenses for your group

How It Works
1. Enter how many people were in the group
2. Enter each person's name (optional)
3. Add expenses: who paid, how much, and for whom
4. Click calculate to see who should pay whom to settle all debts
5. Export results to Excel, PDF, Word or share via WhatsApp, Email, Telegram, Facebook

Any Group Size

Perfect for 2 to 20+ people - trips, roommates, friends, colleagues

Export & Share

Export to Excel, PDF, Word. Share via WhatsApp, Email, Telegram, Facebook

Fair Splitting

Calculates exact amounts to ensure everyone pays their fair share

Privacy Safe

All calculations happen in your browser - no data sent to servers

Group Expense Splitter Results

Group Expense Splitter - Results

Generated on: ${new Date().toLocaleString()}

Summary

Total Spent: �${formatNumber(currentResult.totalSpent.toFixed(2))}

Per Person Share: �${formatNumber(currentResult.perPersonShare.toFixed(2))}

Transactions Needed: ${currentResult.transactions.length}

Individual Status

`; currentResult.individualStatus.forEach(person => { let statusText = ''; let amountClass = ''; let amountText = ''; if (person.status === 'gets') { statusText = 'Should Receive'; amountClass = 'positive'; amountText = '£' + formatNumber(person.balance.toFixed(2)); } else if (person.status === 'owes') { statusText = 'Should Pay'; amountClass = 'negative'; amountText = '£' + formatNumber((-person.balance).toFixed(2)); } else { statusText = 'Settled Up'; amountClass = 'neutral'; amountText = '£0.00'; } htmlContent += ` `; }); htmlContent += `
Participant Status Amount
${person.name} ${statusText} ${amountText}

Settlement Transactions

`; if (currentResult.transactions.length > 0) { htmlContent += ` `; currentResult.transactions.forEach(t => { htmlContent += ` `; }); htmlContent += `
From (Payer) To (Receiver) Amount
${t.from} ${t.to} •${formatNumber(t.amount.toFixed(2))}
`; } else { htmlContent += `

All participants are settled! No transactions needed.

`; } htmlContent += `

Expense Summary

`; currentResult.expenses.forEach(expense => { const paidByName = currentResult.friendNames[expense.paidBy] || `Participant ${expense.paidBy+1}`; const perPersonAmount = expense.amount / expense.beneficiaries.length; htmlContent += ` `; }); htmlContent += `
Description Paid By Amount For (# people) Per Person
${expense.description || 'Expense'} ${paidByName} •${formatNumber(expense.amount.toFixed(2))} ${expense.beneficiaries.length} •${formatNumber(perPersonAmount.toFixed(2))}
`; // Create and download HTML file const blob = new Blob([htmlContent], { type: 'application/msword' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `Group_Expense_Splitter_${new Date().getTime()}.doc`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } // Share functions function shareViaWhatsApp() { if (!currentResult) return; const text = `Group Expense Splitter Results:\n\nTotal Spent: £${formatNumber(currentResult.totalSpent.toFixed(2))}\nPer Person: £${formatNumber(currentResult.perPersonShare.toFixed(2))}\nTransactions Needed: ${currentResult.transactions.length}\n\nView full results: ${window.location.href}`; const url = `https://wa.me/?text=${encodeURIComponent(text)}`; window.open(url, '_blank'); } function shareViaEmail() { if (!currentResult) return; const subject = `Group Expense Splitter Results - ${new Date().toLocaleDateString()}`; const body = `Group Expense Splitter Results:\n\nTotal Spent: £${formatNumber(currentResult.totalSpent.toFixed(2))}\nPer Person Share: £${formatNumber(currentResult.perPersonShare.toFixed(2))}\nTransactions Needed: ${currentResult.transactions.length}\n\nIndividual Status:\n${currentResult.individualStatus.map(p => { if (p.status === 'gets') return `${p.name}: Should receive �${formatNumber(p.balance.toFixed(2))}`; else if (p.status === 'owes') return `${p.name}: Should pay �${formatNumber((-p.balance).toFixed(2))}`; else return `${p.name}: Settled up`; }).join('\n')}\n\nView full results: ${window.location.href}`; const url = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`; window.location.href = url; } function shareViaTelegram() { if (!currentResult) return; const text = `Group Expense Splitter Results:\n\nTotal Spent: £${formatNumber(currentResult.totalSpent.toFixed(2))}\nPer Person: £${formatNumber(currentResult.perPersonShare.toFixed(2))}\nTransactions Needed: ${currentResult.transactions.length}\n\nView full results: ${window.location.href}`; const url = `https://t.me/share/url?url=${encodeURIComponent(window.location.href)}&text=${encodeURIComponent(text)}`; window.open(url, '_blank'); } function shareViaFacebook() { if (!currentResult) return; const url = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(window.location.href)}`; window.open(url, '_blank'); } // Format number with commas function formatNumber(num) { const parts = num.toString().split('.'); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); return parts.join('.'); } });