ASC 958-720 Functional Expense Reporting: Why Nonprofits Can't Hide Administrative Costs Anymore

Hey everyone! I serve as treasurer for a small nonprofit (community education program), and I just learned about ASC 958-720 functional expense reporting the hard way. Thought I’d share what I learned, because this is critical for anyone tracking nonprofit finances in Beancount.

The Wake-Up Call

Our ED asked me last month: “Mike, can we show a lower overhead ratio on our Form 990? Donors really care about that number.”

I started digging into the rules, and wow—this is both stricter and more important than I realized.

What ASC 958-720 Actually Requires

FASB requires every nonprofit to categorize expenses two different ways:

  1. Natural classification: What you bought (salaries, rent, supplies, etc.)
  2. Functional classification: Why you bought it (program work, administration, or fundraising)

This shows up on IRS Form 990 Part IX—and that’s public. Anyone can look you up on GuideStar and see your overhead ratio.

The Donor Perception Problem

Here’s what surprised me: research shows donors think 19% overhead is reasonable, but they believe most charities spend 28%. There’s already skepticism baked in.

And a 2025 study found that donations drop significantly when overhead hits 35% for human services nonprofits (50% for healthcare).

But the paradox: healthy nonprofits actually need 15-25% overhead to operate sustainably. You need qualified staff, good systems, legal compliance, audits, technology—all of that is “overhead,” but it’s necessary.

My Beancount Mistake (Don’t Do This!)

When I first started tracking our nonprofit finances, I set up simple accounts:

Expenses:Salaries
Expenses:Rent
Expenses:Programs

Come tax season? Our CPA asked me to allocate everything by function (program vs admin vs fundraising). I had to go back through hundreds of transactions and manually figure out which bucket each belonged to.

Never again.

The Better Way: Functional Categories from Day One

Now my account structure looks like this:

Expenses:Program:EducationClasses:Instructor
Expenses:Program:EducationClasses:Materials
Expenses:Program:CommunityOutreach:Events
Expenses:Admin:Accounting
Expenses:Admin:Insurance
Expenses:Admin:Legal
Expenses:Fundraising:EventCosts
Expenses:Fundraising:MarketingMaterials

When I record transactions, the functional categorization happens immediately—not at year-end.

Handling Shared Expenses

The tricky part: some expenses serve multiple functions. Our Executive Director does program work, admin work, AND fundraising. How do I allocate her salary?

Here’s what I do:

2026-03-15 * "Payroll" "Executive Director - March 2026"
  Expenses:Program:Management     3000.00 USD  ; program-pct: 0.60
  Expenses:Admin:Management       1500.00 USD  ; admin-pct: 0.30
  Expenses:Fundraising:Management  500.00 USD  ; fundraising-pct: 0.10
  Assets:Checking

I use metadata tags (program-pct) to document the allocation methodology. Our ED tracks her time monthly, and we use those percentages. This creates an audit trail that satisfies both our CPA and IRS requirements.

For rent, we use square footage: 70% of our space is classroom/program area, 30% is office/admin. Same split every month, documented in the transaction notes.

Why This Matters

Transparency doesn’t have to be scary. In fact, I’d argue that nonprofits with 20% overhead ratios are often healthier than those claiming 8%.

An 8% ratio usually means:

  • They have restricted grants covering admin (not reflected in the ratio)
  • They’re underspending on critical infrastructure
  • They’re misallocating costs (risky for audits)

A 20% overhead nonprofit is investing in sustainability: qualified staff, proper accounting, legal compliance, good technology. That’s not waste—that’s responsible management.

Questions for the Community

I’m still learning, so I’d love to hear from folks with more experience:

  1. How granular should program categories be for Form 990? We have 3 different education programs—do I need separate expense accounts for each, or can I group them?

  2. What allocation methods do you use for shared costs? Time tracking? Square footage? Something else?

  3. Anyone built Beancount queries to generate Form 990 Part IX reports automatically?

  4. How do you educate your board/donors that 20% overhead is healthy, not wasteful?

I’ve found that Beancount’s plain text approach makes this so much easier than traditional accounting software—I can see exactly how things are categorized, audit my own work, and generate reports with simple queries.

But I know I’m just scratching the surface. What am I missing?


For anyone new to nonprofit accounting, start here: IRS Form 990 Instructions and Understanding Nonprofit Overhead Costs. The rules are complex, but the transparency is worth it.

