Client Retainer Tracking: Recording Prepaid Income the Right Way in Beancount

One of my bookkeeping clients recently landed a $3,000/month retainer. She was thrilled - until she asked me how to record it. “Do I just put $3,000 as income on January 1st?” The answer is no, and getting this wrong can mess up your financial reports, your tax situation, and your understanding of what you’ve actually earned.

Retainers and prepaid income are one of the trickiest areas for freelancers because the money arrives before the work is done. Here’s how to handle it properly in Beancount.

What Is a Retainer (Accounting Perspective)?

A retainer is prepaid income. The client pays you upfront for services you’ll deliver over a period of time. Until you deliver those services, that money isn’t really “yours” - it’s an obligation. In accounting terms, it’s a liability called deferred revenue or unearned income.

Think of it this way: if you received $3,000 on January 1st for three months of work, and the client fires you on January 15th, you’d owe back $2,000. That’s why it starts as a liability, not income.

The Account Structure

; The key account: deferred/unearned revenue (a liability)
2025-01-01 open Liabilities:Business:DeferredRevenue USD
  description: "Client prepayments for work not yet performed"

; Or per-client if you have multiple retainers:
2025-01-01 open Liabilities:Business:DeferredRevenue:ClientA USD
2025-01-01 open Liabilities:Business:DeferredRevenue:ClientB USD

; Standard accounts
2025-01-01 open Assets:Business:Checking USD
2025-01-01 open Income:Business:Services USD
2025-01-01 open Income:Business:Services:Retainer USD

The Three-Step Workflow

Step 1: Receive the Retainer Payment

When the client’s payment arrives, record it as a liability - NOT as income:

; Client pays $3,000 retainer for January-March
2025-01-02 * "ClientA" "Retainer payment - Q1 2025 (Jan-Mar)"
  Assets:Business:Checking                     3,000.00 USD
  Liabilities:Business:DeferredRevenue:ClientA -3,000.00 USD
  retainer_period: "2025-01-01 to 2025-03-31"
  monthly_amount: "$1,000"
  refundable: TRUE

Notice: income is $0 at this point. Your bank account went up by $3,000, but your liability also went up by $3,000. Net effect on your profit: zero. This is correct.

Step 2: Recognize Revenue Monthly

As you perform the work each month, you “earn” a portion of the retainer. Move it from liability to income:

; End of January - you delivered January's services
2025-01-31 * "Revenue Recognition" "ClientA retainer - January portion earned"
  Liabilities:Business:DeferredRevenue:ClientA  1,000.00 USD
  Income:Business:Services:Retainer             -1,000.00 USD
  period: "January 2025"
  hours_delivered: 15
  deliverables: "Social media management, 8 blog posts, monthly analytics report"

; End of February
2025-02-28 * "Revenue Recognition" "ClientA retainer - February portion earned"
  Liabilities:Business:DeferredRevenue:ClientA  1,000.00 USD
  Income:Business:Services:Retainer             -1,000.00 USD
  period: "February 2025"

; End of March
2025-03-31 * "Revenue Recognition" "ClientA retainer - March portion earned"
  Liabilities:Business:DeferredRevenue:ClientA  1,000.00 USD
  Income:Business:Services:Retainer             -1,000.00 USD
  period: "March 2025"

; After March 31, the deferred revenue balance for ClientA is $0
; All $3,000 has been recognized as income over 3 months

Step 3: Rinse and Repeat

When the next quarter’s retainer arrives, the cycle starts again:

; Q2 retainer arrives
2025-04-01 * "ClientA" "Retainer payment - Q2 2025 (Apr-Jun)"
  Assets:Business:Checking                     3,000.00 USD
  Liabilities:Business:DeferredRevenue:ClientA -3,000.00 USD
  retainer_period: "2025-04-01 to 2025-06-30"

Why This Matters: The Wrong Way vs. The Right Way

2025-01-01 note Income:Business "
=== WRONG vs RIGHT: WHY IT MATTERS ===

WRONG (recording retainer as immediate income):
  January revenue:  $3,000 (full retainer)
  February revenue: $0
  March revenue:    $0
  Q1 looks front-loaded. February and March
  look like you didn't earn anything.

