Every month the bank sends a PDF statement. Most people open it, check the balance, close it. The actual spending breakdown — how much went to dining, subscriptions, travel, groceries — stays invisible unless you do the manual work of reading through 80-120 transactions and categorizing them yourself.
Built a workflow that reads the statement the moment it arrives in Gmail, categorizes every transaction, calculates the savings rate, and posts a full monthly breakdown to Slack automatically.
What it does
Bank statement email arrives in Gmail → downloads PDF → extracts all transaction data by category → calculates savings rate → flags large transactions over $500 → logs monthly summary to Sheets → posts analysis to Slack
About 15-20 seconds per statement.
What gets extracted
All as flat fields for reliable extraction:
-
Account number, statement start and end dates
-
Opening and closing balance
-
Total deposits, total withdrawals
-
Total income, total spending
-
Transaction count
-
Top spending category and amount
-
Large transactions over $500 (comma-separated)
-
Category totals: Groceries, Dining, Transport, Subscriptions, Shopping, Utilities
Savings rate
Calculated automatically:
(totalIncome - totalSpending) / totalIncome × 100
Appears in the Slack summary so you see it every month without having to calculate it.
What lands in Slack
📊 Monthly Bank Statement Analysis
Period: March 1 — March 31, 2025
Account: ****4821
💰 Summary
• Income: $6,240.00
• Spending: $4,180.00
• Savings Rate: 33.0%
• Transactions: 87
📈 Spending by Category
Dining: $847.20 (20.3%)
Groceries: $623.40 (14.9%)
Shopping: $544.80 (13.0%)
Subscriptions: $312.50 (7.5%)
Transport: $287.60 (6.9%)
Utilities: $380.00 (9.1%)
⚠️ Large Transactions (>$500)
Mar 12: DELTA AIRLINES - $840.00
Mar 28: AMAZON.COM - $544.80
What lands in Google Sheets
Each row: Period Start, Period End, Opening Balance, Closing Balance, Total Income, Total Spending, Savings Rate %, Transaction Count, Processed Date
One row per statement. Track your savings rate month over month without opening a single PDF.
Setup
You’ll need:
-
Gmail (where bank statements arrive)
-
Google Sheets (free)
-
n8n instance (self-hosted — uses PDF Vector community node)
-
PDF Vector account (free tier: 100 credits/month)
-
Slack
About 15 minutes to configure.
Download
Workflow JSON:
Full workflow collection:
Setup Guide
Step 1: Get your PDF Vector API key
Sign up at pdfvector.com — free plan works for testing.
Step 2: Create your Sheet
Headers in Row 1:
Period Start | Period End | Opening Balance | Closing Balance | Total Income | Total Spending | Savings Rate % | Transaction Count | Processed Date
Step 3: Import and configure
Download JSON → n8n → Import from File.
Gmail Trigger + Get Statement Attachment: Connect Gmail (OAuth2)
PDF Vector - Extract Statement: Add credential, paste API key
Log Monthly Summary: Connect Sheets, paste Sheet ID
Send Analysis Report: Connect Slack, select your finance channel
Customize merchant rules: In Analyze Spending Code node, the category totals use standard bank merchant categories. If your bank labels merchants differently, adjust the field names.
Accuracy
Tested on statements from Chase, Bank of America, Wells Fargo, and credit unions.
-
Transaction extraction: ~96%
-
Category totals: ~91% — depends on how the bank labels merchant categories
-
Large transaction detection: exact — pure arithmetic check
-
Savings rate: exact — pure calculation
Cost
Bank statements are longer documents — expect 10-20 credits per statement. Free tier covers ~5-10 statements per month. Monthly users should consider the Basic plan ($25/month).
Customizing it
Add more categories: Extend the extraction schema with additional spending categories (Healthcare, Entertainment, etc.)
Multiple accounts: Add a second Gmail filter or trigger for other bank accounts, route each to a separate Sheets tab
Budget alerts: Add an IF node — if any category exceeds your budget threshold, route to a separate urgent Slack alert
Questions? Drop a comment.
