The dispatcher already promised a Saturday truck for a pet-urine living room when the owner asks a simple question: did that job come from Google, a Facebook sofa ad, a Google Business Profile call, or the neighbor who still has your magnet on the fridge? If the answer is a shrug and a screenshot of a form email, you are not tracking leads. You are collecting inboxes. For carpet and upholstery companies, that gap is expensive because the same click can be a $149 stain rescue or a $2,400 whole-home clean with Scotchgard, and last-click dashboards treat both as a win.
WordStream’s 2024 Home Services benchmark puts average CPCs around $6-$9 for carpet-cleaning queries - well above the cross-industry mean, and Google Ads still prints a 4.2x average ROAS across industries while Meta sits nearer 2.8x. Those averages hide the local reality. A high share of paid search clicks is mobile, conversion rates still lag desktop by 30-40%, and 20-30% of SEM spend routinely dies on irrelevant queries or pages that never match the ad. If you cannot tell which source produced a booked, paid job, you will keep feeding the channel that looks busy and starve the one that actually fills vans.
Why form volume lies to carpet and upholstery marketers
Most carpet shops count a lead as anyone who typed a name. That includes people shopping for rental machines, HOA boards collecting three quotes they will never award, and after-hours spam that looks like a zip code. Upholstery restorers get an extra twist: a “couch cleaning” inquiry can be a $89 cushion shampoo or a leather recolor that needs a specialist. If your CRM, calendar, and ads platform each keep a different story, smart bidding trains on noise. Teams already lose 20%+ of conversion data to ad blockers and privacy changes. Feed Google a fake “lead” and automated bidding will happily inflate spend without improving job quality.
The failure is usually mechanical, not philosophical. A Google Ads call extension fires a conversion on a 12-second hang-up. Meta Instant Forms dump into email and never get a job type. The website form posts to a shared inbox the owner checks at 9pm. Nobody writes “pet odor, 4 bedrooms, cash today” next to the UTM. By Monday the office has 41 “leads” and three booked jobs, so the marketing meeting argues about CPL instead of cost per paid clean.
Attribution arguments make this worse. Last-click counts the same booked job in Google and Meta if both pixels fire. CM360-style views from Google Ads have been getting thinner since late 2025. Buyers already say attribution is basically dead if all you mean is last click. You still need tactical tracking: which campaign produced a booked steam clean, which landing page dropped the call, which creative only attracted DIY stain questions. That is first-party data work, not a philosophy seminar.
If your ads still dump onto the homepage, you will never isolate offer match. Dedicated pages for water extraction, pet odor, area rugs, and commercial night work give you something worth measuring. A short check of post-click behavior with HeyLead Insights often shows the leak before you blame the auction: people tap Call, then bounce when the click-to-call is buried under a 4MB gallery of before-and-after sofas.
If the spreadsheet and the van board still disagree, a focused analytics and attribution pass is usually cheaper than another month of “more leads” at a higher CPC.
What a booked-job signal should look like for this trade
Lead tracking for carpet and upholstery companies only works if the conversion you send to ads platforms is closer to money than to curiosity. Define three events and refuse to treat them as equals. Event one is inquiry: form, call over 60 seconds, or chat with a zip and a surface (carpet, rug, sofa, car interior). Event two is qualified: a dispatcher confirmed access, parking, pets, and a real address inside your service area. Event three is booked-and-showed, ideally with a job value. Only event two and three should train bidding once volume exists. Event one can still exist for reporting.
Tag every inquiry with job family and urgency. Job families that actually change media mix: emergency water extraction, pet odor, whole-home maintenance, area rug pickup, upholstery and leather, commercial after-hours. Urgency is tonight, this week, or just shopping. A “flooded basement carpet” click that converts on a generic “we clean carpets” page will look like a win and then no-show because you never mentioned truck-mount extraction or after-hours fees. Message match is a tracking problem as much as a copy problem.
Calls still dominate for this trade. Route ads, GBP, and website through unique numbers or dynamic number insertion so you can hear the first 20 seconds. If the caller says “I need the sofa done before my in-laws Friday,” that is an upholstery job with a deadline, not a generic lead. Log that in the same record as the UTM. If the office uses a paper calendar, photograph it into the CRM nightly until you replace it. Ugly first-party data beats a pretty dashboard that cannot name a truck.
Landing speed matters because mobile is most of paid search. Only 55.9% of origins pass all three Core Web Vitals in recent CrUX data. A 4-second INP on a “book pet odor” page will drop the same people Google already charged you $8 to acquire. Pair tracking with page health or you will attribute “bad leads” to a channel that actually delivered people who never saw the form.
Get a free marketing audit - we review your search, ads, and landing pages and send back what to fix first.
Get a free audit
A rebuild you can run without hiring a data team
Do this as an operational sprint, not a six-month stack rewrite. Keep Google Tag Manager as the single injector. Keep one CRM or even a disciplined spreadsheet if the shop is small. The goal is one row per inquiry with source, campaign, job family, booked flag, and revenue.
Audit scorecard
-
Inventory every intakeList website forms, click-to-call, GBP calls and m
Inventory every intakeList website forms, click-to-call, GBP calls and messages, Meta Instant Forms, marketplace DMs, and walk-ins. If an intake cannot carry a source field, it is a leak. Carpet shops often miss the after-hours voicemail box that still books flood jobs.
-
Standardize job familiesUse a short picklist: water, pet odor, whole hom
Standardize job familiesUse a short picklist: water, pet odor, whole home, rugs, upholstery, commercial. Force the form and the call script to pick one. “Other” should be rare. This is how you later pause the Meta sofa creative that only produces $49 cushion asks.
-
UTMs on every paid and organic CTABuild links so campaign, ad group, and
UTMs on every paid and organic CTABuild links so campaign, ad group, and creative survive the click. No naked homepage URLs in ads. Use a consistent naming pattern like google / search / pet-odor / brand-vs-generic.
-
Call rules that match moneyDo not fire a Google conversion on 5-second c
Call rules that match moneyDo not fire a Google conversion on 5-second calls. Require duration or a “booked” outcome from the call tracker. Listen to 10 recordings this month and mark which campaigns produced DIY questions versus “can you come today.”
-
Enhanced Conversions and CAPITurn on Enhanced Conversions in Google and
Enhanced Conversions and CAPITurn on Enhanced Conversions in Google and the Conversions API for Meta. First-party emails and phone hashes protect against the 20%+ signal loss. Event Match Quality is a hygiene check, not proof the job was profitable.
-
Offline import of booked jobsOnce a week, upload booked-and-showed jobs
Offline import of booked jobsOnce a week, upload booked-and-showed jobs with GCLID, GBRAID, or WBRAID and a value. If a $2,100 whole-home clean started as a $4 click, bidding should know. If a $0 no-show started as a $14 click, bidding should know that too.
-
Landing proof per familyPet odor pages need pet photos, enzyme language,
Landing proof per familyPet odor pages need pet photos, enzyme language, and a same-week calendar. Upholstery pages need fabric types and a “we do not dye silk” disclaimer. Mismatch creates fake leads you will later blame on tracking.
-
Page health on the money URLsRun Core Web Vitals on the booking URLs, no
Page health on the money URLsRun Core Web Vitals on the booking URLs, not the blog. Slow galleries of wet carpets kill mobile conversion while desktop still looks fine in the weekly PDF.
Action checklist
- Export 30 days of inquiries. Tag each as booked, quoted-not-booked, or junk. You want a baseline cost per booked job, not CPL.
- Kill conversion actions that fire on thank-you page views without a job family. Replace them with form submit plus required fields: zip, surface, preferred day.
- Give Meta Instant Forms a follow-up SLA under 15 minutes. Untouched Instant Forms are not leads; they are ad spend with a name attached.
- Reconcile Google’s in-platform CPA against booked jobs in the CRM. When they diverge, trust the van board and fix the tag, do not “optimize” the campaign on the lie.
- Add negatives for rental machines, DIY shampooers, and “how to clean pee” content queries if you sell done-for-you service. That is tracking-adjacent: junk queries poison the conversion pool.
Free tools - try these yourself
A two-truck shop in a sunbelt suburb ran this without new software. Their Google form had one field: name and phone. They added surface, zip, and pet-or-water. Booked rate on paid search jumped because dispatch stopped chasing people who wanted a $40 rental. The mechanism was not a smarter algorithm. It was refusing to call a rental-shopper a conversion.
![]()
Two shops, two tracking breaks, one pattern
An upholstery specialist spent into Meta with sofa-before-and-after Reels. Creative died in 5-6 days, CPMs rose first, then lead volume sagged. In-platform CPA looked fine because Instant Forms still filled. The office closed 2 of 38 forms in a fortnight. The break was the form: no fabric type, no “in-home vs pickup,” no photo upload. They moved the same creative to a landing page with fabric checkboxes and a photo field, fired conversions only on submit with fabric, and imported booked jobs weekly. Spend did not go up. Booked leather and microfiber jobs did.
A carpet company running Performance Max (“PMax drives the bulk now” is what their media buyer kept saying) saw 4x ROAS in Google and almost nothing on the calendar. Asset groups mixed “emergency water” headlines with “spring whole-home specials.” Google optimized toward cheap form fills on the special. Water jobs, the high-ticket work, starved. They split asset groups by job family, sent each to its own page, and only imported offline conversions with value. PMax still ran broad. The signal got specific. That is “signals over keywords” in a trade where the keyword is often just “carpet cleaning near me.”
Both cases needed weekly, not monthly, reconciliation. Vague monthly PDFs bury a dead creative and a broken call tag until the owner already cut the budget. You do not need a 40-slide deck. You need booked jobs by family by source, plus a note on which landing page people actually called from.
What marketing leaders are seeing
Two patterns keep surfacing in accounts we audit. Teams optimize pet-odor ads to form fills, then dispatch reports that half the calls are vinegar-and-DIY questions; once only booked jobs go back to Google, in-platform CPA looks worse for a couple of weeks and then the vans fill. Call tracking often shows 11-second GBP calls converting in Ads - pocket dials - and raising the duration rule makes Search stop looking like a miracle channel.
![]()
FAQs
Should carpet companies convert on every phone call?
No. Short calls and wrong-area calls teach bidding the wrong lesson. Use duration plus a booked or qualified outcome. Keep raw call counts in a secondary report so you still see demand.
Do we need a full CRM before lead tracking works?
No. A spreadsheet with source, job family, booked flag, and revenue beats an unused CRM. Move to a CRM when two people are editing the same jobs and records collide. The taxonomy matters more than the logo on the tool.
Why does Meta CPA disagree with our calendar?
Instant Forms, view-throughs, and last-click overlap. Privacy loss already knocks out 20%+ of events. Trust booked jobs you can name, then tighten CAPI and stop optimizing to the in-platform number when it diverges.
Is Performance Max usable if we cannot see search terms?
Yes, if asset groups and landing pages are split by job family and you import offline values. If everything points at one homepage, PMax will hunt cheap forms. Structure is the control you still have.
How long until tracking changes show in ROAS?
Bidding needs a few conversion cycles. Plan on weeks, not overnight. Promising a specific ROAS before the account has clean booked-job data is how shops get stuck with inflated spend and no vans.
Putting it to work
Execution sprint
This week
- Pull 30-90 days of performance for carpet and upholstery (Search Console, ads, CRM, or call logs - whatever you have).
- Flag the top leak: wrong intent, weak page, slow response, or dirty conversion tracking.
- Ship one fix on the highest-traffic money path (page, campaign split, or response rule).
- Run the free tools below on that same URL or account and log the findings.
Free tools for this sprint
Next 30 days
- Expand the fix to the next one or two money paths only after the first one shows cleaner bookings.
- Align creative, keywords, or content with the same offer the page now states.
- Review booked outcomes weekly; cut anything that still only produces unqualified volume.
This week
-
Pull 30 days of inquiries and mark booked vs junk by job family.
-
Rebuild UTMs with the UTM link builder so no paid click lands naked on the homepage.
-
Raise call conversion rules above pocket-dial length and listen to 10 recordings.
-
Add surface and zip as required fields on every form.
-
Check booking URLs in the Core Web Vitals checker.
Next 30 days
-
Turn on Enhanced Conversions and Meta CAPI.
-
Import booked jobs with value weekly.
-
Split landing pages for water, pet, and upholstery if they still share one URL.
-
Reconcile in-platform CPA to the van board every week, not in a monthly recap.
Start by lining last month’s booked carpet and upholstery jobs against the campaign that claimed them, and you will see which conversions were theatre. HeyLead can own the messy middle of that work: call rules, offline imports, job-family events, and the landing handoff where qualified cleans leak before a truck is ever assigned. Chat with us on WhatsApp
Free marketing audit, or reach Martin directly:
Get a free audit Connect on WhatsApp · [email protected]