What it does for you
| Automatic | Still your call |
|---|---|
| Reads QFX/OFX, CSV and QIF downloads from most US banks and card issuers, and fixes the plus/minus signs | Anything the Rules tab does not recognize yet, mostly in the first month |
| Skips duplicates, so importing the same file twice adds nothing | Money that looks like spending but is not (friends paying you back, reimbursed work costs) |
| Categorizes using merchant rules, and learns new rules from your own choices | Whether a purchase belongs to a rental property instead of the household |
| Pairs transfers between your own accounts (card payments, savings moves) so they never count as income or spending | Brokerage, stock plan and 401(k) activity, which is entered by hand |
| Dashboard, budget vs actual, savings rate and rental profit by month | Setting your budget numbers |
Expect roughly three in four rows to be sorted automatically in month one, and nine in ten by month three once it has learned your merchants. The monthly routine takes about 15 to 20 minutes.
One-time setup (about 10 minutes)
- Make your copy. Click Make my own copy above while signed in to your Google account. The copy is yours alone. Nobody else, including me, can see it.
- Set the year on the Settings tab, and your payroll 401(k) amounts if you want savings rate to include them.
- List your accounts on the Accounts tab: a short label (for example
Chase Checking), the type, and the last 4 digits only. The last 4 lets the importer recognize most files on its own. - Rentals (optional). Add each property on Properties & Loans and pick it in the Property column for that property's accounts.
- Budgets. Enter monthly targets in the yellow cells on Categories. Leave blank anything you do not budget.
- Run the first import and approve the permission screens. They look alarming, so read the next section first. It takes about 30 seconds.
The first time you import: two Google screens
The importer is a small script inside your own copy of the sheet. Google shows a warning for any personal script that has not been through its paid app review, so everyone sees these screens once. The "developer" it names is you, because copying the sheet made you its owner.
Screen 1: "Google hasn't verified this app"
Click Advanced (small link, bottom left), then Go to Finance Tracker Importer (unsafe). Do not click Back to Safety; that just cancels.
Screen 2: "Select what Finance Tracker Importer can access"
Tick both boxes, or Select all, then Continue. If a box is left empty, the import stops and asks again.
| Permission on screen 2 | What it actually allows |
|---|---|
| View and manage spreadsheets that this application has been installed in | Read and write this one spreadsheet, your copy of the tracker. Not your other sheets, not your Drive. |
| Display and run third-party web content in prompts and sidebars within Google applications | Show the Import window where you pick your files. Files are read in your browser; nothing is sent anywhere. |
That is the whole list. The script cannot read your email, your Drive or anything outside this spreadsheet, and it does not connect to the internet. You can read every line under Extensions > Apps Script, or in the source section below.
Every month (15 to 20 minutes)
- Download last month's transactions from each bank and card. Choose QFX / OFX / Quicken when offered, otherwise CSV. See the guide below.
- Import. Finance Tracker > Import statements, pick all the files at once, check the account shown for each, click Import.
- Review. On Transactions, filter column M (Flag). Pick a category for each uncategorized row, and a Transfer ID for any transfer it could not pair.
- Teach it. Finance Tracker > Learn rules from my categories. New rules appear on the Rules tab in yellow; edit or delete any you do not like.
- Close the month. Raise Months closed on Settings by one, then look at the Dashboard and Budget vs Actual.
Delete the downloaded statement files when you are done, especially from a synced Downloads folder. The sheet keeps only date, account label, description and amount.
How to download transactions
Menus move around and banks rename buttons, so treat this as a map rather than exact clicks. If your bank is not listed, look for Download, Export or a small download arrow on the account's transaction page. If you cannot find it, search the bank's help pages for "download transactions". Pick a date range that covers the whole month; overlap is fine because duplicates are skipped.
| Bank or card | Where to look | Pick this format |
|---|---|---|
| National banks | ||
| Chase (checking and cards) | Open the account, then the download icon above the activity list | Quicken Web Connect (QFX) or CSV |
| Bank of America | Open the account, then Download above the transactions | Quicken (QFX) or Microsoft Excel (this is a CSV) |
| Wells Fargo | Download Account Activity from the account menu | Quicken (QFX) or Comma Delimited (CSV) |
| Capital One (cards and 360) | Open the account, then Download Transactions | CSV or QFX |
| Citi | Account activity, then the download icon | CSV or QFX |
| U.S. Bank | Account activity, then Download transactions | CSV or QFX |
| PNC | Account activity, then Download | CSV or QFX |
| Regional banks | ||
| Truist (formerly BB&T and SunTrust) | Open the account, then Download or Export near the top right of the transactions | CSV, OFX or QFX |
| TD Bank, Citizens, Fifth Third, Regions, M&T | Account activity, then Download or Export | QFX / OFX if offered, otherwise CSV |
| Atlantic Union, Towne, other Virginia banks | Account history, then Export (usually under a printer or download icon) | QFX / OFX if offered, otherwise CSV |
| Online banks and brokerage cash accounts | ||
| Ally Bank | Transactions History, then the download icon. Up to 18 months available. | CSV or Quicken (QFX) |
| SoFi, Marcus, Discover Bank | Account activity, then Download or Export | CSV (QFX where offered) |
| Charles Schwab Bank, Fidelity Cash Management | Bank or cash account history, then Export | CSV. Only the bank / cash account, not trades. |
| Robinhood Gold Card | Card activity export in the app | CSV (pending and declined rows are skipped) |
| Credit unions | ||
| Navy Federal | Accounts, pick the account, Account History, then Download | CSV, OFX or QIF (all three work) |
| USAA, Pentagon Federal, VACU, Virginia Credit Union and others | Account history, then Export or Download | QFX / OFX if offered, otherwise CSV or QIF |
| Credit cards | ||
| American Express | Statements & Activity, then Download | CSV or Quicken (QFX) |
| Discover Card | Activity, then Download (pick the statement period) | CSV or QFX |
| Apple Card | iPhone Wallet app, Apple Card, Card Balance, pick a monthly statement, Export Transactions. Monthly only, after the statement closes. | OFX or CSV |
| Barclays, Synchrony and store cards | Activity or statements page, then Download | CSV if offered. Some store cards only give PDFs. |
| Not imported | ||
| Accounts with PDF statements only | Not importable | Type the few rows in by hand, or a monthly total |
| Brokerage, 401(k), stock plans | Not imported on purpose | Record deposits, withdrawals and vests by hand (see README tab) |
Why QFX/OFX first? It is one standard format across banks: amounts already carry the right sign and every transaction has a bank ID. CSV layouts differ by bank; the importer reads the common layouts (it finds the date, description and amount columns by name), and QIF works too. If a CSV comes in with signs backwards, see the fixes below.
If something looks off
Card purchases came in as income
On Accounts, set Import: amount sign to flip for that card, delete its rows and import again.
File not matched to an account
Add the last 4 on Accounts, or put a word from the file name (for example activity) in Import: file name contains.
"Could not find a header row"
The file is not a transaction export (often a PDF saved as CSV, or a stock plan report). Try the QFX download instead.
A transfer did not pair
The other side is probably an account you do not track, or it posted more than 5 days later. Give both rows the same Transfer ID by hand, or pick a non-transfer category.
Privacy
- Your copy lives in your Google account. The importer is a small script inside that copy, limited to that one spreadsheet: no Drive, no email, no internet calls. Files are read in your browser.
- You can read every line of it under Extensions > Apps Script, or in the source section.
- Store the last 4 digits of accounts only. Never put full account numbers, SSNs or passwords in the sheet.
- Full details are in the privacy policy.
- Keep sharing Restricted and turn on 2-Step Verification for your Google account.
- Want to share your setup with a friend? Send them this page, not your copy. Version history keeps deleted rows.
What is in the script (open source)
The full importer is public so you can check it before you approve anything. It is two files, about 700 lines of plain JavaScript, with no outside libraries:
| Part of the code | What it does |
|---|---|
@OnlyCurrentDoc and the permission list | Limits the script to the spreadsheet it lives in. It never asks for Drive, Gmail or internet access. |
parseOfx, parseQif, parseCsvStatement | Read the bank file you picked and pull out date, description and amount. Nothing else from the file is kept. |
normalizeSign | Makes money out negative and money in positive, flipping card files that show purchases as positive. |
dedupe | Skips rows that are already in your Transactions tab. |
categorize, learnRules | Apply your Rules tab, and suggest new rules from categories you picked by hand. |
matchTransfers | Pairs equal and opposite amounts between your own accounts within 5 days. |
ImportDialog.html | The Import window. Reads your files in the browser and hands the text to the functions above. |
The copy you make is exactly this code; you can compare it under Extensions > Apps Script in your sheet. Copies do not update themselves, so a later fix only reaches you if you paste in the newer files.
Files
- Household-Finance-Tracker-Template.xlsx · blank template for Excel or for importing into Sheets yourself (the import menu works in Google Sheets only)
- To build your own sheet with the importer: open Extensions > Apps Script, replace
Code.gswith the file above, and add an HTML file namedImportDialogwith the other.