How I Attracted Users To My $12.5K MRR Bank Statement Converter Software

Published: November 23rd, 2023
Angus Cheng
Bank Statement Co...
from Hong Kong
started March 2021
Discover what tools recommends to grow your business!
customer service
Discover what books recommends to grow your business!
Want more updates on Bank Statement Converter? Check out these stories:

Hello! Who are you and what business did you start?

I’m Angus Cheng, and I built Bank Statement Converter (BSC). BSC extracts transaction data from PDF bank statements. It’s used by accountants and small business owners.

Bank Statement Converter’s monthly recurring revenue is $12,500 USD. You can view an up-to-date revenue graph at Indie Hackers.


What's your backstory and how did you come up with the idea?

I’ve enjoyed programming since I was sixteen years old. I studied computer science at university and worked for myself as an indie game developer for a few years. After that, I worked as a game programmer, a mobile app programmer, a web programmer, and a programmer at Credit Suisse. My code was not responsible for the downfall of Credit Suisse.

In 2020 I joined a crypto company. It was there that I learned working with a large team of very stupid people is not fun. I quit at the end of 2020 to work for myself. I had saved up a lot of money while working and figured I could live off my savings for 5+ years.

Take us through the process of building the product.

In March 2021 I wanted to analyze my personal finances. I tried to get a dump of all my transaction data from my bank, but they would only provide PDFs. Undeterred, I wrote some Kotlin code to extract the data. It took me 10+ hours to write a script to do what I wanted.

I thought “If I want to do this, maybe someone else wants to do this” and decided to turn my script into a web app. I called up my friend Dominic and asked him if he wanted to get a beer. We met for beers and I pitched him the idea. I suggested he’d do the front end and I’d do the backend. He agreed. We met up the next day and spent the whole day together working on the app.

I read a bit of The Lean Startup (failing to finish the book seems to be in the spirit of the book) in 2013, and ever since then, I’ve realized the importance of launching a minimal viable product.

Dom and I agreed on a very simple specification for launch. One page where users can upload a PDF bank statement. After uploading the file the resulting CSV file is given to the user as a file download. We spent a bit of time reworking the APIs. Originally I thought all we would need is one API that would take a PDF file in the body and respond with CSV.

POST /api/v1/BankStatement

That didn’t really work so well. What if you were uploading 100 files, and one of them failed? You’d have to upload them all over again. What if you needed to provide a password for a PDF file? We eventually ended up with these three APIs.

1) POST /api/v1/BankStatement

2) POST /api/v1/BankStatement/setPassword

3) POST /api/v1/BankStatement/convert

1) Lets you upload a PDF. It returns a UUID for the PDF you uploaded

2) Lets you provide a password for the PDF

3) Lets you provide an array of UUIDs representing uploaded PDFs

Pretty quickly we had the app working nicely locally. We then focused on getting it into production. Which meant doing the following things:

  1. Buying a domain. We agreed on a domain name while drinking beers.
  2. Getting some virtual machines from AWS
  3. Writing Ansible scripts to deploy the backend
  4. Setting up SSL certificates
  5. Setting various DNS records on our domain.

Within a week we had got all this stuff done and it was live on the internet. At this point we were missing a lot of important features. We didn’t have a registration, payment processing, or a result preview page. To be honest, if you used it at launch, it probably didn’t work. I created the ‘generic algorithm’ using bank statements from five banks.

Once it was live on the internet we bought Google Search Ads. Immediately people started uploading bank statements. We validated that people wanted the product by building a minimally viable product.

For the backend, I used:

  1. PDF Box to read the PDF files
  2. Amazon Lightsail for virtual machines
  3. Ansible for deploying scripts
  4. Buildkite for CICD automation
  5. Kotlin
  6. Ktor for the HTTP server
  7. LetsEncrypt for SSL certificates

Describe the process of launching the business.

We didn’t do anything special for the launch. The goal was to get it into production as quickly as possible and then improve the product on a daily basis. There isn’t really a landing page for BSC, you go to the website, and from there you can immediately upload a PDF. I wanted zero friction for the users.

