Grant Revenue Recognition ‘In Accordance With Restrictions and Timing’ Gets Complex Fast—How Do You Model Conditional vs Unconditional Grants in Beancount?
I’ve been working with a mid-size nonprofit client ($800K annual budget, managing about 12 different grants simultaneously), and the ASC 958 revenue recognition requirements are making my head spin. The standard requires recognizing grant revenue “properly, in accordance with the restrictions and their timing”—which sounds straightforward until you’re actually implementing it.
Here’s what I’m dealing with:
The Four Types of Grants We’re Managing:
-
Conditional grants - Foundation A gave us $150K, but we can only recognize revenue when we complete specific deliverables (quarterly reports, program milestones). If we don’t meet conditions, they have right of return.
-
Unconditional but restricted grants - Foundation B gave us $200K unrestricted by conditions, but restricted to youth programs. Revenue recognized immediately, but spending is constrained.
-
Multi-year grants - Federal grant of $450K over 3 years ($150K/year). Do we recognize all $450K in year one (when awarded) or $150K annually based on spending?
-
Reimbursement grants - State grant where we spend first, then request reimbursement. When do we recognize revenue—when we spend the money or when the check arrives?
My Current Beancount Approach (Probably Flawed):
For conditional grants, I’m using liability accounts until conditions are met:
2026-01-15 * "Received conditional grant from Foundation A"
Assets:Checking 150000 USD
Liabilities:Grants:Conditional:FoundationA 150000 USD
2026-06-30 * "Deliverable completed, recognize revenue"
Liabilities:Grants:Conditional:FoundationA 150000 USD
Revenue:Grants:FoundationA 150000 USD
grant-restriction: "none"
grant-period: "2026"
For restrictions, I’m using metadata tags:
Revenue:Grants:FoundationB
grant-restriction: "youth-programs"
grant-period: "2026-2028"
Then querying restricted vs unrestricted funds:
SELECT sum(position) WHERE account ~ "Revenue:Grants"
AND grant-restriction = "none"
What I’m Struggling With:
-
Multi-year grant timing - ASC 958 says recognize ALL $450K in year one if unconditional, but that makes our year-one financials look artificially strong and years 2-3 look weak. How do you handle multi-year grants in Beancount while staying compliant?
-
Reimbursement grant mechanics - When we spend $50K on eligible expenses, do I book it as: spend against cash, create receivable, then recognize revenue when reimbursed? Or recognize revenue immediately when spent (because spending is the condition)?
-
Audit trail requirements - Auditors need to trace every grant from: award letter → revenue recognition journal entry → spending against restrictions → final grant report. Git history helps, but is there a better way to document the decision chain?
-
Report generation - Can Beancount generate the required nonprofit reports from this structure?
- Statement of Financial Position (assets, liabilities, net assets by restriction class)
- Statement of Activities (revenue/expenses by functional category)
- Statement of Functional Expenses (program vs admin vs fundraising split)
The Bigger Question:
Is Beancount + metadata tagging actually BETTER for grant compliance than traditional nonprofit software (Intacct costs $20K-50K/year, QuickBooks Nonprofit can’t handle complex restrictions)? Or am I creating a maintenance nightmare?
I’ve seen advice that “government grants are almost always conditional” because they have right of return for misspent funds—but then I see others treat them as unconditional with restrictions. The distinction matters enormously for revenue timing.
For those using Beancount with nonprofits (or clients with grant funding): how are you structuring accounts and metadata to stay ASC 958 compliant? What queries are you running to generate funder reports? Have auditors accepted your Beancount documentation?
The client loves the transparency of plain text accounting (board can review every transaction in Git), but I need to make sure we’re not sacrificing compliance for convenience.
Sources: This is informed by recent research on nonprofit revenue recognition under ASC 958 guidance from FASB and implementation guidance from CPA firms.