Monthly client reports assembled from platform data, approved once, and sent on schedule without anyone rebuilding a deck.
Bring your stack to a call and we will scope it against how your business actually runs.
Book a callAn agency running the platform on behalf of a roster of clients owes each of them a monthly accounting of what the retainer bought. In practice that accounting is assembled by hand. An account manager opens each client workspace, screenshots the pipeline view, exports a call log, copies lead counts into a spreadsheet, pulls ad spend from a separate ad account, writes two paragraphs of commentary, and drops the whole thing into a slide template. Multiply that by fifteen clients and the first week of every month disappears into assembly labor that no client is paying for directly.
The second-order damage is worse than the hours. Because assembly is manual, reports go out late and unevenly. The three loudest clients get theirs on the third of the month; the quiet ones get theirs on the fourteenth, or not at all. For a retainer client who is not on a weekly call, the monthly report is the single largest piece of evidence that work is happening. When it arrives late, or arrives as a wall of numbers with no narrative, the client builds their own story about the value they are getting, and that story is almost always worse than reality. Cancellations that look sudden are usually preceded by two or three reporting cycles that landed flat.
There is an internal cost too. Because the numbers are only assembled once a month under deadline pressure, nobody is watching them in between. A client whose booked-call volume halved in week two is discovered in week five, when the report is finally built. The same data that should function as an early-warning system is instead a historical artifact produced too late to act on. The money leaks in three places at once: unbilled assembly hours, retainers lost to silence, and remediation work that would have been cheap if it had started two weeks earlier.
The cycle lives in a pipeline named Client Reporting Cycle inside the agency's own workspace, not inside client workspaces. One opportunity per client per month, created automatically on the first of the month.
Created on the client record held in the agency workspace. Every number here is written by a workflow, never typed by hand.
One client, one cycle, end to end. The client in this walkthrough is on the Premium tier with a send day of 5.
Trigger: scheduled, 00:30 on day 1 of each month, agency timezone.
Conditions: runs for every client record where client_account_name is not empty and the tag reporting-paused is absent. Records tagged reporting-paused are skipped silently and written to a skipped list posted to Slack, so a pause is visible rather than invisible.
Actions, in order:
Stop or exit: if any mtd_ field is still empty 30 minutes after step 3, halt the record, apply no cycle tags, and post a named data-failure alert to Slack. A cycle with missing data must never progress to draft.
Trigger: opportunity enters Data Collecting with report_cycle_status of Collecting and all mtd_ fields populated.
Actions:
Stop or exit: exits if the opportunity is moved out of Data Collecting by a human, or if reporting-paused is applied mid-run.
Trigger: tag report-draft-ready applied.
Actions:
Stop or exit: cancels immediately on form submission, which writes commentary_wins, commentary_misses and commentary_next_focus, removes report-commentary-overdue, and hands off to workflow 4. Also exits on reporting-paused.
Trigger: Commentary Capture form submitted.
Actions:
Branches: reviewer applies report-approved, which moves the opportunity to Approved to Send and hands off to workflow 5. Or the reviewer moves it to Revisions, which sends the reviewer's notes back to the commentary owner, clears report-approved if present, and restarts the chase clock at step 4 of workflow 3 with a 12-hour rather than 24-hour first wait.
Stop or exit: never auto-approves and never sends. An unreviewed cycle misses its send day and is reported as a miss, which is the correct failure mode.
Trigger: tag report-approved applied.
Conditions: holds in a wait-until step for day report_send_day at 08:00 in reporting_timezone. If approval lands after that moment in the current month, send within the hour rather than waiting a month.
Actions:
Stop or exit: exits if report-approved is removed before the send moment, which is the abort handle for a report caught as wrong after approval.
Trigger: tag report-sent applied.
Conditions: every step checks last_report_opened_date against last_report_sent_date and exits the moment an open is recorded.
Actions:
Stop or exit: cancels on any open, on a reply from the client, or on report-reviewed-live.
Trigger: booking confirmed on either review calendar.
Actions:
Stop or exit: cancels on cancellation of the booking, which also sets review_call_booked back to no and re-arms workflow 6 from step 2.
Trigger: tag variance-down or variance-up applied.
Conditions: fires once per client per cycle. Suppressed entirely for clients inside their first full month, where no meaningful prior-month baseline exists.
Actions:
Stop or exit: exits if variance_flag returns to Flat before the send, or if reporting-paused is applied.
Trigger: scheduled, 23:00 on the last day of each month.
Conditions: applies to every opportunity in Client Reporting Cycle not already at Cycle Closed.
Actions:
Stop or exit: a single run per month, no retries. If the run fails it alerts and waits for a human rather than re-firing against partially closed records.
Scope, configuration and effort vary by roster size and by how many data sources are in play. To talk through what this looks like for a specific agency, book a call at bookings.appbo.io.
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