River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Agency Client Report Template

Four documents and three sheets, including the retainer reconciliation that answers what the client is paying for, in hours.

Free download  ·  No account needed

Work Delivered Against Retainer

[Agency] — client book, [month]

One row per client. Every reporting tool on the market builds the performance half of a client report. This is the half none of them builds, and it is the half the client is actually asking about.

ClientRetainerHours boughtWorkedReportTotalvs boughtPaid per hourMargin
Book

Report production is its own column because it is delivery time and it sits inside the retainer. Folding it into the workstreams, or leaving it out, is the commonest way this reconciliation ends up flattering itself.

Paid per hour is the retainer divided by the hours actually delivered. It routinely shows a small client paying less per hour than a large one, which is the opposite of what most agencies assume about their own book.

Every agency client report template is a dashboard. Connect the platforms, pull impressions, clicks, cost per click, conversions, sessions, rankings and return on ad spend, arrange them on a page, add a summary box. Several of the tools that ship them are genuinely good at it. None of them reports the two things a retainer client is actually asking. What did the retainer buy, and did anything the agency did cause any of what moved? Both answers live in the agency's own records, not in a platform export.

Ravelin Digital is an invented seven-person agency with nine retainer clients. In March it sold 384 hours and delivered 462.5, including 38.5 spent making the reports. At its own cost of $103.86 a delivered hour, that is $8,153 of unpurchased work in one month. Half of it is the document that exists to justify the retainer. Two clients are underwater, both of them the smallest bills on the book, and neither has ever asked for anything. Over a year that is $97,832, more than a delivery hire costs in salary and payroll burden.

The three clients who got less work than they bought average 35.8 per cent margin, and they are the three who ask what they are paying for. The three most over-delivered average 6.9 per cent and have never asked. Of 33 notable movements, 16 have a piece of work that went live before them, 3 were claimed for work that landed afterwards, and 12 have nothing behind them. Three more findings moved between pulls a fortnight apart, so they existed only because of when the button was pressed.

One agency, nine retainers, and 78.5 hours nobody bought

The reconciliation, the inversion underneath it, the attribution join and the restatement check.

Nine retainers, 384 hours bought, 462.5 hours delivered

Ravelin Digital, invented. Seven people, five of them delivery, nine retainer clients, March 2026. Cost per delivered hour is the whole delivery function over the hours that actually went to clients: $48,033 over 462.5, which is $103.86.

ClientRetainerBoughtWorkedReportTotalvs boughtPaid per hourMargin
Wrenbury Legal$14,0008288.56.094.5+15.2%$148.1529.9%
Peregrine Outdoors$12,0007084.06.590.5+29.3%$132.6021.7%
Castleford Motors$9,5005852.05.057.0-1.7%$166.6737.7%
Orrell Plant Hire$8,0004844.04.048.00.0%$166.6737.7%
Thornbury Kitchens$6,5004052.54.557.0+42.5%$114.048.9%
Halcyon Dental$4,2002624.03.527.5+5.8%$152.7332.0%
Marlowe and Finch$3,5002231.03.034.0+54.5%$102.94-0.9%
Saltmarsh Brewing$3,2002028.53.031.5+57.5%$101.59-2.2%
Ivywood Interiors$2,8001819.53.022.5+25.0%$124.4416.5%
All nine$63,700384424.038.5462.5+20.4%$137.7324.6%

78.5 hours beyond what was bought, at $103.86 an hour, is $8,153 in a month and $97,832 a year. Of those 78.5 hours, 38.5 are the reports themselves. Half the capacity the agency gives away is spent on the document that exists to justify the retainer.

Of the 38.5 report hours, 24.2 are mechanical: pulling exports, normalising them, building charts and formatting. 14.3 are the judgement the client is paying for. That split is the only honest basis for deciding what to automate.

The clients who ask are the ones paying for the ones who do not

Three clients got less work than they bought. Four got more than a quarter extra. Sort the same nine rows by that instead of by invoice size and the book reads differently.