RIGHT (deferred revenue recognition):
  January revenue:  $1,000
  February revenue: $1,000
  March revenue:    $1,000
  Q1 shows steady, predictable income.
  Matches when you actually did the work.

WHY THIS MATTERS:
  1. Accurate monthly profitability
  2. Better business decisions (is the retainer profitable?)
  3. Correct tax timing (accrual basis)
  4. If client cancels mid-quarter, you know exactly
     how much you've earned vs. how much you owe back
"

Common Retainer Scenarios

Scenario 1: Monthly Retainer (Most Common)

Client pays the 1st, you deliver throughout the month:

; Payment arrives
2025-02-01 * "ClientB" "February retainer payment"
  Assets:Business:Checking                     2,500.00 USD
  Liabilities:Business:DeferredRevenue:ClientB -2,500.00 USD

; You deliver February's work
2025-02-28 * "Revenue Recognition" "ClientB retainer - February earned"
  Liabilities:Business:DeferredRevenue:ClientB  2,500.00 USD
  Income:Business:Services:Retainer             -2,500.00 USD
  hours_delivered: 20

For monthly retainers, the deferred revenue only sits on your books for about 30 days. But it still matters for accurate mid-month reporting.

Scenario 2: Hourly Retainer (Prepaid Hours)

Client buys a block of hours. You draw down as you work:

; Client buys 40 hours at $150/hour
2025-01-05 * "ClientC" "Retainer - 40 prepaid hours"
  Assets:Business:Checking                     6,000.00 USD
  Liabilities:Business:DeferredRevenue:ClientC -6,000.00 USD
  hours_purchased: 40
  rate: "$150/hour"

; You work 12 hours in January
2025-01-31 * "Revenue Recognition" "ClientC - 12 hours consumed"
  Liabilities:Business:DeferredRevenue:ClientC  1,800.00 USD
  Income:Business:Services:Retainer             -1,800.00 USD
  hours_consumed: 12
  hours_remaining: 28
  note: "API integration and testing"

; 8 hours in February
2025-02-28 * "Revenue Recognition" "ClientC - 8 hours consumed"
  Liabilities:Business:DeferredRevenue:ClientC  1,200.00 USD
  Income:Business:Services:Retainer             -1,200.00 USD
  hours_consumed: 8
  hours_remaining: 20

Track hours_remaining in metadata so you always know the balance.

Scenario 3: Non-Refundable Retainer (Availability Fee)

Some retainers are non-refundable - the client pays for your availability, not specific deliverables:

; Non-refundable availability retainer
2025-01-01 * "ClientD" "Annual availability retainer"
  Assets:Business:Checking                     12,000.00 USD
  Liabilities:Business:DeferredRevenue:ClientD -12,000.00 USD
  retainer_type: "availability"
  refundable: FALSE
  recognition_method: "straight-line monthly"

; Even though it's non-refundable, you still recognize
; revenue monthly because you're providing availability
; throughout the year
2025-01-31 * "Revenue Recognition" "ClientD availability - January"
  Liabilities:Business:DeferredRevenue:ClientD  1,000.00 USD
  Income:Business:Services:Retainer             -1,000.00 USD

Scenario 4: Retainer With Overage

Client has a base retainer plus hourly work beyond the included hours:

; Monthly retainer: 10 hours included, $200/hour overage
2025-03-01 * "ClientE" "March retainer - base"
  Assets:Business:Checking                     2,000.00 USD
  Liabilities:Business:DeferredRevenue:ClientE -2,000.00 USD
  included_hours: 10
  overage_rate: "$200/hour"

; March: used 14 hours (4 hours overage)
2025-03-31 * "Revenue Recognition" "ClientE - March base + overage"
  Liabilities:Business:DeferredRevenue:ClientE  2,000.00 USD
  Income:Business:Services:Retainer             -2,000.00 USD  ; base
  note: "10 included hours fully consumed"

2025-03-31 * "ClientE" "March overage - 4 hours"
  Assets:Business:Receivables:ClientE             800.00 USD
  Income:Business:Services:Retainer              -800.00 USD
  overage_hours: 4
  rate: "$200/hour"
  ; Overage is invoiced separately as a receivable

Tracking the Dashboard

I maintain this note for every retainer client:

