Back to the build library
Professional services
Standard

Monthly Client Reporting Cadence

A reporting rhythm clients can set their watch by - data collected, draft reviewed, report sent and read, on the same date every month.

Industry
Professional services
Build effort
Standard
Typical time to launch
2–3 weeks
On this page
The problemWhat gets builtHow it runsAutomations in detailWhat changesBefore you start
Want this built for you?

Bring your stack to a call and we will scope it against how your business actually runs.

Book a call
01

The problem

Client reporting is the most reliable predictor of whether a professional services relationship survives, and the first thing a busy firm lets slide. The pattern is always the same. The engagement starts well and the first report lands on the fourth of the month, thorough and on time. The second lands on the ninth. The third gets skipped because the account manager was on a pitch, and nobody notices because the client did not ask. By month six the client has stopped expecting anything, and the firm has lost the one artefact that reminds them every month why they are paying. When the renewal comes round, the client has no accumulated evidence of value - just an invoice and a vague sense that things seem fine.

The operational failure is that reporting is treated as a task rather than a cycle. Nobody owns the date. The data has to be pulled from three systems by whoever remembers, the commentary gets written at 11pm by someone who was not in the delivery meetings, and the report either goes out late or goes out on time with last month's numbers lightly edited. Quality varies wildly between account managers, because there is no template that forces the same sections, and nothing checks whether the client actually opened it. A report that was sent and never read is indistinguishable, in most firms' records, from a report that was read twice and forwarded to a board.

The money leaks in two directions. Upward, through churn and failed renewals that the firm experiences as a surprise: no report means no visible value, and no visible value means the retainer looks like a line item to cut. Downward, through the time the firm burns producing reports inefficiently - the same account manager assembling the same numbers by hand every month, the same partner reviewing a draft that arrived two hours before it had to go out. This build turns reporting into a dated cycle with a data window, a draft deadline, an internal review gate, a send date the client learns to expect, and read tracking that tells the firm whether any of it is landing.

02

What gets built

Pipeline and stages

One pipeline, Reporting Cycle, with one opportunity per client per month. The card is created automatically at the start of each cycle and closed when the cycle completes, so the pipeline at any moment is a live board of where every client's report has got to.

  • Cycle Open - Data Window - created on the data-window open date. Waiting on inputs.
  • Data Complete - all sources confirmed or exceptions logged.
  • Draft Built - numbers in, commentary written.
  • Internal Review - with the reviewing partner or practice lead.
  • Report Sent - out to the client.
  • Report Viewed - automatic, from the view webhook.
  • Review Call Booked - only on tiers that include a call.
  • Cycle Closed - report read or call held, feedback captured, card closed.
  • Cycle Missed - the honest stage. A cycle that did not go out is recorded as missed rather than quietly deleted, because the missed-cycle count is the number this build exists to drive to zero.

A second pipeline, Reporting Exceptions, holds blocked cycles: missing data from a client, a system outage, a client who has asked to pause. Stages: Logged, Chasing, Resolved, Written Off.

Calendars

  • Monthly Report Review - 30 minutes, assigned to the account owner, offered only to clients on a tier that includes a call. Recurring slot held at the same point each month where the client wants it.
  • Quarterly Business Review - 60 minutes, assigned to the account owner with the reviewing partner optionally attached, booked in the third month of each quarter.
  • Internal Reporting Day - a blocked calendar event on each account owner's calendar on the draft-due date, created by the automation. Not a meeting; a defended slot so the draft has somewhere to happen.
  • Data Clarification Call - 15 minutes, surfaced only when the client owes data and has not sent it after two prompts.

