Molitaris Consulting

Rolland Reash Audit

Incorrect password
Press Enter to continue

P3 Services

×

Molitaris Consulting

Rolland Reash Plumbing · Full audit
Fixes rolling out Window Jun 30 – Jul 29 Account 6526806035
Reported CPA
$184
What the account says about itself. It measures phone calls, not jobs.
Cost per ServiceTitan booked job
$245
The number that matters. Best of the three P3 priority accounts.
Booked jobs (30d)
67
Booked appointments: 53 from the call extension, 14 from the website.
Spend (30d)
$16,405
Across three active campaigns: non-brand search, brand search, and LSA.

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).

01

Executive summary

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 account works. It spent $16,405 in 30 days and the Google Ads import shows 67 booked jobs, so cost per booked job reads about $245. ServiceTitan itself shows 95 for July, so the real number is likely near $173 once the import gap closes. That is the best of the three P3 accounts we looked at, and it is happening despite the setup, not because of it.
  • Google is bidding toward the wrong thing. Every ServiceTitan action (including booked jobs) is set to secondary. The account optimizes toward raw phone calls, so the reported CPA of $184 counts any 60-second call, not real jobs. Fixing this one setting is the highest-leverage move in the account.
  • Brand is expensive and takes 40% of the money. The brand campaign spent $6,565 at a $45 average cost per click (top brand terms run $50 to $57 a click) to reach people already typing the company name. That is a symptom of the same bidding problem.
  • Non-brand is starved. The non-brand campaign's daily budget runs out before the demand does, while brand ads already show on nearly every search for the company name.
  • Search waste is real but contained. About $3,366 of non-brand spend in the top terms went to zero-conversion queries, led by $1,555 on competitor names. The geo and structure are actually in good shape.
02

Performance reality: reported vs ServiceTitan reporting

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.

MeasureReported (Google)ServiceTitan reporting
Spend (30d)$16,405$16,405
"Conversions"8967 booked jobs (53 from call extension, 14 from website)
Cost per conversion$184.34about $245 per booked job
What it countsany call 60s+, LSA leads, form/thank-youa real job on the schedule
Where the money goes: the three active campaigns
Active campaignTypeSpendConvHow often ads showedMissed because budget ran outBudget/day
RR-SEM-Plumbing-NB-Jacksonville-202510Search (non-brand)$9,3054336.3% of searches14.5%$500
RR-SEM-B-jacksonville-202508Search (brand)$6,5653694.6% of searches4.6%$225
LocalServicesCampaign (LSA)Local Services$53510n/an/aauto

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.

03

Conversion tracking today, and the fix

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.