2025-02-15 note Liabilities:Business:DeferredRevenue "
=== RETAINER STATUS DASHBOARD ===

CLIENT      PAID       EARNED     REMAINING   PERIOD
ClientA     $3,000     $1,000     $2,000      Jan-Mar (67% remaining)
ClientB     $2,500     $2,500     $0          Feb (complete)
ClientC     $6,000     $3,000     $3,000      40hrs (20 hrs remaining)
ClientD     $12,000    $1,000     $11,000     Annual (11 months left)
ClientE     $2,000     $2,000     $0          Mar (complete)

TOTAL DEFERRED REVENUE: $16,000
This is money in your bank that you haven't earned yet.
It is NOT available for spending. It's an obligation.

If all clients cancelled today, you'd owe back $16,000.
"

The Query

Check your deferred revenue balance anytime:

SELECT
  account,
  sum(position) as balance
WHERE
  account ~ 'DeferredRevenue'
GROUP BY account
ORDER BY account

If any balance is positive (in Beancount’s sign convention for liabilities, this means the liability is clear), you’ve over-recognized revenue. If it’s heavily negative, you have significant unearned income outstanding.

Key Takeaways

  1. Retainer received = liability, not income. Record it in Liabilities:Business:DeferredRevenue.
  2. Recognize revenue as you deliver. Monthly for fixed retainers, per-hour for hourly retainers.
  3. Track hours or deliverables in metadata. You need to prove you earned it.
  4. Never spend deferred revenue. That money isn’t yours until you deliver the work.
  5. Reconcile monthly. The deferred revenue balance should always match what you owe clients.

This is one of those areas where doing it right from the start saves enormous headaches later. Every freelancer who’s landed a retainer and immediately spent it all knows the pain when the client cancels in month two.

Bob, I just landed my first retainer client and this post couldn’t have come at a better time. I’m a DevOps consultant and a startup wants to pay me $2,000/month for “on-call infrastructure support.” Here’s where I’m confused.

My Specific Situation

The retainer is a weird hybrid. They’re paying $2,000/month for:

  • Up to 10 hours of support work
  • Guaranteed 4-hour response time for incidents
  • Monthly infrastructure review (takes about 2 hours)

Some months I barely do anything (2-3 hours). Other months there’s an incident and I work 12+ hours. The monthly fee is the same regardless.

My Questions

  1. Do I still defer the revenue if I’m on cash basis for taxes? You showed the accrual approach where revenue is recognized as earned. But Tina has told us to file taxes on cash basis. So for tax purposes, isn’t the $2,000 just income when I receive it? Do I need the deferred revenue account at all?

  2. What about months when I barely work? If the client pays $2,000 and I only do 3 hours of work ($600 at my usual rate), have I “earned” the full $2,000? The contract says the fee covers availability, not just hours worked. So do I recognize all $2,000 at month-end regardless?

; Is this right for an availability retainer?
2025-03-01 * "StartupCo" "March retainer"
  Assets:Checking                2,000.00 USD
  Liabilities:DeferredRevenue   -2,000.00 USD

; End of March - only 3 hours of actual work
2025-03-31 * "Revenue Recognition" "March retainer earned"
  Liabilities:DeferredRevenue    2,000.00 USD
  Income:Freelance              -2,000.00 USD
  hours_worked: 3
  ; Full $2,000 earned because retainer covers availability?
  1. The spending temptation is real. You said “never spend deferred revenue.” But if I have a monthly retainer that recurs every month, isn’t it basically guaranteed income? At what point can I treat it as reliable enough to budget against?

  2. How do I handle it when the retainer ends? My contract is 6 months. If the client doesn’t renew, I lose $2,000/month overnight. Should I be building a buffer specifically for retainer loss, like the sinking funds Fred talked about?

I think part of my confusion is that I’m conflating the accounting treatment (deferred revenue) with the practical cash flow reality (predictable monthly income). They feel like they should be the same thing, but they’re not?

Bob, good walkthrough. I want to add the accounting precision layer because there are some nuances in retainer accounting that freelancers should understand, especially around refundability and revenue recognition standards.

Refundable vs. Non-Refundable: The Critical Distinction

The accounting treatment depends entirely on what happens if the engagement ends early:

2025-01-01 note Liabilities:Business:DeferredRevenue "
=== RETAINER CLASSIFICATION ===

