← All resources

Case study · GoHighLevel + AroFlo

A$10,536 in paid jobs in 30 days

That's what one heating and cooling business invoiced in a single month to past customers who replied to a text and asked for a call. Those 21,775 customers had been buried inside the job-management software the technicians use, where nobody could market to them. I moved the lot into GoHighLevel and built an engine that texts them, answers them, and hands the office a callback to make.

Their best sales list was already in the building. It just wasn't anywhere they could use it.

Heating & cooling GoHighLevel + AroFlo AI SMS agent Runs itself every weekday Real results, names redacted
A$10,536invoiced after customers asked for a call
45sales calls from 439 customers texted
16became paid jobs, about 1 in 3 calls
A$659average job, invoiced within a week
The live sales results dashboard inside the CRM: A$10,536 revenue won, 45 sales calls, 16 paid jobs, A$659 average job, over the last 30 days
The real thing, last 30 days (15 Sep to 14 Oct). This is the dashboard the owner opens inside the CRM. A call only counts as won when an invoice for that customer appears in the job software after they asked for the call, so nothing here is a guess or a pipeline estimate. The list underneath is the office's ring-back list: newest calls with no invoice yet sit at the top. Customer names redacted.

Where it came from: 21,775 customers, finally reachable

21,775customers moved into the CRM
19,606email addresses recovered with them
40past customers re-contacted every weekday
1decision a person makes each day
AroFlo (job management) → GoHighLevel (CRM)
Job management — where the customers were
Ducted heater service
Completed · residential
Job record
Split system install
Completed · residential
Job record
Evaporative cooling repair
Completed · residential
Job record
Annual service — return visit
Completed · residential
Job record

Brilliant at running jobs. No way to send any of these people a message.

→
Migrated
and tagged
CRM — where they are now
Customer · ducted heating
Last job 2 years ago · mobile on file
Contactable
Customer · split system
Last job 18 months ago · mobile on file
Contactable
Customer · evaporative
Last job 3 years ago · email on file
Contactable
Customer · serviced recently
Last job 4 months ago
Held back
job history last service date equipment type do not contact
The migration is the whole unlock. Job records became customer records with the history attached — what they own, when it was last serviced, whether they're already a recent customer. Someone serviced four months ago is held back automatically, so the business never texts an offer to a person who doesn't need one. Illustrative layout; no client data shown.

The simple idea

Trades businesses spend a fortune chasing strangers, while thousands of people who already paid them sit forgotten in the job system.

🗃

1. The list already exists

Every job ever completed is a customer who already knows and trusts the business. They were in the job software, not the marketing.

📱

2. A text, not a cold call

Each one gets a short, friendly text offering their next service at 20% off. Four messages over nine days — then it stops, for good.

📞

3. A real conversation

Anyone who replies is answered in seconds by an AI, any hour of the day. If they're interested, the office gets a callback to make.

What the customer actually experiences

No chatbot menus, no "press 1". A text that reads like it came from the office, and an answer that arrives before they've put the phone down.

CRM · Conversations · SMS
Past customer SMS AI agent on
Touch 1 · day 1
Office · 10:04 am
Hi Jan, it's the team at your heating and cooling company. It's been a while since your last service — we're offering 20% off a full system service this month. Would you like us to look after it before winter? Reply STOP to opt out.
Jan · 8:51 pm
How much would a ducted heater service be?
AI 8:51 pm
Hi Jan — a full ducted heater service is normally $400, and with this month's 20% off that comes to $320. Would you like one of our friendly staff to give you a call to discuss?
Jan · 8:53 pm
Yes please
AI 8:53 pm
Lovely — I've let the office know and one of our team will give you a call. Thanks Jan.
Callback created for the office · sequence stopped · customer marked as engaged
Nine at night, and it still gets answered. The AI quotes only from prices the business gave it, answers the question that was actually asked, then asks the one question that matters. A reply stops the marketing sequence instantly — nobody gets a promotional text while they're mid-conversation. Illustrative conversation; figures and customer are examples, not real ones.

A deliberate decision

It asks for a callback. It never offers a time.

