Modern Code Consulting
West Florida Air website mockup showing the redesigned homepage

How We Added $54k in Revenue for a Florida HVAC Business

The complete playbook: website, Google Ads campaign structure, exact keywords, ad copy, and everything we used to generate a 6.2:1 return on ad spend during the off-season.

Results Snapshot: 3 Months of Google Ads

Ad Spend

$8,825

Revenue

$54,432

ROAS

6.2:1

Conversions

37

Cost/Conversion

$220.75

Conv. Rate

21.95%

Avg Job Value

~$2,986

CTR

5.87%

Want to skip the guesswork?

We're giving you the actual Google Ads template from this campaign. Find and replace [YOUR BUSINESS NAME] and [YOUR DOMAIN], upload to Google Ads Editor, and you're live. Ad copy template plus copyable keyword lists. Keep scrolling to see how it works.

Jump to Download

Want to build it yourself with AI?

We created an AI-ready document with the entire playbook. Copy and paste it into ChatGPT, Claude, or your AI assistant and let it help you build your website, ads, and tracking setup.

Jump to AI Prompt

The Problem: What Was Broken

West Florida Air had been with another agency for months, but weren't seeing more customers and weren't sure what was actually working. Here's what our audit found:

8.2 Second Load Time

Their WordPress site scored 72 on Lighthouse with an 8+ second load time. According to Google's data, pages taking 1-3 seconds lose 32% of visitors. At 8 seconds, that number climbs significantly. A lot of traffic was leaving before the page even loaded.

Toxic Backlink Profile

The old agency bought backlinks from sketchy spam sites like seo-backlinks-directory-2024.xyz. Google flags this stuff instantly. Those link farm backlinks were actively tanking their rankings.

No Conversion Tracking

They didn't know which ads generated calls, which keywords actually converted, or what they were really paying per job. This made it really difficult to iterate and improve.

The Website: Built to Convert

We gave them a fresh build of their website: designed to their liking, conversion optimized, and SEO optimized. Here's the framework we used to build it:

Site Architecture

SEO is as much about structure as keywords. One page per service, one per city, plus a blog to catch informational searches.

/
├── /                          Homepage
├── /about                     About
├── /contact                   Contact
├── /services                  Services overview
├── /financing                 Financing
├── /reviews                   Reviews
├── /cities-served             Cities served
│
├── /blog                      Blog index
│   ├── /blog/[slug]           Individual post
│   └── /blog/tag/[slug]       Posts by tag
│
├── /air-conditioning          AC services
│   ├── /maintenance
│   └── /replacement
│
├── /heating                   Heating services
│   ├── /furnace-installation
│   ├── /furnace-repair
│   ├── /heat-pump-installation
│   └── /heat-pump-repair
│
├── /indoor-air-quality        IAQ services
│   ├── /air-purification
│   ├── /humidity-control
│   └── /uv-lights
│
├── /ac-repair                 AC repair landing
│   ├── /ac-repair/[city]      City-specific AC repair
│   └── /ac-repair/emergency   Emergency AC repair
│
├── /heating-repair            Heating repair landing
│   └── /heating-repair/[city] City-specific heating
│
├── /lp-ac-repair              A/B test variant
│   ├── /lp-ac-repair/[city]
│   └── /lp-ac-repair/emergency
│
└── /lp-heating-repair         A/B test variant
    └── /lp-heating-repair/[city]

One Page Per Service

AC repair gets its own page. Furnace installation gets its own. Heat pump repair too. Google ranks you specifically for each service, and visitors don't have to search around to find what they want.

One Page Per City

Largo? St. Pete? They each get their own page at /ac-repair/largo, /ac-repair/st-pete. Perfect for ranking when someone searches "AC repair + city name."

Blog for Long-Tail SEO

The blog captures people Googling "why is my AC freezing up?" or "how often should I change my air filter?" They're not ready to buy yet, but you're building trust and backlink opportunities.

Optimizing Pages for Organic Search (SEO)

Landing pages are built for conversions from ads. Service pages, city pages, and your homepage are built for Google. Different purpose, different approach. Here's what goes into an SEO-optimized page:

West Florida Air homepage showing SEO-optimized content structure with clear headings, service descriptions, and FAQ section

The homepage balances user experience with SEO fundamentals: fast load times, keyword-rich content, clear structure, and FAQ sections that target common search queries.

Performance

Google ranks fast sites higher. Check your scores with Google Lighthouse. Aim for 90+ on Performance, Accessibility, and SEO. Compress images, minimize code, use a fast host.

Content Depth

Thin pages don't rank. Each service page needs substantial text content focused on specific keywords. Research what people actually search for using Google Keyword Planner, then write content that answers those queries.

FAQ Sections

FAQs serve double duty: they answer real customer questions and target long-tail search queries. "How much does AC repair cost in Tampa?" is a question someone types into Google. Your FAQ can be the answer.