We sell subscriptions for BSC at different prices depending on how many pages a user expects to convert in a period. The Starter package costs $30 USD a month for 400 pages and our Business package costs $99 USD a month for 4000 pages. We also run custom prices for people who need to convert many many PDFs.

Usage has grown steadily since launch, there really hasn’t been an event that has caused a lot of people to use Bank Statement Converter. It seems to be spreading through word of mouth.

Before launching I thought that a lot of users would request an offline version. I spent a lot of time figuring out how to build an offline version of BSC. I decided to use JavaFX. I even started work on the offline version. However, no one asked me for it. They were happy with the web version. That taught me a lesson, don’t build something unless a customer asks for it.

Since launch, what has worked to attract and retain customers?

I’ve tried a few things to attract customers.

Cost-per-click advertising. For the first six months, I spent about $1000 USD a month on Google Search Ads. Sadly I brought in a lot less money than I spent on ads:

April 2021 - $0

May 2021 - $101 USD

June 2021 - $159 USD

July 2021 - $306 USD

August 2021 - $233 USD

September 2021 - $263 USD


At the end of September, I turned off the Google Search Ads.

Cold outreach. Around the same time, I thought about sending out cold emails to accounting firms. I found a really cool tool called which could automate the process. I hired someone on to collect email addresses for accounting firms. I fed the emails into Lemlist, created a template, and scheduled months' worth of emails.

People read the emails, and sometimes they angrily replied:


Back then sales were so low I was able to mentally track where each customer came from. From memory, only one person bought a subscription from over 1000 emails sent out. Not a great conversion ratio.

I also made a little mistake with LemList. I set it up to send one email every twenty minutes, 24 hours a day. LemList integrates with Gmail/GSuite. If you’re sending emails 24 hours a day, Google considers may flag you as a bot. They did in my case, and they banned my GSuite account.

Luckily I was able to migrate my emails from GSuite to Fastmail. After getting banned from GSuite I decided to stop sending out unsolicited emails. It’s not illegal but you have to be careful about how you do it. I’m sure cold emailing can work, but I wasn’t able to make it profitable when I tried.

Content marketing. In August 2021 a friend of mine started writing technical blog posts about how exchanges work based on his experience working at a crypto exchange. His blog posts were really good and he got lots of views. Around the same time, I read a blog post written by someone from about how they got to $500K annual recurring revenue. I decided to try content marketing.

I set up a Hugo blog and every now and then I would write a post. I wrote a blog post about how I reduced memory usage and that got to the front page of HackerNews. Which resulted in zero extra paid users.

In the graphs below you can see a big spike in people coming to the website, but no increase in revenue.



Writing blog posts does help me think about what I want to build, it also builds up backlinks. I think it’s a worthwhile activity, but it is hard for me to assess the impact it has on revenue. You could argue “People are reading these blog posts, which bumps you up the Google Search rankings, which leads to more users, which leads to more revenue”. Could be true, but I can’t prove it!

Supporting More Banks. BSC works by identifying the bank a statement is from, and then running specific code for that bank. If we can’t identify the bank a statement is from, we run a generic code for that statement. If the conversion results aren’t good, often a customer will tell me and provide the PDFs they uploaded.

I then create the configuration for that bank statement. Over time the likelihood that someone uploads a bank statement that we don’t support goes down.

Over the summer of 2022, I was in talks with a fintech company that wanted to convert 10,000 documents a month. They wanted a guarantee of the accuracy of BSC. I told them I couldn’t promise 100% accuracy, but if they gave me a dump of the PDFs they had I could analyze them and figure out how much work it would take to support all the banks they had statements for. They agreed and I spent the next few months building configurations for all their statements.

After that, they picked up a high-value subscription. A side effect of doing that work is the likelihood a user subscribed increased massively. Which makes sense. If you upload a statement and it doesn’t convert properly, you won’t subscribe. If it does, you might.

Retaining Customers. For my application, there isn’t really a trick to retaining customers. If someone has a one-off need to convert a bunch of PDFs, there’s nothing I can do to keep them as a customer once they’ve finished their task. Customers like accountants need to process PDFs throughout the year. They’ll keep paying for the software so long as it works.

How are you doing today and what does the future look like?

BSC has been profitable ever since I stopped running Google Search Ads. However, as a full-time indie hacker being profitable isn’t good enough! I need to be able to pay the rent.

Customer acquisition costs - $0. I don’t spend any money on advertising.

Ad costs - $0

Return on ad spend - Not applicable

Customer lifetime value - $180

Monthly traffic - 11K unique visitors

Average time on site - 1m 58s

Conversion rate - In the last 30 days, 7725 unique users uploaded a PDF and 103 unique users bought a subscription.

Email subscribers - No, I don’t have an email list.

Social media following - BSC does not have any social media accounts. I have 1565 followers on Twitter.

Year on year growth - Revenue last twelve months: $126,218 USD

Revenue for previous twelve months: $36,273 USD - Grew by 247% in the last twelve months

Operations - Right now I spend a lot of time dealing with customer support. I have a plan to create a UI that will let users define the shape they want the results in. Using that the backend will use different strategies to get the same results. The idea is instead of building the configuration myself, I will get the user to guide BSC to figure out how to get the data in.

If this works it’ll save me a lot of time.


  • BSC is used in a lot of countries, but there are a lot of big countries where it is barely used. China, South America, and Europe. Spending some time marketing to those countries might be a good idea.

Through starting the business, have you learned anything particularly helpful or advantageous?

Do the job before hiring for it

In the middle of 2021, I hired someone to help me set up a cold email marketing. The guy I hired didn’t get much done. After two weeks of working, I reviewed his work. It didn’t seem like he had done much, and what he had done wasn’t good. He had set up a template that assumed variables

Do things that don’t scale

This is something YCombinator people mention a lot. In the early days, I was hoping to make a generic algorithm that worked for every bank statement out there. I thought a generic algorithm could produce results good enough for a user, and they could clean up the data themselves afterward.

I had a policy that I would do whatever a customer asked for, and the only way to do that was for me to run different code paths for different bank statements. I did this, the results for those bank statements improved and sales went up.

It also helped me realize the product I was trying to build wouldn’t be good enough for the customers.

Write tests

When I worked at Credit Suisse the guys I worked with were obsessed with writing tests. At first, I thought it was a waste of time. Later I realised they help you document the system and allow you to not think about how the app works. Previously when developing apps I’d keep the entire

Monitor Business Metrics

I run a Grafana dashboard that shows lots of business-related metrics. It’s a good way to monitor errors, usage, and sales data. This helps me spot issues early and debug issues customers have.

What platform/tools do you use for your business?

  1. Buildkite - running tests, creating builds, and deploying the backend
  2. Github - backing up the code, version control
  3. SendInBlue - sending automated emails
  4. Fastmail - an email host, used to use GSuite but got banned for sending too much unsolicited email.
  5. Crisp Chat - on site live chatting with customers. I love this.
  6. Amazon Textract - optical character recognition of scanned statements.
  7. AWS Lightsail - virtual machines that cost less than EC2 instances.
  8. AWS Route 53 - domain registration
  9. Lemlist - used to use this for sending out cold emails. Don’t do so anymore because I got banned from GSuite. It’s a good app, just be careful about how you use it.
  10. Upwork - hiring contractors
  11. Netlify - hosting the front end

What have been the most influential books, podcasts, or other resources?

  • Paul Graham’s blog. Lots of actionable advice for early-stage start-ups. Most of this stuff applies to indie hackers.
  • YCombinator’s YouTube channel. I liked to convert them to MP3s and listen to them while hiking. Same sort of vibe as Paul Graham’s blog.
  • Founders at Work by Jessica Livingston. Interesting to hear about various founders in this book. The chapter I enjoyed the most was about Craigslist.

Advice for other entrepreneurs who want to get started or are just starting out?

A lot of people do a lot of talking and planning but never actually take action to get their business going. Execution is a lot more important than planning and a lot can be done by one person.

Where can we go to learn more?

If you have any questions or comments, drop a comment below!