Custom fields

  • reporting_active - checkbox
  • report_tier - dropdown: Summary only, Full report, Full report plus monthly call, Full report plus quarterly call
  • report_send_day - number, the day of the month the report goes out. Set per client, not firm-wide.
  • data_window_open_day, draft_due_day, review_due_day - numbers, derived from report_send_day
  • report_period_label - text, written each cycle, e.g. "September 2026"
  • report_recipients - text, the named people who receive it
  • report_cc_list - text, anyone copied, typically a finance or exec contact
  • report_format - dropdown: Hosted link, PDF attachment, Both
  • report_data_sources - long text, the explicit list of systems and who owns pulling each
  • client_kpi_1, client_kpi_2, client_kpi_3 - text, the three metrics this client actually cares about, in their words
  • account_owner - user reference, writes the report
  • report_reviewer - user reference, signs it off
  • last_report_sent_date, last_report_viewed_date
  • report_view_count - number, this cycle
  • on_time_streak - number, consecutive cycles sent on or before the send day
  • missed_cycle_count - number, running total
  • client_data_outstanding - checkbox, set when the blockage is on the client's side
  • report_commentary - long text, the account owner's narrative for the cycle
  • reporting_paused_until - date
  • last_feedback_score - number, from the one-question feedback prompt

Tags

  • reporting-active - the master gate. Nothing in this build touches a contact without it.
  • data-pending, data-pending-client - the second distinguishes a delay the firm owns from one the client owns, and they get completely different handling
  • draft-overdue, review-overdue
  • report-sent, report-viewed, report-unopened
  • report-late - applied when the report goes out after report_send_day
  • cycle-missed
  • quarter-end-cycle - applied automatically in the third month of each quarter, switches the template to the quarterly version and adds the QBR offer
  • reporting-paused - the manual brake, with reporting_paused_until as its release date
  • report-reader, report-non-reader - behavioral tags applied after three cycles, used to decide whether a client needs a different format rather than more emails

Forms

  • Reporting Setup - internal, completed at onboarding. Captures report_tier, report_send_day, recipients, format, the three client KPIs in the client's own words, data sources and who owns each, and the reviewer. Writes every field and switches reporting_active on. Until this form is completed, the client has no reporting cycle, which is deliberate - it makes the gap visible.
  • Client Reporting Preferences - client-facing, sent in the first week of an engagement. Asks what they want to see, who should receive it, whether they want a call, and what date in the month suits them. Writes back to the same fields so the cadence is the client's rather than the firm's.
  • Data Request - sent to the client when a source needs their input. Structured by source, with a due date.
  • Report Feedback - one question plus an optional comment, linked at the foot of every report: "Was this useful?" with a 1 to 5 scale. Writes last_feedback_score.
  • Reporting Exception - internal, required to move a cycle to Cycle Missed. Reason, who owned the blockage, and what will change next cycle.

BO's role and guardrails

BO handles the chasing and the logistics, which is where most of the human time goes.

  • BO chases client-owed data on the schedule in workflow 2, by email and SMS, and logs what arrives.
  • BO answers process questions on report replies: when the next one is due, what period it covers, who else receives it, how to get it in another format, how to add a recipient.
  • BO books and reschedules the Monthly Report Review, Quarterly Business Review and Data Clarification Call.
  • BO may resend a report link and may confirm dates - when it was sent, what period it covers, when the next one lands.
  • BO may never interpret, explain, caveat or defend a number in the report. Any reply asking why a figure moved, whether a result is good, what the firm is going to do about it, or questioning the data is routed to the account owner within 15 minutes with the message quoted, and BO replies only: "Good question - that is one for [owner] and I have flagged it to them. They will come back to you today."
  • BO may never discuss fees, hours used against hours contracted, scope, or anything about the renewal.
  • BO may never send a report. Sending is gated on the internal review being complete; BO cannot bypass that gate.
  • BO stands down as soon as a human replies in the thread.

Numbers and channels

  • Reports go by email from the account owner's own address on the authenticated firm domain. The report itself is a hosted link where possible, because a link can be tracked and a PDF attachment cannot. For clients who need a PDF for their own internal circulation, send both - the link for tracking, the attachment for them.
  • One registered SMS number, used for data-chase prompts and review-call reminders only. Never for sending the report and never for anything about numbers.
  • Internal notifications by Slack or Teams webhook into a reporting channel, carrying the daily cycle board: what is in data window, what is overdue, what went out, what was read.
  • Quiet hours 8am to 7pm recipient local time, weekdays, on SMS. Reports send at 09:00 local on the send day, which is early enough to be read before the day fills up.
