Agencies · Retainer margin
DashboardAgency operationsMargin per client from hours and retainers, with an over-servicing alert
Most agencies find out a retainer lost money at the quarterly review. This dashboard joins hours and invoices every day, shows margin per client, and alerts the account lead while there is still time to talk to the client.
Valnora & Elric team5 min read
Clients by hours used against scope
| Client | Retainer | Hours used | Month done | Margin | Status |
|---|---|---|---|---|---|
| Client A (beauty) | $22,000 | 128 of 120 | 40% | 24% | Over scope |
| Client C (food) | $9,000 | 61 of 70 | 40% | 18% | At risk |
| Client B (fintech) | $30,000 | 96 of 180 | 40% | 38% | On track |
| Client D (travel) | $12,000 | 35 of 80 | 40% | 45% | On track |
Daily
How often margin per client is updated
Illustrative. Instead of a quarterly spreadsheet review.
Week 2
When over-servicing becomes visible
Illustrative. The monitor fires on pace, not at month end.
1
Definition of margin across every chart
The measure lives in the semantic model, not in each sheet.
Illustrative example. Figures show how the workflow is measured; they are not customer results.
Agency retainers rarely lose money in one big moment. They lose it in small requests: one more round of edits, a quick extra format, a call that ran long. Each one is reasonable. Together they turn a 35% margin into 15%, and the agency finds out at the quarterly review, when the client has already got used to the extra work.
The fix is not a stricter team. It is seeing hours against scope while the month is still open. This post walks through a retainer dashboard built with Agent Serve Dashboards that joins time tracker hours with QuickBooks invoices every morning and alerts the account lead when a client is running hot.
Getting hours and invoices into Tables
Dashboard panels read workspace Tables, so the first piece is a scheduled workflow that fills them each morning.
- Hours. If the team uses Harvest, the generic API block calls Harvest’s time entries API, with the API token stored as a workspace secret. Harvest is not a built-in integration, so this is a plain HTTP call that you configure once. If the team logs time in a shared Google Sheet, the Google Sheets block reads it instead.
- Retainer revenue. The QuickBooks block reads sales transactions and invoices for each customer.
- Mapping. A small client mapping table links the time tracker’s client names to QuickBooks customers. Names never quite match, and this table is where that gets fixed once instead of every month.
The workflow writes one row per time entry and one per invoice, with the client, month, role and hours or amount. Logs show every run block by block, so a missing day of hours is easy to trace.
One definition of margin
Agencies argue about margin because every spreadsheet computes it differently. Put the definitions in the semantic model once, as named metrics:
- Delivery cost is hours times the blended cost rate for the person’s role, agreed with finance.
- Retainer revenue is the invoiced retainer for the month, excluding pass-through media spend.
- Margin is revenue minus delivery cost, as a share of revenue.
- Scope used is hours logged against the hours in the retainer agreement for that month.
Every tile, chart and alert reads these measures, so the account lead and the finance director see the same number.
Reading the dashboard
The dashboard above is illustrative. Read it from top to bottom.
- KPI tiles. Retainer revenue, blended margin, clients over scope and unlogged days. Unlogged days matter: a margin that looks healthy because time was not logged is the most dangerous number on the page.
- Margin by month. A line per client shows drift. In the example, Client A has slid for four months before falling sharply in October.
- Clients by scope used. The table sets hours used against how far through the month you are. A client at 107% of hours with 40% of the month gone needs a conversation this week.
Drill from a client into time entries by person and task to see where the extra hours went. In the example, most came from unplanned design edits.
The over-servicing monitor
Monitors watch the scope-used measure for each client and re-check as often as every five minutes after new rows land. A good starting rule is pace-based: alert when scope used runs more than 15 points ahead of the share of the month gone, or passes 100% at any time.
What the solution produces
Over-servicing alert (illustrative)
MessageClient A (beauty) has used 128 of 120 scoped hours with 60% of October left.
Most extra hours: design (41 h) on unplanned social edits requested by the client.
Margin this month: 24%, against a 35% target.
Open the dashboard for time entries by person and task.
Alerts go to the account lead in the app, by email and in Slack. Each alert says which client, how far over, where the hours went and the margin so far. It does not message the client or change anything in QuickBooks. The account lead decides whether to raise scope, re-plan the work or accept it as an investment.
A monthly scheduled report sends the dashboard as a PDF to the managing director on the first working day, with the closing margin per client.
How to measure it
Daily
How often margin per client is updated
Illustrative. Instead of a quarterly spreadsheet review.
Week 2
When over-servicing becomes visible
Illustrative. The monitor fires on pace, not at month end.
1
Definition of margin across every chart
The measure lives in the semantic model, not in each sheet.
Illustrative example. Figures show how the workflow is measured; they are not customer results.
Access and records
Controls and governance
Row-level access
Row-level policies narrow what each person sees in tables, dashboards, exports and scheduled reports.
Roles and permission groups
Admin, write and read roles per workspace, plus permission groups that limit which models, blocks and integrations a team can use.
Run logs
Every workflow run records each block’s inputs, outputs and errors, so a reviewer can trace how a result was reached.
Audit trail
Proposals, approvals, declines and executed actions are written to the workspace audit log, which admins can export.
Deployed versions
Workflows run from a deployed version, so a change is reviewed before it reaches production runs.
SSO and SCIM
Sign in through your identity provider with SAML 2.0 or OIDC, and provision people with SCIM.
More on how Agent Serve handles access, data and audit on the security page.
Margin and cost rates are sensitive inside an agency. Row-level access policies give each account lead their own clients only, on the dashboard, in exports and in scheduled reports, while finance sees everything. The sync workflow runs from a deployed version, so a change to the cost rates or the mapping is reviewed before it reaches the numbers.
Where to start
Begin with your five largest retainers and one month of history. Agree the cost rates and scoped hours with finance before the first alert fires, or the first conversation will be about the numbers instead of the client. Once the margin view is trusted, the same Tables can feed the time section of your client reports.
Questions teams ask
Is Harvest a built-in integration?
No. Harvest is connected through the generic API block, with its API token stored as a workspace secret. If your team logs time in a Google Sheet instead, the Google Sheets block reads it directly.
Can account leads see each other’s clients?
Only if you allow it. Row-level access policies narrow the dashboard, exports and scheduled reports to each lead’s clients, while finance sees every client.
Does the dashboard update in real time?
It updates when the workflow runs, daily by default. You can run the sync more often, but timesheets are usually logged at the end of the day, so daily is enough for most agencies.
From timesheets and invoices to a margin alert
Workflow · Daily sync
- 01ScheduleRuns every morning before the team starts, and on demand from Chat.
- 02Time entriesHarvest’s API through the API block with a key stored as a workspace secret, or a timesheet Google Sheet.
- 03Retainer invoicesThe QuickBooks block reads sales transactions and invoices per customer.
- 04Hours and revenue tablesOne row per time entry and per invoice, mapped to a client and a month.
Dashboard · Margin per client
- 05Shared measuresDelivery cost, retainer revenue, margin and hours used against scope, defined once.
- 06Retainer dashboardMargin by client and month, hours against scope, and a client table.
- 07Over-servicing monitorAlerts when a client passes the agreed share of scoped hours before month end.
- 08Account lead actsDecides whether to talk scope with the client, re-plan work or accept it.
What you need
- Harvest API access (a token stored as a workspace secret) or a timesheet Google Sheet with client, person, date and hours
- QuickBooks connected, with retainer invoices raised against a consistent customer name
- A client mapping table that links time tracker clients to QuickBooks customers
- Blended cost rates by role, agreed with finance
- Scoped hours per client per month, from each retainer agreement
- An agreed over-servicing threshold and an owner per client