82% of Small Businesses Fail From Cash Flow Problems—Can Beancount Forecasting Actually Save You When the Recession Hits?

I’ve been thinking about this a lot lately, especially after reading that 70% of SMBs hold less than four months of cash reserves heading into 2026. That stat alone should terrify anyone running a small business.

Here’s the uncomfortable reality I see across my client base: most small business owners I work with can tell you their revenue last month, maybe their profit margin. But almost none of them can answer the simple question: “How many weeks of runway do I have if revenue drops 30% tomorrow?”

The Cash Flow Problem Nobody’s Solving Well

The SCORE data is brutal—82% of small businesses that fail do so because of cash flow problems. Not because the product was bad, not because the market disappeared, but because they literally ran out of money to make payroll or pay vendors.

And the macro picture isn’t reassuring. U.S. household debt hit $18.8 trillion by Q4 2025, delinquencies climbed to 4.8% of outstanding debt (highest since 2017), and consumer confidence surveys show 33% of Americans don’t feel they could financially withstand a recession. When your customers are stressed, your cash flow suffers.

Meanwhile, 63% of small business owners plan to seek additional capital in 2026—but banks are only approving 27% of small business loan applications. So “I’ll just get a loan” isn’t a plan.

What I’ve Built in Beancount

I started building a cash runway dashboard for my own clients about 6 months ago. The core idea is simple:

Step 1: Calculate fixed monthly burn

SELECT sum(amount) WHERE
  account ~ "Expenses:(Rent|Payroll|Insurance|LoanPayments|Utilities)"
  AND year = 2025 AND month = 12

Step 2: Calculate current liquid assets

SELECT sum(amount) WHERE
  account ~ "Assets:(Checking|Savings|MoneyMarket)"

Step 3: Runway = Liquid Assets / Monthly Fixed Expenses

For one client, the numbers were sobering: $47K liquid assets / $18.2K monthly fixed expenses = 2.6 months of runway. That’s it. Less than 3 months if all revenue stops tomorrow.

The Three-Scenario Model

What I really want to build (and where I’m stuck) is automated scenario modeling:

  • Base case: Current revenue trends continue
  • Moderate recession: Revenue drops 20%, two clients delay payment by 60+ days
  • Severe recession: Revenue drops 40%, one major client churns entirely

For each scenario, I want Beancount to project: when does cash hit zero, and what expenses could be cut to extend the runway by 30/60/90 days?

I’ve been doing this manually in spreadsheets alongside Beancount, which defeats the purpose. Has anyone built proper forecasting within Beancount itself? I know BQL has limits for forward-looking projections, but I’ve seen people use custom Python scripts reading from their Beancount ledger to generate projections.

The Advisory Angle

Here’s what makes this really valuable for those of us serving small business clients: a monthly “Cash Runway Report” is the kind of advisory deliverable that justifies premium pricing. Clients who can present their bank with a document showing “here’s our runway under three scenarios, here’s our cost-cutting plan for each” are in a fundamentally different negotiating position than those who say “trust me, we’re fine.”

Questions for the community:

  1. Has anyone built automated cash flow forecasting with Beancount data? Python scripts, custom Fava plugins, anything?
  2. How do you handle the forward-looking limitation of BQL—do you use pad/budget entries, or external scripts?
  3. For those serving small business clients: are you running this kind of analysis, and what do clients actually pay for it?
  4. How often do you update projections? Weekly feels right but it’s a lot of work.

The recession may or may not come, but the businesses that survive will be the ones that saw their runway clearly. I’d rather have the dashboard and not need it than need it and not have it.

Bob, this hits close to home. I had a client last quarter—a landscaping company doing $1.2M in annual revenue—who came to me because their line of credit was up for renewal. The bank asked for a 13-week cash flow forecast. They had no idea what that even meant.

When I pulled their Beancount data and ran the numbers, their runway was 1.8 months. A $1.2M revenue business with less than 8 weeks of survival cash. The owner turned white.

The Advisory Pricing Question

