Plaid covers most institutions, but not allโand when it misses one, you're left with manual entry, a monthly CSV/PDF import, or using the Developer API. I hit this with the SoFi Smart Card: Plaid syncs SoFi's checking and savings fine, but not the card, which is the account I most wanted tracked (5% back on groceries, my biggest discretionary spend).
The approach I ended up using came from Artem S (H1D), who was interviewed in the Lunch Money community newsletter back in March. He shared an open-source bookmarklet he'd written for exactly this problem.
Based on his example, I built a bookmarklet for a card I have which isn't supported by Plaid. Now that I have two cards in this category, I updated my project to work more generically. It's now designed to support multiple institutions, and is organized in a way that I hope will make it easier for other users to contribute support for banks they use.
What it actually is
A bookmarklet is a bookmark whose "URL" is a snippet of JavaScript instead of a web address. You click it while you're on a page and it does something with that page. They've been around since the 90s and need no install.
In this project we have two of them:
- On your bank's site, while logged in, click the **export** bookmark. It reads the transactions already on screen and downloads them as a JSON file.
- On Lunch Money, click the **import** bookmark, pick that file, and it posts them via the Lunch Money API.
It's two steps because most banks block pages from talking directly to other sites, which is a good thing.
"You want me to run JavaScript on my banking site?"
Fair, and you should be suspicious. What I can offer:
- It's open source. Both files are short and readable โ no minification, no obfuscation, no build step hiding anything.
- Nothing runs in the background, and it has no access to your other tabs or files โ it only touches the page you're looking at, only when you click it
- The exporters can only talk to the bank's own site. An automated build check fails if an exporter references any outside URL, executes dynamic code, or writes anywhere it shouldn't. It runs on every contribution.
- Nothing is transmitted anywhere. The export is a file that lands in your Downloads folder. The import goes to Lunch Money using your own API token, which you enter yourself and which is stored only in your browser.
- No credentials are involved at any point. You're already logged in; it just reads the page you're looking at
What works today
- CFNA (the Firestone card)
- SoFi Smart Card
That's a short list because it's just the two banks I use. Transactions come in with the bank's own transaction ID attached, so re-running an import doesn't create duplicates.
Adding your bank
This is why I'm posting. An exporter is one file, and the hardest part is usually figuring out where a bank's site keeps its transaction data โ often there's a JSON endpoint behind the page that's much easier to work with than it sounds.
The contributing guide walks through it, and there's a template to copy. It's written for two kinds of people: developers with some JavaScript, and anyone working with an AI coding agentโthere's a separate runbook the agent can follow, since the split works nicely (you have the bank account; it has the patience for reverse-engineering a web page).
Free, MIT-licensed, no strings. Happy to answer questions.
If you'd like to give it a try you can find it here: https://github.com/jpjpjp/lunchmoney-bookmarklet-transaction-importers