📋

HouseHelperHub, the six plans

Private deliverable. Enter the hub password to continue.

That's not right. Try again.

← Back to the hub

HouseHelperHub, the six plans

Start with Plan 01. It takes two to three hours, needs no decisions from you, and fixes a claim on your live site that is not true.

Prepared 2026-08-01

These are the execution plans from the city pages research. They live in the repo at plans/ so any AI harness can pick them up, and here so you can read them.

Before anything else, three facts established this session

Your 382 pages are already indexed. Your robots.txt allows everything and declares your sitemap, so Google found them without a submission. There was never a button to press.

You have zero real signups. Your database holds 3 worker rows, all inserted in the same second on June 22, which is a seed script. Your job posts are two seeds plus the one you posted yourself on June 24. The "13 trabajadoras" on your homepage is workshop attendance, not registrations.

HouseHelperHub cannot have a Google Business Profile. Google names lead generation companies as ineligible and requires in-person customer contact. Your workers are each eligible for exactly what the brand is not.


HouseHelperHub plan, overview and sequencing

Written 2026-08-01, from eight parallel research threads. Full research https://annettethompson.com/hub/househelperhub-city-pages-research Status not started

The situation, in four facts

  1. The 382 pages are already indexed. robots.txt is Allow: / and declares the sitemap, so Google found everything without a submission. A site: query returns the Westminster landscaper page. This is not a decision pending, it is a state we are already in.
  2. There are zero real signups. The workers table holds 3 rows, all inserted in the same second on 2026-06-22, which is a seed script. job_posts holds 3, of which 2 are seeds and 1 is Annette's own test post from 2026-06-24. The "13 trabajadoras" on the homepage is workshop attendance, not registrations.
  3. HouseHelperHub cannot have a Google Business Profile. Google's eligibility guidelines name "lead generation agents or companies" as ineligible, and require in-person customer contact. The city pages were built to feed a profile that is not available.
  4. Most of the grid targets nothing. 15 of 35 city-plus-service phrases return no measurable search volume. The whole grid is worth an estimated 50 to 150 organic clicks a month.

The strategy in one line

Stop promising services we cannot deliver, shrink the indexed surface to what is true, put the workers into Google Maps instead of the brand, and recruit supply offline because that is the only thing that has ever worked for a marketplace at this stage.

Order of work, and why this order

# Plan Why it goes here
01 Emergency truth fixes Live pages state something false. Everything else can wait, this cannot.
02 Worker Google Business Profiles The only legitimate route into the Local Pack, and a recruiting asset.
03 Consolidate the page grid Cuts the doorway exposure before Google re-evaluates the domain.
04 Real local data Turns the surviving pages from cosmetically different to structurally different.
05 Spanish tier and supply Spanish is a supply asset, not an SEO asset. Fix the framing, then recruit.
06 Measurement Cheap tests that tell us whether any of this is working before we build more.

Plans 01 and 03 are the risk reduction. Plans 02 and 05 are the business. Plan 04 is the only one that is really about SEO, and it is deliberately fourth.

What we are explicitly NOT doing

  • Not submitting anything to a search engine. No IndexNow, no Search Console sitemap submission, no Bing. Google already has the site. Any future submission is a separate decision Annette makes herself.
  • Not creating a HouseHelperHub Google Business Profile. Not one, not nine.
  • Not building llms.txt, NLWeb, UCP or AP2. Google's own documentation states no special files or markup are needed for AI Overviews or AI Mode. Nothing consumes these for this use case today.
  • Not writing more city pages until the ones we keep have workers behind them.

Definition of done for the whole program

  • No live page claims a worker is available where none is.
  • Every indexed city-plus-service page has at least two real contactable workers.
  • The 13 workshop attendees have been contacted, and the ones who want it have their own Business Profile.
  • Search Console shows what real demand exists, measured rather than assumed.

Plan 01, emergency truth fixes

Priority do this first, before anything else Estimated effort 2 to 3 hours Owner Charlie, no decisions needed from Annette Status not started

Why this is first

Live, indexed pages state something that is not true, and a second block is the clearest possible signal of templated filler. Both are cheap to fix and both are currently visible to Google and to anyone who lands on the site.

Task 1.1, remove the false availability claim

