Products/SEO engine
SEO engine
Programmatic SEO automation that shows you its working.
Programmatic SEO automation in FounderReply crawls a site, computes on-page metrics with no model in the scoring path, reconciles a per-page issue register, samples keyword positions, ingests Search Console where a property is connected, drafts competitor conquest pages, and submits new URLs to IndexNow.
Crawl and audit · Rank sampling · Search Console · PageSpeed · IndexNow · Runs on the five-minute cron
What it runs
Six loops, one measurable surface.
Most SEO products are a dashboard on top of a third-party index. This one owns its own crawl, its own metric set and its own writer, which is why an issue that appears here has a threshold you can read and a file you can open rather than a vendor score you have to take on faith.
Crawl and inventory
A site is inventoried from its own URL structure, then swept page by page. Each page is fetched twice — once rendered, once with JavaScript off — so the engine can see what a crawler without a renderer would get.
Twenty-five pages per site per sweep by default, never-crawled first and then stalest, re-crawled weekly. A budget is what keeps a cron tick cheap enough to run every five minutes.
Deterministic on-page metrics
Roughly thirty discrete values per page — title and description lengths, heading counts, word count, canonical, indexability, structured-data types, alt coverage, internal and external link counts.
No model sits in the scoring path. Every number is computed from the HTML, so it charts over time, reproduces exactly, and can gate CI. The qualitative layer is separate and optional.
Performance from PageSpeed
Field data from real Chrome users — p75 largest contentful paint, interaction to next paint and cumulative layout shift — alongside the Lighthouse lab run and its performance, SEO and accessibility scores.
Failing Lighthouse SEO audits are reconciled against our own computed metrics; a disagreement becomes its own issue rather than being quietly dropped.
Keywords and rank tracking
The tracked-keyword portfolio is seeded from the target keywords the blog engine already researched, then positions are sampled over time so movement is visible without anyone typing a keyword list.
Seeding costs no model call — it reads keywords that already exist. Sampling rotates least-recently-checked first, so a growing portfolio never starves its own newest entries.
Search Console ingestion
Connect a verified property and Google’s own record replaces the estimate: real clicks, impressions, click-through rate and average position per query, stored as ranking snapshots alongside everything else.
Scraped SERP positions are an estimate of where you rank. Search Console is a record of where you ranked. Where both exist the engine keeps them as separate engines rather than averaging them.
Conquest page generation
A competitor’s public URL structure is mined and bucketed by what part of a content strategy each path serves, then comparison, alternatives and migration articles are drafted with their own pages as citable sources.
Drafted with guardrails: sourced and dated claims, genuine credit where a competitor is better, never a self-declared number one. Published unlisted — out of the blog index, in the sitemap and the compare hub.
The check list
Every issue it can raise, and exactly what fires it.
Two dozen fixed codes across three severities, plus one dynamic family for Lighthouse’s own SEO audits. The thresholds below are the literal numbers in the analyzer, not a description of them — a title warns at 30 and 60 characters because those are the constants in the file.
| Issue code | Severity | Raised when |
|---|---|---|
| http_error | error | The page responded 400 or above. |
| title_missing | error | No <title>, and no og:title to fall back on. |
| title_too_short | warn | Title under 30 characters. |
| title_too_long | warn | Title over 60 characters. |
| meta_description_missing | error | No meta description at all. |
| meta_description_short | warn | Description under 120 characters. |
| meta_description_long | warn | Description over 160 characters. |
| h1_missing | error | The page has no h1. |
| h1_multiple | warn | More than one h1 on the page. |
| heading_hierarchy_skip | info | A heading level was skipped, e.g. h2 straight to h4. |
| thin_content | warn | Under 300 words of body text. |
| content_render_dependent | warn | Over 40% of the body text exists only after JavaScript runs. |
| canonical_missing | warn | No rel=canonical link. |
| canonical_mismatch | warn | The declared canonical is not the URL this path should claim. |
| jsonld_missing | info | No JSON-LD block on the page. |
| jsonld_invalid | warn | JSON-LD is present but does not parse. |
| og_incomplete | info | og:title, og:description or og:image is missing. |
| image_alt_coverage_low | warn | Under 90% of images carry a non-empty alt. |
| keyword_absent_title | warn | The page’s tracked target keyword is not in its title. |
| keyword_absent_h1 | info | The page’s tracked target keyword is not in its h1. |
| performance_poor | warn | Lighthouse performance score below 50. |
| cwv_lcp_poor | warn | Field largest contentful paint over 2500 ms. |
| cwv_inp_poor | warn | Field interaction to next paint over 200 ms. |
| cwv_cls_poor | warn | Field cumulative layout shift over 0.1. |
| lh_seo_* | warn | One code per failing Lighthouse SEO audit, minted from its audit id — the cross-check against our own computed metrics. |
How the 0–100 score is weighted
Weights sum to 100 and each verdict counts as pass, half a pass, or nothing. The weight vector is version-stamped into every stored audit, so revising the weights does not silently rewrite last quarter’s history. When PageSpeed has not run, performance scores as a neutral pass rather than dragging the page down for data that does not exist yet.
How a sweep runs
One tick, five bounded steps.
The whole engine is a cron job with budgets. Every stage is capped so a sweep stays cheap, and every substrate that is missing a key is a normal skip rather than a failure — an engine that halts because PageSpeed is unconfigured is an engine that stops running.
- 1
Step 1
Inventory
Our own site is enumerated from the stores that render its programmatic pages, so the inventory cannot drift from what actually ships. A customer site is discovered from its live URL structure instead.
- 2
Step 2
Crawl and measure
Up to twenty-five due pages are fetched rendered and again with JavaScript off, then run through the deterministic metric set and, where the quota allows, PageSpeed.
- 3
Step 3
Score and reconcile
Each page gets a 0–100 composite and an issue list. The register is reconciled rather than appended, so a fixed issue disappears instead of accumulating into a number nobody trusts.
- 4
Step 4
Sample and ingest
The twenty least-recently-checked keywords get a fresh position sample, and Search Console query performance is ingested where a property is connected — recorded as a separate engine, not blended.
- 5
Step 5
Write and submit
Gap-driven articles and competitor conquest pages are drafted, and anything that publishes is pushed to IndexNow so the Bing chain sees it without waiting for a crawl.
The same sweep, as MCP tools
Ten of the tools on the MCP server, so a sweep can be driven from an assistant or from your own code instead of the dashboard. Source: lib/mcp.ts.
The MCP server and APIPointed at us
The first site it audits is this one.
FounderReply’s own domain is a first-class site in the engine. Its inventory is enumerated from the same stores that render the pages — 18 programmatic pages across the industry, platform and audience axes, plus the guides, the subreddit cluster, the rival pages and the blog — so the crawl list cannot drift from what actually ships. The blog you are one click from is written, refreshed and submitted by the loops described above.
FAQ
What people ask before pointing it at a site.
Whether a model decides your score, what changes when Search Console is connected, what IndexNow actually buys you, and the question every SEO page dodges — whether any of this is a traffic promise.
What does programmatic SEO automation actually do here?
It crawls your pages on a schedule, computes about thirty discrete on-page metrics, emits a fixed set of issue codes with severities, scores each page out of 100, samples keyword positions, ingests Search Console where connected, drafts competitor comparison pages, and submits new URLs to IndexNow.
Does an AI model decide my SEO score?
No. The score and every issue are computed from your HTML by pure functions with fixed thresholds, so two runs of the same page produce the same number. The weight vector is stamped into each audit, which keeps historical scores comparable when the weights are revised.
Do I need Google Search Console connected?
No, but it changes what you get. Without it, positions come from sampling a live results page — an estimate. With a verified property connected, the engine ingests Google’s own clicks, impressions, click-through rate and average position per query, and stores those as a distinct source.
Does IndexNow get my pages into Google faster?
No, and anyone claiming otherwise is guessing. Google ignores IndexNow; it discovers pages through the sitemap and its honest last-modified dates. IndexNow feeds the Bing chain, which is what grounds Copilot, ChatGPT Search and part of Perplexity — increasingly worth having on its own terms.
What are conquest pages, and are they doorway pages?
They are comparison, alternatives and migration articles about named competitors, sourced from that competitor’s own public pages. They publish unlisted — kept out of the blog index but present in the sitemap and linked from the compare hub, because fully orphaned indexed pages are what the doorway policy targets.
Will this get me more traffic?
Nobody can promise you that, and this page will not. What the engine guarantees is measurement and execution: the same checks run on a schedule, issues appear and disappear as they are fixed, positions are sampled over time, and new pages get submitted. Ranking is Google’s decision, not ours.
Can I run the engine from my own tooling?
Yes. The audit, overview, issue list, keyword tracking, rankings, Search Console sync, site registration and conquest generation are all exposed as tools on the MCP server, so you can drive a sweep from Claude, Cursor or your own code rather than the dashboard.
Get started
Point it at your site and read the first audit.
Add a domain and the first sweep returns a scored page list with the exact issue codes above. No traffic promise, no vendor score — the thresholds are printed on this page and the numbers are yours to check.
Free to start · No credit card required · Deterministic scoring