Back to blog
July 28, 2025

I built an alert layer on top of QuickBooks - then Intuit added a $300/month fee

  • Name
    CJ Ezinne
    #background
    #quickbooks
    #lunova
I built an alert layer on top of QuickBooks - then Intuit added a $300/month fee

Introduction

At the end of 2024, I found myself a bit bored.

I had just closed down a dying RAG AI app that did well for a couple years, until the big guys like OpenAI/Google, gobbled up the space with larger context windows and rock bottom prices. And I was itching for a new side project to work on.

At the time I always used QuickBooks Online to handle a lot of the bookkeeping and found myself constantly in r/bookkeeping and r/QuickBooks, just trying to trouble shoot a couple things and found myself helping out bookkeepers every now and then troubleshoot their various Zapier integrations, excel plugins and other non-bookkeeping things.

And let’s be honest… Bookkeepers and small business owners live in QuickBooks—but not many of them enjoyed using it, it was just the cost of doing business with some of their clients. So I kinda decided, what the hell… I want to build a tool in this space.

And after working with and speaking to a number of bookkeepers, you figure out that many of them have their own unique and bespoke workflow when it comes to keeping up with their client’s books. And you would be surprised how many bookkeepers simply have a master spreadsheet and calendar reminder workflow that reminds them to check in.

It’s fascinating and you know what… “if it ain’t broke, don’t fix it”

However, I still went ahead and asked a couple of them, would it be cool if you were automatically alerted when the client uploads their receipts and then you can come back in and reconcile?

So I built Lunova, a custom alerting and monitoring layer on top of QuickBooks.

At first, I thought it would be simple: subscribe to webhooks, trigger notifications, done.

Instead, I ran headfirst into a mess of rate limits, limited APIs, shallow webhook, and a third-party app store approval process that took over 90 days, only for Intuit to introduce a new $300/month fee right after we got in.

What started as a weekend side project away from my day job is now something real bookkeepers and small business owners use to catch missed invoices, unexpected deposits, and low cash balances before it’s too late.

It’s still a work in progress, but it’s definitely been an interesting process.


Topics


Why QuickBooks is a pain to build on

QuickBooks Online has the scale and maturity that you’d expect from a market leader, but as a dev platform to build on… especially for real-time workflow, it’s surprisingly fragile.

At first glance, it checks all the boxes: a REST API, OAuth2, webhook support, even a developer portal, and those are great, but I ran into quite a few issues that required a number of workarounds.

Unreliable Webhooks
Webhooks are often delayed, duplicated, or dropped entirely. And it’s not just me, on their own forums, developers report inconsistent delivery of invoice and payment notifications, sometimes with hours of lag, or no delivery at all.

And the payloads only contain the record’s ID and timestamp, forcing an extra API call to fetch useful data—which eats into the rate limit.

Webhook issues

Shallow & Fragmented Data Access
Projects, Custom Fields, Sales Tax APIs, which did not previously exist, now require a minimum of $300 per month to use.

Severe Rate Limits
QuickBooks imposes tight API quotas: 500 requests per minute per realm (connected company), 10 concurrent calls, and strict batch limits.

Which, on its face, is not that bad, but these ceilings made it a bit difficult for very active alerts, especially when you need to poll or rehydrate data due to webhook gaps and make a get call on every webhook request because we only receive the entity ID in the payload.

Fun fun fun.


The Technical Approach I Took to Make It Work

I’ll preface this section by saying that I’m not a perfect software architect, just a mid-level dev having a bit of fun with this project, making it work and constantly iterating on it. So I am very much open to your opinions and suggestions.

Once it became clear I couldn’t fully rely on QuickBooks to notify me in real time, I had to build Lunova around that reality.

The vision was simple: Send alerts when financial activity changes; deposits, invoices, bills, products, etc. But the platform needed to be as fault-tolerant and rate-limit aware as it could.

1. Webhook-First, But Not Webhook-Only

Webhooks are the first signal we listen for. But due to delays or dropped events, we treat them as triggers, not sources of truth.

  • When a webhook arrives, given that we only get the entity ID in the payload, we have to fetch the full record and process it.
  • If a webhook doesn’t arrive, we don’t necessarily assume nothing happened.

2. Configurable Polling with Token Buckets

To fill webhook gaps, we run targeted polling based on what each customer has alerts set up for.

But to stay within limits, we implemented a token bucket rate-limiting system, which allows for short bursts of traffic while respecting long-term throughput ceilings.

3. Redis for Coordination Across Machines

Since we run Lunova across multiple machines and regions, we use Redis to coordinate polling schedules, prevent duplicate fetches, and track alert processing state in real time.

4. Kafka for Event-Driven Processing

Ok, I will admit, this might have been overkill. We aren’t processing thousands of messages per second or anything. But I love evented architectures.

Nevertheless, all data from webhooks or polling—is routed into Kafka, which acts as our backbone for alert processing.

  • Alerts are evaluated via event-driven rule engines.
  • Failed deliveries are retried asynchronously.
  • Logging, alert state, and analytics all pass through Kafka streams.

5. An Alert-First System

Lunova is built from the ground up around alerts.

  • Each alert rule is tied to specific entity types and conditions.
  • When we detect a change, we check if any rules are triggered.
  • Matching alerts are sent out immediately, with full delivery tracking and retry logic.

Surviving Intuit’s App Store Approval Gauntlet

After months of development, we finally kicked off our QuickBooks App Store review process in mid-March. We thought the hard part was over.

There are three phases: technical, security, and marketing. I passed the technical review quickly. Then waited weeks for the security review to begin. When it finally did, we got a short report with just two medium findings. I fixed both within 12 hours. The response? “Next retest scheduled in 80+ days.”

That meant waiting until August 19 for a review we were ready for in May.

Eventually, I got lucky. I had built up a small network of internal folks and external devs who nudged things forward, and we cleared the full process by late June, almost 100 days after we started.

But I know founders who are still waiting.


Intuit’s New Pay-to-Play – App Partner Program

After finally getting listed, Intuit launched a new requirement: pay to play.

Pricing chart

Announced in May, launched July 28, the App Partner Program introduces paid tiers that gate access to key APIs.

Press Release

The Silver Tier—$300/month—is now required if you want access to even basic endpoints like customers, reports, and accounts.

I was lucky to get in just before this kicked in. But new apps must now pay that fee to go live.

This isn’t unique to Intuit. We’ve seen it with Reddit, Twitter, Facebook—platforms that open the doors to developers then clamp down once they’ve captured the value.

It’s frustrating, but it’s also reality.


Conclusion

All in all, I’m having a lot of fun with Lunova. We’ve officially launched, and already have a handful of bookkeepers, accountants, and business owners actively using the product.

Just recently, I sent over 30 handwritten letters, each with a Starbucks gift card, to top QuickBooks ProAdvisors across the country, inviting them to try Lunova and share feedback.

Letters

Along the way, I’ve met some incredible QuickBooks app developers and business owners. One of them even invited me into a private Slack community for devs building in this space:
👉 QuickBooks Partners Slack (let them know CJ sent you!)

If Lunova sounds like it could help you or your business, I’d love for you to give it a shot. Reach out to me directly if you hit any issues or want to see something added.

We respect your privacy.

TLDR: We use cookies for language selection, theme, and analytics. Learn more.