The problem. public/locations/louisville-co/window-cleaning/index.html and every sibling page says:

Workers near Downtown Louisville and Main Street are ready to help.

There are no window cleaners in Louisville. There are no workers anywhere except three seeded sample rows. Google's published helpful-content self-assessment asks whether content contains "any easily-verified factual errors." This is one.

The fix. In scripts/generate_location_pages.py, replace the availability sentence with copy that is true and converts better because it is honest. Suggested English:

HouseHelperHub is new. Our first workshop brought together 13 cleaners in Boulder in July 2026, and we are adding workers weekly. Post your job and we will connect you as soon as we have someone in {city}, or sign up to hear when we do.

Spanish equivalent must be written natively, not translated, and must carry proper accents.

Acceptance criteria - No generated page asserts that workers are available in a city where the workers table has none. - The claim is generated from data where possible, so it cannot drift from reality again. - Regenerate all pages and confirm with a grep that the old sentence appears zero times.

Task 1.2, delete the four-times-repeated boilerplate

The problem. Every one of the 153 English pages carries this:

Homeowners. HouseHelperHub connects homeowners in {city} with experienced local workers for {service}. Renters. HouseHelperHub connects renters in {city} with experienced local workers for {service}. Busy Professionals. HouseHelperHub connects busy professionals in {city} with experienced local workers for {service}. Families. HouseHelperHub connects families in {city} with experienced local workers for {service}.

One sentence, four times, one word swapped. It adds no information and is the single most visible tell of generated filler on the site.

The fix. Delete the block entirely. Do not replace it with a different four-way split. If an audience section is wanted later, it needs four genuinely different sentences about four genuinely different needs, and that is Plan 04 territory.

Acceptance criteria - The block is gone from the generator and from all regenerated pages. - Word count drops. That is fine and expected. Shorter and honest beats longer and padded.

Task 1.3, noindex every page with no supply behind it

The problem. 382 URLs are indexed, and essentially none of them can fulfill their promise. Google evaluates site quality at the site level, so a large block of unfulfillable pages is assessed against a domain that has almost nothing else.

The fix. Add <meta name="robots" content="noindex, follow"> to every city-plus-service page that does not have at least two real, active, non-seed workers for that service in that city.

follow matters: it keeps internal link equity flowing and keeps the pages reachable for visitors. They stay on the site. They leave the index.

Given the current database, that means every city-plus-service page gets noindex today. The pages that stay indexed are: - the homepage - /homeowners - the worker-facing pages: registro, trabajadoras, sobre, comunidad, consejos and the 11 consejos articles - the Boulder city hub

Acceptance criteria - Every city-plus-service page carries noindex, follow. - The pages above do not. - sitemap.xml is regenerated to exclude noindexed URLs. A sitemap that lists noindexed pages sends Google contradictory instructions. - Verify live with a fetch on three pages after deploy.

Task 1.4, make the notification failure visible

The problem. worker/index.js notifyOwner() swallows every error:

} catch (e) { /* notification is best-effort; never break the request */ }

RESEND_API_KEY is set, so the function will attempt a send. But if the key is wrong, or annettethompson.com is not verified in Resend, or Resend returns any error, Annette gets nothing and never finds out. The design correctly avoids breaking signups; it incorrectly avoids telling anyone.

The fix. Keep the request-safety behaviour. Add observability: - Check the Resend response status and console.error on a non-2xx, so it appears in wrangler tail and Workers logs. - Log the failure to a small notification_failures table in D1 with timestamp, subject, and error, so a silent failure leaves a trace Annette can find.

Also verify the pipe end to end. Annette posted a job on 2026-06-24. Ask her whether an email arrived that day. If yes, the pipe works. If no, it has never worked and this task becomes urgent rather than housekeeping.

Acceptance criteria - A forced failure produces a log line and a database row. - A real test registration produces an email to [email protected].

Deploy procedure

MyExecAssistant must be clean and pushed first (the pre-deploy guard checks that repo, in a separate bash call from the deploy). Then GitHub, then Cloudflare:

set -a && . "$HOME/ClaudeProjects/MenopauseContentRepurposer/.env" && set +a
cd public && npx wrangler pages deploy . --project-name encasa-boulder --branch main