Mike, this is a fantastic breakdown of a topic that trips up so many nonprofits! You nailed the core issue: retroactive allocation is a nightmare.

Let me answer your questions from a CPA perspective, plus add some professional guidance:

Granularity for Form 990

Short answer: It depends on your organization’s size and Form 990 version.

  • Form 990-EZ (gross receipts <$200K): You can report a single “program services” total. Minimal granularity needed.
  • Form 990 (receipts >$200K): Part III requires you to describe your program service accomplishments—typically 3-5 major programs. Your expense accounts should match this structure.

For your 3 education programs, I’d recommend:

Expenses:Program:LiteracyTutoring
Expenses:Program:STEMWorkshops
Expenses:Program:AdultEducation

This gives you clean Form 990 Part III reporting without excessive complexity. You can always add sub-accounts later if funders request program-specific financials.

Pro tip: Check your bylaws or articles of incorporation for stated program areas—your 990 should align with your founding documents.

Allocation Methods: The IRS Standard

The IRS says you must use a “reasonable allocation method” and apply it consistently. Here are the most defensible approaches:

  1. Time tracking (gold standard for salaries): If your ED spends 60% on programs, 30% on admin, 10% on fundraising—document it monthly.

  2. Square footage (for rent, utilities, insurance): Physical space used for each function.

  3. Headcount (for shared services): If you have 10 program staff and 3 admin staff, allocate 77% program / 23% admin.

  4. Direct benefit (for specific costs): Does this expense directly support a program? Then 100% program. Is it organizational overhead? 100% admin.

The key is documentation. I recommend a one-page “Cost Allocation Policy” document that states:

  • ED salary: allocated based on monthly time logs
  • Facility costs: allocated 70% program / 30% admin based on square footage analysis dated [DATE]
  • Shared technology: allocated 80% program / 20% admin based on user count

Keep this policy in your board-approved records. If the IRS audits you, this document protects you.

Beancount Queries for Form 990 Part IX

Yes! You can absolutely automate this. Here’s a basic query structure:

SELECT
  root(account, 2) as functional_category,
  root(account, 3) as natural_category,
  sum(position) as amount
WHERE
  account ~ '^Expenses:'
  AND year = 2026
GROUP BY functional_category, natural_category

This gives you a matrix view: rows = functional (Program/Admin/Fundraising), columns = natural (Salaries/Rent/Supplies).

That’s exactly what Form 990 Part IX requires. Export to CSV, import to your tax software or Excel template.

I built a Python script that runs this query and generates a pre-filled 990 worksheet. Saves me hours during tax season. Happy to share if you’re interested.

Educating Donors: The Overhead Myth

This is the hardest part—changing donor mindset. Here’s what’s worked for my nonprofit clients:

1. Annual transparency report
Show a breakdown: “For every $1 donated, $0.78 goes to programs, $0.17 covers essential admin (accounting, compliance, IT), and $0.05 supports fundraising to bring in MORE donations.”

2. Show the counterfactual
“If we eliminated our $25K annual audit, we’d lose access to $200K in federal grants that require audited financials. That ‘overhead’ is an investment.”

3. Use analogies donors understand
“Would you want a hospital that spends 0% on medical equipment maintenance? Or a university that spends 0% on accreditation? Overhead isn’t waste—it’s infrastructure.”

4. Highlight outcomes, not ratios
Instead of “We spent only 18% on admin!”, say “We served 500 students this year with strong financial controls and IRS compliance.” Donors care about impact, not accounting ratios.

One More Thing: Joint Cost Allocation

Mike, one trap to watch out for: joint costs. If an activity has BOTH program and fundraising components (like an educational event where you also solicit donations), you must allocate costs using the three-part test in ASC 958-720-45.

This is complex. If you do joint activities, flag it for your CPA. Mishandling joint costs is one of the top Form 990 audit triggers.


You’re doing great work making nonprofit finances transparent and sustainable. The fact that you’re asking these questions means your organization is miles ahead of most. Keep it up!

Mike and Alice, thank you both for breaking this down! I work with 3 small nonprofits (all under $500K budgets), and this allocation challenge is real every single month.

Let me share the ground-level reality and some workflows that actually work for small organizations without dedicated accounting staff.

The Executive Director Salary Problem

Alice mentioned time tracking is the gold standard—absolutely true. But here’s what I’ve learned: most small nonprofit EDs will not consistently track their time unless you make it stupid-easy.

What’s worked for my clients:

