folder_open Analytics & Attribution

Lead tracking for UK carpet and upholstery firms

Martin Marinov Martin Marinov
16 min read
Topics booked-job-trackingcall-tracking-ukga4-eventsenhanced-conversionscarpet-upholstery-leads

A Leeds office manager rings at 08.12 because a coffee urn went over on the boardroom carpet. She is not browsing. She wants a same-day extract, a price band, and a van that actually shows. If your ads, GBP calls, and website forms all dump into one “lead” column, you cannot tell whether that job ever made it onto the diary, whether it was a £90 chair clean or a £1,400 flood extract, or whether Google Ads paid for a tyre-kicker who wanted a DIY stain-pen recommendation.

UK carpet and upholstery firms live on mixed urgency: pet urine, red wine, end-of-tenancy, sofa steam, commercial night work. In our audits of UK local service accounts, carpet cleaning CPCs typically run £2-£3; global paid-search benchmarks average around $2.96 (WordStream, 2023), but local intent queries in competitive UK postcodes often exceed that. You cannot afford 20-30% of spend on queries and forms that never become booked jobs. This piece is about the tracking layer that turns those contacts into a signal your bidding and your diary can both trust.

Flood extracts vs sofa steam: why one lead count wrecks UK spend

Most shops still fire a conversion on every form submit and every 30-second call. That looks tidy in Google Ads. It is a mess in the van plan. A “how much for a two-seater?” enquiry is not the same event as “bathroom flooded, tenant moving Friday.” Smart bidding treats them as twins. You then watch CPA look healthy while Saturday capacity fills with low-ticket sofa quotes and the flood work (the jobs that actually cover labour and kit) goes to whoever answered first.

Privacy and ad blockers already strip 20%+ of conversion data. If the remaining 80% is the wrong event, Enhanced Conversions and Performance Max are learning from junk. Mobile still drives the majority of paid clicks, yet conversion rates lag desktop. Operators often see that as “mobile traffic is rubbish.” More often the form is fiddly on a stained-thumb phone, the click-to-call number is not the tracked one, or the thank-you page never fires because someone built the quote form in a page-builder widget that GTM never sees.

Last-click reporting makes it worse. The same booked clean can count in Ads, in GA4, and again in the CRM if a dispatcher types it in by hand. CFOs then ask why ROAS in the Google dashboard (industry averages hover around 4.2x) does not match invoiced work. You do not need a data science team. You need one definition of a qualified job and a path that every channel uses.

If your current setup still sends every paid click to the homepage, pause before you add another campaign. Dedicated pages for flood, pet odour, and end-of-tenancy, with tracking that matches the offer, beat another layer of keywords. A short look at analytics and attribution is enough to see whether events even exist for those jobs.

The conversion events a UK carpet firm should actually fire

Stop arguing about multi-touch theory. Pick events the dispatcher already understands. Primary conversion: a booked slot with postcode, room type, and a date. Secondary: a qualified enquiry (named contact, service type, postcode in your coverage, not “how do I get red wine out myself”). Tertiary: engaged call of a length that matches a real quote, not a 12-second “are you open?”. Never make the primary conversion a button click, a WhatsApp icon tap, or a scroll.

Map those events in Google Tag Manager, then send them to GA4 and Google Ads with the same names. Use Enhanced Conversions so email and phone hashes recover some of the data ad blockers steal. If you use Meta for retargeting sofa before-and-afters, send the same booked-job event through the Conversions API rather than hoping the pixel saw the thank-you page. Volume is a dead metric here. A week with 14 forms and 3 booked extracts is not “down”; a week with 40 forms and 3 booked extracts is a tracking and offer problem.

Audit scorecard

  1. Inventory every intakeList website forms, GBP calls, click-to-call on ad

    Inventory every intakeList website forms, GBP calls, click-to-call on ads, chat, Instagram DMs, and the office landline. If a channel can create a diary slot and is not in the list, you are already blind.

  2. Name the job, not the clickWrite the primary event as booked_extract or

    Name the job, not the clickWrite the primary event as booked_extract or booked_upholstery with parameters: service (flood, pet, end-of-tenancy, sofa, commercial), postcode district, estimated value band in GBP.

  3. Split call tracking by campaignDynamic numbers on paid landing pages, a

    Split call tracking by campaignDynamic numbers on paid landing pages, a separate number on Google Business Profile. If Ads and organic share one number, you will keep funding the wrong channel.

  4. Kill duplicate conversionsOne booked job equals one primary conversion

    Kill duplicate conversionsOne booked job equals one primary conversion. Forms that later become bookings must not fire twice. Deduplicate on phone or email in the CRM or in a spreadsheet if you have to, then feed only the unique booking back to Ads.

  5. Value the job in the tagA £75 dining chair is not a £900 living-room flo

    Value the job in the tagA £75 dining chair is not a £900 living-room flood. Pass a conservative average or a quoted figure. Bidding on equal value is how sofa micro-jobs eat the budget.

  6. Watch the page that must loadThank-you pages and booking widgets fail Co

    Watch the page that must loadThank-you pages and booking widgets fail Core Web Vitals and never fire. Only 55.9% of origins pass all three CrUX vitals. If INP is ugly on mobile quote forms, you lose both the job and the signal.

  7. UTM every paid and

    GBP URLCampaign, ad group, and creative in the query string. “google / cpc / (not set)” is how end-of-tenancy ads get blamed for organic brand calls.

  8. Reconcile weekly against invoicesPick 20 jobs from last week

    Reconcile weekly against invoicesPick 20 jobs from last week. Match source, event, and invoice. If fewer than 16 line up, do not scale spend. Fix the pipe first.