Wait 30 seconds, fetch live pages, confirm. Do not trust wrangler output alone.


Plan 02, Google Business Profiles for the workers

Priority second, and the highest-value item in the whole programme Estimated effort ongoing, roughly 30 minutes per worker Owner Annette, with Charlie preparing materials Status not started

The finding that drives this

Annette built the city pages to support a Google Business Profile. Google's Business eligibility and ownership guidelines list who cannot have one. Verbatim:

"Lead generation agents or companies" "Brands, organizations, artists, and other online-only businesses"

And the affirmative test:

"To qualify for a Business Profile, a business must make in-person contact with customers during its stated hours."

HouseHelperHub performs no services, takes no commission, and hands the customer to a worker over WhatsApp. It never makes in-person contact. There is no HouseHelperHub Business Profile to be had.

Even a compliant service-area business gets one profile, never nine: "If your business doesn't have a storefront with clear signage but travels to customers at their physical locations, you're allowed one service-area Business Profile."

The unlock

Each worker is individually eligible for exactly what HouseHelperHub cannot have. A woman who cleans houses and drives to her clients is precisely the service-area business Google's rules were written for.

This is better than a brand profile in three ways: 1. It is legitimate, so it cannot be suspended for ineligibility. 2. It puts real supply into the Local Pack, which is where 44 percent of local clicks go and where HouseHelperHub can never appear. 3. It gives each woman an asset she owns and keeps, whether or not she stays on the platform. That is a genuinely good thing to be able to offer, and it is a far stronger workshop pitch than a website listing.

Task 2.1, do not create a brand profile

Explicitly: do not create a Google Business Profile for HouseHelperHub. Not one, and not nine city profiles.

The risk, in Google's own words:

"If a merchant's account is restricted, all Business Profiles associated with that account will be suspended."

Nine profiles for cities with no premises would require a false address, which is the highest-ranked suspension trigger in Whitespark's 2026 risk table. A restricted Google account would also take down any worker profiles created from that account, which are the genuinely valuable asset. The upside is a Local Pack position proximity will not let us hold anyway.

Task 2.2, build the worker onboarding kit

Prepare a short bilingual guide, Spanish first, covering: - What a Google Business Profile is, in plain language, and why it is worth 30 minutes - That it is free, and that it belongs to her, not to HouseHelperHub - Eligibility: she travels to customers, so she hides her home address and sets a service area - Step by step with screenshots, in Spanish - What to put in the business name (her real business name, not keyword stuffing, which is a suspension trigger) - Choosing the primary category, which is the single strongest Local Pack ranking factor - How to ask a client for a review, and why reviews matter more than anything on a website

Acceptance criteria - A worker who reads only the Spanish version can complete setup unaided. - Every worker creates the profile from her own Google account, never Annette's. This is not optional; it prevents account-level cross-contamination and it means she truly owns it.

Task 2.3, run it at the next workshop

The 13 women who came in July are the warm list. Contact them, and make profile setup a hands-on segment of the next workshop: laptops open, profiles created in the room.

Acceptance criteria - All 13 contacted. - A count of how many now have a live profile. - Feedback captured on what confused them, folded back into the guide.

Once workers have profiles, each worker's page on HouseHelperHub links to her profile, and her profile's website field points back at her HouseHelperHub page. That is a legitimate mutual citation, it is exactly what a directory is supposed to do, and it makes HouseHelperHub structurally a directory rather than a service brand pretending to be local.

Open question for Annette

Would you rather HouseHelperHub eventually become a real brokerage, dispatching and standing behind the work? That would make it eligible for one Boulder profile with a hidden address and up to 20 service areas. It is a business model decision with real liability and operational consequences, not an SEO decision, and nothing in this plan depends on it.


Plan 03, consolidate the page grid

Priority third Estimated effort 4 to 6 hours Owner Charlie, with Annette approving the keep list Status not started

The finding

Live Google Ads volume for Colorado, across 35 Boulder County city-plus-service phrases:

  • 15 returned no measurable data at all, including "window cleaning superior co", "dog walker erie co", "gutter cleaning superior co", "pet sitter erie co", "house cleaning niwot co"
  • The 20 that register total roughly 1,400 searches a month
  • 60 percent of that sits in three cities across four services
  • That is an average of under 10 searches per page

