Skip to main content

82 posts tagged with "beancount"

View all tags

S-Corp “Reasonable Salary”: A Practical Guide for Beancount Users (2025)

· 6 min read
Mike Thrift
Mike Thrift
Marketing Manager

If you run an S-corp and work in it, the IRS expects you to take W-2 wages before you take owner distributions. The key phrase that governs this entire process is “reasonable compensation.” Getting this wrong can lead to costly tax adjustments and penalties.

Here’s what “reasonable” means in practice—and how to track it cleanly and defensibly in your Beancount ledger.

2025-07-24-s-corp-reasonable-salary


What the IRS Actually Requires

The rules are straightforward: shareholder-employees must be paid reasonable compensation for their services before receiving non-wage distributions. Paying yourself too little (or nothing at all) while taking large distributions is a major red flag. The IRS can, and often does, reclassify those distributions as wages, hitting you with back payroll taxes and penalties.

This isn't a new or obscure rule. The IRS has emphasized it for years, notably in its Fact Sheet FS-2008-25, which clarifies that corporate officers who perform more than minor services are to be treated as employees for FICA tax purposes. On your annual Form 1120-S, officer pay is reported on Line 7 (“Compensation of Officers”), and the instructions explicitly state that these amounts are considered wages to the extent they are for reasonable compensation.

Courts consistently back this up. In the landmark case Watson v. United States, a CPA paid himself a salary of only $24,000 while taking significant distributions from his profitable firm. The court sided with the IRS, recharacterizing most of those distributions as wages subject to employment taxes.


How to Estimate a Reasonable Salary (Simple, Defensible)

So, how do you determine a "reasonable" number? Think of it this way: what would you have to pay someone else to do the job you actually do, in your market, with your experience? The IRS views this as a valuation problem, and there are several common-sense ways to arrive at a defensible figure.

Here’s a pragmatic workflow:

  1. Start with Market Comps: This is your anchor. Use resources like Glassdoor, the Bureau of Labor Statistics (BLS), or salary ranges from recruiters to find data for comparable roles in your geographic area.
  2. Factor in Your Role & Time Split: Most small business owners wear multiple hats. Acknowledge this by weighting your salary based on the time you spend on different functions. For example, you might be 60% software engineer and 40% product manager.
  3. Perform an Ability-to-Pay Sanity Check: Your company's financial health matters. A business with losses may not be able to support a top-quartile salary. However, reporting zero wages while you perform substantial services is rarely justifiable.
  4. Document Everything: Save your sources, notes, and calculations. This documentation is your first line of defense in an audit. (More on this below.)

Quick Worksheet (Illustrative)

Let's walk through an example:

  • Market Pay: You find that the local median salary for a Senior Engineer is 140,000andforaProductManageris140,000** and for a Product Manager is **120,000.
  • Your Time Split: You estimate your time is 60% engineering and 40% product management.
  • Weighted Base Salary: (0.60times(0.60 \\times 140,000) + (0.40 \times 120,000)=120,000) = 84,000 + 48,000=48,000 = 132,000$.
  • Final Decision: Based on your company's current margins, you decide on a salary of $125,000 and plan to revisit it annually.

For context, the 2025 payroll tax rates are 6.2% for Social Security on wages up to $176,100 and 1.45% for Medicare on all wages. Both the employee and employer pay these amounts.


Common Pitfalls to Avoid

Steer clear of these common mistakes that can attract IRS scrutiny:

  • Taking Distributions Before Wages: If you provided services to your S-corp during the year, you must run payroll for your reasonable wages before taking any distributions.
  • Setting a "Token" Salary: A nominal salary—like $10,000 for a full-time officer of a highly profitable company—is a near-certain trigger for reclassification, as seen in the Watson case.
  • Mishandling >2% Shareholder Health Insurance: Premiums paid for health insurance for shareholders who own more than 2% of the company must be included in their W-2 wages. These amounts are subject to income tax but are generally exempt from FICA taxes. Coordinate with your CPA or payroll provider to ensure this is handled correctly.

A Clean Beancount Setup

Your ledger is the perfect tool for maintaining a clear line between wages and distributions.

Minimal Chart of Accounts

Assets:Bank:Operating
Expenses:Payroll:Wages
Expenses:Payroll:Employer:SocialSecurity
Expenses:Payroll:Employer:Medicare
Liabilities:Payroll:Withholding:Federal
Liabilities:Payroll:Withholding:SocialSecurity
Liabilities:Payroll:Withholding:Medicare
Equity:Distributions

Example Postings

