Back to the build library
Agencies
Standard

Upsell and Cross-Sell Playbook

Score every retainer client on readiness, then put the right next-service offer in front of them on cue instead of once a year.

Industry
Agencies
Build effort
Standard
Typical time to launch
2–3 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

Most agencies grow faster from the clients they already have than from the ones they have not met yet, and almost none of them run that growth on purpose. The retainer gets signed, delivery takes over, and the conversation about doing more only happens when the client asks for it, when a contract comes up for renewal, or when somebody remembers at a quarterly review. The result is an account base where half the clients are buying one service from an agency that sells six, and nobody can say which half.

The failure is a signal failure, not a willingness failure. The signals that a client is ready for more are already being generated every week: they burn through their retained hours three months running, a new marketing director arrives and starts asking questions, they praise a result in writing, they ask in a project channel whether you also do paid social, their own site traffic flattens out, their competitor launches something they now want to match. Every one of those lives in a delivery tool, a support thread or somebody's head. None of them land anywhere an account manager looks on a Monday morning, so none of them turn into a conversation. Meanwhile the account manager is measured on delivery and churn, which makes raising a new offer feel like risk rather than service.

The money leaks in four places. Adjacent work the client was always going to buy goes to a second vendor, who then has a relationship inside your account. Renewals become defensive conversations about scope and value rather than forward conversations about what is next, which is how discounting starts. Account managers who do spot a signal improvise the offer, so the same service gets pitched five different ways with five different outcomes and nothing is learned. And expansion becomes unforecastable, because there is no record of how many growth conversations are open, how long they take, or which signal types actually convert. A playbook fixes all four by turning signals into scored records, scored records into scheduled conversations, and conversations into a pipeline you can read.

02

What gets built

Pipeline and stages

One pipeline, Client Growth, separate from your new-business pipeline. Every active client sits in it permanently, which is the point: the pipeline is a readiness board, not a deal list.

  • Baseline Set - client is live, services sold and not sold are recorded, growth score calculated. Resting stage.
  • Signal Detected - at least one qualifying signal logged in the last 60 days. Score has crossed the threshold.
  • Internal Fit Check - the delivery lead confirms the agency can take the work and the account is healthy enough to sell into.
  • Offer Conversation Booked - a growth call sits on the calendar with the decision maker.
  • Proposal Out - scope document delivered, decision pending.
  • Negotiation - scope or terms being worked.
  • Won - Scope Added - signed. Triggers the expansion handoff.
  • Not Now - Nurture - real interest, wrong timing. Carries a re-entry date.
  • Declined - no, with a reason code. Client returns to Baseline Set after the cooling period.

Calendars

  • Growth Conversation - 45 minutes, round-robin across account managers, 2 per day per AM maximum, 48 hours minimum notice, buffer of 15 minutes after. Confirmation and reminders on.
  • Quarterly Account Review - 60 minutes, booked by the account manager, recurring quarterly per client. This is where the growth score and the unsold service list are read aloud.
  • Specialist Scoping - 30 minutes with the relevant delivery lead, used when the client wants detail the account manager cannot give. Bookable only from an internal link.

Custom fields

On the client or account record:

  • client_status - Active, Paused, Offboarding
  • services_live - multi-select of your service catalog
  • services_not_sold - calculated inverse of the above, the whitespace list
  • growth_score - number, 0 to 100, recalculated nightly
  • growth_signal_types - multi-select: Capacity Cap, New Stakeholder, Written Praise, Adjacent Ask, Result Milestone, Competitor Pressure, Renewal Window
  • last_signal_date and last_signal_note
  • tenure_months - number, auto-incremented
  • health_flag - Green, Amber, Red. Amber and Red block offers.
  • decision_maker_contact - reference to the contact who can say yes
  • budget_cycle_month - month the client sets its own plan, used for timing
  • last_qbr_date and next_qbr_date
  • offer_service, offer_sent_date, offer_outcome (Won, Not Now, Declined), decline_reason (Budget Cycle, Internal Capability, Vendor In Place, No Perceived Need, Trust Gap)
  • nurture_restart_date - date the record re-enters Signal Detected
  • do_not_upsell - switch, set by the account manager, honoured by every workflow