Schema Markup

Structured data helps Google understand your content and can trigger rich results in search. We cover this in detail in the next section.

How to Check Your Lighthouse Score

Open Chrome, go to your website, press F12 to open DevTools, click the "Lighthouse" tab, and run an audit. Or visit pagespeed.web.dev and paste your URL. You'll get scores for Performance, Accessibility, Best Practices, and SEO, plus specific recommendations for improvement.

Organic Search Growth

The new site we built and the SEO work paid off. Six months after launch, organic impressions jumped from 4.5k to 15.5k per month. That's 244% more visibility with zero ad spend.

Starting Impressions

4.5k/mo

Current Impressions

15.5k/mo

Growth

+244%

Google Search Console graph showing organic impressions growth from 4.5k to 15.5k per month over the past year

Pro Tip: Submit to Google Search Console

After launching your site, submit it to Google Search Console and upload your sitemap (usually at /sitemap.xml). This tells Google your site exists and speeds up indexing. Don't just wait for Google to find you.

Schema Markup for Rich Results

Schema markup is code you add to your website that tells Google exactly what your business is, what services you offer, and where you operate. When Google understands this information, it can display enhanced search results with star ratings, review counts, service areas, and other details directly in the search listing.

These enhanced listings stand out from plain text results and earn significantly higher click-through rates. A listing showing "4.8 stars from 127 reviews" gets more clicks than one without any ratings displayed.

Google search results showing two HVAC companies - one with star ratings visible, one without

Notice the difference: Cool Today shows "4.7 stars from 2,761 reviews" right in the search result. Mechanical One has no ratings displayed. Which one would you click? That's the power of schema markup.

Schema types we implemented:

  • HVACBusiness schema
  • Service schema (per service)
  • ServiceArea schema
  • AggregateRating + Reviews
  • FAQPage schema
  • BreadcrumbList

Landing Page Design

Structure only matters if people convert when they land. Here's what we built into every landing page:

Click-to-Call in Header

Phone number front and center on every page. Sticky on mobile. One tap, instant call.

Trust Signals Above Fold

5-star reviews, licensing badges, "Veteran-Owned" label. All visible immediately when they land.

Service-Specific Pages

Each ad leads to a dedicated page for that service. AC repair ads go to the AC repair page, furnace ads go to the furnace page.

Clear Value Proposition

Hero section instantly answers "why choose us?" with same-day service, fair pricing, and licensed technicians.

West Florida Air landing page showing click-to-call header, 5.0/5 star reviews, trust badges, and clear call-to-action

Every element above the fold is designed to build trust and make it easy to call: phone number in the header, 5-star rating with review count, trust badges, and a prominent "Request Service" button.

A/B Testing Landing Pages

A/B testing lets you compare two versions of a landing page to see which one converts better. Instead of assuming what works, you send traffic to both versions and let the data tell you which headline, layout, or call-to-action actually gets more people to call. Here's the process we use:

The Process

  1. 1Create two landing page variants: Same content, one change (headline, CTA, layout, etc.). Use different URLs like /ac-repair vs /lp-ac-repair or /ac-repair/a vs /ac-repair/b
  2. 2Duplicate the ad group in Google Ads: Same keywords, same ad copy, same bids. Only difference is the landing page URL. Label them clearly (e.g., "AC Repair - A" and "AC Repair - B")
Google Ads showing two ad groups labeled A and B running the same ad to different landing pages

Same exact ad, different landing page URLs. Labels make it easy to compare performance.

  1. 3Run for one month: Get both variants enough traffic to mean something. Don't tweak mid-test.
  2. 4Keep the winner, iterate on the loser: The winning variant stays. Update the losing variant with a new test (different change) for the next month.

Why This Works

Change one thing at a time, you know exactly what worked. Six months later? Six tests run. Your page is way better than day one, and you've got the numbers to prove it.

Ideas for Tests (One at a Time)

1.

Remove the navbar

Eliminates distractions. Only option is to call or bounce.

2.

Contact form in the hero

Some people won't call but will fill a form. Test with and without.

3.

Different headline

"#1 AC Repair in Tampa" vs. "Same-Day AC Repair" vs. "5-Star Rated AC Service"

4.

Trust indicators

Google reviews vs. BBB badge vs. "Veteran-Owned" vs. years in business.

5.

CTA button text

"Call Now" vs. "Get Free Quote" vs. "Schedule Service"

6.

Hero image

Technician photo vs. happy family vs. equipment vs. no image.

7.

Phone number size/placement

Sticky header vs. floating button vs. inline in hero.

8.

Page length

Short (hero + CTA only) vs. long (full content with FAQs, reviews).

The Tracking System: How We Proved ROI

You need to know two things: what you spent and what you made. Ad platforms only tell you the first one. Tracking gives you the second.

Step 1: Set Up Conversions in Google Ads

