Skip to main content

83 posts tagged with "accounting"

View all tags

Business Line of Credit: A Practical Guide for Owners & Bookkeepers

· 8 min read
Mike Thrift
Mike Thrift
Marketing Manager

A business line of credit (LOC) is one of the most flexible financing tools available, but its mechanics can be tricky. It lets you borrow up to a set limit, repay, and borrow again, paying interest only on what you use. It's ideal for smoothing cash flow, bridging accounts receivable gaps, and handling other short-term needs.

However, navigating secured vs. unsecured lines, variable rates, hidden fees, and tax implications is crucial. This guide breaks down everything owners and bookkeepers need to know, complete with practical examples for tracking it all in Beancount.

2025-09-06-business-line-of-credit


What a Business Line of Credit Is (and Isn’t)

Think of a business line of credit as revolving working capital. It’s a preset credit limit you can draw from whenever you need funds. Once you repay the borrowed amount, your available credit is restored, ready to be used again. The simplest analogy is: “credit card mechanics, business-loan pricing.”

This makes it fundamentally different from a term loan. A term loan provides a lump sum of cash upfront, which you repay over a fixed period through regular installments. LOCs are built for flexibility and short-term cash cycle management, whereas term loans are better suited for large, long-term investments like purchasing equipment or real estate.


When an LOC Makes Sense

A line of credit shines in specific, recurring business scenarios:

  • Bridging Receivables and Inventory Cycles: This is the classic use case. You can draw from your LOC to pay suppliers for inventory and then repay the line weeks or months later when your customers pay their invoices. It’s a perfect tool for wholesalers, agencies, and seasonal businesses that face predictable cash flow gaps.
  • Emergency Buffer: Unexpected expenses are inevitable. An LOC acts as a ready-to-draw backstop for covering a payroll shortfall, funding an emergency repair, or managing a sudden operational need. It’s far more efficient than applying for a new loan every time a surprise occurs.
  • Opportunistic Buying: Did a key supplier offer a significant discount for early payment? You can use your LOC to seize the opportunity, capture the savings, and repay the draw once your own cash flow catches up.

Secured vs. Unsecured (Read the Lien Language)

Lenders need assurance they’ll be repaid, which is why most lines of credit are secured by collateral.

  • Secured Lines: Many bank LOCs are secured by specific assets, like your accounts receivable or inventory. More commonly, a lender will place a blanket UCC lien on the business. This gives the lender a claim on most of your business assets in the event of a default. It is critical to read the security agreement and confirm if any key assets (like intellectual property) are excluded assets.
  • Unsecured Lines: These are harder to qualify for, typically come with lower limits and higher interest rates, and are reserved for businesses with stellar credit. They don't require you to pledge specific collateral, but many lenders will still require a personal guarantee from the owner.
  • SBA Options: For U.S. borrowers, the Small Business Administration (SBA) offers programs like the 7(a) Working Capital Pilot (WCP) for monitored lines of credit and CAPLines, which are asset-based revolvers tied directly to short-term working capital needs.

Practical Tip: Always ask the lender to spell out any carve-outs in the lien agreement. "Excluded assets" clauses are negotiable and can prevent a blanket lien from interfering with other financing, like an equipment loan.


How Costs Work (Rates + Fees)

The cost of an LOC isn't just the interest rate. You must account for a variety of potential fees.

  • Interest: You are only charged interest on the drawn amount. Rates are typically variable, calculated as a benchmark rate (like the Prime Rate) plus a margin (e.g., Prime + 1.5%). As you repay the principal, your interest cost decreases and your credit availability is restored.
  • Fees to Watch For:
    • Origination Fee: A one-time fee charged when you open the line.
    • Annual or Monthly Maintenance Fee: A recurring charge to keep the line open, sometimes called a non-usage fee if you don't draw from it.
    • Draw Fee: A fee charged each time you take funds from the line.

These costs add up. Before committing, model your expected usage to find the true cost.

Back-of-the-Envelope Example

Let's say you have a 100,000limitanddraw100,000** limit and draw **40,000 for two months at 12% APR. The line has a 2% draw fee and a $150 annual fee.

  • Interest40,000×1240,000 × 12% × (2/12) = **800**
  • Draw Fee = 2% × 40,000=40,000 = **800**
  • Annual Fee = $150
  • Total Cost$1,750

In this scenario, the fees make the effective cost significantly higher than the headline 12% APR.


Qualifying and Staying in Good Standing

Lenders evaluate your business's health based on revenue consistency, time in business, and both business and personal credit scores. Building a strong history of on-time payments is the best way to gain access to better terms and lower rates.

Most LOCs aren't "set it and forget it." They often require annual renewal, where the lender reviews updated financial statements. Your agreement may also include financial covenants, such as maintaining a minimum Debt Service Coverage Ratio (DSCR) or interest coverage ratio. If your financial metrics slip, the lender has the right to reduce your limit or freeze the line entirely.


LOC vs. Term Loan vs. Credit Card

Choose the right tool for the job:

ToolBest Use Case
Business Line of CreditRepeatable, short-term working capital swings and opportunistic buys you can repay quickly.
Term LoanOne-time purchases of long-life assets like machinery, vehicles, or real estate.
Business Credit CardSmall, frequent purchases where you can earn rewards. Watch the high interest rates.

A Note on U.S. Taxes

Interest paid on a business line of credit is generally a deductible business expense. However, under Section 163(j) of the tax code, this deduction may be capped.

A small-business exception exists for companies whose average annual gross receipts for the prior three years fall below an inflation-adjusted threshold (around 30millionfor2024and30 million for 2024** and **31 million for 2025). Always confirm the specifics with your tax advisor, as these rules are complex.


Beancount: How to Record a Line of Credit

Tracking an LOC in a plain-text ledger like Beancount ensures clarity and accuracy. Below are illustrative examples of the key transactions. (Note: In Beancount, increasing a liability uses a negative amount, while repaying it uses a positive amount).

1. Open Accounts & Document the Facility

First, set up the necessary accounts in your ledger. It's a best practice to add a note with the LOC's key terms.

2025-01-01 open Assets:Bank:Operating         USD
2025-01-01 open Liabilities:LOC:BigBank USD
2025-01-01 open Expenses:Interest:LOC USD
2025-01-01 open Expenses:BankFees USD

; Optional: Document the facility's terms with a note
2025-01-01 note Liabilities:LOC:BigBank "Limit=100000, Rate=Prime+1.50%, Secured by A/R & Inventory (UCC-1)"

2. Draw Funds

When you transfer funds from the LOC to your operating account, you increase cash and increase the liability.

2025-03-03 * "Draw from LOC to cover receivables timing"
Assets:Bank:Operating 40000.00 USD
Liabilities:LOC:BigBank -40000.00 USD

3. Accrue Monthly Interest

At the end of the month, record the interest incurred as an expense, which adds to the total amount you owe.

2025-03-31 * "Accrue LOC interest for March"
Expenses:Interest:LOC 800.00 USD
Liabilities:LOC:BigBank -800.00 USD

4. Record a Draw Fee or Maintenance Fee

Book any fees as an expense, paid from your operating account.

2025-03-31 * "LOC draw fee (2%)"
Expenses:BankFees 800.00 USD
Assets:Bank:Operating -800.00 USD

5. Make a Payment (Interest + Principal)

A payment reduces your operating cash and reduces the liability balance.

2025-04-10 * "LOC payment (principal + interest)"
Liabilities:LOC:BigBank 10800.00 USD
Assets:Bank:Operating -10800.00 USD

Due Diligence & Negotiation Checklist

Before you sign, get clear answers to these questions:

  • Fees: Request a full fee table: origination, annual/maintenance, inactivity, draw, and wire/ACH fees.
  • Renewal: What is the renewal process? What could trigger a limit reduction or a freeze?
  • Lien Scope: What specific assets are covered by the lien? Are there any exclusions?
  • Covenants: Are there financial covenants like DSCR? How often are they tested, and what happens if you temporarily fall short?
  • SBA Terms: If it's an SBA-backed line, is it a WCP or CAPLines facility? How is your borrowing base calculated and reported?

Final Word

A well-structured line of credit is an invaluable tool for managing a growing business. The key is to fully understand the collateral you're pledging, the total cost including all fees, and the obligations required to keep the line in good standing.

By keeping a clean ledger in Beancount with clear metadata, you can track your usage, understand its true cost, and ensure this flexible tool remains a powerful asset for your business.

This article is for educational purposes and does not constitute financial, legal, or tax advice. Consult with a qualified professional for guidance specific to your situation.

CD vs. Savings Account for Small-Business Cash (with Beancount examples)

· 9 min read
Mike Thrift
Mike Thrift
Marketing Manager

Deciding where to park your small business's cash reserves can feel like a balancing act between earning a decent return and keeping funds accessible. The two most common, safest options are high-yield savings accounts and certificates of deposit (CDs). Each serves a distinct purpose, and choosing the right one depends on your timeline and liquidity needs.

Let's break down the differences, explore the nuances of FDIC insurance for businesses, and then dive into practical Beancount patterns to track it all cleanly.

2025-09-05-cd-vs-savings-account-for-small-business-cash

TL;DR: The Quick Summary

  • Savings / Money Market Deposit Accounts (MMDAs): Best for liquid, everyday operating cash and near-term tax payments. Their interest rates are variable. While the Fed removed old withdrawal limits, banks can still set their own rules.
  • Certificates of Deposit (CDs): Offer a higher, fixed yield if you can lock up cash for a specific term. Pulling money out early triggers a penalty.
  • Safety First: Both are FDIC-insured up to $250,000 per depositor, per bank, per ownership category. The rules differ slightly for sole proprietorships versus corporations.
  • Over the Limit?: For balances above $250,000, services like an Insured Cash Sweep (ICS) can spread your funds across multiple banks to maximize insurance coverage while you maintain a single banking relationship.
  • Beancount Users: Skip to the end for journal patterns to model CDs, accrue interest, and handle early withdrawal penalties correctly.

What Each Account Does Well 🏦

High-Yield Savings / Money Market Deposit Accounts (MMDAs)

Think of these as your business's primary cash hub. They are designed for safety and accessibility.

  • Liquidity: This is their main advantage. You can withdraw funds anytime without penalty. It's important to note that even though the Federal Reserve removed the old "six convenient withdrawals per month" rule (Regulation D) in 2020, individual banks are still free to impose their own transaction limits or fees. Always read your account's terms.
  • Insurance & Safety: Savings and MMDAs at an FDIC-insured bank are covered. Don't confuse these with money market mutual funds offered by brokerages, which are investments and are not FDIC-insured.
  • Best Use Case: Perfect for your operating cash buffer (3-6 months of expenses), funds set aside for near-term payroll or taxes, and your general emergency reserve.

Certificates of Deposit (CDs)

CDs are a deal you strike with the bank: you agree not to touch your money for a set term (e.g., 3, 6, 12 months), and in return, the bank gives you a higher, fixed interest rate.

  • Yield Certainty: The fixed rate is a key benefit, protecting you if market rates fall. The flip side is the penalty for early withdrawal. If you break a CD within the first six days, federal rules mandate a minimum penalty of seven days' simple interest. After that, the penalty is determined by the bank's own policy (e.g., three months of interest).
  • Insurance & Safety: CDs carry the same FDIC insurance as savings accounts, up to the same $250,000 limit.
  • Best Use Case: Ideal for cash you are certain you won't need for the duration of the term. This could be money earmarked for a tax payment nine months away or a reserve for a capital expenditure you plan to make next year. CD laddering—opening multiple CDs with staggered maturity dates (e.g., 3, 6, 9, and 12 months)—is a popular strategy to balance higher yields with regular access to cash.

FDIC Coverage: The Practical Bits for Businesses 🛡️