To answer your question #3 directly: I charge $500/month per client for what I call a “Financial Visibility Package” that includes:

  • Monthly cash runway calculation (exactly what you described)
  • 13-week rolling cash forecast updated bi-weekly
  • Quarterly stress test under 3 scenarios
  • A one-page “financial health scorecard” the client can hand to their banker

For context, my standard monthly bookkeeping fee is $800-1,200 depending on complexity. So the advisory add-on is roughly a 40-60% revenue bump per client. And the retention is incredible—clients who see this data don’t leave.

The CPA Compliance Angle

One thing I’d add that bookkeepers should be aware of: if you’re presenting cash flow forecasts to clients who then use those projections for bank loan applications, you’re entering territory that overlaps with financial attestation. You don’t need to be a CPA to prepare projections, but you DO need clear engagement letter language that says these are management’s projections prepared with your assistance, not a CPA’s independent forecast.

The AICPA has specific standards (AT-C 305) for examination of prospective financial information. If a bank treats your forecast as a professional attestation and the numbers are materially wrong, the liability exposure is real. I’ve seen this go sideways.

My Approach to Forward-Looking Projections

For the BQL limitation question: I use a hybrid approach. Historical data stays in Beancount, but I wrote a Python script that:

  1. Pulls trailing 6-month averages for each expense category from BQL
  2. Applies seasonal adjustment factors (landscaping clients have huge Q2-Q3, dead Q4-Q1)
  3. Generates three scenario projections using configurable revenue multipliers
  4. Outputs a formatted report that imports into Fava as a custom page

The seasonal adjustment piece is critical. A client with $47K cash and $18K monthly burn in December looks very different from the same client in March when their seasonal revenue kicks in. Straight-line runway calculations can be dangerously misleading for seasonal businesses.

The bank loved it. Client got their line renewed at better terms because they could demonstrate they actually understood their cash position. That landscaping owner now considers the $500/month the best money he spends.

This thread is gold. I want to push back slightly on one thing and then share what I’ve actually built for personal FIRE runway tracking—because it turns out the same math applies to both business survival and early retirement planning.

The FIRE ↔ Business Runway Parallel

Here’s what I realized about a year ago: the “months of runway” calculation for a business is identical to the FIRE community’s “years until financial independence” calculation. They’re the same formula at different timescales:

  • Business runway = Liquid assets / Monthly fixed expenses
  • FIRE runway = Net investable assets / Annual expenses (the classic 25x rule is just saying you need 25 years of runway from investment returns)

So I built one Python script that does both. It reads my Beancount ledger and generates:

  1. Personal FIRE dashboard: Net worth, savings rate, projected FI date under 3 market scenarios
  2. Stress test: What if I lose my job for 6 months? What if my portfolio drops 30%? What if both happen?

For the stress test, I ran the numbers Bob mentioned:

Scenario Starting Position Duration to Zero
Job loss only $187K liquid + $4.2K/mo expenses 44 months
Portfolio -30% only $131K liquid 31 months
$20K medical emergency $167K liquid 39 months
All three combined $91K liquid + $4.2K/mo 21 months

Even the worst case gives me nearly 2 years. That’s the power of a high savings rate—your runway is fundamentally longer.

Where I Push Back: Static Runway Is Misleading

Bob, your 2.6 month runway calculation for that client is correct but also misleading, and here’s why: it assumes revenue goes to zero. For most businesses, even in a severe recession, revenue doesn’t disappear entirely—it drops 20-40%.

A more useful metric is burn-adjusted runway:

If that $18.2K/month expense client still generates $10K/month in a 40% revenue decline, their adjusted runway is:

$47K / ($18.2K - $10K) = 5.7 months, not 2.6.

Still not great, but a completely different risk profile. I’d argue the burn-adjusted number is what should go on the dashboard.

The Script I’ll Share

I’ve been working on a Python module called beancount-forecast that does exactly what this thread is asking for. It’s not polished enough for PyPI yet, but here’s what it does:

  • Reads Beancount ledger via beancount.loader
  • Extracts trailing 3/6/12 month averages for income and expense categories
  • Applies user-defined scenario multipliers (e.g., revenue × 0.6 for severe recession)
  • Projects forward 52 weeks with weekly granularity
  • Identifies the “cash-zero date” for each scenario
  • Generates a matplotlib chart showing all three scenarios on one timeline

