← Back to blog

I just wanted to check my EasyCard balance

If you want to check your EasyCard balance online in English, you can do it at easycard.pierrebuilds.dev: enter your card number and it shows your balance and recent transactions, no Mandarin required. Here's the story of how I ended up building it.

One day I was about to hop on the bus and I wanted to check how much balance was left on my EasyCard.

If you live in Taiwan, you know the EasyCard: it's the card everyone taps for the MRT, buses, convenience stores, basically everything. And yet, standing at the stop, I realised I had no quick way to see the balance. I searched Google. I found the official EasyCard site. It's entirely in Mandarin, has a horrible UI and is not mobile friendly. Since it's not in English, I had to rely on Google Translate to be able to fill in the required fields. If I wanted to check the balance again at another time, I'd have to fill in all the info again from scratch. All-in-all, I didn't have such an easy experience for checking the balance of a card literally called EasyCard.

Since I'm always looking for new ideas for things I can build, I noted this down in my notes app.

The official EasyCard balance site, entirely in Mandarin with a cluttered desktop-only layout

Productive coffee shop session

A few weeks later I was at a cafe waiting for our cat to get their spa treatment (yes...). I opened the official site again, but this time with the browser dev tools open, watching the Network tab.

I wanted to see what was actually happening under the hood to see if I could reverse engineer the requests and then simply wrap all of it in a mobile friendly, English UI. After some poking and a fair amount of trial and error, I figured out the requests it was making in the background and how to reproduce them myself.

By the end of the weekend, I had something that worked! I wrapped it all in a simple UI that uses the colors of the Taiwan flag. The main thing I was thinking about at the time, was that annoying Captcha that is present on the official site. It was necessary in order to be able to make the requests in the background, but I was thinking of ways to get it to solve automatically as to remove an extra hurdle. In the end I decided not to, as to keep everything as 'clean' as possible.

Honestly, at that point I was building it for exactly one user: me. And it was working!

My EasyCard balance checker showing balance and recent transactions in English

Actually shipping it (for the first time)

I had done some quick searching online to see if other people were also complaining about the fact that checking EasyCard balances was not that easy for non-Mandarin speakers/readers. I found a couple posts about this actually, which made me realise that this could maybe be useful to other people!

I'd never launched a full web app live before. Everything I'd made until then lived on my laptop, so this was the perfect opportunity to learn something new.

So I hosted it on Vercel, learned a bunch along the way about deploying something real to the internet. I have to be honest, it felt pretty cool to have something online that you made and that strangers could theoretically use as well.

I went back to the posts I had seen about this and I dropped a comment with a link to the web app, saying I built this for myself and if anyone finds it useful they can try it as well.

People actually started using it

A few people tried it. Then a few more. Not a flood, but real humans I'd never met were using it and getting their balance.

I wanted to know if it was actually working for them, so I added some analytics. And I mean the most handmade analytics imaginable: I was logging events and errors into a Google Sheet. (I still do this, honestly.) That sheet lets me see how many balance checks happen and, when something breaks, what the error was.

That crude little sheet turned out to be one of the most useful things I did. It told me the tool worked, told me people came back, and told me exactly where it failed.

The one feature I'm quietly proud of

The EasyCard API returns your recent transactions, but the merchant names come back in Mandarin. For a lot of the people using an English-first tool, that's only half solved.

So I built a small automated process that runs every day, checks for any new untranslated merchant name strings, translates them, and updates a JSON file that maps the Mandarin names to English. Over time it's quietly built up a full translation layer, so now people can read their history fully in English without me touching anything.

It's not glamorous. But it's the kind of small, compounding improvement that makes a tool feel useful (to me at least).

What this actually was

Around 40 balance checks a day. That's the number.

By any real business measure, that's nothing. No revenue, no growth chart to brag about. But it reframed something for me, and that's why it's the first thing I'm writing about here.

I didn't start with "is there a market for this?" I didn't validate an audience or write a landing page or run a playbook. I just had a genuine, specific, personal annoyance. I can't check my own card balance. And I scratched it for myself. The curiosity about whether anyone else wanted it came after I'd already built the thing.

And it turned out other people had the exact same annoyance. That's the whole lesson: when the problem is real enough that you feel it every week, there's a decent chance a bunch of other people feel it too.

The honest part

I'll be straight about where I am now: I've tried to start newer projects, and getting even a single user for those has been genuinely hard. Distribution is my weak spot, and the EasyCard tool didn't magically solve that.

But that's exactly why those 40 daily checks matter to me. They're proof that if you find something that actually helps people, they'll show up and use it. No convincing required.

So that's project number one. If you're in Taiwan and want to check your EasyCard balance without the Mandarin maze, it's here. I built it for me, but it's yours too.

Next time I'll write about the ones that didn't take off, because those taught me just as much.