Checkup Audit Plan

Plan · 2 Nov 2026 · Rachel and Roman

The checkup audit: from sign-up to report in 5 minutes

What checkup.romanlogic.com sends people after they type their business name. Fully automated, objective, built on Apify, and tested internally before the page goes in any bio.

Decided so far

Decided No generated website. It is too variable for a lead magnet. The audit is the product (Roman).
Decided The score is objective: fixed checks like alt text, keywords, phone number, speed. No judgment call decides a point.
Decided Data comes from Apify (Google Maps and Google Search scrapers), not DataForSEO, which was missing real metrics.
Decided In their inbox in about 5 minutes. The page and email already say this; the page is not linked from any bio until the audit can keep that promise.
Decided Internal testing first: it runs on real businesses we review before any stranger gets one.

What happens after someone signs up

Each step runs on Rachel's box beside the sign-up service. Timings are targets to measure in testing, not measurements yet.

Find the businessGoogle Maps scraper turns "Ruiz Electric, Tulsa" into its listing: website, category, address, rating, reviews.target 60 s
Check the websiteCrawl the homepage and up to 5 key pages, run the score checks and Google PageSpeed (mobile).target 60 s
ScreenshotsPhone and desktop shots of the homepage with numbered markers on the fixes, taken with headless Chrome on the box.target 30 s
CompetitorsMaps results for "[trade] near me" around their address: where they rank, who is above them, their ratings and review counts.target 60 s, runs with 2
SearchesThe local searches for their trade, from Google's own suggestions and related searches, checked against their site's text.target 45 s, runs with 2
Build the reportFill the sandstone report template at checkup.romanlogic.com/r/<id>.target 5 s
Email it"Your checkup is ready" from Roman with the score, the top 3 fixes and the link. Replaces today's confirmation email.target 5 s
Tell usThe shared group gets the score and a link to the report, so we see every one that goes out.instant

The website score, out of 10

One point per check, each a yes or no a machine can answer. The report shows every check, not just the total, so the score explains itself. Proposed list, for Roman to edit:

CheckPasses whenWhy a customer cares
Phone number up frontA tel: link or phone number is visible in the first phone screenMost callers are on a phone and will not scroll to find it
Loads fast on a phonePageSpeed mobile performance 50 or moreSlow pages lose callers before they load
Says where you workThe town or service area appears on the homepageGoogle and customers both need to know you serve them
Title names trade and townThe page title contains the trade word and the townIt is the blue headline people see in Google
Has a descriptionA meta description of 70 to 160 charactersThe grey text under that headline
Clear main headingExactly one H1 that names a serviceTells a visitor in one second what you do
Images described80% or more of images have alt textGoogle reads alt text; screen readers need it
Shows reviewsReviews or testimonials appear on the homepageProof before they call
Business details for GoogleLocalBusiness (or a trade subtype) schema presentHelps Google show your hours, area and rating
Secure and mobile readyHTTPS with a valid certificate, and a mobile viewport tagBrowsers warn people off sites without them

No website: the score says "no website" instead of a number, and the report leans on the Google listing, competitors and searches. The three fixes shown up top are the failed checks in the table's order, which puts the ones that cost calls first.

Where each piece of data comes from

NeedSourceNotes
The business, its listing, rating, reviewsApify compass/crawler-google-placesThe most used Maps scraper (46k users in 30 days). Charged per place found.
Competitors and rankSame scraper, searching "[trade] near me" at their addressTop 10 places; we show the top 3 and where they sit.
Searches people useApify apify/google-search-scraper (related searches, People also ask) plus Google's suggestionsNo search volumes on purpose: we only claim a search exists, never how big it is.
Site text, tags, schemaOur own crawler on the box (plain HTTP plus headless Chrome)Free and fast; Apify's content crawler only if a site blocks us.
SpeedGoogle PageSpeed Insights APIFree with a key.
Screenshots and markersHeadless Chrome on the boxMarkers drawn at the real position of the phone number, heading and so on.

Guard rails

Internal testing, before it goes in a bio

The test set: about 20 real businesses across trades. Some with sites we already know are good or bad, some with no site, one franchise, one with several locations, and one whose name is shared with another business.

The review page: one internal page listing every audit with each check marked right or wrong by us.

Go live when: every business is matched correctly, each check is right on at least 18 of 20, and 19 of 20 finish inside 5 minutes. Then the page goes in the bios.

Build order

1Find the business and score the website, as a command run on the test set. Output: the score table for 20 businesses.
2Screenshots with markers.
3Competitors and searches.
4The report page template, filled from 1 to 3.
5The internal review page and a full test round. Fix what it finds, run it again.
6Wire it to sign-ups: the queue, the "ready" email, the fallbacks and the group message. Then the bios.

Step 1 results, 2 Nov

Find the business (DataForSEO Maps) and score the website, run on the box on five real businesses. Every one finished in 14 to 27 seconds.

BusinessMatchScoreFixes it namedSeconds
Smith Central Heating and Air, Waynesvillehigh9/10Phone number up front (true: the first phone screen has no number or call link)16.7
Aspen Electrical Services, Tulsahigh8/10Has a description, Clear main heading14.2
Denver Roofers, Denverhigh8/10Clear main heading, Shows reviews23.1
Reliant Plumbing, Austinhigh7/10Loads fast on a phone, Clear main heading, Business details for Google27.2
Peppy Heating and Cooling, Boisehigh8/10Images described, Business details for Google15.8

Run it: ssh vps, then cd /opt/checkup && set -a && . ./checkup.env && set +a && ./venv/bin/python audit.py "Name, Town". Results land in /opt/checkup/audits/ with phone and desktop screenshots. Everything runs on the box, never a laptop. Fixed during the run: a business name with a comma in it ("Services , LLC") was read as the town.

Google Places API: setup checklist

The official source for the business lookup and competitors, to compare against DataForSEO in the test. About 15 minutes, in the Google account that owns RomanLogic's Google Cloud (the PageSpeed key's project can host it).

  1. Open console.cloud.google.com and pick the project (or create one, "romanlogic-checkup").
  2. Billing: link a billing account. Google requires it even for the free monthly usage.
  3. APIs & Services > Library: search "Places API (New)" and press Enable.
  4. APIs & Services > Credentials > Create credentials > API key.
  5. Edit the key. API restrictions: Restrict key, tick only Places API (New). Application restrictions: IP addresses, add 2.25.164.166 (the box).
  6. APIs & Services > Places API (New) > Quotas: lower the per-day request limit (for example 300 a day) so a runaway can't spend.
  7. Billing > Budgets & alerts: a monthly budget (for example $10) with email alerts at 50%, 90% and 100%.
  8. Add the key to .env as GOOGLE_PLACES_API_KEY=... and tell Claude: it goes to the box and runs beside DataForSEO on the test set.

Check the current free allowance and per-request prices on Google's Places API pricing page before raising the quota; they change.

Open questions