In the prequel, Claude API Revenue Models Compared, I walked through the four pricing models you can build on top of Claude API. This article picks up where that one left off: how do you actually go from zero to paying customers in three months?
I've been shipping indie apps since 2014. There were stretches where AdMob alone paid me a comfortable living, and other stretches where I had to learn lessons I now wish someone had taught me. AI API products are similar to traditional SaaS but not the same — token cost is always running in the background, which changes how fast you have to make decisions and how much sunk cost you can afford to absorb.
This guide is the roadmap I'd follow if I had to start over today. Each phase has a concrete deliverable so you can pace yourself.
Why 2026 is the right window for indie Claude builds
Since Claude Sonnet 4.6 and Opus 4.6 shipped, my real-world API cost per useful task is meaningfully lower than a year ago. At the same time, the consumer habit of paying for small AI subscriptions is now mainstream — a few dollars a month no longer feels strange to pay.
Anthropic itself sells Pro and Max plans directly to consumers, which on the surface looks like more competition for indie developers. But it's actually good news: market expansion, more buyer education, and more relevant search volume.
Three things have aligned simultaneously: costs are falling, buyers are educated, and tooling is mature. Miss this window and the next year will be dominated by big-SaaS plays. There's a real argument for moving now.
Phase 1 (Day 1–15): Shrink the idea until people will pay
Spend the first two weeks on idea selection only. Resist the urge to write code. My first SaaS got two weeks of code before I'd validated the audience, and the product never recovered.
Three traits of a good seed idea
- The output has objective right and wrong. Translation, summarization, proofreading, formatting — Claude is strong here, and users can judge value at a glance.
- It completes in a single request. Multi-turn conversations multiply token cost and support load. Start with one-shot tasks.
- There is existing search demand. Use Google Keyword Planner or Trends to confirm at least 500 monthly searches for the core phrase.
Questions I ask myself
- Can I picture a specific moment when I would pay for this? Not "users would pay" — would I?
- Are there 3–5 existing competitors? Zero competitors usually means zero demand, not blue ocean.
- Do their reviews share the same complaint? That complaint is your wedge.
Day 15 deliverable
- One- or two-sentence product pitch
- A specific persona — I literally pick a friend who'd buy it
- 3 competitor URLs with notes on each one's gap
- Pricing hypothesis (model + initial number)
If you don't have all four after two weeks, do not start Phase 2.
Phase 2 (Day 16–30): Ship the smallest possible wrapper in two weeks
People burn weeks on stack selection. The minimum viable Claude wrapper is shockingly small. Use this stack and don't argue with yourself.
Recommended stack for indie devs
- Frontend: Next.js 16 + TypeScript (App Router)
- Hosting: Cloudflare Workers + OpenNext, or Vercel
- DB: Cloudflare D1/KV or Supabase free tier
- Auth: NextAuth.js with Google sign-in only
- Payments: Stripe Checkout
- AI:
@anthropic-ai/sdk
You can ship this in well under 1,000 lines of code. My own sites run essentially this stack.
Minimal API route
// app/api/generate/route.ts
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
export async function POST(req: Request) {
const { input } = await req.json();
// 1. Auth and quota
const user = await getUserFromSession(req);
if (!user) return new Response('Unauthorized', { status: 401 });
const ok = await checkUserCanGenerate(user.id);
if (!ok) return new Response('Quota exceeded', { status: 402 });
// 2. Claude call
const message = await client.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
messages: [{ role: 'user', content: input }],
system: 'YOUR_PRODUCT_SPECIFIC_SYSTEM_PROMPT',
});
// 3. Record usage
await recordUsage({
userId: user.id,
inputTokens: message.usage.input_tokens,
outputTokens: message.usage.output_tokens,
model: 'claude-sonnet-4-6',
});
return Response.json({ result: message.content[0] });
}What's not in this snippet — retries, streaming, tool use — belongs to Phase 4 or later. Don't add it yet.
Day 30 deliverable
- One-page app with a working input form and result view
- User auth
- Free tier capped at 5 uses per day (just a counter in DB)
- No payments yet
If two or three friends can use it without you sitting next to them, Phase 2 is done.
Phase 3 (Day 31–45): Stripe integration and revenue funnel
This is where indie products live or die. The shape of your Stripe setup determines how heavy ops will feel for the next year.
A three-tier launch structure
Offer three options side by side from day one.
- Tip / one-shot ($1.50–$1.99) — try once, low commitment
- Pro (monthly) ($5–$8) — use a few times a month
- Premium (lifetime) ($15–$30) — long-term users, subscription-averse
You won't know the right number on day one. Phase 5 will tune it. Just ship reasonable numbers now.
The Stripe Checkout pattern that matters
Use price_data + product_data so the Checkout page shows a localized name, description, and image. This is what makes an indie product look professional at the moment money changes hands.
const session = await stripe.checkout.sessions.create({
mode: planType === 'one-shot' ? 'payment' : 'subscription',
line_items: [{
price_data: {
currency: locale === 'ja' ? 'jpy' : 'usd',
unit_amount: priceMap[planType][locale],
recurring: planType === 'monthly' ? { interval: 'month' } : undefined,
product_data: {
name: productNames[planType][locale],
description: productDescriptions[planType][locale],
images: ['https://yourdomain.com/images/stripe-product.png'],
},
},
quantity: 1,
}],
metadata: {
userId: user.id,
planType,
// Without plan_type in metadata you can't branch tip vs subscription
// in the webhook. Critical.
},
success_url: `${origin}/${locale}/articles/${slug}?thanks=${planType}`,
cancel_url: `${origin}/${locale}/articles/${slug}`,
});Always set metadata.plan_type. I forgot this on my first build and accidentally granted Premium to people who only sent a tip — visible in production. Don't repeat my mistake.
Webhook flow
const event = stripe.webhooks.constructEvent(body, sig, secret);
if (event.type === 'checkout.session.completed') {
const session = event.data.object;
const planType = session.metadata.plan_type;
const userId = session.metadata.userId;
switch (planType) {
case 'tip':
await recordTip({ userId, amount: session.amount_total });
break;
case 'one-shot':
await grantOneShotAccess({ userId, productSlug: session.metadata.productSlug });
break;
case 'monthly':
case 'lifetime':
await grantPremium({ userId, plan: planType });
break;
}
}Day 45 deliverable
- All three plans working end-to-end
?thanks=...parameter triggers a thank-you banner- Paywall (preview a portion of the content)
- Stripe-managed receipts via email
Phase 4 (Day 46–60): Build your first traffic with SEO
Until now, you've been building with no audience. Now they have to find you.
The order I'd follow today
- Rewrite your homepage to lead with a problem, not a feature. People don't search for product names; they search for situations.
- Publish 5 how-to articles that demonstrate your product on real, specific tasks.
- Publish 3 honest comparison articles. I always include cases where competitors are better — this is what builds trust.
Article template I use across four sites
- H2 1: A specific situation the reader is in (not a feature name)
- H2 2: Why the obvious approach falls short
- H2 3: How to solve it with your product, including code
- H2 4: Output and limits
- H2 5: Alternatives, including competitor mentions
This pattern reads well to both Google and humans, and it shortens the psychological distance to a purchase decision.
After publishing
Don't ship and forget. Open Google Search Console daily. Within a month you'll find queries with impressions but no clicks. Rewrite those titles and meta descriptions. In my experience, rewriting outperforms writing new articles for the first three months of SEO.
Day 60 deliverable
- Problem-driven homepage copy
- 5 how-to articles, 3 comparison articles
- Search Console connected
- 100–500 monthly organic visits if you're lucky
Phase 5 (Day 61–75): Subscription tuning and price tests
Your first revenue should be visible by now — typically a few hundred to a couple thousand dollars in the first month. That's normal. The work now is compounding it.
Practical price testing without A/B tools
You don't need split testing infrastructure. Do this instead.
- Move Premium up or down by $5 every two weeks and watch new purchase rate vs. churn.
- Run a "thank-you price" banner offering Premium at a discount for one to two weeks. On my own sites this lifts conversion roughly 1.5×.
- At month three, raise the Pro plan's monthly token cap and start selling top-up packs to existing heavy users. This unlocks revenue from your most engaged 5% without alienating anyone.
Practical churn-reduction patterns
Three I implement on every product:
- Offer a "remind me a week before next renewal" email. A surprising number of cancellations are people who simply don't want to be surprised. Removing the surprise removes the cancellation.
- Pause instead of cancel. Stripe's
pause_collectionlets you offer a 1–3 month pause as a softer option in the cancel flow. - Grant a 7-day grace period after cancellation. This makes them mildly miss it, which brings some back.
Day 75 deliverable
- Two price-test cycles done
- Thank-you-price campaign live
- Cancellation flow with pause and grace period
- $300–$800 monthly revenue, on the lucky end
Phase 6 (Day 76–90): Operations and the budget for your own mind
The last two weeks are about you, not the product. This is the most overlooked and most decisive part of indie development.
Track three budgets, not one
Once a month I review:
- Money: revenue − Anthropic costs − Stripe fees − infra = net
- Time: hours per week (bugs, support, marketing all count)
- Mind: when you wake up and see the product's notification, does it spark, neutral, or dread?
If net stays the same but mind drifts toward dread, that product is dying whether the spreadsheet knows it or not. I once shut down my highest-net product because of this.
Set the exit line in advance
This is the part most indie devs skip and later regret. Pick rules now, when you're calm.
- If monthly net falls below infra cost for three consecutive months → exit
- If weekly ops time exceeds 10 hours for three consecutive months → exit
- If "dread" answer to the mind question lasts a month → exit
Pre-committed exit lines are how indie developers stay sane long term. The willingness to fold is what lets you keep playing.
Day 90 endpoint
- A clear sense of your sustainable pace
- Operations under 30 minutes/day
- A money / time / mind dashboard you actually look at (mine lives in Notion)
Three traps I learned the hard way
A short, sharp list before we close.
Trap 1: Promising "unlimited" in any form
Anthropic itself doesn't offer unlimited. Phrases like "fair-use unlimited," "soft caps," and "essentially unlimited" all attract the wrong users. Just publish a specific monthly token cap and a clear top-up flow. Friction wins.
Trap 2: Not migrating models
Claude releases a new tier roughly every six months. New models are usually cheaper and better. Auditing the model name in your production code every quarter often improves margin 10–20% with zero risk.
Trap 3: Doing this alone
The biggest enemy of indie work is loneliness. I once went three months without showing progress to anyone, and almost gave up entirely. Even just one person you message your weekly progress to changes everything. I personally use X and note as my outlet.
The 90-day roadmap is one shortest path, not the only one. If you have a day job, doubling everything to 180 days is completely reasonable. Sustainability beats speed every time.
My first AI API product took more than six months to reach a real monthly income. The next one took two months to hit the same number, because everything I'd learned compounded. The unfair truth of indie work is this: only the people who finish the first one get to keep playing on their own schedule.
Start tomorrow. Open a notes file and write Phase 1, day one. A week from now, you will have moved.