SEO for Solos
usagentleads.comSold

USAgentLeads

USAgentLeads is a contact database of licensed US real estate agents, sold as per-state and national CSV exports with an API. It reached the same monthly revenue as Foreclosure Data Hub on roughly 130 indexable URLs rather than 2,100, which is the most useful single fact about it: page volume was not what produced the outcome.

Role
Sole developer, operator and author
Stack
Next.js App Router, TypeScript, PostgreSQL
Timeline
Launched, grown to $1,500 MRR in five months, then sold
130
Indexable URLs
12
schema.org types
$1,500
Peak MRR
5
Months to that MRR
From launch
$12,000
Sold for
Escrow record below

The site is still live at usagentleads.com, so everything described below can be checked against the running implementation.

usagentleads.com: Escrow transaction, completed: asset sale of the US Agent Leads business and the usagentleads.com domain for $12,000 under an Asset Purchase Agreement dated July 2026
usagentleads.com · Escrow transaction, completed: asset sale of the US Agent Leads business and the usagentleads.com domain for $12,000 under an Asset Purchase Agreement dated July 2026. Full size
usagentleads.com: Google Search Console, web search, 16 months to late July 2026: 183 clicks and 23.5K impressions from Google organic search, average position 19.7
usagentleads.com · Google Search Console, web search, 16 months to late July 2026: 183 clicks and 23.5K impressions from Google organic search, average position 19.7. Full size

The page tiers

50
State landing pages
50
State directory pages
6
Programmatic templates

What was actually built

Each section names the checklist group it belongs to. All 112 checks are free to read, with a verification command for every one.

01Programmatic pages

Free and commercial namespaces were kept separate

A free searchable directory lived at one path per state, and the commercial page lived at another. They targeted different intents and did not compete. The directory earned links and ranked for informational queries; the commercial page converted.

Collapsing the two into one URL is the obvious thing to do and it would have forced one page to serve two intents. It would have lost both.

02Programmatic pages

Substance per page instead of pages

The 50 state pages carried over 1,800 lines of hand-written per-state content. Each state had a unique market description, five named cities with a note on why those markets get segmented first, the real state licensing body deep-linked to its official licence search, a state-specific note describing the verification and dedup process, outreach angles, and extra FAQs.

Every field had a fallback generator, so a state added without hand-written copy still rendered coherent, non-empty sections rather than blank blocks. This is the detail most implementations skip, and then they ship a page with three empty sections on it.

Templates supply structure. A data file supplies substance. If the only variable in the template is the place name, the result is duplicate content with extra steps.

03Content and E-E-A-T

A heading skeleton where each section earned a different query

Rather than repeating the head term in every heading, each section targeted a different long-tail variant: the broader non-branded phrasing, the market description with the licensing authority, the sourcing methodology, the city-level breakdown, the persona question, the outreach angles, and the field-level specifics.

Keyword variation across headings did more here than keyword density ever did.

04Content and E-E-A-T

A keyword map in the repository

A version-controlled keyword map recorded one row per important URL: primary keyword, secondary keywords, search intent, and internal-link role. Each URL owned exactly one primary target.

It also recorded explicit cannibalisation rules about which phrases belonged to commercial pages and which to editorial, and it fixed the anchor text for recurring internal links so every page linked with the same phrasing.

This is the cheapest artefact in either repository and probably the highest return. It prevents the most common cause of stalled growth on content-heavy sites: two of your own pages splitting the signal for one query. No crawler will ever detect it for you.

05Structured data

Fewer schema types, completed properly

Twelve schema types against Foreclosure Data Hub's forty-two, at no measurable cost. What mattered was completeness on the types that actually carry rich results.

Every offer carried the validity date, availability, seller, shipping details and return policy. For a digital product these have to be declared explicitly as zero cost and zero days, and they are exactly the fields Search Console flags as missing on product results. The flag is easy to dismiss as noise until the result stops showing.

Live counts were passed into the schema factories, so the structured data and the visible text could never disagree.

06AI and answer engines

A quick answer block on every commercial page

A visually distinct answer block near the top of every state, comparison and guide page, with a documented contract: two to four factual sentences that stand alone without the surrounding page, so a featured snippet or a language model can lift them verbatim.

A state page's answer block packed the entire buying decision into one liftable paragraph: record count, email count, phone count, price, format, columns, guarantee and refresh date, all from live data.

This is the highest-return answer-engine change available to most sites and it is an afternoon of work.

07Measurement

Nothing dated was hardcoded

Four constants drove every date and count on the site: the current year injected into titles, a data-refresh label evaluated server side, a manually bumped content review date feeding the sitemap, and a per-post updated date from frontmatter.

The review date was deliberately manual. An auto-updating review date is a lie with a timestamp on it.

Titles said the current year without anyone editing 50 files each January.

08Crawling and indexing

Crawl depth was flattened deliberately

The footer linked all 50 state pages from every page on the site, so no commercial page was more than one hop from anywhere.

A related-states block was driven by a hand-built adjacency map of real geographic borders rather than an alphabetical fallback. Geographic relatedness is a genuine relevance signal and it matches how buyers actually expand territory.

Archive and taxonomy pages were set to no-index but still followed, which keeps the internal link graph that helps discovery while removing near-duplicate thin pages from the index.

What this build got wrong

Published on purpose. A case study that lists only wins is an advertisement, and these are the traps that recur on every site.

  • The instant-indexing job submitted the non-canonical host, so every submitted URL resolved through a redirect. It defined its own origin constant instead of importing the shared one.
  • Contact-count claims disagreed across the site: the homepage structured data carried an older figure than the layout, the machine-readable brief and the pricing copy. Inconsistent numbers between markup and visible copy invalidate rich results.
  • Counts in the machine-readable brief were hardcoded and drifted, because they were not regenerated by the job that synced the live counts.
  • Two utility pages carried no no-index directive and were not disallowed, so thin pages could leak into the index.
  • Directory pagination was client-side only, with no crawlable links beyond the first page.
  • Every non-blog URL shared one sitemap last-modified date, so the sitemap carried no per-page change signal.
  • The machine-readable brief was not referenced from robots.txt, so discovery depended on crawlers probing the conventional path.

The checklist behind this build is free

Everything above is described in the 112-check playbook, all of which is free to read. The agent skill is the version your coding agent runs: it audits your site against the same checks, reports what is missing, and implements the gaps one at a time.

Product analytics are optional. On the skill page, X advertising measurement is also optional and shares your visit and ad identifiers with X. Both are off until you allow them. Privacy policy.