Cost per booked job (a booked appointment in ServiceTitan) is the one number that means the same thing across every P3 OpCo, so it is the number we run this portfolio on. $245 is Rolland's baseline, locked in as of this window, and it is the number to beat. It was achieved despite the account bidding on raw phone calls, not because of anything the setup is doing right. For context, the blended baseline across all three priority accounts is $295 per booked job (170 booked jobs on $50,178 of spend).
The audit reflects the read-only window below. Changes now roll out as items clear the sign-off list on the hub, and each push gets logged there.
The reported 89 conversions are almost entirely raw phone calls. In the window, "Calls from ads" alone counted 80 and LSA phone leads added 9, which is essentially the entire reported total. The 67 booked jobs that ServiceTitan imported sit as secondary actions and never touch bidding. The ServiceTitan figures here are the numbers recorded in Google Ads through the offline import, pending reconciliation with ServiceTitan's own reports.
| Measure | Reported (Google) | ServiceTitan reporting |
|---|---|---|
| Spend (30d) | $16,405 | $16,405 |
| "Conversions" | 89 | 67 booked jobs (53 from call extension, 14 from website) |
| Cost per conversion | $184.34 | about $245 per booked job |
| What it counts | any call 60s+, LSA leads, form/thank-you | a real job on the schedule |
| Active campaign | Type | Spend | Conv | How often ads showed | Missed because budget ran out | Budget/day |
|---|---|---|---|---|---|---|
| RR-SEM-Plumbing-NB-Jacksonville-202510 | Search (non-brand) | $9,305 | 43 | 36.3% of searches | 14.5% | $500 |
| RR-SEM-B-jacksonville-202508 | Search (brand) | $6,565 | 36 | 94.6% of searches | 4.6% | $225 |
| LocalServicesCampaign (LSA) | Local Services | $535 | 10 | n/a | n/a | auto |
The plain read: at roughly $245 per booked job, this account is performing well for a Jacksonville plumber. The point worth making is that it is doing this while pointed at the wrong target. Aim it at booked jobs and the same money should work harder.
The problem in one line: the account bids toward raw phone calls. Every ServiceTitan action, including booked jobs, is set to secondary, so the 67 real jobs the account produced never influence bidding, and the reported CPA ($184) counts any 60-second call instead of a job.
Why this is the backbone of long-term optimization. Offline conversion imports from ServiceTitan are how a Google Ads account learns what a real job looks like instead of guessing from calls and clicks. The good news is the hard part is already done: the import is flowing, and it recorded 67 booked jobs last month. Bidding just ignores them. The fix is a primary/secondary reshuffle, not a rebuild, and it makes bidding chase the queries and times that actually put jobs on the schedule. Later, the same pipe carries job value, so bidding can optimize toward revenue, not just job count (the JVP actions below are the candidates for that).
The target state in one line: make ServiceTitan booked jobs (call and website) plus one qualified ServiceTitan call action primary. Move raw calls, click-to-call, double-counted web actions, and legacy smart-campaign actions to secondary. Keep LSA leads primary. Then Google optimizes toward jobs, and the reported number matches ServiceTitan reporting.
| # | Conversion action | Type / category | Now | Proposed | Why |
|---|---|---|---|---|---|
| 1 | ServiceTitan Booked Job (Originated from Call Extension) | Upload calls / Book appt | S | P | A real job booked from a call. This is what we want to buy. 53 in window. |
| 2 | ServiceTitan Booked Job (Originated from Website) | Upload clicks / Book appt | S | P | A real job booked from the web. 14 in window. Together with #1 = 67 jobs. |
| 3 | ServiceTitan Lead - Extension | Upload calls / Phone lead | S | P | The one qualified-call primary. A ServiceTitan-verified lead from a call (70 in window), adds volume so Max Conversions learns fast while staying quality. |
| 4 | local_services_phone_lead | LSA / Phone lead | P | P | Real LSA lead, separate LSA campaign. Leave primary. |
| 5 | local_services_message_lead | LSA / message | P | P | Real LSA message lead. Leave primary. |
| 6 | Calls from ads | Ad call / Phone lead | P | S | The main culprit. Counts any call 60s+, including existing customers. Demote so it stops steering bids. 80 in window. |
| 7 | Clicks to call | Google hosted / Contact | P | S | A tap on the call button, not a connected call. Inflates and double-counts. 23 in window. |
| 8 | Form (GA4 custom) | GA4 / Submit lead form | P | S | Double-counts the same web submission as #9. ServiceTitan Integrated actions cover web leads better. |
| 9 | https://plumbingjacksonville.com/thank-you/ | Webpage / Submit lead form | P | S | The other half of the double count with #8. Keep enabled for QA, but secondary. |
| 10 | Calls from Smart Campaign Ads | Smart campaign / Phone lead | P | S | Legacy smart-campaign action. No smart campaigns run now. Demote (retire later). |
| 11 | Smart campaign map clicks to call | Smart campaign / Contact | P | S | Legacy. Demote (retire later). |
| 12 | Smart campaign map directions | Smart campaign / Get directions | P | S | Legacy and low intent. Demote (retire later). |
| 13 | Smart campaign ad clicks to call | Smart campaign / Contact | P | S | Legacy. Demote (retire later). |
| 14 | Calls from AdWords Express Ads | Ad call / Phone lead | S | S | Legacy, already secondary. Leave, retire later. |
| 15 | ServiceTitan Inbound Call - Extension | Upload calls / Phone lead | S | S | Call-level signal, useful for reporting, not for bidding. 113 in window. |
| 16 | ServiceTitan Inbound Call - Website | Upload clicks / Phone lead | S | S | Same, website side. |
| 17 | ServiceTitan Calls Conversion Action | Upload clicks / Phone lead | S | S | Overlaps the inbound-call actions. Keep for insight. |
| 18 | ServiceTitan Integrated Lead Forms | Upload clicks / Submit lead form | S | S | Web lead form. Overlaps #2 booked-job-website. Keep secondary to avoid double-count. |
| 19 | ServiceTitan Integrated Bookings | Upload clicks / Submit lead form | S | S | Online booking, overlaps #2. Keep secondary. |
| 20 | ServiceTitan JVP (Originated from Call Extension) | Upload calls / Book appt | S | S | Job-value proxy that mirrors #1. Keep secondary now; candidate for value-based bidding later. |
| 21 | ServiceTitan JVP (Originated from Website) | Upload clicks / Book appt | S | S | Mirrors #2. Keep secondary; value-bidding candidate later. |
| 22 | ServiceTitan Call Extension Completed Job Conversions | Upload calls / Converted lead | S | S | Downstream completed job, lags by days/weeks. Great for reporting, too slow for bidding. |
| 23 | ServiceTitan Completed Jobs Conversion Action | Upload clicks / Converted lead | S | S | Same, website side. Keep for reporting. |
Net result: the primary set becomes booked jobs (call + website) + one qualified ServiceTitan call lead + LSA leads. Everything else records but does not steer bidding.
Sequencing note: changing the conversion goals resets the learning signal for the Max Conversions campaigns. Best done at the start of a week, then leave bids alone for 7 to 14 days while it re-learns. We would push the negatives (section 05) in the same session so the account is clean before the new signal settles.
The account's second headline. Brand is 40% of the money ($6,565 of $16,405) at a $225/day budget, paying an average $45.28 per click to reach people already typing the company name.
| Brand keyword (top spenders) | Match | Cost | Clicks | Avg CPC | Conv |
|---|---|---|---|---|---|
| rolland reash plumbing jacksonville fl | Phrase | $1,772 | 31 | $57.17 | 6.0 |
| Rolland Reash Plumbing | Exact | $1,703 | 34 | $50.08 | 6.5 |
| Rolland Reash | Phrase | $1,363 | 33 | $41.30 | 10.0 |
| rolland plumbing | Exact | $439 | 17 | $25.85 | 2.0 |
| roland reese plumbing | Exact | $428 | 11 | $38.89 | 6.0 |
| Brand campaign total | $6,565 | 145 | $45.28 | 36.0 |
A $45 to $57 cost per click on your own company name is far above normal. Defended brand terms in home services usually run a few dollars to low double digits, even with some competitor pressure. Two things are driving this:
There is genuine competitor presence on the brand SERP (searches like "roland reese plumbing" misspellings and nearby competitor names show up), so brand spend should not go to zero. But paying $6,565 to defend a name whose ads already show on nearly every brand search, while the non-brand campaign that finds new customers runs out of budget, is the clearest reallocation in the account. A bid cap or target-CPA on brand should let it hold most of this traffic at a fraction of the cost. Conservative estimate: $2,500 to $3,500/month freed to move into non-brand, where the daily budget currently runs out before the demand does.
The two fixes are linked. Once bidding optimizes to booked jobs instead of raw calls, brand naturally stops overbidding, because a repeat customer calling the known number is not a fresh booked job the way a new non-brand lead is.
In the non-brand top terms, zero-conversion queries burned about $3,366 in 30 days. Competitor names are the real leak ($1,555, mainly via the Dynamic Search ad group). St. Augustine is only $202. "Near me" terms are core demand and stay. The list below is drafted and ready to push after approval; nothing is live.
| Theme | Wasted (0 conv) | Read |
|---|---|---|
| Competitor names | $1,555 (43 terms) | Biggest bucket. Local plumbers (Vereen, Turner, Kingdom, Normans, Keystone, Hall and Sons) plus rooter brands (Roto-Rooter, Mr Rooter, Metro Rooter). The Competitors negative set is attached but does not contain these local names, so they slip through, mostly via the Dynamic Search ad group. |
| Near-me / generic | $1,201 (25 terms) | Mixed. Most ("plumbers near me" $147, "plumbing near me" $114) are core customer queries that just did not convert in this 30-day window. Only the price-shopper and off-target ones ("women owned plumbing company near me" $130, "cheap plumbers near me" $64) should be excluded. |
| Wrong service | $407 (12 terms) | "pool plumbers near me", "rinnai tech support", "best plumber and electrician", 24-hour variants if 24-hour is not offered. |
| Out-of-area geo | $202 (3 terms) | St. Augustine queries. Small, and a clean query-level fix. |
How to read the draft list. All spend figures are from the non-brand campaign top terms, 30 days. "0 conv" means zero booked jobs and zero reported conversions in the window. "Set" is the existing shared negative set the term goes into. The account has 9 sets; we use four: Competitors (12058958418), Master Negatives List (12039192955), Research, Costs (12134716040), and DIY (12134715392). All four are already attached to the non-brand and brand search campaigns, so anything added applies immediately. Match type is chosen to catch the waste without blocking real customers: we lean EXACT for full company names and PHRASE only on distinctive tokens a real customer would never type when looking for a plumber.
Geo note: targeting is already right, so these are query fixes, not settings fixes. Both search campaigns target by PRESENCE (people physically in the area), with 51 positive locations (Jacksonville and surrounding zips) and 125 negative locations already set. That is correct. The St. Augustine spend is not a targeting leak, it is people in-area searching for an out-of-area town. The right fix is a query-level negative, not a targeting change. Do not loosen or rebuild geo targeting.
| Term | Match | Set | Evidence |
|---|---|---|---|
| st augustine | Phrase | Master Negatives | "plumber st augustine" $112 / 1 click 0 conv, "plumbers st augustine" $83 / 1 click 0 conv, "packs plumbing st augustine fl" $8. St. Augustine is outside the service footprint. |
The Competitors set (390 members) is attached but does not contain these local Jacksonville names, so they leak through, mostly via the Dynamic Search ad group. EXACT on full names; PHRASE on the distinctive surname or token where it is unambiguous.
| Term | Match | Set | Evidence (0 conv) |
|---|---|---|---|
| roto rooter | Phrase | Competitors | "number to roto rooter" $95, "roto rooter near me" $22 |
| er rooter | Exact | Competitors | "er rooter jacksonville" $80 |
| mr rooter | Phrase | Competitors | "mr rooter jacksonville fl" $79 |
| metro rooter | Phrase | Competitors | "metro rooter septic" $23 |
| duck duck rooter | Exact | Competitors | $22 |
| vereen | Phrase | Competitors | "vereen plumbing" $91, "terry vereen plumbing jacksonville florida" $27 |
| turner plumbing | Exact | Competitors | "turner plumbing co jacksonville fl" $91 |
| kingdom plumbing | Exact | Competitors | $74 |
| cgc home services | Exact | Competitors | "cgc home services jacksonville" $68 |
| normans plumbing | Exact | Competitors | $65 |
| keystone plumbing | Exact | Competitors | $65 |
| troy trawick | Phrase | Competitors | "troy trawick plumbing" $62 |
| hall and sons | Phrase | Competitors | "hall and sons plumbing inc jacksonville" $54 + $12, "hall & sons plumbing" $53, "hall & sons plumbing llc" $5 |
| joe coyle plumbing | Exact | Competitors | $53 |
| packs plumbing | Exact | Competitors | $53 + "packs plumbing st augustine fl" $8 |
| superior plumbing | Phrase | Competitors | "superior plumbing jacksonville florida" $51, "superior plumbing and pipe lining" $14 |
| dan plumbing | Exact | Competitors | $48 |
| advantage plumbing | Exact | Competitors | "advantage plumbing jacksonville" $43 |
| john williams plumbing | Exact | Competitors | $42 |
| black pearl plumbing | Exact | Competitors | $41 |
| j&w heating | Phrase | Competitors | "j&w heating and air & plumbing sunbeam road jacksonville fl" $40 (converted once, low priority, review) |
| precision plumbing | Exact | Competitors | "precision plumbing jacksonville" $9, "precision leak detection jacksonville fl" $39 |
| drew hartmann | Phrase | Competitors | "drew hartmann plumbing" $36 |
| bobs backflow | Exact | Competitors | "bobs backflow and plumbing" $36 |
| hooked plumbing | Exact | Competitors | $29 |
| ricky plumbing | Exact | Competitors | $28 |
| ww gay | Phrase | Competitors | "ww gay plumbing jacksonville fl" $28 |
| peyton plumbing | Exact | Competitors | $22 |
| lettow plumbing | Exact | Competitors | $22 |
| b & g plumbing | Exact | Competitors | $21 |
| fair plumbing | Exact | Competitors | "fair plumbing jacksonville beach" $17 |
| asap plumbing | Exact | Competitors | "asap plumbing inc" $13 |
| dl plumbing | Exact | Competitors | "dl plumbing contractors" $13 |
| david grey plumbing | Exact | Competitors | $10 |
| atlantic coast plumbing | Exact | Competitors | $9 |
| darsco plumbing | Exact | Competitors | $6 |
| sweeney plumbing | Exact | Competitors | $4 |
| jax plumbing | Exact | Competitors | $3 |
Note: "ryans plumbing" ($70) and "a1 plumbing near me" ($96) each booked a conversion, so they stay out of the negatives.
| Term | Match | Set | Evidence (0 conv) |
|---|---|---|---|
| cheap | Phrase | Research, Costs | "cheap plumbers near me" $64, "cheap plumbers jacksonville fl" $24, "cheap local plumber near me" $16. Price shoppers, not fit for a premium plumber. |
| tech support | Phrase | Research, Costs | "rinnai tankless water heater tech support" $23. Warranty/DIY help seeker. |
| Term | Match | Set | Evidence (0 conv) | Confirm first? |
|---|---|---|---|---|
| pool | Phrase | Master Negatives | "pool plumbers near me" $47 | Yes, if no pool plumbing |
| electrician | Phrase | Master Negatives | "best plumber and electrician near me" $5 | Yes |
| grease trap | Phrase | Master Negatives | "grease trap replacement near me" $42 | Yes, commercial-kitchen work |
Group 5: employment. No employment or "jobs/hiring/careers" search terms surfaced in the 30-day top-terms pull, so nothing to add today. There is no dedicated Employment set. If these appear later, we create one or route to Master Negatives. On the watch list.
These are exactly the customer. They happened to show 0 conversions in this one 30-day window, which is small-sample noise, not a signal to cut. Excluding them would shrink the funnel.
| Term | Spend | Why keep |
|---|---|---|
| plumbers near me | $147 | Core high-intent query |
| plumbing near me | $114 | Core high-intent query |
| plumbing companies near me | $103 | Core high-intent query |
| 24 hour plumbing near me | $113 | Core, if 24-hour service is offered (confirm) |
| 24 hour plumber jacksonville fl | $103 | Core, same caveat |
| slab leak detection near me | $72 | Real service, has a dedicated ad group |
| well pump / well water terms | mixed | Rolland Reash does well work; "well pump repair" booked a job |
For these, the lever is bidding quality (which the tracking fix improves) and landing-page match, not exclusion. The "Near Me" ad group RSA is currently Poor strength; a stronger ad plus the booked-job bidding signal is the right treatment.
Estimated near-term monthly waste addressed by Groups 1 to 3: roughly $1,900 to $2,100, most of which was flowing through the Dynamic Search ad group. Tightening or pausing that ad group later will stop most competitor leakage at the source.
Eighteen campaigns exist; three are active. The rest are paused legacy (old smart campaigns, seasonal "March Madness" and "$25 off" promos, paused PMax, a paused retargeting display, AI Max and commercial tests). Cleanup is cosmetic, not urgent.
Non-brand ad group structure is genuinely good, service-themed and tightly built: Jacksonville Plumbers ($2,847, 15 conv), a Dynamic Search ad group ($2,374, 10 conv), Near Me ($1,938, 10 conv), Water Heater, Emergency, Drain Cleaning, Slab Leaks, Commercial, Garbage Disposal, Faucets and Sinks, Sewer Line, Home Re-piping. Brand splits into Core Brand Keywords ($3,693, 19.5 conv), Brand + Services ($2,060, 7 conv), and Variations and Misspellings ($812, 9.5 conv).
The Dynamic Search ad group (Dynamic AG_Spring, $2,374) is the main way competitor-name and off-target queries slip in. Dynamic ads match to page content, so they catch searches your keywords never targeted. Worth a tighter leash or pausing once the service ad groups fully cover the demand.
Ad creative is not a problem. Ad strength is mostly Excellent, a few Good. Only the "Near Me" RSA (Poor), one "Variations and Misspellings" RSA (Poor), and a "Slab Leaks" RSA (Average) need a refresh. This is not the constraint.
The story is simple: money is trapped in brand, where ads already show on nearly every search for the company name, while the non-brand budget runs out before the demand does. Rebalancing is the lever.
Once MCC linking is approved the week of Aug 3, moving everyone to named logins would tidy this up.
Nothing moves until you say go. Once you do, this is the order we would work in.