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
- Retainer received = liability, not income. Record it in
Liabilities:Business:DeferredRevenue. - Recognize revenue as you deliver. Monthly for fixed retainers, per-hour for hourly retainers.
- Track hours or deliverables in metadata. You need to prove you earned it.
- Never spend deferred revenue. That money isn’t yours until you deliver the work.
- 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.