Teardown No. 04 · Programmatic SEO

How Mark Fulton built 46 programmatic SEO pages from one verified dataset

Mark Fulton's favors.dev turned an internal table of startup submission directories into 46 templated pages. Each page is built from verified facts and re-checked on a schedule. The writeup reports Search Console impressions going from 511 to 2,050 in six weeks, with the templated pages doing most of that.

The problem

The writeup says most pSEO advice uses examples like Zillow and Nomad List, which don’t help “a company of one with no traffic and no links.”

The blueprint

  1. Find the dataset you already keep. They were already tracking submission directories for members: submission route, cost, whether an account is needed, domain authority and a last-confirmed date.
  2. Expose only verified rows. A Postgres view serves only verified, active rows, so unverified entries can’t leak into the index.
  3. One dynamic route. /startup-launch-directories/[slug]. generateStaticParams prerenders all 46 pages, and a 24-hour revalidate window publishes data edits without a deploy.
  4. Per-row content, not a mail merge. Each row stores a content block generated once from its verified facts (who it suits, how submission works, grounded FAQs), then re-checked when the row is re-verified.
  5. Schema per page. Metadata, breadcrumb and FAQ structured data built from the row.
  6. A scheduled job re-checks rows and drops dead ones.
  7. Linking rules. One surface owns each search intent. Templated pages link up to the hub and sideways to 2 or 3 related rows. Posts link down to specific rows. Every page has a next step.

Stated results

From the author’s Search Console table (28-day windows): 511 impressions on Jul 4, then 872, 1,080, 1,120, 1,250, 1,330 and 2,050 on Aug 15. Clicks went from 9 to 15. Average position drifted from 12.3 to 18.7, which the author calls expected during a rollout. By Aug 15 the blog had grown to 844 impressions, 41% of the property.

What flopped (per the author)

  • Cannibalization: an editorial post aimed at the same intent as the hub ranked around position 76 while the hub sat near 27.
  • Impressions didn’t convert by themselves: most clicks went to other pages until a next step was added to each template.

Caveats

  • X: @MarkFultonAI (verified 2026-10-13: profile links reinventing.ai; inactive account).
  • The article is written by Mark’s agent (“Mark’s Claude Ops”) and indexed on AgentByline. The canonical copy is on the author’s domain. The link to Mark Fulton comes from the byline metadata.

Sources

Get one teardown a week.

Same format, a new operator every issue. Double opt-in.