Tags

  • client-active, client-paused
  • growth-ready - score over threshold and health Green
  • signal-capacity-cap, signal-new-stakeholder, signal-praise, signal-adjacent-ask, signal-milestone
  • qbr-booked, qbr-overdue
  • offer-open, offer-won, offer-not-now, offer-declined
  • nurture-90, nurture-180
  • no-upsell - suppression tag, checked first in every workflow

Forms and surveys

  • Signal Log - internal, one screen. Fields: client, signal type, note, who observed it, confidence (High or Low). Submitting it writes to the account record and fires the scoring workflow. Link it in your delivery tool and your team chat so logging takes ten seconds.
  • Quarterly Review Prep - internal, pre-filled with services live, services not sold, growth score and last three signals. The account manager answers two questions: what does this client want next, and what is in the way.
  • Service Interest - client-facing, linked from the monthly client newsletter and the portal. Checkbox list of services with one free-text line. A submission is itself a high-confidence Adjacent Ask signal.
  • Scope Change Request - client-facing, used after Won to capture the operational detail the delivery team needs.

BO's role and guardrails

BO is the pattern-watcher and the drafter, never the closer.

  • BO reads inbound client email and chat for adjacent-ask language and written praise, and proposes a Signal Log entry for a human to confirm with one click. BO never logs a signal unassisted.
  • BO drafts the growth-call invitation email and the proposal follow-ups, using the client's own words from the logged signal. Every draft sits in the account manager's queue for approval before it sends.
  • BO answers inbound client questions about what a service includes from an approved service-description library.
  • BO never quotes a price, a fee, a rate or a discount. Any pricing question is answered with a line offering a call and routed to the account manager within the hour.
  • BO never messages an account tagged no-upsell, or one with health_flag Amber or Red.
  • BO does not contact a client outside 09:00 to 18:00 in that client's own time zone.

Numbers and channels

  • One dedicated agency number for client SMS, provisioned and registered, with the account manager's name in the first message of every thread.
  • Email sends from the named account manager's address, not a no-reply, so replies land in the thread that matters.
  • Internal alerts to your team chat channel, one channel for growth-ready accounts and one for open offers going cold.
  • Client-facing growth-call booking page under your own domain, pre-filled from the client record so no client ever retypes their details.
03

How it runs, step by step