This example shows a monthly payroll run for a 150,000annualsalary(150,000 annual salary (12,500/month), followed by a separate owner distribution. Notice how wages are recorded as a business expense, while distributions are a reduction of equity.

; Run monthly payroll (company side + withholdings)
2025-02-28 * "Payroll - February"
Assets:Bank:Operating -10350.00 USD
Expenses:Payroll:Wages 12500.00 USD
Expenses:Payroll:Employer:SocialSecurity 775.00 USD
Expenses:Payroll:Employer:Medicare 181.25 USD
Liabilities:Payroll:Withholding:Federal -3000.00 USD
Liabilities:Payroll:Withholding:SocialSecurity -775.00 USD
Liabilities:Payroll:Withholding:Medicare -181.25 USD

; Owner distribution (non-wage)
2025-03-10 * "Shareholder distribution"
Assets:Bank:Operating -5000.00 USD
Equity:Distributions 5000.00 USD

Useful Checks with bean-query

Periodically, you should compare your year-to-date wages against distributions. This query makes it easy:

; Compare wages vs. distributions YTD
SELECT account, SUM(position)
WHERE (account ~ "Expenses:Payroll:Wages" OR account ~ "Equity:Distributions")
AND year = 2025
GROUP BY account;

Paper Trail (Protect Yourself)

If the IRS ever asks, you'll want your reasoning documented.

  • Create a short compensation memo each year. Detail your roles, time split, links to market data you used, and the final salary you chose.
  • Store this memo in your Beancount directory, for example: docs/comp/YYYY/comp-memo.md.
  • Keep copies of all official payroll reports and your annual W-2/W-3 filings.
  • Record your decision directly in your ledger with a note entry.
2025-01-15 note "Set 2025 officer salary at $125,000 based on market comps + role split. See docs/comp/2025/comp-memo.md"

FAQ (Fast)

  • Can my salary be $0 if my company lost money? 📉 If you performed significant services, the IRS still expects you to be paid a reasonable wage for that work. If cash flow is a serious issue, get professional advice on how to proceed.
  • How often should I revisit my salary? 🗓️ At least annually. You should also reassess it anytime your role, responsibilities, or the market changes significantly.
  • What if I’m the only person in the company? 🙋 Even if you're a solo operator, you are still an employee of your S-corp. You must run formal payroll if you work in the business.

This guide provides general information and is not a substitute for professional tax advice. Always consult with a qualified CPA to address your specific financial situation.

S-Corp Election Deadline (2025): A Crisp Guide for Beancount Users

· 6 min read
Mike Thrift
Mike Thrift
Marketing Manager

Thinking about electing S-corp tax status? Great—just don’t miss the clock. The S-corp election can be a powerful tax-saving tool for small business owners, but its deadlines are strict and non-negotiable. Missing one can complicate your tax picture significantly.

Here’s the practical, accountant-approved version of what you need to know, plus how to track it all cleanly in your Beancount ledger.

2025-07-23-s-corp-election-deadline-2025


The Deadline, In One Bite

The most critical date is for filing Form 2553, Election by a Small Business Corporation. This is the form that tells the IRS you want to be taxed as an S-corp.

  • For existing, calendar-year businesses: You must file Form 2553 by the 15th day of the 3rd month of the tax year you want the election to take effect. For a 2025 election (effective January 1, 2025), the deadline is Saturday, March 15, 2025. Because this falls on a weekend, the IRS weekend/holiday rule pushes the functional deadline to the next business day: Monday, March 17, 2025.
  • For new businesses: If this is your business's first tax year, you have “2 months and 15 days” from the start of your tax year to file. The exact date depends on when your tax year officially begins. For example, if your business starts on January 7, your deadline would be March 21.

Tip: If your business operates on a fiscal year rather than a calendar year, the same logic applies. Calculate your deadline as the 15th day of the 3rd month from your fiscal year's start date.


What If You Missed It?

Don't panic. The IRS understands that business owners can miss deadlines. If you intended to elect S-corp status but failed to file on time, you may be eligible for late-election relief.

The IRS provides a streamlined procedure, Revenue Procedure 2013-30, which allows many small businesses to request retroactive S-corp status. You generally qualify if you can show you had reasonable cause for filing late and meet the procedure's other requirements.


Other Key Dates Tied to S-Corps

Once you're an S-corp, the deadlines don't stop. Here are two other important dates to mark on your calendar:

  • 1120-S Filing (The S-corp Tax Return): Your annual S-corp tax return, Form 1120-S, is due by the 15th day of the 3rd month after your tax year ends. For most businesses (calendar-year filers), this is the same as the election deadline: March 17, 2025.
  • Need More Time? If you can't file your 1120-S on time, you can file Form 7004 for an automatic 6-month extension. This extends the deadline to file your return to September 15. Crucially, this is an extension to file, not an extension to pay. Any taxes you owe are still due by the original March deadline.

Who Should Even Elect S-Corp?

S-corp status isn't for everyone. Its primary benefit is reducing self-employment taxes. It achieves this by allowing you to split your business's profit into two categories:

  1. Reasonable W-2 Wages: This is a salary you pay yourself, which is subject to standard payroll taxes (Social Security and Medicare).
  2. Shareholder Distributions: This is the remaining profit you take from the business, which is not subject to self-employment tax.

However, this advantage comes with added complexity and costs. S-corps require running formal payroll, adhering to "reasonable compensation" standards set by the IRS, and handling more compliance paperwork, like filing Forms 1120-S and issuing K-1s to shareholders.

Before you make the jump, run the math. A CPA can help you model the breakeven point where the tax savings outweigh the additional administrative costs.


Make the Deadline Easier—with Beancount

A well-maintained ledger is your best friend for S-corp compliance. You can use Beancount to stay on top of deadlines and clearly distinguish between wages and distributions.

Minimal Chart of Accounts (Starter)

Here's a basic chart of accounts to get you started:

  • Assets:Bank:Checking
  • Income:Sales
  • Expenses:Payroll:Wages
  • Expenses:Payroll:EmployerTaxes
  • Equity:DistributionsFor shareholder draws
  • Equity:Opening-Balances

Typical Postings

Your Beancount entries will create a clear separation between payroll expenses and equity distributions.

; W-2 payroll is a business expense
2025-02-28 * "Run payroll - February"
Assets:Bank:Checking -6200 USD
Expenses:Payroll:Wages 5000 USD
Expenses:Payroll:EmployerTaxes 1200 USD
; entity: S-Corp period: 2025-02

; Shareholder distribution is a draw on equity, not an expense
2025-03-10 * "Shareholder distribution"
Assets:Bank:Checking -3000 USD
Equity:Distributions 3000 USD
; entity: S-Corp period: 2025-Q1

Useful Guardrails (Queries & Tags)

Use Beancount's features to sanity-check your finances and ensure you're meeting reasonable compensation standards.

  • Tag every owner draw with something memorable, like distrib: "yes".
  • Periodically run a query to compare total wages paid against total distributions taken.

You can run a quick check from your terminal with bean-query:

SELECT account, SUM(position)
WHERE (account ~ 'Expenses:Payroll:Wages' OR account ~ 'Equity:Distributions')
AND year = 2025
GROUP BY account;

This will give you a clean summary of your wages and distributions for the year, helping you and your CPA assess if your salary is "reasonable."

Paper Trail for the Election

Keep your S-corp documentation organized and linked to your ledger.

  • Create a docs/ folder in your Beancount directory to store PDFs of your signed Form 2553, the IRS acceptance letter, any late-election relief statements, and your payroll setup documents (EIN, state IDs).
  • Record a note transaction in your ledger the day you file the election. This creates a permanent, dated record.
2025-01-22 note "Filed IRS Form 2553 for S-corp election (effective 2025-01-01)"

Edge Cases to Watch

  • Your "first tax year" start date might not be your formation date. The clock for the "2 months and 15 days" deadline starts when your company has shareholders, acquires assets, or begins business operations—whichever comes first.
  • For non-calendar fiscal years, be precise. Your Form 2553 deadline is based on your fiscal year's start date, while your Form 1120-S deadline is based on its end date.

Quick Checklist

Ready to proceed? Here is a final checklist to guide you.

✅ Decide if the S-corp structure fits your business based on profit level, payroll readiness, and state-specific rules. ✅ Calendar Form 2553 with the correct deadline (and set a one-week reminder for yourself). For 2025, that's March 17, 2025. ✅ If you're late, immediately evaluate if you qualify for relief under Rev. Proc. 2013-30. ✅ Configure your payroll system and map the new expense and equity accounts in your Beancount ledger. ✅ Prepare to file Form 1120-S by the deadline or file Form 7004 for an extension.


This guide provides general information, not tax advice. Every business situation is unique. Please consult with your CPA to determine the best course of action for your specific circumstances.

Beancount's Technical Edge vs. Ledger, hledger, and GnuCash

· 6 min read
Mike Thrift
Mike Thrift
Marketing Manager

Choosing a personal accounting system involves trade-offs between performance, data architecture, and extensibility. For engineers and other technical users, the choice often comes down to which system provides the most robust, predictable, and programmable foundation.

Drawing from a detailed comparative report, let's analyze the technical specifics of Beancount versus its popular open-source counterparts: Ledger-CLI, hledger, and GnuCash.

2025-07-22-beancounts-technical-edge-a-deep-dive-on-performance-python-api-and-data-integrity-vs-ledger-hledger-and-gnucash


Speed and Performance: Quantitative Benchmarks 🚀

For any serious dataset, performance is non-negotiable. Beancount is architected to handle decades of transactional data without compromising on speed. Despite being implemented in Python (v2), its highly optimized parser is remarkably efficient.

  • Beancount: Real-world usage shows it can load and process ledgers with hundreds of thousands of transactions in approximately 2 seconds. Memory usage is modest; parsing ~100k transactions converts the source text into in-memory objects using only tens of megabytes of RAM.
  • The 1M Transaction Stress Test: A benchmark using a synthetic ledger of 1 million transactions, 1,000 accounts, and 1 million price entries revealed significant architectural differences:
    • hledger (Haskell): Successfully completed a full parse and report in ~80.2 seconds, processing ~12,465 txns/sec while using ~2.58 GB of RAM.
    • Ledger-CLI (C++): The process was terminated after 40 minutes without completion, likely due to a known regression causing excessive memory and CPU usage with highly complex ledgers.
    • Beancount: While not included in that specific 1M test, its performance curve suggests it would handle the task efficiently. Furthermore, the upcoming Beancount v3, with its new C++ core and Python API, is expected to deliver another order-of-magnitude improvement in throughput.
  • GnuCash (C/Scheme): As a GUI application loading its entire dataset into memory, performance degrades noticeably with size. A ~50 MB XML file (representing 100k+ transactions) took 77 seconds to open. Switching to the SQLite backend only marginally improved this to ~55 seconds.

Conclusion: Beancount provides exceptional performance that scales predictably, a crucial feature for long-term data management. It avoids the performance cliffs seen in Ledger and the UI-bound latency of GnuCash.


Data Architecture: Plain Text vs. Opaque Databases 📄

The way a system stores your data dictates its transparency, portability, and durability. Beancount uses a clean, human-readable plain text format that is superior for technical users.

  • Compact & Efficient: A 100,000-transaction Beancount file is only ~8.8 MB. This is more compact than the equivalent Ledger file (~10 MB) partly because Beancount's syntax allows for the inference of the final balancing amount in a transaction, reducing redundancy.
  • Structurally Enforced: Beancount mandates explicit YYYY-MM-DD\ open\ Account directives. This disciplined approach prevents account name typos from silently creating new, incorrect accounts—a common pitfall in systems like Ledger and hledger which create accounts on-the-fly. This structure makes the data more reliable for programmatic manipulation.
  • Version Control Ready: A plain text ledger is perfectly suited for version control with Git. You get a complete, auditable history of every financial change you make.
  • Contrast with GnuCash: GnuCash defaults to a gzip-compressed XML file, where data is verbose and wrapped in tags with GUIDs for every entity. While it offers SQLite, MySQL, and PostgreSQL backends, this abstracts the data away from simple, direct text manipulation and versioning. Editing the raw XML is possible but far more cumbersome than editing a Beancount file.

Conclusion: Beancount's data format is not just text; it's a well-defined language that maximizes clarity, enforces correctness, and integrates seamlessly with developer tools like git and grep.


The Killer Feature: A True Python API and Plugin Architecture 🐍

This is Beancount's defining technical advantage. It is not a monolithic application but a library with a stable, first-class Python API. This design decision unlocks limitless automation and integration possibilities.

  • Direct Programmatic Access: You can read, query, and manipulate your ledger data directly in Python. This is why developers migrate. As one user noted, the frustration of trying to script against Ledger's poorly documented internal bindings evaporates with Beancount.
  • Plugin Pipeline: Beancount's loader allows you to insert custom Python functions directly into the processing pipeline. This enables arbitrary transformations and validations on the data stream as it's being loaded—for instance, writing a plugin to enforce that every expense from a specific vendor must have a certain tag.
  • Powerful Importer Framework: Move beyond clunky CSV import wizards. With Beancount, you write Python scripts to parse financial statements from any source (OFX, QFX, CSV). Community tools like smart_importer even leverage machine learning models to automatically predict and assign posting accounts, turning hours of manual categorization into a seconds-long, one-command process.
  • How Others Compare:
    • Ledger/hledger: Extensibility is primarily external. You pipe data to/from the executable. While they can output JSON/CSV, you cannot inject logic into their core processing loop without modifying the C++/Haskell source.
    • GnuCash: Extensibility is handled via a steep learning curve with Guile (Scheme) for custom reports or via Python bindings (using SWIG and libraries like PieCash) that interact with the GnuCash engine. It's powerful but less direct and "Pythonic" than Beancount's native library approach.

Conclusion: Beancount is architected for the programmer. Its library-first design and deep integration with Python make it the most flexible and automatable system of the four.


Philosophy: A Strict Compiler for Your Finances 🤓

Beancount's learning curve is a direct result of its core philosophy: your financial data is a formal language, and it must be correct.

Beancount's parser functions like a strict compiler. It performs robust syntactical and logical validation. If a transaction doesn't balance or an account hasn't been opened, it will refuse to process the file and will return a descriptive error with a line number. This is a feature, not a bug. It guarantees that if your file "compiles," the underlying data is structurally sound.

This deterministic approach ensures a level of data integrity that is invaluable for building reliable automated systems on top of it. You can write scripts that consume Beancount's output with confidence, knowing the data has already been rigorously validated.

Who is Beancount For?

Based on this technical analysis, Beancount is the optimal choice for:

  • Developers and Engineers who want to treat their finances as a version-controlled, programmable dataset.
  • Data Tinkers who want to write custom queries, build unique visualizations with tools like Fava, or feed their financial data into other analytical models.
  • Anyone who values demonstrable correctness and automation over the convenience of a GUI or the leniency of a less-structured format.

If you desire raw C++ performance for standard reports, Ledger is a contender. For exceptional scalability in a functional programming paradigm, hledger is impressive. For a feature-packed GUI with minimal setup, GnuCash excels.

But if you want to build a truly robust, automated, and deeply customized financial management system, Beancount provides the superior technical foundation.

How Much to Set Aside for Small Business Taxes

· 6 min read
Mengjia Kong
Mengjia Kong
IRS Enrolled Agent

Running a small business is already a constant juggle of cash flow, suppliers, and customers—tax surprises shouldn’t be another bowling pin in the air. The good news: with a simple framework and a few Beancount tricks, you can translate “I hope the tax bill isn’t huge” into a predictable monthly transfer.

1. Know What You’re Really Paying For

2025-07-20-how-much-to-set-aside-for-small-business-taxes

Before you can set money aside, you need to know where it’s going. For most U.S. small businesses (especially sole proprietorships and partnerships), the total tax liability is a combination of several distinct obligations.

  • Federal Income Tax: This is a progressive tax, meaning the rate increases as your income does. For 2025, brackets go up to 37% for single incomes above $626,350 and married-filing-jointly (MFJ) incomes above $751,600.
  • Self-Employment (SE) Tax: This is the entrepreneur's version of FICA taxes (Social Security and Medicare) that W-2 employees pay. It’s a flat 15.3% on your first chunk of net earnings. The 12.4% Social Security portion stops once your profit hits the annual wage base, which is projected to be $176,100 in 2025. The remaining 2.9% for Medicare continues on all profits.
  • State & Local Income Tax: This varies wildly by location, ranging from 0% in states like Wyoming and Texas to over 13% in California's top bracket.
  • Quarterly Underpayment Penalties: The IRS wants its money throughout the year, not all at once. To avoid penalties, you generally must pre-pay at least 90% of your current year's tax liability or 100% of your previous year's tax bill (this threshold rises to 110% if your adjusted gross income, or AGI, is over $150,000).

Quick heuristic: Most U.S. solopreneurs who live in an average-tax state end up owing 25% - 30% of net profit once federal, SE, and state taxes are combined.

2. A Three-Step Estimate You Can Update Monthly

You don’t need complex software to get a handle on this. A simple, repeatable process is all it takes.

  1. Project Annual Profit: Look at your year-to-date performance and make a reasonable forecast for the full year. The basic formula is your friend: Projected Revenue - Projected Deductible Expenses = Projected Profit.
  2. Apply an Effective Tax Rate: Start with a reasonable percentage. If you have last year’s tax return, you can calculate your effective rate from that. If you're new to this, the 30% heuristic is a safe starting point.
  3. Divide by 12 (or 52): Take your total estimated annual tax and divide it by the number of pay periods you want to use. We recommend monthly. Move that amount into a dedicated tax-reserve bank account every month. If your cash flow is more volatile, a weekly transfer might feel more manageable.

3. Implement It in Beancount

Plain-text accounting makes this process transparent and auditable. Here’s how to manage your tax savings in Beancount.

First, create a routine transaction to move your monthly savings from your primary checking account to a separate, dedicated savings account for taxes.

; Reserve July's taxes
2025-07-31 * "Tax reserve transfer"
Assets:Bank:Checking -3000 USD
Assets:Bank:TaxReserve 3000 USD
Equity:Opening-Balances

When you make a quarterly estimated payment to the government, you record the actual liability. The payment comes directly from your reserve account.

; Record liability when you file the quarterly payment
2025-09-15 * "Q3 estimated tax payment"
Assets:Bank:TaxReserve -9000 USD
Liabilities:Taxes:Federal 6000 USD
Liabilities:Taxes:State 3000 USD

This simple system buys you three powerful advantages:

  • Immediate Visibility: Your Assets:Bank:TaxReserve balance always shows what’s already “spoken for.” You know at a glance that this cash isn't available for other business expenses.
  • Accurate Profit: Because the reserve is treated as a transfer between asset accounts, your Profit & Loss statement isn’t distorted. You only record the tax liability when you actually file and pay it.
  • Audit Trail: Every payment to the IRS or your state treasury ties back to a clearly tagged movement from your reserve account, creating a clean paper trail.

4. Fine-Tuning Your Percentage

The initial 25% - 30% estimate is a great start, but you should adjust it based on your specific business model.

  • High-Margin Consultants / Agencies: If you clear well above the Social Security wage base ($176,100), your effective tax rate will climb. A rate of 30% - 35% is likely more accurate.
  • Product Businesses with Heavy Deductions: If you have significant costs of goods sold (COGS), inventory, or other deductions, your net profit margin is lower. A rate of 20% - 25% may suffice. Use Form 1040-ES worksheets each quarter to confirm.
  • S-Corp Owners: Your situation is different. The "reasonable salary" you pay yourself is subject to standard payroll withholding (FICA and income taxes). Your distributions (profits paid out beyond salary) still require quarterly estimated payments, but often at a lower marginal rate since they aren't subject to SE tax.
  • Multi-State Sellers: If you have "nexus" (a significant business presence) in multiple states, you may owe income tax in each. This can stack your liabilities. For clarity, create separate liability accounts in Beancount, such as Liabilities:Taxes:State:CA and Liabilities:Taxes:State:NY.

5. Automate, Review, Repeat

A system only works if you use it. Make it effortless.

  • Automate: Link your main operating account to a high-yield savings account named something like "TaxReserve." Schedule an automatic transfer to occur right after you close your books each month.
  • Review: Re-forecast your annual profit quarterly. If Q2 sales blew past expectations, increase your monthly reserve amount immediately. Don't wait until January to discover you've under-saved.
  • Repeat: Keep key documents organized within your Beancount directory. Saving last year’s final tax return (document: "2024/Taxes/Form1040.pdf") gives you one-click context when discussing numbers with your CPA or planning for the next year.

Closing Thoughts

Tax bills feel random only when the set-aside process is. By baking a percentage-based reserve directly into your double-entry accounting flow, you trade anxiety for algebra—and Beancount makes the math (and the audit trail) trivial. Review your rate each quarter, keep Assets:Bank:TaxReserve funded, and April 15th turns back into just another day of business as usual.


Disclaimer: This article is for educational purposes only and isn’t tax advice. Always confirm numbers with a qualified professional for your jurisdiction and entity type.

Thriving in a Slow-Growth Economy — with Beancount

· 6 min read
Mike Thrift
Mike Thrift
Marketing Manager

The economic tea leaves are in, and they're not exactly screaming "boom." As of July 2025, the latest figures paint a picture of an economy that has decidedly cooled its jets. Let's look at the data.

The Macro Backdrop (July 2025)

2025-07-05-thriving-in-a-slow-growth-economy-with-beancount

  • Inflation: After years of volatility, U.S. consumer prices have settled but remain a factor, running at +2.7% year-over-year as of June 2025 (Bureau of Labor Statistics, Trading Economics). While down from post-pandemic highs, this rate still erodes purchasing power and puts pressure on margins.
  • Growth: The long expansion has officially ended. Real GDP slipped by an annualized rate of -0.3% to -0.5% in the first quarter of 2025, signaling a contraction (Bureau of Economic Analysis, Trading Economics).

A tepid economy isn't a crisis—it's a clarion call. It demands sharper visibility into your cash flow, a ruthless approach to costs, and a clear-eyed view of opportunities. This is where plain-text accounting, specifically with Beancount, becomes a strategic advantage. It gives you complete control over your financial data, without the SaaS lock-in or ever-rising subscription fees of commercial software.


Five High-Leverage Levers (and How Beancount Makes Them Easy)

In a slow-growth environment, small, intelligent actions have an outsized impact. Here are five strategies you can implement immediately with a Beancount ledger.

StrategyHow to Execute in Beancount
Keep books currentAutomate ingestion. Run bean-extract nightly, or schedule a GitHub Action that fetches bank feeds and commits new transactions to your ledger. Real-time data means no surprises.
Monitor cash flowQuery weekly. Track your net monthly flow with a simple query. Save it as a favorite in Fava, Beancount's web interface, for one-click access: SELECT year, month, SUM(convert(position, 'USD')) WHERE account ~ 'Income:Expenses' GROUP BY year, month
Diversify revenueIsolate experiments. Test a new product or service by creating a dedicated income account, like Income:Consulting:SideHustle, and tagging all related transactions with #pilot-project. This makes calculating ROI trivial.
Trim fat fastSurface big spenders. Need to make cuts? This query instantly shows your top 10 expense categories, pointing you directly to where you can save the most: bean-query main.bean "SELECT account, SUM(number) WHERE account =~ '^Expenses' GROUP BY account ORDER BY SUM DESC LIMIT 10"
Re-invest intelligentlyRing-fence profits. At the end of each month, calculate your net profit and programmatically sweep a portion to a dedicated account. This isn't just saving; it's explicitly allocating capital for future growth or opportunities.

Automate the Busywork, Guard Your Time

Your most valuable asset is your time, which should be spent on analysis, not data entry. Beancount’s plain-text nature makes automation a first-class citizen.

  • Helper Scripts: The Beancount ecosystem is rich with community-built tools. Price fetchers can pull daily market values for your investments. Importers for services like PayPal, Stripe, or Splitwise can parse statements and append formatted entries to your ledger while you sleep.
  • Pre-commit Hooks: If you store your ledger in Git (and you should), you can use a pre-commit hook to run bean-check on every change. This simple script lints your file, catching typos and balancing errors before they ever get committed to your main branch.
  • Git = Audit Trail: Every commit is a story. git blame shows you who changed a transaction and when. git log provides a complete, immutable history of your financial decisions. It's the most robust audit trail imaginable.

Build Financial Resilience

A slow economy rewards the prepared. Use Beancount to build a financial fortress that can withstand uncertainty.

  • Emergency Buffer: Make saving non-negotiable. After calculating your monthly profit, create a standing transaction to move a fixed percentage (e.g., 10%) to a dedicated emergency fund.

    ; Assuming July profit was $4,500. 10% = $450.
    2025-07-31 * "Monthly Profit Sweep" "Move 10% of profit to emergency fund"
    Expenses:ProfitSweep 450.00 USD
    Assets:Savings:Emergency

    This isn't an expense in the traditional sense, but booking it this way "hides" the cash from your operating accounts, making it less tempting to spend.

  • Scenario Modeling: What happens if revenue drops 15%? Or if your costs increase by 5%? With a plain-text ledger, you don't need complex software to find out. Just copy your entire ledger file to a scenarios/ directory, tweak the numbers, and run a report.

    # See the impact on your bottom line in seconds
    bean-report scenarios/pessimistic_q3.bean income_statement

Double-Click on Niche Data

Beancount's flexibility allows you to track anything. Use metadata to enrich your transactions with business context.

2025-07-15 * "The Meow-Box" "Monthly Cat-Toy Subscription"
Income:Subscriptions -19.99 USD
Assets:Bank:Checking
; market: "Pet-DTC"
; customer-id: "CUST-86753"

With this data embedded directly in your ledger, you can ask sophisticated questions. A simple bean-query can now reveal the total revenue, churn, or lifetime value for your "Pet-DTC" market segment:

bean-query my-ledger.beancount "SELECT SUM(convert(position, 'USD')) WHERE meta('market') = 'Pet-DTC'"

Your Next Steps

Reading about it is one thing; doing it is another. Here’s how to get started this week:

  1. Import Your 2024 Backlog: Get your historical data from 2024 into Beancount. This will make your 2025 reports and year-over-year comparisons truly apples-to-apples.
  2. Schedule Two Standing Queries: Save the cash-flow and top-10-expenses queries. Set a calendar reminder to run and review them every Friday. Make it a ritual.
  3. Allocate 10% of Profit: Implement the profit sweep. Start with 10% and commit to moving that capital to a separate reinvestment or emergency account each month. Revisit the ratio quarterly.

Slow growth rewards those who see their numbers clearly, act decisively, and build robust systems. With a text ledger, a handful of scripts, and the playbook above, you’ll do more than just survive the downturn—you’ll use it as an opportunity to compound your financial strength.

Bookkeeping vs. Accounting: What’s the Difference, and Where Does Beancount Fit?

· 3 min read
Mike Thrift
Mike Thrift
Marketing Manager

When you're running a business or managing your personal finances, the terms bookkeeping and accounting often blur together. But understanding their differences—especially when using a plain-text tool like Beancount—can help you build better systems and make smarter financial decisions.

In this guide, we’ll explore the roles of bookkeeping and accounting, and how Beancount supports both (yes, really).

2025-06-27-accounting-vs-bookkeeping

📘 Bookkeeping: The Art of Daily Tracking

Bookkeeping is the foundational layer of financial management. It’s about recording what actually happened—no assumptions, no forecasts.

Bookkeeping includes:

  • Recording income and expenses
  • Keeping track of assets and liabilities
  • Tagging transactions for later use
  • Maintaining a general ledger

In Beancount, this looks like:

2025-06-27 * "Stripe Payout"
Assets:Bank:Checking 1,200.00 USD
Income:Sales

Each transaction is a building block. You’re not analyzing yet—you’re simply recording the truth, one line at a time.

If you're just starting out, Beancount encourages good bookkeeping habits through its explicit structure and readable syntax. You’ll be forced (in a good way!) to track every cent and explain every transaction.

📊 Accounting: Turning Data Into Insight

Accounting builds on your bookkeeping records to answer deeper questions:

  • Are we profitable?
  • How much cash runway do we have?
  • Should we prepay for that software or expense it monthly?
  • How do we minimize taxes?

In accounting, you:

  • Reconcile accounts and adjust entries
  • Generate reports like profit/loss statements
  • Depreciate assets
  • Plan for taxes and future expenses

With Beancount, you can analyze your records using tools like beancount.io:

  • Navigate balance sheets, income statements, and cash flow charts
  • Visualize income by category
  • Annotate decisions using metadata (e.g., tag:business-trip)

Want to track that annual Zoom subscription?

2025-01-15 * "Zoom Annual Plan"
Expenses:Software 149.90 USD
Assets:Bank:Checking
tag:business-tools

You can later amortize it monthly or analyze it during budgeting sessions.

👩‍💼 Bookkeeper vs. Accountant: Who Does What?

  • Bookkeeper: Focuses on precision. Records, categorizes, and organizes.
  • Accountant: Adds interpretation. Advises, plans, and models outcomes.

Beancount empowers you to be both, or to cleanly hand off one layer to a professional.

For example:

  • As a founder, you may do your own bookkeeping with Beancount.
  • At tax season, you export reports or raw data for your accountant to finalize.

🛠️ Bookkeeping and Accounting Software: Where Does Beancount Belong?

Most mainstream tools (e.g., QuickBooks, Xero) blur the line between bookkeeping and accounting. Beancount takes a different approach:

  • You manage everything through plain text, stored in version control if you like.
  • There's no hiding of transactions or behind-the-scenes magic.
  • You're encouraged to understand your own books.

Beancount is ideal for those who value transparency, data integrity, and automation through open-source tools.

🧠 Why This Distinction Matters

Knowing the difference between bookkeeping and accounting helps you:

  • Stay compliant and audit-ready
  • Understand where to invest time (daily tracking vs. monthly insights)
  • Communicate clearly with financial professionals
  • Scale your financial systems without drowning in complexity

🪄 Final Thought: Your Ledger, Your Rules

Whether you're a solo creator or a small business owner, Beancount gives you the power to manage your books with precision—and eventually make strategic decisions like a CFO.

Remember:

  • Bookkeeping = what happened
  • Accounting = what it means

With Beancount, you’re building both layers with clarity and confidence.

Let me know if you'd like a printable version or a tutorial follow-up.

Beancount Journal Entries: How-To, Definitions, and Examples

· 4 min read
Mike Thrift
Mike Thrift
Marketing Manager

Every financial transaction your business makes needs to be recorded—and in the world of plain-text accounting, this starts with journal entries. If you're using Beancount, understanding journal entries is key to building accurate, auditable, and clean financial records.

This guide will walk you through:

2025-06-27-journal-entries

  • What a journal entry is
  • Why journal entries matter
  • How to write them in Beancount syntax
  • How to use them effectively
  • Examples of real-world transactions (client payments, purchases, loans, etc.)

🧾 What is a Journal Entry in Beancount?

In Beancount, a journal entry is a dated transaction written in a human-readable plain-text format. Each entry follows the principles of double-entry accounting—you record where money comes from (credit) and where it goes (debit), ensuring your books always balance.

Example:

2024-06-01 * "Client payment for invoice #123"
Assets:Bank:Checking 600.00 USD
Income:Sales
  • The * indicates a cleared transaction.
  • The description shows context for the entry.
  • Assets:Bank:Checking is debited.
  • Income:Sales is credited (value implied).

Every entry lives inside a .beancount file—just a text file you can version, back up, and even edit in Vim or VSCode.

📒 Why Journal Entries Matter

Journal entries are the atomic unit of your ledger.

They:

  • Feed into your General Ledger and Account Balances
  • Drive all reports: Income Statements, Balance Sheets, Cash Flows
  • Let you trace every dollar, line by line, to its source

With the right tools, you'll see these transactions rendered in a UI—categorized, searchable, and filterable. But it all starts with that simple plain-text entry.

📚 How Double-Entry Works in Beancount

Beancount enforces double-entry accounting. Every transaction must be balanced: total debits = total credits.

Quick rule:

  • Debit assets and expenses (you gain cash or incur a cost)
  • Credit income and liabilities (you earn money or take on debt)

Example – Office Supplies Purchase:

2024-06-02 * "Bought printer ink"
Expenses:OfficeSupplies 100.00 USD
Assets:Bank:Checking

🧠 Visualizing Entries

Once you save, on the left side navigation of https://beancount.io/ledger/0/income_statement/ you will see ...

  • Journal View: See transactions with search, tags, and filtering
  • Account Filter Dropdown: See running balances and per-account entries
  • Income Statement: Sum of your Income:* and Expenses:* accounts
  • Balance Sheet: Your assets minus liabilities

Fava helps turn your raw Beancount entries into actionable reports—with zero database setup.

💡 Common Journal Entry Examples

✅ You get paid by a client

2024-06-05 * "Payment for invoice #456"
Assets:Bank:Checking 1,200.00 USD
Income:Consulting

Optional: If you use Accounts Receivable:

2024-05-20 * "Invoice #456 sent"
Assets:AccountsReceivable 1,200.00 USD
Income:Consulting

2024-06-05 * "Payment for invoice #456"
Assets:Bank:Checking 1,200.00 USD
Assets:AccountsReceivable -1,200.00 USD

🖨️ You buy office supplies

2024-06-07 * "Staples run"
Expenses:OfficeSupplies 85.00 USD
Assets:Bank:Checking

🏦 You make a loan payment

Let’s say you pay $1,000, with $200 in interest and $800 toward principal:

2024-06-10 * "Loan repayment"
Liabilities:Loan -800.00 USD
Expenses:LoanInterest 200.00 USD
Assets:Bank:Checking -1,000.00 USD

🔒 Closing Entries at Year-End

To “close the books,” you typically transfer all Income and Expenses accounts into Equity.

2024-12-31 close Income:*
2024-12-31 close Expenses:*

Or, manually:

2024-12-31 * "Close books"
Equity:RetainedEarnings 45,000.00 USD
Income:Consulting -45,000.00 USD

🛠️ Adjusting Entries

If you're doing accrual accounting, you’ll want to add adjusting entries—for prepaid expenses, accrued revenue, etc.

Example: $100 monthly software subscription paid annually

2024-01-01 * "Annual software payment"
Assets:Prepaid 1,200.00 USD
Assets:Bank:Checking -1,200.00 USD

2024-01-31 * "Monthly amortization"
Expenses:Software 100.00 USD
Assets:Prepaid -100.00 USD

Automate with scripts or available Beancount tools.

🧰 Beancount: Lightweight, Auditable, Powerful

Beancount isn't just an accounting tool—it's an idea: transparent, plaintext financial truth. It's a modern ledgering system that's:

  • Easy to version-control (Git!)
  • Fully portable (no proprietary database)
  • Great for devs, freelancers, and small businesses

Ready to Start?

Start your Beancount file with:

option "title" "My Business Ledger"
option "operating_currency" "USD"

2024-01-01 open Assets:Bank:Checking USD
2024-01-01 open Income:Sales USD
2024-01-01 open Expenses:OfficeSupplies USD
2024-01-01 open Equity:OpeningBalances USD

2024-01-01 * "Initial balance"
Assets:Bank:Checking 10,000.00 USD
Equity:OpeningBalances

Then load your file with your preferred visualization tool to see the magic.

Want an easier start? Try templates, importers, or community tools like bean-extract.

With Beancount, your books are finally your own—simple, scriptable, and audit-proof.

Let me know if you’d like a downloadable PDF version or small business–specific variations of the examples.

Beancount for Small Business Owners

· 4 min read
Mike Thrift
Mike Thrift
Marketing Manager

Bookkeeping Basics You Can Actually Understand—and Own

Managing your own books doesn’t have to mean spreadsheets, stress, or expensive software. Beancount gives you a minimalist, auditable, and powerful way to do bookkeeping using just plain text and a double-entry accounting system.

2025-06-25-beancount-for-small-businesses

This guide is your complete introduction to getting your small business books in order with Beancount—with real examples and step-by-step direction.

🧾 What Is Beancount?

Beancount is an open-source plain-text accounting system built around double-entry bookkeeping. You write your transactions in .beancount files and use tools like bean-doctor, bean-report, or Fava to analyze and visualize your books.

Here’s a basic transaction:

2025-06-01 * "Client Payment: Invoice #123"
Assets:Bank:Business:Checking 1,200.00 USD
Income:Consulting -1,200.00 USD

It's readable, scriptable, and version-controllable—perfect for business owners who want transparency and control.

📌 Why Bookkeeping Matters (and Why Beancount)

  • You need it for taxes
  • You need it for clarity
  • You need it for funding
  • You need it to catch mistakes early

And with Beancount, you can do all of this with just a text editor and a few tools.

🪜 8 Steps to Start Doing Your Own Bookkeeping with Beancount

1. Separate Business & Personal Finances

Open a separate business checking account and credit card. Reflect that in Beancount:

2025-06-01 open Assets:Bank:Business:Checking USD
2025-06-01 open Liabilities:CreditCard:Business USD

This keeps your books clean and protects you legally (especially if you're an LLC or corporation).

2. Use Double-Entry Bookkeeping

Every financial event affects two accounts. Beancount forces this balance by design:

2025-06-05 * "Web hosting payment"
Expenses:Hosting 15.00 USD
Assets:Bank:Business:Checking -15.00 USD

This guarantees mathematical integrity across your ledger.

3. Choose Cash or Accrual Basis

  • Cash Basis: Only record income/expenses when money is received/spent.
  • Accrual Basis: Track obligations (Accounts Payable/Receivable).

Cash basis example:

2025-06-10 * "Client payment received"
Assets:Bank:Business:Checking 800.00 USD
Income:Sales -800.00 USD

Accrual basis example (invoice sent, then payment received):

2025-06-01 * "Invoice #2001 issued"
Assets:AccountsReceivable 800.00 USD
Income:Sales -800.00 USD

2025-06-15 * "Payment received for Invoice #2001"
Assets:Bank:Business:Checking 800.00 USD
Assets:AccountsReceivable -800.00 USD

4. Set Up Your Chart of Accounts

Define your categories clearly. A minimalist example:

2025-01-01 open Income:Sales USD
2025-01-01 open Expenses:Software USD
2025-01-01 open Expenses:Meals USD
2025-01-01 open Equity:Owner USD

Tailor these to your business. Keep it consistent and descriptive.

5. Categorize Transactions (with Metadata)

Use metadata to track context. This helps with deductions, audits, and clarity.

2025-06-18 * "Team lunch after Q2 milestone"
Expenses:Meals 90.00 USD
Assets:Bank:Business:Checking -90.00 USD
; business_purpose: Q2 celebration
; attendees: Alice, Bob, Tian

Add tags or links to receipts:

  ; receipt: ./receipts/2025-06-18-lunch.jpg

6. Store Supporting Documents

Use Dropbox, Google Drive, or a receipts/ folder. Then link them in Beancount like:

2025-06-02 * "Domain Renewal - GoDaddy"
Expenses:Hosting 20.00 USD
Assets:Bank:Business:Checking -20.00 USD
; receipt: ./receipts/domain-godaddy.pdf

Auditors and tax professionals will love you.

7. Organize for Deductions

Mark deductible expenses clearly:

2025-06-03 * "Adobe Creative Cloud Subscription"
Expenses:Software 60.00 USD
Assets:Bank:Business:Checking -60.00 USD
; deductible: true
; usage: 100% business

Use custom metadata or tags like #deductible to track potential write-offs.

8. Make It a Habit

Create a workflow. Example:

# Weekly bookkeeping routine
git pull origin main
bean-extract transactions.csv >> ledger.beancount
bean-doctor ledger.beancount
bean-check ledger.beancount
fava ledger.beancount

Or just commit to a "Beancount Friday" and reconcile everything weekly.

💼 DIY or Hire Help?

You can do it all yourself with Beancount. But even power users should:

  • Consult a CPA during setup
  • Hire an accountant at tax time if needed
  • Use Fava for monthly reports

You get all the power of an accounting system without vendor lock-in or subscription fees.

  • Fava – beautiful web dashboard for Beancount files
  • bean-doctor – health checks for your ledger
  • bean-query – run SQL-like reports
  • beancount-import / beanie – automated bank import
  • Version control – use Git to track changes to your books

✅ Final Example: Complete Transaction Flow

2025-06-20 * "Consulting payment from Acme Inc."
Assets:Bank:Business:Checking 3,000.00 USD
Income:Consulting -3,000.00 USD
; invoice: 2025-06-acme
; project: "Backend API redesign"

2025-06-21 * "Notion Pro Plan"
Expenses:Software 10.00 USD
Assets:Bank:Business:Checking -10.00 USD
; purpose: project documentation
; receipt: ./receipts/notion-june.pdf

🎯 Summary

Beancount is perfect for small business owners who want to:

  • Keep costs low
  • Stay fully in control of their finances
  • Avoid the bloat of legacy software
  • Embrace transparency and plain-text simplicity

Would you like a downloadable .bean starter template for your business? Let me know your business type, and I’ll build one tailored for you.

The Green Ledger: Tracking ESG with Beancount

· 6 min read
Mike Thrift
Mike Thrift
Marketing Manager

In today's world, Environmental, Social, and Governance (ESG) metrics are no longer just buzzwords; they're essential indicators of a company's health and future viability. But how do you integrate these crucial sustainability insights with traditional financial accounting? Enter Beancount, an open-source, plain-text double-entry ledger that offers a surprisingly powerful and flexible solution for bridging this gap.

Imagine transforming your fragmented sustainability reporting into a streamlined, automated system that tracks everything from carbon emissions to supplier diversity, all within your existing financial workflow. Beancount makes this possible by treating ESG data as "first-class citizens alongside financial transactions."

2025-06-22-esg-tracking

Modeling ESG Data: The Beancount Way

Beancount's inherent flexibility is its superpower when it comes to ESG. Instead of siloed spreadsheets, you can embed sustainability metrics directly into your financial structure using a few key techniques:

  • Dedicated Accounts and Commodities: Think of your environmental footprint like another currency. You can create accounts like Metrics:Emissions:CO2e to track carbon emissions. These emissions can even be treated as a commodity (e.g., a unit of CO2 equivalent, tCO2e), allowing you to record specific quantities in your transactions. For instance, a flight purchase could credit an Emissions:CO2e account with +0.3 tCO2e alongside the monetary cost.
  • Custom Metadata Tags: Beancount's key-value metadata is perfect for adding context. You can tag a transaction with CO2e: 0.3 t or Scope: 3 to denote its carbon impact or GHG Protocol scope. This links financial outlays directly to their environmental consequences, providing a richer, more complete picture.
  • Structured Tags for Categories: Aligning with standards like the Greenhouse Gas Protocol (GHGP) is crucial. You can use consistent tags or account naming conventions, such as Metrics:Emissions:Scope1, Metrics:Emissions:Scope2, and Metrics:Emissions:Scope3 to easily categorize and report on direct, energy-related, and value chain emissions.

This adaptable approach means that as ESG standards evolve, you can adjust your ledger structure without a complete overhaul.


Beancount vs. Specialized ESG Tools: A Strategic Choice

While dedicated ESG platforms like Persefoni or SAP Green Ledger offer highly automated, purpose-built solutions, Beancount presents a compelling alternative, particularly for those seeking transparency and control.

FeatureBeancount (Plain-Text)Specialized SaaS (e.g., Persefoni, Plan A)Enterprise ERP Integration (e.g., SAP Green Ledger)
Data ModelingUser-defined accounts & metadata; flexible but requires manual structuring.Pre-defined schemas; guided input for activities and automated conversion to emissions.Emissions mapped directly to ERP transactions and master data.
Emission FactorsUser-supplied or integrated via custom scripts; requires manual updates.Built-in, regularly updated emission factor libraries; automatic calculations.Integrated with corporate data and standard factors for audit-grade accuracy.
Data IntegrationOpen architecture via custom Python scripts/APIs; requires development for automated imports.Many pre-built connectors to external data sources (utilities, ERPs, travel systems).Native integration with core business processes and data flows within the ERP.
Reporting & AuditCustom queries and Fava reports; highly customizable but requires user design. Version control (Git) for transparent audit trail.Rich dashboards, pre-built reports for standards (GHG, TCFD, CDP). In-platform audit logs and period locking.Integrated reporting within ERP; designed for "reasonable assurance" auditable data.
Cost & AccessibilityFree and open-source; requires Beancount/scripting knowledge.Commercial SaaS with subscription costs; less technical overhead.Enterprise software with potentially high licensing and implementation costs; requires specific ERP expertise.

Beancount is a DIY powerhouse: It gives you unparalleled flexibility and transparency, making it ideal for individuals or technically savvy small organizations. You own your data completely, avoiding vendor lock-in.

Specialized tools offer turnkey solutions: They excel at automated data collection, built-in emission factor databases, and ready-made compliance reports, often at a higher cost and with less flexibility.

A hybrid approach is also viable: use Beancount for detailed internal tracking and reconciliation, then export summary data to an external platform for high-level stakeholder reporting.


Real-World Applications: ESG in Action with Beancount

Beancount’s versatility makes it suitable for several key ESG use cases:

  • Tracking Scope 3 Emissions: The most challenging emissions to track (from your value chain) can be integrated by linking supplier emissions data to purchase transactions. Beancount provides a clear audit trail for these complex figures, enabling better analysis and pinpointing data sources.
  • Sustainability Audits and Assurance: Like financial data, ESG figures need to be verifiable. Beancount allows you to link each ESG entry to source documents (e.g., utility bills, third-party verification statements), providing a meticulous audit trail for transparency and assurance.
  • EU CSRD/ESRS Compliance Reporting: For companies facing stringent regulations like CSRD, Beancount can serve as a central repository for quantitative disclosures. While it won't automatically format reports into XBRL, it provides the granular, auditable data needed to generate compliance-ready figures.
  • Carbon Footprint Analysis & Management Accounting: Treat carbon as another dimension of management accounting. By allocating emissions to profit centers or product codes, you can calculate metrics like "emissions per dollar of revenue" and identify carbon hotspots, driving more informed sustainability decisions.

Best Practices for Your Beancount ESG Ledger

To maximize the effectiveness of Beancount for ESG, consider these best practices:

  1. Design a Clear Chart of Accounts for ESG: Structure your ESG accounts thoughtfully (e.g., Metrics:Emissions:Scope1:Fuel), just like your financial accounts.
  2. Use Metadata Consistently: Leverage tags (e.g., Scope: 3, FactorSource: EPA2024) for consistent context and easier querying.
  3. Balance Granularity with Manageability: Focus on material metrics to avoid overwhelming your ledger with unnecessary detail.
  4. Automate with Caution: Use Python scripts for data import and validation, but ensure robust error checking and clear documentation of your automation processes.
  5. Leverage Version Control: Use Git to track every change to your ledger, providing a transparent and auditable history of your ESG data.
  6. Connect to Documents and Evidence: Link source files (e.g., PDFs of utility bills) to ledger entries for easy verification during audits.
  7. Utilize Fava for Insights: Configure Fava to display custom ESG charts and reports, making your sustainability data actionable and accessible to non-technical stakeholders.
  8. Stay Updated on Standards: ESG reporting is dynamic; be prepared to adapt your Beancount structure as new regulations and frameworks emerge.

The Future is Green, and Plain-Text

While Beancount currently lacks native ESG intelligence or plug-and-play reporting, its open-source nature presents immense opportunities for enhancement. Community-driven plugins for carbon accounting, standardized ESG ledger templates, and better integration with emission factor APIs could significantly boost its capabilities.

As the corporate world increasingly embraces "green ledgers," Beancount stands ready as a flexible, transparent, and auditable solution. By integrating ESG data with the same rigor as financial data, Beancount empowers organizations to not only meet compliance demands but also drive meaningful sustainability initiatives.

Are you ready to bring your ESG data into the plain-text revolution?

The Complete Guide to Cryptocurrency Accounting with Beancount.io

· 11 min read
Mike Thrift
Mike Thrift
Marketing Manager

Are you drowning in crypto transactions across multiple exchanges, struggling with DeFi complexity, or panicking about tax season? You're not alone. The cryptocurrency landscape has exploded from simple Bitcoin purchases to a sophisticated ecosystem of DeFi protocols, staking rewards, yield farming, and cross-chain activities that challenge traditional accounting methods.

Here's the harsh reality: every crypto transaction is potentially taxable, and the IRS is watching. Whether you're a casual Bitcoin holder or a DeFi power user managing positions across dozens of protocols, maintaining accurate financial records isn't optional—it's essential for compliance and financial clarity.

The problem? Traditional accounting software has limited native support for crypto's complexity. While tools like QuickBooks can handle crypto with additional plugins, and Excel can import blockchain data with scripts, most solutions require significant customization for comprehensive crypto accounting.

The solution? Beancount.io's plain-text accounting system built on the powerful open-source Beancount language. Important note: Beancount is an open-source double-entry accounting language created by Martin Blais, while Beancount.io is a commercial hosting service that provides a user-friendly interface and cloud infrastructure for Beancount. This guide covers both the underlying Beancount principles and how to use them effectively through the Beancount.io platform.

Complete Guide to Cryptocurrency Accounting

The Cryptocurrency Accounting Nightmare (And Why It's Getting Worse)

Your Crypto Portfolio is Scattered Everywhere

Let's be honest about your setup. You probably have:

  • 3-5 different exchanges (Coinbase for easy buys, Binance for altcoins, Kraken for that one token...)
  • Multiple wallets (MetaMask for DeFi, Ledger for long-term holds, that old wallet you forgot about...)
  • DeFi positions across 10+ protocols (Uniswap, Compound, Aave, and whatever new yield farm caught your attention)
  • Staking rewards trickling in from various validators
  • Random airdrops appearing in your wallet like crypto Christmas presents

Each platform speaks a different language. Coinbase gives you a CSV that looks nothing like Binance's export. Uniswap doesn't even have exports. And don't get me started on tracking your DeFi positions across Layer 2 networks.

Transaction Types That Challenge Traditional Accounting

Your crypto activities include transaction types that traditional accounting systems weren't originally designed to handle:

  • Impermanent loss from liquidity providing (try explaining that to QuickBooks)
  • Flash loans that borrow and repay millions in a single transaction
  • Yield farming where you earn 5 different tokens for providing liquidity
  • Cross-chain bridges that make assets disappear on one network and appear on another
  • Staking derivatives like stETH that accrue value differently than the underlying asset
  • DAO governance tokens that you received for using protocols

The Tax Compliance Minefield

Here's what keeps crypto investors awake at night:

  • Every single trade is taxable (yes, even that ETH-to-USDC swap)
  • Cost basis tracking becomes impossible with hundreds of micro-transactions
  • Staking rewards are income the moment you receive them (at fair market value)
  • DeFi rewards are income even if you can't sell them yet
  • The IRS wants Form 8949 with every single transaction listed
  • Penalties are severe for getting it wrong

Traditional accounting software requires significant customization for this complexity. While solutions exist, they often require additional plugins, scripts, or manual processes to handle the full scope of cryptocurrency activities.

Enter Beancount.io: The Crypto Accounting Solution You've Been Waiting For

What if I told you there's an accounting system designed for exactly this chaos? Beancount.io isn't just another accounting tool—it's a plain-text accounting revolution that handles cryptocurrency complexity like it was born for it.

Why Beancount.io Dominates Crypto Accounting

🔍 Complete Transparency: Every calculation is visible. No black boxes, no "trust us" algorithms. You see exactly how your cost basis is calculated, how gains are computed, and where every satoshi went.

📊 Unlimited Flexibility: Create any account structure you need. Track DeFi positions, staking derivatives, cross-chain assets, or that weird token you got from a DAO vote. If you can imagine it, you can track it.

🎯 Precise Cost Basis: Lot-based tracking with specific identification. Choose exactly which Bitcoin you're selling for optimal tax outcomes. FIFO, LIFO, or cherry-pick your lots—your choice.

🔗 Future-Proof: Plain-text format means your data is yours forever. No vendor lock-in, no proprietary formats, no "sorry, we're shutting down" emails.

⚡ Scriptable Power: Automate imports, generate custom reports, and integrate with any tool. Because your crypto portfolio is unique, your accounting should be too.

Setting Up Your Crypto Command Center

Building Your Account Architecture

Think of this as designing the blueprint for your crypto empire. We're creating a structure that can handle everything from your first Bitcoin purchase to complex multi-protocol DeFi strategies:

Note: The examples use 1970-01-01 as a placeholder opening date. For actual use, replace with your real account opening dates, especially if using automated import tools that filter transactions by date.

; Exchange Accounts
1970-01-01 open Assets:Crypto:Coinbase:USD
1970-01-01 open Assets:Crypto:Coinbase:BTC
1970-01-01 open Assets:Crypto:Coinbase:ETH
1970-01-01 open Assets:Crypto:Binance:USD
1970-01-01 open Assets:Crypto:Binance:BTC
1970-01-01 open Assets:Crypto:Binance:ETH
1970-01-01 open Assets:Crypto:Binance:ADA

; Wallet Accounts
1970-01-01 open Assets:Crypto:Wallet:MetaMask:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:USDC
1970-01-01 open Assets:Crypto:Wallet:MetaMask:UNI
1970-01-01 open Assets:Crypto:Wallet:Ledger:BTC
1970-01-01 open Assets:Crypto:Wallet:Ledger:ETH

; DeFi Protocol Accounts
1970-01-01 open Assets:DeFi:Compound:cUSDC
1970-01-01 open Assets:DeFi:Uniswap:ETH-USDC-LP
1970-01-01 open Assets:Staking:Ethereum:ETH
1970-01-01 open Assets:Crypto:Mining:BTC

; Income Accounts
1970-01-01 open Income:Crypto:Staking:ETH
1970-01-01 open Income:Crypto:Mining:BTC
1970-01-01 open Income:Crypto:Airdrops
1970-01-01 open Income:Crypto:DeFi:Yield
1970-01-01 open Income:CapitalGains:Crypto
1970-01-01 open Income:Crypto:Trading:Margin

; Expense Accounts
1970-01-01 open Expenses:Crypto:Fees:Trading
1970-01-01 open Expenses:Crypto:Fees:Network
1970-01-01 open Expenses:Crypto:Fees:Withdrawal

; Additional accounts for advanced scenarios
1970-01-01 open Assets:Crypto:Binance:BTC-Margin
1970-01-01 open Liabilities:Crypto:Binance:Borrowed
1970-01-01 open Liabilities:Crypto:Binance:BTC
1970-01-01 open Assets:Checking
1970-01-01 open Expenses:Crypto:Mining:Electricity

Commodity Definitions

Define your cryptocurrencies as commodities with proper metadata:

1970-01-01 commodity BTC
name: "Bitcoin"
asset-class: "cryptocurrency"
price-source: "coinbase"

1970-01-01 commodity ETH
name: "Ethereum"
asset-class: "cryptocurrency"
price-source: "coinbase"

1970-01-01 commodity ADA
name: "Cardano"
asset-class: "cryptocurrency"
price-source: "binance"

1970-01-01 commodity USDC
name: "USD Coin"
asset-class: "stablecoin"
price-source: "coinbase"

1970-01-01 commodity UNI
name: "Uniswap"
asset-class: "cryptocurrency"
price-source: "coinbase"

1970-01-01 commodity UNI-V2-ETH-USDC
name: "Uniswap V2 ETH-USDC LP Token"
asset-class: "liquidity-pool"

Mastering Crypto Transactions: From Simple to Sophisticated

Ready to see Beancount.io in action? Let's walk through real-world scenarios that would break other accounting systems but are handled elegantly here.

1. Your First Bitcoin Purchase (The Gateway Drug)

Every crypto journey starts somewhere. Here's how to record that life-changing moment when you bought your first Bitcoin:

2024-01-15 * "Buy 0.5 BTC on Coinbase"
Assets:Crypto:Coinbase:BTC 0.5 BTC {30000.00 USD}
Assets:Crypto:Coinbase:USD -15025.00 USD
Expenses:Crypto:Fees:Trading 25.00 USD

2. Taking Profits (Or Cutting Losses) Like a Pro

The moment of truth: selling your crypto. This is where most accounting systems fall apart, but Beancount.io shines with precise cost basis tracking:

2024-03-20 * "Sell 0.3 BTC on Coinbase"
Assets:Crypto:Coinbase:BTC -0.3 BTC {30000.00 USD}
Assets:Crypto:Coinbase:USD 10470.00 USD
Expenses:Crypto:Fees:Trading 30.00 USD
Income:CapitalGains:Crypto 1440.00 USD ; 10470 - (0.3 × 30000) - 30 = 1440

3. Staking Rewards: Earning While You Sleep

Passive income at its finest. But remember, the IRS requires staking rewards to be reported as taxable income when received, based on fair market value at the time of receipt (per IRS Digital Assets guidance, 2024). While there is ongoing litigation (Jarrett v. United States), the current official position requires immediate reporting. Here's how to track them properly:

2024-02-01 * "ETH Staking Rewards"
Assets:Staking:Ethereum:ETH 0.05 ETH {2500.00 USD}
Income:Crypto:Staking:ETH 125.00 USD

4. DeFi Yield Farming: Where Things Get Spicy 🌶️

Welcome to advanced DeFi accounting. DeFi yield farming involves complex multi-token transactions that require sophisticated tracking. Here's how to properly account for a Uniswap liquidity position:

; Initial liquidity provision
2024-01-10 * "Add liquidity to ETH-USDC pool"
Assets:Crypto:Wallet:MetaMask:ETH -10 ETH {2500.00 USD}
Assets:Crypto:Wallet:MetaMask:USDC -25000 USDC {1.00 USD}
Assets:DeFi:Uniswap:ETH-USDC-LP 100 UNI-V2-ETH-USDC {500.00 USD}

; Claiming rewards
2024-02-10 * "Claim Uniswap LP rewards"
Assets:Crypto:Wallet:MetaMask:UNI 50 UNI {8.00 USD}
Income:Crypto:DeFi:Yield 400.00 USD

5. Cross-Exchange Transfers

Moving Bitcoin from Coinbase to Ledger wallet:

2024-01-20 * "Transfer BTC from Coinbase to Ledger"
Assets:Crypto:Coinbase:BTC -1.0 BTC {30000.00 USD}
Assets:Crypto:Wallet:Ledger:BTC 0.9995 BTC {30000.00 USD}
Expenses:Crypto:Fees:Withdrawal 0.0005 BTC {30000.00 USD}

Advanced Cryptocurrency Scenarios

Margin Trading

Recording leveraged positions:

; Opening a leveraged long position (borrowing BTC)
2024-02-15 * "Open 2x leveraged BTC position"
Assets:Crypto:Binance:BTC-Margin 1.0 BTC {35000.00 USD}
Liabilities:Crypto:Binance:BTC -1.0 BTC {35000.00 USD}
Expenses:Crypto:Fees:Trading 50.00 USD
Assets:Crypto:Binance:USD -50.00 USD

; Closing the position with profit
2024-02-20 * "Close leveraged BTC position"
Assets:Crypto:Binance:BTC-Margin -1.0 BTC {35000.00 USD}
Assets:Crypto:Binance:USD 37950.00 USD
Liabilities:Crypto:Binance:BTC 1.0 BTC {35000.00 USD}
Income:Crypto:Trading:Margin -2900.00 USD
Expenses:Crypto:Fees:Trading 50.00 USD

Airdrops and Forks

Recording free token distributions:

2024-03-01 * "Received UNI airdrop"
Assets:Crypto:Wallet:MetaMask:UNI 400 UNI {8.00 USD}
Income:Crypto:Airdrops 3200.00 USD

Mining Operations

For cryptocurrency miners:

2024-01-01 * "Bitcoin mining reward"
Assets:Crypto:Mining:BTC 0.1 BTC {45000.00 USD}
Income:Crypto:Mining:BTC 4500.00 USD

; Mining expenses
2024-01-31 * "Mining electricity costs"
Expenses:Crypto:Mining:Electricity 800.00 USD
Assets:Checking -800.00 USD

Tax Reporting and Compliance

Cost Basis Tracking

Beancount.io automatically tracks cost basis using the lot-based system:

; Multiple purchases at different prices
2024-01-01 * "Buy BTC batch 1"
Assets:Crypto:Coinbase:BTC 1.0 BTC {40000.00 USD}
Assets:Crypto:Coinbase:USD -40000.00 USD

2024-02-01 * "Buy BTC batch 2"
Assets:Crypto:Coinbase:BTC 1.0 BTC {45000.00 USD}
Assets:Crypto:Coinbase:USD -45000.00 USD

; Selling specific lots (FIFO, LIFO, or specific identification)
2024-03-01 * "Sell BTC using FIFO"
Assets:Crypto:Coinbase:BTC -0.5 BTC {40000.00 USD}
Assets:Crypto:Coinbase:USD 22470.00 USD
Expenses:Crypto:Fees:Trading 30.00 USD
Income:CapitalGains:Crypto 2440.00 USD ; 22470 - 20000 - 30 = 2440

Generating Tax Reports

Use Beancount's query system and plugins to generate tax reports:

  • Form 8949: Capital gains and losses (via bean-query or third-party plugins)
  • Schedule D: Summary of capital gains (requires additional scripting)
  • Form 1040: Income from staking, mining, airdrops (via custom reports)
  • Detailed transaction logs: For audit purposes

Note: Tax report generation requires additional plugins, scripts, or integration with specialized tax software. Beancount provides the data foundation, but specific tax forms typically require custom development or third-party tools.

Best Practices for Crypto Accounting

1. Regular Reconciliation

  • Import exchange data weekly
  • Verify wallet balances monthly
  • Cross-check with blockchain explorers

2. Proper Documentation

  • Save all transaction confirmations
  • Document the purpose of each transaction
  • Maintain records of market prices at transaction time

3. Separate Business and Personal

; Personal crypto investments
Assets:Personal:Crypto:Coinbase:BTC

; Business crypto operations
Assets:Business:Crypto:Treasury:BTC

4. Track All Income Sources

  • Staking rewards (taxable as income)
  • Mining rewards (taxable as income)
  • Airdrops (taxable at fair market value)
  • DeFi yield (taxable as income)

5. Fee Management

Track all fees separately for proper tax deduction:

Expenses:Crypto:Fees:Trading     ; Exchange trading fees
Expenses:Crypto:Fees:Network ; Blockchain network fees
Expenses:Crypto:Fees:Withdrawal ; Withdrawal fees

Exchange API Integration

Beancount.io can integrate with major exchanges:

  • Coinbase Pro API: Automatic transaction import
  • Binance API: Real-time balance updates
  • Kraken API: Historical data synchronization

Blockchain Analysis

Connect with blockchain explorers:

  • Etherscan: Ethereum transaction verification
  • Blockchain.info: Bitcoin transaction tracking
  • BscScan: Binance Smart Chain monitoring

Portfolio Tracking

Sync with portfolio management tools:

  • CoinTracker: Tax report generation
  • Koinly: Multi-exchange aggregation
  • Blockfolio: Mobile portfolio tracking

Important Disclaimers

Tax and Legal Notice: This guide provides general information about cryptocurrency accounting using Beancount and does not constitute professional tax, legal, or financial advice. Tax treatment of cryptocurrency transactions varies by jurisdiction and individual circumstances. Complex scenarios like cross-chain bridges, impermanent loss, and flash loans may have unclear tax implications under current regulations. For specific guidance on whether transactions constitute taxable dispositions, refer to IRS FAQ Q-15 through Q-18 (2024) or consult local tax regulations. Always consult with a qualified tax professional or CPA familiar with cryptocurrency taxation in your jurisdiction before making tax-related decisions.

Software Clarification: Examples in this guide use standard Beancount syntax. While Beancount.io provides a user-friendly interface for Beancount, the underlying accounting principles apply to any Beancount implementation.

Conclusion

Cryptocurrency accounting doesn't have to be overwhelming. With Beancount's powerful plain-text accounting system, accessible through Beancount.io's platform, you can:

  • Maintain Complete Transparency: Every transaction is visible and auditable
  • Ensure Tax Compliance: Proper cost basis tracking and income reporting
  • Scale with Your Portfolio: Handle simple trades to complex DeFi strategies
  • Integrate Seamlessly: Connect with exchanges, wallets, and tax tools
  • Future-Proof Your Records: Plain-text format ensures long-term accessibility

Whether you're a casual Bitcoin holder or a sophisticated DeFi yield farmer, Beancount provides the foundation and flexibility needed to master cryptocurrency accounting. Start with basic transactions and gradually incorporate more complex scenarios as your crypto journey evolves.

The examples in this guide provide a solid foundation, but remember that cryptocurrency accounting is an evolving field. Stay informed about regulatory changes, consult with tax professionals, and adapt your accounting practices as needed.

Ready to take control of your cryptocurrency finances? Sign up for Beancount.io and experience the power of transparent, scriptable crypto accounting built on the robust Beancount foundation.