Manuel Porras

All work / Search-visibility audit

Case study · Agent-run pipeline

Where a local business is invisible on Google — measured, not guessed

A US marketing agency for home-service businesses wanted to show every prospect real Google visibility data instead of a generic SEO pitch — and to mail only businesses that genuinely underperform. The pipeline is run by a Claude Code agent; a person approves.

In short: A US marketing agency for home-service businesses wanted to show every prospect real Google visibility data and to mail only businesses that genuinely underperform. On an existing search engine, I built the audit pipeline, the domain matching, the accuracy checks and the reports; a Claude Code agent runs it and a person approves. Data cost is under $0.10 per company audit, 330 audits are logged, unresolved listings fell from 70 % to 20 %, and 41 of 44 mailed addresses were correct in the re-audit.

< $0.10data cost per company audit
330company audits logged
70 % → 20 %unresolved listings after switching the matching
41 / 44mailed addresses correct in the re-audit

The ask

The agency wanted to say “we already did the work on you” to every prospect: real Google visibility data per company. And it wanted a direct-mail campaign that only reaches shops that really underperform — a letter that says “you are invisible” to a business ranked first would be worse than no letter.

Two uses came out of it: batches from a bought list of around 800 HVAC businesses, and single reports on demand when the agency names a company.

The pipeline builds on an existing search engine. My part is the audit pipeline around it: domain matching, accuracy checks, gates and the reports.

The pipeline

company + website (or a list of ~800) Resolve the Google listingdomain → phone · name only goes to review DataForSEOorganic · maps30 + 8 searches SerpApiLSA rosterper city Human, 5 minin-market ad check+ Transparency Center HIGH · REVIEW · REJECT Three gates A · not already strong? B · address matches the live listing? C · really an HVAC business? → yield report, never the head count Report page + letterone page, mobile-first · PIN → booking fresh re-audit before shipping → back to measuring Run by a Claude Code agent session; parallel agents verify addresses; a person approves.
Rankings come from the scan, paid placements from a person in the market.
  1. Resolve. Match the company to its Google Business Profile — by domain, then phone. A name match alone only goes to review.
  2. Measure. DataForSEO for 30 organic and 8 map searches per company; SerpApi for the “Google Verified” (Local Services) roster per city; a homepage screenshot and an ad-tag check.
  3. Check ads by hand. Five minutes, from a connection in the prospect’s state, plus the Ads Transparency Center.
  4. Gate. Not already strong · address matches the live listing · really an HVAC business.
  5. Build. A one-page, mobile-first report — and for the campaign a personal landing page, a printed letter and a PIN.

Accuracy engineering

  • Name matching lied. In a dry run it would have told a shop ranked #1 in its own map box that it was invisible. Since then: domain or phone only; names go to review.
  • Resolve, then measure. Switching to map-based matching cut unresolved listings from 70 % to 20 %, with 80 % resolved.
  • A second engine where it counts. SerpApi rescued 13 of 25 remaining cases and found about 20 “Google Verified” providers per city instead of about 8 — including 6 advertisers the first engine had missed.
  • A tool that was measured and not used. An automatic extractor for city and services from the website reached only 32 % on the city and 3 % on services in a test with 35 cases. So keywords stay agent-assisted, from the website.

Empty in one engine does not mean absent.

What the machine cannot see

Local ads are usually shown only to people who are physically in the market. A scan from outside saw 0 ads in 22 searches; a check from inside the market saw 4 paid placements.

Instead of pretending, the pipeline has one deliberately narrow human step: five minutes, only for paid placements. The rule: scan for rankings, eyes for ads. And the report says “no ads observed”, never “no ads”.

Built is not the same as mailable

  • Three gates upstream drop strong performers, wrong addresses and non-HVAC businesses. Of 544 candidates, 213 qualified (39 %) — reported as yield, never as head count.
  • A freshness gate right before shipping removed 7 businesses whose new numbers would have made their letters wrong.
  • A re-audit after shipping, with parallel AI agents checking every business against the web, directories and its own website: 41 of 44 addresses correct. The 3 misses — old listings after a move or takeover — became a rule: three independent sources.

What a report looks like

One page: a verdict, four lane cards (organic, map 3-pack, paid ads, Google Verified), the map box for a money search with the business’s own position, the full keyword grid, the Google listing check and the review comparison with the map winners. No reconstructed search screenshots, no estimated revenue.

LaneSearches on page 1 / in the boxVerdict
Organic3 / 22Gap
Map 3-pack1 / 22Gap
Paid adsnone observedOpportunity
Google Verifiednot seenGap
Map box for “ac repair phoenix az”RatingReviews
1 · Competitor A4.91,212
2 · Competitor B4.8864
3 · Competitor C4.7530
… #9 · Acme Heating & Air4.896
Example report with invented data: “Acme Heating & Air (Phoenix, AZ)” does not exist; competitors and numbers are invented. Real reports name real businesses and are not public.

Economics and honest limits

Under $0.10 in data cost and a median of 113 seconds of machine time per company audit; 330 audits logged for $32.33 in total. Around 200 personal report pages built, around 100 letters shipped in five batches, and 11 single reports on demand — about $0.07 each plus roughly 10 minutes of human checking.

What it does not do:

  • No outcome data in the files — so this case study is about process, accuracy and cost, not ROI.
  • Keywords and service area are agent-assisted, not derived automatically.
  • One location per report, desktop rankings; no geo grid.
  • The ad check is manual by design; there is no revenue estimate.
  • No one-command orchestrator: a set of CLI scripts that the agent runs step by step.

Technology

Claude Code agentsPythonDataForSEO (SERP, Maps, Business Data)SerpApi (Local Services)PlaywrightGoogle Ads Transparency Center (manual)HTML reports