03

How it runs, step by step

  1. A new engagement starts. The account owner completes the Reporting Setup form: Full report plus quarterly call, send day the 5th, three recipients, hosted link plus PDF, three KPIs written in the client's own language, four data sources with owners named, reviewing partner assigned. reporting_active goes on and reporting-active is applied.
  2. The derived dates are written: data_window_open_day the 28th of the prior month, draft_due_day the 2nd, review_due_day the 4th, report_send_day the 5th. In week one of the engagement the client receives the Client Reporting Preferences form; they move the send day to the 7th because their own board pack is due on the 10th, and the fields update.
  3. On the 30th of the prior month the cycle opens. A card is created in Reporting Cycle at Cycle Open - Data Window with report_period_label set to the month just ending. data-pending is applied and a task lands on each named data owner.
  4. Three of the four sources come in automatically. The fourth needs a figure only the client has, so the Data Request form goes out with a due date of the 2nd, data-pending-client is applied and client_data_outstanding is set.
  5. The client has not responded by the 1st. BO sends a short chase, then an SMS prompt on the 2nd morning. The figure arrives that afternoon. data-pending-client is removed, the card moves to Data Complete, and the account owner is notified that they are unblocked.
  6. The 4th is the draft due date. The automation has already placed an Internal Reporting Day block on the owner's calendar and sent them a draft pack: the numbers, last cycle's commentary for continuity, the three client KPIs, and the client's last feedback score. The owner writes report_commentary and moves the card to Draft Built.
  7. The card moving to Draft Built notifies the reviewing partner with a 24-hour clock. The partner reads it, asks for one change to how a flat month is characterized, and the owner amends it. The partner marks review complete and the card moves to Internal Review then Report Sent.
  8. At 09:00 on the 7th the report goes out from the owner's address to the three named recipients with the finance contact copied. Hosted link plus PDF. report-sent and report-unopened applied, last_report_sent_date written, on_time_streak incremented to 4.
  9. Two hours later the primary recipient opens it. report-unopened removed, report-viewed applied, report_view_count set to 1, card moved to Report Viewed, and the owner notified. By the end of the day the count is 3 across two recipients, which the owner takes as a signal to expect questions.
  10. A recipient replies asking why the second KPI moved the way it did. BO recognizes this as interpretation, does not attempt an answer, routes it to the owner with the message quoted, and tells the client the owner will respond today. The owner replies within the hour.
  11. Nobody submits the feedback form. On the 10th the feedback workflow sends one short prompt, once. A recipient scores it 4 and comments that they would like the commentary at the top rather than the bottom. That writes to the account record and the owner changes the layout for next cycle.
  12. The cycle closes on the 12th. The card moves to Cycle Closed carrying the sent date, view count, feedback score and whether it went out on time. Nothing about it needs summarizing later, because the record is the summary.
  13. In the third month of the quarter, quarter-end-cycle is applied automatically. The template switches to the quarterly version with a three-month trend view, and the report email carries a Quarterly Business Review booking link. The client books it; the reminder chain and the partner pre-brief run from the calendar.
  14. Three cycles later the picture changes: the report is being sent on time but report_view_count has been 0 for two cycles running. The non-reader workflow applies report-non-reader and tasks the owner to ask the client directly what format would actually get read - a problem no amount of extra sending would have fixed, and one the firm would not otherwise have known it had.
  15. On the first working day of each month leadership receives the reporting health digest: on-time rate across the book, missed cycles with reasons, average feedback score, clients with zero views in the last two cycles, and every client without a reporting profile at all.
04

Automations in detail

1. Reporting Profile Setup

Trigger: Reporting Setup form submission, or a client reaching Fully Executed in the firm's proposal pipeline.

Conditions: none, and that matters - every new engagement gets a reporting profile or appears on the exception list.

