User guide

Personal Finances Tracker

A Google Sheet that connects to your banks, files every transaction into categories, and sends you a weekly summary. This guide covers setup, daily use, the limits banks impose, and what to do when something looks wrong.

Connects read-only

Through Enable Banking (PSD2). The sheet can read your transactions; it cannot move money.

Runs by itself

Daily bank sync, a Monday email digest, budget alerts and a reminder to renew bank consent.

Up to four banks

Each bank gets its own tab. Everything lands in one Archive that never loses history.

Quick start

Do these in order. Tick each step as you go; your progress is remembered in this browser.

0 of 12 done
Bank consent expires

Access is granted for a limited period, set by each bank and usually up to 180 days. The sheet emails you a reminder every 80 days with fresh links. You can also run Reconnect Banks any time.

How it works

Every day the sheet asks each bank for recent transactions, files them into categories, and adds the new ones to a permanent Archive. Reports and charts read from the Archive.

Your bankread-only, via Enable Banking
Bank tablast 30 days, rewritten each sync
1 Mapping rule matches → categorised
2 No rule, OpenAI key set → AI picks one
3 Neither → Uncategorized
Archivepermanent history
Reports, Dashboard, Charts, weekly email
Bank tabs are a cache

Each bank tab is rewritten on every sync with the last 30 days. Don't edit it. Anything you want to keep lives in the Archive.

The Archive is the truth

