1. Welcome and First Contact
Trigger: agreement countersigned.
Conditions: exits if an opportunity already exists in Client Onboarding for this contact. Every message in this workflow sends from brand_sending_identity, never the agency domain.
Actions:
- Create the opportunity at Signed. Stamp onboarding_stage_entered_date. Apply onboarding-active and the matching journey- tag.
- Assign onboarding_owner.
- Wait 20 minutes. Long enough not to look automated, short enough to arrive the same hour.
- Send the welcome email. Copy: Welcome aboard, [first name]. I am [owner first name] and I will be looking after you. Here is what the next four weeks look like: we will have a kickoff call this week to agree exactly what success looks like, your system built the week after, your team trained the week after that, and a proper review at day 30. Three links to start: your portal, where you can always see where things stand - [portal link]. Your kickoff slot - [kickoff link]. And a short worksheet to fill in before we talk - [worksheet link]. Fifteen minutes and it makes the call ten times more useful.
- Issue portal credentials to client_day_to_day_contact.
- Move to Welcome Sent.
- Wait 24 hours. If no kickoff booking, BO sends a short nudge: Hi [first name] - grab whichever slot suits: [kickoff link]. Sixty minutes, and we will agree the target we are working to.
- Wait 48 hours. If still unbooked, create a task for onboarding_owner to call, and SMS the consented contact.
- Wait 72 hours. Escalate to the principal. A client who will not book a kickoff in the first week is already a risk signal.
Stop or exit: cancels on kickoff booking. Does not cancel on portal login alone, because logging in is not the same as engaging.
2. Kickoff Preparation, Reminders and No-Show
Trigger: kickoff booking confirmed.
Actions:
- Move to Kickoff Booked. Create a prep task for onboarding_owner due 2 hours before, carrying the worksheet answers.
- Wait until 24 hours before. Email reminder. Copy: Looking forward to tomorrow at [time]. Two things to make it count: please have [client_decision_maker] on the call, and if you can, finish the worksheet first - [link]. We will come out of this with one number we are both working to.
- Wait until 2 hours before. SMS reminder to consented contacts, within quiet hours.
- Wait until 15 minutes after the start. Branch on attendance.
- Attended: move to Kickoff Held, stamp kickoff_held_date, apply kickoff-held, and create a task to record client_goal_primary, client_goal_metric, client_goal_target_30d and the three contacts. The opportunity cannot advance until client_goal_metric is populated.
- No-show: apply kickoff-no-show, send Sorry we missed each other - here is my calendar: [link]. If this week is difficult, reply and tell me when and I will work around you. Create a call task for the owner the same day.
- Second no-show: apply onboarding-at-risk, notify the principal, and have a human - not BO - make contact.
Stop or exit: cancels on the goal fields being populated. A kickoff that happened but produced no recorded goal is treated as not held.
3. Asset and Access Collection with Item-Level Chasing
Trigger: tag kickoff-held applied.
Conditions: every step re-reads the individual asset_ and access_ fields and names only what is still outstanding. Generic chasing is what makes clients stop opening onboarding email.
Actions:
- Send one message containing both the asset form and the access checklist, with a line stating how many items in total. Copy: Four things from you and we can build. Two files and two account authorizations, about ten minutes all in: [asset link] and [access link]. Your portal shows what is outstanding at any point: [portal link].
- Apply waiting-assets and waiting-access. Move to Assets Pending.
- Wait 48 hours. BO chases the outstanding items by name only. Copy: Hi [first name] - down to [n]: [item list]. [link]
- Wait 48 hours. Second chase, plus the Office Hours link. Copy: If any of these are fiddly, drop into office hours and we will do them together: [link].
- Wait 72 hours. Create a call task for onboarding_owner, SMS the consented contact, and post to Slack with the item list.
- Wait 5 days. Move to Stalled, set stall_reason to the outstanding item, set stall_owner to Client, apply onboarding-stalled, and notify the principal.
- Branch: when all asset_ fields read yes, remove waiting-assets and apply assets-complete. Same independently for access. Only when both are complete does the opportunity move to Build In Flight.
- Branch: where an item is genuinely unavailable, a human records a documented substitute on the record and the item is marked satisfied with a note. The build is not held hostage by a missing photograph.
Stop or exit: cancels per item as it arrives, so the client never gets chased for something already supplied.
4. Build-In-Flight Progress Cadence
Trigger: opportunity enters Build In Flight.
Conditions: runs weekly while the opportunity remains at this stage. Each note requires a human to have written a one-line progress summary that week; if none exists, the workflow asks the owner for it rather than sending something empty.
Actions:
- Every Monday at 09:00 in the client's timezone, send the progress note from brand_sending_identity. Copy shape: Quick update on [client_goal_primary]. Done this week: [summary]. Next: [next step]. Nothing needed from you this week. Anything on your mind, office hours are open: [link].
- Where something IS needed, the same note leads with it and the subject changes to name the item.
- Wait 4 days from the first note, then offer the Team Training Session booking link to client_day_to_day_contact with the whole team invited.
- If the owner has not supplied a progress line by Friday 15:00, Slack the owner, and if still missing by Monday 08:00, Slack the principal. Do not send a reassuring note with nothing in it.
Stop or exit: exits when the opportunity leaves Build In Flight, or after four weeks at this stage, which triggers the stall workflow rather than continuing to send cheerful updates about a build that is not finishing.
5. Training Delivery, Attendance and Comprehension
Trigger: training booking confirmed.
Actions:
- Move to Training Scheduled. Send confirmation to all invitees with a one-line prompt of what to bring.
- Reminders at 24 hours and 1 hour before, to every registered attendee, not just the booker.
- Wait until 30 minutes after the session ends. Branch on attendance. Write training_attendee_count and training_recording_url, stamp training_held_date, apply trained, move to Trained.
- Send the recording and the Training Comprehension Check within 30 minutes, while it is fresh. Copy: Here is the recording and a five-question check - it takes two minutes and it tells us which bits we explained badly: [link].
- Branch on training_attendee_count against the client's recorded headcount. Below full attendance assigns the self-paced modules to each absentee individually, with a 7-day window and a reminder at day 4.
- Wait 48 hours. Any invitee who neither attended nor completed a module is tagged training-no-show and listed to onboarding_owner by name.
- Branch on comprehension results: any question answered incorrectly by more than half of respondents creates an internal task to rewrite that module, and the revised module is reissued to everyone who took the original.
- Zero attendance applies onboarding-at-risk and escalates to a human call. A team that will not attend training will not adopt the system.
Stop or exit: cancels when attendance plus module completion covers the client's headcount.
6. First Result Detection and Logging
Trigger: tag trained applied.
Conditions: watches the client workspace for the first qualifying event defined at kickoff against client_goal_metric - a booked appointment attended, an inquiry answered inside target, a payment taken, whatever the client named.
Actions:
- On detecting a candidate event, create a verification task for onboarding_owner. Copy: Possible first result for [client]: [event detail]. Confirm it is real and write one sentence describing it.
- The owner confirms, which writes first_result_type, first_result_date and first_result_detail, applies first-result-logged, and moves to First Result Logged. BO cannot do this step.
- Send the client a short, specific congratulation from their own identity. Copy: [first name] - first one through. [first_result_detail]. That is the thing we agreed we were aiming at on [kickoff_held_date].
- Branch: 14 days after trained with no candidate event, apply low-adoption, create a diagnostic task, and offer a short working session. Copy: Nothing has come through the new path yet. That is usually one small thing in the way rather than a big problem - 20 minutes and we will find it: [link].
- Branch: 21 days with no result applies onboarding-at-risk and escalates to the principal, because a client with no first result by week three is the profile that churns at month four.
Stop or exit: cancels on a human-confirmed first result. A detected-but-unconfirmed event never counts.
7. Day 14 Check-In and Day 30 Review
Trigger: 14 days after onboarding_stage_entered_date, and separately at 30 days.
Actions:
- Day 14: offer the 20-minute check-in. Copy: Two weeks in. Twenty minutes to hear how it is actually going and fix anything that is annoying you: [link].
- If unbooked after 48 hours, one reminder. If still unbooked, create a call task rather than chasing a third time by email.
- Day 30: offer the 45-minute review, and create a prep task for onboarding_owner carrying client_goal_primary, client_goal_target_30d, the actual figure, and first_result_detail. The review opens with the client's own words from kickoff.
- Reminders at 24 hours and 2 hours before.
- Wait 30 minutes after the review ends. Send the Day 30 Pulse, writing nps_30d_score and nps_30d_comment.
- Branch on pulse score. A low score creates a same-day task for the principal to call, not an automated apology. A high score creates a task to ask for a review or referral, timed 3 days later so it does not land in the same breath.
- No pulse response after 5 days: one reminder, then stop. Do not chase a survey into resentment.
Stop or exit: both sequences end at the pulse, whether or not the review was attended. A missed day 30 review applies onboarding-at-risk and is handled by a human.
8. Stall Detection and Escalation
Trigger: scheduled, daily at 08:00. Evaluates every opportunity tagged onboarding-active.
Conditions: compares days at the current stage against that stage's own threshold - 2 days at Welcome Sent, 5 at Assets Pending, 5 at Access Pending, 21 at Build In Flight, 10 at Training Scheduled. A single global threshold produces either noise or silence, never useful alerts.
Actions:
- On breach, move to Stalled, write stall_reason from the stage and outstanding fields, set stall_owner to Client or Agency, and increment stall_days daily.
- Apply onboarding-stalled and post to Slack naming the client, the stage, the days, the reason and the owner.
- Branch on stall_owner. Agency-owned stalls create a task for onboarding_owner due the same day and escalate to the principal at 48 hours. These are the ones the agency can actually fix and should be loudest.
- Client-owned stalls trigger a human phone call rather than another automated chase. At 10 days, the principal contacts the decision maker directly and the conversation is about whether the engagement is viable, not about a missing file.
- On resolution, return the opportunity to its correct stage, clear stall_reason and stall_owner, preserve stall_days as a historical record, and remove onboarding-stalled.
- Post a weekly Slack digest: stalled count by stage, by owner and by reason, with the longest-running named.
Stop or exit: runs continuously for every active onboarding. Exits a record only on onboarded.
9. Onboarding Close and Handoff to Business as Usual
Trigger: tag first-result-logged applied and the day 30 review marked attended.
Conditions: requires both. A first result without a review, or a review without a result, holds at the current stage and notifies the owner.
Actions:
- Move to Onboarded. Apply onboarded, remove onboarding-active and every blocker and engagement tag.
- Compute onboarding_days_elapsed from signature to this moment.
- Copy client_goal_primary, client_goal_metric and client_goal_target_30d into the reporting fields, so the first monthly report is measured against the client's own stated target.
- Enroll the client in the monthly reporting cycle and the churn-risk monitor, passing through nps_30d_score, portal_login_count, training_attendee_count and any low-adoption history as starting signals rather than beginning that monitoring from zero.
- Send the closing email from the client's identity. Copy: That is onboarding done. You said on [kickoff_held_date] that success looked like [client_goal_primary]. Where we got to: [actual]. From here you will get a summary on the [report_send_day] of each month, and office hours stay open if you need us: [link].
- Create a 60-day adoption check task for onboarding_owner.
- Post the completion summary to Slack: days elapsed, first result type, pulse score, stall days incurred.
- Branch: where onboarding_days_elapsed exceeds the agency target, create an internal retrospective task naming the stages that consumed the time. The build improves from these, not from the clean cases.
Stop or exit: terminal. Any later issue is handled by the reporting and churn-risk builds, not by reopening onboarding.