Realistic organic yield from the entire grid at maturity: 50 to 150 clicks a month, because the Local Pack takes absolute positions one through three and a new domain lands below that.

The obvious alternative was tested and is worse. Consolidating into 9 city hubs plus 17 service pages targets phrases with even less demand: "cleaning services boulder county" returns no data, "boulder county house cleaning" returns no data, "home services longmont co" returns no data. Do not do that.

The rule

Build a city-plus-service page only where both are true: 1. The phrase has measured search demand, and 2. There are at least two real, contactable workers for that service in that city.

Today, condition 2 is false everywhere, so nothing is indexed. That is correct and it is Plan 01's job. This plan sets up what gets un-noindexed as supply arrives.

Task 3.1, the priority build list

By measured monthly volume. These ten cover roughly 80 percent of the addressable demand:

Page Volume
handyman Longmont 210
carpet cleaning Longmont 170
junk removal Boulder 170
house cleaning Boulder 140
house cleaning Broomfield 140
window cleaning Boulder 110
house cleaning Longmont 90
gutter cleaning Boulder 70
handyman Broomfield 50
dog walking Boulder 50

Note two things. First, handyman and junk removal are not currently services on the site, and they are the highest-volume demand in the county. That is a business question worth raising with Annette. Second, Boulder and Longmont dominate, which matches where the workers actually are.

Task 3.2, decide what happens to the other 133

Three options, and the answer can differ per page:

  1. Keep, noindexed. Useful to a visitor browsing coverage, invisible to Google. Cheapest, and the default.
  2. Fold into the city hub. The city page lists services with a short description each, rather than minting a URL per combination. Search Engine Land's guidance is explicit: if you cannot write something unique and useful per page, use a coverage map or locator rather than a URL.
  3. Delete with a 301 to the city hub. Cleanest for crawl budget. Only worth it if the page is genuinely never coming back.

Recommendation: option 1 now, because it is reversible and costs nothing, then option 2 for the long tail once the shape of real demand is known from Plan 06.

Task 3.3, add the guard to the generator

scripts/generate_location_pages.py already refuses to emit a description over 160 characters or a duplicate description. Add a third guard:

A page is emitted as indexable only if the worker count for that city and service is 2 or more. Otherwise it is emitted with noindex, follow.

This turns an ungovernable 382-page liability into a quality gate that opens automatically as the business grows, with no human remembering to do anything.

Acceptance criteria - The generator reads live worker counts, from the database or a generated JSON snapshot. - Regenerating with zero workers produces zero indexable city-plus-service pages. - Adding two workers to Boulder house cleaning and regenerating flips exactly that page to indexable.

The doorway test to apply before any page is un-noindexed

A doorway page is one that would be indistinguishable from another if the place name were removed.

Run it as a script. Strip the city name, diff against a sibling page, and require a meaningful difference threshold. Current similarity is 70 percent. Plan 04 is what moves that number.


Plan 04, make the surviving pages structurally different

Priority fourth, after the grid is cut Estimated effort roughly 8 hours total, mostly scripted Owner Charlie Status not started

The finding

A tiny local cleaner beats the marketplaces on the exact query shape we are targeting. casabellacleaning.co ranks fifth for "house cleaning services louisville co", above Molly Maid, Thumbtack and Homeaglow, with a 1,489-word page and zero schema markup.

Its edge is that 63 percent of its words are genuinely city-unique: named neighborhoods, housing stock, and local geography tied causally to the service. For example:

Louisville's 1,700+ acres of open space and 27 parks mean dust, pollen, and pet hair are a constant.

Meanwhile the marketplaces that rank do it on supply data. Rover: "The average cost for Dog Walking in Erie on Rover is $20 per walk." Care.com: "Find 75 affordable house cleaning options in Boulder, CO, starting at $23.54/hr."

We cannot publish supply data yet. We can publish local reality today, for free.

Task 4.1, pull the Boulder County Assessor data

Highest value per hour in the entire programme. Roughly 2 hours.

Boulder County publishes an ArcGIS REST server, no API key required, supporting server-side aggregation:

https://maps.bouldercounty.org/arcgis/rest/services

