Google Ads ROAS for auto shops, counted in banked jobs.
Google Ads ROAS for auto shops, measured on money that settled: cost per booked job, and return on ad spend read from your invoices.
14-day free trial has everything, nothing charged for 14 days, The report needs no add-on, No add-on needed
The Campaign ROI report in Service VIN: $1,240 of spend on one Google Ads campaign and the three things an ad account cannot report about it; 38 matched leads becoming 9 booked jobs at $138 of spend each, beside the shop's owner going over them at his laptop; and the finished report — three campaigns, the Unmatched row in the open, $2,700 of spend against $22,900 invoiced and $21,550 collected.
The short answer
How is Google Ads ROAS measured for a shop?
From the invoices, not from conversions. Google can see a click and a form fill; only your shop system knows which of those became a booked job and which of those jobs were paid. Reading the same chain end to end gives cost per booked job and a return figure based on settled money.
- Return is computed on invoices that settled, not on form fills Google counted.
- Cost per booked job is the number a shop can act on, and it is reported per campaign.
- The funnel is read end to end because the same system holds the spend and the invoice.
- What paid is fed back to Google, so bidding learns from revenue.
Spend in. Booked jobs out. Nothing modelled in between.
Per campaign, over the same ranges as the rest of your Reports — 7, 30 or 90 days, 12 months, year to date, all time. Every cell is arithmetic over your own rows, which means every cell can be checked.
What Google Ads can see
What your shop system holds
Cost per booked job is spend divided by the jobs on the second row. True ROAS is the paid invoices divided by spend. Neither number can be computed from the first row — which is the only row Google has.
| Where the number comes from | |
|---|---|
| Spend | Synced from your ad account nightly — each pass re-pulls the last 35 days, because Google restates recent days as its own conversion lag settles, and a restated day overwrites. A Sync now button runs the identical pass on demand. |
| Leads | Leads created in the range that match the campaign — by the webhook's campaign id, by the ValueTrack suffix, or by campaign name. The matching rules are printed below, because a number you can't interrogate is a number you can't trust. |
| Booked jobs | Jobs whose own attribution matches the campaign, plus jobs reached through a matched lead — lead to quote to job, the chain your shop already runs. Not form fills. Not calls. Cars that landed on the schedule. |
| Revenue | The exact rule every Reports page uses: counted invoices only — void, refunded and deleted invoices are out — at subtotal minus discounts, before tax. An accepted quote with any invoice is represented by that invoice; only a quote with no invoice at all falls back to its own figures. |
| Collected | What was actually paid on those same invoices. Revenue is what you billed on the campaign's jobs; collected is what reached the bank — and the report shows both rather than letting one impersonate the other. |
| CPL · cost per booked job · ROAS | Spend ÷ leads, spend ÷ booked jobs, revenue ÷ spend — computed, never estimated. When a denominator is zero the cell shows an em dash, not a fake $0.00: a campaign with no booked jobs has no cost per job to report. |
The Unmatched row is the feature, not the flaw.
Google traffic the campaign rows can't honestly claim — a click id that arrived without a campaign parameter, a campaign older than the synced spend window, channel spend beyond what the rows explain — lands in its own visible row. It is never spread across campaigns to make each one look a little better than the data supports.
The report also prints its own limits on the page: a lead from before the range that converts inside it is counted by neither a campaign nor Unmatched, and a campaign with no synced spend in the range can't be matched into. A report that names what it can't see is a report you can act on — and a growing Unmatched row is itself a finding, usually meaning the suffix below isn't pasted yet.
How a click becomes a row in this report.
No pixel, no tag manager, no third-party script. Capture is first-party on the surfaces where a visitor becomes a lead or a booking — your booking page, hosted and embedded lead forms, landing pages, or your own website's form — and it follows four rules you can audit.
- 1
The click arrives named
Capture reads exactly 10 query parameters — 5 click ids (gclid, gbraid, wbraid, fbclid, msclkid) and the 5 UTM labels. An allowlist, not a utm_* wildcard, which would happily carry someone's email address into the database. Click ids are kept verbatim to 200 characters, because a truncated click id is worthless to everything downstream. - 2
The visitor may leave and come back
The snapshot is remembered for 90 days, per shop, in the visitor's own browser — no cookie, no third-party script. A fresh ad click replaces last month's, since Google credits the driving click; a param-less return visit still remembers what originally brought them. Do Not Track and Global Privacy Control are honoured: an opted-out visitor gets nothing persisted at all. - 3
The lead keeps the credit
Every submission is re-checked server-side at the trust boundary — the browser is never trusted for shape. And when a duplicate lead merges, attribution backfills a lead that has none and never overwrites one that has it: the click that created the lead keeps the credit. - 4
The campaign gets named
A lead ties to a campaign in strict precedence: the campaign id stored by the Google lead-form webhook, then a UTM campaign equal to a campaign id (what the paste-once suffix produces), then a campaign name — case- and whitespace-insensitive, and if two campaigns share a folded name, name-matching is disabled for both rather than guessed. Anything Google-shaped that matches nothing lands in Unmatched.
One suffix, pasted once, and every lead names its campaign.
Most attribution setups start with an integration project. This one starts with a paste: a ValueTrack final-URL suffix at the account level, and Google itself stamps the campaign id onto every ad click. Your leads, quotes and jobs start carrying campaign ids the same day — no API access, no developer token, nothing to install on your site.
- Campaign ids, not campaign names — so renaming a campaign never orphans your history
- Connect the account read-only and the spend side fills in: the nightly sync adds each campaign's cost, clicks and impressions next to the leads the suffix tagged
- The first import starts that night, and roughly 3 nights later about 2 years of campaign history is in the report
The paste-once setup
No API access needed- 1Keep auto-tagging on (it usually already is).
- 2In Google Ads: Settings → Account settings → Tracking — paste this as the final URL suffix:
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_term={keyword}That's the whole install. Google fills in the campaign id on every ad click at the account level, so each lead arrives already naming its campaign — with no developer token, no API review and nothing running in your customer's browser.
The report reads your invoices. Then it sends them back.
Knowing your true ROAS is half the loop. The other half: when an attributed invoice is paid, its real ex-tax value goes back to Google as a conversion — so your bidding stops optimizing for form fills and starts optimizing for the money.
Conversion feedback
Recent uploads · swept hourly
- ServiceVIN — Booked jobcounted
A job with a Google click behind it — uploaded count-only, so bidding learns which clicks become real work.
- ServiceVIN — Invoiced revenue+$1,840
Invoice paid — its ex-tax value, the same figure your Reports page counts, quoted back against the click id verbatim.
- Retraction−$1,840
That invoice was refunded, so the conversion is taken back — exactly once, tracked so it can't double-fire.
A freshly connected shop starts in dry-run: every sweep writes this list and sends nothing, until you've read what would go and flip it to live yourself.
Swept hourly, from durable rows
The sweep re-reads jobs and invoices every hour rather than chasing events, so a missed event can never lose a conversion.
The 90-day click window, enforced
A conversion must land within 90 days of its click, and the sweep enforces that window on our side — an out-of-window click is never uploaded at all.
Dry-run first, live when you say
Uploads start in a log-only mode that shows exactly what would be sent. Live is a switch you flip after reading the list.
One revenue rule everywhere: the value uploaded is the same ex-tax figure this report and your Reports page count — so Google's own ROAS column finally reconciles with your books instead of arguing with them.
Attribution that tracks campaigns, not people.
The design rule underneath the whole system: remember what the click was, never who the person is. These aren't policy promises — each one is how the capture code is built.
Host and path, never the full URL
Landing context is stored as the page's host and path only — never a query string, which is where personal data hides. The referrer is kept as its host alone.
Nothing about the person
No pixels, no fingerprinting, no third-party scripts in your customer's browser. Click ids and UTM labels are campaign plumbing, not identity — and that's the entire vocabulary.
DNT and GPC are real switches here
A visitor whose browser signals Do Not Track or Global Privacy Control gets nothing persisted between pages. The form they choose to submit still works — attribution is a nicety, never a gate.
What goes to Google is three fields
A click-keyed conversion carries a click id, a timestamp and a value. No name, no email, no phone. Nothing raw about a person ever leaves the server on this path.
The fallback is consent-gated
When there's no click id but the lead verifiably came through the google channel, the conversion can be keyed by SHA-256-hashed email or phone instead — only for customers whose marketing consent allows it. No consent means no record at all, not a record with a flag.
Service VIN is not affiliated with, endorsed by, or partnered with Google. Your ad account stays yours; this report only reads it — the one write, conversion feedback, starts in dry-run and uploads nothing until you switch it live.
Seeing the truth is not the upsell.
You shouldn't have to pay extra to find out what you already paid Google. The measuring layer is included in every Service VIN plan — the paid add-on is only for acting on what it shows.
The measuring layer
- Connect your Google Ads account — read-only
- The import: about 2 years of campaign history, read into your reports
- The account audit — scheduled every Monday morning, plus on-demand re-runs whenever you want a fresh pass
- This Campaign ROI report: cost per booked job and true ROAS, per campaign
No add-on, no meter, no percentage of your ad spend. It's part of the plan you're already on.
Acting on it — Ads Autopilot
- Building Search and Performance Max campaigns from your real catalog
- The weekly optimizer actually making changes in your account, lever by lever, under your ceiling
- Audience sync — like the exclusion list that stops you paying for clicks from existing customers
There's deliberately no buy button for the add-on — turning it on is a conversation, and we enable it per shop. The free report gives that conversation its numbers.
What the first week actually looks like
The night you connect
The first import runs: your campaigns, their structure, and the newest slice of history.
Over ~3 nights
The full ~2-year backfill lands, 90 days at a time, up to 3 chunks a night — resuming mid-walk if anything interrupts it.
Once data is in
Run an audit on demand, and the scheduled one lands every Monday morning. Findings are arithmetic over imported rows — so the audit waits for the rows rather than performing an instant verdict.
From then on
Spend refreshes nightly — restating recent days as Google's own counts settle — and the conversion sweep runs hourly. A Sync now button exists for the impatient.
Want the whole loop — the audit, campaign building and the weekly optimizer? Read the Google Ads Autopilot page.
Google Ads ROAS for auto shops, answered
How is this different from the ROAS Google Ads already shows me?
Google's ROAS is computed from conversions it can see — form fills, button taps, call starts — valued however the tracking was configured. This report is computed from your shop records: spend from your ad account, leads and booked jobs from your own pipeline, and revenue as the ex-tax total of the paid invoices behind them. And because the conversion feedback loop sends Google that same ex-tax figure when an invoice is paid, even the ROAS column inside Google Ads starts reconciling with your Reports page instead of contradicting it.
Where does the revenue number come from?
From the same revenue rule every Service VIN Reports page uses, applied per campaign. Counted invoices only — void, refunded and soft-deleted invoices are excluded — at subtotal minus discounts, before tax. An accepted quote with any invoice is represented by that invoice; only an accepted quote with no invoice at all falls back to its own figures. Collected is the amount actually paid on those same invoices. Nothing is modelled, and there are no benchmarks or industry averages anywhere in the report.
What lands in the Unmatched row — and why not spread it out?
Google-shaped activity the campaign rows can't honestly claim: a click id that arrived with no campaign parameter, a campaign id older than the synced spend window, and recorded google-channel spend beyond what the campaign rows explain. It stays in its own visible row because spreading it across campaigns would make every campaign look slightly better than the data supports. The report states its own limits on the page, too — for example, a lead created before the range that converts inside it is counted by neither a campaign nor Unmatched.
Do I need to install a pixel or a tag manager?
No. Capture is first-party, on the surfaces where a visitor becomes a lead or a booking: your booking page, hosted and embedded lead forms, landing pages we host, and your own website's form — via a hidden-field snippet or simply the parameters on the request URL. There is no third-party script and no pixel; the 10-parameter allowlist is everything capture ever reads.
How soon after connecting do I see numbers?
The first import runs the night you connect, and the full ~2-year spend history lands over roughly 3 nights — it's read in 90-day chunks, up to 3 a night, and resumes where it left off if interrupted. The report fills in as data lands, spend refreshes nightly from then on, and the account audit runs Monday mornings — or on demand once your data is in. If you paste the ValueTrack suffix, new leads start carrying campaign ids the same day, before any import finishes.
What happens when an invoice is refunded or voided?
Two things, both automatic. The report stops counting it — the revenue rule excludes void and refunded invoices, so the campaign's revenue and ROAS drop to the truth. And if that invoice's value had already been uploaded to Google as a conversion, the next hourly sweep sends a retraction — exactly once, tracked so it can never double-fire. Your ads don't keep credit for money you handed back.
Is any of my customers' data sent to Google?
A click-keyed conversion carries a click id, a timestamp and a value — nothing about the person. The only fallback, for leads that verifiably came through the google channel without a click id, is keyed by SHA-256-hashed email or phone and is consent-gated: a customer without marketing consent produces no record at all. Uploads also start in a log-only dry run, so you can read exactly what would be sent before anything is. And to be plain: we are not affiliated with, endorsed by or partnered with Google.
What does the report cost?
No add-on — it comes with your plan. Connecting your Google Ads account read-only (integrations are included from Growth up, and the free trial includes everything), the ~2-year import, the weekly account audit and this Campaign ROI report don't cost extra. The paid Ads Autopilot add-on is for acting on what the report shows: building campaigns, letting the weekly optimizer make changes, and audience sync. Turning the add-on on is a conversation rather than a checkout — plan pricing is on the pricing page.
Close the rest of the loop
You can't pay staff with impressions.
You can pay them with booked jobs — and this report is where your ad spend finally gets measured in those. Spend, leads, booked jobs, invoiced revenue, collected cash: your numbers, from your records, checkable to the dollar.
14-day trial has everything, nothing charged for 14 days · The report needs no add-on · Nothing in your ad account changes
