Lead follow-up automation doubled conversion rate
A home services company was losing jobs to competitors because of a 6-hour average response time to inbound leads. We built an AI-powered intake and qualification system that responds in under 60 seconds, qualifies the lead automatically, and books a call, all without any human involvement for 80% of enquiries.
Key Results
- 2x improvement in lead-to-booking rate
- Response time reduced from 6 hours to under 60 seconds
- 40% reduction in cost per acquisition
Stack
The Situation
In home services, the race starts the moment a lead submits a form.
Homeowners who need a boiler replaced, a bathroom refitted, or an extension quoted typically contact three or four companies at the same time. Research consistently shows that response time within the first five minutes increases conversion by up to 9x compared to responding after 30 minutes. After an hour, most leads have mentally moved on.
This client, a 12-person home services company covering the South East, was averaging a six-hour response time to new inbound enquiries. The problem wasn't indifference: they were busy doing the work they'd already won. There was nobody free to monitor the inbox continuously, and the economics of hiring a dedicated lead coordinator at their current volume didn't stack up.
The result was a steady leak. Jobs they could have won, going to the company that picked up first.
System Architecture
The entire system runs on n8n, self-hosted on a small VPS for full data control, as the client handles sensitive customer information and preferred not to have it passing through third-party SaaS automation platforms.
flowchart TD
A([š± Inbound Lead\nWebsite / Google Ads / CallRail]) --> B[n8n Webhook Receiver]
B --> C[Lead Normaliser\nExtract: name, service, postcode, source]
C --> D[AI Qualification\nGPT-4o-mini classifies:\njob size, urgency, service type]
D --> E{Lead Score}
E -->|High Value\n℠£3k estimated| F[Priority Queue\nSMS + Immediate Call Alert]
E -->|Standard\nĀ£500āĀ£3k| G[Standard Queue\nSMS + Calendly Link]
E -->|Low / Spam| H[Polite Decline\nEmail]
F --> I[Twilio SMS\nSent < 60 seconds]
G --> I
I --> J{Lead Response}
J -->|Books via Calendly| K[Confirmed Booking\nFlow]
J -->|Replies YES\nto call request| L[On-Call Alert\nto Engineer / Owner]
J -->|No response\n2 hours| M[Follow-up Sequence]
J -->|Unsubscribe| N[Remove from Sequence]
M --> M1[SMS Follow-up #2\n2 hours later]
M1 --> M2{Response?}
M2 -->|No response\n24 hours| M3[Final email\n+ close sequence]
M2 -->|Responds| K
K --> O[Log to Google Sheets\nwith full attribution]
L --> O
O --> P([š Owner Dashboard\nUpdated in Real-Time])
The qualification layer is the part that makes this system genuinely intelligent rather than just fast. Not all leads are equal. A homeowner asking about a dripping tap is a very different job to one describing a full bathroom renovation. The routing logic handles this before a human ever gets involved.
Lead Normalisation
Leads arrive from multiple sources: the website contact form, two Google Ads landing pages, and a CallRail tracking number. Each sends data in a different format. The first n8n node standardises everything into a consistent internal schema.
// Normalised lead object ā consistent regardless of traffic source
{
"lead_id": "BF-LEAD-20250305-00412",
"received_at": "2025-03-05T19:47:32Z",
"source": "google_ads_bathroom", // UTM source preserved for attribution
"contact": {
"name": "David Ashworth",
"phone": "+447700900142",
"email": "d.ashworth@example.com",
"postcode": "RH6 0AA" // Used for area coverage check + engineer routing
},
"raw_enquiry": "Looking to have our main bathroom completely replaced, walk-in shower, new bath, underfloor heating if possible. House is a 4-bed detached.",
"channel": "sms_preferred", // "sms_preferred" | "email_preferred" | "call_preferred"
"area_covered": true, // Checked against postcode coverage polygon
"duplicate": false // Deduplicated against last 90 days of leads
}
The duplicate check is more important than it sounds. Google Ads leads especially can resubmit. Sending the same person the same automated message twice is a fast way to look untrustworthy.
AI Qualification
Once normalised, the lead passes through a GPT-4o-mini classification step. We chose the mini model here deliberately. It's faster, cheaper, and the task (classification, not generation) doesn't require the full model's capability.
// Qualification prompt output ā structured JSON response from GPT-4o-mini
{
"service_category": "bathroom_renovation", // Matches internal service taxonomy
"estimated_job_value_gbp": {
"min": 8000,
"max": 18000,
"confidence": "medium" // "high" | "medium" | "low"
},
"urgency": "flexible", // "urgent" | "flexible" | "planning"
"signals": [
"walk-in shower mentioned ā wet room likely",
"underfloor heating ā additional subcontractor required",
"4-bed detached ā larger bathroom probable"
],
"routing_tier": "high_value", // Determines which queue this enters
"suggested_engineer": "mike", // Based on service category + postcode
"notes_for_engineer": "Likely needs site survey before quoting. UFH adds complexity."
}
The notes_for_engineer field is passed into the Calendly confirmation email so the engineer attending the quote call has context before they arrive, rather than reading the enquiry cold on their phone in the car.
The SMS Sequence
The first message goes out in under 60 seconds. Copy is personalised using the lead name and service type extracted during normalisation.
sequenceDiagram
participant Lead as š± David Ashworth
participant System as š¤ n8n System
participant Owner as š Company Owner
participant Cal as š
Calendly
Note over Lead,System: T+0: Lead submits form
System->>Lead: T+47s: "Hi David, thanks for your enquiry about bathroom renovation. We'd love to help. Here's a link to book a free quote call at a time that suits you: [link]"
Lead-->>System: T+2h: No response
System->>Lead: T+2h: "Hi David, just following up on your bathroom enquiry. If you'd prefer we give you a call instead, just reply YES and we'll ring you within the hour."
Lead->>System: "YES"
System->>Owner: š Immediate alert: "David Ashworth (RH6) wants a call now, bathroom reno, est. Ā£8ā18k. Number: 07700 900142"
Owner->>Lead: Manual call within 5 minutes
Lead->>Cal: Books survey appointment
Cal->>System: Booking confirmed webhook
System->>System: Log outcome to Google Sheets
The "reply YES" option outperforms the direct Calendly link for higher-value leads, and we learned this from A/B testing two variants over the first month. Expensive projects require trust. A real human calling back beats a scheduling link.
Attribution & Reporting
Every lead, every message, every outcome is logged to a Google Sheet with full attribution. The owner has a Looker Studio dashboard connected to this sheet that shows performance by source, service category, and response time cohort.
// Google Sheets row schema ā one row per lead lifecycle event
{
"lead_id": "BF-LEAD-20250305-00412",
"event": "booking_confirmed",
"timestamp": "2025-03-05T21:03:00Z",
"lead_source": "google_ads_bathroom",
"service_category": "bathroom_renovation",
"routing_tier": "high_value",
"first_response_seconds": 47,
"booking_method": "manual_call", // "calendly" | "manual_call" | "email"
"time_to_booking_minutes": 76,
"engineer_assigned": "mike",
"estimated_value_gbp": 13000,
"actual_value_gbp": null, // Filled in post-job
"won": null // Filled in post-survey
}
The actual_value_gbp and won columns are filled manually after the survey, giving the owner a 90-day view of which lead sources and which routing tiers actually convert to revenue, not just to bookings.
The Results
Results were measurable within the first two weeks:
- Lead-to-booking rate doubled, from approximately 18% to 37%, measured across the first 60 days.
- Response time dropped from 6 hours to under 60 seconds, consistently, including evenings, weekends, and bank holidays.
- Cost per acquisition fell by 40%, with more bookings from the same ad spend, because fewer leads were going cold before contact.
An unexpected outcome: Google reviews started mentioning the response speed. "Contacted four companies, and these were the only ones who got back to me the same evening." appeared in three separate reviews within the first month. Speed had become a visible differentiator, not just an internal metric.
What We Learned
Classification confidence matters more than classification accuracy. The qualification model is right about job value roughly 80% of the time. But what matters more is that it knows when it's uncertain. The confidence: "medium" flag triggers a slightly different routing path that gives the owner an extra touchpoint before committing engineering time to a survey.
The shadow period builds trust faster than any demo. The client was nervous about AI sending messages to customers unsupervised. We ran a two-week shadow mode where the system drafted every message and logged it, but a human approved each one before it sent. After 14 days and roughly 40 shadow leads, the owner had seen enough to flip the switch. That progressive handover removes the need for a leap of faith.
Always measure what you actually care about, not what's easy to measure. Response time is easy to track. Revenue per lead source is harder but infinitely more useful. We built the attribution schema from day one so the data was there when the owner started asking the right questions.
Want results like these?
Book a free discovery call and we'll map out what's possible.