Back to blog
Budgeting7 min read

I Track Planned vs Actual Spending in Google Sheets. Here Are the Exact Formulas

By Jun Xiang · Personal Finance

I gave myself $600 for food in July. By the 23rd, I had spent $712.40, and I only found out when I sat down to check. My bank balance looked fine. My budget did not exist, because a budget that lives in your head is just a wish.

So I moved my budget into Google Sheets and built a simple planned vs actual setup. Every month it tells me which category is going over before the month ends. This post shows the exact sheet, the formulas, and the rules that keep it honest. It takes about 15 minutes to build and 10 minutes a month to run.

What most budgets get wrong

For years my "budgeting" was remembering a number. $600 for food. $150 for fun. Then I would spend the month checking my bank app and feeling fine, because the balance was never negative.

The balance is a lagging indicator. By the time it looks scary, the month is over. What I needed was a comparison: what I planned to spend versus what I actually spent, updated every time I record a transaction. That gap is the whole point of a budget. July taught me that with a $112.40 overspend on food and a $136.90 overspend on fun. Four birthday dinners and a concert ticket, and I never felt it happening.

The sheet: three tabs, one job

I keep it boring on purpose. Three tabs:

  1. Transactions. Every expense, one row per transaction.
  2. Budget. One row per category, with my planned amount and the actual amount pulled in by formula.
  3. Summary. A few charts I glance at on the last Sunday of the month.

Here is what the Budget tab looked like for July:

CategoryPlannedActualVariance
Rent$1,500.00$1,500.00$0.00
Food$600.00$712.40-$112.40
Transport$120.00$98.60+$21.40
Utilities and wifi$180.00$174.25+$5.75
Subscriptions$45.00$45.00$0.00
Fun$150.00$286.90-$136.90
Insurance sinking fund$94.00$94.00$0.00

Rent and subscriptions are predictable. The categories that move are food, transport, and fun. So those are the ones I compare every single week.

The formulas that do the comparing

The Transactions tab has four columns: Date (A), Description (B), Amount (C), Category (D). The Budget tab lists categories in column A and planned amounts in column B. Column C pulls the actual spend for the current month, and column D shows the variance.

The core formula lives in C2 of the Budget tab:

=SUMIFS(Transactions!C:C, Transactions!D:D, A2, Transactions!A:A, ">="&DATE(2026,7,1), Transactions!A:A, "<"&DATE(2026,8,1))

What it does: add up every transaction whose category matches the one in A2, but only if the date falls inside July. Change the two DATE values once per month, or better, point them at two cells at the top of the sheet that hold the month start and end. I have B1 as the first day of the month and C1 as the first day of the next month, so the formula reads:

=SUMIFS(Transactions!C:C, Transactions!D:D, A2, Transactions!A:A, ">="&$B$1, Transactions!A:A, "<"&$C$1)

Then the variance column:

=B2-C2

Negative means I overspent. That is the number I care about.

To extend it across the year, add a helper column to Transactions that extracts the month, like this:

=TEXT(A2, "YYYY-MM")

Then SUMIFS can match the month text directly. That is also the setup I used when I wanted to compare July this year against July last year.

Red flags before the month ends

A column of numbers does not yell at you. Conditional formatting does.

I select the Actual column on the Budget tab and add a custom formula rule:

=C2>B2

When the actual beats the planned amount, the cell turns red. So the week I cross $600 on food, I see it the moment I open the sheet, not at the end of the month. If you prefer something gentler, use the same rule with a mustard yellow fill. Red for "stop", yellow for "watch it". I use both.

I also keep a running total row at the top of the Transactions tab:

=SUM(C2:C1000)

Most of the magic in this sheet is SUMIFS and a date range.

The bills that come twice a year

The sneakiest expenses are the ones that do not show up monthly. My insurance premium is $1,128, billed once a year in June. For eleven months it does not exist, and then suddenly it does.

The fix is a sinking fund row in the budget. Divide the annual bill by 12 and set that aside monthly:

=1128/12

That is $94 a month. I move it to a separate savings account the same day rent goes out, and when June arrives, the money is already sitting there. No spike, no panic, no June budget ruined.

The honest catch: data entry

Here is the part nobody puts in the pretty template screenshots. This system only works if transactions actually go in. Typing every coffee into a sheet gets old fast, and when it gets old, people stop, and the red flags stop coming.

I tried the apps that fix this by linking your bank. Two things stopped me: I did not want to hand over my bank login to a third party, and I did not want to pay $180 a year for the privilege. My data should live in my Google Drive, not on someone else's server. That is why I built CalmExpense, a one-time $29.90 purchase that imports bank CSVs and categorizes transactions automatically, so the rows appear in my sheet without me typing them. If you want to see the categorization logic, I already wrote up the exact formulas I use to auto-categorize transactions, and there is also a step by step guide to importing CSV files from your bank.

Small rules that keep the sheet honest

Three rules keep this from becoming a template I admire and ignore:

  1. Log within 48 hours. A receipt from three weeks ago may as well be a mystery novel.
  2. Review on the last Sunday. Ten minutes. I look at the Summary tab, I look at the red cells, I decide what to adjust.
  3. Budget for fun, and cut it when you blow it. My fun budget is $150. July cost $286.90. I did not cancel fun, I set August to $100 to claw back the difference. A budget that bans fun dies by the second week.

FAQ

Is budgeting in Google Sheets really free? Yes. A Google account is free, the formulas above cost nothing, and the mobile app lets you add a transaction in under a minute. The only cost is the 10 minutes a month of upkeep.

Does this need me to link my bank? No. The whole setup runs on transactions you add yourself or import from CSV files your bank lets you download. Nothing connects to your accounts, and nothing leaves your Google Drive.

What if I go over in a category? That is the feature, not the bug. The variance column shows exactly how far over you are, and the red highlight shows it early enough that you can still adjust the rest of the month. Going over in July is how I learnt my real food number is closer to $700 than $600.

Can my partner and I use the same sheet? Yes, use the Share button and you can both add transactions in real time. We found that visibility alone cut our joint overspending, because "we" became a number we both looked at instead of two people guessing.

A budget is a comparison, not a promise

A number you remember is not a budget. A template you fill in once and abandon is not a budget either. The version that worked for me compares planned against actual every single week, with a red cell appearing the moment a category goes over. It cost me 15 minutes to build, it costs 10 minutes a month to keep, and it caught a $249 gap in July that my bank balance never mentioned.

Last updated: 4 September 2026

See your own spending this clearly

CalmExpense turns your bank statement into a clean dashboard inside your own Google Sheets. No bank linking, no subscription. One payment of $29.90.

Start your free trial