Med Spa Speed to Lead: 58 Form Leads, 0 Calls, and the Fix
Case study: a med spa had 58 Facebook form leads with a phone number in 14 days and none were called. Here is the AI call chain I built and how it is watched.
By Carlos Familia, CRM & AI automation expert. Updated . 7 min.
- 58 Facebook form leads with a phone number in 14 days, 0 of them called
- 42 of 45 recent Facebook contacts had no tag when they were created
- About 45 seconds is the delay I configured between a new form lead and the first AI call
- 79 failed dials when the voice credit ran out, and 11 Facebook leads never called
- 15 of 15 chat tests and 14 of 15 phone tests passed in QA

What was the situation?
A med spa in Pennsylvania runs Facebook lead ads. Its agency wanted one chain: a form lead arrives, gets a tag, receives an AI phone call within about a minute, and a chat bot then knows what was said on the call. Later the complaint became "I tagged a lead and no call came."
Before building anything, I checked each link of that chain against live data. The chain did not work the way the plan assumed.
The fix was to stop waiting on tags, watch for new contacts by form ID, and dial about 45 seconds after a lead arrives. It also needed monitoring, because one real outage came from an empty voice balance, not from code.
For context on why the slow tail matters: at another med spa, before building its chat bot, I measured how fast new leads got a first reply. Half got one within 36 seconds. The slowest tenth waited 73 minutes or more, and 2 leads in 14 days never got an answer at all. A median alone would have hidden that.
What did I check before building?
| Link in the chain | What I found |
|---|---|
| Calls to form leads | 58 leads with a phone number in 14 days, 0 called |
| Tags on new Facebook contacts | 42 of 45 recent contacts had none when created |
| The marketplace feed | Dead for weeks, with about 45 form leads unanswered |
| Call results back to the CRM | No call ever carried the contact ID, so the CRM was never updated after a call |
Read the numbers plainly. Fifty-eight leads in 14 days is about four leads a day, and nobody called any of them. And 42 of 45 is 93 percent of contacts with no tag at creation, so a trigger that waits for a tag would have had nothing to fire on for most leads.
The dead feed was a separate problem: while it was down, about 45 form leads sat unanswered. For the setup side, see my GoHighLevel Facebook lead form guide.
What did I build?
I replaced the tag trigger with my own poller that checks for new contacts by form ID about every 20 seconds. Around it:

- Atomic claims. Each lead is claimed in a database before dialing, so it is dialed once.
- One dial path. Every call goes through the same code.
- Rehearsal mode. Test contacts go down a safe path and never reach a real phone.
- A chat and voice lease. The chat bot and the voice agent never talk to the same lead at the same moment.
- A call window. Calls go out from 8 a.m. to 9 p.m. in the recipient's time zone, which the poller reads from the area code. Those are the hours in the federal telephone solicitation rule, which counts them in local time at the called party's location. Ask your counsel whether your calls count as solicitations.
- Two kill switches. Either one stops all dialing.
The poller is configured to dial a new form lead about 45 seconds after it arrives. The text side of the same idea is in missed call text back, and the phone side is in how AI receptionists work.
What happened?
QA passed 15 of 15 chat tests and 14 of 15 phone tests. Six things broke along the way.
- A tag is an event, not a state. Switching a tag on starts the call only for people who did not already have it. Someone who already carried the tag was never called. To re-fire a tag trigger you must remove the tag first and then add it again. The real fix was to stop using the tag as the trigger.
- Two tag spellings. The same tag written with a hyphen and with an underscore did not match. Pick one spelling and look for the other.
- A double pickup. A manual tag was picked up by both the webhook and the poller, and that retired the queue row. Each lead now goes through one dial path.
- A failed text became STOP. Texts that failed with carrier errors 30005 or 30006 flipped the contact's SMS do-not-disturb on in GoHighLevel, and the bot read that as a request to stop. A failed delivery is not a refusal.
- A cloned follow-up ladder. It would have messaged 38 of 100 conversations that staff had written themselves. I added a launch cutoff date.
- An empty voice balance. The credit ran out and the dispatcher still ended "success". That produced 79 failed dials and 11 Facebook leads that were never called.
My voice QA tool runs graded question suites by text and by phone. A phone run costs about $1.80 and a text run about $0.23. I have no booking or revenue numbers for this build, so I am not quoting any.
How is the chain watched?
A dialer that fails quietly is risky, because the team believes leads are being called. So a watchdog checks the chain. Version 2.1 alerts only when it has evidence, and failed dials count as evidence. It now catches the empty-balance case, and it has caught a server CPU throttling outage by itself.
Agency staff can also ask for changes in a Slack channel. Each request lands in a ticket table, where an AI classifies it, so requests do not get lost in a chat thread.
How can you run the same count at your spa?
- Export every Facebook form lead from the last 14 days that has a phone number.
- Count the calls or texts that went to those numbers in the same 14 days.
- Look at 45 recent Facebook contacts and count how many had a tag the moment they were created.
- Find the newest lead per form and check its date. If the ad is running and the newest lead is weeks old, the feed is dead.
If the second count is far below the first, you have the gap I found.
What should you ask your agency?
If an agency runs your lead ads, these five questions show whether anyone is watching the chain:
- How many form leads with a phone number came in last week, and how many of them got a call or a text?
- What happens to a lead who already has the tag the workflow waits for?
- What alerts us if no new lead arrives for a day?
- Who is warned when the voice account balance runs low?
- What is the launch cutoff, so old conversations are not contacted by a new sequence?
A good answer names a number or a person. A weak answer says it should be fine.
What would I do differently?
- Set the balance alert on day one. One outage came from an empty account, and I think a basic low-balance alert would have caught it.
- Compare form leads to calls placed every week, from outside the dispatcher. I found the 58-to-0 gap by counting both sides myself.
- Fix the launch cutoff before cloning any follow-up ladder. Otherwise it contacts people your staff already handle.
- Send the contact ID with every call from the first day. Without it, the chat bot cannot know what was said on the phone.
If your spa has a similar gap, start with that count. My med spa CRM guide covers the rest of the system, and AI voice agent in healthcare covers where an AI caller should stop. The med spa page lists what I build, or book a call.
About the author

Carlos Familia, CRM & AI automation expert. GoHighLevel, n8n, AI agents, servers. Full-stack developer.
I build CRM systems in GoHighLevel, n8n automations on my own servers and AI voice and chat agents for service businesses. Full-stack developer: I write the workflow, the API integration, the database and the server it runs on, and I test every build with real journeys before handoff.
Book a call with Carlos
In 30 minutes we look at how you get customers today and what to automate first. Pick a time ยท contact@bluemiraisystems.com