Full action mapping, all 23 enabled actions. P = primary (drives bidding), S = secondary (recorded, ignored by bidding)
#Conversion actionType / categoryNowProposedWhy
1ServiceTitan Booked Job (Originated from Call Extension)Upload calls / Book apptSPA real job booked from a call. This is what we want to buy. 53 in window.
2ServiceTitan Booked Job (Originated from Website)Upload clicks / Book apptSPA real job booked from the web. 14 in window. Together with #1 = 67 jobs.
3ServiceTitan Lead - ExtensionUpload calls / Phone leadSPThe one qualified-call primary. A ServiceTitan-verified lead from a call (70 in window), adds volume so Max Conversions learns fast while staying quality.
4local_services_phone_leadLSA / Phone leadPPReal LSA lead, separate LSA campaign. Leave primary.
5local_services_message_leadLSA / messagePPReal LSA message lead. Leave primary.
6Calls from adsAd call / Phone leadPSThe main culprit. Counts any call 60s+, including existing customers. Demote so it stops steering bids. 80 in window.
7Clicks to callGoogle hosted / ContactPSA tap on the call button, not a connected call. Inflates and double-counts. 23 in window.
8Form (GA4 custom)GA4 / Submit lead formPSDouble-counts the same web submission as #9. ServiceTitan Integrated actions cover web leads better.
9https://plumbingjacksonville.com/thank-you/Webpage / Submit lead formPSThe other half of the double count with #8. Keep enabled for QA, but secondary.
10Calls from Smart Campaign AdsSmart campaign / Phone leadPSLegacy smart-campaign action. No smart campaigns run now. Demote (retire later).
11Smart campaign map clicks to callSmart campaign / ContactPSLegacy. Demote (retire later).
12Smart campaign map directionsSmart campaign / Get directionsPSLegacy and low intent. Demote (retire later).
13Smart campaign ad clicks to callSmart campaign / ContactPSLegacy. Demote (retire later).
14Calls from AdWords Express AdsAd call / Phone leadSSLegacy, already secondary. Leave, retire later.
15ServiceTitan Inbound Call - ExtensionUpload calls / Phone leadSSCall-level signal, useful for reporting, not for bidding. 113 in window.
16ServiceTitan Inbound Call - WebsiteUpload clicks / Phone leadSSSame, website side.
17ServiceTitan Calls Conversion ActionUpload clicks / Phone leadSSOverlaps the inbound-call actions. Keep for insight.
18ServiceTitan Integrated Lead FormsUpload clicks / Submit lead formSSWeb lead form. Overlaps #2 booked-job-website. Keep secondary to avoid double-count.
19ServiceTitan Integrated BookingsUpload clicks / Submit lead formSSOnline booking, overlaps #2. Keep secondary.
20ServiceTitan JVP (Originated from Call Extension)Upload calls / Book apptSSJob-value proxy that mirrors #1. Keep secondary now; candidate for value-based bidding later.
21ServiceTitan JVP (Originated from Website)Upload clicks / Book apptSSMirrors #2. Keep secondary; value-bidding candidate later.
22ServiceTitan Call Extension Completed Job ConversionsUpload calls / Converted leadSSDownstream completed job, lags by days/weeks. Great for reporting, too slow for bidding.
23ServiceTitan Completed Jobs Conversion ActionUpload clicks / Converted leadSSSame, 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.

Expected effects

What changes once the reshuffle goes live
  • Reported conversions become jobs, not calls. The "Conversions" column will reflect roughly the 67 booked jobs plus qualified ServiceTitan call leads, instead of 80-plus raw calls.
  • CPA reads honestly at about $245 per booked job instead of the misleading $184 per raw call. Expect the reported number to rise at first; that is the number getting truthful, not performance dropping.
  • Bidding optimizes toward booked jobs. Max Conversions will chase the queries and times that actually put jobs on the schedule.
  • Brand overspend eases on its own. Once repeat-customer brand calls stop counting as fresh conversions, Google stops paying $45-plus a click to capture them. This complements the separate brand bid-cap recommendation.
  • Cleaner web tracking. Removing the GA4-Form-plus-thank-you-page double count and demoting click-to-call stops the account inflating its own web numbers.

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.

Verification plan

How we prove it worked after it goes live
  1. Day 0 (change day): screenshot the conversion actions table showing the new primary/secondary states. Confirm only booked jobs (call + website), ServiceTitan Lead - Extension, and the two LSA leads are primary.
  2. Day 1 to 2: confirm booked-job conversions are still importing daily (ServiceTitan upload health). Check that reported "Conversions" now tracks jobs, not the old raw-call volume.
  3. Day 3 to 7: reconcile Google-reported booked jobs against the ServiceTitan job count for the same days. They should line up within normal import lag. Watch that daily conversion volume stays high enough for Max Conversions to keep learning (booked jobs plus qualified leads should give roughly 4 to 5 per day, which is healthy).
  4. Day 7 to 14: review cost per booked job as the new primary. Compare non-brand vs brand now that bidding is aimed correctly. Do not judge performance before day 14; the algorithm is re-learning.
  5. Day 30: full check. Confirm reported CPA sits near the true ~$245, brand cost per click has eased, and non-brand is spending the freed budget (its daily budget was running out before the demand did).
  6. Ongoing guardrail: keep the completed-job and JVP actions as secondary reporting lines so we can always tie Google numbers back to real revenue in ServiceTitan.
04