One client, from a quiet retainer to a signed scope expansion.

  1. A manufacturing client has been on a content retainer for 14 months. On import they land in Baseline Set with services_live set to Content, services_not_sold showing Paid Media, Email, Web and Analytics, health_flag Green, tenure_months 14, budget_cycle_month November.
  2. In week two of the month the delivery lead notices the client has used all retained hours by the 20th for the third month running. She opens the Signal Log from the project channel, picks Capacity Cap, confidence High, and submits. The record gains signal-capacity-cap, last_signal_date is stamped, growth_score moves from 34 to 58.
  3. Four days later the client's marketing manager replies to a report email with a line asking whether the agency also runs LinkedIn ads. BO flags the message as a probable Adjacent Ask and drops a one-click confirmation into the account manager's queue. He confirms. growth_score rises to 79 and the record crosses the threshold, picks up growth-ready and moves to Signal Detected.
  4. The nightly scoring run posts the account to the growth-ready channel with the two signals, the unsold service list and the account manager's name. A task is created, due in two working days.
  5. The account manager opens Internal Fit Check and tags the paid media lead, who confirms capacity next month and names one constraint: he needs tracking in place before launch. That constraint is written to last_signal_note so it survives.
  6. BO drafts the invitation email in the account manager's voice, quoting the client's own question back to them. The account manager edits one line and approves. It sends from his address with the growth-call booking link.
  7. The client books a 45-minute Growth Conversation for the following Tuesday. The stage moves to Offer Conversation Booked, qbr-booked is applied, and the calendar sends confirmation plus a reminder 24 hours and 1 hour before. The paid media lead is added as an optional attendee.
  8. On the call the account manager uses the prep sheet: here is what the capacity pattern says, here is the question you asked, here is what we would do and what we would need from you. No pricing is discussed beyond confirming the client's own planning cycle, which is November.
  9. Within 24 hours the scope document goes out. Stage moves to Proposal Out, offer_service is set to Paid Media, offer_sent_date is stamped, offer-open is applied, and the follow-up sequence arms itself.
  10. Day 3 brings a soft check-in email, day 7 a short SMS from the account manager's number, day 10 an internal escalation to the agency principal. On day 9 the client replies that they want it but cannot move until their new financial year in November.
  11. The account manager sets offer_outcome to Not Now and decline_reason to Budget Cycle. The record moves to Not Now - Nurture, nurture_restart_date is set to 1 October, tag nurture-90 is applied, and the open-offer alerts stop.
  12. Between now and then the client receives the normal monthly client update plus two pieces of paid-media proof, nothing more. No chasing.
  13. On 1 October the nurture workflow fires. The record returns to Signal Detected with a fresh Renewal Window signal, and the account manager gets a task carrying the original note, the original scope document and the exact sentence the client used in July.
  14. The second conversation takes 20 minutes. The scope is signed in the first week of November. Stage moves to Won - Scope Added, services_live is updated, the Scope Change Request form goes to the client, the delivery kickoff is booked, and the record returns to Baseline Set with a recalculated score and a shorter whitespace list.
04

Automations in detail

Seven workflows. Build them in this order; each one depends on the data the one before it writes.

1. Nightly Growth Scoring and Threshold Crossing

Trigger: scheduled, every night at 02:00 agency time, over all records where client_status is Active.

First condition, always: if do_not_upsell is true or tag no-upsell is present, exit immediately and write nothing.

Actions in order:

  • Recalculate growth_score from the signals logged in the last 90 days using your agreed weights. Signals older than 90 days decay to zero rather than being deleted, so history survives.
  • Apply the tenure modifier: subtract 20 if tenure_months is under 3, add 10 if tenure_months is over 12.
  • Apply the health modifier: if health_flag is Amber, cap the score at 59 so the record cannot cross. If Red, set the score to 0 and apply client-paused.
  • Add 15 if the current month is one month before budget_cycle_month.
  • If the new score is 60 or above and the old score was below 60, apply growth-ready, move the opportunity to Signal Detected, and continue. Otherwise update the score and exit.
  • Post to the growth-ready team chat channel: client name, score, the signal types behind it, services_not_sold, and the account manager's name.
  • Create a task for the account owner, due in 2 working days: Run fit check on this account and decide whether to raise an offer.

Exit: on any record where services_not_sold is empty, or client_status is not Active.

2. Signal Capture and Confirmation

Trigger: either a Signal Log form submission, or BO proposing a signal from inbound client email or chat.

Branch A - submitted by a human. Write signal type into growth_signal_types, stamp last_signal_date, append the note to last_signal_note with the date and the observer's name, apply the matching signal- tag, then fire the scoring recalculation for that one record rather than waiting for the nightly run.

Branch B - proposed by BO. BO has matched adjacent-ask or praise language in a client message. Do not write to the record. Instead send the account owner an internal message with the quoted sentence and two actions: Confirm or Dismiss.

  • On Confirm, run Branch A with confidence High and the quoted sentence as the note.
  • On Dismiss, log the dismissal against the pattern so the matching can be tuned, and do nothing else.
  • Wait 3 days. If neither, send one reminder. Wait 4 more days. If still neither, expire the proposal silently.

Branch C - Service Interest form submitted by the client. This is the strongest signal you will get. Write Adjacent Ask with confidence High, apply signal-adjacent-ask, recalculate immediately, and alert the account owner within 5 minutes regardless of the nightly schedule. Auto-reply to the client from the account manager's address: Thanks for flagging that - I have it. I will come back to you by the end of tomorrow with a straight answer on whether we are the right people for it.