If there’s interest, I can clean it up and share the repo. It’s about 400 lines of Python—not trivial but not a huge project either.

One More Thing: The Behavioral Trap

Alice’s point about client retention is important, but I want to flag the flip side. When I first built my personal FIRE dashboard, seeing “FI date: 2034” made me complacent. I had 8 years of projected runway and stopped worrying about expenses. My savings rate dropped from 48% to 39% over 6 months before I noticed.

The dashboard creates awareness but not necessarily action. For your small business clients, Bob—showing them a 2.6 month runway only works if they actually do something about it. Do you follow up with an action plan, or just deliver the report?

Great discussion, and I want to add some perspective from someone who’s been through an actual downturn with Beancount as their financial backbone.

My 2020 Story

When COVID hit, I had three rental properties, a tech day job, and what I thought was a solid financial position. My Beancount ledger showed a healthy net worth. What it didn’t show—because I hadn’t built the queries—was that my liquid position was terrible. Most of my net worth was locked in property equity.

Here’s what happened in March 2020:

  • Two of three tenants stopped paying rent (legally couldn’t evict them)
  • My employer froze hiring and cut bonuses
  • Property tax bills still came due
  • My “cash runway” was about 4 months, but I didn’t know that until I panic-calculated it on a Saturday morning

That experience fundamentally changed how I use Beancount.

What I Built After the Panic

I now maintain what I call a “Financial Resilience Dashboard” that runs every Sunday morning via a cron job. It generates a one-page summary with:

Tier 1: Immediate Liquidity (can access within 24 hours)

  • Checking accounts
  • Savings accounts
  • Money market funds
  • Runway at current burn rate

Tier 2: Near-Liquid (can access within 1-4 weeks)

  • Brokerage accounts (non-retirement)
  • I-bonds past 1-year hold
  • HELOC available balance

Tier 3: Locked Capital (accessible but with significant cost/delay)

  • Retirement accounts (10% penalty)
  • Property equity (requires sale or refi)
  • Illiquid investments

The key insight: net worth is not the same as financial resilience. You can have a $1.5M net worth and a 3-month runway if 90% of that is in property and retirement accounts. I’ve seen this trap catch so many people in the FIRE community.

On the Frequency Question

Bob asked how often to update projections. Here’s my take after 4+ years of doing this:

  • Weekly: Overkill for most people and businesses. The numbers don’t change fast enough to justify the time, and you risk over-reacting to noise.
  • Bi-weekly: Sweet spot for small businesses with variable revenue. You catch trends early without drowning in data.
  • Monthly: Fine for personal finance and FIRE tracking. Your savings rate and expense patterns don’t shift dramatically week-to-week.
  • Exception: Update immediately after any major event—losing a client, a large unexpected expense, a market crash. Don’t wait for the scheduled review.

A Gentle Disagreement with Fred

Fred’s “burn-adjusted runway” metric is clever, but I’d caution against using it as the primary number. Here’s why: in a real crisis, you don’t know what your revenue will be. In 2020, I thought my rental income would drop 30%. It dropped 67% because two of three tenants stopped paying entirely.

The zero-revenue runway is the worst case, and the worst case is what banks and investors want to see that you’ve planned for. Show both numbers—the adjusted runway for realistic planning and the zero-revenue runway for stress testing—but don’t let the more optimistic number make you complacent.

Practical Advice for Getting Started

For anyone reading this who hasn’t built any forecasting yet, here’s where I’d start:

  1. Today: Run Bob’s three BQL queries. Know your number. It takes 10 minutes.
  2. This week: Categorize your expenses into “must pay” (rent, payroll, insurance) vs “can defer” (marketing, subscriptions, non-essential vendors). Know your reducible burn rate.
  3. This month: Build or adapt Fred’s Python script to project forward under 3 scenarios.
  4. Ongoing: Review monthly, act on the trends, and most importantly—have a written plan for what you’ll cut and in what order if revenue drops.

The businesses and individuals who survive downturns aren’t the ones with the most cash. They’re the ones who know their numbers and have a plan before they need one.