Back to the build library
Professional services
Advanced

Timesheet and Scope Creep Alerts

Track logged hours against each retainer in real time and alert the account owner the week an engagement starts eating its own margin.

Industry
Professional services
Build effort
Advanced
Typical time to launch
3–4 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

Scope creep almost never announces itself. A client asks for one extra round of revisions, a second stakeholder joins the weekly call, a "quick question" thread turns into four hours of analysis. None of those moments feels like a billing event, so nobody raises it. By the time the month closes and someone finally compares logged hours against the retainer, the overage is already delivered, already unbilled, and already impossible to walk back without an awkward conversation.

The money leaks in three places. First, hours worked beyond the retainer that are never invoiced at all: pure giveaway. Second, the opportunity cost of those hours, because the senior person absorbing the extra work is the same person who would otherwise be scoping new engagements. Third, renewal pricing: an account that has quietly been over-serviced for nine months gets renewed at the old number, because no one has the evidence to justify a different one. The practice looks busy and profitable in aggregate while two or three accounts are running at or below cost.

The usual fix is a monthly utilization report, which is too late to be useful by definition. What an operator actually needs is a running comparison between hours logged and hours sold, per engagement, refreshed as timesheets come in, with an automatic nudge to the account owner the week an engagement crosses a threshold, while there is still time to have a scope conversation rather than a refund conversation. That is what this build does: it turns every engagement in the platform into a budget with a tripwire on it.

02

What gets built

Pipeline and stages

One pipeline, Engagement Health, with every live engagement as an opportunity. The opportunity is not a deal here. It is the engagement itself, moved through stages by burn rate rather than by sales activity.

  • Onboarding: engagement signed, baseline set, time tracking not yet flowing.
  • On Track: burn under 70 percent of sold hours and pace in line with the calendar.
  • Watch: burn between 70 and 89 percent, or pace running ahead of calendar by more than 15 points.
  • At Risk: burn 90 to 99 percent with time left in the period.
  • Over Scope: burn at or above 100 percent of sold hours.
  • Scope Conversation Booked: a call with the client is on the calendar.
  • Scope Change Agreed: additional hours sold, or deliverables trimmed, and the baseline reset.
  • Absorbed: a deliberate decision to eat the overage, recorded with a reason.
  • Period Closed: the billing period rolled, counters reset.

A second pipeline, Scope Change Requests, handles the commercial side: Drafted, Sent to Client, In Negotiation, Approved, Declined, Invoiced.

Calendars

  • Scope Review Call: 30 minutes, round-robin across account owners, one-hour minimum notice, maximum four per day per owner. This is the calendar linked from every client-facing alert.
  • Internal Margin Review: 45 minutes, weekly recurring team slot, used as the destination for engagements sitting in At Risk for more than seven days.
  • Quarterly Retainer Review: 60 minutes, booked automatically 21 days before each engagement's renewal date so the burn history is discussed before the renewal number is set.

Custom fields

On the opportunity (engagement) record:

  • Engagement Code: the key the time-tracking system sends, and the join between the two systems. Text, unique.
  • Sold Hours Per Period: number.
  • Billing Period Type: dropdown: Monthly Retainer, Quarterly Retainer, Fixed Fee Project, Time and Materials Cap.
  • Period Start Date and Period End Date: dates, rolled forward automatically at period close.
  • Hours Logged This Period: number, incremented by the ingestion workflow.
  • Hours Logged Lifetime: number, never reset.
  • Burn Percentage: number, recalculated on every entry.
  • Expected Burn Percentage: number, the share of the period that has elapsed. The gap between this and Burn Percentage is the pace signal.
  • Pace Variance: number, Burn Percentage minus Expected Burn Percentage.
  • Overage Hours: number, zero until burn passes 100.
  • Overage Decision: dropdown: Not Yet Decided, Bill Client, Absorb, Trim Deliverables, Pause Work.
  • Overage Decision Reason: long text, required before an engagement can be marked Absorbed.
  • Last Alert Threshold Fired: dropdown: None, 70, 90, 100, 120. Prevents repeat alerts at the same level.
  • Last Alert Date: date, used by the cooldown logic.
  • Account Owner: user reference.
  • Delivery Lead: user reference, often different from the account owner.
  • Scope Document Link: URL to the signed statement of work.
  • Renewal Date: date.
  • Consecutive Over Scope Periods: number. Two or more is a pricing problem, not a delivery problem.

On the contact record, for the client-side sponsor:

  • Primary Sponsor: switch.
  • Scope Approval Authority: switch. Only contacts with this set receive approval requests.
  • SMS Consent Source and SMS Consent Date.

Tags

  • engagement-on-track, engagement-watch, engagement-at-risk, engagement-over-scope: applied and removed by the threshold workflows, mutually exclusive.
  • pace-ahead: burn running more than 15 points ahead of the calendar.
  • overage-unbilled: overage hours exist with no scope change raised.
  • chronic-over-scope: two or more consecutive over-scope periods. This is the renewal flag.
  • scope-call-requested, scope-call-booked, scope-call-no-show.
  • timesheet-gap: no entries received for an active engagement in five business days. Catches silent integration failures.
  • do-not-sms-client: suppression tag honoured by every client-facing step.

Forms and surveys

  • Engagement Setup: internal form used at kickoff to create the Engagement Health opportunity: client, engagement code, sold hours, period type, period dates, owner, delivery lead, scope document link, renewal date.
  • Scope Change Request: internal form the account owner completes from the alert. Captures what was requested beyond scope, hours required, whether it is billable, and the recommended action. Submitting it creates an opportunity in the Scope Change Requests pipeline.
  • Overage Decision: short internal form that writes Overage Decision and Overage Decision Reason. The absorb path cannot be taken without a reason.
  • Client Scope Confirmation: client-facing form summarizing the additional hours and the deliverables they cover, with a confirmation checkbox and a name field. Submission moves the Scope Change Request to Approved.
  • Post-Period Delivery Survey: one question sent at period close to the sponsor: whether the work delivered matched what they expected. Useful context when burn and satisfaction disagree.

BO's role and guardrails

BO handles the internal reporting conversation and the first layer of client scheduling, and nothing that commits the firm commercially.

  • What BO does. Answers internal queries in the team channel, which engagements are over scope, what the burn is on a named account, which accounts are chronically over scope. Drafts the scope-change summary from the Scope Change Request form so the account owner edits rather than writes. Handles client replies to scope-call invitations: offers times, books the Scope Review Call, confirms, reschedules.
  • What BO never does. Never quotes a price, a rate or a figure to a client. Never states how many additional hours will be charged. Never tells a client that work is paused or will continue. Never sends the scope change itself. A human sends that. Never shares another client's data, and never shares per-person timesheet detail with anyone outside the manager group.
  • Escalation rules. If a client asks what the extra work will cost, BO replies once with a scheduling offer and hands off: “That is exactly what [Owner] wants to walk you through. Shall I put 30 minutes in for you?” If a client pushes back on being charged, BO tags the conversation needs-human and stops. If a client says anything resembling a complaint about the engagement, BO escalates immediately and does not attempt to resolve it.
  • Tone. Plain, short, no apologizing for the conversation. The scope conversation is a normal part of a well-run engagement, and the copy should sound like it.

Numbers and channels

  • One dedicated outbound number for the practice, brand and campaign registered, used for both internal alerts and client messaging. Register the use case as account notifications and customer care.
  • Internal alerting runs on two channels in parallel: a Slack channel (#engagement-health) for visibility, and SMS to the named account owner for anything at 90 percent or above. Email alone is not sufficient. It is the channel where margin warnings go to die.
  • Client-facing messaging runs on email first, SMS second, and only to contacts with recorded consent and no suppression tag.
  • An inbound webhook endpoint for time entries, plus a second endpoint for engagement updates pushed from your practice-management tool if you have one.
  • A weekly internal digest email to the partner group, built from the Engagement Health pipeline.
03

How it runs, step by step

  1. A new engagement is signed. The account owner completes the Engagement Setup form: client Acme Industrial, engagement code ACME-RET-01, 40 sold hours per month, Monthly Retainer, period 1 to 31 of the month, owner named, delivery lead named, scope document linked, renewal date set twelve months out.
  2. The platform creates an Engagement Health opportunity in Onboarding, writes the custom fields, sets Hours Logged This Period to zero, and tags the record engagement-on-track.
  3. The same workflow posts the engagement code to the team channel and asks the delivery lead to confirm the matching project exists in the time-tracking system under exactly that code. A mismatched code is the single most common reason this build goes quiet.
  4. The first time entry arrives through the webhook: engagement code ACME-RET-01, 3.5 hours, role Senior Consultant, dated the 2nd. The ingestion workflow finds the opportunity by Engagement Code, adds 3.5 to Hours Logged This Period and to Hours Logged Lifetime, recalculates Burn Percentage to 8.75, recalculates Expected Burn Percentage to 6.5 based on elapsed days, writes Pace Variance of 2.25, and moves the opportunity from Onboarding to On Track.
  5. Entries continue daily. Nothing fires. On the 11th, cumulative hours reach 28.5: Burn Percentage 71.25, Expected Burn Percentage 35.5, Pace Variance 35.75. Two conditions trip at once: the 70 percent threshold and the pace check.
  6. The threshold workflow moves the engagement to Watch, swaps engagement-on-track for engagement-watch, adds pace-ahead, sets Last Alert Threshold Fired to 70, and posts to the team channel with the numbers and a link to the record. No SMS yet: 70 percent is information, not an emergency.
  7. On the 15th, hours reach 36.2. Burn Percentage is 90.5 against an expected 48.4. The 90 percent workflow moves the engagement to At Risk, applies engagement-at-risk, and this time sends SMS to the account owner as well as the channel post, with a direct link to the Scope Change Request form.
  8. The account owner opens the form and fills it in: the client added a second reporting workstream in week two, roughly 14 extra hours a month, recommended action is to bill it as an uplift. Submitting creates an opportunity in Scope Change Requests at Drafted and tags the engagement scope-call-requested.
  9. The client-facing workflow sends the sponsor an email inviting a short call, with the Scope Review Call booking link. The copy does not mention overage or cost. It frames the call as a check-in on the extra workstream. If the sponsor replies to the email with a question, BO handles the scheduling exchange and books the slot.
  10. The sponsor books for the 18th. The engagement moves to Scope Conversation Booked, the tag flips to scope-call-booked, and the account owner receives a pre-call brief 90 minutes before: sold hours, logged hours, pace variance, the scope document link, what the Scope Change Request form said, and the burn history for the previous three periods.
  11. On the call the account owner agrees an uplift with the client. They move the Scope Change Request to Sent to Client, which fires the Client Scope Confirmation form by email. The sponsor confirms and signs their name; the request moves to Approved.
  12. Approval writes the new figure into Sold Hours Per Period, resets Burn Percentage against the new baseline, clears engagement-at-risk, re-applies engagement-on-track, resets Last Alert Threshold Fired to None, and moves the engagement to Scope Change Agreed. The approved uplift is pushed to QuickBooks or Xero as a line on the next invoice.
  13. Meanwhile the same month's hours keep arriving. Because the baseline moved, burn against the new 54 sold hours sits comfortably, and the 100 percent workflow never fires. Had the client declined, the engagement would have gone to Over Scope at 100 percent, triggering the overage decision path and the pause-work prompt.
  14. At midnight on the 31st the period-close workflow runs. It snapshots Hours Logged This Period and Burn Percentage into a history record, rolls Period Start Date and Period End Date forward, resets Hours Logged This Period to zero, resets Last Alert Threshold Fired, increments Consecutive Over Scope Periods if the period closed above 100 or resets it to zero if not, moves the engagement back to On Track, and sends the sponsor the one-question Post-Period Delivery Survey.
  15. Twenty-one days before the renewal date, the renewal workflow reads the burn history. Because this engagement had one over-scope period followed by an agreed uplift, it books the Quarterly Retainer Review and attaches the history. Had it carried chronic-over-scope, the brief would have opened with the recommendation to reprice rather than renew.
04

Automations in detail

Workflow 1: Time Entry Ingestion and Recalculation

Trigger. Inbound webhook on the time-entry endpoint. Fires on every new or edited entry from the time-tracking system. Payload: engagement_code, hours, role, entry_date, staff_id, notes.

Conditions and branches.

  • Look up the Engagement Health opportunity where Engagement Code equals engagement_code. If no match, branch to the exception path: post to #engagement-health with “Unmatched time entry: code [engagement_code], [hours]h on [entry_date]. No engagement found: check the code in both systems.” Stop.
  • If the opportunity stage is Period Closed or Absorbed, branch to the late-entry path: add the hours to Hours Logged Lifetime only, flag the record late-entry-received, notify the account owner, and stop. Do not reopen a closed period silently.
  • If the entry is an edit rather than a create, subtract the prior value before adding the new one. Without this the counters inflate on every correction.

Actions in order.

  1. Add hours to Hours Logged This Period.
  2. Add hours to Hours Logged Lifetime.
  3. Recalculate Burn Percentage as Hours Logged This Period divided by Sold Hours Per Period, times 100, rounded to one decimal.
  4. Recalculate Expected Burn Percentage as elapsed days in the period divided by total days in the period, times 100.
  5. Write Pace Variance as Burn Percentage minus Expected Burn Percentage.
  6. If Burn Percentage is above 100, write Overage Hours as Hours Logged This Period minus Sold Hours Per Period; otherwise set Overage Hours to zero.
  7. If the opportunity is in Onboarding, move it to On Track.
  8. Clear the timesheet-gap tag if present.
  9. Fire the internal event burn-recalculated, which is the trigger the threshold workflows listen for.

Stop and exit. Exits after firing the event. No waits, no messaging. Keep this workflow mechanical: all judgment lives downstream.

Workflow 2: Threshold Alert Ladder

Trigger. Internal event burn-recalculated.

Conditions and branches. Four mutually exclusive branches, each gated on Last Alert Threshold Fired so a threshold never alerts twice in one period.

  • Branch A: 70 percent. Burn Percentage is 70 or above and below 90, and Last Alert Threshold Fired is None.
  • Branch B: 90 percent. Burn Percentage is 90 or above and below 100, and Last Alert Threshold Fired is None or 70.
  • Branch C: 100 percent. Burn Percentage is 100 or above and below 120, and Last Alert Threshold Fired is not 100 or 120.
  • Branch D: 120 percent. Burn Percentage is 120 or above and Last Alert Threshold Fired is not 120. This is the partner-level escalation.

Branch A actions.

  1. Move opportunity to Watch. Remove engagement-on-track, add engagement-watch.
  2. Set Last Alert Threshold Fired to 70 and Last Alert Date to today.
  3. Post to #engagement-health: “Watch: [Client] [Engagement Code] at [Burn Percentage]% of [Sold Hours Per Period]h with [days remaining] days left in the period. Expected burn [Expected Burn Percentage]%. Owner: [Account Owner].”
  4. Wait 0 minutes. No SMS at this level.

Branch B actions.

  1. Move opportunity to At Risk. Remove engagement-watch, add engagement-at-risk.
  2. Set Last Alert Threshold Fired to 90, Last Alert Date to today.
  3. Post to #engagement-health with the same number block plus the Scope Change Request form link.
  4. Send SMS to the Account Owner: “[Client] is at [Burn Percentage]% of this month's hours with [days remaining] days to go. Raise a scope change here before it tips over: [form link]”
  5. Wait 2 business days.
  6. If the engagement is still At Risk and carries no scope-call-requested tag, send a second SMS to the Account Owner and copy the Delivery Lead: “Still no scope change raised on [Client]: now [Burn Percentage]%. [form link]”
  7. Wait 3 business days.
  8. If still no scope change, book the engagement onto the next Internal Margin Review slot and notify the partner group.

Branch C actions.

  1. Move opportunity to Over Scope. Remove engagement-at-risk, add engagement-over-scope and overage-unbilled.
  2. Set Last Alert Threshold Fired to 100, Last Alert Date to today, Overage Decision to Not Yet Decided.
  3. Send SMS to Account Owner and Delivery Lead: “[Client] has passed its sold hours: [Overage Hours]h over. Record the call here: [Overage Decision form link]”
  4. Post to #engagement-health and notify the partner group by email with the burn history for the last three periods attached.
  5. Wait 1 business day.
  6. If Overage Decision is still Not Yet Decided, send the account owner a third SMS and create an internal task due same day.
  7. Wait 2 business days.
  8. If Overage Decision is still Not Yet Decided, default the engagement into the Internal Margin Review agenda and escalate to the partner group. The build never lets an undecided overage run quietly.

Branch D actions.

  1. Set Last Alert Threshold Fired to 120.
  2. Notify the partner group by SMS and email immediately, no waits: “[Client] [Engagement Code] is at [Burn Percentage]%: [Overage Hours]h beyond scope. Owner [Account Owner], decision status [Overage Decision].”
  3. Add the engagement to the next partner meeting agenda automatically.

Stop and exit. Every branch exits immediately if the engagement moves to Scope Change Agreed, Absorbed or Period Closed, or if the engagement-over-scope tag is removed. Exit on any Last Alert Threshold Fired value higher than the branch's own, so a fast-burning engagement does not run two ladders in parallel.

Workflow 3: Pace Variance Early Warning

Trigger. Internal event burn-recalculated. This runs independently of the threshold ladder, because an engagement can burn dangerously fast while still being under 70 percent.

Conditions and branches.

  • Pace Variance is 15 or greater, Burn Percentage is below 70, at least 5 days remain in the period, and the pace-ahead tag is absent.
  • Second condition: Last Alert Date is not within the last 7 days. A single cooldown window prevents a daily drip.

Actions in order.

  1. Add tag pace-ahead.
  2. Move the opportunity to Watch if it is currently On Track.
  3. Set Last Alert Date to today.
  4. Post to #engagement-health: “Pace ahead: [Client] [Engagement Code] has used [Burn Percentage]% of hours with only [Expected Burn Percentage]% of the period elapsed. At this rate it finishes the month around [projected percentage]%. Owner: [Account Owner].”
  5. Wait 5 business days.
  6. Recheck Pace Variance. If it has fallen below 10, remove pace-ahead, return the opportunity to On Track, and post “[Client] pace has normalized.” Exit.
  7. If Pace Variance is still 15 or greater, send SMS to the Account Owner: “[Client] is still burning ahead of plan. Worth a look at what changed in the last two weeks: [record link]”

Stop and exit. Exits if the threshold ladder fires at 90 or above (the louder alert takes over), if the engagement reaches Period Closed, or if fewer than 5 days remain in the period.

Workflow 4: Scope Change Request to Client Confirmation

Trigger. Submission of the internal Scope Change Request form.

Conditions and branches.

  • If the recommended action is Absorb or Trim Deliverables, skip the client-facing sequence entirely: write Overage Decision, notify the partner group, and route to Workflow 5.
  • If the recommended action is Bill Client, continue. Check the client has a contact with Scope Approval Authority set. If not, notify the account owner to identify one and hold the workflow until the field is set.
  • If the contact carries do-not-sms-client, run the email-only variant.

Actions in order.

  1. Create an opportunity in Scope Change Requests at Drafted, carrying the engagement reference, the hours requested and the description.
  2. Have BO draft the client-facing summary from the form answers and attach it to the opportunity as an internal note. Notify the account owner to review and approve the draft. Nothing goes out unreviewed.
  3. Wait for the account owner to move the opportunity to Sent to Client. This is a manual gate by design.
  4. On that stage change, email the approval contact. Subject: “Quick check-in on the [workstream] work”. Body: “Hi [First Name]. The [workstream] piece we picked up in the last few weeks has grown beyond what we originally scoped, and I would rather talk to you about it now than surprise you later. Can you give me 30 minutes this week? [Scope Review Call link]”
  5. Tag the engagement scope-call-requested.
  6. Wait 2 days.
  7. If no booking, send SMS (consent and quiet hours permitting): “Hi [First Name], [Owner] here from [Firm]. Chasing a short call about the [workstream] work. Here are my open slots: [link]. Reply STOP to opt out.”
  8. Wait 3 days.
  9. If still no booking, notify the account owner to call the client directly and create a task due today. Automation stops trying after two nudges.
  10. On booking, move the engagement to Scope Conversation Booked, swap the tag to scope-call-booked, and schedule the pre-call brief for 90 minutes before the appointment.
  11. After the call, when the account owner moves the Scope Change Request to In Negotiation or Approved, send the Client Scope Confirmation form by email: “As discussed. Here is the summary of the additional work and the hours it covers. Confirm below and we will get straight on with it.”
  12. On form submission, move the request to Approved and fire Workflow 5.

Stop and exit. Exits on booking (for the nudge sequence), on Approved or Declined, if the client replies with an opt-out keyword, or if the engagement reaches Period Closed without resolution.

Workflow 5: Baseline Reset and Billing Handoff

Trigger. Scope Change Request moves to Approved, or the Overage Decision form is submitted.

Conditions and branches.

  • Bill Client. Additional hours agreed and confirmed.
  • Absorb. Requires a non-empty Overage Decision Reason; the workflow rejects the submission and re-prompts if the field is blank.
  • Trim Deliverables. Scope reduced rather than hours added.
  • Pause Work. Delivery stops until a commercial decision is made.

Bill Client actions.

  1. Add the approved hours to Sold Hours Per Period.
  2. Recalculate Burn Percentage against the new baseline.
  3. Set Overage Hours to zero, Overage Decision to Bill Client, Last Alert Threshold Fired to None.
  4. Remove engagement-over-scope, engagement-at-risk, overage-unbilled and pace-ahead. Add engagement-on-track.
  5. Move the engagement to Scope Change Agreed, then to On Track on the next ingestion event.
  6. Push the approved line to QuickBooks or Xero as a draft invoice line against the client record. Draft, not sent. A human releases invoices.
  7. Email the account owner the confirmation record and file the signed confirmation against Scope Document Link.
  8. Wait 1 day, then email the sponsor: “Thanks [First Name]: all confirmed, the team is carrying on. You will see this reflected on the next invoice.”

Absorb actions.

  1. Set Overage Decision to Absorb, move the engagement to Absorbed.
  2. Keep overage-unbilled applied. This tag is how absorbed hours stay visible at renewal.
  3. Increment Consecutive Over Scope Periods.
  4. Notify the partner group with the reason text, no client messaging at all.
  5. If Consecutive Over Scope Periods is now 2 or more, add chronic-over-scope and create a repricing task on the account owner due 14 days before Renewal Date.

Trim Deliverables actions.

  1. Set Overage Decision to Trim Deliverables.
  2. Notify the delivery lead with a task to update the delivery plan and the scope document.
  3. Email the sponsor a short confirmation of what is being deferred: “To keep this month inside the hours we agreed, we are moving [deferred item] to next month. Shout if that order does not work for you.”
  4. Return the engagement to On Track.

Pause Work actions.

  1. Set Overage Decision to Pause Work, add tag work-paused.
  2. Notify the delivery lead and every staff member with time logged on the engagement in the last 14 days.
  3. Create a partner task to make the commercial call within 2 business days.
  4. Do not message the client automatically. A pause is a human conversation.

Stop and exit. Exits once the branch completes. Re-entry is possible in a later period, which is exactly the signal Consecutive Over Scope Periods is counting.

Workflow 6: Period Close and Counter Roll

Trigger. Scheduled, daily at 00:30 in the firm's timezone. Operates on every engagement whose Period End Date is yesterday.

Conditions and branches.

  • If Billing Period Type is Fixed Fee Project, do not roll counters. A project has one budget for its whole life. Snapshot only.
  • If Billing Period Type is Time and Materials Cap, roll the dates but carry Hours Logged This Period forward rather than resetting, because the cap is cumulative.
  • If the engagement is in Pause Work, hold the close and notify the partner group instead.

Actions in order.

  1. Write a history snapshot: period dates, Sold Hours Per Period, Hours Logged This Period, Burn Percentage, Overage Hours, Overage Decision.
  2. If Burn Percentage closed at 100 or above, increment Consecutive Over Scope Periods. Otherwise set it to zero.
  3. If Consecutive Over Scope Periods reaches 2, add chronic-over-scope and notify the partner group: “[Client] has now closed [n] consecutive periods over scope. This is a pricing conversation, not a delivery one.”
  4. Reset Hours Logged This Period to zero (except the T&M branch), Burn Percentage to zero, Overage Hours to zero, Last Alert Threshold Fired to None, Overage Decision to Not Yet Decided.
  5. Roll Period Start Date and Period End Date forward by one period.
  6. Remove engagement-watch, engagement-at-risk, engagement-over-scope, pace-ahead. Add engagement-on-track. Leave overage-unbilled and chronic-over-scope in place.
  7. Move the engagement to On Track.
  8. Wait 1 day, then email the sponsor the one-question Post-Period Delivery Survey: “One question: did this month's work land the way you expected?” with a three-option answer.
  9. If the survey answer is the lowest option, notify the account owner immediately and create a task due same day, regardless of how the burn closed.

Stop and exit. Exits per engagement once counters are rolled. Logs a failure to #engagement-health if any engagement cannot be rolled, so a stuck record is visible rather than silently frozen.

Workflow 7: Timesheet Gap Detection

Trigger. Scheduled, weekdays at 09:00.

Conditions and branches.

  • Engagement is in any active stage (not Period Closed, Absorbed or Pause Work).
  • No time entry received against its Engagement Code in the last 5 business days.
  • The timesheet-gap tag is not already applied.

Actions in order.

  1. Add tag timesheet-gap.
  2. Post to #engagement-health: “No time logged on [Client] [Engagement Code] for 5 business days. Either the work has stopped or the integration has. Check both.”
  3. Send SMS to the Delivery Lead: “Nothing logged on [Client] in a week: is that right, or is the timer not running?”
  4. Wait 2 business days.
  5. If still no entries, escalate to the Account Owner and the operations lead by email, and create a task to verify the webhook and the project code mapping.
  6. Wait 3 business days.
  7. If still no entries, notify the partner group. Five consecutive silent engagements in one week should be read as an integration failure, and the digest flags that pattern explicitly.

Stop and exit. Exits the moment any entry arrives for that Engagement Code: Workflow 1 removes the tag, which cancels this sequence.

Workflow 8: Weekly Partner Digest and Renewal Prep

Trigger. Scheduled, Mondays at 07:30. Second trigger: daily check for engagements 21 days from Renewal Date.

Conditions and branches. The digest always sends, even when there is nothing to report. An empty digest is itself information. The renewal branch fires per engagement.

Digest actions.

  1. Assemble counts by stage from the Engagement Health pipeline.
  2. List every engagement carrying engagement-at-risk or engagement-over-scope, with burn, overage hours, owner and decision status.
  3. List every engagement carrying chronic-over-scope, ordered by Renewal Date ascending.
  4. List every engagement carrying overage-unbilled, with total absorbed hours for the period.
  5. List every timesheet-gap.
  6. Email the partner group. Subject: “Engagement health: week of [date]”.
  7. Post the same summary to #engagement-health.

Renewal branch actions.

  1. 21 days before Renewal Date, book the Quarterly Retainer Review internal slot for the account owner and the responsible partner.
  2. Attach the last four period snapshots, total absorbed hours, and the count of scope changes raised and approved.
  3. If chronic-over-scope is present, open the brief with the recommended uplift framing and the absorbed-hours total.
  4. Wait until 7 days before Renewal Date. If the internal review has not happened, SMS the responsible partner.
  5. On renewal, reset Consecutive Over Scope Periods, clear chronic-over-scope and overage-unbilled, and write the new Sold Hours Per Period and Renewal Date.

Stop and exit. The digest is one-shot weekly. The renewal branch exits on renewal, or if the engagement is marked lost or closed.

05

What changes

The scope conversation moves from after the fact to during. Instead of a partner discovering in a month-end review that three accounts ran hot, the account owner gets a message on day 11 while there are still 19 days of period left and something can actually be done. That changes the nature of the conversation with the client too: “the extra workstream has grown, can we talk about it” lands very differently than “we have done 60 hours of unbilled work and would like to invoice you for it.”

The second change is that absorbed work becomes visible. Most firms absorb some overage deliberately. It buys goodwill, it covers a mistake, it keeps a strategic account happy. The problem is never the decision, it is that the decision is invisible by the time renewal comes around. Once every absorb is recorded with a reason and counted against the engagement, renewal pricing becomes an evidence-based conversation rather than a guess. The chronic-over-scope tag is the single most commercially useful output of this build.

Third, the integration gap detection quietly earns its place. Time-tracking connectors fail silently more often than anyone expects, and a build like this is worse than useless if it reports zero burn on an engagement that is actually running hot. The gap workflow turns a silent failure into a visible one within five business days.

Metrics to watch

  • Realization rate per engagement: hours billed divided by hours logged. This is the headline number the build exists to protect. Track it by engagement and by account owner.
  • Unbilled overage hours per period, split between deliberately absorbed and never-noticed. The second category should trend to zero within two periods of launch.
  • Alert-to-action time: days between the 90 percent alert firing and a Scope Change Request being raised. If this sits above three days the alert is being ignored and the routing needs changing, not the thresholds.
  • Scope change approval rate: requests sent to clients versus approved. A low rate usually means the conversation is happening too late, not that clients are unreasonable.
  • Share of engagements closing a period over 100 percent, trended monthly.
  • Consecutive over-scope count across the book: the leading indicator for which retainers are underpriced.
  • Pace variance at day 10 of each period, as an early predictor of where the month ends up.
  • Timesheet gap incidents per month, as a health check on the integration rather than on the team.
  • Renewal uplift achieved on engagements that carried chronic-over-scope versus those that did not.

Scoping, thresholds and integration work vary by practice, so pricing for a build like this is quoted per engagement. Book a call at bookings.appbo.io to walk through your own numbers.

06

Before you start

Data you need in hand

  • A list of live engagements with the sold hours, the billing period (monthly retainer, fixed-fee project, or time-and-materials cap) and the account owner for each.
  • Your standard blended rate card by role, so overage can be valued without quoting figures in client-facing copy. Keep rates in the internal fields only.
  • A decision on your alert thresholds. The defaults in this guide are 70 percent, 90 percent and 100 percent of sold hours, plus a pace check that fires when burn is running ahead of the calendar.
  • A decision on what happens at 100 percent: stop work, keep working and bill the overage, or keep working and absorb it. The automation can only enforce a policy that exists.

Integrations to connect

  • Your time-tracking system. Harvest, Toggl, Clockify, Everhour and similar tools all expose per-entry data. Connect it to the platform through Zapier or Make, or post to an inbound webhook directly if the tool supports outbound hooks. The job of the connector is simple: on each new or edited time entry, send the engagement identifier, the hours, the role and the date.
  • Your accounting system (QuickBooks or Xero) so that approved overage can be raised as an invoice line without re-keying.
  • Slack for the internal alert channel, if the team already lives there. The platform can post the same alert to Slack and to the account owner by SMS.
  • Google Calendar two-way sync on every account owner's calendar, so scope calls can be booked straight out of an alert.

Numbers and messaging compliance

  • Provision a dedicated outbound number for the practice before you build, and register your brand and campaign for A2P 10DLC. Registration is reviewed by the carriers and takes time; start it in week one or you will be ready to launch with no working SMS.
  • Most of the SMS in this build is internal (alerts to your own staff), which is operationally simpler, but the client-facing messages (scope call invitations, approval requests) are business messaging and need the full treatment: clear sender identification, honoured opt-out keywords (STOP, UNSUBSCRIBE, CANCEL, END, QUIT), and HELP returning your contact details.
  • Set quiet hours on every client-facing workflow (8am to 8pm in the contact's own timezone is a safe default) and leave internal alerts outside quiet hours only if your team has agreed to that.
  • Keep written consent records for every client contact you message. Store the consent source and date in a custom field so you can evidence it later.

Data protection and legal

  • Timesheet data is employee data. Decide who can see per-person hours versus engagement totals, and build your internal dashboards so that only managers see the former.
  • If you operate in or serve the UK or EU, logged-time records tied to named staff fall under data protection rules covering purpose limitation and retention. Set a retention period and a deletion routine rather than keeping entries forever by default.
  • Contractual scope language matters more than the automation. If your master services agreement does not say what happens when sold hours are exhausted, the alert will fire into a vacuum.
  • None of the above is legal advice. Have your own counsel confirm your contract language, consent records, employee-monitoring notices and retention periods before you go live.

Internal prerequisites

  • Agreement from delivery staff that time will be logged daily, not weekly. The build assumes entries land within 24 hours; weekly logging turns a tripwire into a post-mortem.
  • One named owner per engagement, kept current. Alerts routed to a departed employee are worse than no alerts.
  • A short written scope-change procedure the account owner can follow when an alert fires, so the response is consistent across the team.
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