Expense Tracker in Google Sheets Fed by Bank Statements
Quick Answer: To build an expense tracker in Google Sheets from bank data, import your statement as a CSV with File, Import and "Append rows to current sheet", add a dropdown for categories with Data, Data validation, then summarize with a QUERY formula that groups spending by category and pivots by month. A chart from Insert, Chart turns the summary into a monthly picture. Each new statement is one more append.
Google Sheets makes a good expense tracker because it is free, shared easily and handles CSV files well. The weak point is getting data in. Typing purchases one by one never lasts, so this build feeds the tracker from your bank and card statements: you import the rows, pick a category from a dropdown, and two formulas produce the monthly report and chart.
Drop your bank statement here
PDF or OFX ยท Max 4.4 MB
Uploaded over an encrypted connection. We never ask for your bank login. Privacy
Preview free with no account. Free account to download.
How should the tracker be laid out?
Three tabs keep raw data, settings and reporting apart:
| Tab | Purpose | What's on it |
|---|---|---|
Raw | Every transaction, one row each | Imported rows plus your category |
Setup | Lists the dropdowns use | Categories in column A, account names in column C |
Report | Summaries and charts | The QUERY table, totals and a chart |
On Raw, use these headers in row 1:
- A
Dateโ posting date from the statement - B
Detailsโ the description as the bank printed it - C
Valueโ signed amount, spending negative - D
Sourceโ the account and statement period, such asAmex 2026-09 - E
Bucketโ your category, from a dropdown - F
Periodโ the month, filled by formula
Put this in F1 so the Period column fills itself for every row you'll ever add:
={"Period"; ARRAYFORMULA(IF(A2:A="", , TEXT(A2:A, "yyyy-mm")))}
Delete the header text you typed in F1 first; the formula writes its own.
How do you import your bank statement into Google Sheets?
Google's import help page describes the steps. With the Raw tab open:
- Click File, then Import, and upload the CSV.
- Under import location, choose Append rows to current sheet. This adds the new rows below the existing ones instead of replacing them.
- Leave the separator on Detect automatically, which Google recommends for most files.
- Click Import.
Before appending, make sure the CSV's columns are in the same order as yours: date, description, amount. If the file has separate debit and credit columns, import it to a scratch tab first, combine them with =D2-C2 (credit minus debit) and paste the result into Raw as values.
Where do the CSVs come from? Many banks offer a transaction download as CSV. If yours only provides PDF statements, QuickBankConvert converts them into CSV rows with date, description and signed amount; a free account downloads CSV for three statements a month, and the PDF to Google Sheets page shows the steps. Our Google Sheets budgeting walkthrough covers the import in more depth.
How do you add category dropdowns?
On Setup, type your categories in A2 downwards: Rent, Groceries, Dining, Transport, Utilities, Subscriptions, Health, Shopping, Travel, Gifts, Fees, Card payment, Transfer, Income. Then follow Google's dropdown instructions:
- On
Raw, select E2:E. - Click Data, then Data validation, then Add rule.
- Under Criteria choose Dropdown from a range and select
Setup!A2:A. - Click Done.
Each row in Bucket now offers the same list. Adding a category on Setup adds it to every dropdown.
Two categories prevent double counting. Card payment is for the transfer from checking that pays the card; the purchases themselves are on the card's statement. Transfer is for moves between your own accounts. Both are excluded from the report below.
How do you summarize spending by month with QUERY?
The QUERY function takes a range, a query written in Google's query language, and an optional number of header rows, per Google's QUERY reference. It can group and pivot in one formula. In Report!A1:
=QUERY(Raw!A1:F, "select E, sum(C) where C < 0 and E <> 'Card payment' and E <> 'Transfer' group by E pivot F", 1)
This returns categories down the side, months across the top and the sum of negative values in each cell. Spending appears as negative numbers; to flip it, multiply in the query with sum(C) * -1 or format the cells to show negatives in brackets.
Useful variations:
- One month only: add
and F = '2026-10'to the where clause and drop the pivot. - One account: add
and D starts with 'Amex'. - Biggest payees:
select B, sum(C) where C < 0 group by B order by sum(C) asc limit 15.
A total-per-month row without QUERY
If you want a simple line of monthly totals for a chart, put months in Report!H2:H13 (2026-01 through 2026-12) and in I2:
=-SUMIFS(Raw!C:C, Raw!F:F, H2, Raw!C:C, "<0", Raw!E:E, "<>Card payment", Raw!E:E, "<>Transfer")
SUMIFS adds the values that meet every condition, so this gives you total spending for each month.
How do you add a monthly spending chart?
Select H1:I13 and use Insert, then Chart. Google's chart help explains that the Chart editor opens on the right; on its Setup tab, choose a column chart for month-by-month totals. For category shares in a single month, select one month's column from the QUERY table and pick a pie or bar chart instead. Charts update when the data does, so next month's import shows up automatically.
Can the tracker suggest categories for you?
Yes, with a small rules table. On Setup, put payee keywords in column E (such as TRADER JOE, SHELL, NETFLIX) and the matching category in column F. Then add a helper column G on Raw with a suggestion formula in G2:
=IFERROR(INDEX(Setup!F:F, MATCH(TRUE, ARRAYFORMULA(ISNUMBER(SEARCH(Setup!E2:E40, B2))), 0) + 1), "")
It searches the description for each keyword and returns the category of the first one it finds. Fill it down, check the suggestions, and copy the ones you accept into Bucket as values. Keep the final decision in Bucket rather than letting the formula write there directly; descriptions change, and a payee like a big-box store can be groceries one week and furniture the next.
Over a few months the rules table grows to cover most of your regular payees, and categorizing a new statement becomes a quick review rather than a typing job.
How do you keep the tracker accurate?
A tracker built from statements has one big advantage over a typed one: you can prove it's complete. After each import:
- Filter
Rawby the new Source value. - Sum its Value column.
- Compare with the statement's closing balance minus its opening balance.
A match means nothing was dropped or doubled. A mismatch usually means a page was skipped or a row was imported twice. While you're there, filter Bucket for blanks; uncategorized rows fall out of the report silently.
What does a monthly routine look like?
- When a statement posts, download it as CSV, or convert the PDF.
- Append it to
Rawand tag the Source. - Fill in Bucket for the new rows; sorting by Details groups the same payees together.
- Run the balance check.
- Glance at the report and chart.
That is about fifteen minutes a month for a typical household. For an Excel version of the same idea, see the monthly expenses spreadsheet guide.
Related guides
Frequently Asked Questions
Can Google Sheets pull transactions from my bank automatically?
Not on its own. Sheets imports files you give it, such as a CSV from your bank. Some third-party add-ons connect to banks, but they need your bank credentials or a data aggregator, which is a separate decision.
Why does my QUERY summary show blank or wrong totals?
Usually because the Value column holds text instead of numbers, which happens when amounts were imported with currency symbols or brackets. QUERY uses the majority data type in a column, so a few text cells can be dropped. Clean the column, then the summary fills in.
How do I stop duplicates when I import the same month twice?
Import each statement once and note its period in the Source column. Before appending a new file, filter Raw by Source to check that period isn't already there.
Can I share the tracker with a partner?
Yes. Share the spreadsheet with edit access, and give each person's account its own Source label so you can filter the report by whose card it was.
Ready to convert your bank statement?
Free to preview. No bank login. Results in about a minute.
Convert a statement