It returns, per city: average finished square footage, year built, bedroom count, and assessor-defined neighborhood names with parcel counts.

Verified figures:

City Avg sq ft Median year built Owner-occupied
Erie 2,326 2007 87.9%
Superior 2,240 1997 61.7%
Boulder 1,804 1978 47.9%
Louisville 1,740 1991 70.9%
Longmont 1,711 1990 62.6%
Lafayette 1,708 1993 66.7%

A 36 percent size spread between Erie and Lafayette, and cleaning is priced by square footage. That is load-bearing content, not decoration.

Coverage gap: the county server does not cover Broomfield, Westminster or Arvada, which are in different counties. Use the Colorado statewide parcel composite for subdivision names there (Broomfield 868 named subdivisions, Westminster 1,005, Arvada 1,999), and do not claim square footage for those three unless a source is found.

Write the output to a checked-in JSON file so the generator reads a snapshot rather than hitting the API on every build, and so the data is reviewable in a diff.

Task 4.2, neighborhood names

Real assessor neighborhoods with parcel counts, already verified: - Boulder, 30 neighborhoods: Table Mesa (1,983 parcels), North Boulder Park (1,678), Wonderland Hill (1,449), Columbine (1,392), Martin Acres, University Hill, Whittier, Devil's Thumb - Longmont, 14: Southwest Longmont (3,783), East Longmont (3,676), West Old Town, Southmoor Park - Lafayette, 10: Indian Peaks (2,866), Centaur Village (2,004), Old Town Lafayette (952) - Louisville, 10: Old Town Louisville, North Louisville - Superior, 3: Rock Creek (3,997), Old Superior (224), Sagamore (235)

Superior is essentially one neighborhood. 3,997 of roughly 4,300 residential parcels are Rock Creek. That is a true, specific, checkable sentence that no other city page can carry.

This alone kills the current one-landmark-per-city problem.

Task 4.3, the wage and regulation layer

Three different minimum wages across the nine cities, which is legally meaningful and serves both audiences: - City of Boulder: $16.82/hr in 2026, rising to $18.17 in 2027 - Unincorporated Boulder County: $16.82/hr, aligned by Ordinance 2025-001 - Longmont, Lafayette, Louisville, Superior, Erie: Colorado state minimum, $15.16 - Broomfield, Westminster, Arvada: different metro wage area entirely

BLS OEWS May 2024 medians, Boulder MSA versus Denver MSA:

Occupation Boulder Denver
Maids and housekeeping cleaners $18.50 $18.24
Landscaping and groundskeeping $22.55 $21.67
Childcare workers $20.54 $18.62
Janitors and cleaners $20.27 $17.95

This is genuinely useful to a worker deciding what to charge and to a homeowner deciding what is fair, and nobody else on these SERPs publishes it.

Task 4.4, climate and seasonal blocks

NOAA 1991 to 2020 normals, verified: - Boulder, 5,484 ft: last freeze May 4, first fall freeze Oct 6, 154-day growing season - Longmont, 4,950 ft: last freeze May 11, first fall freeze Sep 27, 138-day growing season

Fifteen miles apart, sixteen days different. Use one lawn schedule for both and you are two weeks wrong in one of them. That is a real reason a Longmont lawn care page differs from a Boulder one.

Watering rules differ by city too, though only Boulder and Westminster were verified from primary sources. The other seven need one manual lookup each and refresh every spring.

Task 4.5, the Marshall Fire, on two pages only

1,105 homes destroyed across Louisville, Superior and unincorporated Boulder County in December 2021. Louisville is roughly 90 percent rebuilt, Superior roughly 74 percent permitted.

That makes new-construction cleaning a real, specific service on exactly two of the nine city pages. Handle with care and without ghoulishness; these are people's homes.

Do not publish without a second source

  • The Longmont snowfall normal. NOAA returned 88.3 inches for Boulder and 32.2 for Longmont. That gap is implausibly large over 15 miles and the Longmont station may have incomplete snow records.
  • Any "average cost of house cleaning in Boulder" figure found online. Every one traces to a lead-generation site with undisclosed methodology. Do not repeat them as facts.
  • Erie data drawn only from Boulder County. Erie straddles two counties: about 5,791 parcels in Boulder County against 11,277 housing units town-wide, so roughly half of Erie is in Weld County.
  • ACS figures for Superior and Louisville new construction. ACS 2023 five-year shows Superior at 0.4 percent of housing built 2020 or later, which is plainly stale post-Marshall-Fire. Use assessor data instead.