Actions in order:

  1. Write report_tier, report_send_day, report_recipients, report_cc_list, report_format, report_data_sources, the three client_kpi fields, account_owner and report_reviewer.
  2. Derive and write the cycle dates: data_window_open_day as send day minus 7, draft_due_day as send day minus 3, review_due_day as send day minus 1. Roll any date that lands on a weekend back to the previous working day.
  3. Set reporting_active true, apply reporting-active, set on_time_streak and missed_cycle_count to 0.
  4. Create the recurring Internal Reporting Day block on the account owner's calendar on the draft due day, every month.
  5. Send the client the Client Reporting Preferences form from the account owner: "Hi [first name], before we start reporting I would rather build it around what you actually want than guess. Four questions: [form link]. In particular, tell me which date in the month is most useful - if you have a board pack or an internal review, I will land ours ahead of it."
  6. Wait 5 days. If the preferences form is not submitted, send one reminder, then proceed on the firm's defaults and notify the owner that the cadence was set without client input.
  7. On preferences submission: overwrite report_send_day, recipients, format, tier and the KPI fields with the client's answers, recalculate the derived dates, move the calendar block, and confirm to the client: "Set. Your report will reach [recipients] on the [send day] of every month, covering the month before. First one: [date]."
  8. Notify the account owner with the final profile so there is no ambiguity about what was promised.

Exit: single pass. Re-running on a profile change recalculates everything cleanly.

2. Cycle Open and Data Collection Window

Trigger: scheduled daily at 06:00. Fires for any contact tagged reporting-active where today is data_window_open_day.

Conditions: not tagged reporting-paused, or reporting_paused_until is in the past. A cycle card must not already exist for this period.

Actions in order:

  1. Create the cycle card in Reporting Cycle at Cycle Open - Data Window. Write report_period_label as the month about to end. Reset report_view_count to 0.
  2. Apply data-pending. Create one task per source named in report_data_sources, assigned to the owner named for that source, due on draft_due_day minus 1.
  3. If any source is marked as client-supplied: apply data-pending-client, set client_data_outstanding, and send the Data Request form from the account owner: "Hi [first name], one thing I need from your side for this month's report: [source]. Here is the form, it takes two minutes: [form link]. I need it by [due date] to get the report to you on the [send day] as usual."
  4. Wait 2 days. If client data is still outstanding, BO sends a chase: "Hi [first name] - still need [source] for the report. Quick form: [form link]. If it is easier to just reply with the number, do that and I will handle it."
  5. Wait 1 day. If still outstanding, BO sends SMS within quiet hours: "Hi [first name], [firm] here - we are waiting on [source] to finish your monthly report. Reply here or use [short link]. Reply STOP to opt out."
  6. Wait 1 day. If still outstanding, offer the 15-minute Data Clarification Call and notify the account owner: "[Client] has not supplied [source] after three prompts. Report will be late unless you proceed without it."
  7. If all sources are in: remove data-pending and data-pending-client, clear client_data_outstanding, move the card to Data Complete, and notify the account owner that they are clear to draft.
  8. If data is still incomplete on the draft due day: notify the owner and the reviewer, and branch - proceed with a stated gap and a note in the report, or log a Reporting Exception. The choice is a human's, and it is recorded either way.

Exit: card reaches Data Complete, or an exception is logged.

3. Draft Build and Internal Review Gate

Trigger: card reaches Data Complete, or today is draft_due_day.

Conditions: the review gate is mandatory. No report sends without report_reviewer marking review complete, which is what makes quality consistent across account managers rather than dependent on which one you got.

Actions in order:

  1. Send the account owner the draft pack by internal notification: this cycle's figures, last cycle's report_commentary for continuity, the three client_kpi fields, last_feedback_score and any feedback comment, and the client's view behavior over the last three cycles.
  2. Create a task on the owner due at 17:00 on draft_due_day: "Write commentary and move [client] [period] to Draft Built."
  3. Wait until 17:00 on the draft due day. If the card has not moved, apply draft-overdue and notify the owner: "[Client] [period] draft is due today and the client expects the report on the [send day]. Two days of slack left."
  4. Wait 1 day. If still not moved, notify the practice lead as well.
  5. On the card moving to Draft Built: remove draft-overdue, write report_commentary, move to Internal Review, and notify report_reviewer: "[Client] [period] report ready for review. Needs sign-off by [review_due_day] to send on time. Three things to check: do the numbers match the commentary, is a flat or bad month described honestly, and does it speak to [client_kpi_1]."
  6. Create a task on the reviewer due at 12:00 on review_due_day.
  7. Wait until 12:00 on the review due day. If review is not complete, apply review-overdue, notify the reviewer by email and SMS, and copy the practice lead. A reviewer bottleneck is the most common cause of a late report and it needs to be as visible as a late draft.
  8. If the reviewer requests changes: move the card back to Draft Built, notify the owner with the requested change, due within 4 working hours.
  9. On review complete: move the card to Report Sent and hand to workflow 4.

