TL;DR: A database reactivation campaign uses an AI voice agent to call leads who went cold months or years ago and turn some of them back into booked appointments. It works when you treat it as a data project first and a calling project second. Before a single dial, the list needs cleaning, consent needs checking lead by lead, and existing customers and opt-outs need suppressing. The agent needs a real reason to be calling now, a goal that fits in one sentence, and a graceful exit. Every outcome, including "wrong number" and "not interested", has to write back into the CRM so the list gets better with each pass instead of worse. Pace the dialing to what the team can actually handle, and measure booked appointments per hundred clean records, not calls made.
Every business that has run ads for a few years has a CRM full of people who raised their hand and went quiet: form fills that never booked, quotes that never closed. Agency owners call this "the database", and the pitch to reactivate it with AI is obvious: the leads are already paid for.
At Tested Media I built the voice and chat agents behind CallSetter AI, with GoHighLevel handling campaigns and lead management underneath, so I have seen this from the build side. The pitch is right. The usual execution is wrong. Most reactivation campaigns that go badly fail before the agent says a word, because someone exported ten thousand rows and pointed a dialer at them.
This is how I would structure one.
What makes reactivation different from normal outbound
I wrote a whole post on why an outbound agent is not an inbound agent dialing out. Reactivation is a harder subset of outbound, for three reasons.
- The data is old. Numbers get reassigned. People move, change jobs, buy the thing from someone else. A record that was accurate eighteen months ago is now a guess.
- The memory is gone. A missed-call callback within a minute is a continuation of something the person started. A call about an enquiry from last spring is, for most people, a cold call wearing a name tag.
- The consent may not cover it. What someone agreed to when they filled out a form two years ago is a specific, written thing, and it may or may not stretch to an AI calling them today.
All three point the same way. The list is the product, and on a reactivation campaign the list is in the worst shape it will ever be.
Step one: clean the list before you dial
I treat the export as raw input, never as a call list. Before anything reaches the agent I want a pipeline, usually in n8n sitting next to GoHighLevel, that does the boring work:
- Deduplicate. The same person often exists three times: once from a form, once from a call, once from a booking import. Calling them three times in a week is the fastest way to an angry reply. Merge on normalised phone number first, then email.
- Normalise and validate numbers. Convert everything to E.164. Drop records with no usable number. If the budget allows, run a line-type lookup so you know which numbers are mobiles, landlines or dead, because that changes both the consent picture and whether a text follow-up is even possible.
- Suppress aggressively. Remove existing customers, anyone with an open deal, anyone tagged as an opt-out or do not contact in any system, and anyone on the national Do Not Call registry where that applies. Nothing burns trust faster than an AI asking a current customer whether they are still interested in becoming one.
- Segment by age and source. A lead from three months ago and a lead from three years ago should not get the same script or the same priority. Neither should a quote request and a newsletter signup.
The output is a smaller list than the client expected. That is the point: a clean small list beats a dirty big one on every number that matters.
Step two: check consent lead by lead
This is where I slow everyone down. I am an engineer, not anyone's lawyer, so the rule I hold to is simple: the client confirms in writing what their consent covers, and the pipeline enforces only what they confirmed.
The reason it matters more for AI than it used to: in early 2024 the FCC ruled that AI-generated voices count as "artificial" voices under the TCPA. In plain terms, an AI voice calling a US consumer needs the same prior consent that a prerecorded robocall would, and for marketing calls to mobiles that means prior express written consent. On top of that sit federal calling hours, Do Not Call rules, and state rules that are often stricter than the federal ones.
What that means in the build:
- Consent is a field, not an assumption. Every record carries where it came from, when, and what the person agreed to. Records without that do not get called.
- Old consent gets a second look. Some forms said "we may contact you about your enquiry", which reads very differently from consent to marketing calls. The client and their counsel decide which sources qualify.
- Calling windows use the lead's local time zone, inferred from the address or area code, not the client's office clock.
- Disclosure and recording rules still apply. I covered those in call recording consent and AI disclosure.
For segments where call consent is shaky, the better move is often to text first, inside a properly registered A2P 10DLC campaign, and only call people who reply.
Step three: give the agent a reason to call now
"Just checking in" is not a reason. It is the opening line of every call people hang up on. A reactivation agent needs something true and specific that makes the call worth taking:
- A real offer or change. New availability, a new service, a price that changed, a slot that opened up this week.
- A reference to what they actually did. "You asked about a quote for X back in March" lands very differently from a generic greeting. This needs the source and date from the CRM passed into the call, which is the same plumbing I describe in giving a voice agent memory of returning callers.
- A goal that fits in one sentence. Book a visit. Book a callback with a human. Confirm they are no longer interested. One goal per campaign.
The first few seconds have to say who is calling, on whose behalf, why, and offer an easy way out. The easy exit protects the list: people who were never going to book leave politely instead of reporting the number.
Keep the agent thin
The agent's job is narrow: confirm it is the right person, offer the reason, handle the common objections, and book, hand off, or close the loop. Pipeline stages, tags and follow-up texts belong in deterministic automation after the call, because code can be tested and a conversation cannot be replayed.
Booking itself has to work against the real calendar. If you are booking live on the call, the calendar booking details apply unchanged.
Step four: write every outcome back
This is the part that turns a one-off campaign into an asset. Every call should end with a structured outcome, extracted reliably after the call and written into GoHighLevel:
- Booked, with the appointment linked to the contact.
- Interested, not now, with a follow-up date if they gave one.
- Not interested, which suppresses them from the next pass.
- Wrong number or not this person, which flags the record for cleanup.
- Asked not to be contacted, which writes an opt-out everywhere, immediately.
- No answer or voicemail, with an attempt count so retry caps can be enforced.
A clean outcome schema means the second pass on the list is better than the first, because dead numbers and firm noes have been removed. A sloppy one means the next campaign calls the same wrong numbers again. Most of the ways this goes wrong are covered in why post-call automation fails, and the CRM side is in my GoHighLevel setup guide for voice agents.
Step five: pace it to the team, not the dialer
A voice platform can place a lot of calls at once. The business usually cannot absorb the result. Thirty appointments in one afternoon is a success on paper and a failure in the real world.
So I pace the campaign by downstream capacity:
- Cap bookings per day to what the calendar and the staff can absorb.
- Cap concurrent calls so live transfers always have a human to land on. The platform side of this is in handling call spikes and concurrency.
- Start with the best segment. Recent, well-sourced, clearly consented leads go first. That gives you a clean read on whether the script works before you spend the older, weaker segments.
How to measure it honestly
The vanity number on a reactivation campaign is calls made. It says nothing. The numbers I put on the dashboard:
- Clean records that survived every check. This is the real denominator.
- Contact rate, attempts that reached a live person.
- Conversion on contact, the honest agent quality number.
- Booked appointments per hundred clean records, which is what the client actually cares about.
- Opt-out and complaint rate, the early warning on targeting.
- Show rate, because a booking that never shows is not a win. See reducing no-shows.
I keep contact rate and conversion on contact separate for the same reason as on any voice agent dashboard: a bad list should never be allowed to hide a good agent, or the other way round.
When not to run one
Reactivation is not always the right call. I would push back if:
- The client cannot show where the leads came from or what consent was collected.
- The list is mostly years old with no recent segment to test on.
- There is no real reason to call now beyond "we would like more bookings".
- The team has no capacity to handle the appointments it would create.
In those cases a texted offer to the consented segment, or simply fixing the missed call text-back on new leads so the database stops going cold in the first place, will usually do more.
The short version
Done this way, a reactivation campaign does two jobs: it books appointments from leads that were already paid for, and it leaves the CRM cleaner than it found it.
I build production voice and chat agents on Retell, wired into n8n, GoHighLevel and Twilio, including the list hygiene, consent checks and CRM write-back that outbound campaigns depend on. More about my background here, or book a call if you have a database worth waking up.