🏦 Finance Tool · 100% Free · No Login

Bank Statement Analyzer — Free Spending Insights & Expense Tracker

Upload your bank statement (PDF, CSV or Excel) and instantly see your income, expenses, savings rate, top spending categories, budget checker, recurring payments, and more — all processed privately in your browser.

🔒 Your bank statement is processed 100% in your browser. No data is uploaded, stored, or shared with anyone. Files are cleared from memory when you close this page.
Upload Your Bank Statement
📊 Dashboard loaded with 0 transactions. Upload another statement to merge it (duplicates removed automatically).
📄
Drop your bank statement here or click to browse
Supports PDF, CSV, Excel (.xlsx/.xls) · All major Indian banks
PDF CSV XLSX XLS TXT
💡 PDF: Upload your bank's PDF statement directly — no conversion needed. Or export as CSV/Excel from net banking → Statements. Works with SBI, HDFC, ICICI, Axis, Kotak, PNB, BOB, Canara, Yes Bank, and all Indian banks.
Don't have a statement handy? — See a full demo with realistic transactions
📄 Multi-page PDF detected — select pages to include in analysis:
📊 Reading file...
⚠️
Limited data detected
📊 Your Financial Dashboard
Total Income
Total Expenses
Net Savings
Transactions
💸 Spending by Category
📅 Monthly Cash Flow
📈 Savings Rate Trend (Month-on-Month)
Financial Health Meter
Smart Insights
Category Breakdown
Category Txns Amount % of Expenses
Where You Spend the Most
Top Merchants
🆕 New Merchants This Period

Merchants appearing for the first time in the most recent month of your statement.

Day-of-Week Spending
50/30/20 Budget Rule

Based on your income of ₹0, here's how your spending compares:

50% Needs ₹0 ideal ₹0 actual
30% Wants ₹0 ideal ₹0 actual
20% Savings ₹0 ideal ₹0 actual
Set Your Category Budgets

Set monthly limits per category. Carry-forward surplus shown if you were under-budget last period.

✨ Custom Categories

Create a custom category with keywords to better classify your transactions. Saved locally in your browser.

Recurring Payments Detected

Transactions appearing 2 or more times — likely subscriptions, EMIs, or regular bills.

Subscription Tracker
All Transactions
Date Description Category Confidence Debit Credit Balance

🚀 Why WorldOfTools Beats Other Analyzers

Most bank statement analysis tools (like those from major fintech firms or lending platforms) have a hidden catch: Your Data is the Price.

  • No Server Upload: Competitors upload your PDF to their servers. We process it 100% locally on your machine. Your balance stays YOUR business.
  • No Marketing Calls: Ever noticed getting loan calls after using a "free" analyzer? That's because they sell your lead. Since we don't store your data, we have nothing to sell.
  • HDFC, SBI, ICICI Ready: Our parser is tuned for the specific formatting quirks of Indian bank exports, including UPI-heavy statements that confuse global tools.
  • Zero Cost: No "Premium" tiers for larger statements or Excel exports. Everything is unlimited.

What is the Bank Statement Analyzer?

The Bank Statement Analyzer by WorldOfTools is a free, privacy-first financial tool that helps you understand where your money is going. Upload your bank statement in PDF, CSV or Excel format and instantly get a complete picture of your finances — income, expenses, savings rate, category-wise breakdowns, top merchants, recurring subscriptions, and personalized budget recommendations.

Unlike other tools, everything runs in your browser. Your financial data is never uploaded to any server, never stored in any database, and never shared with anyone.

How to Use the Bank Statement Analyzer

1

Export Your Bank Statement — Login to your bank's net banking portal and download as CSV, Excel, or PDF from Account Summary / Statements section.

2

Upload the File — Click or drag & drop your PDF, CSV, or Excel file. For multi-page PDFs, you can select which pages to include.

3

Map Your Columns — Tell the tool which columns represent Date, Description, Debit, Credit, and Balance. Auto-detected for most banks.

4

Get Instant Analysis — Explore your dashboard with charts, budget checker, spending rank, recurring payments, and more. Merge multiple statements for a combined view!

Supported Banks & Formats

Works with CSV and Excel exports from all major Indian banks:

  • 🏦 SBI (State Bank of India)
  • 🏦 HDFC Bank
  • 🏦 ICICI Bank
  • 🏦 Axis Bank
  • 🏦 Kotak Mahindra Bank
  • 🏦 Yes Bank
  • 🏦 PNB
  • 🏦 Bank of Baroda
  • 🏦 Canara Bank
  • 🏦 IndusInd Bank

