Back to blog
Tutorial7 min read

How to Track Credit Card Annual Fees and Instalment Plans in Google Sheets

By JX · Personal Finance
How to Track Credit Card Annual Fees and Instalment Plans in Google Sheets

Last updated: 13 October 2026

The short answer: Two rows break almost every credit card ledger in Google Sheets. The first is the annual fee that hits once a year and makes that month look like a disaster. The second is the 0% instalment plan that spreads one purchase over twelve months and quietly eats your credit limit. Tag both with a helper column, pull the annual fee out of your monthly spending, and turn each instalment into a monthly line with its processing fee attached. The formulas below work on a DBS, OCBC, or UOB card statement.

Scope: this assumes you already have your card transactions in a Google Sheet with columns for Date, Description, Amount, and Category. If you are still getting the statement in, start with exporting your DBS, OCBC, or UOB transactions to Google Sheets or converting your credit card PDF statements into a clean ledger, then come back.

Why these two rows matter more than the rest

A normal card row is easy. You spent S$42.80 at FairPrice, it goes under Groceries, done.

An annual fee is different. It is a single S$180 charge that shows up in month twelve and makes an ordinary month look like you overspent by S$180. Leave it in your spending total and every annual-fee month reads as a failure.

An instalment plan is worse, because it hides in plain sight. You buy a S$1,200 laptop on a 12-month plan. The statement shows S$100 a month, so your ledger shows S$100 a month, and your spending looks fine. What your ledger never shows is the S$36 processing fee you paid upfront, or the fact that the bank is holding the full S$1,200 against your credit limit until the plan ends.

Neither row is hard to handle once you can see it. The problem is that both look like ordinary spending.

Step 1: Tag the two row types

Add a column to the right of your ledger and call it Row type. In E2, paste:

=IF(ISNUMBER(SEARCH("annual fee",$B2)),"Annual fee",IF(OR(ISNUMBER(SEARCH("instalment",$B2)),ISNUMBER(SEARCH("IPP",$B2))),"Instalment",""))

Drag it down the column. Every annual fee row is now labelled "Annual fee", every instalment row is labelled "Instalment", and everything else stays blank.

SEARCH is case-insensitive, so it catches "ANNUAL FEE", "Annual Fee", and "annual fee" from any bank. The IPP check catches the tag that DBS and UOB use for instalment plans. If your bank uses a different label, add another SEARCH inside the OR.

Step 2: Take the annual fee out of your monthly spending

Your monthly spending number should not include a once-a-year charge. Fix it with SUMIFS:

=SUMIFS($C:$C,$E:$E,"")

This adds up every row where Row type is blank, which is every normal purchase. The annual fee and the instalments drop out on their own.

Then track the fees separately:

=SUMIFS($C:$C,$E:$E,"Annual fee")

That is your annual fee bill for the year. Seeing it as one number, instead of a shock in one month, is what makes it manageable.

Step 3: Turn each instalment plan into a monthly line

An instalment plan needs its own small table, because the monthly amount on your statement is not the real cost. Set up five columns:

PurchaseTotalMonthsMonthlyProcessing fee
LaptopS$1,20012S$100.00S$36.00

The formulas:

  • Monthly: =ROUND(B2/C2,2)
  • Processing fee: =ROUND(B2*0.03,2)

The processing fee is the part people miss. A "0% instalment" often carries a 1% to 6% upfront fee, charged once at the start. On a S$1,200 purchase, a 3% fee is S$36. Because you pay the balance down every month, the average amount you owe is around S$600, so S$36 works out to roughly 6% a year, not 0%.

Two more things worth knowing before you sign up for one:

  • Most banks do not award cashback or miles on purchases you convert to instalments.
  • The full amount is reserved against your credit limit from day one, so a S$1,200 plan blocks S$1,200 of your limit until it is paid off.

If you want those two rows handled for you instead of by hand, see how CalmExpense reads an instalment plan.

Step 4: Build an annual fee waiver log

This is the part that saves money. In Singapore, most banks will waive the annual fee if you ask, as long as you are an active cardholder. DBS has the digibot, OCBC has Card Services in its app, and UOB has TMRW. The catch is timing: request the waiver after the fee posts but before the payment due date.

Keep a log so you never miss it:

CardFee postedAmountWaiver requestedOutcome
DBS Altitude12 OctS$18013 OctWaived

Then total what you saved:

=SUMIF(E:E,"Waived",C:C)

One row per card, one date to check each month. If a waiver is refused, ask again and mention you are considering cancelling. Retention teams usually have more room than the first agent. Just check whether waiving the fee reverses a renewal bonus, because on some miles cards it does.

Step 5: Roll it up into one clean monthly number

Now that the two awkward rows are tagged, your category totals stay honest:

=SUMIFS($C:$C,$D:$D,"Groceries",$E:$E,"")

Swap "Groceries" for Transport, Food/Dining, Shopping, or any other category. Each one excludes the annual fee and the instalment principal, so a S$180 fee month no longer distorts your Groceries number.

For the instalment, add back only the monthly portion from your Step 3 table, not the full purchase. That keeps one purchase from being counted twice: once as the original spend and once as twelve monthly rows.

What this replaces

Subscription budgeting appThis Google Sheets setup
Cost~S$147/year (YNAB) or $120/year (Monarch)One-time
Where the data livesThe vendor's serversYour own Google Drive
Annual fee trackingA manual note, easy to forgetA tagged row plus a waiver log
Instalment true costOften not shownProcessing fee and effective rate in your own table
Bank loginUsually requiredNever

A subscription app can flag an annual fee, but it will not help you build a waiver log or show you the effective rate on a 0% plan.

Where CalmExpense fits

CalmExpense is a dashboard that sits inside Google Sheets and reads the ledger you just built. It ships with presets for the two rows in this guide: it recognises annual fee and instalment lines from DBS, OCBC, and UOB statements and keeps them out of your normal spending total, so you do not have to maintain the helper column by hand.

It works from a CSV import, so you never hand your bank login to anyone. Your data stays in your own Google Drive, and there is no monthly fee. The Pro plan is $29.90 one-time, normally $59.90, with a 14-day trial and no credit card. If you want to see the instalment and annual fee rows handled automatically, start the free trial. If you are still weighing whether to hand your statements to any tool at all, this is why pasting them into an AI chatbot is a bad idea.

Being honest about the limits: there is no mobile app yet, you use it in a browser through Google Sheets, and the import is manual.

FAQ

Is a 0% instalment plan free? Not always. Merchant plans set up at the till are often 0% with no fee. Plans you convert after the purchase usually carry a 1% to 6% processing fee, which pushes the effective rate above zero.

Will waiving my annual fee cost me my rewards? On some miles and premium cards, yes. The bank may reverse the renewal bonus or points when it waives the fee. Check the card's terms before you request the waiver.

How do I handle an instalment plan that runs past the end of the year? Keep the plan in your Step 3 table with its start month and number of months, and add the monthly portion to each month it covers. The table, not the statement, is your source of truth.

Do I need a separate sheet for annual fees? No. One Row type column and one SUMIFS is enough. The waiver log can sit on the same sheet or a second tab.

Can I do all of this without linking my bank? Yes. You export the statement yourself and import it. Nothing in this setup needs a bank login or a third-party aggregator.

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