Rows are only ever added, never rewritten. A duplicate is detected from bank, date, description and amount; two identical purchases on one day are both kept (the second gets a #2 suffix in its Internal ID). You may edit a category in the Archive by hand.

Signs

Money out is a positive amount and money in is negative. Reports and charts turn that into spending and income for you.

What runs by itself

These schedules are installed by Build My Sheet and use the script's time zone.

WhenWhat happens
Every day, 07:00Fetches the last 30 days from each bank, categorises new rows, rewrites each bank tab and adds new transactions to the Archive.
Mondays, 08:00Emails the weekly digest (last 7 days: total, by bank, top categories, plan versus actual, biggest transactions) and, if an OpenAI key is set, an AI analysis. Excluded transactions are left out.
Every day, 09:00Emails a budget alert when a bank's spending for the month reaches 50%, 80%, 90%, 100% or 115% of its plan.
Every 80 days, 09:00Emails new authorisation links so bank access never lapses unnoticed.

Categories and the Mapping tab

Each transaction gets one of 20 categories: Housing, Groceries, Bars Restaurants & Delivery, Shopping, Professional Expenses, Transport & Car, Leisure & Entertainment, Travel & Holidays, Health & Pharmacy, Electronics & Media, Money Transfers, Subscriptions, Insurance, Personal Care, Child Expenses, Education, Internet & Mobile, Taxes, Income and Investments.

How a category is chosen

  1. Mapping rules. The first row in the Mapping tab whose keyword appears anywhere in the merchant or description wins. Upper/lower case and accents are ignored, so El Corte Ingles matches EL CORTE INGLÉS.
  2. AI, if you set an OpenAI key. It picks from your category list. Each sync allows up to 60 AI calls, and every answer is saved as a new Mapping row so the same description is never asked twice.
  3. Otherwise the row stays uncategorised (blank). Transfers that mention your own name are left blank on purpose so they don't count as spending or income.
Order matters

Because the first match wins, put specific keywords above general ones: Uber Eats above Uber, Amazon Prime above Amazon. Try it below.

Mapping tester

In the real sheet the Mapping list starts at A2 and its dropdown of categories sits in column F. This tester is only a teaching aid.

Exclusions and your name

On Settings, Section 6 keywords hide matching transactions (by description) from the digest, budget alerts and charts. They stay in the Archive. Section 7, your full name, marks transfers between your own accounts. If a partner or a second account holder moves money between you, add their name as an exclusion.

The starting list

Build My Sheet adds default keywords for the country you selected: well-known brands that work everywhere (Netflix, Uber, Amazon, IKEA and similar) plus that country's own brands and words. For Spain that includes Mercadona, Hipercor and Supercor (Groceries) and El Corte Ingles (Shopping). English generic words are only added for English-speaking countries. The seeding only ever adds; rows you wrote or edited are left alone.

Reading your sheets

TabWhat it shows
SettingsThe setup wizard: the only place you type configuration.
IDsWhat the script reads: bank names and account links, emails, the OpenAI key, the digest prompt and the digest voice. You can edit the prompt and voice cells to change the weekly email's wording and tone.
Bank tabsThe last 30 days from each bank. Rewritten every sync.
ArchiveEvery transaction ever imported, with its final category. Source for every report.
MappingKeyword to category rules (see above).
Expenses (by bank)Monthly totals by category and bank.
Budget (by bank)Your planned amounts by category and bank.
Budget vs RealPlan against actual for the current month, per bank, plus the share of spending by category.
DashboardThe year by month: expenses, income, monthly savings, accumulated savings and the savings rate.
ChartsGenerated charts with a date range (next section).
Don't move rows in the report tabs

The report sheets and the IDs tab are laid out in a fixed pattern the script relies on. Inserting or deleting rows there can make Build My Sheet refuse to run (it checks first and changes nothing) or make a setting be read from the wrong row. Run Health Check after any structural change; its "IDs layout" and "Category lists" lines catch most mistakes.

The Charts tab

Create it once from Setup > Create / Rebuild Charts Tab. Pick a period with From and To at the top (type a date over the formula; the picker opens when you click the cell). Every chart and figure follows those dates.

Monthly spending by category

One stacked column per month, up to 24 months.

Where the money goes

Each category's share of spending as a donut.

Income vs spending

Bars for income and spending with net as a line.

Top merchants

The ten biggest places you paid.

Spending by bank

Grouped by the bank name stored on each transaction.

Savings rate

Read from the Dashboard's Savings Rate row, month by month.

What the numbers mean

  • Spending is money out, by category. Income and Investments are not counted as spending. Refunds inside a category reduce that category. Spending with no category yet shows as Uncategorized, so the charts are useful before categorising is finished and show you how much is left to sort.
  • Income is money in: transactions categorised Income plus incoming money with no category yet. Net is income minus spending.
  • Everything respects your Settings exclusions and your name, so transfers between your own accounts don't inflate totals. These are read live; changing them updates the charts without a rebuild.
  • The block of cells below the charts feeds them. Leave it alone; a rebuild regenerates it.
Charts look empty or all Uncategorized?

That means transactions have no category yet. Add Mapping rules or an OpenAI key and run Re-categorise Uncategorized.

Limits and timing

Most limits come from banks and the European open-banking rules (PSD2), not from this sheet. Enable Banking's own FAQ describes the first three.

LimitWhat it means for you
About 4 fetches a day per accountWhen no one is present, most banks answer a limited number of requests per account per day. Past that you get a 429. Nothing is broken: try again after about 6 hours. The sheet keeps what it already fetched and the health check shows which bank was limited.
Full history lasts about an hourBanks return their deepest history for roughly an hour after you authorise. Later, many only return the last 90 days. Run the backfill straight after connecting.
Consent expiresEach bank decides how long access lasts, usually up to 180 days. You are reminded every 80 days. After expiry the daily sync gets nothing for that bank until you reconnect.
Daily sync windowThe last 30 days per bank, every day. The Archive keeps everything older.
Backfill sizeUp to 730 days and 300 pages per bank, within a 5 minute budget across all banks. If it stops early, run it again.
AI budget60 AI categorisations per sync run. Re-categorise Uncategorized allows 300 per run or 4.5 minutes, whichever comes first; run it again to continue.
Google's run timeApps Script stops any run after 6 minutes, so long jobs are split and are safe to repeat.
BanksUp to four, one account each (the first account the bank offers).
Restricted productionA personal Enable Banking application only returns accounts you linked to it.
Charts rangeUp to 24 months at a time.
Why not just refresh more often?

More fetches don't give you more data and can use up the day's allowance, so the 07:00 sync is the only automatic one. Running Import All Bank Transactions a few times a day is fine; dozens of times is not.

Troubleshooting

Run Setup > Run Health Check first; it often names the problem. Or pick what you are seeing:

Customising

Add or change a bank

Edit Section 3 on Settings, run Build My Sheet (it makes the tab and hides or shows report rows), then Reconnect Banks and the backfill for the new bank. If you enter more banks than the IDs tab has rows for, Build My Sheet stops and tells you before changing anything.

Teach it your shops

Add a row to Mapping with a distinctive keyword and a category from the dropdown. Run Re-categorise Uncategorized to apply it to old transactions.

Change the weekly email

On the IDs tab, edit the digest prompt (what to ask) and the digest voice (tone and language). Placeholders such as {{total}} and {{byBank}} are filled with real figures. Clear a cell to return to the default.

Change the categories

The category list is read from the Budget vs Real tab and must match the Mapping dropdown, the report sheets and the Dashboard. Run Health Check afterwards: "Category lists" tells you if they disagree. Rebuild Charts when you are done.

Privacy and security

  • Your data stays in your Google account. The sheet, its script and its emails all run as you.
  • Bank access is read-only and goes through Enable Banking. Your bank login is never typed into the sheet.
  • Credentials are kept privately. The Enable Banking key and ID live in the script's private properties, not in cells.
  • The OpenAI key is in a cell on the IDs tab, visible to anyone who can open the sheet. Share the sheet with no one you would not trust with it, or store the key as the script property OPENAI_API_KEY instead.
  • What OpenAI sees. For categorising: one transaction's description, merchant and amount at a time. For the weekly email: totals, categories and your top transactions for the week. Leave the key blank to turn AI off entirely.
  • Sharing the sheet shares your finances. Anyone with access can read the Archive. Give people the least access that works.

FAQ

Why does the Web App need "Anyone" access?

Banks send your browser back to that address after you approve. It only completes the connection and does nothing else. Your data is not served from it.

Can it move money or make payments?

No. It requests account information only.

Can I connect several accounts at one bank?

One account per bank slot. If a bank offers several, the first is used. Use another bank slot with the same bank if you need a second account.

Can I fix a category by hand?

Yes: change it in the Archive. Existing Archive rows are never overwritten by a sync. To make the fix apply to future transactions, add a Mapping rule too.

What does it cost to run?

The sheet and script are free to run in Google. Enable Banking and OpenAI have their own terms and pricing, so check both before you rely on them. AI categorisation sends short requests and the digest sends one per week.

How far back can it go?

As far back as your bank allows, up to two years per backfill. It depends on the bank and on running the backfill right after you authorise.

Will transactions be duplicated if I run things twice?

No. The Archive recognises a transaction it already has. Running the daily sync or the backfill again is safe.

How do I pause it?

In Extensions > Apps Script > Triggers, delete the schedules you want to stop. Build My Sheet installs them again.

BinderyLab · Personal Finances Tracker