TYPE 1: REFUNDABLE RETAINER
  Client can cancel and get unused portion back.
  Treatment: ALWAYS deferred revenue (liability)
  Recognize revenue only as services are delivered.
  Example: Prepaid hours, project-based retainers.

TYPE 2: NON-REFUNDABLE RETAINER (earned on receipt)
  Client pays for access/availability. No refund.
  Treatment: DEPENDS on your accounting method.
    Cash basis: Income when received.
    Accrual basis: Still deferred, recognized over the period.
  Example: Monthly availability fees, access retainers.

TYPE 3: HYBRID RETAINER
  Base fee is non-refundable, unused hours roll over.
  Treatment: Split recording.
  Example: $2,000/month base + rollover hours.

WHY THIS MATTERS:
  If you record a refundable retainer as income
  and the client cancels, you'll show negative
  revenue when you refund them. Your P&L will
  look like you lost money that month.

  Proper deferred revenue avoids this entirely.
"

Answering Sarah’s Questions

On cash basis vs. deferred revenue:

Sarah, you can absolutely do both. Your Beancount books track deferred revenue for business visibility. Your tax filing uses cash basis (report income when received). These are separate concerns:

; Your books (accrual - accurate business picture):
2025-03-01 * "StartupCo" "March retainer"
  Assets:Checking                2,000.00 USD
  Liabilities:DeferredRevenue   -2,000.00 USD
  ; Income: $0 (not yet earned)

2025-03-31 * "Revenue Recognition" "March earned"
  Liabilities:DeferredRevenue    2,000.00 USD
  Income:Freelance              -2,000.00 USD
  ; Income: $2,000 (now earned)

; Your tax return (cash basis):
;   March income = $2,000 (received in March)
;   Same result for monthly retainers, but differs
;   for quarterly/annual prepayments

For monthly retainers, the cash and accrual views converge because you receive and earn in the same month. The deferred revenue step still matters for mid-month accuracy and for quarterly/annual prepayments where timing differs.

On availability retainers:

Yes, you recognize the full $2,000 at month-end regardless of hours worked. The contract defines the deliverable as “availability and response time guarantee,” not hours. You earned the retainer by being available, even if no incidents occurred. This is standard for on-call arrangements.

On spending deferred revenue:

The rule about not spending deferred revenue applies to lump-sum prepayments (quarterly, annual). For monthly retainers, you can budget the expected income - but budget the income line, not the deferred revenue line. The distinction matters if a client prepays multiple months.

The Refund Scenario in Beancount

When a client cancels and you owe a refund, here’s the clean recording:

; Client prepaid $6,000 for 6 months. Cancels after month 2.
; Earned: $2,000 (2 months). Refund: $4,000.

2025-03-15 * "ClientA" "Retainer refund - cancelled after 2 months"
  Liabilities:Business:DeferredRevenue:ClientA  4,000.00 USD
  Assets:Business:Checking                     -4,000.00 USD
  reason: "Client cancelled. Months 3-6 unearned."

; The deferred revenue account goes to $0
; Income stays at $2,000 (correctly earned)
; No negative revenue, no P&L distortion

This is why the deferred revenue approach is superior. If you’d recorded the full $6,000 as income in month 1, you’d now need to record -$4,000 of income in month 3. That creates ugly, misleading financials.

One More Thing: Retainer Profitability Analysis

With proper tracking, you can analyze whether your retainer is actually profitable:

2025-06-30 note Income:Business:Services:Retainer "
=== RETAINER PROFITABILITY - ClientA (H1 2025) ===

Revenue recognized: $6,000 ($1,000/month x 6)
Hours spent: 92 hours
Effective hourly rate: $65.22/hour

Compare to project work:
  Average project rate: $150/hour
  Retainer discount: 57%

IS THIS RETAINER WORTH IT?
  Pros: Predictable income, relationship building
  Cons: Effective rate is well below market

  Consider: Renegotiating rate or reducing scope
  at next renewal.
"

You can only do this analysis if you track hours in metadata and recognize revenue properly. Cash-only accounting hides this insight completely.

Important thread. I need to add the tax side because retainer accounting has a tax trap that catches freelancers every year, and it’s different depending on whether you file cash or accrual basis.

