Credit Tracker - Automatically track statement credits from premium cards & other accounts

Overview

Credit Tracker automatically tracks “use it or lose it” statement credits from premium credit cards by scanning your Tiller transaction data.

The problem: Cards like the Amex Platinum and Chase Sapphire Reserve now come with a dizzying array of credits - monthly streaming credits, quarterly dining credits, semi-annual shopping credits, annual travel credits - each with different reset schedules. Missing even one $25/month credit means leaving $300/year on the table.

The solution: This tracker matches transaction descriptions to detect when credits post, tracks them against their reset periods, and shows you what’s been captured, what’s remaining, and what’s expiring soon.

Installation

Steps:

  1. Open your Tiller spreadsheet

  2. Go to Extensions > Apps Script

  3. Delete any existing code in the editor

  4. Copy the entire contents of src/CreditTracker.gs from the GitHub repo and paste it

  5. Save the project (Ctrl+S / Cmd+S)

  6. Close the Apps Script editor

  7. Refresh your spreadsheet (the page, not the data)

  8. Click Credit Tracker > Full Setup / Reset from the new menu

  9. Authorize the script when prompted

Two new sheets will be created: Credits Config and Credits Tracker.

Setup

  1. Add your cards: Click Credit Tracker > Add Card from Template… and select from the 9 included templates (Amex Platinum, Chase Sapphire Reserve, etc.) or use Add Custom Account for other cards.

  2. Match accounts: In the Credits Config sheet, select the Tiller Account dropdown for each card and choose the account name exactly as it appears in your Transactions sheet.

  3. Set anniversary dates: For cards with anniversary-based credits (like CSR Travel Credit), enter the date you opened the account in the Anniversary column.

  4. Adjust detection patterns: If a credit isn’t being detected, check your transaction descriptions and update the Detection Pattern to match.

  5. Refresh: Click Credit Tracker > Refresh Dashboard to populate the tracker.

Usage

Day-to-day, the tracker updates automatically when you refresh:

  • Check the dashboard to see which credits you’ve captured and what’s remaining

  • Watch the “Expiring Soon” section for credits approaching their reset date

  • Review the YTD summary to see total value captured across all accounts

  • Run Refresh Dashboard after adding new cards or changing configuration

The tracker handles Monthly, Quarterly, Semi-Annual, and Annual reset schedules, with support for both calendar-year and account-anniversary based resets.

Permissions

Yes - feel free to copy, use, and modify this workflow. The project is MIT licensed.

Notes

Included card templates: Amex Platinum, Amex Business Platinum, Amex Gold, Chase Sapphire Reserve, Chase United Club, Delta Reserve, Marriott Bonvoy Brilliant, Hilton Aspire, Citi Strata Elite.

Detection patterns: The templates include placeholder detection patterns based on common credit descriptions. You may need to adjust these to match exactly how credits appear in your transactions. Check your actual transaction descriptions after a credit posts and update the pattern accordingly.

What it tracks: This tracker is specifically for statement credits that appear as positive line items on your credit card statement. It does not track benefits that are applied elsewhere (like Uber Cash loaded to the Uber app, or hotel credits applied at checkout).

FAQ

Q: Why isn’t a credit being detected?

A: The Detection Pattern must match text that appears somewhere in your transaction description. Check your actual transactions to see the exact wording and update the pattern in Credits Config.

Q: Can I track credits from cards not in the templates?

A: Yes! Use Credit Tracker > Add Custom Account to add any card, then manually add credits in the Credits section of the config sheet.

Q: What if I have custom column positions in my Transactions sheet?

A: Update the Tiller Settings section in Credits Config to match your column layout (Date, Amount, Account, Description columns).

Q: Can I track the same credit type across multiple cards?

A: Yes, each credit is tied to a specific account, so you can have “Dining Credit” on multiple cards and they’ll be tracked separately.

Reminder to users considering executing code-based workflows:

  1. Malicious code can exfiltrate your data… or worse
  2. Tiller cannot screen or protect you when installing third-party software — its presence in this community is not a security endorsement
  3. Thoroughly review all code before you install and execute

With that out of the way, this looks really cool both visually and functionally, @alexlmiller. Thanks for sharing and documenting what you built thoroughly.

5 Likes

Do you have an Excel version?

Interesting sheet; doing a cursory look it looks like the code mainly sets up the sheets, is this easier to do than to create a sheet template that people can copy over? or are there functions that requires the script to constantly run to calculate?

The script only handles the setup of the sheets yes, but because there’s two steps (configuring the credits and then reporting on the credits), the script is pretty necessary for configuring the monitoring dashboard based on the credits you are searching.

An individual could definitely setup their own sheet manually with plenty of work and context but I couldn’t think of a good way to make a template that made setup easy.

The script also gets run manually later anytime you change the credits you’re tracking to reconfigure the monitoring dashboard

Thank you, @alexlmiller - this is so useful! :folded_hands: :clap:

I was easily able to manually add my own credit card accounts that weren’t in the template, as well as their respective credits.

And I figured out a hack to track benefits like this one that I have with Amex Blue Cash Preferred:

6% cash back (redeemable only as a statement credit) on groceries up to $6,000 per year in purchases at U.S. supermarkets.

Thought I’d share in case it’s useful for others.

First, I went to the top of the Credits Config sheet and manually added my Amex Blue Cash Preferred to my list of accounts, as shown on line 8:

Then I went to the bottom of the Credits Config sheet and manually added the grocery cash back benefit to my list of credit benefits, as shown on line 30:

  • I put $360 as the amount of the benefit ($6,000 maximum * 6% cash back).
  • I left the Detection Pattern blank because detection will happen in a different way.

Next, I went to the toolbar, selected Credit Tracker > Refresh Dashboard and then switched to the Credits Tracker sheet. There, I did the following:

In the Received column, I replaced the existing formula with a new formula that looks through all the transactions to find ones categorized as “Groceries” AND purchased with my Blue Cash Preferred card, tallies up the amounts, and calculates 6 percent.

=IFERROR(MIN(360, ABS(SUMIFS(Transactions!$E:$E, Transactions!$D:$D, “Groceries”, Transactions!$F:$F, “Blue Cash Preferred (-XXXX)”)) * 0.06), 0)

In that sheet, that cell happened to be E26, and that amount is also the YTD amount, so in the YTD column, I replaced the existing formula with “=E26” so they’d be the same.

The Progress and YTD% columns didn’t need any tweaks at all - they just worked!

So now I can see my progress toward $6,000 in grocery spending and count that as a first-class benefit on the card!

I dabbled with adding more category spending benefits that had no annual limits, but decided to just stick with ones where progress can be measured.

Because I’m hacking directly in the Credit Tracker, the downside is anytime I need to refresh the Dashboard, the formulas will get reset and I’ll have to paste them back in again. But it’s worth it to me because this grocery benefit is the main reason I got the card and I want to know if/when it’s all used up so I can put my remaining groceries on the next best card.

1 Like

I love the idea of this, however I am getting a concerning error message from google when trying to run it.

Yeah, because it uses scripts google is protective (which is good)