The brand overspend story

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)MatchCostClicksAvg CPCConv
rolland reash plumbing jacksonville flPhrase$1,77231$57.176.0
Rolland Reash PlumbingExact$1,70334$50.086.5
Rolland ReashPhrase$1,36333$41.3010.0
rolland plumbingExact$43917$25.852.0
roland reese plumbingExact$42811$38.896.0
Brand campaign total$6,565145$45.2836.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:

  1. The bidding target. The brand campaign runs Maximize Conversions with no target-CPA ceiling, optimizing to those cheap raw-call conversions. Google reads every brand call as a win and bids up hard to capture it, even though most of these callers already know the company and would call anyway.
  2. Brand ads already show on nearly every search for the company name. The account is paying a premium to win auctions it was going to win regardless.

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.

05

Search terms and the draft negative list

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.

Where the waste sits
ThemeWasted (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.

Group 1: out-of-area geo → Master Negatives List ($202, small but clean)
TermMatchSetEvidence
st augustinePhraseMaster 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.
Group 2: competitor names → Competitors set ($1,555 across 43 zero-conversion terms)

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.

TermMatchSetEvidence (0 conv)
roto rooterPhraseCompetitors"number to roto rooter" $95, "roto rooter near me" $22
er rooterExactCompetitors"er rooter jacksonville" $80
mr rooterPhraseCompetitors"mr rooter jacksonville fl" $79
metro rooterPhraseCompetitors"metro rooter septic" $23
duck duck rooterExactCompetitors$22
vereenPhraseCompetitors"vereen plumbing" $91, "terry vereen plumbing jacksonville florida" $27
turner plumbingExactCompetitors"turner plumbing co jacksonville fl" $91
kingdom plumbingExactCompetitors$74
cgc home servicesExactCompetitors"cgc home services jacksonville" $68
normans plumbingExactCompetitors$65
keystone plumbingExactCompetitors$65
troy trawickPhraseCompetitors"troy trawick plumbing" $62
hall and sonsPhraseCompetitors"hall and sons plumbing inc jacksonville" $54 + $12, "hall & sons plumbing" $53, "hall & sons plumbing llc" $5
joe coyle plumbingExactCompetitors$53
packs plumbingExactCompetitors$53 + "packs plumbing st augustine fl" $8
superior plumbingPhraseCompetitors"superior plumbing jacksonville florida" $51, "superior plumbing and pipe lining" $14
dan plumbingExactCompetitors$48
advantage plumbingExactCompetitors"advantage plumbing jacksonville" $43
john williams plumbingExactCompetitors$42
black pearl plumbingExactCompetitors$41
j&w heatingPhraseCompetitors"j&w heating and air & plumbing sunbeam road jacksonville fl" $40 (converted once, low priority, review)
precision plumbingExactCompetitors"precision plumbing jacksonville" $9, "precision leak detection jacksonville fl" $39
drew hartmannPhraseCompetitors"drew hartmann plumbing" $36
bobs backflowExactCompetitors"bobs backflow and plumbing" $36
hooked plumbingExactCompetitors$29
ricky plumbingExactCompetitors$28
ww gayPhraseCompetitors"ww gay plumbing jacksonville fl" $28
peyton plumbingExactCompetitors$22
lettow plumbingExactCompetitors$22
b & g plumbingExactCompetitors$21
fair plumbingExactCompetitors"fair plumbing jacksonville beach" $17
asap plumbingExactCompetitors"asap plumbing inc" $13
dl plumbingExactCompetitors"dl plumbing contractors" $13
david grey plumbingExactCompetitors$10
atlantic coast plumbingExactCompetitors$9
darsco plumbingExactCompetitors$6
sweeney plumbingExactCompetitors$4
jax plumbingExactCompetitors$3

Note: "ryans plumbing" ($70) and "a1 plumbing near me" ($96) each booked a conversion, so they stay out of the negatives.

Group 3: DIY, price shoppers, research → Research, Costs set
TermMatchSetEvidence (0 conv)
cheapPhraseResearch, 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 supportPhraseResearch, Costs"rinnai tankless water heater tech support" $23. Warranty/DIY help seeker.
Group 4: wrong service → Master Negatives List (confirm with the client at the Aug 3 walkthrough before pushing)
TermMatchSetEvidence (0 conv)Confirm first?
poolPhraseMaster Negatives"pool plumbers near me" $47Yes, if no pool plumbing
electricianPhraseMaster Negatives"best plumber and electrician near me" $5Yes
grease trapPhraseMaster Negatives"grease trap replacement near me" $42Yes, 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.

Do NOT exclude: core queries. Fix by bidding or landing page, not negatives

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.

TermSpendWhy keep
plumbers near me$147Core high-intent query
plumbing near me$114Core high-intent query
plumbing companies near me$103Core high-intent query
24 hour plumbing near me$113Core, if 24-hour service is offered (confirm)
24 hour plumber jacksonville fl$103Core, same caveat
slab leak detection near me$72Real service, has a dedicated ad group
well pump / well water termsmixedRolland 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.

Rollout order

  1. Group 2 (Competitors) first, it is the biggest recoverable waste ($1,555).
  2. Group 1 (St. Augustine) and Group 3 (cheap, tech support), clean and low-risk.
  3. Group 4 (wrong service) only after confirming the service list with the client.
  4. Leave Group 5 territory alone. Revisit the do-not-exclude terms if the pattern holds over 60 to 90 days.

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.

06

Structure and account observations

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.

Budget balance

Where the next booked job comes from
  • Non-brand: the campaign's daily budget runs out before the demand does; ads currently show on 36.3% of the searches for these services. This is the growth lane, and it is the traffic that converts into new booked jobs.
  • Brand: ads already show on nearly every search for the company name. More money here buys almost nothing new.
  • Geo: both search campaigns target by PRESENCE (people physically in the area), with 51 positive locations (Jacksonville plus surrounding zips) and 125 negative locations already in place. Set up correctly. Out-of-area spend is small and query-driven, not a targeting problem.

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.

Governance observations

Shared for awareness, not criticism. 55 changes in the account in July
  • 36 came from a shared Gmail login (p3servicesmarketingteam@gmail.com and one variant). Shared logins make it hard to know who changed what, and they are a security soft spot. Individual Google logins with proper access levels are cleaner and safer.
  • 12 came from farrukh.saleem@p3services.com and 7 from jared.tuttle@p3services.com, mostly negative-keyword and geo edits through internal tools. That is normal account hygiene.
  • The 25 auto-apply recommendation types are all paused, which is exactly right. Good call by whoever set that.

Once MCC linking is approved the week of Aug 3, moving everyone to named logins would tidy this up.

07

Prioritized recommendations

Nothing moves until you say go. Once you do, this is the order we would work in.

First moves after approval
  1. Fix the conversion action mapping. Make ServiceTitan Booked Job (call + website) and one qualified ServiceTitan call action primary; move raw "Calls from ads," "Clicks to call," the double-counted web actions, and the legacy smart-campaign actions to secondary. This aims bidding at real jobs and makes the reported CPA honest at about $245. This is the root-cause fix and everything else compounds off it (full detail in section 03).
  2. Add the competitor and off-target negatives. Push the ready list, weighted to the $1,555 competitor bucket. Immediate waste recovery with no downside (section 05).
  3. Cap brand spend. Add a target-CPA or bid cap to the brand campaign so it stops paying $45 to $57 a click for searches on its own name that it already wins almost every time. Expect $2,500 to $3,500/month to free up (section 04).
Later
  1. Reallocate freed brand budget into non-brand, where the daily budget runs out before the demand does, and watch cost per booked job as the new signal settles.
  2. Leash or pause the Dynamic Search ad group once service ad groups cover demand, since it is the main path for competitor and off-target queries.
  3. Refresh the three weak RSAs (Near Me, one Variations, Slab Leaks) and de-duplicate the web form tracking (GA4 "Form" vs /thank-you/ page).
  4. Clean up paused legacy campaigns and move the team to named Google logins after MCC linking.