Exit: review complete, or the cycle is logged as an exception.

4. Report Send

Trigger: card moved to Report Sent, or the scheduled 09:00 send on report_send_day for any card that has cleared review.

Conditions: review complete, report_commentary not empty, recipients populated. Any failure halts the send and notifies the owner - a report sent without commentary is a spreadsheet, and sending one teaches the client to ignore the next.

Actions in order:

  1. Write last_report_sent_date. Apply report-sent and report-unopened.
  2. Branch on timing: if today is on or before report_send_day, increment on_time_streak. If later, apply report-late, reset on_time_streak to 0, and notify the practice lead with the reason captured from whichever stage overran.
  3. Branch on quarter-end-cycle: if applied, use the quarterly template with a three-month trend section and include the Quarterly Business Review booking link. Otherwise use the monthly template.
  4. Send from the account owner's address to report_recipients, copying report_cc_list: "Hi [first name], [report_period_label] report: [hosted link]. The short version before you click: [first two sentences of report_commentary]. The headline on [client_kpi_1] is [figure]. Anything in here you want to talk through, reply and I will call you - and if you would rather have this in a different shape, the one-question form at the bottom is the fastest way to tell me."
  5. If report_format includes PDF: attach it as well as linking, so the client can circulate it internally without sending round a tracked link.
  6. If report_tier includes a monthly call: include the Monthly Report Review booking link and move the card to Review Call Booked once a booking exists.
  7. Notify the account owner that the report is out, with the recipient list, so a wrong recipient is caught in minutes rather than next cycle.
  8. On the first view webhook: write last_report_viewed_date, set report_view_count to 1, remove report-unopened, apply report-viewed, move the card to Report Viewed, notify the owner.
  9. On each subsequent view: increment report_view_count. At count 4, notify the owner: "[Client] has opened the [period] report four times. It is being circulated - expect questions."

Exit: hands to workflow 5 if unopened after 3 days, otherwise to workflow 7.

5. Unopened Report Recovery

Trigger: 3 days after last_report_sent_date with report-unopened still applied.

Conditions: not reporting-paused. Capped at two attempts per cycle - this build never badgers a client about reading a report.

Actions in order:

  1. Send one short plain-text email from the owner: "Hi [first name], the [report_period_label] report is here if it got buried: [hosted link]. One line from it: [key figure sentence]. No need to reply."
  2. Wait 4 days.
  3. If still unopened, send a single SMS within quiet hours: "Hi [first name] - [owner] at [firm]. Monthly report is in your inbox from [date] if useful: [short link]. Reply STOP to opt out."
  4. Stop sending. Do not chase a third time.
  5. Notify the account owner: "[Client] has not opened the [period] report after two prompts."
  6. If the count of consecutive unopened cycles reaches 2: apply report-non-reader, remove report-reader if present, and create a task on the owner: "Ask [client] directly what format would actually get read. Options: shorter summary tier, the numbers in the body of an email rather than a link, a 15-minute call instead of a document, or a different recipient entirely. Two cycles unread is a format problem, not an attention problem."
  7. If the count reaches 3: notify the practice lead and flag the account in the next renewal risk review, because an engagement whose reporting nobody reads is an engagement with no visible value attached to it.

Exit: a view webhook, which applies report-reader and cancels this workflow.

6. Review Call Handling

Trigger: a booking on the Monthly Report Review or Quarterly Business Review calendar.

Conditions: branch on which calendar, and on appointment status afterwards.

