Reconciling advisory fee billing
A chart-first walkthrough of advisory fee billing reconciliation on a synthetic RIA book: recompute every fee, then classify every billing break by cause.
Billed advisory fees on a synthetic 40-account book run to about the same total every month. That is the trap: billing errors are small against the total, so they average away, and a totals-only review signs off on a book that is wrong in four ways. The months in blue each hide at least one break.
Synthetic data: a seeded 2025 book of 40 accounts across 12 months (480 account-months). No client, no real firm, no real figure. Regenerate with pnpm gen:fee-recon.
- Accounts reconciled
- 40
- Account-months
- 480
- Advisory fees billed
- $471,062
- Net billing variance
- -$498.72
- Exception rate
- 5 (1.04%)
- Blended fee yield
- 61.3 bps
The input and the schedule
The unit is the account-month: one row per account per month, with average assets and the client cash flows in it. The schedule has three bands, and it is a cliff: the whole balance is billed at the rate of the band it falls in.
A cliff jumps at each boundary, so an account sitting on a breakpoint is the most fragile row in the book. A graduated schedule bills each slice at its own band's rate and has no jump. Recomputing the fee from average assets and the schedule gives what the billing should have produced; the custodian statement gives what it did.
Where the money went
Recomputing every account-month and differencing turns the smooth total into four causes, a net -$498.72 across the book:
- Missing statements (-$1,844.54): two account-months had no custodian row, so nothing was billed. A row that is not there never shows up in a scan of the rows that are.
- A duplicate row (+$1,470.82): one account-month billed twice. This overbills a client, the error that becomes a refund.
- A late-posted flow (-$333.33): a deposit effective in the month posted after the billing run, so the fee missed it.
- A tier boundary on the wrong side (+$208.33): the account marked on the chart above sat exactly on $1M, and a strict comparison billed the whole balance at the higher band. A one-character error that only bites at the boundary.
The exception list
| Account | Month | Average AUM | Computed | Billed | Variance | Cause |
|---|---|---|---|---|---|---|
| A23 | Sep 2025 | $2,463,890 | $1,539.93 | $0.00 | -$1,539.93 | Missing statement |
| A12 | Jun 2025 | $3,529,974 | $1,470.82 | $2,941.64 | +$1,470.82 | Duplicate row |
| A05 | Aug 2025 | $724,367 | $603.64 | $270.31 | -$333.33 | Late flow, wrong period |
| A07 | Apr 2025 | $365,536 | $304.61 | $0.00 | -$304.61 | Missing statement |
| A31 | Nov 2025 | $1,000,000 | $625.00 | $833.33 | +$208.33 | Tier boundary misapplied |
Variance is billed minus computed: positive is an overbill to refund, negative an underbill to invoice. The exception rate is 1.04% of account-months, so the job is routing a handful of items to an owner, not re-auditing the book. The blended fee yield is 61.3 bps, below the top rate because larger accounts reach the lower bands.
| Metric | Definition | Formula |
|---|---|---|
| Net flows | Client deposits less withdrawals in the period, before any market movement. | deposits - withdrawals |
| Average AUM | The account's average assets under management over the month, the basis the advisory fee is billed on. | mean(daily account balance over the month) |
| Fee yield | Annualized advisory fees as a share of average assets, the effective rate the book actually pays. | annual fees / average AUM |
| Exception rate | The share of account-months where the billed fee did not tie out to the recomputed fee. | exception account-months / total account-months |
The monthly run
- Inputs: the custodian billing extract and the average-balance file for the closed month.
- Checks: recompute, difference, and classify each break by shape: no row, two rows, a basis that disagrees, or a rate that disagrees. A break with no matching shape gets read by a person.
- Cadence: after the billing run and before fees are drawn, so an overbill never leaves the account.
- Owner: operations works the list; the yield and exception rate go to the principals as a one-line check.
- Red flag: an exception rate that jumps from a handful to dozens is a feed or schedule change, not new mistakes. Find the systemic cause first.
The book, the planted breaks and this reconciliation regenerate from a fixed seed with pnpm gen:fee-recon, and a test locks every total. The same reconciliation runs interactively in the wealth analytics case study.