Exit: no-upsell present, or the client record is Offboarding.

3. Fit Check and Offer Invitation

Trigger: opportunity moved into Internal Fit Check.

Actions in order:

  • Create an internal approval task for the delivery lead who owns the service named in services_not_sold with the highest signal weight. Task fields: can we deliver this in the next 60 days, and what do we need from the client first.
  • Wait for approval, up to 3 working days. If the delivery lead approves, continue. If the lead declines, move to Baseline Set, remove growth-ready, and set a 60-day suppression so the account does not re-trigger on the same signal.
  • If no response after 3 working days, escalate to the agency principal in chat and wait a further 2 days before auto-declining.
  • On approval, write the lead's constraint into last_signal_note, set offer_service, and move to Offer Conversation Booked pending a booking.
  • BO drafts the invitation email into the account manager's approval queue, built from the signal note. Suggested copy: Hi [first name] - you mentioned [the thing they said] a couple of weeks ago, and separately we have noticed [the pattern] in your retainer hours. I think there is a straightforward version of this worth 45 minutes of your time. Here is my calendar if you want to grab a slot: [link]. If the timing is wrong, tell me when to come back and I will.
  • Wait for account manager approval. On approve, send from their address. Wait 4 days. No booking and no reply, send one short SMS: [First name] - [AM name] from [agency]. Sent you a note about [service] on Tuesday. Worth a quick look? Reply STOP to opt out of texts from me.
  • Wait 5 more days. Still nothing: move to Not Now - Nurture, set decline_reason to No Perceived Need, set nurture_restart_date to 90 days out, apply nurture-90.

Exit on: any booking made, any reply received, no-upsell applied, or health_flag turning Amber or Red mid-sequence.

4. Growth Conversation Confirmation and Prep

Trigger: a Growth Conversation booking is created.

Actions in order:

  • Move to Offer Conversation Booked, apply qbr-booked, remove the chase sequence from step 3.
  • Send the client an immediate confirmation email with the agenda in three bullets, the attendee names and the call link. No attachments, no deck.
  • Add the relevant delivery lead as an optional attendee and post the booking to the team channel.
  • 24 hours before: generate the internal prep sheet - services_live, services_not_sold, every signal from the last 90 days with dates and quotes, health_flag, budget_cycle_month, tenure_months - and attach it to the account manager's task.
  • 24 hours before: email the client. Looking forward to tomorrow. Nothing to prepare - I will bring what we have noticed and one idea. If there is something specific you want covered, reply and I will make room for it.
  • 1 hour before: SMS the client the join link.
  • On no-show: wait 10 minutes past the start, then email: Sorry we missed each other - my fault for not confirming harder. Same conversation, your pick of time: [link]. Create a task for the account manager. Do not move the stage. Wait 5 days; if no rebooking, move to Not Now - Nurture at 90 days.
  • 2 hours after the call ends: task the account manager to set the outcome. Options: proposal to send, not now, declined. Nothing advances until a human chooses.

Exit: booking canceled, or outcome recorded.

5. Proposal Follow-Up and Decision Chase

Trigger: opportunity moved to Proposal Out and offer_sent_date stamped.

Conditions: runs only while the stage is Proposal Out or Negotiation, only on weekdays, only inside client-local quiet hours.

Actions in order:

  • Day 1, 2 hours after sending: confirmation email. Scope document is with you. Two things worth knowing: [the one real constraint from the delivery lead], and we would want to start by [date]. Happy to walk through it rather than have you read it - say the word.
  • Day 3: email. Any questions on the scope? The part people usually want to dig into is [section]. I can do 15 minutes today or tomorrow.
  • Day 7: SMS from the account manager's number. [First name] - checking you have what you need on the [service] scope. Anything missing, tell me and I will fix it today. Reply STOP to opt out.
  • Day 10: internal only. Post to the cold-offer channel and task the agency principal to make one call. No further client contact from the automation.
  • Day 14: email, the honest close. I would rather have a clear no than a slow maybe - it saves us both chasing. Where has this landed? If the answer is not now, tell me roughly when and I will go quiet until then.
  • Day 21: if there is still no outcome, auto-move to Not Now - Nurture, set decline_reason to No Perceived Need, nurture_restart_date 120 days out, apply nurture-180.