First, you need to tell Google what counts as a conversion. For HVAC, that's phone calls and contact form submissions. You'll set these up in Google Ads under Goals → Conversions.

To track these actions on your website, you'll need Google Tag Manager (GTM). GTM is a container that holds all your tracking codes in one place. The basic flow is: install GTM on your site, create tags for your conversion actions, and connect them to Google Ads. Search "how to set up conversion actions in Google Ads with GTM" for step-by-step instructions.

What to track: Phone call clicks (tel: links), contact form submissions, and if you're using call tracking software, the dynamic numbers on your pages.

Step 2: Call Tracking (CallRail)

We use CallRail for call tracking. The key feature is dynamic number insertion, which swaps the phone number on your website based on where the visitor came from. This lets you attribute calls to specific Google Ads campaigns and keywords.

  • Dynamic number insertion shows different numbers to different traffic sources
  • Calls attributed to specific keywords via URL parameters from Google Ads
  • Call recordings for quality assurance and training
  • CallRail sends conversion data back to Google Ads automatically
Why this matters: When CallRail sends call data back to Google Ads, Google's algorithm learns which keywords and ads generate actual phone calls, not just clicks. This improves your campaign performance over time.
CallRail dashboard showing call tracking data with keyword attribution and call logs

Step 3: Connect to Your CRM

We use Housecall Pro for job management. The goal is to tag every job with its lead source so you can see which marketing channels are actually generating revenue.

We don't automatically tag every job. Instead, we do a monthly review where we go through CallRail calls and manually tag them in Housecall Pro. This takes a few hours but ensures accuracy. If you have access to the Housecall Pro API, you can automate this process. There's also a direct integration, but it can be finicky to get working properly.

If you're not using a CRM yet, you can start with something simple like a Notion database or spreadsheet. Track the lead source for each job manually, then add it to your CRM (like Housecall Pro or Jobber) as jobs close. The important thing is having some system to attribute revenue back to your marketing spend.

Our Tracking Stack

Conversion Tracking
  • Google Tag Manager
  • Google Ads Conversions
Call Tracking
  • CallRail
  • Dynamic number insertion
Job Management
  • Housecall Pro
  • Monthly lead source tagging

The Attribution Flow

Google Ad Click

Landing Page

Phone Call

(tracked)

CRM

(lead source tagged)

Job Revenue

The Results

Looker Studio dashboard showing $54K revenue results

Total Revenue Generated

$54,432

6.2:1 ROAS: For every dollar spent, six came back

BONUS #1: Download the Campaign Template

This is the actual campaign structure. No gatekeeping. This is the structure that drove $54K in revenue. Adapt it to your market, test your own headlines, but the foundation is here.

How to Use This Template

  1. 1Download the CSV: Click the button below
  2. 2Find and replace [YOUR BUSINESS NAME] with your business name (e.g., "West Florida Air")
  3. 3Find and replace [YOUR DOMAIN] with your domain (e.g., "westfloridaair.com")
  4. 4Upload to Google Ads Editor: Follow the import instructions below

This template includes ads only. Copy the keywords and negative keywords from the sections above (they have "Copy All" buttons).

Here's what the template looks like:

Google Ads Editor upload template showing campaign structure with ad groups, labels, and headlines

Each row is an ad group with A/B test labels. Find and replace the placeholders and you're ready to import.

How to Import Into Google Ads Editor

  1. 1Download and install Google Ads Editor (free)
  2. 2Open the app and sign in with your Google Ads account
  3. 3Go to Account → Import → From file
  4. 4Select the CSV file you downloaded
  5. 5Update locations, phone numbers, and URLs for your business
  6. 6Click "Post" to push changes to your Google Ads account

BONUS #2: Build It With AI

Want to implement this strategy yourself? We created an AI-ready document with the entire playbook. Copy and paste it into ChatGPT, Claude, or your AI assistant of choice and let it help you build your website content, Google Ads campaigns, and tracking setup.

What's in the file:

  • Complete website structure and page templates
  • Full Google Ads campaign structure with keywords
  • Ad copy templates and negative keyword lists
  • Tracking setup instructions
  • Ready-to-use prompts for your AI assistant
Open LLMs.txt

Open the file, copy everything, paste it into ChatGPT or Claude, and start chatting. The AI will ask for your business details and guide you from there.

Ready to See How This Works for You?

Let's look at your website, SEO, and ads together, then we'll tell you what we'd fix first.

What you'll get in 15 minutes:

  • Full website review — speed, mobile experience, and conversion bottlenecks
  • SEO analysis — how you rank, where you're missing, and quick wins
  • Google Ads review — if you're running ads, we'll spot the waste
  • Anything else you want — social, listings, competitors, you name it

We pull reports from credible sources and translate them into practical, actionable steps you can take right away.

15 minutes. Free audit call.

Prefer to talk now? Call or text (813) 400-0347