Editorial checklist
What the schema refuses, what the template guarantees, and what is left for you to check before an alternatives roundup, a compare pair page or an article goes live.
Three layers stand between a draft and a page worth indexing. The schema and the guard refuse a thin page, the template renders the parts that are structural, and the rest is the author's judgement.
Refused by the schema
A page missing any of these is noindexed and rendered degraded until you fix it. It never fails the build.
| Template | Required |
|---|---|
alternatives | description, lastVerified, author, competitor.name and competitor.url, a verdict summary, and at least three items, each needing a product slug, a startingPrice (or factStrip), a bestFor (or features / pros) and a fallsShort (or cons). One roundup per anchor: index.md is yours, any other file needs competitor.external, plus competitor.slug for its table to lead with the anchor |
compare | Per product: name, url, tagline, bestFor, priceFrom, order, pros, cons, one facts band. A PAIR page additionally needs the quality gate - 10+ shared rows, an authored 3-line-per-side verdict, priceFrom both sides, lastVerified within 180 days on both. The optional index.md needs title, description, primaryKeyword, intro, 3+ criteria and 4-6 faq, or the hub drops back to a plain router |
| any | No reserved first slug segment, no index.md in an article section (its listing shadows the file), and no primaryKeyword another document in the same locale already claims |
In development a banner on the page lists its guard errors by name, and the build prints one summary line naming the offending paths. Two authoring errors are the exception and do fail the build, because each loses verified content silently: an alternatives page authoring its own matrix:, and a product or competitor.slug naming no fact sheet.
Guaranteed by the template
You never have to remember these; they render on every page.
- A That is us badge wherever your own product is one of the entries, and a byline carrying the year - no month reaches a reader, though the JSON-LD, sitemap and
dateTimeattributes keep their full dates. - Every published comparison page is linked from the hub, and each product's own pages hang in that product's block - so a link appears exactly when its page does and never outlives it.
- Proof sits beside the claim it supports. A block's heading never links out; the vendor's site is a named Visit link at its foot.
- FAQ answers are native
<details>, closed on the comparison pages and still in the HTML, so a crawler with no JavaScript reads them. - A CTA row pointing at
config.routes.pricingand contact in the hero, and a CTA card below the body.
Yours to check
features: { toc: true }. It is off by default on alternatives and compare pages.price: "Custom" with the drivers in includes; legacy plans in pricing.note.page document, and link every spoke to it rather than repeating it.lastVerified.Check your CDN or WAF does not block AI crawlers. robots.txt allows them and config.agents.crawlers names them, but neither can override an edge rule that returns 403 before the request reaches your app. Test with a request carrying the crawler's user agent against your production domain, not localhost.
Writing comparison pages
The editorial rules behind a compare or alternatives page - what a claim has to be sourced against, which pages are worth existing, the shape that earns citations, and the effort that does not pay.
AI
The config.ai product - a streaming chat assistant, cron-automated runs, and an act-on-your-app capability layer on the shared Hono backend, billed from credits or run on your users' own API keys.