← Writing

Why every idea on this site ships with a price on it

The validation engine behind thesahilraj.com — how one config file becomes a landing page that measures demand, not just curiosity.

I kill product ideas for a living now. On purpose.

The pattern I kept falling into: get excited, build for two months, launch to silence. The fix this site enforces is to reverse the order — every idea I have goes live as a landing page before any product code exists, and the page's one job is to measure whether anyone wants the thing enough to pay for it.

An idea page is data, not code

Each idea on this site is a single typed config file. The template engine renders the whole page — hero, pain points, how-it-works, pricing, email capture — from one object:

ideas/coles-specials.ts (excerpt)
export const idea: Idea = {
  slug: "coles-specials",
  name: "grocery.ai",
  status: "validating",
  hero: {
    headline: "Never miss a half-price on the stuff you actually buy.",
    ctaLabel: "Join the waitlist for early access",
  },
  pricing: {
    mode: "reserve", // capture the email AND the tier they clicked
    tiers: [
      { id: "free", name: "Free", priceLabel: "$0", /* … */ },
      { id: "pro", name: "Pro", priceLabel: "$4/mo", strikePrice: "$9/mo", /* … */ },
    ],
  },
  // …
};

Adding an idea is: copy the template, fill the config, drop a screenshot, push. Vercel deploys it and the homepage card appears automatically. About 30 minutes, which matters — validation only works if trying ideas is cheap.

Signups measure curiosity. Prices measure demand.

A free "join the waitlist" click is the weakest signal there is. So the pricing section on every page is a test, not decoration: real tiers, real intended prices, and every tier button records which price band the visitor clicked before asking for an email.

track("pricing_tier_click", { tier: "pro" }); // the money metric

Every event also carries utm_source / utm_medium / utm_campaign, captured on first touch and pinned for the session — so when I put $50 of ads behind an idea, each signup is attributable to the traffic that produced it.

The kill criterion is written down first

Each config carries its own gate, set before any traffic runs. The gate for grocery.ai looks like this:

In 2 weeks / $150 ad spend: keep only if ≥ 150 signups at ≤ $1 each AND ≥ 15% clicked the Pro tier. Otherwise kill and post the lesson.

Deciding the threshold before seeing the numbers is the whole trick. It's the difference between running an experiment and grading your own homework.

The first idea in the queue is a grocery-specials watcher for Coles and Woolies shoppers. If it dies, the post-mortem lands here.