Actions in order:

  1. Move the card to Review Call Booked. Send confirmation with the agenda: "Thirty minutes on the [period] report. I will keep it to three things: what moved, what it means for [client_kpi_1], and what we are doing next month. If there is a fourth thing you want on the list, reply and tell me now so I can prepare properly."
  2. Wait until 24 hours before. Send email reminder with the report link attached again, so the client can arrive having read it.
  3. Wait until 2 hours before. Send SMS reminder within quiet hours.
  4. Wait until 1 hour before. Send the account owner the pre-call brief: the report, the commentary, view count, last_feedback_score, any question the client raised on this cycle's report, and - for a quarterly review - the three-month trend and the retainer renewal date if one is within 120 days.
  5. Quarterly branch: also notify report_reviewer or the relationship partner, who should attend quarterly reviews even if they skip monthly ones.
  6. Wait until 1 hour after the slot. Branch on status.
  7. Showed: create a task on the owner due same day: "Send [client] the follow-up note with the three actions agreed." Send the client a short recap template for the owner to complete. Move the card to Cycle Closed.
  8. No-show: send one rebooking link, wait 2 days, send a second. If no rebooking, close the cycle and note the no-show on the account - two consecutive no-shows on a review call is a disengagement signal worth a partner conversation.
  9. Canceled with no rebooking in 7 days: notify the owner and the practice lead.

Exit: appointment status resolved and the cycle closed.

7. Feedback Capture and Cycle Close

Trigger: 3 days after the first view, or 7 days after send if never viewed.

Conditions: only one feedback prompt per cycle, ever. A second request for feedback on the same report is a cost, not a courtesy.

Actions in order:

  1. Send one short email from the owner: "Hi [first name], one question on the [period] report and then I will leave you alone: was it useful? [1 to 5 links]. If the answer is anything under a 4, the comment box is where you tell me what to change - I would rather rebuild it than keep sending something that is not landing."
  2. On submission: write last_feedback_score and the comment to the account record.
  3. If the score is 4 or 5: notify the owner, and if a comment was left, create a task to action it next cycle.
  4. If the score is 3: notify the owner with a task due in 2 days: "Call [client] about the report format - they scored it a 3."
  5. If the score is 1 or 2: notify the owner and the practice lead immediately. Create a same-day task on the owner to call, and suppress the next cycle's automated send in favor of a rebuilt report the owner sends by hand after the conversation.
  6. Wait 2 days. Move the card to Cycle Closed, carrying sent date, view count, feedback score, on-time flag and whether a review call was held.
  7. If three consecutive cycles score 4 or 5 and the client reads every report: notify the owner that this is the right moment to ask for a referral or a review, and hand to the firm's reputation workflow if one exists.

Exit: card closed.

8. Missed Cycle Escalation and Exception Handling

Trigger: scheduled daily at 08:00. Fires on any open cycle card where today is past report_send_day and the card has not reached Report Sent. Also triggered manually by a Reporting Exception submission.

Conditions: branch on whose fault the delay is, read from client_data_outstanding and the stage the card is stuck in.

Actions in order:

  1. Apply report-late. Reset on_time_streak to 0.
  2. Firm-side branch - stuck at Draft Built or Internal Review: notify the owner, the reviewer and the practice lead jointly. Send the client a holding message from the owner, which is not optional: "Hi [first name], your [period] report will be with you on [new date] rather than today - my fault, not yours. If you need any figure before then, ask and I will send it straight over." A late report the client is told about is a minor irritation; a late report they notice themselves is a trust event.
  3. Client-side branch - client_data_outstanding set: notify the owner and send the client: "Hi [first name], we are still waiting on [source] to finish the [period] report. Happy to send it without that section if you would rather have it now - just say which you prefer." Do not apologize for a delay the firm did not cause, and do not let it be invisible either.
  4. Wait 2 days. If still not sent, escalate to the practice lead with the stage and the owner named.
  5. Wait 3 days. If still not sent, notify the managing partner and require the Reporting Exception form.
  6. On exception submission: move the cycle card to Cycle Missed, increment missed_cycle_count, create a card in Reporting Exceptions at Logged with the reason and the owner, and create a task for the practice lead to review the fix before the next cycle opens.
  7. If missed_cycle_count reaches 2 for any one client: notify the managing partner and flag the account for renewal risk review. Two missed reports is how churn starts.
  8. If a single account owner accumulates 3 late cycles across their book in a quarter: notify the practice lead. This is a capacity signal about a person, not a quality signal about a client, and it should be read that way.