The Cash Basis Tax Trap

For cash basis taxpayers (most freelancers), the IRS is clear: prepaid income is taxable when received, not when earned. This creates a real problem with annual retainers:

2025-01-01 note Liabilities:Tax "
=== RETAINER TAX TIMING: THE TRAP ===

SCENARIO: Client pays $24,000 annual retainer on Jan 1, 2025

YOUR BOOKS (accrual):
  Jan income: $2,000
  Feb income: $2,000
  ...
  Dec income: $2,000
  Clean. Sensible.

YOUR TAX RETURN (cash basis):
  2025 income: $24,000 (ALL of it, received Jan 1)

  This is correct per IRS rules.
  Cash basis = taxable when received.

THE TRAP:
  If that $24,000 pushes you into a higher bracket,
  you owe more tax than if you'd received $2,000/month.

  Same total income. Different tax outcome.
  Because cash basis cares about WHEN you received it,
  not WHEN you earned it.
"

How to Avoid the Trap

Option 1: Structure the Contract for Monthly Payments

The simplest solution is to have the client pay monthly instead of annually. Same total amount, but the income spreads across the tax year naturally:

2025-01-01 note Income:Business "
=== RETAINER PAYMENT STRUCTURE (TAX OPTIMIZED) ===

AVOID: Annual lump sum ($24,000 on Jan 1)
  - All income hits in Year 1
  - May push you into higher bracket

PREFER: Monthly payments ($2,000 x 12)
  - Income recognized monthly under both methods
  - Smoother tax liability
  - Better cash flow matching

ALSO CONSIDER: Quarterly payments ($6,000 x 4)
  - Compromise between client convenience and tax smoothing
  - Aligns with quarterly estimated tax payments
"

Option 2: Switch to Accrual Basis (Rarely Worth It)

Accrual basis would let you recognize $2,000/month for tax purposes regardless of payment timing. But switching requires Form 3115, adds complexity to all your accounting, and you lose the cash basis timing advantages we discussed in the accrual vs. cash thread. For most freelancers, restructuring the payment schedule is simpler than switching accounting methods.

The Constructive Receipt Doctrine

One thing freelancers sometimes try: “The client offered to pay me in December, but I asked them to hold the check until January.” The IRS has a rule for this - the constructive receipt doctrine:

2025-12-01 note Liabilities:Tax "
=== CONSTRUCTIVE RECEIPT ===

IRS RULE: Income is taxable when it's made available
to you WITHOUT substantial restrictions, even if you
don't actually take possession.

EXAMPLE (DOES NOT WORK):
  Client: 'I'll send the $12K retainer now.'
  You: 'Can you hold it until January 2?'
  IRS: 'You had the right to receive it in December.
        It's 2025 income. Pay up.'

EXAMPLE (DOES WORK):
  Contract states: 'Retainer payments due on the
  1st of each quarter: Jan 1, Apr 1, Jul 1, Oct 1.'
  Client follows the contract schedule.
  IRS: 'Income in the quarter received. Fine.'

The difference: contractual payment terms vs.
voluntarily delaying available income.
Structure the contract properly from the start.
"

Estimated Tax Impact

Quarterly retainers interact with estimated tax payments. If you receive a large retainer in Q1, your Q1 estimated tax payment needs to account for it (if using the annualized income method):

2025-01-01 note Liabilities:Tax:Federal:Estimated "
=== RETAINER IMPACT ON ESTIMATED TAXES ===

Q1 RETAINER INCOME: $12,000 (6-month retainer from ClientA)
Q1 OTHER INCOME: $8,000 (project work)
Q1 TOTAL: $20,000

SAFE HARBOR METHOD:
  Pay 1/4 of last year's tax. Retainer timing doesn't matter.
  This is why I recommend safe harbor for retainer income.

ANNUALIZED METHOD:
  Q1 income: $20,000 (annualized: $80,000)
  Q1 estimated tax based on $80K annual income.
  This overpays if the retainer was a one-time lump sum.

USE SAFE HARBOR if you have retainer income.
It's simpler and avoids the annualization distortion
that lumpy retainer payments create.
"