Option 1: Simple monthly estimate (15 minutes/month)
At the end of each month, ED fills out a one-page form:

  • What % of your time was spent on direct program delivery or oversight? ____%
  • What % on organizational management (HR, finance, board meetings)? ____%
  • What % on fundraising activities (grant writing, donor meetings)? ____%

Takes 15 minutes. Gets you defensible allocation percentages. I record these in a spreadsheet and use them for that month’s payroll entries.

Option 2: Annual allocation with quarterly reviews
Sit down in January, estimate the year: “I’ll spend about 65% program, 25% admin, 10% fundraising.” Use those percentages all year. Review quarterly—if it’s way off, adjust prospectively.

IRS says “reasonable and consistent” method—both of these qualify.

The Rent/Utilities Allocation Reality

Alice’s square footage method is perfect… if you have physically separate spaces. But a lot of small nonprofits operate out of a single open office or shared space.

My approach for multi-use spaces:

2026-03-01 * "Rent" "Monthly office rent"
  Expenses:Program:Occupancy        1400.00 USD  ; 70% program (classes held here)
  Expenses:Admin:Occupancy           600.00 USD  ; 30% admin (general operations)
  Assets:Checking

The 70/30 split comes from: “We hold classes 3.5 days/week (70% of time), admin work the rest.” Not perfect, but reasonable and documented.

For utilities, I use the same percentage as rent—consistent allocation method.

Shared Technology Costs

One of my nonprofits uses Google Workspace ($12/user/month). We have:

  • 8 program staff (teachers, coordinators)
  • 2 admin staff (ED + office manager)
  • 1 fundraising staff (development director)

That’s 80% program, 20% admin, 10% fundraising. So I allocate:

2026-03-05 * "Google Workspace" "Monthly subscription"
  Expenses:Program:Technology        105.60 USD  ; 80% program users
  Expenses:Admin:Technology           26.40 USD  ; 20% admin users
  Expenses:Fundraising:Technology     13.20 USD  ; 10% fundraising users
  Liabilities:CreditCard

Note: This totals 110% because some people wear multiple hats (ED is both admin and fundraising). You could normalize to 100%, but I’ve found it’s cleaner to use actual headcount even if there’s overlap—just be consistent.

The Dangerous Temptation: Under-Allocating Admin

Here’s what I see too often: Nonprofits scared of high overhead ratios start calling admin expenses “program” expenses.

Examples I’ve seen:

  • “The ED’s salary is 100% program because they oversee programs” :cross_mark:
  • “Our annual audit is program-related because it’s required for grants” :cross_mark:
  • “IT costs are program because staff use computers for program work” :cross_mark:

This is misallocation. If you get audited and the IRS finds you systematically understated admin costs, you’re in trouble.

Real talk: If your overhead ratio looks “too good” (<10%), donors might actually question it. I had a grant officer tell my client: “Your 6% admin ratio seems unrealistic. Can you explain how you operate an organization without administrative costs?”

Beancount Plugins for Auto-Splitting

Alice mentioned automation—here’s a practical tip. I use a simple Beancount plugin that auto-splits recurring monthly expenses:

# In my importer or plugin:
ALLOCATION_RULES = {
    'Google Workspace': {'Program': 0.80, 'Admin': 0.20},
    'Office Rent': {'Program': 0.70, 'Admin': 0.30},
    'Insurance': {'Program': 0.75, 'Admin': 0.25},
}

When I import transactions, the plugin checks if the payee matches a rule and auto-generates split postings. Saves me from manually typing the same allocations every month.

Not doing anything fancy—just string matching and pre-set percentages. But it eliminates human error and makes monthly reconciliation WAY faster.

The Question I Have

Mike, you mentioned using metadata tags like program-pct: 0.60. I love this for documentation.

Does anyone use these metadata tags to generate allocation reports? Like, a Beancount query that shows:

  • All transactions with allocation metadata
  • Grouped by allocation methodology (time-based vs square-footage vs headcount)

This would be amazing for audit prep—showing the IRS exactly how you allocated shared costs and what methodology you used for each category.

If someone’s built this, I’d love to see it!


Bottom line: You don’t need a $50K accounting system to get functional expense tracking right. You need:

  1. A clear allocation policy (document it!)
  2. Consistent application month-over-month
  3. A Beancount account structure that matches Form 990 categories
  4. Transaction notes that explain your reasoning

Beancount makes this doable even for small nonprofits with limited resources. That’s why I’m converting all my clients to plain text accounting—the transparency and audit trail are unbeatable.