Exit immediately on: any client reply, stage change, signature webhook received, no-upsell applied, or offer_outcome being set by a human.

6. Not Now Nurture and Dated Re-Entry

Trigger: opportunity enters Not Now - Nurture, plus a daily scheduled check against nurture_restart_date.

Actions in order:

  • On entry, remove offer-open, apply offer-not-now, suppress the record from every chase sequence, and confirm the restart date back to the client in one line: Understood - I will come back to you in [month]. In the meantime you will get the normal monthly update and nothing else from me on this.
  • Enroll the client in the monthly client update only, plus at most two pieces of proof relevant to offer_service across the whole nurture window. No more. The restraint is the feature.
  • 7 days before nurture_restart_date: create a task for the account manager carrying the original signal note, the original scope document and the exact sentence the client used. Nothing goes to the client yet.
  • On nurture_restart_date: move back to Signal Detected, add a Renewal Window signal, recalculate the score, remove the nurture tags.
  • BO drafts the re-entry email for approval. [First name] - you said [month] for the [service] conversation, so here I am. Same scope, one change: [the thing that changed]. 20 minutes to confirm or kill it: [link].
  • If the client says no a second time, move to Declined, set decline_reason, and apply a 12-month suppression. Two nos is a pattern, and continuing to ask damages the retainer you already have.

Exit: client re-engages and books, or Declined is set, or do_not_upsell is switched on.

7. Won Handoff and Monthly Growth Digest

Trigger A: signature webhook from your e-signature tool, or stage moved to Won - Scope Added.

Actions in order:

  • Update services_live to include offer_service, recalculate services_not_sold, set offer_outcome to Won, apply offer-won, remove growth-ready and offer-open.
  • Send the client the Scope Change Request form and a plain-language welcome: Signed and logged. Next step is a 30-minute kickoff with [delivery lead] - here is the calendar: [link]. The form in this email is the boring but necessary bit: access, approvals and who signs off on what.
  • Create the delivery kickoff booking task, notify the delivery lead in chat, and open the billing task against Stripe, QuickBooks or Xero so nobody has to remember it.
  • Wait 3 days. If the Scope Change Request form is not submitted, one reminder email. Wait 3 more days, then a task for the account manager to chase by phone.
  • Wait 30 days. Create a check-in task: is the new scope actually delivering, and is health_flag still Green. An expansion that sours is worse than one that never happened.
  • Return the record to Baseline Set with a fresh score and a 60-day suppression on new offers.

Trigger B: scheduled, first working day of each month at 08:00.

  • Compile and send the growth digest to the principal and every account manager: services per client and its change, accounts that crossed the threshold last month, offers opened and closed, win and not-now and decline counts with reason mix, median days from Proposal Out to outcome, accounts with no signal in 90 days, and reviews overdue.
  • Create one task per account manager: review your accounts with no signal in 90 days and log at least one signal or mark them genuinely static.

Exit: none - this one runs permanently, and the 90-day silent-account list is the single best indicator of whether the playbook is actually being used.

05

What changes

Expansion stops being a personality trait of your best account manager and becomes a process every account manager runs. The difference shows up in three ways. Every active client has a visible readiness score and a visible whitespace list, so the question at a Monday meeting changes from who should we talk to into these six accounts crossed the threshold this week. Signals that used to evaporate in a project channel now have a thirty-second home and a scoring consequence. And a no becomes a dated future yes instead of a dead end, because Not Now carries a restart date and the original context travels with it.

The second-order effect is on renewals. An account manager who has had a forward-looking growth conversation in the last quarter walks into a renewal from a different position than one who has not, and the pipeline tells you which is which before the renewal date arrives rather than after.