My Recommendation

  1. Structure retainer contracts with monthly or quarterly payments to avoid the lump-sum tax hit
  2. Use safe harbor for estimated taxes when retainer income makes quarterly income lumpy
  3. Keep deferred revenue on your books even as a cash basis taxpayer - it’s for business visibility, not tax compliance
  4. Set aside 30% of any retainer payment immediately into a tax reserve, especially for lump-sum annual retainers where the full amount is taxable in the year received

I’m coming at this from a different angle. I don’t do freelance consulting, but I have a property management arrangement that’s essentially a retainer, and the same accounting principles apply. This might help people who are overcomplicating it.

My “Retainer” Situation

I manage a friend’s rental property in exchange for a flat $300/month. She pays me quarterly ($900). It’s not a formal consulting engagement but it’s prepaid income for ongoing services.

When I first recorded this, I just booked it as income when the check arrived:

; What I used to do (wrong for accrual, fine for cash-basis tax):
2025-01-05 * "PropertyOwner" "Q1 property management fee"
  Assets:Checking              900.00 USD
  Income:PropertyManagement   -900.00 USD
  ; January shows $900 income, Feb and Mar show $0

After reading about deferred revenue, I switched:

; What I do now (correct accrual treatment):
2025-01-05 * "PropertyOwner" "Q1 management fee - prepaid"
  Assets:Checking                           900.00 USD
  Liabilities:DeferredRevenue:PropMgmt     -900.00 USD

2025-01-31 * "Revenue" "January management fee earned"
  Liabilities:DeferredRevenue:PropMgmt      300.00 USD
  Income:PropertyManagement               -300.00 USD

2025-02-28 * "Revenue" "February management fee earned"
  Liabilities:DeferredRevenue:PropMgmt      300.00 USD
  Income:PropertyManagement               -300.00 USD

2025-03-31 * "Revenue" "March management fee earned"
  Liabilities:DeferredRevenue:PropMgmt      300.00 USD
  Income:PropertyManagement               -300.00 USD

Was It Worth the Extra Effort?

Honestly, for $300/month, the deferred revenue approach is overkill from a practical standpoint. My monthly income reports look slightly more accurate, but the difference is minor.

Where it DID help: when my friend asked me to take on a second property starting in March. I looked at my income report and saw that February was already earning $300/month from property management. Adding a second property at $400/month would mean $700/month of predictable retainer income. That clean monthly view helped me decide to say yes because I could see the cumulative impact immediately.

If I’d been booking $900 in January and $0 in February-March, February’s income would have looked like I couldn’t take on more work.

The Simplicity vs. Accuracy Tradeoff

I think there’s a spectrum here and the right answer depends on your situation:

2025-01-01 note Income "
=== WHEN TO USE DEFERRED REVENUE ===

SKIP IT (just record income on receipt):
  - Monthly retainers paid monthly
  - Small amounts (< $500/month)
  - Single retainer client
  - Cash basis tax filing (tax result is the same)
  - You don't need mid-month financial reports

USE IT:
  - Quarterly or annual prepayments
  - Multiple retainer clients
  - Refundable retainers (must track obligation)
  - You want accurate monthly P&L
  - You're making business decisions based on
    monthly income trends
  - Retainer income is a significant % of total revenue
"

A Middle-Ground Approach

For people who want accuracy but not the full two-transaction workflow, here’s what I settled on:

; For monthly retainers: record directly as income
; (payment and earning happen in the same month)
2025-02-01 * "ClientB" "February retainer - monthly"
  Assets:Checking              2,000.00 USD
  Income:Retainer:ClientB     -2,000.00 USD
  retainer: TRUE
  ; No deferred revenue needed for monthly payments

; For quarterly/annual: use deferred revenue
; (gap between payment and earning)
2025-01-05 * "PropertyOwner" "Q1 fee - prepaid"
  Assets:Checking                          900.00 USD
  Liabilities:DeferredRevenue:PropMgmt    -900.00 USD
  ; Then recognize monthly

This gives me accuracy where it matters (multi-month prepayments) without burdening me with extra transactions where it doesn’t (same-month payments).

Bob’s system is the gold standard. For anyone just starting out with their first retainer, start simple and add the deferred revenue workflow when the amounts or the time spans justify the extra bookkeeping. You can always upgrade your approach later - the transactions you’ve already recorded don’t change.