Is your vibe-coded AI app ready for paying users?
The AI-specific checks before you charge users: spending caps, AI calls nobody pays for, version tags, and a record of which AI results worked and their cost.
Free. Runs in your browser. No sign-up.
0 of 20 done
Tick what your app already does. Your ticks are saved in this browser only.
Cost and abuse
0 of 5 done
One user, or one script using a stolen login, can call your AI endpoint thousands of times overnight. A daily cap per user turns a surprise bill into a polite error.
Ask your coding agent
Add a per-user daily spending cap for AI calls. Before every AI provider call on the server, add up that user's AI cost for today from the database. If it's over the cap (one config constant, start at $2), don't call the provider: return a clear error saying the daily limit was reached and when it resets, and show that message in the UI.
A spending cap works per day; a rate limit stops a burst in seconds. Without one, a stuck retry loop or a bot can drain your provider credit before any cap kicks in.
Ask your coding agent
Add rate limiting to every server route or function that calls an AI provider. Limit by user id, and by IP address for signed-out requests, for example 10 requests per minute. Store the counters somewhere shared across server instances, not in memory. Return HTTP 429 with a message saying how long to wait, show it in the UI, and list the routes you protected.
Any key that reaches the browser can be copied from the network tab and used to run up your bill. Environment variables with a public prefix end up in the browser bundle.
Ask your coding agent
Check that no AI provider key (OpenAI, Anthropic, Google, OpenRouter, Replicate, fal or similar) can be read in the browser. Search the code and env files for keys used in client code or exposed with a public prefix such as NEXT_PUBLIC_ or VITE_. Move every AI call into a server route or server function that reads its key from a server-only environment variable. Then tell me which keys were exposed so I can rotate them.
Every retry that reaches the provider is billed. A capped retry and a timeout mean one bad request costs a few calls, not hundreds.
Ask your coding agent
Find every place the app calls an AI provider and make retries safe: at most 2 retries with exponential backoff, only for timeouts, rate limits and 5xx errors (never for 4xx errors such as bad requests or content-policy refusals), plus a timeout on each call. Make sure the frontend doesn't retry on top of the server. List each call site and what you changed.
Your own caps can have bugs. A budget alert or hard limit in each provider's dashboard is the last thing between a bug and a bill you can't pay.
Ask your coding agent
List every AI provider this app calls. For each one, tell me where in its dashboard I can set a monthly budget alert or a hard spending limit, and suggest a limit based on our code: which models we call and how many calls one user action makes. Don't change any code.
Charging for AI use
0 of 4 done
AI calls pile up as an app grows: a query rewrite here, a safety check there. If you charge credits or usage, each call is fine if you decided it should be free, and a leak if nobody decided.
Ask your coding agent
List every place this app calls an AI provider, including background jobs, query or prompt rewrites, moderation, classification and retries. For each one, tell me whether the user is charged for it and how much, and flag any call that's free by accident. Add a short comment next to each call that's free on purpose saying why, and charge for the rest using our existing credit or usage system.
If the browser deducts credits, anyone can skip that step. If you deduct before the call, every failure becomes a support ticket.
Ask your coding agent
Move all credit or usage deductions to the server. For each AI action, check the user has enough credits before calling the provider, then deduct only after the result is produced and saved, in the same database transaction as saving it (or reserve the credits first and release them on failure). The client must never send the amount to deduct or write to the balance directly, and database permissions must stop users from updating their own balance.
Providers time out, refuse requests and return empty or broken results. Charging for those feels unfair to users and invites chargebacks.
Ask your coding agent
Make sure users are never charged for a failed AI call. If credits are reserved or deducted before the call, refund them automatically when the call errors, times out, is blocked by the provider's safety filter, or returns an empty or unusable result (for example invalid JSON, a blank image or a cut-off reply). Record each refund with its reason, and tell the user the attempt failed and they weren't charged.
A double click or a network retry can send the same request twice. Without a request id the server can recognise, the user pays twice for one result.
Ask your coding agent
Make AI requests idempotent. Have the client create a unique request id for each user action and send it with the request. On the server, store it with the charge, and if the same id arrives again, return the existing result instead of calling the provider and charging again. Also disable the button that started the request while it's running.
A record of every AI result
0 of 3 done
When a user complains or results get worse, you need to know exactly what made the result. Without the model id and prompt version on each row, you're guessing.
Ask your coding agent
Store every AI result in the database with the feature or step that made it (for example support_reply, invoice_extract or lead_score), the exact model id the provider reported, a prompt version label (for example support_reply@v3), the parameters used (temperature and similar), the input, the user id, timestamps and the provider's request id. Add columns or a JSON metadata field and fill them wherever results are saved. Never store API keys.
If a retry or a correction overwrites the AI's result, you lose the record of what failed. That record is how you find out why it failed, and who for.
Ask your coding agent
When a user retries, edits or corrects an AI result (asks for another try, edits a drafted email, fixes an extracted field, changes a label), never overwrite the original. Save the new version as a new row linked to the same request, with a version number and who made the change, and show the latest version by default. Update any queries that assume one result per request.
What users do next is the clearest sign of whether an AI result worked, and it costs nothing to collect. Browser analytics get blocked and can't be tied back to the result.
Ask your coding agent
Record what happens after each AI result as events in our own database, written by the server. Record the signs that it didn't work: the user asked for another try, undid it, edited or corrected it, asked the same question again, asked for a person, overruled a label or ignored the results. Also record the signs that it did: used, sent, saved, copied or exported. Each event needs the result id, user id, event type and a timestamp. Add the server endpoint, call it from the existing buttons and flows, and don't rely on a third-party analytics script.
What worked, for whom, at what cost
0 of 4 done
One average across your app hides the feature that's failing. Split by feature, model and prompt version, it shows which change made things better or worse.
Ask your coding agent
Using the stored AI results and their events, work out worked first time: the share of results that needed no retry, undo, edit, correction, re-ask, hand-over or overrule. Add a query or a small admin page showing it per feature, per model and per prompt version, for the last 7 and 30 days, with the number of results behind each figure.
One user action often runs several AI calls, such as a search, an answer and a safety check. Recording the cost of each step shows which one eats your margin.
Ask your coding agent
Record the cost of every AI provider call. After each call, save a row with the result or request it belongs to, a step name (for example search_articles or draft_reply), the model id, the usage the provider reported (tokens, images or seconds) and the cost in USD, worked out from one price table in the code. Include retries, so every try is counted.
A result that didn't work still cost you money, and so did every retry. Wasted spend and real cost per result show what failures cost you each month.
Ask your coding agent
Using the cost records and the worked-first-time data, add a query or admin page showing, per feature and per model for the last 30 days: total AI spend, wasted AI spend (the cost of results that didn't work, including their retries) and real cost per result (total spend divided by the number of results that worked). Show them next to AI spend as a share of revenue if we record revenue.
An average of 80% can hide a group of users for whom it works half the time, and they may be the ones who leave. Splitting by kind of input or user shows where to look first.
Ask your coding agent
Save a few traits with each AI result that might explain failures, without personal data: the input's language, its length in a few bands, the kind of input (for example a scanned or a digital PDF, or the question topic), the user's plan and whether they're new. Then show worked first time split by each trait for the last 30 days, sorted with the groups the AI fails most for at the top, with the number of results in each group.
Switching safely
0 of 4 done
Prompts edited in a dashboard or buried inline change without a record. A file per prompt with a version label lets every result point to the exact text that made it.
Ask your coding agent
Move every AI prompt in this app into its own file in the repo (for example prompts/support-reply.ts), each with an explicit version label like support_reply@v3 that gets saved with every result. Replace inline prompt strings with imports. From now on, when a prompt changes, bump its version instead of editing it in place.
With the model and prompt hard-coded, every change reaches all users at once and rolling back needs a deploy. A flag lets you try a change on some users and switch back in seconds.
Ask your coding agent
Put the model id and prompt version for each AI step behind a setting I can change without a deploy (an environment variable, a database setting or a feature flag), with the option to send a percentage of users to a second variant. Assign variants by user id so the same user always sees the same one, and save the variant on each result.
Trying a new model or prompt on two requests you made up tells you little. Replaying real ones, including those where the result didn't work, shows whether you can switch without your users noticing.
Ask your coding agent
Add a script that picks real past AI requests from the database (for example 50, mixing results that worked first time and ones that didn't, with personal data removed), saves them as a test set file, and replays them through any model and prompt version I name. It should save the new results next to the originals, with cost, so I can compare them before switching.
Providers retire models on announced dates, and calls that name a retired model start failing. Knowing which models you use, and where, turns a shutdown into a planned switch.
Ask your coding agent
List every AI model id this app uses, where each one is used, and whether its provider has announced a shutdown date. Make sure each model id is defined in one place in the config. Then add a short MODELS.md explaining how to switch each step to its replacement and how to test it first by replaying real past requests.
Why generic vibe-coding checklists skip these
Most launch checklists for vibe-coded apps cover what every web app needs: sign-in, row-level security, secrets, backups and error pages. Do those. But an AI app carries a second set of risks, because you pay a provider for every call, and an AI result can look fine to you and still fail the user.
Lovable, Bolt, v0, Replit and Base44 make a working first version fast, and their agents build what you describe. A typical prompt describes the feature, not spending caps, refunds for failed calls or a record of which results worked, so those are easy to leave out until something goes wrong.
The checklist for your builder and AI provider
Each builder wires AI differently: some run it through their own gateway and bill you in credits, others need your own key in a server function. These pages go through all 20 checks for one builder and provider, with what the platform handles, what to ask it to add, and the limits to set, each fact linked to its source.
- Lovable app with OpenAI
- Lovable app with OpenRouter
- Lovable app with fal.ai (images and video)
- Bolt.new app with OpenAI
- Bolt.new app with OpenRouter
- Bolt.new app with fal.ai (images and video)
- v0 app with OpenAI
- v0 app with fal.ai (images and video)
- Replit app with OpenAI
- Replit app with fal.ai (images and video)
- Base44 app with OpenAI
- Next.js app with OpenAI
- Next.js app with Anthropic (Claude)
- Next.js app with Google Gemini
- Next.js app with OpenRouter
- Next.js app with fal.ai (images and video)
What goes wrong without them
- Surprise AI bills. Without per-user caps, rate limits and capped retries, one abusive account or one retry loop can spend in an evening what you planned for a month. A key that leaks into the browser is worse: anyone can spend on it, on anything.
- Users charged for failures. If credits come off before the call, or in the browser, timeouts and refusals still cost the user. They notice, they email you, and some dispute the charge with their bank.
- No idea which AI results fail, or for whom. Your coding agent built the feature on the inputs you tried. Real users bring others: a support question your help centre doesn't cover, a scanned invoice, a lead from a market you didn't plan for, a message in Spanish. They try again, or leave, and nothing tells you why. With failures recorded per result, you can see how often each feature works first time and who it fails for.
- A forced model switch with no safety net. Providers retire models on announced dates. Without real past requests to replay and a flag to switch, you change models blind. The model shutdown calendar lists the dates, and the model switch test compares a replacement on your own prompt.
The three numbers this gets you
Once results, failures and costs are recorded, three numbers per feature show whether the AI works and what it really costs:
- Worked first time. The share of AI results that didn't need a “try again”, undo, fix, re-ask or overrule.
- Wasted AI spend. What you spent this month on AI results that didn't work.
- Real cost per result. What you actually pay for each result that worked, counting the failed tries.
Put them next to the numbers you already watch, such as AI bill as a share of revenue, free-to-paid conversion and churn.
How to use this checklist
Tick what your app already does. For anything left, open the item and copy its prompt into your coding agent, or copy all the prompts for unticked items at once. Ask the agent to work through them one at a time and to tell you what it changed, then check each change yourself: try to spend past your cap, force a failed call and confirm you weren't charged, and look for the model id on a saved result.
What to do first
Start with cost and abuse, because those failures cost real money from the first day. Charging comes next, because those are the problems users notice. The record of every result needs to be in place before your first real users arrive, since history you didn't record can't be recovered later. Switching safely can follow, as long as it's done before your first model or prompt change. Once failures and costs are recorded, the real cost per result calculator turns them into a price.
Questions
Does this replace a security review?
No. It covers the AI-specific checks that general checklists miss. Still check sign-in, row-level security, secrets and backups.
I built with Lovable, Bolt or v0. Does this apply?
Yes. The checks are about what your app records and charges, not the tool that wrote the code. Each item says what to ask your coding agent to add.
My app isn't an image or text generator. Does this still apply?
Yes. The checks work the same for support bots, document extraction, lead scoring, email agents, search and translation. Only the sign of a failure changes: a customer asking again, a field someone fixed, a label a person overruled, a search nobody clicked.
Is my progress saved?
Your ticks are saved in this browser only.
Related free tools
- Real cost per result calculatorWhat each AI result really costs, what you waste a month, and what to charge in credits.
- Judge agreement checkerCheck how often your AI judge agrees with a person, and whether to trust it.
- Model switch testRun your prompt on two models side by side and compare what worked and what it really costs.