The FDIC insurance rules are straightforward but have important distinctions for different business structures.

  • The Headline Rule: You get $250,000 of coverage per depositor, per insured bank, per ownership category. All your deposits (checking, savings, MMDAs, CDs) within the same ownership category at a single bank are added together to determine your coverage.
  • Sole Proprietorships: Business accounts for a sole prop are treated as the owner's individual accounts. They are combined with the owner's other personal single accounts at that same bank for one $250,000 insurance limit.
  • Corporations, LLCs & Partnerships: These legal entities are insured separately from their owners' personal accounts. The business itself gets its own $250,000 of coverage per bank.
  • Need More Coverage?: If your business holds more than $250,000, you don't have to juggle multiple banking relationships. Ask your bank about an Insured Cash Sweep (ICS). This service automatically distributes your deposits across a network of other FDIC-insured institutions, keeping all your funds insured while you manage them through your primary bank.

When a Small Business Should Favor Each Option 🤔

  • Choose a Savings/MMDA when…

    • Your cash flow is unpredictable or you have frequent, variable expenses.
    • You're building your 3–6 month operating expense buffer.
    • You need immediate access to funds and are willing to accept a variable interest rate.
  • Choose a CD when…

    • You have a surplus of cash that you can confidently lock away for a fixed term.
    • You want to lock in a specific interest rate and protect your return from market fluctuations.
    • You are building a CD ladder to create a predictable schedule of maturing cash.

A blended approach is often best: keep your immediate operating cash in a high-yield savings account and place longer-term reserves into a CD ladder or short-term Treasuries.


Important Fine Print to Read 📝

  • Early Withdrawal Penalties: These are specific to each bank and will be disclosed in your CD agreement. The best way to avoid them is to plan your ladder carefully so you don't have to break a CD.
  • Transaction Limits on Savings: Just because the federal rule is gone doesn't mean your bank won't charge you a fee after a certain number of monthly withdrawals. Check your account agreement.
  • Taxes on Interest: Interest earned from both savings and CDs is generally taxable income in the year it's credited to your account. You'll receive a Form 1099-INT. If you pay an early withdrawal penalty, it is deductible. The penalty amount appears in Box 2 of your 1099-INT and is typically treated as a business expense.

Alternatives Worth Knowing

  • Treasury Bills (T-Bills): These are short-term loans to the U.S. government that mature in 4 to 52 weeks. They are considered one of the safest investments in the world, backed by the full faith and credit of the U.S. government (not FDIC insurance). They are highly liquid and can be a great option for cash reserves exceeding FDIC limits.
  • Money Market Mutual Funds (MMFs): Offered by brokerage firms, these are investment products, not bank deposits, and are not FDIC-insured. They invest in high-quality, short-term debt and aim to keep a stable value of $1 per share, but this is not guaranteed.

A Decision Cheat-Sheet ✅

If you...Then choose a...
Need funds at any time and want no term risk?Savings/MMDA
Have a known future date for a cash need and want a better fixed rate?CD (or a CD ladder)
Are holding over $250k at one bank?Multiple banks or an Insured Cash Sweep (ICS) service
Want a government-backed, liquid, short-term yield?T-Bills in a brokerage account

Beancount: How to Model Savings and CDs 💻

For those of us managing our business finances with plain-text accounting, here are some simple, effective patterns for tracking these accounts in Beancount.

1) Chart of Accounts

First, ensure you have the necessary accounts. Adjust the names to fit your own chart.

Assets:Bank:Checking
Assets:Bank:Savings
Assets:Bank:CD:12M ; Create a unique account for each CD
Assets:InterestReceivable ; Optional, for monthly accruals
Income:Interest:Bank
Expenses:Bank:EarlyWithdrawalPenalty
Documents:Bank ; To link statements and agreements

2) Open and Fund a CD

When you open a CD, it's a simple transfer from one asset account to another.

; Open a 12-month CD for $50,000
2025-01-15 * "Open 12M CD @ fixed rate"
Assets:Bank:CD:12M 50,000.00 USD
Assets:Bank:Checking -50,000.00 USD
document: "Documents:Bank/CD-Agreement-2025-01-15.pdf"

3) Recognize Interest: Two Methods

Option A: Recognize Interest Only When Paid (Simple)

If your bank credits all interest at maturity, this is the easiest method.

; CD matures; principal + interest paid to checking
2026-01-15 * "CD matured; interest credited"
Assets:Bank:Checking 52,375.00 USD
Assets:Bank:CD:12M -50,000.00 USD
Income:Interest:Bank -2,375.00 USD

Option B: Accrue Interest Monthly (Better for Reporting)

For more accurate monthly financial statements, you can accrue the interest earned each month.

; Monthly accrual (illustrative amount)
2025-02-15 * "Accrue CD interest"
Assets:InterestReceivable 197.40 USD
Income:Interest:Bank -197.40 USD

; At maturity, reverse the receivable when the cash arrives
2026-01-15 * "CD matured; settle accrued interest"
Assets:Bank:Checking 52,375.00 USD
Assets:Bank:CD:12M -50,000.00 USD
Assets:InterestReceivable -2,372.80 USD
Income:Interest:Bank -2.20 USD ; true-up for rounding

4) Early Withdrawal and Penalty

Recording a penalty requires an extra posting to an expense account. This keeps your reporting clean and makes tax time easier.

; Break CD early; bank pays back principal plus net interest after penalty
2025-06-10 * "Early CD redemption; penalty applied"
Assets:Bank:Checking 50,900.00 USD
Assets:Bank:CD:12M -50,000.00 USD
Income:Interest:Bank -1,200.00 USD
Expenses:Bank:EarlyWithdrawalPenalty 300.00 USD
document: "Documents:Bank/1099-INT-2025.pdf" ; Box 2 shows the penalty

5) High-Yield Savings Interest and Reconciliation

Recording interest from a savings account is straightforward. Use a balance assertion to confirm your books match the bank statement.

; Monthly interest posted to savings
2025-03-31 * "Monthly interest - Savings"
Assets:Bank:Savings 185.23 USD
Income:Interest:Bank -185.23 USD

; Reconcile with the month-end statement
2025-03-31 balance Assets:Bank:Savings 150,185.23 USD

Tip: Always attach digital copies of your statements and CD agreements using the document: metadata tag. At tax time, you can easily search for Expenses:Bank:EarlyWithdrawalPenalty and verify the amount against Box 2 of your 1099-INT.


Final Thoughts: A Simple Cash Policy

  • Segment Your Cash: Keep your runway plus 1–2 months of operating expenses in a liquid Savings/MMDA. Place reserves for the next 3–12 months in a CD ladder or T-Bills.
  • Mind Your Insurance: Keep balances for each legal entity under the $250k limit per bank, or use an ICS service.
  • Avoid Surprises: Read the fine print on withdrawal rules and CD penalties before you commit your cash.
  • Stay Tax-Aware: Remember that interest is taxable and early-withdrawal penalties are deductible. Consult with your CPA to ensure you're handling them correctly.

This article is for educational purposes and does not constitute financial or tax advice. Please consult with a qualified professional for guidance specific to your business.

Detox Your Small‑Business Finances — the Beancount Way

· 10 min read
Mike Thrift
Mike Thrift
Marketing Manager

Turn one messy ledger into a calm, cash‑confident business in 30 days—using plain‑text accounting.


2025-09-04-detox-your-small-business-finances

TL;DR

  • Separate, simplify, and lock your books with a lean chart of accounts, consistent imports, and automated balance checks.
  • Surface what matters—COGS, overhead, cash runway—via quick bean-query reports.
  • Cut the noise (unused subscriptions, duplicate tools) and codify good habits (weekly reconcile, monthly close, receipts attached).
  • Make tax season boring by keeping statements, receipts, and balances verifiable in one place.

Why a “Detox”?

Financial clutter in a small business isn't just messy—it's expensive. It hides wasteful spending, obscures your true profitability, and turns tax season into a frantic scavenger hunt. A financial detox is a focused, 30-day reset: you identify what moves (and leaks) money, remove the complexity, and then institutionalize simple, repeatable routines to keep it clean.

Beancount is the perfect tool for this because it’s transparent, scriptable, and verifiable. Unlike black-box software, a plain-text ledger means every number is explainable. Every check and balance can be automated with directives and queries, creating a self-auditing system that forces clarity. This guide will walk you through a four-week plan to achieve just that.


Week 0 — Set Your Baseline

Before you can clean up, you need a solid foundation. This week is about defining the structure of your financial world.

Create a Lean Chart of Accounts

Your chart of accounts is the skeleton of your financial system. The goal here is minimalism. Don't create an account for every possible expense you might have. Start with the essentials you use today; you can always add more later. A cluttered chart of accounts encourages miscategorization and makes high-level analysis difficult.

Here’s a simple, effective starting point:

; Core entities
2025-01-01 open Assets:Bank:Checking USD
2025-01-01 open Assets:Bank:Savings USD
2025-01-01 open Liabilities:CreditCard:Business USD
2025-01-01 open Income:Sales
2025-01-01 open Expenses:COGS
2025-01-01 open Expenses:Overhead:Rent
2025-01-01 open Expenses:Overhead:Utilities
2025-01-01 open Expenses:SaaS
2025-01-01 open Equity:Opening-Balances

Lock Balances You Can Verify

The most powerful feature in plain-text accounting is the ability to assert reality. A balance directive tells Beancount: "On this date, this account had exactly this much money." If it doesn't, Beancount will raise an error. This is your primary safety net.

When starting out, use pad in combination with balance to initialize your accounts from a bank statement. The pad directive creates a transaction that forces the account to the correct starting balance, booking the difference to an equity account.

; Initialize from statements
2025-01-01 pad Assets:Bank:Checking Equity:Opening-Balances
2025-01-01 balance Assets:Bank:Checking 12345.67 USD

A word of caution: Use pad sparingly. It's for getting started cleanly, not for papering over recurring reconciliation mistakes.


Week 1 — Separate and Simplify Flows

With a structure in place, it's time to clarify how money moves through your business.

Keep Business ≠ Personal

This is the golden rule of small-business finance. Co-mingling funds is a recipe for confusion and tax-time headaches.

  • Maintain one dedicated business bank account and one business credit card.
  • Mirror this separation in your ledger: Assets:Bank:Business:Checking, Liabilities:CreditCard:Business.
  • If you pay yourself, book it as a distribution to Equity:Owner-Draws. Never categorize personal expenses directly from business accounts.

Standardize Vendor Categories

Do you pay for AWS, Google Cloud, and Vercel? Don't create three separate accounts. Map them all to a single, logical category like Expenses:Cloud. Avoid creating micro-accounts you won't actually analyze. The goal is to see patterns, not to track every single vendor with its own account.


Week 2 — Automate Inputs and Receipts

Manual data entry is slow, error-prone, and unsustainable. This week is about building a machine to feed your ledger reliably.

Build a No-Drama Import Path

Beancount's import framework lets you teach it how to read CSV or OFX files from your bank and automatically generate transactions. Invest the time to set this up once, and you'll save hundreds of hours down the line. Keep your importer rules in version control (like Git) so your system is repeatable and backed up.

  • Start with Beancount’s official Importing External Data guide.
  • For a more interactive workflow, consider a tool like beancount-import, which provides a web UI for semi-automatic matching.
  • Many users rely on the built-in ingest or newer beangulp frameworks to build their custom importers. Pick one and stick with it for consistency.

Attach Documents Where They Belong

A transaction without a receipt is an unsubstantiated claim. Beancount and its web interface, Fava, make it trivial to link source documents to entries, creating an unshakeable audit trail.

You have two great options:

  1. Documents Folder + Directive: Store all your receipts and statements in a dedicated folder. Then, link a file to a transaction using the document directive.
  2. Drag-and-Drop in Fava: Simply drag a PDF or image file onto a transaction in the Fava UI. Fava automatically stores the file and inserts the correct document directive into your ledger file for you.