Task 4.6, the price table we could actually own

The single best piece of content available, and it needs no new data source: survey the 13 workshop attendees and publish a sourced, dated Boulder County rate table for cleaning, by home size and service type, with the method stated.

Nobody local has published this. It is more honest than Care.com's black-box average, it is genuinely useful to both audiences, and it is the kind of thing other people cite, which is worth more than any markup we could add.

Acceptance criteria

  • A script produces a checked-in JSON snapshot of assessor, ACS, BLS and NOAA data per city.
  • The generator reads it and every surviving page carries at least three city-specific facts that are true and checkable.
  • Similarity between the same service in two different cities drops from 70 percent to under 40.
  • Every published figure traces to a source recorded in the repo.

Plan 05, the Spanish tier and actually getting workers

Priority parallel with everything else, because it is the real bottleneck Estimated effort ongoing Owner Annette, with Charlie building materials Status not started

The finding that reframes the Spanish tier

Live Google Ads volume, Colorado:

Query Monthly
limpieza de casas boulder no data
servicio de limpieza boulder co no data
jardinero boulder no data
trabajos de limpieza en boulder no data
busco trabajo de limpieza 10
trabajos cerca de mi 1,900

192 Spanish pages are aimed at demand that does not exist. The query Spanish-speaking workers actually type is one generic jobs search that a single page could own.

Boulder County has roughly 7,000 residents who speak Spanish and speak English less than "very well". Most of them are the supply side of this marketplace, not the demand side. Pew data shows US Spanish-language web consumption concentrates among recent immigrants, which maps onto workers and barely at all onto Boulder homeowners.

Translation is not duplicate content. Google states that outright, so that worry is off the table. What the Spanish tier does is double the count of thin pages, and the quality classifier counts pages, not languages.

Task 5.1, shrink the Spanish tier

From 192 pages to roughly 12 to 15: - One Spanish hiring hub for the two or three cities where workers actually exist - The worker hub (trabajadoras, registro, comunidad, sobre) - The 11 consejos articles, which are good content and should stay - One new page targeting "trabajos cerca de mi", which is the only Spanish query with real volume

Everything else gets noindex, follow alongside its English twin under Plan 01.

Task 5.2, fix the hreflang semantics

The en and es clusters currently pair pages that may serve different audiences. Google's hreflang applies to the same page in another language, not to different content for a different reader.

Check first, in ten minutes: read three Spanish pages beside their English twins. If the Spanish page is the English page in Spanish, the hreflang is correct and only the volume question applies. If it is genuinely worker-recruitment content, the pairing is a false claim and should be removed.

If they differ, split by purpose rather than by language: - Homeowner hiring content: /locations/... and /es/locations/..., paired to each other - Worker content: its own path, self-referencing hreflang, no false English pairing - x-default pointing at the English homeowner entry point

Google ignores or consolidates mismatched clusters, so the cost is wasted signal rather than a penalty. Worth fixing anyway.

Task 5.3, the actual supply problem

This is the part that matters more than every other plan combined.

Research finding: across 17 major marketplaces studied by Lenny Rachitsky, SEO "was a vital early demand growth driver for over 40%" but on the supply side "was only impactful for one company." Early supply came from door-to-door sales, Craigslist, and personal recruiting. Uber's launch teams went straight to Craigslist. GrubHub's supply growth was "all sales, door to door, walking into restaurants during their downtime."

Worker-side search volume in Colorado is effectively zero, which independently confirms it. Worker acquisition is a workshop-and-WhatsApp problem, not an SEO problem.

What actually works, in rough order: 1. Run the next workshop. Thirteen women came to the first one. That is the single most valuable thing that has happened to this business, and none of them are registered on the site. Start there. 2. Get those 13 registered, in the room, on their phones, with help. Do not assume they will do it later. 3. Ask each for two referrals. Referral is how this community actually hires and gets hired. 4. Church groups, school parent networks, laundromats, Nextdoor, local Facebook grupos. Note the Friendly Gringos group is Ajijic expat retirees and is not relevant here; this is a build, not a leverage. 5. Make registration take under three minutes on a phone, in Spanish, with no email required if WhatsApp is enough.