Exit: cycle sent, or exception resolved.

9. Quarter Flag, Pause Handling and Reporting Health Digest

Trigger: scheduled. The quarter flag runs on the first of each month at 05:00; the pause check runs daily at 05:00; the digest runs on the first working day of each month at 07:00.

Conditions: none.

Actions in order, quarter flag:

  1. If the current month is the third month of the firm's financial quarter, apply quarter-end-cycle to every contact tagged reporting-active, which switches workflow 4 to the quarterly template and adds the Quarterly Business Review offer.
  2. Remove the tag on the first of the following month.
  3. Notify each account owner of which of their clients are on a quarterly cycle this month, so they can allow extra drafting time.

Actions in order, pause handling:

  1. On a client request to pause, apply reporting-paused and set reporting_paused_until. Confirm to the client: "Paused until [date]. I will pick it back up then without you having to ask."
  2. Daily, check every paused contact. When reporting_paused_until is today, remove reporting-paused, notify the owner, and let the next cycle open normally. A pause with no end date is how reporting stops permanently.

Actions in order, health digest:

  1. Email the partner group and practice leads: on-time send rate across the book this month and trailing three months; every late cycle with the stage it stalled at and the owner; every missed cycle with its reason; average last_feedback_score and all scores of 3 or below; clients tagged report-non-reader; and a list of active clients with reporting_active false - the clients receiving no reporting at all, which is the most expensive list in the digest.
  2. Create one task per client on that last list, assigned to the account owner: "No reporting profile for [client]. Complete the Reporting Setup form or log why not."

Exit: single pass per scheduled run.

05

What changes

Reporting stops depending on who remembered. Every active client has a send date they chose, a data window that opens on its own, a draft deadline with a defended calendar slot behind it, and a review gate that no report gets past without a second pair of eyes. The client learns the rhythm within two cycles, and that predictability is itself the product - a client who knows the report lands on the seventh does not spend the sixth wondering whether the firm is paying attention.

Two less obvious things change. Quality stops varying by account manager, because the review gate and the fixed template force the same sections, the same three client KPIs and the same honesty about a flat month. And the firm gains information it has never had: whether reports are read. A report sent on time to a client who has not opened one in three months is a very different situation from a report sent late to a client who reads every page twice, and until view tracking exists both look identical in the records. The non-reader path turns that into a format conversation rather than another unread email.

What to measure:

  • On-time send rate - the headline number. Measure it per client, per account owner and across the book, and put it in front of partners monthly.
  • Missed cycle count - absolute, by client. Target zero. Any client at two is a renewal risk regardless of how the work itself is going.
  • Open rate and view count per cycle - the engagement signal. A falling view count on a client who used to read everything is one of the earliest churn indicators a firm can get.
  • Where cycles stall - time spent at Data Window, Draft Built and Internal Review. Almost every firm discovers its bottleneck is the review gate, not the drafting, which is useful because it is also the easiest to fix.
  • Client-side versus firm-side data delays - from client_data_outstanding. If most delays are client-side, the fix is the data request process, not the account managers.
  • Feedback score trend and comment themes - the comments are worth more than the scores. Three clients asking for the commentary at the top is a template change, not three conversations.
  • Coverage - the count of active clients with no reporting profile at all. This is usually the most surprising number in the first digest.

Downstream, the reporting record becomes the evidence base for renewals. When the renewal window opens, the firm can point at twelve months of on-time reports that the client demonstrably read, rather than reconstructing value from memory.

06

Before you start

