live

cretaprice.in: one car model, shipped behind a gate

Scoping, sequencing and gating a single-model car-price site from a 197-page topical map to a 199-URL launch in about 12 days, and what I chose not to build.

Started
Demonstrates
ScopingSequencingLaunch gatingData qualityDecision logsSEO

Open the live project →

The user and the job

Someone shortlisting a Hyundai Creta wants a number they can take into a showroom. What does this variant cost on the road in my city, and what changes if I pick the diesel, the automatic, or the trim one step up? Car portals answer that for hundreds of models at once. cretaprice.in answers it for one model and tries to cover every Creta price question a buyer searches: each trim, each fuel and gearbox, city and state on road prices, the EV and N Line, and comparisons against rivals.

I started it on 19 October 2026 as an experiment. The Phase 1 foundation was built on 20 October and the site went live, indexable, on 1 November.

The bet

motomotar taught me that on a young domain, pages with a hard data payload get crawled and pages repeating the rest of the web don’t. With cretaprice I reversed the order: dataset first, pages second, and no page indexable until every figure on it had been recomputed from that dataset. One model meant one dataset I could review row by row.

Scope came from a topical map built on 20 October: 197 pages (11 hubs and 186 articles), plus 9 rows marked retired that were never built. The map is generated by code, and its build stops before anything reaches the site if two titles collide or the link plan breaks its own cap.

Sequencing: no number before the data

The first build ran with no dataset at all. On the evening of 20 October I had every placeholder sentence removed, then every sentence a template wrote, then every mock figure. Templates printed headings and content slots and nothing else. A figure in content rendered as a marker, [figure: price], and the quality gate failed any indexable build in that state. Nothing on a page could be mistaken for a fact before a fact existed.

Data came next, staged for review before it was applied. The 36 state tax rows are the same rows motomotar’s calculators run on, confirmed and hashed, so a changed row fails an indexable build until someone confirms it again. A full dry run with the staged data passed 49 tests and scored 15 of 15 on the mutation suite. I approved it, and it went live in the data folder on 21 October. Pages were written after that.

What a page had to pass

The gate is code: figure recomputation, text scans, and a mutation suite that plants errors to prove the checks catch them. Anything countable belongs to code, the split I describe in hybrid LLM evaluation. Four rules shaped the product:

  • Refuse before guessing. Where a state’s data has no tax slab, the calculator refuses to quote. EV tables skip three states for that reason, and copy may not promise an EV result in every city.
  • No two city pages share a template. Each city has its own section plan. QA fails any two city pages with the same H2 sequence or the same opening frame once place names are stripped out.
  • Unmodelled charges silence claims. Surat, Rajkot and Vadodara levy municipal vehicle taxes the state rows don’t carry. Until each was researched, confirmed and hashed, those pages said nothing about the tax and made no price comparisons. All three were modelled by 28 October.
  • Discontinued trims leave the lists. Lists show current trims only. A lapsed trim keeps its own page, with an on road price calculated from its last listed price and labelled.

What I chose not to build

  • A city switcher everywhere. The on road hub got one at my request. It rewrites only the variant table in the browser and the HTML stays Delhi, so the gate’s recomputation is unaffected. A test checks all 286 cities against the server’s figures. Other pages wait until I’ve seen this one working.
  • Per-section sitemaps. My own standards say to split them. At 199 URLs one file is enough, and I overrode the standard.
  • Three agent proposals. On launch day I approved four changes from an evidence-graded SEO checklist and let three agent suggestions through only if they held up. None did. Shorter titles went against the checklist’s own controlled evidence, and moving comparison verdicts up would have ended those pages on a table.
  • Silo retargeting. More posts aimed at the two head terms wait until Search Console data can show where they belong.

The launch gate

The domain was bought on 31 October. An indexable build runs stricter checks than a preview. Only cretaprice.in serves pages as indexable. The Cloudflare alias and preview hosts send noindex, checked by hand at launch, and the alias redirects to the domain.

Before launch the metric I steered by was the gate itself, pass or fail, because no other number meant anything before Google had seen a page. Keyword coverage was graded instead. On 31 October a term-coverage run across all 56 city pages, plus home and the hub, took flagged failures from 540 to 331. I didn’t chase zero. Those counts are guidance under the site’s standards, and the rule that a city fix must never read as a word swap outranked them. Five agents drafted edits for about ten cities each outside the repo, a lead session reviewed every claim before applying it, and a frame check across all 56 pages caught shared sentence patterns.

On 1 November all 199 URLs went to IndexNow once. Since then each deploy submits only pages whose last-modified date changed, after smoke tests pass.

I skipped four items at launch, by choice: a rollback drill, a data-gate sign-off, a five-user check and an image review.

Where it stands

Every page in the registry is built. The sitemap matches the built pages exactly, 199 of 199. I ran the build as product owner over several parallel AI coding sessions. They brought me choices as batched options with a recommendation, and their own ideas waited as proposals for my approval. By launch the decision log ran to 65 entries.

Two shortcuts belong in this record. For the last five pages I relaxed the evidence holds, keeping only the floor that every figure sits in the ledger with a date, and with those pages the registry was complete. And on 28 October I delegated the remaining open calls to the agents. It has been live for under a week, and I’m keeping its traffic numbers private.

Decisions I’d defend

  • Build on an empty dataset first. If a template can’t write a sentence, it can’t write a wrong one.
  • Refuse a figure rather than estimate one. A missing figure costs one answer. A wrong one costs trust in every other page.
  • Enforce uniqueness in QA. A rule against templated city pages only holds if the build fails on it.
  • Index one host only. Previews and aliases stay noindex.
  • Submit everything once, then only diffs.

What I’d do differently

  • Put term targets in the briefs. The city pages were written between 22 and 27 October, and the coverage pass ran on 31 October. Targets belong in the brief, before drafting.
  • Run the five-user check before launch. The gate proves the numbers are right. It can’t tell me whether a buyer finds the number they came for.
  • Keep the evidence holds to the end. Relaxing them got the last five pages built. I’d rather have launched without those pages than with a looser bar on them.

Every date, count and decision above comes from the project’s own records: its decision log, handoffs and session memory.