Task 5.4, close the loop on why nobody registered

Thirteen women attended a workshop in July. Zero registered. That gap is the most important unanswered question in this business, and no amount of SEO addresses it.

Possible causes worth asking about directly: - They were never asked to register, or not clearly - The form is too long, asks for things they do not want to give, or is confusing on a phone - They do not see the value yet, because there are no homeowners - Trust: putting a photo and phone number on a public website is a real ask for this community, and some may have immigration-status concerns about being publicly listed

Action: call or message all 13 and ask. That conversation is worth more than every page on the site.


Plan 06, measure before building more

Priority set up now, read in 90 days Estimated effort 1 hour to set up Owner Charlie to set up, Annette to review Status not started

Why

Everything in these plans rests on assumptions that can be tested cheaply. Testing them costs almost nothing and could save months of building the wrong thing.

Test 1, is there demand below the measurement threshold?

Assumption being tested: that Google Ads "no data" means genuinely no demand, rather than demand too small for the reporting threshold.

Method. Once supply exists, publish 10 pages across the demand spectrum: 3 high volume, 3 mid, 4 that returned no data. Leave them 90 days. Read Search Console impressions.

Why this works. Impressions register even at rank 40, so they reveal true query demand without needing to rank. Free.

Decision rule. If the no-data pages show meaningful impressions, the long tail is real and the grid deserves more pages. If they show near zero, the remaining pages should never be un-noindexed.

Test 2, has Google already judged the site?

Assumption being tested: that the current pages have not yet damaged the domain.

Method. Open Search Console, Pages report, and read the exclusion reasons by folder. Look for "Crawled, currently not indexed" and "Discovered, currently not indexed" concentrated in /locations/ and /es/locations/.

Why it matters. John Mueller, on what those states mean:

"If our systems are seriously worried about the quality of the website that they will reduce the number of pages at the index... we'll probably crawl a lot less. We'll index a lot less. And then you'll see things like crawled not indexed or discovered not indexed."

Decision rule. If a large share of city pages sit in those buckets, Google has already formed a view, and the noindex work in Plan 01 becomes urgent rather than precautionary.

Note: this requires Search Console access for househelperhub.com. Confirm the property is verified. If it is not, that is the first task, and it is free.

Test 3, can supply be recruited faster than pages can be built?

Assumption being tested: that supply is the binding constraint.

Method. Before building anything for a small-town service, try to recruit three workers for one specific combination, for example window cleaning in Superior.

Decision rule. If that takes more than two weeks, the page pipeline is running ahead of the business and should stop until it catches up.

Test 4, what is a click actually worth?

Assumption being tested: that organic traffic to these pages would convert.

Method. Spend $200 on Google Ads against three head terms for two weeks. CPCs in this market run $11 to $28, so that is roughly 10 to 18 clicks.

Why. It returns real conversion data in days instead of the six to twelve months organic would take, and it simultaneously prices the alternative channel. If paid clicks do not convert, organic clicks will not either, and the whole SEO program is misallocated effort.

This costs money, so it needs Annette's explicit approval before running.

Test 5, does the notification pipe work?

Assumption being tested: that Annette would find out if someone registered.

Method. RESEND_API_KEY is set on the Worker and notifyOwner fires on registration and job posting. But every error is silently swallowed. Submit a test registration and confirm an email arrives.

Also ask Annette: did an email arrive on 2026-06-24, when she posted her own job? That is a free retrospective test of whether the pipe has ever worked.

Decision rule. If no email arrives, Plan 01 Task 1.4 moves to the top of the list. A marketplace that cannot tell its owner someone signed up is broken in a way no page fixes.

The dashboard worth having

Once these are running, one weekly line is enough:

Workers registered: N. Job posts: N. Search Console impressions: N. Indexed pages: N of M.

If the first number is not moving, nothing else on this list matters.


Published to Annette's hub. Rebuilt from the source markdown, so edit the source and rerun rather than editing this page.