Frequently Asked Questions

Is it safe to upload my bank statement here?

Yes, completely. All processing runs in your browser using JavaScript — your file never leaves your device. No data is sent to any server, no account is required, and nothing is stored.

What file formats are supported?

PDF (direct upload), CSV, Excel (.xlsx and .xls), and plain text (.txt). PDF parsing works on text-based PDFs from all major Indian banks. Scanned/image PDFs are not supported — use net banking to download a text-based PDF or export as CSV.

Can I merge multiple bank statements?

Yes! After analyzing a statement, simply upload another one and the tool will merge the transactions, automatically removing duplicates based on date, amount, and description. A limit of 2,000 transactions is applied to prevent browser lag.

How does expense categorization work?

The tool uses keyword matching on normalized transaction descriptions. 15+ categories are supported with hundreds of keywords for Indian merchants and common transactions. You can also create custom categories with your own keywords, saved locally.

What is the 50/30/20 budget rule?

Allocate 50% of income to Needs (rent, groceries, utilities), 30% to Wants (dining out, entertainment, shopping), and 20% to Savings. The analyzer shows how your actual spending compares.

Can I export or download the analysis?

Yes. You can export as CSV, Excel, or generate a Premium PDF Report with category charts, insights, and all transactions. All generated in your browser — nothing is sent to a server.

🆚 WorldOfTools vs Other Bank Analyzers

FeatureWorldOfToolsOther Tools
PDF Statement Support✓ Native PDF ParsingUpload Elsewhere First
Multi-Statement Merge✓ With DeduplicationNot Available
Custom Categories✓ Saved LocallyPaid Feature
Data Privacy✓ 100% Browser-SideServer Upload
No Account Required✓ YesLogin Required
Category Budget Planner✓ Per-category limitsPaid Feature
50/30/20 Budget Rule✓ YesRare
Recurring Detection✓ Auto-detectedPaid Feature
Indian Banks Support✓ All Major BanksLimited

Other Free Finance & Utility Tools