; In your main ledger file, tell Fava where your documents live
option "documents" "/home/acme/docs"

; Link a receipt to a specific transaction posting
2025-08-07 * "Figma" "Monthly Subscription"
Assets:CreditCard:Business -12.00 USD
Expenses:SaaS 12.00 USD
document: "receipts/figma-2025-08-07.pdf"

Week 3 — See the Truth (Fast Queries You’ll Reuse)

Your ledger is now clean and fed with data. It's time to ask it important questions. Fire up the bean-query command-line tool to get instant answers.

1) Where’s My Cash?

Get a quick snapshot of your liquid assets.

bean-query business.beancount 'BALANCES FROM year = 2025 AND (account ~ "Assets:Bank" OR account ~ "Liabilities:CreditCard")'

This gives you an immediate, real-time view of your cash position without logging into multiple bank portals.

2) What Am I Spending On Overhead vs. COGS?

Understand where your money is really going. Are you spending more on non-essential overhead or on the costs directly tied to delivering your product (Cost of Goods Sold)?

SELECT
account,
units(sum(position))
WHERE
account ~ "^Expenses:(Overhead|COGS)" AND year = 2025
GROUP BY
account
ORDER BY
account

This query separates your core operational costs from your administrative burden, a critical insight for profitability.

3) Which Subscriptions Look “Zombie”?

Find recurring, small-dollar expenses that often fly under the radar. These "zombie" subscriptions can bleed your cash flow dry.

SELECT
payee,
COUNT(*) AS num_transactions,
SUM(number) AS total_spent
WHERE
account ~ "^Expenses:SaaS" AND date >= '2025-01-01'
GROUP BY
payee
ORDER BY
num_transactions DESC,
total_spent DESC

This query instantly reveals vendors you pay frequently. If you see one you don't recognize or no longer need, it's time to cancel.


Week 4 — Tidy and Lock the System

The final week is about building the habits and guardrails that keep your finances clean for good.

Put Simple Budgets in Place

Fava can read budget directives from your ledger and display helpful progress bars in its reports, showing you if you're on track. This provides a gentle, constant reminder of your spending goals.

; Cap SaaS spending at $100 per month
2025-01-01 custom "budget" Expenses:SaaS "monthly" 100.00 USD

Set these for key variable expense categories like software, advertising, or contractors to notice drift before it becomes a problem.

Close the Month, Every Time

Establish a simple, non-negotiable monthly closing process:

  1. Reconcile: For every bank and credit card account, add a balance assertion matching the final number on your monthly statement.
  2. Attach: Attach the PDF statement itself to the balance entry using the document directive.
  3. Report: Run your three saved queries (cash, overhead/COGS, subscriptions) and paste the outputs into a short monthly review note.

The balance assertion is an automatic tripwire. If your ledger doesn't match the bank statement, Beancount will throw an error, telling you exactly where to look for the discrepancy.


Make Tax Season Boring (In a Good Way)

