BudgetSheet sales stats proving $1,600+ MRR

How I Built a Google Sheets Extension Making $1.6k+ MRR

May 4, 2022

I created and run BudgetSheet, a Google Sheets Extension currently making $1.6k MRR and growing. If you have ever wondered if there was money to be made with extensions and addons, there absolutely is! Here’s how I built BudgetSheet:

Pick The Right Problem

BudgetSheet was born of frustration. I used many personal finance and budgeting apps, but was frustrated with all of them. Mint is free, but constantly spams you with credit card and loan offers and doesn’t have great budgeting tools. YNAB wants you to budget their own specific way. EveryDollar was slow and had a clunky UI that took 5+ clicks and a bunch of time just to re-categorize a single transaction. Multiply that times 200, and it was rage inducing 🤬. All I wanted was my own transactions in my own spreadsheet! In a spreadsheet, I could blaze right down the “Category” column and re-categorize my 200 transactions in a few minutes! Why wasn’t it easier to just use a spreadsheet for this? Clearly this was a problem that needed solving!

Explore The Idea

Extensions and addons can be fairly limited by the platform you are building into, so you need to make sure what you want to do is even possible first. I scratched my own itch and built BudgetSheet after about a week of experimenting to see if it was even possible with Google Apps Script. Building something like BudgetSheet was not only possible, but I discovered how awesome and powerful Google Apps Script is (seriously!). It would let me do so much more than I ever thought possible – all with no hosting costs or web service to maintain! Once I realized that it was possible to build what I wanted using 100% Apps Script, I got to work. After about another month or two, I had a good first release on the Google Workspace Marketplace.

Charge Money

Money is the ultimate validation. People will tell you all day long how cool your product is, but things get real pretty quickly when you ask for money. From the start, BudgetSheet has had a paid upgrade plan. The free version allowed users to connect 1 account, and the paid Pro version was required for connecting more than 1 account.

BudgetSheet v1.0 was actually pretty awful. To use BudgetSheet, users had to go sign up for their own Plaid developer account, get their own API keys, plug them into a certain place in a “BSA_Settings” spreadsheet (the extension created this for you), and then connect all their bank accounts in dev mode to even get started. It was a ton of manual work, and was very error prone! Despite all of these ridiculous hoops to jump through and a lot of early missteps, I not only got my first paying customers, but my free to paid conversion rate was 4%!

If you are looking for specifics, the easiest way to take money within the context of an extension or addon without having to build a payment page or web service is to:

  1. Use a Gumroad link for payments along with their Gumroad License Key service. This will generate a new unique license key per sale that will be emailed to the user.
  2. Add a screen or a form for the user to input their license key. Use the Gumroad License Key API to ensure their key is valid.
  3. Set a flag in the extension that the user has paid and record their license key (I used Document Properties in Google Apps Script)
  4. Add logic gates around paid features that check for that flag being set
  5. ???
  6. Profit!

Focus on Stability and Quality After Validation

Now that I knew the idea was possible AND that people would pay money for it (yes! 🙌), it was time to re-build it with a focus on stability and quality. I could now fully justify investing a lot more time into this little side project of mine to build it into something bigger.

Around the same time I was evaluating all the different approaches I could take on this, Plaid reached out to me. I had gained so many users so quickly that Plaid had taken notice that I was having end users sign up for developer accounts, and reached out to me directly to let me know (very gently and graciously) that was a violation of their terms of service. They were actually pretty impressed with what I had built, and were in the process of building something similar for Microsoft Money.

I spoke back and forth with Plaid a bit about expectations and timelines with me as a solo dev with a family and a full time job, and they gave me nearly 8 months to re-build the whole extension around running all the connections through my own Plaid account and paying for them (the proper way!). The phrase “It is better to ask forgiveness than permission” has never been more true in my entire life. This required a complete re-architecture, running my own web service, database, etc. – the whole deal. No more freeloading on 100% Google Apps Script and no Plaid fees (directing end users to setup their own Plaid accounts had allowed me to bypass them)!

The new setup was a lot more work, maintenance, and cost compared to the 100% profit margins I was enjoying doing things the freeloader way, but it was the right thing to do. It was time for me to put some real skin in the game on this and build out a proper web service. The end result was much higher stability for bank connections and transactions, and a much nicer onboarding flow for my users with fewer manual steps. Since I could control the runtime, I could also run things faster (Apps Script is great, but it runs slow!), longer (Apps Script has low script timeouts!), and do more than I could previously – like support oAuth bank connections that required a stable URL endpoint.

Use Leverage Where Possible

As a lifetime developer of 20+ years (I started very young!), my strength is on the code and tech side of things and almost non-existent on the sales and marketing side of things. Creating an addon was a perfect solution to this, because Google has over 3 billion users and provides a built-in marketplace and distribution channel to funnel users straight to me without me having to lift a finger.

Naming is important for discovery both in the marketplace and SEO. So I chose the name “BudgetSheet” to leverage those looking for tools that helped them budget in spreadsheets. Strong brand names are ultimately better in the long run so I may re-brand at some point, but I think this name that is more specific to what I am targeting has really helped me get a great start.

Time is the most precious resource, and I knew that my time was going to be seriously constrained between my family, my full time job, and growing BudgetSheet on the side. When building out the web service, I made very specific technology choices like Serverless tech with Next.js and Vercel that would completely eliminate me worrying about servers, software upgrades, uptime, SSL certs, scaling, capacity, etc. I also use Amazon AWS RDS for PostgreSQL. Now I can focus nearly 100% on the product, the code and data without any concern for servers or deployments. Vercel and RDS have been well worth the cost for the piece of mind they offer and the time the save me.

Have Fun

BudgetSheet is a joy to run. As a spreadsheet lover myself, I often think to myself “these are my people” when a user sends me a cool formula or shares charts and graphs of things they have done with their finances using BudgetSheet. I love when users share these things or just pass along some nice comments. It’s an amazing feeling, and it is consistent validation that BudgetSheet is solving a real problem for many people.

Seeing real traction and getting such positive customer feedback is such a game changer. I have launched many things over the years, but BudgetSheet is by far the most fun startup to run out of all of them. It is also the only one to grow so much organically.

Make a good product that you are proud of in a space that you love, and you will have fun running it along the way. It’s the best way to stay sane and do what you love.

If you made it this far and you like spreadsheets, check out BudgetSheet! It’s free to try for 15 days, so there is nothing to lose. Who, knows? You might like it!


Tags: , , , , , ,

Categories: ,