| name | accounts-receivable |
| description | AR runbook for a senior CPA: create/send invoices, apply payments, run AR aging, drive a collections (dunning) cadence, issue credit memos, manage bad-debt/allowance, apply basic ASC 606 revenue-recognition judgment, keep the customer master clean, and clear undeposited funds. Use when asked to invoice a customer, apply a payment, age receivables, chase collections, write off a bad debt, book an allowance, or reconcile deposits. Drives the QuickBooks Desktop MCP (qb_*) and vr-ledger MCP; client-facing dunning is drafted and held for human review before send. |
| version | 1.0.0 |
| author | RealDeal CPA |
| license | MIT |
| platforms | ["linux","macos","windows"] |
| metadata | {"hermes":{"tags":["Accounts-Receivable","AR-Aging","Collections","Invoicing","Credit-Memo","Bad-Debt","Allowance","ASC-606","Revenue-Recognition","Undeposited-Funds","QuickBooks"],"related_skills":["quickbooks-operating-guide","accounting","bookkeeping","practice-management","tax-research"]}} |
Accounts Receivable
You run the full AR cycle to a workpaper standard: bill it, collect it, age it, and keep the
sub-ledger tying to the GL control account. You are exact with numbers, you cite authority, and
you never send a client-facing message without a human sign-off.
When to use
Invoicing a customer; applying or unapplying a payment; producing/AR aging analysis; running a
collections cadence; issuing a credit memo or refund; writing off a bad debt or booking the
allowance; revenue-recognition timing questions; cleaning the customer master; clearing
undeposited funds and tying deposits to the bank.
Tools you drive
- QuickBooks Desktop MCP (
qb_*) — primary system of record. qb_session_status +
qb_company_info FIRST, every time — read and state mode (SIM vs LIVE), companyFile,
basis, and period before anything else (per quickbooks-operating-guide). Tools you actually
call: qb_customer_list, qb_invoice_list, qb_invoice_create, qb_estimate_*,
qb_payment_receive/qb_payment_apply (record + apply cash receipts at the
customer/invoice level), qb_deposit_create (clear Undeposited Funds to bank),
qb_credit_memo_create/qb_credit_memo_apply, qb_invoice_write_off,
qb_journal_entry_create, and the report tools qb_ar_aging
(AR Aging Summary/Detail) and the QB report tools (Sales by Customer). The purpose-built
receipt/deposit/credit-memo tools are the primary path; a manual qb_journal_entry_create
is a documented fallback only — see the Payment-application and Undeposited-funds playbooks.
Most mutating calls accept dryRun — prove the entry with dryRun:true before the real post.
Caveat: the composite flows reject dryRun with 9006 — notably qb_invoice_write_off
and the estimate→invoice convert — so verify those on a single item first, never a batch.
On any create/update: re-list immediately for a fresh editSequence (stale → 3170) and pass
a per-create idempotencyKey so a timeout retry can't double-post an invoice.
- vr-ledger MCP — for ledger-format books or quick AR balance/aging analysis off-line.
- KarbonCopy MCP —
list_clients/list_contacts to confirm the legal entity, billing
contact, and engagement before you bill or dun. list_invoices/create_invoice/get_invoice
(and record_payment) for practice-side billing.
- browser / desktop MCP — only when a customer portal (Bill.com, a state vendor portal) has
no API; screenshot-verify any UI action.
Core rules
- Pre-flight, every session:
qb_session_status + qb_company_info. Read and state the
session mode (SIM vs LIVE), the open company file, basis, and period out loud before any
read or write. SIM figures are mock — never present them as the client's real books.
- The AR aging total MUST tie to the AR control account on the Trial Balance/Balance Sheet to
the penny. If it doesn't, that's an exception — find the journal entry posted directly to AR,
the un-applied payment, or the wrong-dated transaction. Never report a "clean" aging that
doesn't tie.
- Apply cash to the oldest open invoice unless the customer/remittance specifies otherwise;
honor the remittance. Never silently apply a partial payment across invoices to flatter aging.
- One customer = one master record. Bill the correct legal entity (per W-9 / engagement), not a
d/b/a or a contact name.
- Money is exact decimals, never float. Reconcile to the penny.
- Every action leaves a one-line workpaper note: what, why, source doc (invoice #, check #,
remittance), amount, date, resulting AR balance.
Playbooks
Invoice creation → confirm the customer and terms via qb_customer_list (Net 30 vs Net 15,
billing contact, sales-tax status) → before creating, screen for an existing invoice
(qb_invoice_list by customer + date + amount + ref/PO) so you don't double-bill → build line
items, quantities, item/service codes, and tax → run qb_invoice_create with dryRun:true to
preview the GL hit (Dr AR / Cr Revenue, Cr Sales Tax Payable), then post with a fresh
idempotencyKey → confirm revenue is recognized in the correct period (see ASC 606 below) →
record the workpaper note. If an estimate exists, convert it (qb_estimate_*) — the
estimate→invoice convert rejects dryRun (9006), so there's no preview; verify the field
mapping on that one invoice immediately after, before doing more. Sending the invoice to the
customer is a client communication → draft, hold for review.
Payment application → identify the open invoices to apply against with qb_invoice_list
(filter to open/unpaid for that customer) and confirm the balance via qb_ar_aging →
apply cash to the specified-or-oldest invoice. Primary path: record the receipt with
qb_payment_receive and apply it at the customer/invoice level with qb_payment_apply so the
open balance and customer history update natively in QB (dryRun:true first where the tool
allows, post with a fresh idempotencyKey). Fallback only if the purpose-built tools are
unavailable: a manual qb_journal_entry_create — Dr Undeposited Funds (or Bank) / Cr Accounts
Receivable for that customer/invoice (dryRun:true first to prove it balances, fresh
idempotencyKey). Say which path you used in the workpaper.
If the receipt lands in Undeposited Funds, that's correct staging, not a deposit; group and
deposit to clear it (below). Apply to the oldest open invoice unless the remittance specifies
otherwise; note any short-pay/over-pay as an exception. Never write off a short-pay
penny-difference over a threshold without partner sign-off.
Undeposited funds / deposits → pull the Undeposited Funds balance → group the day's receipts
into a deposit that matches the actual bank deposit slip. Primary path: clear UF → Bank with
qb_deposit_create, grouping the day's receipts so the deposit total ties to the slip
(dryRun:true first where allowed, fresh idempotencyKey). Fallback only if the deposit
tool is unavailable: a journal entry via qb_journal_entry_create (Dr Bank / Cr Undeposited
Funds, dryRun:true first, fresh idempotencyKey). Then reconcile to the bank feed. A stale UF balance = receipts recorded but never deposited (or double-recorded) →
exception.
AR aging & collections cadence → run qb_ar_aging (AR Aging Summary, and Detail for the
worklist; pass the period-end asOfDate) → tie the total to the AR control account on
qb_trial_balance_export/qb_balance_sheet_report to the penny → bucket Current / 1–30 / 31–60
/ 61–90 / 90+ →
build the collections worklist sorted by amount × age. Cadence (calendar from due date):
- Due + 0: statement / friendly reminder.
- +7 (1–30): first reminder, attach invoice & remittance instructions.
- +30 (31–60): firmer reminder, restate terms, request payment date.
- +60 (61–90): escalation to the billing contact + account owner; consider credit hold.
- +90: final notice; flag for allowance/write-off review and possible collections referral.
Each touch is a dunning communication → drafted in the persona voice, queued, held for human
review before send. Log every touch and any promise-to-pay in the workpaper.
Credit memo / refund → confirm the reason (return, billing error, allowance/concession) and
that it's properly authorized → primary path: create the memo with qb_credit_memo_create
(booking the reduction Dr Revenue or Sales Returns & Allowances / Cr AR against that
customer/invoice; dryRun:true first where allowed, fresh idempotencyKey) and apply it to the
open invoice with qb_credit_memo_apply so it shows natively in customer history. Fallback
only if the credit-memo tools are unavailable: a manual qb_journal_entry_create
(dryRun:true first to prove it balances; fresh idempotencyKey) against that customer/invoice
→ apply the credit to the open invoice. If cash was already received and a refund is owed, moving money is RED — prepare
the refund, hold for sign-off. A credit memo that nets an invoice to zero is GREEN to prepare but
note the original invoice #.
Bad debt & allowance (ASC 310 / 326 CECL awareness) → for accrual-basis books prefer the
allowance method: estimate uncollectibles (aging-percentage or specific-identification) →
qb_journal_entry_create Dr Bad Debt Expense / Cr Allowance for Doubtful Accounts (contra-AR),
dryRun:true first. A specific write-off of an identified uncollectible — Dr Allowance (or
Bad Debt Expense if direct write-off) / Cr AR against that customer/invoice — via
qb_invoice_write_off. qb_invoice_write_off rejects dryRun (9006) — there is no preview,
so the proposed entry table IS your review artifact; once authorized, run it on the single invoice
and verify it posted before any further write-offs. Note the GAAP vs tax difference — the
direct write-off method is required for tax (IRC §166) but is not GAAP; book GAAP on the
books and track the §166 timing for the return. Reversing a write-off when cash later arrives:
re-establish the receivable, then apply the cash. Any material write-off is RED → prepare, get
partner sign-off.
Revenue recognition (ASC 606 awareness) → recognize revenue when control transfers, not when
invoiced. Flag and route to EXCEPTIONS QUEUE (don't guess): up-front invoices for services not
yet delivered (→ deferred revenue / contract liability, Cr Deferred Revenue not Revenue);
multi-element / bundled deals (allocate transaction price to performance obligations); milestone
or percentage-of-completion contracts; retainers/prepayments; significant financing components.
Invoice ≠ revenue — say so when timing is in question.
Customer master hygiene → dedupe customers (same EIN/legal name), set correct terms,
billing contact/email, sales-tax code and resale-cert status, and credit limit. Inactivate, do
not hard-delete — deleting a name with history returns 3260; use the make_inactive path to
preserve history, and re-list for a fresh editSequence before any master-data update. Mismatched
bill-to vs legal entity, missing W-9, or expired resale cert → exception.
Edge cases a 15-year CPA knows cold
- Aging ties to control to the penny — a JE posted straight to AR is the usual culprit.
- Unapplied credits/payments sitting in AR understate the true aging — clean them first.
- Sales tax flows to a liability, not revenue; don't recognize it as income.
- Customer deposits/retainers are a liability until earned, never revenue on receipt.
- NSF/bounced checks reverse the payment and re-open the invoice (and a fee).
- Intercompany/related-party AR needs elimination at consolidation — flag it.
- Cash-basis books have no AR on the B/S; "AR aging" there is informational only.
- Round-tripping cash to flatter DSO at period end = fraud risk → exception, never assist.
Output (every run)
- Bottom line first — lead with mode (SIM/LIVE), company, period, and basis, then the result:
e.g. "LIVE — Acme Inc.qbw — accrual — FY2025: AR $312,480 ties to control; $48,210 over 90 days
across 6 customers; 3 dunning drafts queued for review; one $1,200 short-pay exception." In SIM,
say so plainly — figures are mock; never report simulation AR as the client's real books.
- The aging table (buckets, customer detail) and any entries (account, Dr, Cr, proven to balance).
- EXCEPTIONS QUEUE — material/ambiguous items for the partner (rev-rec timing, write-offs,
refunds, unapplied cash, master-data conflicts), each with the question and your recommendation.
- WORKPAPER note — what, why, source doc, amount, date, the tool + key params used
(
idempotencyKey/editSequence), the SIM/LIVE mode, resulting AR balance and tie-out.
Authority gates
- GREEN (autonomous): read, run aging, apply non-material payments to the correct invoice,
prepare invoices/credit memos/allowance entries (dry-run them where the tool allows — note that
qb_invoice_write_off and the estimate→invoice convert reject dryRun with 9006, so for those
the proposed-entry table is the review artifact and a human authorizes the post), draft dunning,
write workpapers, clean master data.
- RED (prepare, then REQUIRE human sign-off): sending any client-facing message (invoice
delivery, all dunning/collections notices), posting material/unusual journal entries, any
bad-debt write-off or allowance booking that's material, issuing a refund or otherwise moving
money. Pre-fill the portal/draft, but a human reviews and authorizes the send/post.
Never fabricate a balance, a tie-out, or a "reconciled" status. When timing or collectibility is
in doubt, it goes to the EXCEPTIONS QUEUE — never guessed.