Not sure where your funnel leaks?
Get a free marketing audit - we review your search, ads, and landing pages and send back what to fix first.
Get a free audit

Why your carpet and upholstery leads never reach the van

A Midlands case: the iframe that wrecked conversion data

A Midlands upholstery shop ran Search on “sofa steam clean” and “pet urine carpet”. Forms looked strong. Booked jobs did not. The mechanism was boring: the quote tool lived in an iframe, GTM never saw submit, and Ads optimised on a “Get a quote” button click that fired on page load for some mobile browsers. They moved the form onto the page, fired booked_upholstery only after the dispatcher confirmed a slot in the diary, and passed job value. Form volume dropped. Paid jobs per week did not. CPC stayed noisy, but wasted query share fell because bidding finally had a clean conversion.

Use HeyLead Insights on the quote page if you suspect rage-taps on the postcode field or drop-off before “book”. Session recordings beat guessing whether “mobile converts worse.” Pair that with a speed check. A 4-second quote widget on 4G in a high-rise is how you pay for the click and lose the flood job to the next listing.

Action checklist

  1. Export the last 30 days of Google Ads conversions next to the diary. Highlight rows with no matching job.
  2. In GTM, create booked_extract and booked_upholstery. Test with Tag Assistant on a real postcode in your coverage, not localhost.
  3. Turn off conversion counting on generic form_submit and phone_click except as an observation event.
  4. Add call tracking numbers to paid landing pages only. Keep GBP on its own number so local pack credit is honest.
  5. Stamp every paid URL with a UTM. Build them once and reuse.
  6. Pass value in GBP. Use a floor (for example £120 for a room extract) until quotes are structured.
  7. Wait through the learning period. Daily campaign rebuilds reset bidding and make the new signal useless.

LocalBusiness and Service schema will not book the van, but they keep name, NAP, and service types consistent for search. Validate markup so you are not feeding Google a different phone number than the one you track. Then leave the structure alone long enough for Smart Bidding to use the new booked-job event. Constant tweaks are how accounts look busy and still buy the wrong sofas.

Two patterns we see repeatedly

We keep seeing shops optimise to form fills on the sofa page while flood work pays the wages. Once they only send confirmed diary slots back to Ads, CPA looks worse for a fortnight and then the vans stop filling with £60 chair jobs.

We also keep seeing call tracking on GBP and ads share the same number. Organic brand calls then train Performance Max. Splitting numbers is the unglamorous fix.

Prefer to just ask? Message Martin directly on WhatsApp: Chat with us on WhatsApp

Why your carpet and upholstery leads never reach the van

FAQs

Should carpet cleaning firms use offline conversion import?

If the diary lives in a simple system, import booked jobs nightly keyed on GCLID or email. Website tags alone miss phone bookings that never hit the thank-you page. Import only unique, confirmed jobs so you do not double-count.

Do we still need keywords if we “run broad”?

Yes. Signals help bidding, but UK search still mixes DIY stain advice with emergency extracts. Keep intent clusters (flood, pet, end-of-tenancy, commercial) and negatives for wholesale chemicals, jobs, and training courses. Broad plus a dirty conversion is how you fund the wrong queries.

What if Meta CPA and Google Ads CPA never match the invoices?

They will not match last-click to last-click. Use each platform for in-channel optimisation and reconcile to invoiced jobs weekly. If the gap is huge, you have duplicate events or missing call tracking, not a philosophy problem.

How do we stay GDPR-compliant with call and form tracking?

No. Consent mode, Enhanced Conversions, and server-side or CAPI where you run paid social. First-party emails and phones from the quote form are the recovery path when cookies fail. Do not collect data you will not use to book or follow up.

Putting it to work

Execution sprint

This week

  1. Pull 30-90 days of performance for UK carpet and upholstery (Search Console, ads, CRM, or call logs - whatever you have).
  2. Flag the top leak: wrong intent, weak page, slow response, or dirty conversion tracking.
  3. Ship one fix on the highest-traffic money path (page, campaign split, or response rule).
  4. Run the free tools below on that same URL or account and log the findings.

Next 30 days

  1. Expand the fix to the next one or two money paths only after the first one shows cleaner bookings.
  2. Align creative, keywords, or content with the same offer the page now states.
  3. Review booked outcomes weekly; cut anything that still only produces unqualified volume.

Start here in the next few days

  • Pull 30 days of Ads “conversions” and tick which ones became invoiced extracts or upholstery cleans.

  • Turn primary conversion off on raw form_submit and phone_click.

  • Stand up booked_extract / booked_upholstery in GTM with GBP value and postcode district.

  • Split GBP and paid call numbers.

  • Build UTMs for every live ad and landing URL with the UTM link builder.

  • Run the quote page through the Core Web Vitals checker on mobile.

Next 30 days

  • Import offline bookings if the office still takes diary calls.

  • Give bidding two to three weeks on the new event before you judge CPA.

  • Align flood, pet, and tenancy ads to matching landing pages, not the homepage.

  • Reconcile 20 jobs a week until the match rate holds.

If the break is the gap between a “lead” in Ads and a confirmed slot on the van board, HeyLead can own that tracking build: events, call numbers, value, and the weekly reconcile so bidding learns from real UK carpet and upholstery jobs. Chat with us on WhatsApp

Work with HeyLead
Free marketing audit, or reach Martin directly:
Get a free audit Connect on WhatsApp · [email protected]