PositionClientWorked vs boughtTotal vs boughtMarginHas ever asked for more
Under-deliveredCastleford Motors-10.3%-1.7%37.7%Yes
Under-deliveredOrrell Plant Hire-8.3%0.0%37.7%Yes
Under-deliveredHalcyon Dental-7.7%+5.8%32.0%Yes
Over by a quarterIvywood Interiors+8.3%+25.0%16.5%No
Over by a quarterPeregrine Outdoors+20.0%+29.3%21.7%No
Over by a quarterThornbury Kitchens+31.3%+42.5%8.9%No
Over by a quarterMarlowe and Finch+40.9%+54.5%-0.9%No
Three under-delivered35.8% meanAll three
Three most over-delivered6.9% meanNone

Two clients are underwater at $103.86 an hour, and both are the smallest retainers on the book. Marlowe and Finch pays $102.94 an hour and Saltmarsh Brewing pays $101.59, against a cost of $103.86. Neither has asked for anything.

The trap in the middle column. Castleford, Orrell and Halcyon all got less work than they bought, and once the report hours are added two of them read as level or better. That is a real shortfall hidden behind a line the client never asked for, and reporting it as level is the accurate answer that loses accounts.

Thirty-three notable movements, sixteen with a cause the dates allow

Notable is 15 per cent or more against the prior month. A piece of work is a candidate cause only when it went live before the movement began, with the gap inside that channel's own measured lag window.

ChannelLag window, measuredObservations behind itWhat it means for a claim
Paid search0 to 3 days41A change on the 2nd can explain a movement from the 2nd to the 5th
Paid social0 to 4 days28Creative live on the 3rd can explain a movement to the 7th
SEO and content14 to 56 days33A page published this month explains nothing this month
Email0 to 2 days22The easiest channel on the book to attribute honestly
Landing pages and CRO0 to 7 days17Provisional. Under twenty observations behind it
VerdictMovementsShareWhat the report says
Attributed1648.5%Names the work and the date it went live
Ambiguous26.1%Names every candidate and declines to choose
Impossible39.1%The only candidate went live after the movement began
Unattributed1236.4%Nothing in the delivery log. Reported, not hidden
Total33100%

The three impossible ones are the interesting column. Thornbury's form completion rate rose from the 4th and the shortened form went live on the 19th. Orrell's quote form starts fell from the 9th and the hire calculator went live on the 16th. Wrenbury's consultation form improved from the 10th and the trust panel went up on the 24th. All three were claimed.

Reporting twelve unattributed movements is what makes the sixteen attributed ones worth reading. A report that claims everything is claiming nothing, and clients can usually explain several of the twelve themselves.

The same report, pulled twice, disagrees with itself

March pulled on 1 April and re-pulled on 14 April. Thirteen days, chosen because Google documents attribution credit for key events moving for up to twelve. Nine of the thirty-five tracked movements had a different value the second time, and three crossed the notable threshold in one pull and not the other.

ClientMetricPulled 1 AprilPulled 14 AprilNotable thenNotable now
Thornbury KitchensCost per lead-14.0%-15.6%NoYes
Peregrine OutdoorsNon-brand clicks+13.9%+16.2%NoYes
Castleford MotorsOrganic sessions+16.8%+14.2%YesNo
Findings that existed only because of the pull date3

Four documented reasons a number changes after it is reported, none of which is anybody's fault and all of which are in the platforms' own documentation.

CauseWhat it doesWhat the sheet does about it
Processing windowData processing can take 24 to 48 hours, and reports may change inside itFlags any metric whose period ends inside the window as provisional
Attribution modellingCredit for a key event can keep moving for up to twelve days after the event is recorded, as the modelling improvesSets the re-pull at day thirteen, past the end of that window
Click-date reportingAd platforms report a conversion against the click that produced it, not the day it happened, so a March row keeps filling in through AprilRecords which basis each metric uses before joining it to a date
Privacy thresholdsRows are withheld when the underlying group is small, and the threshold is system set rather than adjustableMarks a vanished segment as withheld rather than as zero

A pull timestamp on every sheet costs nothing and turns "the numbers keep changing" from a complaint into a measured property of the platform. Keeping both pulls turns it into a restatement history, which is a stronger document than the one that quietly replaced the first number with the second.

What's in the pack

01

Work Delivered Against Retainer sheet

