Eight workflows. Workflows 1 and 5 are the ones that make or break the build - speed, and the escalation that enforces it.
1. Instant Capture and First Touch
Trigger: any inbound capture event - inquiry form, chat conversation started, inbound call completed, inbound email to the new business address, or a paid lead form.
Steps, with no waits before step 4:
- Create or match the contact. Match on email first, then on domain plus name, so a second inquiry from the same company attaches to the existing record and applies repeat-inquiry rather than creating a duplicate.
- Write inquiry_received_at, lead_source, utm_source, utm_campaign, landing_page, form_variant. Apply inbound and source-[channel].
- Check for an existing client or open deal. If found, apply existing-client, route straight to the account owner with a priority task, and skip the rest of this build entirely.
- Branch on business hours. In hours: send first touch immediately and notify the duty closer. Out of hours: send first touch immediately anyway, but with honest framing, and set sla_first_touch_due to 30 minutes after opening.
- First-touch email, within 60 seconds: "Hi [first name], thanks for getting in touch about [their own words from the form]. I'm BO, [agency]'s assistant - I'll get the details together so [closer or the team] can come to you with something useful rather than a list of questions. Two quick things: [first qualifying question]?" Writes first_touch_at and first_touch_channel.
- If a mobile was given, send an SMS in parallel: "Hi [first name], BO here from [agency] - got your inquiry about [service]. Quickest way to get you to the right person is two questions, or grab a slot straight away: [link]. Reply STOP to opt out."
- Calculate speed_to_lead_minutes. Move the record to Qualifying.
- Post to the internal new-leads channel with the raw inquiry text, the source and the campaign.
Branches: an obvious spam or vendor pattern - a free email address with a generic pitch, a known vendor domain, a link-building request - applies dq-spam or dq-vendor, sends nothing, and goes to a review queue rather than to Disqualified. Never auto-reply to suspected spam, and never auto-delete it either.
Stop conditions: do-not-contact, or an existing-client match.
2. BO Conversational Qualification
Trigger: any inbound reply on any channel while the record is in Qualifying.
Question order, two at a time, never all at once:
- What are you trying to achieve, and which service does that point at? Writes service_interest, pain_primary, pain_notes.
- When would you want to start? Writes timeline_to_start and applies timeline-now, timeline-quarter or timeline-exploring.
- Is anything in place at the moment, in-house or with an agency? Writes incumbent_agency, applies has-incumbent.
- Who else is involved in deciding? Writes decision_role, decision_makers_count, procurement_required.
- Roughly what band have you set aside, offered as a picklist of band labels? Writes budget_band and budget_source as self-reported.
- How big is the team or business? Writes company_size_band, geography, industry_vertical, enriched from website_url where possible.
Branches:
- A pricing question at any point: decline the number, explain scoping in one sentence, offer the calendar. Then continue the question set. Never let a pricing question end the conversation.
- Three or more questions answered is enough to score. Do not block on the full set - a partial qualification that routes beats a complete one that never finishes.
- A request for a human, a complaint, a legal or press matter: stop the question set, apply the escalation tag, notify a named person, and tell the prospect a person is coming.
- If after two exchanges BO cannot determine service_interest, stop asking and offer the Quick Fit Call instead. Ambiguity is a human's job.
Steps on completion: write qualified_at, hand to workflow 3, and offer the calendar workflow 4 selects.
Stop conditions: booking made, opt-out, escalation, or 5 days with no reply, which hands to workflow 7.
3. Lead Scoring and Banding
Trigger: qualification form submitted, or BO writing the third qualifying field.
Scoring, additive. Tune the weights with the client, keep the shape:
- Service fit: core service 30, adjacent service 15, service not offered minus 50. A negative weight here is deliberate - it should dominate.
- Budget band: top band 30, middle band 20, lowest band 5, below the floor minus 40.
- Timeline: within 30 days 25, this quarter 15, exploring 5, no timeline 0.
- Decision authority: decision maker 20, recommender 10, researching on someone's behalf 0.
- Company size band: in the target bands 15, above 10, below the floor minus 20.
- Geography: served 10, outside the served area minus 40.
- Source: referral 25, repeat inquiry 15, organic or direct 10, paid 5, cold list 0.
- Incumbent agency with a named frustration: 10. Contrary to instinct this is a positive - they have budget, a process, and a reason to move.
Steps:
- Write lead_score, then lead_band: A at 80 or above, B at 50 to 79, C at 20 to 49, review below 20.
- Write icp_fit and routing_reason as a readable sentence naming the three biggest contributors, so a closer can see at a glance why this landed with them.
- Apply the band tag and hand to workflow 4.
- Any single disqualifying condition - service not offered, outside geography, below the size or budget floor - routes to workflow 8 for human sign-off rather than to routing. The score alone never disqualifies.
Stop conditions: none. Every record gets a band, including the ones heading for disqualification, because banding is what makes the reporting work.
4. Routing and Assignment
Trigger: lead_band written.
Steps, evaluated in strict order:
- Named-owner override: if referral_source_contact names an existing client, or the record matches a known account, assign that account's owner regardless of everything else. Relationship beats routing logic every time.
- Specialism filter: reduce the closer pool to those whose closer_specialism covers service_interest.
- Band filter: band A to the senior pool, band B to the full pool, band C to the coordinator.
- Capacity filter: drop anyone at or above their open-opportunity ceiling, or marked out of office. If the pool empties, widen to adjacent specialisms and apply unassigned-capacity so the gap is visible.
- Round robin across whoever remains, weighted by current open count rather than strictly in turn.
- Write assigned_closer and assignment_method, apply routed-[closer], move to Routed, set sla_first_touch_due: 15 minutes for band A in hours, 60 minutes for band B, same working day for band C.
- Notify the closer directly, in chat and by SMS for band A, with the brief: name, company, service, band, routing reason, timeline, decision role, source, campaign, website and the full conversation transcript.
- Create the closer's task with the SLA time as the due time.
- Select the calendar: Strategy Session for band A, Discovery for band B, Quick Fit for band C, Referral Priority where referral is tagged. BO then offers exactly that one, with that closer's real availability.
Branches: out-of-hours band A also notifies the duty closer's mobile, if the agency has agreed that rota. Do not build it without that agreement.
Stop conditions: assignment complete, or the record going to workflow 8.
5. SLA Monitoring and Escalation
Trigger: scheduled, every 5 minutes, over every record in Routed with an open first-touch task.
Steps:
- At 50 percent of the SLA window, remind the assigned closer in chat. One line, no ceremony.
- At 100 percent with the task still open, apply sla_breached and sla-breach, write the breach time, and post to the SLA channel naming the closer, the lead and the band. Visible, not punitive.
- At 150 percent, reassign to the next closer in the pool, increment reassignment_count, apply reassigned, and notify both people. The lead moving matters more than whose lead it was.
- At 200 percent on a band-A record, escalate to the new business lead with a priority task and a direct notification.
- Daily at 17:30, send a digest to the new business lead: breaches today by closer, records still unactioned, and the median speed to first touch for the day.
- Weekly on Monday, send a summary: median and worst-decile speed to first touch, breach rate by closer, reassignment count, and band distribution.
Conditions: SLA clocks pause outside business hours for band B and C and resume at opening. Band A out of hours runs against the agreed out-of-hours window or waits until opening, depending on the rota. Pick one and make it explicit.
Stop conditions: first touch logged, or the record leaving Routed.
6. Booking, Reminders and No-show Recovery
Trigger: booking on any of the four calendars.
Steps:
- Write booked_at, move to Discovery Booked, cancel the first-touch task, and stop every chase sequence.
- Confirmation immediately: time, duration, who they are meeting with a one-line bio, the joining link, a three-bullet agenda and one thing to think about beforehand.
- Brief the closer with the full record, and for band A add a prompt to spend ten minutes on the prospect's site and the incumbent situation before the call.
- Reminder at 24 hours by email. Reminder at 1 hour by SMS with the joining link only.
- Attended: move to Discovery Held and require the discovery outcome form within 2 hours, with a task that chases the closer, not the prospect.
- No-show: within 10 minutes send "Hi [first name], [closer] is on the call if you still want to join: [link]. If something came up, grab another slot here: [rebook link] - no problem at all." Then a call task for the closer the same day.
- If no rebooking within 48 hours, one final message, then move to Unresponsive and hand to workflow 7. Two no-shows moves straight to Not Now without a third attempt.
- Proposal follow-up on moving to Proposal Out: day 2 a check that it landed, day 5 a specific question about scope, day 9 a direct ask for a decision date. Then stop and create a human task. Three touches, then a person.
Stop conditions: stage reaching Won, Not Now or Disqualified.
7. Unresponsive Chase and Recycle
Trigger: no inbound reply for 24 hours while in Qualifying or Routed.
Steps, rotating channel every touch:
- Day 1, SMS from the assigned closer by name: "Hi [first name], [closer] here from [agency]. You asked about [service] yesterday - still want to look at it? Happy to send something useful either way."
- Day 2, email with one genuinely relevant piece of case material for service_interest and no ask at all. The no-ask touch is the one that gets replies.
- Day 4, a call task for the closer. Band A gets two call attempts at different times of day.
- Day 7, email with a direct question: "Should I keep this open, or close it off for now? Either answer is helpful." Giving an easy exit produces more responses than another nudge.
- Day 11, final SMS. Then move to Unresponsive, apply unresponsive, and stop.
- Band A records only: after 30 days, one single re-approach referencing their original inquiry by name. One message.
Branches: any reply at any point returns the record to its prior stage and restarts qualification where it stopped, never from the beginning.
Stop conditions: any reply, any booking, opt-out, or six touches, whichever comes first. Six is the ceiling across the whole sequence.
8. Disqualification, Not-Now and Re-entry
Trigger A, disqualification: a disqualifying condition from workflow 3, or a closer requesting it.
- Create a review task for the new business coordinator, due in 4 working hours, with the disqualification capture form attached. No record is disqualified by a machine.
- On human confirmation, write disqualify_reason from the fixed list, apply the matching dq- tag, move to Disqualified, and suppress all sequences.
- Send one courteous close-out that is genuinely useful: say plainly that it is not a fit for the agency and, where possible, point at the type of firm that would suit. Referring work away is the cheapest reputation you will ever buy.
- Service-not-offered and size-below-floor records go to a light quarterly list only if the consent basis supports it. Student, competitor, vendor and spam records get nothing further, ever.
Trigger B, not now: discovery_outcome or a qualification answer indicating real fit with wrong timing.
- Move to Not Now, write not_now_reason and revisit_date from what they actually said, apply not-now and nurture-active.
- Go quiet. One useful email every 6 weeks, maximum, on the relevant service line. Nothing that reads as a chase.
- At 14 days before revisit_date, create a task for the original closer and send one message referencing the exact reason they gave: "You mentioned [reason] - is [month] looking more realistic now?"
- If the revisit date passes with no engagement twice, move to a once-a-quarter cadence and re-permission at 12 months.
Trigger C, re-entry: a new inquiry from a contact or company already on the pipeline.
- Apply repeat-inquiry, attach to the existing record, and add 15 to lead_score. A second inquiry is a real buying signal.
- Route straight to the previously assigned closer, bypassing round robin, and surface the whole prior history including why it stalled last time.
- Notify that closer directly with the previous not_now_reason or lost_reason front and center.
Stop conditions: do-not-contact stops every branch immediately and permanently.