I thought I was spending $300/month on dining — it was $847. Built this to actually know my numbers

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:

Bank-statement-analyzer.json

Full workflow collection:

khanhduyvt0101/workflows


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


PDF Vector n8n integration

Full workflow collection

Questions? Drop a comment.