Most AI booking systems try to fill a diary. In a trades business that's a trap — the run sheet depends on which technician is free, where the last job was, and what the van is carrying. None of that is in a calendar.

✅

One question, always the same

"Would you like one of our friendly staff to give you a call to discuss?" A yes creates a callback task for the office, first thing the next working morning.

The office keeps control of the run sheet
📅

No diary, no double-bookings

The AI cannot see a calendar and cannot offer a time, so it can never promise a slot the business can't cover. It also never has to apologise for one.

No broken promises
📝

If they name their own day, it's written down

"Can you call me after the 29th?" gets acknowledged, and their exact words land in the note the office reads before picking up the phone.

Nothing gets lost in translation

Happy customers become reviews. Unhappy ones become a phone call.

After every completed job, a short satisfaction survey goes out automatically. What happens next depends entirely on the score.

📝

The survey goes out

Sent automatically once the job is marked complete in the job software. No one has to remember.

⭐

8 out of 10 or better

Only then do they get the Google review link — while the good job is still fresh in their mind.

🔒

Anything lower

Flagged quietly inside the CRM instead. The business hears about the problem privately, not on a public listing.

This one gate is the difference between a review engine and a liability. Asking every customer for a review asks unhappy ones too.

The part that matters most

Nobody runs it

Every weekday morning, before anyone's in the office, the system picks the day's people, puts them in, and starts texting. It skips anyone already in the sequence, anyone recently serviced, anyone who has opted out, and anyone without a mobile.

CRM · Automation · Workflows
AutomationRunsStatus
Daily feeder
Picks the day's customers and enrols them — 20 into the text sequence, 20 into the newsletter. Skips anyone suppressed, recently serviced or already in.
07:30, Mon–FriLive
Reactivation sequence
Four texts over nine days offering a discounted service. Stops dead the moment anyone replies, opts out or books.
Weekdays 9am–4pmLive
AI agent
Answers every inbound text within seconds, 24/7. Quotes from approved prices only, and asks the callback question.
Always onAI agent
Gentle follow-up
Anyone who talked but didn't commit moves onto a softer three-message ladder instead of the sales sequence.
Per conversationLive
Post-job survey & review gate
Survey on job completion; only scores of 8+ are sent to Google. Lower scores are flagged internally.
On job completionLive
Monthly newsletter
Sent in small daily batches to verified addresses, so the sending domain builds a good reputation instead of burning one.
Daily batchLive
Job software sync
Keeps the CRM in step with the job system, so a completed job, a new customer or a changed number shows up without anyone retyping it.
ContinuousLive
Three weeks of mornings, unattended. The feeder has run every weekday without a person touching it, enrolling exactly the right number each time and refusing to double-enrol anyone it had already added. Illustrative layout; no client data shown.

Texting thousands of people is a risk if you get it wrong

Built to be stopped from a phone

Messaging a database this size can get a business's sending account suspended. Most of the build is the brakes, not the engine.

🛑

One switch stops everything

The owner can halt all outbound texts, or the AI, or just the flow of new people, from a phone in under two minutes — no laptop, no code, no calling me.

The business holds the kill switch
👥

Only a tagged group is ever texted

Out of 21,775 contacts, only the small group carrying today's tag can receive anything. The system also refuses to run at all if that group grows past a set ceiling.

A bug can't text 20,000 people
🚫

Opting out is instant and silent

A "STOP", or a plain "no thanks", ends it. No confirmation message, no follow-up, no second ask — and the person is suppressed from every future campaign.

Opt-outs went to zero on the opener

Early on, the opener was losing more than one in eight people to opt-outs. Rewriting it took that to zero opt-outs on the opening text, three days running — the difference between an account that survives and one that gets shut down.

Same engine, different CRM

I build this inside whatever CRM you already run

There's no Flowlamina platform to migrate onto. The engine is built natively into the system your team already opens every morning — here are three running right now, in three completely different ones.

How many old customers are sitting in your job software?

If you've been trading for years, the answer is usually thousands — people who already paid you once and would happily pay you again, if anyone asked. Let's work out what yours are worth.

Book a call

Or email harshan@flowlamina.com

Email address copied