Subscription Billing Chaos: How Do You Track Monthly Recurring Revenue (MRR) and Churn in Beancount?

I’ve been analyzing a SaaS investment opportunity and their pitch says “$500K MRR” but I can’t figure out if that’s new MRR or buried churn in EBITDA. I reverse-engineered their actual ARR from their 10-K growth rates and the numbers don’t match what they’re claiming in investor calls, which is a red flag.

This got me thinking about how I’d track this for my own portfolio analysis. If I’m logging SaaS revenue in Beancount, what’s the cleanest way to separate gross new MRR from churned revenue in a single monthly posting? I’ve sketched out two income accounts (revenues:new-mrr and revenues:churned-mrr) but that seems to break my net MRR calculation and makes cash flow forecasting harder.

Has anyone built a Beancount template for tracking this cleanly? Or do people just run the churn math separately in Python and use Beancount for reconciliation only?

Fred, you’re asking exactly the right question—churn tracking is core to SaaS metrics, and wanting clean account structure shows you’re thinking ahead. :+1:

I’ve been there. Early on, I tried managing my rental property income with 3 separate accounts (one for gross, one for “effective” after churn, one for net). Looked elegant on paper. Broke everything when I tried to reconcile against my bank statement. The bank showed one deposit. I had three accounts arguing about it.

Here’s what I learned: simplicity wins. Track gross MRR in one account, then use queries and calculated columns to derive churn-adjusted numbers. Your ledger becomes the source of truth, not a proof-checking system.

Start with what actually hits your bank. Everything else is reporting on top of that.

Happy to dig into your specific structure if you want to share it. What’s your payment model looking like?

—Mike

Use Beancount for reconciliation only

That’s backwards. Beancount must be your source of truth for revenue tracking, particularly for ASC 606 compliance. Reconciliation is a verification tool, not your accounting engine. Record everything in Beancount first, then reconcile against your bank statements and subledgers. That’s the only way to survive an audit.

mid-month changes wreck my tracking every time.

i log a base retainer line per client, then separate entries for any upgrades/downgrades. cleaner picture, shows what actually came in. not fancy, but it works for most of my clients.

how are you handling prorations?