To cross-sell your existing book of business, filter every active client for "has X, not Y" gaps (an annuity but no life insurance, for example), have each agent cross out the names that don't fit, and send the rest a one-question text in small batches. Then give one person the replies and the calendar. Most cross-sell campaigns stall at that last step, well after the list is done.
Say you run a 10-agent brokerage with 2,000 active clients. Ask any of your agents for three annuity clients who don't have life insurance and they'll name them before you finish the question. Ask for all of them, across every agent, and nobody can answer.
The rest of those clients sit in your carrier and back-office data, and nobody has connected that data to a campaign.
Why your existing book is the cheapest revenue you have
A client in your book already knows your name. You have their age, their products and their carriers. You paid to acquire them once, and you don't pay again to talk to them.
Compare that with buying leads. Say you buy 100 final expense leads at $30 each. That's $3,000 spent before anyone dials, on people who have never heard of you. Pulling 100 existing clients with a coverage gap costs a few hours of analysis and an hour of each agent's time to review the list.
When an agency with sellers but no proven lead source asks Kevin where to start, his answer is the book they already have. Put the people you've got on setting appointments with existing clients for someone who can sell. Build a new lead machine later, once that works.
Step 1: Pull every active policy into one list
Start with every active policy across all agents and all carriers. One agent's book won't do, and neither will the policies one carrier reports.
As you pull it, write down three things:
- How far back the data goes. If your back-office or IMO export starts in a given year, policies written before then won't show up. An agent will ask where a client they know well has gone, and the answer will be the start date of the data.
- How products are labelled. Group every product into a type: Medicare Supplement, Medicare Advantage, annuity, life, final expense, long-term care, hospital indemnity, health. Carriers name products in their own way, and some products look like another type until you check. A hybrid life policy with a long-term care rider can hide in either bucket.
- Whether the data holds dollars. Most IMO policy feeds list premium, split and writing agent. They don't list commission. You'll need commission data later to measure the campaign, so note now where it will come from.
If your product and status fields are free text, fix that first. Set standard values in your insurance CRM so "Med Supp", "MS" and "Medigap" all become one value. Every filter in step 2 depends on it.
Step 2: Run "has X, not Y" filters
Cross-selling starts as a filtering problem. Each scenario is a client who has one product and is missing a related one, sometimes within an age band. These are the filters Kevin runs on a book:
| Scenario | Filter | The conversation it opens |
|---|---|---|
| Annuity, no life | Has annuity, no life policy | Protecting the family alongside the savings |
| Annuity, no long-term care | Has annuity, no LTC | Paying for care without drawing down the annuity |
| Life, no health | Has life, no health policy | Health coverage gaps before Medicare age |
| Life, no Medicare, 65+ | Has life, no Medicare product, age 65+ | Medicare enrollment or review |
| Medicare, no annuity, 55-70 | Has Medicare product, no annuity, age 55-70 | Retirement income |
| Medicare, no life or final expense, 75+ | Has Medicare product, no life, no final expense, age 75+ | Final expense |
| Single-product clients | Exactly one active policy | A general review |
Two more lists are worth pulling while you're in the data:
- Orphan clients. Cross-reference each client's agent against your current roster. Clients whose agent left are often the ones nobody has called in years.
- Add-on gaps: clients with health coverage and no hospital indemnity, or an annuity with no health coverage at 65+.
Run every filter per agent. An agent will work a short list of their own clients. An agency-wide list of 400 names tends to sit in someone's inbox.
Step 3: Have each agent vet the list
The list is a draft. Before anything goes out, send each agent their list and ask them to cross out every name that doesn't make sense. Until an agent has vetted it, every name on it is a possible opportunity and nothing more.
Agents cross names out for reasons the data can't see:
- Coverage held elsewhere. This is the biggest blind spot. An agent who moved firms may have left some clients' policies at the old firm because of insurability or cost. Your data shows "annuity, no life". The client has life insurance with someone else and will be annoyed to get a quote that costs more than what they already pay.
- Split cases. Most exports list one writing agent. If another agent wrote the case and your agent was on the split, the client shows up on the other agent's list.
- Health or money. The agent knows the client can't qualify for life cover or has no money to move.
- Mislabelled products. The "missing" product is in the book under another name.
- Timing. The client lost a spouse last month, or is in the middle of a claim.
Ask agents to send back more than crossed-out names. For each gap, Kevin asks the agent to write down what they expected to see, what the list showed, and the difference. Each of those notes tells you something to fix in the data before the next run.
Step 4: Attach a campaign before the list leaves your desk
A list alone changes nothing. An agency principal we work with said it plainly:
"This data is great. This is an awesome tool. I hand it to an agent and they do nothing." — An agency principal we work with
Agents are busy with the clients already in front of them. A list of 40 names with no message, no script and no follow-up plan goes to the bottom of the pile. Hand them the list and the finished campaign together.
The setup that works:
- Import the vetted list into GoHighLevel as a smart list, tagged with the scenario and the date (for example
xsell_annuity_no_life_2026_11). The tag is what lets you attribute revenue to this list later. - Write a direct-response sequence: a first text, a follow-up email with more context, and one or two scripted calls. The call guide should fit on one screen.
- End every path at a booking link to the agent's calendar, or at one closing call after the client has read what they need.
The agent's job is then to approve the list and show up to booked appointments. Everything before that runs without them.
Step 5: Write a one-question first text
The first message should read like the start of a conversation. Ask one direct question about something specific to that client.
An example for the annuity, no life list:
Hi [First name], it's [Agent] from [Agency]. When we set up your annuity a couple of years ago we didn't get to talk about life insurance. Do you have a policy in place today, here or anywhere else?
That question does two jobs. It opens the topic, and "anywhere else" catches the coverage your data can't see. A client who says "yes, through my old employer" saves you a pitch and still gives you a reason to review it.
Expect three groups to come back:
- A small group says yes. Send the booking link straight away.
- Some ask a question. Answer it in the thread, then offer a time.
- Most don't reply. Move them into a slower lead nurture sequence: an explainer email, then another text a week or two later. Whoever still hasn't replied gets an invitation to a webinar or educational seminar for the whole client base. Our guide to Medicare seminar follow-up covers how to run that stage.
Before you text anyone, check you have TCPA consent for that number. The FCC's guide to unwanted calls and texts explains the consent rules. If the conversation could move to Medicare Advantage or Part D plans, the CMS marketing guidelines apply, including a Scope of Appointment before the meeting. Your compliance team keeps the final say on wording.
Step 6: Send in staged batches
Don't send the whole list on day one. Say your agents approve 105 names on the annuity, no life list. Split them into three batches of 35 and send one batch per day.
Batches help you in three ways:
- One person can keep up with the replies. If one batch brings back eight replies, one person can handle all of them in the same hour. If 105 texts bring back 25 replies at once, half of them wait until tomorrow.
- You learn before you scale. If day one brings back five replies saying "I have that elsewhere", change the message before day two goes out.
- The agent's calendar is ready. Block appointment slots on the agent's calendar for the hours after each send, so booked clients get a time this week.
Answer replies within 30 minutes. Interest drops off fast after that, the same way it does with new leads (see speed to lead for insurance agencies). Text at a time when someone is at a desk to respond.
Why cross-sell campaigns stall without appointment setting
You can do everything above and still write almost nothing. When Kevin looked at an agency that had people who could sell but no system for putting them in front of clients, he split the problem in two:
"So we need marketing, which is setting appointments, and we need sales, which is being able to close a deal. They're challenged with both." — Kevin Beeftink, founder of Kevlex Digital
Plenty of agencies can close anyone they sit across from. What they haven't solved is getting in front of the client. A cross-sell list creates replies and callbacks, and if nobody owns those, they go cold in a day.
Give the job to one person
Say you split the follow-up between five agents for 45 minutes a day each. That's under four hours of calls, spread across five people with five skill levels, and you now train, manage and report on all five. One appointment setter working the list six hours a day makes more calls, and you train one person once.
Put the setter on your own clients first
A new setter working cold data spends hours to reach a handful of people. The same setter working your existing book reaches clients who recognise the agency's name and pick up. That's where a new or junior team member earns their keep fastest.
Plan for what breaks next
Once appointments flow, the constraint moves to the back of the funnel: servicing. Top producers tend to ignore small Medicare clients, and those clients drift away. Route low-value servicing to a central servicing desk, so the client stays with the agency and your best agents spend their hours on the cross-sell appointments.
Give agents a number to chase
If you want agents to hand over clients or join campaigns, Kevin's suggestion is tiered targets: hand over 10 clients and you earn one reward, 50 earns a bigger one, 100 a bigger one again. Funding for an agent's next seminar is one reward you could offer.
How to measure a cross-sell campaign
Measure in commission dollars. Premium tells you what the client pays the carrier. Commission tells you what the campaign earned your agency.
Track each tagged list through these pipeline stages:
- clients contacted
- replies
- appointments booked
- applications written
- policies placed
- first-year commission
A worked example: say the 105-name list gets 12 booked appointments, five placed policies, and an average of $700 first-year commission per policy. That's $3,500 from clients you already had. Put it next to the $3,000 lead purchase from earlier, which hasn't produced a conversation yet.
Expect the numbers agents type into the CRM to differ from what the commission statements show. The percentages usually line up. The dollar amounts don't. Use the statement for dollars and the CRM for activity, and tag every imported list so marketing attribution works when the money arrives.
Re-run the analysis every month. Comparing this month's active policies with last month's shows you who dropped off, so you can call them before they've settled in with another agent. RevEngine's guide to analysing a book of business for cross-sell and churn goes deeper on the data side.
What to do this week
- Export every active policy across all agents and carriers into one sheet, and note the earliest policy date in the data.
- Standardise product types, then run the annuity, no life filter per agent.
- Send two agents their lists and ask them to cross out names and explain each gap.
- Write one first text with a single yes or no question that asks about coverage held elsewhere.
- Decide who answers the replies within 30 minutes, and block their time before the first batch goes out.
Kevlex Digital builds cross-sell campaigns like this for independent brokerages, from the list pull to the scripts and the booking flow, and we take the setup work off your plate. If you want to see what's sitting in your own book, book a 15-minute call with Kevin.