Paid media · Home-services lead generation
Six years running performance accounts and building the pages the money lands on. $3.6M in ad spend managed at 5.16x return, and sites built the way a dispatch board needs them — click-to-call above the fold, published pricing, self-scheduling, and the tracking wired before the first dollar goes out.
Featured builds
Two account reports with real numbers, and three sites I built end to end. No mockups, no case-study PDFs.
A 21-page lead-generation site for a Cleveland electrical brand. Hand-written static HTML, no WordPress. Sticky mobile call bar, booking form in the hero, a page per service and a page per city with that municipality's actual permit rules, published flat-rate pricing, and a panel-upgrade cost calculator.
Health and wellness supplements on Amazon US. Sponsored Products, Brands and Display managed as a single profitability target. Spend scaled while ACoS held flat, which is the harder half of the job.
Metabolism and weight-management supplements, wide catalogue, low average selling price. This account is won or lost on bid discipline at the ASIN level and on weekly search-term mining.
Both accounts side by side across the full 22-month tenure, July 2024 through April 2026. Monthly spend, ad-attributed sales and ACoS trend, charted from the monthly monitoring report I maintained.
Open the dashboard → MeasurementThe GTM, GA4 and CallRail setup for the demo site, written the way I would hand it to a client on day one. Every event, every parameter, and which two get marked Primary in Google Ads — and why only two.
Read the spec → StrategyA real launch plan for a new Cleveland electrical brand with zero account history: campaign structure, budget split, bid-strategy progression, seed keywords, and the day-one negative list.
Read the plan →The real problem
Not because nobody is looking. Because the measurement was never built, so the report defaults to the metrics that are easy to pull.
Most home-services conversions happen on the phone. With no dynamic number insertion, a paid call and an organic call look identical, and the campaign that actually fills the truck gets cut because its form count looks weak.
Cost per lead is a vanity metric here. A $22 lead that never books is worse than a $60 lead that turns into a $3,200 panel upgrade. If the CRM data never comes back into the ad account, bidding optimizes toward the cheap lead every time.
A perfectly targeted click lands on a slow page that hides the price and buries the phone number below three scrolls. The spend is not wasted in the auction. It is wasted after the click.
Transformation
Capabilities
Account structure, keyword and negative strategy, bid-strategy progression, budget pacing, search-term mining, ad copy and asset testing. Six years of daily account work across $3.6M in spend. Amazon Ads is where the volume sits; the transferable half is the bid-to-target math, which is identical whether the target is expressed as ACoS or as cost per booked job.
Hand-written static HTML and CSS, no page builder, no theme. Mobile-first, sub-two-second loads on LTE, click-to-call in the header, hero, mid-page and footer, a sticky call bar under 768px, and the booking form above the fold. Service pages, service-area pages, schema, sitemap and canonicals.
GTM containers head and body, GA4 configured inside the container rather than hardcoded, dataLayer events with the parameters that actually change a decision, a real thank-you page so the conversion is a pageview, call tracking with dynamic number insertion, and a documented spec so the next person can maintain it.
Google Business Profile setup and categories, service-area pages written per municipality rather than spun, citation consistency, review generation, and the on-page structure that decides whether a page competes in the map pack or just exists.
One page, same format every week: spend, calls, forms, booked jobs, cost per booked job by campaign; revenue by service and by city; what I added as negatives and what it saved; what I changed and what I am testing next. If a campaign produces cheap leads that never book, the report says so and I shut it off.
Coupon and offer architecture, review-proof placement, financing framing, and the copy decisions that move a home-services buyer — publishing the price, naming the arrival window, and putting the warranty where the objection lives.
Stack
Listed honestly: Amazon Ads is where my spend history lives. Google Ads, Local Services Ads and ServiceTitan are platforms I have built and planned against but not yet billed years inside — the 90-day plan linked above is how I would prove the difference in the first quarter rather than asking anyone to take my word for it.
Process
No dollar goes out before GTM, GA4, call tracking and the conversion actions are live and verified in DebugView. Launching without them means paying for data you cannot read.
The first thirty days are for finding out what a booked job actually costs and which services carry the margin. Manual or Maximize Clicks, daily search-term review, no smart bidding on an empty account.
One ad group, one landing page, one offer. The cheapest Quality Score improvement that exists, and the fastest conversion-rate gain available in most accounts.
Maximize Conversions once the signal is real, then tCPA set above the observed CPA and stepped down. Never one jump — a target set far below current performance simply stops serving.
Cost per booked job on the top line, revenue by service next to it. Every week, same format, including the weeks where the honest answer is that something did not work.
FAQ
Because I would rather you hear it from me than find it out later. The $3.6M is Amazon Sponsored Products, Brands and Display — I have not personally run a Google Ads account at that spend. What carries over is real: weekly search-term mining, negative-keyword discipline, bid-to-target math (ACoS is cost per sale as a percentage; cost per booked job is the same equation with a job ticket in place of an order value), budget pacing, and judging a campaign on revenue rather than clicks. What does not carry over is platform surface — Search match types, PMax asset groups, LSA and Google Guaranteed, geo and schedule modifiers around a dispatch board. That gap is why the 90-day plan on this page exists.
It means the CRM has to talk back to the ad account. Booked-job status gets pushed back as an offline conversion, or at minimum reconciled weekly by hand until the integration is built. Until that loop closes, every optimisation decision is made on a proxy, and smart bidding will happily buy you the cheapest leads that never turn into a truck roll.
Mobile speed is the entire game for emergency service searches. A typical WordPress home-services site ships several megabytes of theme and plugin assets before the phone number renders. The demo site on this page has zero dependencies and loads in well under two seconds on a phone on LTE. There is also no plugin surface to get compromised and no update that quietly breaks the booking form on a Saturday.
In most home-services accounts, yes, and it is usually the single highest-leverage change available. Published flat-rate pricing pre-qualifies the caller, so cost per booked job drops even when cost per lead rises — and the people who were never going to buy at $3,000 stop consuming truck rolls. It is a booked-job decision, not a design preference.
Not until there are roughly thirty conversions in the account, and never without brand terms excluded at account level. Launched early, PMax cannibalises brand traffic and reports the credit back to itself, which makes the account look like it is working while the incremental revenue is flat.
40 hours a week, Monday to Friday, with full US Eastern overlap. I am based in Bulacan, Philippines and work the client's clock, not mine.
System ready
Measurement in week one, evidence in month one, efficiency in month two, scale in month three. Reported weekly on the number that pays the bills.
Contact