`; const w = window.open('','_blank','width=1000,height=800'); if (!w) { alert('Please allow popups for this site to use Print Dashboard.'); return; } w.document.write(html); w.document.close(); } // ═══════════════════════════════════════════════ // DOWNLOAD EXCEL // ═══════════════════════════════════════════════ function downloadExcel() { if (!allTransactions.length) return; const headers = ['Date','Description','Category','Confidence','Type','Debit (INR)','Credit (INR)','Balance (INR)']; const rows = allTransactions.map(t => [ t.dateStr||'', t.desc||'', t.category||'', t.confidence||'', t.type||'', t.debit||0, t.credit||0, t.balance||0 ]); const totalIncome = allTransactions.reduce((s,t)=>s+(t.credit||0),0); const totalExpense = allTransactions.reduce((s,t)=>s+(t.debit||0),0); const netSavings = totalIncome - totalExpense; const catMap = {}; allTransactions.forEach(t => { if (t.debit > 0 && t.category !== 'Transfers' && t.category !== 'ATM & Cash') { if (!catMap[t.category]) catMap[t.category] = {count:0, amount:0}; catMap[t.category].count++; catMap[t.category].amount += t.debit; } }); const wb = XLSX.utils.book_new(); const ws = XLSX.utils.aoa_to_sheet([headers, ...rows]); ws['!cols'] = [{wch:14},{wch:40},{wch:18},{wch:10},{wch:10},{wch:14},{wch:14},{wch:14}]; XLSX.utils.book_append_sheet(wb, ws, 'Transactions'); const summaryData = [ ['Bank Statement Analysis — Report By WorldOfTools.in'], ['Tool URL: https://worldoftools.in/bank-statement-analyzer | 100% Private, Browser-Only Processing'], [''], ['Bank Statement Analysis Summary'], [], ['Total Income', totalIncome], ['Total Expenses', totalExpense], ['Net Savings', netSavings], ['Savings Rate', totalIncome>0?((netSavings/totalIncome)*100).toFixed(1)+'%':'0%'], ['Total Transactions', allTransactions.length], [], ['Category','Transactions','Amount Spent (INR)','% of Expenses'], ...Object.entries(catMap) .sort((a,b)=>b[1].amount-a[1].amount) .map(([cat,d])=>[cat, d.count, Math.round(d.amount), totalExpense>0?((d.amount/totalExpense)*100).toFixed(1)+'%':'0%']) ]; const wsSummary = XLSX.utils.aoa_to_sheet(summaryData); wsSummary['!cols'] = [{wch:28},{wch:14},{wch:20},{wch:16}]; XLSX.utils.book_append_sheet(wb, wsSummary, 'Summary'); XLSX.writeFile(wb, 'bank-statement-analysis.xlsx'); } // ═══════════════════════════════════════════════ // DOWNLOAD CSV // ═══════════════════════════════════════════════ function downloadCSV() { const metaText = (document.getElementById('dashMeta')||{}).textContent||''; const brandRow = '# Bank Statement Analysis — Report By WorldOfTools.in | https://worldoftools.in/bank-statement-analyzer | 100% Private'; const metaRow = `# ${metaText}`; const headers = ['Date','Description','Category','Confidence','Type','Debit','Credit','Balance']; const rows = allTransactions.map(t => [t.dateStr,`"${t.desc.replace(/"/g,'""')}"`,t.category,t.confidence||'',t.type,t.debit||'',t.credit||'',t.balance||''].join(',') ); const csv = [brandRow, metaRow, headers.join(','), ...rows].join('\n'); const blob = new Blob([csv],{type:'text/csv'}); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href=url; a.download='bank-statement-analysis.csv'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } // ═══════════════════════════════════════════════ // UTILITIES // ═══════════════════════════════════════════════ function parseAmt(val) { if (val===null||val===undefined||val==='') return 0; const s = String(val).replace(/[₹$,\s]/g,'').replace(/\(([^)]+)\)/,'-$1').replace(/[^\d.\-]/g,''); const n = parseFloat(s); return isNaN(n) ? 0 : Math.abs(n); } function parseDate(str) { if (!str) return null; const s = str.trim(); const m1 = s.match(/^(\d{1,2})[\s\-\/]([A-Za-z]{3,9})[\s\-\/](\d{2,4})$/); if (m1) { const months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11,january:0,february:1,march:2,april:3,june:5,july:6,august:7,september:8,october:9,november:10,december:11}; const mm = months[m1[2].toLowerCase().substring(0,3)]; const y = m1[3].length===2 ? 2000 + +m1[3] : +m1[3]; if (mm !== undefined) return new Date(y, mm, +m1[1]); } const m2 = s.match(/^([A-Za-z]{3})[\s\-\/](\d{1,2})[\s\-\/](\d{4})$/); if (m2) { const months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11}; const mm = months[m2[1].toLowerCase()]; if (mm !== undefined) return new Date(+m2[3], mm, +m2[2]); } const clean = s.replace(/\//g,'-'); if (/^\d{2}-\d{2}-\d{4}$/.test(clean)) { const [d,m,y]=clean.split('-'); const dt=new Date(+y,+m-1,+d); if(!isNaN(dt)) return dt; } if (/^\d{4}-\d{2}-\d{2}$/.test(clean)) return new Date(clean); if (/^\d{2}-\d{2}-\d{2}$/.test(clean)) { const [d,m,y]=clean.split('-'); return new Date(2000+(+y),+m-1,+d); } if (/^\d{8}$/.test(s)) { const d=s.substring(0,2),m=s.substring(2,4),y=s.substring(4,8); return new Date(+y,+m-1,+d); } const dt = new Date(s); return isNaN(dt) ? null : dt; } function fmtMoney(n) { if (n===undefined||n===null||isNaN(n)) return '₹0'; return '₹'+Math.abs(Math.round(n)).toLocaleString('en-IN'); } function fmtDate(d) { return d.toLocaleDateString('en-IN',{day:'numeric',month:'short',year:'numeric'}); } function escHtml(s) { return String(s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } function statusTag(actual, ideal, higherBetter) { if (higherBetter) { if (actual>=ideal) return `✅ ${actual}% (on track)`; if (actual>=ideal*0.7) return `⚠️ ${actual}% (a bit low)`; return `❌ ${actual}% (too low)`; } else { if (actual<=ideal) return `✅ ${actual}% (on track)`; if (actual<=ideal*1.2) return `⚠️ ${actual}% (slightly over)`; return `❌ ${actual}% (over budget)`; } } function showError(msg) { const el = document.getElementById('errorMsg'); if (msg) { el.textContent='⚠️ '+msg; el.style.display='block'; el.style.background='#ffe0e0'; el.style.borderColor='#c00'; el.style.color='#c00'; } else { el.style.display='none'; el.textContent=''; } } function showProgress(msg, pct) { document.getElementById('progressWrap').style.display='block'; document.getElementById('progressText').textContent=msg; document.getElementById('progressFill').style.width=pct+'%'; } function hideProgress() { document.getElementById('progressWrap').style.display='none'; document.getElementById('progressFill').style.width='0%'; } // ═══════════════════════════════════════════════ // SAMPLE DATA DEMO // ═══════════════════════════════════════════════ function loadSampleData() { resetTool(); // 60 hand-crafted realistic transactions across 3 months (Jan–Mar 2025) const raw = [ // January ['01 Jan 2025','SALARY CREDIT INFOSYS LTD', 0, 85000, 0], ['02 Jan 2025','SWIGGY ORDER', 580, 0, 0], ['03 Jan 2025','AMAZON PURCHASE', 1450, 0, 0], ['04 Jan 2025','HDFC CREDIT CARD PAYMENT', 8000, 0, 0], ['05 Jan 2025','ZOMATO ORDER', 340, 0, 0], ['06 Jan 2025','NETFLIX SUBSCRIPTION', 649, 0, 0], ['07 Jan 2025','UBER RIDE', 230, 0, 0], ['08 Jan 2025','BIGBASKET GROCERY', 2850, 0, 0], ['09 Jan 2025','BLINKIT GROCERY', 690, 0, 0], ['10 Jan 2025','ATM CASH WITHDRAWAL', 5000, 0, 0], ['12 Jan 2025','SHELL PETROL PUMP', 3500, 0, 0], ['14 Jan 2025','APOLLO PHARMACY', 890, 0, 0], ['15 Jan 2025','RENT TRANSFER TO LANDLORD', 18000, 0, 0], ['16 Jan 2025','SPOTIFY PREMIUM', 119, 0, 0], ['17 Jan 2025','DMART SUPERMART', 3200, 0, 0], ['18 Jan 2025','OLA RIDE', 185, 0, 0], ['19 Jan 2025','TATA POWER ELECTRICITY BILL', 1850, 0, 0], ['20 Jan 2025','JIOFIBER BROADBAND', 999, 0, 0], ['22 Jan 2025','DINING SOCIALS RESTAURANT', 2100, 0, 0], ['25 Jan 2025','UNIQLO CLOTHING', 3999, 0, 0], ['27 Jan 2025','DIVIDEND CREDIT HDFC MUTUAL', 0, 1200, 0], ['28 Jan 2025','SWIGGY INSTAMART', 450, 0, 0], ['29 Jan 2025','AMAZON PRIME ANNUAL', 1499, 0, 0], ['30 Jan 2025','AAROGYA HEALTH CHECKUP', 2500, 0, 0], ['31 Jan 2025','MUTUAL FUND TRANSFER SIP', 5000, 0, 0], // February ['01 Feb 2025','SALARY CREDIT INFOSYS LTD', 0, 85000, 0], ['02 Feb 2025','ZOMATO ORDER', 490, 0, 0], ['03 Feb 2025','SWIGGY FOOD ORDER', 620, 0, 0], ['04 Feb 2025','AMAZON SHOPPING', 2750, 0, 0], ['05 Feb 2025','RAPIDO RIDE', 95, 0, 0], ['06 Feb 2025','BIGBASKET GROCERY', 3100, 0, 0], ['07 Feb 2025','HDFC CREDIT CARD PAYMENT', 8500, 0, 0], ['08 Feb 2025','NETFLIX SUBSCRIPTION', 649, 0, 0], ['10 Feb 2025','SHELL PETROL PUMP', 4000, 0, 0], ['12 Feb 2025','MEDPLUS PHARMACY', 450, 0, 0], ['13 Feb 2025','VALENTINE DINNER', 3800, 0, 0], ['14 Feb 2025','AIRTEL POSTPAID BILL', 799, 0, 0], ['15 Feb 2025','RENT TRANSFER TO LANDLORD', 18000, 0, 0], ['16 Feb 2025','SPOTIFY PREMIUM', 119, 0, 0], ['17 Feb 2025','BLINKIT QUICK COMMERCE', 780, 0, 0], ['18 Feb 2025','RELIANCE DIGITAL ELECTRONICS',8999, 0, 0], ['20 Feb 2025','UBER EATS', 310, 0, 0], ['22 Feb 2025','TATA POWER ELECTRICITY', 2100, 0, 0], ['24 Feb 2025','JIOFIBER SUBSCRIPTION', 999, 0, 0], ['26 Feb 2025','FREELANCE PAYMENT RECEIVED', 0, 12000, 0], ['27 Feb 2025','MUTUAL FUND SIP TRANSFER', 5000, 0, 0], ['28 Feb 2025','CULT FIT GYM MEMBERSHIP', 1200, 0, 0], // March ['01 Mar 2025','SALARY CREDIT INFOSYS LTD', 0, 85000, 0], ['02 Mar 2025','SWIGGY ORDER', 510, 0, 0], ['03 Mar 2025','AMAZON PURCHASE ELECTRONICS', 4500, 0, 0], ['04 Mar 2025','BLINKIT GROCERY DELIVERY', 895, 0, 0], ['05 Mar 2025','ZOMATO HYPERPURE', 720, 0, 0], ['07 Mar 2025','ATM WITHDRAWAL', 3000, 0, 0], ['08 Mar 2025','SHELL PETROL STATION', 3800, 0, 0], ['10 Mar 2025','HDFC CREDIT CARD PAYMENT', 9200, 0, 0], ['12 Mar 2025','BIGBASKET REGULAR ORDER', 2700, 0, 0], ['13 Mar 2025','APOLLO PHARMACY MEDICINES', 650, 0, 0], ['14 Mar 2025','NETFLIX MONTHLY PLAN', 649, 0, 0], ['15 Mar 2025','RENT TRANSFER LANDLORD', 18000, 0, 0], ['16 Mar 2025','SPOTIFY MUSIC', 119, 0, 0], ['17 Mar 2025','JIOFIBER BROADBAND PLAN', 999, 0, 0], ['18 Mar 2025','AIRTEL MOBILE BILL', 799, 0, 0], ['20 Mar 2025','TATA POWER BILL PAYMENT', 2200, 0, 0], ['21 Mar 2025','HOLI CELEBRATION DINNER', 2800, 0, 0], ['22 Mar 2025','CULT FIT GYM', 1200, 0, 0], ['25 Mar 2025','MYNTRA CLOTHING PURCHASE', 2499, 0, 0], ['26 Mar 2025','MUTUAL FUND SIP HDFC', 5000, 0, 0], ['27 Mar 2025','DIVIDEND RECEIVED AXIS FUND', 0, 800, 0], ['28 Mar 2025','BOOKMYSHOW MOVIE TICKETS', 850, 0, 0], ['30 Mar 2025','CLEARTRIP FLIGHT BOOKING', 7500, 0, 0], ['31 Mar 2025','OLA CABSERVICE', 420, 0, 0], ]; allTransactions = raw.map((r, idx) => { const [dateStr, desc, debit, credit] = r; const date = parseDate(dateStr); const isCredit = credit > 0 && credit >= debit; const type = isCredit ? 'credit' : 'debit'; const amount = isCredit ? credit : debit; const catResult = categorizeWithConf(desc, isCredit); const hash = `${dateStr}|${Math.round(debit+credit)}|${normalizeMerchant(desc).toLowerCase().substring(0,20)}`; return { date, dateStr, desc, debit, credit, balance: 0, type, amount, category: catResult.category, confidence: catResult.confidence, hash }; }); // Sort chronologically allTransactions.sort((a,b) => (a.date||0) - (b.date||0)); isMergeMode = false; previousMerchants = new Set(); // Render dashboard document.getElementById('colMapSection').style.display = 'none'; document.getElementById('dashboard').style.display = 'block'; document.getElementById('mergeBanner').style.display = 'flex'; document.getElementById('mergeCount').textContent = allTransactions.length; renderDashboard(); renderTransactions(); // Show demo notice const err = document.getElementById('errorMsg'); err.style.display = 'block'; err.style.background = '#faf5ff'; err.style.borderColor = '#7c3aed'; err.style.color = '#5b21b6'; err.innerHTML = '🎯 Demo Mode — You\'re viewing 74 sample transactions (Jan–Mar 2025). Upload your own statement anytime to replace this demo.'; document.getElementById('dashboard').scrollIntoView({ behavior:'smooth', block:'start' }); } function resetTool() { allTransactions=[]; rawHeaders=[]; rawRows=[]; pdfPageData=[]; selectedPages=[]; previousMerchants=new Set(); isMergeMode=false; document.getElementById('dashboard').style.display='none'; document.getElementById('colMapSection').style.display='none'; document.getElementById('pageSelectorWrap').style.display='none'; document.getElementById('mergeBanner').style.display='none'; document.getElementById('fileInput').value=''; hideProgress(); showError(''); if (pieChart) { pieChart.destroy(); pieChart=null; } if (barChart) { barChart.destroy(); barChart=null; } if (dowChart) { dowChart.destroy(); dowChart=null; } if (savingsTrendChart) { savingsTrendChart.destroy(); savingsTrendChart=null; } window.scrollTo({top:0,behavior:'smooth'}); }