Decide these first

  • Whether the send day is per client or firm-wide. Per client is better for the client and harder for the firm, because reporting load spreads across the month rather than clustering. Firm-wide is easier to staff but means the date suits nobody in particular. If you go per client, cap how many clients can share any one send day so no account owner has six reports due on the same morning.
  • Who reviews. The review gate is the difference between consistent reporting and variable reporting, and it is also the step most likely to become the bottleneck. Name a reviewer per client and a deputy, and be honest about whether that person has the hours.
  • The template, and the three KPIs. Build one report template with fixed sections and resist per-client variation beyond the three KPI fields. The commentary is where personalization belongs, not the structure.
  • What a tier actually includes. Summary only, full report, full report plus a call - write down what each means in deliverable terms before anybody is sold one, or the tiers will drift into meaning nothing.
  • Whether a bad month gets reported honestly. This is a cultural decision, not a technical one, and it is worth making explicitly. The review gate can enforce it; somebody has to decide that it should.

Integrations

  • Data sources - the honest prerequisite. Every figure in the report needs a source that can be pulled on a schedule or supplied through the data request form. Enumerate them per client in report_data_sources with a named owner each, and accept that any source requiring a person to log in and copy numbers will be the one that makes reports late. Automate what you can, and make the rest a dated task rather than a habit.
  • Report hosting with view webhooks - whatever hosts the report must call back on every view. Without it, workflows 5 and 7 and half the metrics have nothing to work from.
  • Calendar - Google Calendar or Outlook, two-way sync, for review calls and for the Internal Reporting Day blocks.
  • Document generation - whatever produces the PDF, if the firm sends one. Google Drive or SharePoint for storing the archive, so a client asking for March next year does not need somebody to rebuild it.
  • Internal notifications - Slack or Microsoft Teams webhook into a reporting channel, plus direct notification for the draft and review clocks.

Numbers, SMS and deliverability

  • Provision one SMS number and complete A2P 10DLC brand and campaign registration in the United States, or the local equivalent. Register it as customer care or account notifications. Start weeks ahead of launch.
  • Opt-out language on first SMS contact, STOP honoured automatically and globally. Note that SMS here is only for data chases and call reminders - the report itself never goes by SMS.
  • Quiet hours 8am to 7pm recipient local time, weekdays only, enforced in the workflow.
  • SPF, DKIM and DMARC on the firm domain. Reports send from the account owner's real address. A monthly report landing in a promotions tab is worse than no report, because the firm believes it is being read.
  • Watch attachment size if sending PDFs. A report that bounces on size is a missed cycle the firm will not notice.

Data handling

  • Client reports frequently contain commercially sensitive figures and sometimes personal data about the client's own customers or staff. Restrict who can open hosted report links, set them to expire, and never make them guessable.
  • Keep an archive of what was sent and when. Regulated clients may need to show it, and it is also the evidence base for the renewal conversation.
  • Set a retention period for report view logs rather than keeping behavioral data indefinitely.
  • Recipient lists go stale. Build a quarterly prompt to confirm report_recipients is still right - a report going to someone who left the client's business six months ago is both useless and a disclosure problem.

Compliance

  • Monthly reporting to an existing client under a live engagement is service communication rather than marketing, so it sits outside most marketing consent regimes. The feedback prompt and the review-call offer sit in the same category. Nothing in this build should need a marketing opt-in, but keep the service and marketing consent states as separate fields so that stays true.
  • In the United Kingdom and European Union, client contact details and report view data are personal data under the GDPR or UK GDPR. Cover reporting in the firm's privacy notice, keep retention limited, and be able to say what the view tracking collects.
  • If reports carry the client's own customer or patient or employee data, the firm is likely a processor for that data and the engagement should have a data processing agreement behind it. That is a contractual question, not a workflow one, but the workflow is where the exposure shows up.
  • Sector rules may apply to the content of a report - financial promotions, legal advice, clinical information and audit findings all carry their own requirements about who may say what.
  • None of this is legal advice. Have the firm's own counsel confirm data processing arrangements, retention periods, cross-border transfer where reports go to overseas recipients, and any sector-specific reporting obligations before go-live. Where the scope and pricing of a build need working out, point the client at a scoping call at bookings.appbo.io.
Field notes

Build it with us.

Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.

Book a call