By following this system, you transform tax preparation from a crisis into a simple reporting exercise.

  • Receipts are attached to transactions, so there’s no frantic search. In Fava, you’re one click away from the source document for any expense.
  • Tax-relevant items can be tagged (e.g., #tax-deductible), allowing you to pull a clean report with bean-query for your accountant.
  • Year-end balances are locked and verified with balance assertions, giving you and your preparer confidence in the numbers.

A 30-Day Checklist (Print This)

  • Day 1–3
    • Create a minimal chart of accounts.
    • Add pad + balance for each bank/card using the latest statements.
  • Day 4–10
    • Set up one importer pipeline and commit your rules to version control.
    • Backfill 90 days of transactions; run a first BALANCES snapshot.
  • Day 11–15
    • Standardize vendors to their respective accounts (SaaS, Cloud, Shipping, etc.).
    • Attach statement PDFs for the reconciled periods; confirm they appear in Fava.
  • Day 16–20
    • Run the overhead vs. COGS query; fix any miscategorized items.
    • Run the subscription frequency query; cancel or consolidate unused services.
  • Day 21–25
    • Add one or two budget caps for key variable expenses via custom "budget".
    • Save your three most important bean-query commands to a script for easy reuse.
  • Day 26–30
    • Reconcile all accounts with month-end balance assertions.
    • Write a short "monthly close" note summarizing key numbers and linking to documents.

Common Snippets You’ll Reuse

A Clean Expense Posting

2025-08-05 * "Figma" "Pro plan"
Expenses:SaaS 12.00 USD
Assets:Bank:Checking -12.00 USD

Balance Assertion from a Statement

2025-09-01 balance Assets:Bank:Checking  8423.17 USD

Budget Guardrail for Rent

2025-01-01 custom "budget" Expenses:Overhead:Rent "monthly" 2500.00 USD

Keep It Simple, Keep It Scripted

The philosophy of a Beancount-powered financial detox is simple:

  • Script what you repeat: Automate imports and reporting.
  • Let assertions fail loudly: They are your safety rails, not an inconvenience.
  • Prefer fewer, clearer accounts over perfect, granular categorization.

Adopt these habits, and your business will run on tight feedback loops: cash visibility daily, spending drift visible weekly, and a truly boring year-end. That's the clarity and control this detox is designed to deliver.


References & Further Reading

This post is for educational purposes only and is not tax or legal advice.

10 Practical Steps to a Fast, Reliable Month-End Close in Beancount

· 7 min read
Mike Thrift
Mike Thrift
Marketing Manager

If your ledger lives in plain text, your month-end close can be both fast and auditable. The process doesn't need to be a frantic scramble of spreadsheets and calculators. This guide distills a clean, repeatable process tailored for Beancount and its web interface, Fava, built around balance assertions, smart imports, and lightweight checks.

Here's the checklist for a painless close:

2025-09-02-month-end-close

  1. Gather statements and import all raw transactions.
  2. Normalize payees, descriptions, and metadata.
  3. Reconcile every cash, bank, and credit account with balance assertions.
  4. Tie out transfers and inter-account moves.
  5. Update prices for investments and verify valuations.
  6. Attach or source documents (receipts, invoices) in your ledger.
  7. Run queries and dashboards for P&L and variance checks.
  8. Post accruals and adjustments as needed.
  9. Validate the ledger with automated checks.
  10. Commit, tag, and archive the month.

1. Set the Ground Rules (and Reuse Them)

A consistent close starts with a stable foundation. Your Chart of Accounts and key Beancount options should be declared centrally and rarely changed. Options like operating_currency and documents handling ensure your reports and imports behave predictably every single time.

Tip: Treat your options file as "infrastructure." Changing it can alter how your numbers are computed. Version it carefully in Git.


2. Import Everything—Then Never Hand-Type It Again

Automating your data import is the single biggest speed-up for closing your books. Use Beancount’s powerful importing tools and community-built importers to pull in bank feeds, credit card CSV/OFX files, brokerage data, and payroll reports.

The goal is a one-command import that generates balanced postings that you only need to review and commit. This eliminates manual data entry, the primary source of errors and delays.


3. Normalize Payees and Metadata Up Front

Clean data is reliable data. Standardize your payees, narration, and tags during the import process so that your searches, rules, and reports remain accurate month after month.

Beancount’s plugin system lets you add lightweight transformations and validations as your files are loaded. This is perfect for enforcing custom consistency checks or using the built-in noduplicates plugin to flag repeat transactions before they become a problem.


4. Reconcile with balance Assertions

For every account that has a statement (checking, savings, credit cards), use Beancount’s balance directive to assert the closing balance. This simple line turns reconciliation from a manual eyeball-check into a precise, automated test.

; Asserts the balance is exactly 1234.56 at the start of the day
2025-09-01 balance Assets:Bank:Checking 1234.56 USD

Because balances are checked at the beginning of the day, it's easiest to use the first day of the next month for a month-end statement. If Beancount’s calculated balance disagrees with your assertion, you’ll get a precise error and a date to begin your investigation. Always fix the source of truth (your transactions) first; don't "force" a reconcile.


5. Tie Out Inter-Account Transfers

Ensure every transfer appears on both sides of the transaction. A payment from your checking account to your credit card, for instance, should be reflected in both accounts. Mismatched transfers are a common source of reconciliation headaches.

Use the pad directive only for setting historical opening balances when you first set up an account. It’s a setup tool, not a reconciliation crutch to fix month-end differences.


6. Verify Positions and Prices for Investments

To get an accurate view of your net worth, you need up-to-date market values for your investments and foreign currencies. Use Beancount’s price directive to record these values as of your closing date.

2025-08-31 price VTI  290.14 USD
2025-08-31 price EUR 1.11 USD

Many tools can fetch these prices for you automatically. After updating them, re-run your balance sheet or net worth reports to see the valuation changes.


7. Attach Receipts and Source Documents

Maintain a clean audit trail by linking transactions to their source documents. Use the documents option in your main Beancount file to point to your archive of receipts and invoices.

option "documents" "/path/to/Finance/Documents"

If you name your files by date (e.g., 2025-08-13.vendor.receipt.pdf), Beancount and Fava can automatically discover and link them, making it easy to pull up a receipt for any transaction with a single click.


8. Review the Month with Fava and BQL

A fast feedback loop is critical. Use Fava to visually inspect your finances. Its charts and reports are perfect for slicing expenses by category, checking income trends, and spotting anomalies at a glance.

For more precise checks, use the Beancount Query Language (BQL). This query, for example, gives you a ranked breakdown of all expenses for August 2025:

SELECT
account,
ROUND(SUM(position), 2) AS total
WHERE
date >= 2025-08-01 AND date < 2025-09-01
AND account ~ 'Expenses'
GROUP BY
account
ORDER BY
total DESC;

9. Post Accruals and Adjustments

If you use accrual accounting, record your month-end adjustments as explicit, dated transactions. This can include accrued expenses (like a utility bill you haven't received yet), prepaid expense amortization, or revenue recognition. Keep them simple and well-documented in the narration so they are easy to understand during future reviews.


10. Validate, Tag, and Archive

Before you finalize the month, run a final check for structural integrity:

bean-check your-ledger.beancount

This command will catch imbalances, references to accounts you haven't opened, and other common errors. Fix anything it flags.

Once everything is correct, commit your changes to version control (like Git) with a clear message and tag, such as close-2025-08. Finally, archive your bank statements and consider the month locked.


A Simple Close Script You Can Adapt

You can automate most of these steps with a simple shell script. This turns your close into a single, repeatable command.

#!/usr/bin/env bash
set -euo pipefail

# Example: ./close.sh 2025-08
MONTH=${1:?Please provide a month in YYYY-MM format}
LEDGER=~/finance/ledger.beancount

# 1. Import new transactions
echo "Importing transactions for $MONTH..."
make import MONTH="$MONTH"

# 2. Update market prices for the last day of the month
PRICE_DATE=$(date -d "$MONTH-01 +1 month -1 day" +%F)
echo "Fetching prices for $PRICE_DATE..."
make prices DATE="$PRICE_DATE"

# 3. Validate the entire ledger
echo "Running bean-check..."
bean-check "$LEDGER"

# 4. Generate a key report (e.g., expense breakdown)
echo "Generating expense report for $MONTH..."
bean-query "$LEDGER" -f txt "
SELECT account, SUM(position)
WHERE date >= '${MONTH}-01' AND date < '${MONTH}-01' + 1 month
AND account ~ 'Expenses'
GROUP BY account ORDER BY SUM(position) DESC;
" > "reports/${MONTH}-expenses.txt"

# 5. Commit and tag the close in Git
echo "Committing and tagging the close..."
git -C ~/finance add .
git -C ~/finance commit -m "Close ${MONTH}"
git -C ~/finance tag "close-${MONTH}"

echo "Month ${MONTH} is closed and tagged."

Why This Works

This process is fast and reliable because it’s built on a few core principles:

  • Assertions, not Eyeballs: The balance directive turns reconciliation into a precise, automated check.
  • Deterministic Inputs: Automated importers and normalized metadata make your ledger reproducible and consistent.
  • Explorable Data: Fava and BQL provide powerful tools to validate results and drill into outliers instantly.
  • Auditable Changes: Adjustments are plain-text journal entries, making them easy to review and understand months or years later.

A good month-end is mostly logistics. With Beancount, you can turn it into a short, scriptable ritual: import, assert, price, query, and commit. Keep the workflow stable, and your close will stay fast—even as your financial life grows more complex.

The 7 Best Small-Business Banking Options in 2025

· 10 min read
Mike Thrift
Mike Thrift
Marketing Manager

Choosing where your company keeps—and moves—its money affects everything from fees to cash-flow visibility. The right account can save you hundreds in fees, earn you interest on idle cash, and simplify your bookkeeping. The wrong one can be a constant source of friction.

The good news: 2025 gives small businesses a deep bench of choices, from nationwide branch banks to modern banking platforms with powerful software layers. Below are seven standout options, each “best for” a different kind of business. Rates and terms change, so use this as a decision guide and confirm the details before you open an account.

2025-08-26-7-best-small-business-banking-options-in-2025

TL;DR — Our Top Picks by Scenario

How We Chose These Accounts

To find the best options, we focused on the features that matter most to small business owners. We analyzed total cost (including monthly fees and how to waive them), access to cash via branches and ATMs, built-in cash-flow management tools, and the potential to earn a yield on idle cash. We specifically looked at how well each account fits different business models, from cash-heavy retail stores to online SaaS companies.

The Short List: A Closer Look

<a name="chase"></a>Chase Business Complete Banking — Best for Deposit-Heavy, Branch-First Businesses

Why it stands out: With a massive network of over 5,000 branches and 15,000 ATMs, Chase provides unparalleled in-person access for businesses that handle frequent cash deposits or require face-to-face support. The account's standard $15 monthly fee is straightforward to waive by meeting requirements like maintaining a $2,000 minimum daily balance. A unique feature is the built-in QuickAccept card reader, which allows for same-day funding on eligible transactions, a major plus for managing daily cash flow.

Keep in mind: Like most traditional banks, Chase has a fee schedule for services like wire transfers and excess cash deposits. Before opening an account, review your typical monthly activity and compare it against their fee structure to avoid surprises.

<a name="bank-of-america"></a>Bank of America Business Advantage — Best for Big-Bank Tools & an Upgrade Path

Why it stands out: Bank of America offers a tiered system that can grow with your business. The Business Advantage Fundamentals account starts with a promotional $0 monthly fee for the first year (then $16), which can be waived by meeting criteria like a $5,000 combined average monthly balance. As your business grows, you can move to the Relationship tier, which offers more no-fee services (like incoming wires) for higher balances. All tiers include access to a helpful cash-flow dashboard, QuickBooks integration, and a digital debit card you can use immediately.

Keep in mind: The monthly fee can be a drag if you don't consistently meet the waiver criteria. Be realistic about your typical balances and transaction volume to ensure you're in the right tier.

<a name="bluevine"></a>Bluevine Business Checking — Best for High APY on Checking

Why it stands out: Bluevine challenges the idea that checking accounts don't earn interest. Eligible customers can earn a highly competitive Annual Percentage Yield (APY), with rates around $1.5% - 3.7%~APY depending on the plan and meeting certain activity qualifiers. It’s a powerful way to make your operational cash work for you. The account has no monthly fees and comes with a solid toolkit for payments, including ACH, wires, and invoicing.

Keep in mind: Bluevine is an online platform. While you can deposit cash, it's done through third-party networks like Allpoint+ ATMs and Green Dot retailers, which typically charge a fee (e.g., up to $4.95 per deposit). If your business handles a lot of physical cash, these fees could offset the interest earned.

<a name="mercury"></a>Mercury — Best for Startups that Want a Modern Finance Stack

Why it stands out: Mercury is built for tech-savvy startups. It's a financial technology company (not a bank) that provides banking services through its FDIC-insured partner banks. It offers a powerful, developer-friendly platform with no monthly fees, granular user controls, and robust payment APIs. For businesses with significant cash on hand, Mercury offers up to $5 million in FDIC insurance eligibility through partner-bank sweep networks and Mercury Treasury, an option to invest idle cash into low-risk money market funds and T-bills, advertising yields up to ~4.26%~APY.

Keep in mind: Mercury Treasury is an investment account, not a bank account, meaning it is SIPC-protected but subject to market risk. Also, as a platform that relies on partner banks, the specifics of international payments and foreign exchange can vary, so read the fine print if you operate globally.

<a name="relay"></a>Relay — Best for "Profit First" Envelopes, Sub-Accounts, and Spend Controls

Why it stands out: Relay is designed for business owners who want precise control over their finances. Like Mercury, it's a financial technology company with banking services provided by an FDIC-insured partner bank. Its standout feature is the ability to create up to 20 individual checking accounts to manage different budget categories (à la the "Profit First" method) and issue up to 50 virtual or physical debit cards with custom spending limits. It also offers a competitive savings APY on its paid plans, with tiers reaching up to ~3.03%~APY.

Keep in mind: As a software-first platform, handling physical cash is more complex than with a traditional bank. If your business model relies on frequent cash deposits, be sure to confirm that Relay's cash-in workflows fit your needs.

<a name="axos"></a>Axos Basic Business Checking — Best for Fee-Free, ATM-Friendly Online Banking

Why it stands out: Axos Bank delivers a truly fee-conscious online banking experience. The Basic Business Checking account has no monthly maintenance fees and no transaction limits. Its most compelling feature is unlimited domestic ATM fee reimbursements, which is a rare and valuable perk for an online bank, giving you the freedom to withdraw cash from any ATM nationwide without penalty.

Keep in mind: Axos is a fully digital bank with no physical branches. If you need to deposit large amounts of physical cash or require in-person teller services, you will likely need to pair it with an account at a traditional brick-and-mortar bank.

<a name="american-express"></a>American Express® Business Checking — Best for No Monthly Fee + Stable APY

Why it stands out: For businesses already in the American Express ecosystem, this checking account is a natural fit. It features no monthly service fees and offers a respectable APY (commonly reported around ~1.30%~APY in 2025) on balances up to $500,000. The account integrates seamlessly with AmEx charge and credit cards, making it easy to manage payments and rewards in one place.

Keep in mind: This is an online-first account. While excellent for digital transactions, businesses that are cash-heavy or need frequent in-person banking services should consider maintaining a relationship with a local branch bank as well.

Quick Chooser: Match the Account to Your Business

  • For retailers, restaurants, and trades with weekly cash deposits: Start with Chase or Bank of America for their extensive branch networks and straightforward fee waiver options.

  • For online-first businesses (SaaS/e-commerce), distributed teams, or those with rigorous spending policies: Look at Mercury for its software-centric controls and Treasury yield option, or Relay for its powerful multi-account envelope budgeting.

  • For making idle cash work without friction: Consider Bluevine for its high APY on checking balances or Mercury Treasury for sweeping larger sums into investment-grade funds (note the investment risk).

  • For frequent ATM users who hate fees: Axos is the clear winner with its unlimited domestic ATM fee reimbursements.

  • For businesses with heavy AmEx card usage seeking a simple, steady APY: The American Express Business Checking account is a logical and rewarding choice.

Frequently Asked Questions

Are Mercury and Relay “banks”?

No. Both are financial technology companies that partner with FDIC-insured banks (like Thread Bank for Relay) to provide banking services. Your deposits are held at these partner banks and may be distributed across a "sweep network" of other banks to provide increased FDIC coverage, often up to several million dollars.

Can I earn interest on a business checking account?

Yes, absolutely. Several modern options now offer competitive yields. For instance, Bluevine advertises rates from ~1.5% to 3.7%~APY on checking for eligible customers, and Relay offers a savings APY up to ~3.03%~APY on certain plans. These rates are variable and can change with the market.

We handle lots of cash. Will an online-only account work?

It can, but it comes with trade-offs. You should expect to pay per-deposit fees or take extra steps. For example, Bluevine uses the Green Dot network for cash deposits, which typically involves a retail service fee. If cash is a core part of your operations, a traditional branch bank like Chase is often simpler and more cost-effective.

The Bottom Line

There’s no single “best” small-business account—there’s only the best fit for your unique mix of deposits, payments, balances, and team workflow. If you need a simple rule of thumb for 2025:

  • Consider a hybrid approach: Pair a branch account (like Chase or Bank of America) for cash and in-person needs with a software-first account (like Mercury or Relay) for superior digital controls and yield.
  • Revisit your setup periodically: APYs, fees, and waiver rules change. A quick review once or twice a year can ensure you're still in the best possible account for your business.

Accuracy note: Fees, features, APYs, and availability are accurate as of September 3, 2025, per each provider’s disclosures and product pages. Always confirm current terms directly with the financial institution before opening or switching accounts.

Sources (Selected): Chase, Bank of America, Bluevine, Mercury, Relay, Axos Bank, Business Insider, American Express.

If you want, tell me your location, typical monthly balance, cash vs. card sales ratio, and expected wire/ACH volume. I can tailor this list to a single “best match” for your business.

Recording Taxes in Beancount (The Pragmatic Way)

· 8 min read
Mike Thrift
Mike Thrift
Marketing Manager

Taxes can feel like a special, complicated beast in the world of personal finance. But what if they weren't? What if you could treat them just like any other flow of money in your ledger? Good news: you can. By treating taxes as simple movements of value, your Beancount ledger will stay clean, easy to query, and—most importantly—understandable.

Below is a practical, no-nonsense pattern you can drop into a personal or small-business Beancount file. It’s a simple system for handling paychecks, tax payments, and even those pesky refunds that cross over into the new year. We'll cover the essential accounts you need, walk through real-world examples, and show you the exact queries to run to get the answers you need.

2025-08-25-recording-taxes-in-beancount


The Core Principles

Before we dive into the code, let's agree on a few simple rules. These principles keep things logical and prevent future headaches.

  • Separate "what it is" from "when the cash moves." 🗓️ This is the most important concept. A tax expense belongs to the year you earned the income (e.g., 2024), even if you settle the bill with the IRS in April 2025. If you don't separate the timing of the expense from the timing of the cash payment, your year-over-year reports will get messy and misleading.

  • Keep your account hierarchy boring and simple. 📁 Name your accounts clearly based on the type of tax (e.g., IncomeTax, SocialSecurity). This makes your queries incredibly simple. Don't clutter account names with vendor names or form numbers like "W-2" or "1099"; use metadata and tags for those details instead.

  • Embrace accrual for year-end adjustments. ⚖️ Even for a personal ledger, using a simple accrual entry at year-end is the cleanest way to make your reports accurate. It means recognizing an expense or refund in the correct year, even if the money doesn't move until the next. It’s one small extra step that saves you from mental gymnastics later.

  • Write for your future self. 🧠 Your goal is clarity. Only add extra details, like the tax year, to an account name if it genuinely makes your queries easier. Avoid creating a new set of accounts every single year (Expenses:Taxes:2024:Federal, Expenses:Taxes:2025:Federal, etc.) unless you have a compelling reason. A flat structure is often easier to manage.


A Minimal Account Skeleton

Here’s a basic set of accounts to get you started. This structure is US-centric, but you can easily adapt the names for your own country's tax system. Just drop these open directives into your Beancount file.

; --- US Federal Income & Payroll Taxes ---
; For money withheld from your paycheck
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Withheld USD
; For estimated payments or tax-day bills you pay directly
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Payments USD
; For tax refunds you receive
2024-01-01 open Expenses:Taxes:Federal:IncomeTax:Refunds USD

; Your FICA contributions
2024-01-01 open Expenses:Taxes:Federal:SocialSecurity USD
2024-01-01 open Expenses:Taxes:Federal:Medicare USD

; --- Other Common Taxes ---
; For sales/use taxes you pay on purchases
2024-01-01 open Expenses:Taxes:Sales USD

; --- Accounts for Year-End Adjustments (Optional but Recommended!) ---
; A temporary holding account for taxes you owe but haven't paid yet
2024-01-01 open Liabilities:AccruedTaxes:Federal:Income USD
; A temporary holding account for a refund you're owed but haven't received
2024-01-01 open Assets:Tax:Receivable USD

This setup separates withheld taxes from direct payments and refunds, making it easy to see exactly where your money went. The Liabilities and Assets accounts are our secret weapon for keeping year-end reporting accurate.


Example 1: The Paycheck

Let's book a typical paycheck where taxes are withheld automatically. The key is to record your gross pay first, then show how it was split between taxes and the cash that actually landed in your bank account.

2025-07-15 * "Employer Inc." "Salary for first half of July"
Income:Work:Salary -6,000.00 USD
Expenses:Taxes:Federal:IncomeTax:Withheld 1,200.00 USD
Expenses:Taxes:Federal:SocialSecurity 372.00 USD
Expenses:Taxes:Federal:Medicare 87.00 USD
Assets:Cash:Checking 4,341.00 USD

This single transaction tells the whole story:

  • You earned $6,000 in gross income.
  • $1,200 of it was sent to the IRS for federal income tax.
  • 372wenttoSocialSecurityand372 went to Social Security and 87 to Medicare.
  • The remaining $4,341 is what you took home.

Pro-tip: You can attach metadata from your pay stub (like pay_period_end: "2025-07-15") to the transaction for an easy audit trail.


Example 2: Filing Your Return (The Year-Crossing Problem)

Here's the scenario that trips people up: It's April 2025, and you're filing your 2024 taxes. You learn that after all your withholding, you still owe an extra $3,000.

How do you record this? You want the expense to count toward 2024, but the cash payment happens in 2025. Here are two excellent ways to handle it.

Option A: The Manual Two-Step Accrual

This method is pure Beancount, no plugins required. It's a clear, two-step process.

Step 1: Recognize the expense at the end of the tax year. On the last day of 2024, you create a "true-up" entry. No cash is moving yet; you're just acknowledging the expense and parking it in a temporary liability account.

2024-12-31 * "Federal income tax true-up for 2024"
Expenses:Taxes:Federal:IncomeTax:Payments 3,000.00 USD
Liabilities:AccruedTaxes:Federal:Income -3,000.00 USD

Now, your 2024 income statement correctly shows this $3,000 expense.

Step 2: Record the cash payment when it happens. In April 2025, when you actually send the money to the IRS, you clear out the liability.

2025-04-15 * "IRS" "Payment for 2024 tax return"
Liabilities:AccruedTaxes:Federal:Income 3,000.00 USD
Assets:Cash:Checking -3,000.00 USD

Your 2024 reports are correct, and your 2025 cash flow is correct. Perfect! This same pattern works in reverse for a refund—just use Assets:Tax:Receivable instead of the liability account.

Option B: Automate It with a Plugin

If you prefer to keep the payment in a single transaction, a fantastic community plugin called beancount_reds_plugins.effective_date can help. It lets you assign a different "effective date" to a single line item.

First, enable the plugin in your main Beancount file: plugin "beancount_reds_plugins.effective_date"

Now, you can write a single transaction. The plugin will automatically split it behind the scenes to make your reports accurate.

; One entry; the plugin handles the rest
2025-04-15 * "IRS" "Payment for 2024 tax return"
Assets:Cash:Checking -3,000.00 USD
Expenses:Taxes:Federal:IncomeTax:Payments 3,000.00 USD
effective_date: 2024-12-31

Here, the cash portion is recorded on April 15, 2025, but the expense portion is retroactively applied to December 31, 2024. It achieves the same result as Option A with a different workflow.


What About Sales Tax?

For most personal ledgers, sales tax is simple. If you're not claiming it back, just split it out as its own expense during a purchase.

2025-07-19 * "Local Grocery Store"
Expenses:Groceries 12.32 USD
Expenses:Taxes:Sales 1.28 USD
Assets:Cash:Checking -13.60 USD

This lets you easily track how much you're spending on sales tax over the year. If you run a business that deals with VAT, you'd use a more formal system with payable and receivable accounts, but the principle is the same.


Queries You'll Actually Run

The whole point of this structure is to make getting answers easy. Here are some BQL queries to see your tax picture.

1. What was my total federal income tax for 2024?

SELECT cost(sum(position))
WHERE account ~ "Expenses:Taxes:Federal:IncomeTax"
AND date >= 2024-01-01 AND date < 2025-01-01;

2. How did that total break down between withholding, payments, and refunds?

SELECT account, cost(sum(position))
WHERE account ~ "Expenses:Taxes:Federal:IncomeTax"
AND date >= 2024-01-01 AND date < 2025-01-01
GROUP BY account
ORDER BY account;

3. Do I have any outstanding tax debts or receivables? (Useful for checking your work!)

SELECT account, units(sum(position))
WHERE account ~ "Liabilities:AccruedTaxes" OR account ~ "Assets:Tax"
GROUP BY account
ORDER BY account;

If this query returns non-zero balances, it means you have accruals you haven't settled yet.


Quick FAQ

  • Do I really need per-year accounts like Expenses:Taxes:2024? Probably not. The accrual method (or the plugin) keeps a flat account structure clean and readable. Only create per-year accounts if you find it makes your specific queries easier to write.

  • Can Beancount calculate my taxes for me? Not directly, but it can prepare the data. Some advanced users write scripts to pipe BQL query results into tax calculation software, which is great for estimating your liability during the year.

  • Is this tax advice? No. This is a bookkeeping pattern for organizing your data. The accounting is sound, but you should always consult a tax professional for advice specific to your situation.


Your Drop-In Checklist

Ready to get started?

  1. Add the account skeleton to your Beancount file (and adapt names for your country).
  2. Book paychecks by starting with gross income and splitting out the tax postings.
  3. At year-end, accrue any true-ups for payments or refunds using a liability/asset account (or use the effective_date plugin).
  4. Track refunds as receivables and clear them when the cash arrives.
  5. Run the BQL queries above to verify your totals before you file.

Keep it boring, keep it consistent, and your tax season will finally feel like just another part of your financial story—not a mystery to be solved.

Accrued Expenses in Beancount: A Practical Guide (with copy-paste ledger examples)

· 8 min read
Mike Thrift
Mike Thrift
Marketing Manager

Accrued expenses sound abstract until month-end closes start piling up. They are a cornerstone of proper accrual accounting, ensuring your financial reports reflect economic reality, not just when cash changes hands. Here’s a clear, Beancount-first walkthrough of what they are, why they matter, and exactly how to book, reverse, and report them in your plain-text ledger.

TL;DR ⚡

  • Accrued expenses are costs you’ve incurred this period but haven’t paid yet. They are recorded as a liability until the cash goes out.
  • In Beancount, this is simple: you debit an Expenses: account and credit a Liabilities:Accrued: account. Later, you clear the liability when you pay.
  • To report, you can see what you owe as of a specific date by running a bean-query with CLOSE ON and CLEAR to get a clean balance-sheet snapshot.

2025-08-24-accrued-expenses-in-beancount-a-practical-guide

What is an Accrued Expense?

An accrued expense is a cost that a business has incurred, but has not yet paid. It's recorded when the service is received or the cost is incurred, even if the invoice hasn't arrived or the payment isn't due yet. This practice follows the matching principle of accrual accounting, which dictates that expenses should be recorded in the same period as the revenues they helped generate.

Common examples include:

  • Wages earned by employees at the end of a month but paid in the next.
  • Utilities (electricity, water) you used in December but won't be billed for until January.
  • Interest on a loan that has accumulated over the month but has not yet been withdrawn from your account.

By recording these costs when they happen, you get a much truer picture of your company's financial performance for that period.

How Beancount Thinks About It (in 30 seconds)

Beancount is a plain-text, double-entry accounting system. Everything is a dated directive or transaction in a text file. The system is built on five core account types: Assets, Liabilities, Equity, Income, and Expenses.

Entries are always ordered by date. A key detail is that balance assertions are checked before same-day transactions are processed. This is important to remember when you place checks and reversing entries.

Finally, the bean-query language provides a powerful, SQL-like way to generate reports. With operators like OPEN ON, CLOSE ON, and CLEAR, you can create precise "as-of" views for financial statements.

Your Chart of Accounts (Suggested)

A clean, hierarchical chart of accounts is your best friend. For accrued expenses, the structure is straightforward. You'll need:

  • An expense account: e.g., Expenses:Utilities, Expenses:Payroll:Wages
  • A corresponding liability account: e.g., Liabilities:Accrued:Utilities, Liabilities:Accrued:Payroll
  • Your cash account: e.g., Assets:Bank:Checking

Beancount enforces the five top-level account types. Keeping your account names organized makes querying and reporting much easier down the road.

The Core Pattern (No Plugin, No Magic)

This is the most direct way to handle accruals in Beancount. It involves two steps: accruing the expense at month-end and clearing the liability when you pay.

Step 1: Accrue the Expense at Month-End

On the last day of the period, you record the expense and create the liability.

2025-02-28 * "Accrue February electricity" #accrual
Expenses:Utilities 120.00 USD
Liabilities:Accrued:Utilities

Step 2: Clear the Accrual When You Pay

When the bill comes and you pay it, you don't hit the expense account again. Instead, you debit the liability account to clear it out.

2025-03-05 * "Pay Feb electricity - City Power"
Liabilities:Accrued:Utilities 120.00 USD
Assets:Bank:Checking

This is the cleanest approach for small teams. It correctly places the expense in February and ensures you don't double-count it in March. Notice that in Beancount, leaving one amount blank lets the system balance the transaction for you automatically.

Alternative: Reversing Entry on Day 1

If you prefer the classic "auto-reverse" accounting style, you can post the opposite of your accrual entry on the first day of the next month. Then, you book the actual vendor bill to the expense account as you normally would.

Step 1: Accrue at Month-End (Same as before)

2025-02-28 * "Accrue February electricity" #accrual
Expenses:Utilities 120.00 USD
Liabilities:Accrued:Utilities

Step 2: Reverse on the First Day of the Next Month

2025-03-01 * "Reverse Feb electricity accrual" #reversal
Liabilities:Accrued:Utilities 120.00 USD
Expenses:Utilities

Step 3: Book the Payment as Usual

2025-03-05 * "City Power - February bill"
Expenses:Utilities 120.00 USD
Assets:Bank:Checking

Heads-up on checks: Remember that balance assertions evaluate before same-day transactions. If you want to check your Liabilities:Accrued:Utilities account balance, place the assertion on 2025-02-28 to confirm the accrual or on 2025-03-01 after the reversal transaction to confirm it's zero. Placing it before the reversal on 2025-03-01 will cause a false failure.

Six Common Accruals (Copy-Paste Patterns) 📋

Here are some ready-to-use examples for common business accruals.

1. Rent Not Yet Invoiced

2025-01-31 * "Accrue January rent" #accrual
Expenses:Rent 3000.00 USD
Liabilities:Accrued:Rent

2. Wages Earned but Unpaid

2025-03-31 * "Accrue March wages" #accrual
Expenses:Payroll:Wages 8500.00 USD
Liabilities:Accrued:Payroll

3. Vacation Pay (PTO) Earned

2025-03-31 * "Accrue PTO earned in March" #accrual
Expenses:Payroll:PTO 900.00 USD
Liabilities:Accrued:Payroll

4. Interest Accrued on a Loan

2025-02-29 * "Accrue monthly loan interest" #accrual
Expenses:Interest 210.00 USD
Liabilities:Accrued:Interest

5. Professional Fees (Audit/Legal)

2025-12-31 * "Accrue year-end audit fees" #accrual
Expenses:Professional:Audit 4200.00 USD
Liabilities:Accrued:Professional

6. Utilities Used but Not Billed

2025-04-30 * "Accrue April utilities" #accrual
Expenses:Utilities 95.00 USD
Liabilities:Accrued:Utilities

Reporting: "What do I owe as of a certain date?"

bean-query is your tool for getting answers. Here’s how you can get a proper balance sheet snapshot of your accrued expenses.

Get All Accrued Liability Balances at Period-End

This query gives you the balance of each accrued liability account as of March 31, 2025.

bean-query main.beancount '
SELECT account, UNITS(SUM(position)) AS balance
FROM OPEN ON 2025-01-01 CLOSE ON 2025-04-01 CLEAR
WHERE account ~ "^Liabilities:Accrued"
GROUP BY 1
ORDER BY 1;
'
  • OPEN ON sets starting balances at the period start.
  • CLOSE ON truncates transactions before this date (it's exclusive). That's why we use 2025-04-01 to get data up to and including 2025-03-31.
  • CLEAR zeroes out Income and Expenses, giving you a clean balance sheet view (Assets, Liabilities, Equity).

See a Register of All Accrual Postings

If you want to see the raw transaction history for your accrual accounts:

bean-query main.beancount '
SELECT date, payee, narration, position
WHERE account ~ "^Liabilities:Accrued"
ORDER BY date;
'

Get a Single Total for All Accruals

For a quick summary of the total amount you owe:

bean-query main.beancount '
SELECT UNITS(SUM(position)) AS total_accruals
FROM OPEN ON 2025-01-01 CLOSE ON 2025-04-01 CLEAR
WHERE account ~ "^Liabilities:Accrued";
'

Controls & "Gotchas" Specific to Beancount

  • Balance Assertions Timing: As mentioned, assertions check the balance at the start of the day. 2025-03-01 balance ... runs before any transactions on 2025-03-01. Plan accordingly.
  • Naming and Hierarchy: A tidy tree like Liabilities:Accrued:* is not just for looks. It makes your queries simpler and your reports instantly understandable.
  • Pad with Caution: The pad directive can fix opening balances, but avoid using it to "fix" recurring accruals. Making explicit entries provides a clear audit trail.
  • As-Of Reporting: For balance-sheet snapshots, always prefer OPEN ... CLOSE ... CLEAR in bean-query. This prevents income and expense accounts from polluting your liability totals.

Prepaid vs. Accrued (Quick Contrast)

It's easy to mix these up. They are mirror images:

  • Accrued Expense: Service consumed now, cash paid later. This creates a liability.
  • Prepaid Expense: Cash paid now, service consumed later. This creates an asset.

The accounting logic is the same in Beancount; only the accounts differ (Assets:Prepaid:* vs. Liabilities:Accrued:*).

Drop-in Template (Start of File)

Here are the open directives you'd need for the examples used in this post. Add these to the top of your ledger file once.

; --- Accounts (open once) ---
2025-01-01 open Assets:Bank:Checking
2025-01-01 open Expenses:Utilities
2025-01-01 open Expenses:Payroll:Wages
2025-01-01 open Expenses:Interest
2025-01-01 open Expenses:Professional:Audit
2025-01-01 open Liabilities:Accrued:Utilities
2025-01-01 open Liabilities:Accrued:Payroll
2025-01-01 open Liabilities:Accrued:Interest
2025-01-01 open Liabilities:Accrued:Professional

Final Notes

If you run your books on a cash basis, you won’t post accruals at all—expenses are simply recorded when they are paid. If you run on an accrual basis, using the patterns above is essential for matching costs to the period where you consumed the service.

The examples here provide general educational guidance. Always consult your CPA for industry-specific treatments, especially regarding bonuses, payroll taxes, and capitalization thresholds.

Accumulated Depreciation (for Beancount): A Practical, Plain‑Text Guide

· 10 min read
Mike Thrift
Mike Thrift
Marketing Manager

If you track fixed assets in your accounting—laptops, cameras, machinery, or even office furniture—your books need to reflect their declining value. This involves two key concepts: depreciation (the expense) and its running total, accumulated depreciation. This guide explains both in plain language and then shows you exactly how to model them in Beancount with copy-pasteable examples, including powerful automation options.


2025-08-23-accumulated-depreciation

What is accumulated depreciation?

Accumulated depreciation is the total amount of depreciation that has been recorded against an asset since the day it was put into service. Think of it as a running tally. It’s not a new kind of expense—it's just the to-date sum of all past depreciation charges for that asset.

In financial statements, you’ll see accumulated depreciation paired with the asset’s original price. This allows anyone reading your books to see both the historical cost (what you paid for it) and the net book value (what it's currently worth on your books).

A crucial detail is that accumulated depreciation is a contra-asset account. This might sound complex, but it's a simple idea:

  • It's an "asset" account, so it lives in the Assets section of your chart of accounts.
  • However, it carries a credit balance (a negative value in Beancount's asset accounts), which reduces the value of the related fixed asset.

Where does it appear on the balance sheet?

Accumulated depreciation typically appears on the balance sheet directly underneath the fixed asset it relates to. For example:

Equipment: Computers$3,000.00
Less: Accumulated Depreciation($1,000.00)
Equipment: Computers, Net$2,000.00

Many financial statements simplify this by showing a single line item like “Property, plant & equipment, net”. This single number represents the total historical cost of all assets minus their total accumulated depreciation, giving you the final net book value.


How do you calculate depreciation?

There are several methods for calculating depreciation. The one you choose determines how much expense you record each period, which in turn adds to the accumulated depreciation total. Two common families of methods are:

  • Straight-Line (SL): This is the simplest and most common method for bookkeeping purposes. You expense an equal amount of the asset's value in each period of its useful life. For example, a 3,000laptopwitha36month(3year)usefullifewouldbedepreciatedat3,000 laptop with a 36-month (3-year) useful life would be depreciated at 83.33 per month.
  • Tax Methods (e.g., MACRS in the U.S.): For tax purposes, governments often define specific accelerated schedules. In the U.S., the Modified Accelerated Cost Recovery System (MACRS) allows you to take larger depreciation deductions in the earlier years of an asset's life. Beancount can easily handle these schedules—you just need to calculate the amounts according to the official tables (like those in IRS Publication 946) and generate the corresponding journal entries.

Formula (Straight-Line)

Periodic Depreciation = fractextCosttextSalvageValuetextUsefulLife\\frac{\\text{Cost} - \\text{Salvage Value}}{\\text{Useful Life}}

Accumulated Depreciation (at date t) = sum(textPeriodicDepreciationuptot)\\sum (\\text{Periodic Depreciation up to } t)

Salvage value is the estimated residual value of an asset at the end of its useful life. For simplicity, it's often assumed to be zero.


The Beancount Way: Model Cost and Accumulated Depreciation

To properly track fixed assets in Beancount while preserving their original cost, you’ll use a pair of asset accounts for each category, plus an expense account.

  • Assets:Equipment:Computers:Cost (to hold the historical cost)
  • Assets:Equipment:Computers:AccumDep (the contra-asset, which will be credited over time)
  • Expenses:Depreciation:Computers (to record the periodic expense)

This structure mirrors standard accounting practice and is the recommended approach for managing fixed-asset depreciation in Beancount.


Option A: Manual Straight-Line Entries

This is the most direct method. You control every entry, which is great for understanding the mechanics.

1. Open the necessary accounts

2025-01-01 open Assets:Bank:Checking
2025-01-01 open Assets:Equipment:Computers:Cost
2025-01-01 open Assets:Equipment:Computers:AccumDep
2025-01-01 open Expenses:Depreciation:Computers

2. Record the purchase (at historical cost)

When you buy the asset, you debit the Cost account.

2025-01-20 * "Purchase MacBook Pro"
Assets:Equipment:Computers:Cost 3000.00 USD
Assets:Bank:Checking -3000.00 USD

3. Record monthly depreciation

Each month, you'll record the depreciation expense. For a 3,000assetover36months,themonthlydepreciationis3,000 asset over 36 months, the monthly depreciation is 3000 \div 36 = 83.3383.33.

The transaction involves debiting the expense account and crediting the contra-asset account.

2025-02-28 * "Monthly depreciation - MacBook Pro (SL 36mo)"
Expenses:Depreciation:Computers 83.33 USD
Assets:Equipment:Computers:AccumDep -83.33 USD ; This is the credit to the contra-asset

You would repeat this entry every month for 36 months. The balance in Assets:Equipment:Computers:AccumDep will grow more negative over time, reducing the asset's net book value.

Quick Check: You can easily check the net book value in Fava's Balance Sheet or by running a quick query:

bean-query myledger.bean "SELECT account, SUM(position) WHERE account ~ 'Assets:Equipment:Computers:(Cost|AccumDep)' GROUP BY account"

The sum of the balances of these two accounts is your net book value.


Option B: Automate with Fava’s amortize Plugin

If you use Fava (the popular web interface for Beancount) and your depreciation is a fixed amount each month, you can automate it.

First, enable the plugin at the top of your Beancount file:

plugin "fava.plugins.amortize_over"

Next, create a single transaction that defines the entire depreciation schedule.

; 1. Record the initial purchase as usual
2025-01-20 * "Purchase MacBook Pro"
Assets:Equipment:Computers:Cost 3000.00 USD
Assets:Bank:Checking -3000.00 USD

; 2. Set up the depreciation schedule
2025-01-20 * "Depreciation schedule - MacBook Pro"
amortize_months: 36
Expenses:Depreciation:Computers 3000.00 USD
Assets:Equipment:Computers:AccumDep -3000.00 USD

The plugin will see this transaction and automatically generate virtual postings for $83.33 each month for 36 months. These entries don't get written to your .bean file but appear in all reports. This is perfect for straight-line depreciation but won't work for irregular schedules like MACRS.


Option C: Generate Periodic Entries with a Third-Party Plugin

If you prefer to have real, non-virtual transactions written into your files but still want automation, a periodic entry generator is a great choice. One of the most popular is beancount-periodic by Dallas Lu. This plugin can be configured to create dated postings on your behalf, giving you the control of manual entries with the convenience of automation.


Viewing Results: Cost, Accumulated Depreciation, and Net Book Value

No matter which method you choose, your Balance Sheet will show both the Cost and AccumDep accounts under your Assets. The sum of these two is your net book value. This presentation—showing the gross cost less the accumulated depreciation—is exactly what accountants and financial analysts expect to see. It provides full transparency into the age and value of your assets.


Disposing of an Asset (Sell, Scrap, or Retire)

When an asset reaches the end of its life, you either sell it, scrap it, or retire it. To remove it from your books, you must:

  1. Remove its historical cost.
  2. Remove its associated accumulated depreciation.
  3. Record any cash received.
  4. Record any resulting gain or loss (the difference between cash received and the net book value).

Example: Selling an Asset for a Gain

Let's say you sell the MacBook Pro on June 15, 2027.

  • Original Cost: $3,000
  • Accumulated Depreciation at time of sale: -$2,500
  • Net Book Value: 3,0003,000 - 2,500 = $500
  • You sell it for: $800
  • Gain on Sale: 800(proceeds)800 (proceeds) - 500 (net book value) = $300

Here is the Beancount transaction to record the disposal:

2027-06-15 * "Sell MacBook Pro"
Assets:Bank:Checking 800.00 USD ; Cash received
Assets:Equipment:Computers:AccumDep 2500.00 USD ; Debit to zero out the contra-asset
Assets:Equipment:Computers:Cost -3000.00 USD ; Credit to remove the original cost
Income:Gains:AssetDisposals -300.00 USD ; Credit to record the gain

If the proceeds had been only 400(alossof400 (a loss of 100), you would post the difference to an Expenses:Losses:AssetDisposals account with a positive amount (a debit).


FAQ (Fast)

  • Is accumulated depreciation an asset or a liability? Neither. It’s a contra-asset. It's located in the assets section of your balance sheet but has a credit balance, which reduces the total asset value.

  • Do I ever post directly to the Cost account after purchase? Generally, no. The purpose of the contra-asset account is to preserve the original historical cost. All reductions in value due to depreciation should be posted to ...:AccumDep.

  • Can I use Beancount for MACRS (tax) schedules? Yes. You'll need to calculate the depreciation amounts for each period using the tables in IRS Publication 946. Then, you can record those amounts using manual entries or a periodic plugin. The Fava amortize plugin is not suitable for this, as MACRS amounts are not equal each month.

  • What about Section 179 expensing? Section 179 allows you to expense the full cost of qualifying property in the year you place it in service, instead of depreciating it over time. This is an election you make for tax purposes. In Beancount, this would simply be a debit to an expense account instead of a fixed asset account at the time of purchase.


Common Pitfalls (and How to Avoid Them)

  • Posting depreciation directly against the Cost account.
    • Fix: Always credit the ...:AccumDep contra-asset account. This preserves the historical cost, which is important for financial reporting.
  • Forgetting to remove Accumulated Depreciation on disposal.
    • Fix: When you sell or scrap an asset, your journal entry must include a debit to ...:AccumDep to clear its balance for that asset.
  • Mixing up bookkeeping and tax depreciation schedules.
    • Fix: Your internal management books often use straight-line for simplicity, while your tax filings may require MACRS. Keep these purposes separate and document your policy.
  • Expecting the Fava amortize plugin to handle non-equal schedules.
    • Fix: Remember that this plugin is designed only for equal monthly splits. For any other pattern, use manual postings or a more flexible periodic plugin.

Copy-Paste Template

Here is a complete template you can adapt for your own ledger.

option "title" "My Business Ledger"
plugin "fava.plugins.amortize_over" ; Remove if not using Fava automation

; --- Accounts ---
2025-01-01 open Assets:Bank:Checking
2025-01-01 open Assets:Equipment:Computers:Cost
2025-01-01 open Assets:Equipment:Computers:AccumDep
2025-01-01 open Expenses:Depreciation:Computers
2025-01-01 open Income:Gains:AssetDisposals
2025-01-01 open Expenses:Losses:AssetDisposals

; --- Purchase at historical cost ---
2025-01-20 * "Purchase MacBook Pro"
Assets:Equipment:Computers:Cost 3000.00 USD
Assets:Bank:Checking -3000.00 USD

; --- Choose ONE depreciation approach ---

; (A) Manual monthly posting
2025-02-28 * "Monthly depreciation - MacBook Pro (SL 36mo)"
Expenses:Depreciation:Computers 83.33 USD
Assets:Equipment:Computers:AccumDep -83.33 USD

; (B) Fava automation (for 36 equal monthly splits)
2025-01-20 * "Depreciation schedule - MacBook Pro"
amortize_months: 36
Expenses:Depreciation:Computers 3000.00 USD
Assets:Equipment:Computers:AccumDep -3000.00 USD

; --- Sale example (edit numbers for your actual sale) ---
2027-06-15 * "Sell MacBook Pro"
Assets:Bank:Checking 800.00 USD
Assets:Equipment:Computers:AccumDep 2500.00 USD
Assets:Equipment:Computers:Cost -3000.00 USD
Income:Gains:AssetDisposals -300.00 USD

TL;DR

  • Keep asset Cost and AccumDep in separate accounts to preserve historical cost.
  • Record depreciation with a debit to Expenses:Depreciation:... and a credit to Assets:...:AccumDep.
  • Automate equal monthly depreciation with the Fava amortize plugin or generate dated entries with a periodic plugin.
  • When disposing of an asset, you must remove both its Cost and its AccumDep from the books and record the resulting gain or loss.

Sources & Further Reading

Amazon Seller Fees (2025): What They Are—and How to Book Them in Beancount

· 9 min read
Mike Thrift
Mike Thrift
Marketing Manager

Selling on Amazon is a powerful way to reach millions of customers, but the platform's fee structure can feel like a maze. If you're an operator who values clean, auditable, double-entry books, tracking these costs accurately is non-negotiable. This guide breaks down Amazon's 2025 US marketplace fees and shows you exactly how to record them using the plain-text accounting tool, Beancount.

TL;DR ⚡

2025-08-21-amazon-seller-fees-2025

  • You’ll encounter a handful of recurring Amazon charges: Selling plan, Referral, Closing (media), FBA fulfillment & storage, Inbound placement, Low‑inventory‑level, Returns processing, Refund administration, and a High‑volume listing fee for very large catalogs.
  • Keep a separate Assets:Amazon:Clearing account. Book sales and fees there; when Amazon pays out, transfer the net to your bank. This makes reconciliation a breeze.
  • Track each SKU as its own commodity (e.g., SKU:WATER-BOTTLE) so Beancount can compute your Cost of Goods Sold (COGS) by lot automatically.
  • You can reconcile quickly by importing settlement or date-range reports and mapping Amazon’s “transaction types” directly to your Beancount expense accounts.

The Amazon Fee Map (US Marketplace)

Here’s a breakdown of the most common fees you'll see in 2025.

Selling Plan Fee

This is your basic subscription fee for accessing the marketplace.

  • Individual Plan: No monthly fee. Instead, you pay $0.99 for each item you sell.
  • Professional Plan: A flat $39.99 per month, which waives the per-item charge. This is the standard choice for any serious seller. All other selling fees apply on top of this.

Referral Fee

This is Amazon's commission for each sale.

It's a percentage of the item’s total sales price (including shipping and any gift wrapping). The rate depends entirely on the product category. Most categories fall in the 8–15% band, but some use tiered rates (e.g., 15% on the first $500 and 8% on the portion above that). Certain categories also have a minimum referral fee, often $0.30. Always check the current rate card for your specific category.

Closing Fee (Media Categories)

If you sell media items like Books, Music, Video, or DVDs, Amazon charges an additional flat $1.80 per-item closing fee.

FBA Fulfillment Fees

These are the per-unit pick, pack, and ship fees for using Fulfillment by Amazon (FBA). The cost varies based on the item's size and weight. Amazon updates these rate cards periodically. For 2025, non-peak rates reverted to 2024 non-peak levels on January 15, 2025. Always consult the current FBA rate card to find your product's exact size tier and associated fee.

Monthly Storage & Aged-Inventory Surcharge (FBA)

Amazon charges for the space your inventory occupies in their fulfillment centers.

  • Monthly Storage: Billed by the cubic foot.
  • Aged-Inventory Surcharge: An additional monthly fee assessed on inventory that has been sitting in a fulfillment center for too long. This stacks on top of the regular monthly storage fee.

Inbound Placement Service Fee (FBA)

This is a per-unit fee tied to how you send inventory to Amazon. It's designed to cover the costs of Amazon distributing your products across its fulfillment network. Certain programs, like "New Selection," may temporarily exempt new products up to set limits.

Low-Inventory-Level Fee (FBA)

This fee applies to standard-size products with consistently low inventory levels relative to customer demand. Amazon measures this with a metric called "historical days of supply." If your stock level for a popular item drops below the threshold (generally 28 days), this fee kicks in.

Returns Processing Fee (FBA)

For products in categories with higher-than-typical return rates (like apparel and shoes), Amazon can charge a returns processing fee on each customer return. Some "New Selection" units are waived from this fee up to a certain cap.

Refund Administration Fee

When you issue a customer a refund for an order, Amazon gives you back the referral fee you paid. However, they keep a portion of it as a processing fee. This is the lesser of $5.00 or 20% of the referral fee for that item.

High-Volume Listing Fee (Huge Catalogs)

This fee only affects sellers with massive catalogs. If you have more than 1.5 million active SKUs, Amazon charges a monthly fee of $0.001 per eligible SKU above that threshold.

Note: Rates and policies can differ by country, region, and category. Always review your local Seller Central help pages before booking.


How These Fees Show Up in Your Reports 🧾

You can find all this data in Seller Central. The two most useful reports for accounting are:

  1. Date Range Reports (Payments → Date Range Reports): These provide a summary of your income, expenses, taxes, and net transfers for a specific period. They are perfect for high-level ledger import and reconciliation.
  2. Settlement Files (e.g., Flat File V2): These files break down every single transaction, showing the fee type, order ID, amount, and date. This is the granular data you'll use to map everything correctly.

A Beancount-First Way to Record Amazon Activity

Here’s how to translate Amazon's complex world into clean, simple Beancount entries.

1. Set Up a Minimal Chart of Accounts

First, define the accounts you'll need. This simple structure covers everything.

; --- ASSETS ---
Assets:Amazon:Clearing ; Your Amazon "wallet"
Assets:Bank:Checking ; Where payouts land
Assets:Inventory:SKU:<code> ; One sub-account per SKU

; --- INCOME & COGS ---
Income:Sales:Amazon
Expenses:COGS:Inventory

; --- EXPENSES ---
Expenses:Marketplace:Amazon:Referral
Expenses:Marketplace:Amazon:FBAFulfillment
Expenses:Marketplace:Amazon:Storage:Monthly
Expenses:Marketplace:Amazon:Storage:Aged
Expenses:Marketplace:Amazon:InboundPlacement
Expenses:Marketplace:Amazon:LowInventoryLevel
Expenses:Marketplace:Amazon:ReturnsProcessing
Expenses:Marketplace:Amazon:Other ; For misc. fees

Beancount’s ability to track inventory lots and cost basis is a superpower. You'll "buy" inventory into Assets:Inventory:SKU:... with a cost {...}. When you sell, Beancount automatically calculates the Cost of Goods Sold.

2. Book Each Sale and Its Fees

Let's record a $30 FBA sale for SKU:WATER-BOTTLE. The referral fee is $4.50, FBA fulfillment is $4.24, and you incurred a $0.15 low-inventory fee. You originally purchased this unit for $5.00.

2025-02-10 * "Amazon Order 113-2233445-6677889" "WATER-BOTTLE"
Assets:Amazon:Clearing 21.11 USD
Income:Sales:Amazon -30.00 USD
Expenses:Marketplace:Amazon:Referral 4.50 USD
Expenses:Marketplace:Amazon:FBAFulfillment 4.24 USD
Expenses:Marketplace:Amazon:LowInventoryLevel 0.15 USD
Assets:Inventory:SKU:WATER-BOTTLE -1 SKU:WATER-BOTTLE {5.00 USD}
Expenses:COGS:Inventory 5.00 USD

Why it balances: The $30 sale is credited to Income. The fees ($4.50 + $4.24 + $0.15) and the COGS ($5.00) are debited to your expense accounts. The net cash from the sale, $21.11, is debited to your Assets:Amazon:Clearing account. The inventory asset is credited (reduced by one unit), and the corresponding cost is expensed.

3. Record the Payout

When Amazon disburses your funds, the transaction is simple. You're just moving money from your Amazon "wallet" to your actual bank account.

2025-02-15 * "Amazon Payments" "Settlement disbursement"
Assets:Bank:Checking 2,500.00 USD
Assets:Amazon:Clearing -2,500.00 USD

After each payout, your Assets:Amazon:Clearing account balance should trend back toward zero. Use your date-range report totals to spot any discrepancies.

4. Handle Storage, Aged Inventory, and Inbound Placement

These fees often appear as separate lines in your settlement reports. Book them as direct debits to your clearing account.

2025-03-15 * "Amazon FBA Storage Fees" "Monthly + aged inventory"
Expenses:Marketplace:Amazon:Storage:Monthly 125.40 USD
Expenses:Marketplace:Amazon:Storage:Aged 35.20 USD
Assets:Amazon:Clearing -160.60 USD

2025-03-20 * "FBA Inbound Placement Service" "Shipment split optimization"
Expenses:Marketplace:Amazon:InboundPlacement 62.00 USD
Assets:Amazon:Clearing -62.00 USD

5. Refunds & Returns

When a customer returns a product, you reverse the sale and the COGS, and account for any non-refundable fees. For this $30 sale, let's say Amazon keeps a $0.30 refund administration fee.

2025-03-02 * "Refund 113-2233445-6677889" "Refunded WATER-BOTTLE"
Assets:Amazon:Clearing -29.70 USD ; Net debit
Income:Sales:Amazon 30.00 USD ; Reverse the sale
Expenses:Marketplace:Amazon:Other 0.30 USD ; The refund admin fee
Assets:Inventory:SKU:WATER-BOTTLE 1 SKU:WATER-BOTTLE {5.00 USD}
Expenses:COGS:Inventory -5.00 USD ; Reverse the COGS

Here, you debit Income to reverse the revenue, and credit Expenses:COGS to reverse the cost. The inventory unit is added back to your asset account. The net effect on your Assets:Amazon:Clearing is the amount refunded to the customer.


Importing & Reconciling Quickly

The key to efficiency is mapping. Export a Date Range Report or a Flat File V2 settlement report from Seller Central. Then, create a simple mapping from Amazon's transaction-type column to your expense accounts:

  • OrderIncome:Sales:Amazon
  • CommissionExpenses:Marketplace:Amazon:Referral
  • FBA-fulfillment-feeExpenses:Marketplace:Amazon:FBAFulfillment
  • StorageFeeExpenses:Marketplace:Amazon:Storage:Monthly
  • AgedInventorySurchargeExpenses:Marketplace:Amazon:Storage:Aged
  • InboundPlacementFeeExpenses:Marketplace:Amazon:InboundPlacement
  • LowInventoryLevelFeeExpenses:Marketplace:Amazon:LowInventoryLevel

For those looking to automate, Beancount’s import ecosystem (like beancount-import) is fantastic. You define the rules once, and your settlement files can be ingested into your ledger automatically.


Practical Guardrails That Save Money (and Keystrokes) 💰

  • Avoid the Low-Inventory Fee: Watch your historical days of supply. Keep enough buffer stock to meet demand, but don't overdo it and trigger aged-inventory surcharges.
  • Use New Selection Benefits: When launching new products, enroll them in the New Selection program to get temporary waivers on returns processing and inbound placement fees.
  • Check Referral Rates Before Pricing: A small price change could push you over a fee threshold, significantly impacting your net margin. Confirm your category's referral rates and minimums.
  • Reconcile Monthly: Pull a Date Range Report every month. This simple habit helps you catch any fee changes from Amazon early and ensures your ledger remains trustworthy.

Ready-to-Use Beancount Template

To help you get started, I've prepared a starter ledger file. It includes:

  • A sensible Amazon chart of accounts.
  • Inventory configured as commodities for automatic, lot-based COGS.
  • Example entries for sales, fees, storage, refunds, and payouts.

➡️ Download the Template (Open the file in your editor, replace the sample SKU and amounts, and start importing settlement lines.)


References & Further Reading


One Last Tip

If you sell internationally, create marketplace-specific sub-accounts (e.g., Expenses:Marketplace:Amazon:Referral:US, ...:Referral:CA). Set your main operating_currency in Beancount to your home currency. Once your data is structured, Beancount's query language makes it trivial to analyze your fee mix by marketplace, category, or SKU.

Happy booking!

What is Accounts Payable? A Beancount-Friendly Guide for Tracking Vendor Bills in Plain Text

· 8 min read
Mike Thrift
Mike Thrift
Marketing Manager

Accounts payable (AP) is the money your business owes to its suppliers for goods or services you’ve already received but haven't paid for yet. In the world of accounting, AP is classified as a current liability on your balance sheet—an amount typically due within the next year, and often within 30 to 60 days.

This concept is central to accrual accounting, where you record the expense and the corresponding liability the moment a bill arrives, not when you actually send the cash. This guide will show you how to manage the entire AP workflow cleanly and efficiently using the plain-text accounting tool, Beancount.

2025-08-20-what-is-accounts-payable


Quick Summary

Before we dive into the details, let's cover the essentials:

  • Accounts Payable (AP) represents your short-term debts to vendors. You'll find it under the Liabilities section of your balance sheet.
  • Accrual vs. Cash: AP is a concept that exists only if you keep your books on an accrual basis. Beancount fully supports accrual workflows, and its web interface, Fava, will display your liabilities correctly.
  • AP vs. AR: It's simple: Payables are what you owe, while Receivables (AR) are what others owe you.

Where AP Lives in Beancount (and Fava)

To start tracking AP, you first need to declare an account for it in your ledger. A standard convention is:

Liabilities:AccountsPayable

You can optionally create subaccounts for major vendors (e.g., Liabilities:AccountsPayable:ForestPaintSupply).

In Fava, this account will appear on your Balance Sheet under Liabilities. You can click on it to drill down and see a list of all open and paid items, giving you a clear view of your obligations. You can even see this in action in Fava's public example ledger, which includes a Liabilities:AccountsPayable account.


Beancount Building Blocks You’ll Use

A robust AP workflow in Beancount relies on a few core features:

  1. Accounts: You'll primarily use your Liabilities:AccountsPayable account, a cash account like Assets:Bank:Checking, and your various expense accounts (e.g., Expenses:Supplies).
  2. Metadata: You can attach key-value data to any transaction. For AP, you'll use metadata like invoice:, due:, terms:, and document:. Fava even recognizes the document: key and will automatically create a clickable link to the attached file if you configure a documents folder.
  3. Tags & Links: Use #tags (like #ap) for easy filtering and ^links (like ^INV-10455) to programmatically tie a bill and its subsequent payment together. This creates a clear, auditable trail.
  4. Queries (BQL): Beancount's SQL-like query language (BQL) allows you to run powerful reports, like listing all open payables sorted by due date, directly from the command line with bean-query or on Fava's "Query" page.

Core AP Workflow in Beancount

Managing AP in your ledger involves two or three key steps: recording the bill, paying it, and sometimes handling partial payments or discounts.

1) Record the Vendor Bill (This Creates the Liability)

First, you book the expense and create the payable when the invoice arrives.

; Optionally set your documents folder in your main Beancount file:
option "documents" "documents"

2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
terms: "2/10, n/30"
document: "invoices/2025-08-05-forest-paint-INV-10455.pdf"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD

This single entry accomplishes two critical things:

  1. It immediately recognizes the $500 expense in the correct period (August).
  2. It creates a corresponding $500 liability, showing that you owe money to Forest Paint Supply.

The ^INV-10455 link is a unique identifier that lets you attach the same link to the payment later, keeping the bill and payment transactions logically connected.

2) Pay the Bill (This Clears the Liability)

When you pay the invoice, you create a transaction that moves money from your bank account to clear the liability.

a) Standard Payment (No Discount):

2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD

This entry reduces your AP balance by $500 and your checking account balance by the same amount. The liability is now cleared.

b) Early-Payment Discount (e.g., "2/10, n/30"):

If the terms are "2/10, n/30", you can take a 2% discount if you pay within 10 days. For our 500invoice,thatsa500 invoice, that's a 10 discount. Here are two acceptable ways to record it—just pick one method and be consistent.

; Option 1: Record the discount as other income (a contra-expense effect)
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Income:Discounts:Payables -10.00 USD

; Option 2: Reduce the original expense directly
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Expenses:Supplies:Paint -10.00 USD

In both cases, you clear the full 500liability,reduceyourbankbalancebythe500 liability, reduce your bank balance by the 490 you actually paid, and account for the $10 benefit.

3) Handling Partial Payments

Beancount's linking feature makes tracking partial payments simple and clean.

; Invoice for $1,200
2025-08-10 * "Acme Parts" "INV-9001" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Expenses:Parts 1200.00 USD
Liabilities:AccountsPayable -1200.00 USD

; First payment of $400
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD

; Final payment of $800
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USD

By using the ^INV-9001 link on all three transactions, you can easily filter your journal to see the complete history of this specific bill and its associated payments.


Helpful Queries (BQL)

You can run these queries in Fava’s “Query” tab or from the command line with bean-query.

Tip: The any_meta() function is incredibly useful for pulling metadata fields like invoice: and document: into your query results.

Open AP by Vendor (Balance View):

This query sums up the current outstanding balance you owe to each supplier.

SELECT payee, COST(SUM(position)) AS amount
WHERE account ~ "^Liabilities:AccountsPayable"
GROUP BY payee
ORDER BY payee;

Open AP by Invoice + Due Date:

Get a tidy list of every open bill, sorted by its due date, to help you prioritize payments.

SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
COST(SUM(position)) AS amount
WHERE account ~ "^Liabilities:AccountsPayable"
GROUP BY payee, invoice, due
ORDER BY due, payee;

List Bills with Attached PDFs:

This query finds all your bills and shows the path to the linked document.

SELECT date, payee, any_meta('invoice') AS invoice, any_meta('document') AS file
WHERE account ~ "^Liabilities:AccountsPayable"
ORDER BY date DESC;

Where to See AP in Fava

  • Balance Sheet: Navigate to Balance SheetLiabilitiesAccountsPayable to see the total balance and drill down into the transaction details.
  • Journal: Filter the journal by account:Liabilities:AccountsPayable or a specific link like ^INV-xxxx to see a bill's complete lifecycle.
  • Documents Sidebar: If you use the document: metadata and set the option "documents" directive, you'll see a list of linked documents in the sidebar.

AP Aging, Turnover, and Cash-Flow Awareness

  • Aging Schedule: This report groups your open invoices by how long they’ve been outstanding (e.g., 1–30 days, 31–60 days, 60+ days). In Beancount, the most practical approach is to run the "Open AP by Invoice + Due Date" query above, export the results as a CSV, and bucket them in a spreadsheet or a small Python script.
  • AP Turnover Ratio: This is a quick health check on how fast you pay your vendors. The formula is Total Supplier Purchases ÷ Average AP. A related metric, Days Payable Outstanding (DPO), is roughly 365 ÷ Turnover Ratio.
  • If You Can’t Pay on Time: AP is meant for short-term debt. If a vendor agrees to formal, longer-term repayment, you should reclassify the debt out of AP and into a note payable.
2025-10-01 * "Helix Industries" "Convert overdue AP to 12-month note" ^INV-1110
Liabilities:AccountsPayable 2000.00 USD
Liabilities:NotesPayable -2000.00 USD

Best Practices for AP in a Plain-Text Ledger

  • Go Paperless: Store invoice PDFs in your documents folder and link them with the document: metadata key.
  • Use Links Consistently: Put the unique invoice number in a ^link on both the bill and all associated payment entries.
  • Keep Metadata Tidy: Consistently using invoice:, due:, and terms: improves search, queries, and financial reviews.
  • Accrual All the Way: If you want useful AP reporting, commit to keeping your books on an accrual basis. Beancount and Fava handle this beautifully.

Copy-Paste Starter: Vendor Bill + Payment

; ---- Bill ----
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
document: "invoices/2025-08-05-forest-paint-INV-10455.pdf"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD

; ---- Payment (no discount) ----
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD

This guide is for educational purposes and does not constitute tax, legal, or financial advice.

References & Further Reading: