1. Weekly Risk Scoring Run
Trigger: scheduled, Mondays at 06:00 agency time, ahead of the working day so the digest is waiting rather than arriving mid-morning.
Conditions: runs for every client tagged as live and not tagged risk-monitoring-paused. Clients inside their first 45 days are scored but never banded above Amber, because onboarding-period signals are not comparable to steady-state ones.
Actions, in order:
- Copy churn_risk_score to churn_risk_score_prior before anything else.
- Refresh each signal field from its source: unopened count and variance from the reporting build, portal login and active-user counts from the portal, declines and no-shows from the calendars, late payments from the payment integration, renewal date from the contract record.
- Compute the component scores per the weighting model, sum them, apply the 1.3 multiplier where days_to_renewal is 60 or fewer, and cap the result at 100.
- Write churn_risk_score, set churn_risk_band, and write the named contributing signals to churn_risk_drivers as a readable list. The drivers field is what makes the score actionable; a bare number gets ignored.
- Compare to churn_risk_score_prior and set churn_risk_trend to Improving, Flat or Worsening. A change of 5 or fewer points counts as Flat.
- Apply exactly one band tag, removing the previous one. Apply or remove each driver tag to match the current drivers.
- Hand off to workflow 2 for any band change, and to workflow 3 for the digest.
Stop or exit: if a source signal cannot be read, write the previous value, flag the record as having stale data, and post a named data-integrity alert. Never score a missing signal as zero - that silently turns a broken connector into a healthy client.
2. Band Change Detection and Watchlist Entry
Trigger: churn_risk_band changes value.
Conditions: only upward changes into Red or Critical create a pipeline opportunity. An Amber appearance is logged and digested but does not open a case, which keeps the pipeline thin enough to mean something.
Actions:
- Branch on the new band. Green from anything higher: post an improvement note to Slack and, where an opportunity exists, hand off to workflow 7.
- Amber: log the change, apply risk-amber, include in the digest, create no task.
- Red: create an opportunity in Client Retention at Watchlist. Post to the pod Slack channel within 15 minutes. Copy: [client] has moved to Red, score [churn_risk_score], trend [churn_risk_trend]. Drivers: [churn_risk_drivers]. Renewal in [days_to_renewal] days. Owner: [account_manager]. Confirmation needed within 48 hours.
- Critical: as above, plus post to the Critical channel with the principal, and create a same-day task for the account manager rather than a 48-hour one.
- Assign the Risk Confirmation form to the account manager in all Red and Critical cases.
- Wait 48 hours. If the form is unsubmitted, remind the account manager. Wait a further 24 hours and escalate to the principal. An unconfirmed risk flag is the main failure mode of this build.
- Branch on confirmation. Confirmed writes risk_confirmed_by and risk_confirmed_date, applies risk-confirmed, moves to Risk Confirmed, and hands off to workflow 4.
- Not confirmed requires a written reason, which is recorded against the account and reviewed monthly. A pattern of dismissals from one person, or on one signal, is useful information about either the model or the person.
Stop or exit: no client-facing message is sent anywhere in this workflow. Watchlist entry is invisible to the client by design.
3. Weekly Retention Digest
Trigger: completion of workflow 1, Mondays at approximately 07:00.
Actions:
- BO assembles the digest: Critical accounts first with full drivers, then Red, then Amber accounts whose trend is Worsening. Accounts that are Amber and Flat or Improving appear as a count only.
- Include the accounts that moved band in either direction this week, and the accounts with renewal inside 60 days regardless of band.
- Include any account flagged as having stale data, named, so a broken signal is visible in the same place as the risks.
- Post to the retention Slack channel and email the principal and each account manager their own accounts only.
- Create a single weekly task for the digest owner: review and confirm actions on every Critical and Red account.
- Branch: where no account is above Amber, send a short all-clear rather than nothing. A digest that only appears when there is bad news trains people to dread it and eventually to skip it.
Stop or exit: one send per week, no retries. A failed digest alerts the principal directly.
4. Diagnosis Outreach and Call
Trigger: tag risk-confirmed applied.
Conditions: all client contact here is by a named human. BO drafts; a person sends. No message references risk, scores or engagement.
Actions:
- Create a call task for the account manager due the same day, with the drivers and the confirmation-form answers attached so the call has substance.
- BO drafts an email for the account manager to review and send, framed as a normal check-in with a concrete hook from the account. Draft copy: Hi [first name] - I wanted to catch up properly rather than just send the monthly summary. A couple of things I would like your read on, and I would rather do it on a call than by email. Here is my calendar if that is easiest: [link], or reply with a time and I will work around you.
- Wait 48 hours. If no response and no booking, the account manager phones again, and the principal is notified on Critical accounts.
- Wait 72 hours. For Critical accounts, the principal makes contact directly with the decision maker. Changing who is asking is the most effective single escalation available.
- On booking, move to Diagnosis Call Booked, apply diagnosis-booked, and send a prep task to the account manager carrying the full signal history.
- Reminders at 24 hours and 2 hours. A no-show here is itself a strong signal: apply meetings_no_show_90d increment and escalate to the principal immediately rather than offering a third rebooking.
- After the call, require the Root Cause Capture form within 24 hours. Submission writes root_cause_category and root_cause_detail, moves to Root Cause Identified, and hands off to workflow 5.
Stop or exit: cannot progress without a recorded root cause. A diagnosis call that produced no category is treated as not held.
5. Intervention Planning and Review
Trigger: root_cause_category populated.
Conditions: branches on category, because the same intervention does not fit every cause.
Actions:
- Branch on category. Performance routes to a delivery review with the build owner. Communication routes to a reporting or cadence change. Price or value escalates to the principal and never to the account manager alone. Champion change routes to a new-contact onboarding mini-path. Adoption routes to retraining. Service failure routes to the principal with a written account of what went wrong.
- Require intervention_plan, intervention_owner and intervention_review_date to be populated before the opportunity can move. The review date must be within 30 days.
- Move to Intervention In Flight, apply intervention-active.
- Suppress band-change alerts for this account for 14 days, so an active intervention is not drowned in weekly noise. The account still scores and still appears in the digest, marked as under intervention.
- Create tasks for each action in the plan, each with its own owner and due date.
- Wait until 7 days before intervention_review_date. Remind the owner and check that the plan tasks are progressing. An intervention plan with no closed tasks at this point escalates to the principal.
- On the review date, require intervention_outcome to be recorded as effective, partial or ineffective, with a sentence of detail.
- Branch on outcome. Effective or partial with an improving score hands off to workflow 7. Ineffective escalates to the principal and triggers a second-line plan, which must be materially different from the first rather than the same actions repeated.
Stop or exit: suppression expires automatically at 14 days whether or not the plan is complete, so a stalled intervention becomes loud again rather than staying quiet.
6. Cancellation Language Detection and Immediate Escalation
Trigger: any inbound client message - email, SMS or chat - across any channel.
Conditions: BO classifies for cancellation, pause, downgrade, pricing and competitor language. This workflow takes priority over every other response path, including BO's normal replies.
Actions:
- On detection, suppress any automated reply to that thread immediately. Nothing automated goes back to a client who has just raised cancellation.
- Within 2 minutes, alert the account manager and the principal by Slack and push notification, with the client name and the verbatim sentence that triggered detection.
- Branch on language type. Explicit cancellation or pause: move to Cancellation Requested, apply cancellation-requested, stamp churn_requested_date, set churn_risk_band to Critical regardless of computed score, and offer the Principal Escalation Call.
- Pricing or scope question without cancellation: set pricing_question_logged to yes, which adds 15 points at the next run, and create a same-day task for the account manager. Do not escalate to Critical on a pricing question alone.
- Downgrade request: set downgrade_requested to yes and route to the principal, because a downgrade conversation is a pricing conversation.
- Create a task to respond by phone within 4 working hours. The first response to a cancellation request should be a voice, not a thread.
- Wait 4 hours. If the task is not actioned, escalate to the principal again. This is the one escalation in the build with no tolerance for delay.
- Record the response and the outcome. A client who stays applies saved, sets saved_flag, and moves to Saved at Cancellation, with a mandatory 30-day follow-up review because a save is fragile.
Stop or exit: BO never replies in this path. Detection, suppression and alerting only.
7. Recovery Confirmation and Case Closure
Trigger: churn_risk_band returns to Green for an account with an open retention opportunity.
Conditions: requires two consecutive weekly runs at Green. One good week is noise, particularly where a score fell because a single signal reset.
Actions:
- First Green run moves the opportunity to Recovering and applies recovering. No closure yet.
- Second consecutive Green run moves it to Recovered, applies recovered, and removes intervention-active and the driver tags.
- Create a task for the account manager to write what actually worked into the account notes, in one or two sentences, so the next person inherits the reasoning rather than just the outcome.
- Post a short Slack note naming the account, the original drivers, the root cause and the intervention that worked. Recoveries are the only reliable source of knowledge about what interventions do.
- Schedule a 60-day re-check task. A recovered account that regresses within 60 days is a different and more serious case than a first-time flag, and is escalated straight to Risk Confirmed, skipping the watchlist.
- Branch: where the score fell because a signal went stale rather than because engagement improved, do not close. Hold at Recovering and flag for data review. A recovery that is actually a broken connector is the worst outcome this build can produce.
Stop or exit: closes the opportunity. The account returns to ordinary weekly scoring.
8. Churn Processing and Exit Interview
Trigger: a client's cancellation is accepted.
Actions:
- Move to Churned, apply churned, remove every risk and process tag.
- Capture churn_reason_stated immediately from the cancellation correspondence, in the client's own words.
- Offer the Exit Interview, requested by the principal rather than the account manager, which materially increases both acceptance and candour. Copy: Completely understood, and no hard feelings. If you have half an hour, I would value hearing honestly where we fell short - it is the most useful thing anyone can give us and it will not turn into a sales conversation.
- Wait 3 days. One reminder. Then stop. Do not chase a departing client.
- On the interview, record churn_reason_actual as the interviewer assessed it, separately from the stated reason, and set exit_interview_held.
- Create an internal post-mortem task: what the score was at churn, what the earliest signal was and when, what the agency did, and what should have happened differently. Fifteen minutes, written down, within a week.
- Run the offboarding path: data retention or deletion per the agreement, access revocation, number release, final invoice.
- Wait 90 days. Create a single win-back task for the principal, offered once. No automated win-back sequence.
- Quarterly, aggregate root_cause_category and churn_reason_actual across all losses and near-losses, and create a task to change something specific in whichever upstream build the commonest cause points at.
Stop or exit: terminal. The post-mortem task must be closed before the case is archived, because the learning step is the only part of churn processing with any future value.
9. Signal Integrity and Model Calibration
Trigger: daily at 05:00 for integrity, plus a quarterly calibration run.
Conditions: this workflow watches the watcher. A churn model fed by a dead connector is worse than no model, because it reports confidence it does not have.
Actions:
- Daily: check each signal source for freshness. Any source whose most recent write is older than its expected interval is flagged, named in Slack, and every client depending on it is marked as stale-data.
- Daily: check for implausible uniformity - every client showing identical values on a signal almost always means the source is returning a default rather than real data.
- Quarterly: compare churn_risk_score at the point of churn for every client lost that quarter against the scores of clients retained. Post the comparison.
- Branch: any client who churned from Green or Amber triggers a model review task. The question is which signal was missing, not whether the person should have noticed.
- Quarterly: compute the false positive rate from confirmed-risk accounts that recovered with no intervention, and recommend weight reductions where a single signal is driving most of them.
- Create a quarterly calibration task for the principal with the proposed weight changes, requiring an explicit decision. Weights change deliberately and are versioned, never quietly adjusted.
- Record the weight version in use, so a historical score can be interpreted against the model that produced it.
Stop or exit: runs indefinitely. A failure of this workflow escalates to the principal, because silent failure here makes every other number in the build untrustworthy.