What to measure

  • Services per client - the headline number. Track the average and the distribution, not just the average.
  • Whitespace coverage - share of active clients with at least one logged signal in the last 90 days. A low number means the Signal Log is not being used, which is a habit problem, not a system problem.
  • Signal-to-conversation rate - of accounts that crossed the threshold, how many reached Offer Conversation Booked, and in how many days.
  • Conversion by signal type - which of Capacity Cap, Adjacent Ask, New Stakeholder and the rest actually convert. This is the number that lets you retune the scoring weights after a quarter.
  • Offer cycle time - days from Proposal Out to an outcome, and the share that sit past 14 days with no decision.
  • Decline reason mix - a pile of Budget Cycle means your timing is wrong and should be driven off budget_cycle_month. A pile of Trust Gap means the offer is coming too early in the relationship. A pile of Vendor In Place means you are late.
  • Nurture re-entry conversion - how many Not Now records convert on their second pass. If this is strong, the nurture window is the most valuable part of the build.
  • Quarterly review completion - share of active clients with a review in the last 100 days.
06

Before you start

Prerequisites

  • A written service catalog with a one-paragraph description of each service, what it includes, what it needs from the client, and what it does not cover. This is what BO answers from. Without it, BO cannot be allowed near a client question.
  • A clean client list with one owner per account and one decision-maker contact per account. Accounts with no named decision maker will stall at Internal Fit Check.
  • Agreed scoring weights, written down before you build. A workable starting point: Adjacent Ask 35, Capacity Cap 25, New Stakeholder 20, Result Milestone 15, Written Praise 10, Competitor Pressure 10, Renewal Window 15, with the threshold at 60 and tenure under 3 months subtracting 20.
  • Agreement on who may raise an offer. If delivery leads are not allowed to sell, the Internal Fit Check stage needs a named account manager to hand to.
  • A real health signal from somewhere, even a manual Green or Amber flag reviewed monthly. Selling into an unhappy account is the fastest way to lose it.

Integrations

  • Your project or delivery tool, so the Signal Log can be opened from where the work happens. If a native connection is unavailable, a Zapier or Make step posting form submissions into the platform is enough.
  • Slack or your team chat for the growth-ready and cold-offer channels.
  • Google Calendar or Outlook two-way sync for every account manager, or double bookings will cost you credibility on the first growth call.
  • Your e-signature and proposal tool, webhooking a signature event back so Won is never set by hand.
  • Stripe, QuickBooks or Xero if you want billing on the expanded scope to start without a manual handoff.

Numbers and messaging compliance

  • Provision one dedicated number per sending brand and complete A2P 10DLC registration before you send a single client SMS. Register the brand and a campaign that honestly describes the use case: account and relationship messaging to existing business clients. Expect the registration to take days, not hours, and start it in week one.
  • Include your agency name in the first SMS of any new thread and carry opt-out language on the first message of each sequence. Honor STOP, UNSUBSCRIBE, CANCEL and QUIT automatically, write the opt-out to the contact record, and make the suppression global rather than per workflow.
  • Set quiet hours at the account level and enforce them in the client's own time zone, not yours. 09:00 to 18:00 local, weekdays only, is the sane default for business-to-business client messaging.
  • Keep the no-upsell tag and the do_not_upsell switch as the first condition in every workflow, not the last. A client who has asked not to be sold to and gets sold to anyway is a churn event.

Data protection

  • Signal notes quote real client staff. Decide how long you keep them, who can read them, and what happens on offboarding, and write that into your retention settings rather than leaving it to chance.
  • If you hold data on clients or their staff in the UK, EU or other regimes with data-protection law, confirm your lawful basis for relationship messaging, your retention periods and your records of processing before go-live.
  • Nothing here is legal advice. Have the client's own counsel, and your own, confirm the messaging consent position, the retention schedule and any sector-specific requirements that apply to your accounts. For scoping and pricing on a build, book a call at bookings.appbo.io.
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