Want more CODs, not just leads? You’re in the right place.
Share:
If you are a home service business owner or a developer helping one, you know the drill: Angi leads are a race. The first person to respond wins the job. The slow responder pays for the lead but gets nothing.
We call our solution the Angi Lead Pitbull. It grabs the lead instantly, filters out bad zip codes, and sends a text message before your competitor even unlocks their phone.
Normally, we write high-level overviews. But today, we are going deep.
This is a technical step-by-step guide. We will cover the exact Regex patterns, JSON structures, and node configurations you need to build this workflow in N8N. We aren’t skipping steps because one missed comma in a Code Node can break the whole chain.
Angi leads are brutal.
When a lead hits your inbox, it is often messy. Sometimes it’s HTML, sometimes it’s text, and the formatting changes depending on the campaign. If you are trying to copy-paste that info into your CRM or type out a text message on your phone, you are already too slow.
Plus, how many times have you called a lead only to find out they live in a town you don’t service?
You wasted money buying the lead and time calling them. You need a system that acts like a guard dog—filtering the bad stuff and chasing down the good stuff.
We built this in N8N because it handles the messy details better than standard tools.
Here is the “plain English” version of what happens under the hood.
Angi emails are full of invisible junk—HTML tags, weird spacing, and “soft hyphens”. We run the email through a cleaning step that scrubs all that noise and extracts the clear details: Name, Phone, and Address.
This is the money-saver. The automation extracts the zip code and asks an AI agent to check it against a Google Sheet of your approved service areas.
For the good leads, we use Twilio to send an SMS immediately. SMS is the fastest way to “claim” the lead psychologically. At the same time, we send a branded HTML email with a “Schedule Online” button.
You might ask, “Why do I need AI for this? Can’t I just use keywords?” You could, but AI adds a layer of resilience.
Sometimes extraction fails. Maybe the address is written weirdly. In our workflow, if the strict rules fail, we pass the “raw text” to the AI as a backup.
The AI is also smart enough to read the “Description” of the job. In the future, you could even have it filter out jobs you don’t do (like “I need a part” vs “I need a repair”).
Angi leads come with a few built-in challenges:
This workflow fixes all of that automatically.
Trigger → clean email → extract lead info → add business info → AI generates responses + checks zip coverage → parse output → route based on coverage → send SMS + email (covered) OR email-only (not covered).
You have two separate Gmail Trigger nodes watching for Angi lead emails:
Why this matters:
Angi sends leads in slightly different formats depending on campaign type or how the lead was generated. Two triggers keeps the workflow from missing leads.
Both triggers funnel into the same cleaning and extraction pipeline.
Angi emails can come in:
This node:
Output:
email_text — a clean plain-text version of the lead email.
This step is critical because your next extraction node relies on predictable text patterns.
Now that the email is clean, you extract key lead fields using regex.
This node:
Why this is operator-grade:
Even if some fields fail extraction, you still pass the entire cleaned email to the AI as a backup (raw_text), so the workflow remains resilient.
This step is what makes this workflow portable as a template.
It defines:
This is where end users customize the template without touching logic.
This tool node gives the AI access to a zip code list sheet:
So the AI:
This is a big deal because it prevents waste:
The AI output must match:
{
"sms_message": "...",
"email_message": "...",
"coverage": "..."
}
That strict format makes the next step predictable.
This node simply does:
JSON.parse($json.output)
So now you have real fields available downstream:
$json.sms_message
$json.email_message
$json.coverage
This routing prevents sending the wrong message type.
Why SMS first:
SMS is the fastest way to “claim” the lead psychologically. They see it immediately.
If Not Covered, the workflow sends a different email (still branded HTML).
Important note:
In your current template, that “Not Covered” email body text looks like it accidentally contains a contradictory sentence:
“Unfortunately We service your area and have openings available.”
That line should be corrected to:
This is a small fix but important so you don’t confuse the customer.
This workflow is designed so you import the template and only plug in your credentials and business info.
No coding required.
Leave it OFF for now
Open the Business Info node and replace:
No other logic changes needed.
Open the AI Agent node:
Do not remove the coverage check instructions.
This sheet defines your service area.
Open the Twilio SMS node:
Open both Gmail “Send message” nodes:
Before activating:
Confirm SMS + email routing works correctly.
Once tests pass:
If you want this to feel “enterprise-grade” for attendees:
Why does the automation need two Gmail triggers? Angi is inconsistent. Sometimes they send “New Lead” and sometimes “New Customer Match” depending on how they generated the lead. Using two triggers ensures we don’t drop the ball just because they changed the subject line.
Can I customize the text message? Absolutely. The AI generates the message based on instructions we give it, but you can also hard-code a specific template if you want total control over the wording.
What happens if the lead is out of my service area? The system sends a polite “Not Covered” email. This protects your reputation—you don’t just ghost the customer, but you also don’t waste time calling them.
Does this work for Thumbtack or HomeAdvisor? Yes, but you would need to adjust the “Trigger” and “Extraction” steps to match their email formats. The logic (Zip check -> SMS) remains exactly the same.
Is N8N expensive? N8N is very affordable (often free to start if you self-host). The real costs are tiny fractions of a cent for the OpenAI checks and Twilio texts. It’s much cheaper than the cost of one missed job.
The “Angi Lead Pitbull” isn’t just about automation; it’s about aggression.
In the home service game, the nice guy who calls back three hours later finishes last.
By automating the messy part—the reading, the checking, and the initial texting—you free up your team to do what they do best: closing the sale and doing the work.
If you are tired of paying for leads that you never actually talk to, it’s time to let the Pitbull off the leash.
We can install this workflow for you, customize your service area zips, and get it running in under a week.
Ready to stop losing leads to speed? Contact us at Super Service Bros.