Ad spend vs. revenue tracker
Which city is your ad money actually working in?
Our carpet cleaning client runs Google Ads and Local Services Ads in a lot of cities. Each ad account will happily report clicks and "conversions." None of them can tell you that one city turns $3,000 of ads into $20,000 of work and another barely breaks even.
This tracker pulls yesterday's spend from every account each day, lines it up with completed job revenue, and shows the answer by city.
- Built for
- A carpet cleaning franchise, several insurance agencies, a wedding venue
- Status
- Live, updated daily
You: Why is City C so low?
Tracker: Spend is up 22% since the 1st, but average job size dropped from $214 to $151. More small rug jobs, fewer whole-house cleanings.
Daily
spend pulled from every ad account
By city
cost per lead and return on ad spend
3
ad platforms: Google Ads, LSA, Facebook
1 table
spend and revenue joined by city and day
Two sources that never talk to each other
The whole trick is a daily join. Spend comes from the ad platforms, revenue comes from completed jobs, and both get lined up by city and date. Once they're in one table, the questions owners actually ask ("should I pull back in this market?") take seconds instead of an afternoon in spreadsheets.
Where the numbers come from
What you spent
Google Ads
Local Services Ads
Facebook Ads
What you earned
Completed jobs
Joined
One table: spend and revenue by city, by day
See
Dashboard
Ask
Plain-English questions
What the owner opens in the morning
Spend and revenue for every city on one screen, the cities that aren't paying for themselves marked in red, and a box on the side for the question the table doesn't answer yet.
Spend vs Revenue
Google Ads + LSA · all cities
Ad spend
$15,280
Job revenue
$72,340
Return on ad spend
4.7x
Cost per booked job
$59
Daily, last 30 days
By city
| City | Spend | Revenue | ROAS |
|---|---|---|---|
| Riverton | $4,120 | $23,810 | 5.8x |
| Lakeview | $3,380 | $15,240 | 4.5x |
| Oak Hollow | $2,910 | $6,120 | ⚠2.1x |
| Cedar Falls | $2,240 | $12,960 | 5.8x |
| Brookside | $1,650 | $11,870 | 7.2x |
| Pine Ridge | $980 | $2,340 | ⚠2.4x |
A demo copy of the real dashboard. Cities and numbers are made up.
It grew into other tools
The carpet cleaning client's CSR call audit report now lives in the same dashboard. We also built a market view next to it that plots spend against booked leads for each market, to check whether more spend actually bought more leads.
That's the usual pattern. The first dashboard answers one question. Then the owner starts asking it others.
What it runs on
- Google Ads API
- Local Services Ads
- Supabase
- Next.js on Vercel
- Claude (Anthropic)
Questions we get about this one
Isn't this what Google Ads reporting is for?+
Google Ads knows what you spent and what it counts as a conversion. It doesn't know that the conversion turned into a $90 rug job instead of a $400 whole-house cleaning. That second part lives in your field software, and that's the part that tells you whether a city is worth the money.
Can the chat box make up numbers?+
It writes a database query and answers from what comes back. If the data isn't there, it says so instead of guessing.
Who is this for?+
Anyone spending real money on ads in more than one place. We've built versions for a multi-city carpet cleaning company, several insurance agencies and a wedding venue. The insurance versions are simpler: spend, clicks and conversions by date range, on one screen the agent can check from their phone.
More things we've built
See allWant one of these for your shop?
Most of what's on this page started as a 30-minute call about something that was bugging the owner. Tell us what's bugging you.