Hours bought against hours worked by workstream, with report production as its own line rather than folded in or left out. Then the effective rate each client pays, the agency's cost per delivered hour, and margin in dollars and per cent.

02

Performance by Channel sheet

Every tracked movement with its prior value, its current value, the day it began, the candidate delivery item, the date that item went live, the gap in days, the channel's measured lag window and one of four verdicts. Each metric also records whether it is counted against the click or against the conversion, because the two disagree about which month a sale belongs to.

03

Trend sheet

Six months of hours delivered per client against hours bought. Scope drift is invisible in one month and unmistakable across six, and no client on the worked example had their retainer changed in that time.

04

Report Narrative

The client-facing document, in the order that survives the question. What the retainer bought comes first, then what moved with a verdict on each, then the shortest section on the page, then next month with hours attached.

05

Insight Note

The working note behind that shortest section. The five patterns worth writing up, the test an insight has to pass, and what to do with the unattributed movements rather than quietly leaving them out.

06

Next-month Plan

Every item carries the work, the hours out of the retainer, the metric it should move and the date it goes live. That makes the plan and next month's reconciliation the same document a month apart.

07

Retainer Conversation Note and eight prompts

The three shapes that conversation takes and the arithmetic to have ready for each, plus the method behind all of it. Which of these hours earn anything is the next question.

How it works

  1. 1

    Take the files or install the pack

    Four documents and three sheets as Word and CSV files with no account, or install the whole thing into a private Space with the agent already primed on the reconciliation and the attribution rule.

  2. 2

    Send the client list and last month's time log

    What each client pays, how many hours it buys, and where the hours actually went, including the ones spent making reports. Hours bought comes off the engagement letter, which is the same number the onboarding pack recorded when the client signed.

  3. 3

    Get the reconciliation before a single export

    Hours bought against hours delivered per client, the effective rate each pays, cost per delivered hour, margin, and the total delivered beyond what was purchased. One conversation, and it is the finding.

  4. 4

    Add the dated delivery log, then run the join

    What went live, when, in which channel, for which client. Every movement gets one of four verdicts, a segment that vanished is marked withheld rather than zero, and the reports assemble across the whole book from one computed base.

Frequently asked questions

Is this template free?

Yes. Four documents, three sheets and eight prompts with no signup and no card, and they are the same files the agent works in. Editing with AI is the optional path, where your own time log and platform exports build the reconciliation instead of the worked example doing it.

What format are the downloaded files?

CSV for Work Delivered Against Retainer, Performance by Channel and Trend, and Word for the four documents, zipped together. Excel, Numbers, Sheets, Word and Pages open them directly with nothing to install. The worked example ships in the cells, so the arithmetic is visible before you replace it.

Does this replace my reporting dashboard?

No. Keep it. A dashboard builds the performance half well and this adds the two halves it cannot: hours bought against hours delivered from your own time log, and every movement joined by date to what you actually shipped. Neither lives in a platform export.

We do not track time. Can we still use it?

The reconciliation needs hours, so some form of time record is the price of entry. Start with a rough weekly split per client and the reporting hours separately. Even approximate hours found 78.5 unpurchased ones on the worked example, which no amount of precision elsewhere would have.

Is it not risky to show a client the unattributed movements?

The opposite. A report claiming 16 movements and saying plainly that 12 have nothing behind them is believed. One implying all 33 is not, and the client already suspects it. They can also usually explain several of the 12, which is a better conversation than the paragraph it replaces.

Why does report production get its own line?

Because it is delivery time inside the retainer and it is large. On the worked example it is 8.3 per cent of every client hour and half of everything delivered beyond what was bought. Folding it into workstreams is how a reconciliation flatters itself.

Does this work for a project agency rather than retainers?

Partly. The attribution join and the pull-date discipline work on any engagement. The reconciliation needs a purchased quantity to compare against, which for project work is the estimate rather than a monthly hour count. Close each job against the estimate and the same variance shows up. A law or consulting firm runs the same bought-against-delivered discipline as realization, covered in the professional-services operations pack.

Find out how many hours your retainers gave away last month

Download the blank pack as Word and CSV files, or open it in River, send the client list and one month of time, and get the reconciliation back before any export is touched.

Edit with AI