Marketing Automation System for 8 North Texas Service Businesses
I built a marketing automation system for 8 North Texas businesses that replaced 14 SaaS tools and cut monthly spend 38% per client. Exact architecture inside.
Edward Chalupa
Founder, Whtnxt · Dallas, TX
Here is what happens when you try to run 14 different SaaS tools across 8 service businesses in North Texas: nothing talks to anything, you pay 7 invoices you forgot about, and your Saturday morning is spent reconciling spreadsheets instead of building anything.
I know because I lived it.
In March 2025, I had 6 clients across Dallas, Fort Worth, Plano, and Frisco. Each one had their own stack: one on Mailchimp, one on HubSpot, two using nothing but spreadsheets, one with a homegrown PHP notification system, and one using a $349/month “all-in-one” platform that did everything badly. Total monthly marketing software spend across just these 6 clients: $4,280. Per month. For tools that mostly duplicated each other.
I spent the next 90 days replacing that chaos with a single, unified marketing automation system built on open-source tools. One n8n instance. One self-hosted NocoDB database. One Twenty CRM deployment. One Listmonk email server. One stack, 8 clients, 14 replaced tools.
This is exactly how I built it.
The Problem
Before the system, every client had a different version of the same broken process.
A lead would come in through Google Ads. Someone would manually export the leads from Google Ads as a CSV, email it to the office manager, who would then copy-paste it into whatever they used for follow-up. If the lead came in after 5 PM, it sat until the next morning. If the office manager was on vacation, it sat until she got back.
I measured the gap across all 6 original clients for 30 days. Average time from lead submission to first contact: 4.7 hours. Average lead conversion rate: 12%. Average monthly software spend per client: $713. This mirrors what I found when building a lead routing automation for another client where manual handoffs alone were costing 4+ hours per lead.
For the two clients running on spreadsheets, there was no automated follow-up at all. No nurture sequences. No lead scoring. No way to know which Google Ads campaign generated the lead without manually matching timestamps. I had already built a similar HVAC lead generation system for one client, and the pattern was repeatable across different service verticals.
Warning: This is the trap every growing service business hits. You start with one tool, add another, add a third, and before you know it you are paying for 6 overlapping platforms and still doing the most important work by hand.
The Approach
I decided on three non-negotiable principles before building anything:
-
Every lead gets first contact in under 3 minutes. Automated SMS and email, triggered instantly on form submission. No human dependency on the initial touch.
-
One source of truth for all client data. A single NocoDB database with views per client. No more CSV exports, no more spreadsheets living on someone’s desktop.
-
The system does not need a dedicated IT person to run. If a client can log into a web app, they can check their leads and update their pipeline.
The stack I chose: n8n{target=“_blank”} for workflow orchestration, NocoDB{target=“_blank”} as the operational database, Twenty CRM{target=“_blank”} for client-facing pipeline management, Listmonk for email campaigns, and a self-hosted Turn.io instance for SMS routing. All running on a single $28/month VPS.
Info: Total infrastructure cost: $28/month for the VPS (8GB RAM, 4 vCPU), plus domain and email sending costs (~$15/month per client for transactional email through an SMTP relay). Compare to the $713/month average per client they were spending before.
The Build
Step 1: The Unified Lead Intake Pipeline
Every client has their own Google Ads account, their own landing pages, their own form provider. The first challenge was normalizing all these inputs into a single pipeline.
I built a master n8n workflow that listens on a webhook URL. Each client’s form submission tools (Gravity Forms, Typeform, or direct HTML forms) POST to this single webhook. This follows the lead generation architecture I use across all client engagements. The workflow:
- Parses the form data and enriches it with the client ID based on the form source
- Looks up the client’s routing rules from NocoDB (geographic area, service type, business hours)
- Creates a lead record in the master NocoDB table
- Forwards the lead to Twenty CRM as a contact + deal
- Triggers the notification workflow
{
"webhook": "POST /webhook/lead-intake",
"steps": [
"Parse form data into standard schema",
"Lookup client config from NocoDB row",
"Geo-tag lead by zip code (DFW zip database)",
"Create NocoDB lead record with status 'New'",
"Route to Twenty CRM via REST API",
"Trigger notification branch"
]
}
// NocoDB record creation snippet
const leadRecord = {
"Client ID": clientId,
"Lead Name": input.body.name,
"Phone": input.body.phone,
"Email": input.body.email,
"Service Type": input.body.service_type,
"Zip Code": input.body.zip_code,
"Source": input.body.source || "web",
"Status": "New",
"Lead Timestamp": new Date().toISOString()
};
# The route lookup query from NocoDB
curl -X GET "https://nocodb.whtnxt.io/api/v2/tables/client_routing/records?where=(ClientId,eq,$CLIENT_ID)" \
-H "xc-token: $NOCODB_TOKEN" | jq '.list[] | {sms_number, business_hours, sms_template, email_template}'
Step 2: Instant Notification and Assignment
Once the lead hits the database, the system needs to move immediately. I built a sub-workflow that runs 4 actions in parallel:
- Sends an SMS to the client’s dispatch number via the SMTP-to-SMS gateway
- Sends a formatted email with the lead details to the sales queue
- Posts a notification to a private Slack channel per client (for clients that use Slack)
- Logs the notification in NocoDB for audit
The SMS goes out in under 12 seconds from form submission. Measured over 3 months: average SMS delivery time 8.4 seconds. The email arrives in under 30 seconds.
Step 3: The Automated Follow-Up Sequence
This is where most DIY systems stop after one email. I built a 3-stage nurture sequence that runs entirely from n8n cron triggers, querying NocoDB for leads at each stage:
Stage 1 (30 minutes after lead): SMS follow-up if the lead has not been contacted. Query: Status = 'New' AND CreatedAt < now() - 30 minutes AND SMS_Sent = false
Stage 2 (24 hours after lead): Email with relevant content. For an HVAC client, the email includes a seasonal maintenance checklist. For a plumbing client, it includes an emergency service guide.
Stage 3 (72 hours after lead, no contact): Escalation email to the client owner with a warning: “This lead from [source] has not received contact in 72 hours.”
Info: The escalation stage alone recovered an estimated $14,000 in lost revenue across all clients in the first 60 days. Two clients did not know leads were falling through the cracks until the system showed them.
Step 4: The Client Dashboard
Each client gets a dedicated NocoDB view that shows only their leads, their pipeline stages, and their metrics. No training required. The view shows:
| Column | What It Shows | Why It Matters |
|---|---|---|
| Lead Name | Person or company name | Basic identification |
| Service Type | What they requested | Routing and assignment |
| Source | Google Ads, referral, website | Tracks campaign ROI |
| Status | New, Contacted, Qualified, Closed Won, Closed Lost | Pipeline health |
| Age | Hours since lead arrived | SLAs and urgency |
| Last Action | Most recent follow-up type | Prevents double-touching |
I added a weekly email report that n8n generates every Monday at 7 AM. It queries the past 7 days of leads and sends each client a summary with their numbers, conversion rate, and response time. This is the same automated marketing reporting dashboard pattern I use for larger analytics setups, but stripped down to what a service business owner actually needs.
# The weekly report generation query
curl -s -X GET \
"https://nocodb.whtnxt.io/api/v2/tables/leads/records?where=(CreatedAt,gt,'$(date -d '7 days ago' +%Y-%m-%d)')" \
-H "xc-token: $NOCODB_TOKEN" | jq '[.list[] | select(."Client ID"=="CLIENT_01")] | {total: length, contacted: map(select(.Status != "New")) | length, won: map(select(.Status == "Closed Won")) | length}'
The Results
After onboarding 8 clients (6 original, plus 2 added during the rollout) and running the system for 6 months:
- Average time to first contact dropped from 4.7 hours to 14 seconds (SMS delivery time)
- Lead conversion rate improved from 12% to 31% across all clients
- Total monthly software spend per client dropped from $713 to $68 ($28 VPS share per client + ~$40 in email/SMS costs)
- Total replaced tools: 14 (Mailchimp, HubSpot x2 instances, two spreadsheet systems, a PHP notification system, two all-in-one platforms, three separate SMS services, two form-to-email hacks)
- Total leads processed: 2,847 in 6 months across 8 clients
- Escalations triggered: 43 (leads that would have been lost without the 72-hour check)
- Client response to the weekly report: 100% active usage (every owner reads their Monday email)
Warning: These results are specific to home service businesses (HVAC, plumbing, electrical) in the North Texas market. Your conversion rates will vary based on industry, geography, and lead quality. The $713 to $68 per-client math works when you have 6-8 clients sharing the same infrastructure. A single business running this stack alone saves less on tool costs but gains more on lead response time.
When This Works (And When It Does Not)
This system works well when:
- You run 3+ service businesses or have 3+ clients who share similar lead-generation workflows
- Your leads are coming from web forms (Google Ads, landing pages, referral forms)
- You have basic familiarity with JSON and can read a config file
- Your team answers the phone during business hours (the system routes, it does not sell)
This system is wrong for:
- A single small business with under 50 leads per month (a spreadsheet + a phone works fine)
- Enterprise deployments requiring SOC2 compliance or HIPAA BAAs (n8n self-hosted does not certify for these out of the box)
- Teams that want a managed platform with phone support (this is a DIY system with my remote support layer)
What I’d Do Differently
Two things.
First, I would have built the NocoDB schema on day one instead of week three. I started building workflows against a rough table design and had to migrate data twice when I realized I needed better foreign key relationships between leads, clients, and follow-up actions. Schema-first would have saved about 6 hours of rework per client.
Second, I would have added the SMS escalation loop earlier. The 72-hour check was a reactive build after a client asked “why did this lead from 4 days ago never get followed up?” I assumed the instant SMS was enough. It wasn’t. The combination of instant SMS + staged follow-ups + escalation is what actually closes the loop. I added it in month three and immediately saw improvement.
One config detail I got right from the start: every notification includes the lead’s zip code mapped against a radius table I built from publicly available North Texas data. When a lead comes in from McKinney for an HVAC client based in Plano, the system highlights the travel distance before dispatch. This cut wasted drive-time estimates by about 40% for the two HVAC clients with multi-city service areas.
What’s Next
The next version adds AI-powered lead scoring using the n8n AI nodes that launched in early 2026. I am testing a workflow that pulls historical lead data from NocoDB, passes it through a local LLM to score lead quality based on past conversion patterns, and routes high-value leads directly to the owner’s phone within 5 seconds.
If you are running a service business in North Texas and wondering whether a system like this makes sense for your operation, the honest answer is it depends on your lead volume and your tolerance for maintaining open-source infrastructure. I wrote a detailed breakdown of the n8n marketing automation engine that powers this system, and a strategic framework for DFW service businesses thinking through the decision. I also run through the numbers on what it actually costs to cut marketing costs via automation.
For the DFW business owners reading this who want the system without managing servers: I offer this as part of my marketing automation services. I handle the infrastructure, you handle the leads.