The 33% Rule: Tracking Client Concentration Risk in Beancount When Top 2 Clients Drive 50% of Revenue

I learned about revenue concentration risk the hard way. Here’s my story and the Beancount solution I built afterward.

The Crisis I Didn’t See Coming

My bookkeeping practice served 12 clients. Everything felt stable:

  • 2 largest clients: ,500/month each = ,000 total
  • Other 10 clients: ~00/month average = ,000 total
  • Total monthly revenue: 0,000

The math: My top 2 clients = 50% of my revenue.

But I didn’t think about it as “concentration risk.” I thought: “Great! Two stable clients for 2+ years.”

Then Disaster Struck

Month 1: Client A (SaaS startup) ran out of funding. Shut down operations. Gave me 30 days notice.

Month 2: Client B got acquired. New parent company has in-house bookkeeping. Gave me 60 days notice.

Within 90 days: Lost 50% of revenue (0k → k monthly)

Suddenly I couldn’t cover: rent, software subscriptions, healthcare, living expenses.

I scrambled to find new clients, but quality clients take 3-6 months to close.

I had to dip into savings, cut personal expenses, panic.

The Realization: I Should’ve Seen This Coming

Revenue concentration risk was invisible until it became a crisis.

If I’d been tracking this metric, I would’ve known I was vulnerable and started diversifying earlier.

The Beancount Solution I Built

I now track revenue concentration with these queries:

1. Revenue by client as % of total:

SELECT 
  tag AS client,
  SUM(amount) AS revenue,
  SUM(amount) / (SELECT SUM(amount) FROM Income) * 100 AS pct
WHERE account = 'Income:Services'
  AND tag ~ '@client:.*'
GROUP BY tag
ORDER BY revenue DESC

2. Alert thresholds:

  • :yellow_circle: Yellow flag: Any client >25% of revenue (moderate risk)
  • :red_circle: Red flag: Any client >33% of revenue (high risk)

3. Survival metrics:

  • If top client leaves, how many months can I survive on savings?

4. Scenario modeling:

  • Baseline: Current revenue continues
  • Optimistic: Grow 15%
  • Pessimistic: Lose top client (-30% revenue)
  • Disaster: Lose top 2 clients (-50% revenue)

5. Recovery planning:

  • Need X new clients at monthly to replace concentrated revenue

The Lesson

Concentration risk was invisible until it hit. Now I actively monitor and proactively diversify.

My new target: 15 clients × ,000 average instead of 5 clients × ,500

More work to manage 15 relationships, but much less vulnerable to sudden loss.

Questions for the Community

  1. How do you balance serving great clients with diversification needs?

  2. What’s an acceptable concentration threshold? (I’m using 25% now)

  3. How do you track this in Beancount? (Tags? Metadata? Queries?)

For those running consulting, bookkeeping, or service businesses: How do you think about client concentration risk?

I see this exact pattern with my CPA clients—not just bookkeeping practices, but any small business with customer concentration.

Example: Restaurant where 40% of catering revenue comes from one corporate client.

I use Beancount metadata to track customer concentration:

@customer:CorpClient

Then query monthly:

SELECT customer, SUM(amount), SUM(amount)/total*100 
FROM revenue WHERE year=2026

My advice to clients: No single customer should exceed 20% of revenue (ideally 15%).

If concentration exists, build contingency plan:

  • What if we lose this customer tomorrow?
  • How many months cash reserve needed?
  • What’s customer acquisition timeline?

I apply the same logic to my own CPA practice. Track revenue per client, monitor quarterly, proactively market to maintain diversity.

This should be part of regular financial reviews—not just crisis response.

@bookkeeper_bob Your 25% threshold is reasonable. I’d recommend building toward 15% over time.