
Before you start
Who this is for
This guide is for founders, creators, innovators and product owners who’ve built an app or website with an AI tool such as Lovable, Bolt, Replit, Cursor or Claude Code, and want to put it in front of real customers. You don't need to be technical. Where I get technical, I’ll explain it in plain language.
What you'll get
- A clear picture of why AI-built apps and sites break once real people use them
- A scorecard to check how ready you are today
- A step-by-step route from prototype to a live, stable product
- A prioritised checklist you can work through in an afternoon
- Guidance on when to do it yourself and when to bring in experts
The demo is the easy part: Why this matters
We’re living through a very unique time. Today, a founder with no engineering background can describe an idea in plain English and, within hours, have a working app or website on screen. Sign-up works. The dashboard loads. The core feature does what it should. You show it to a few people and they want to use it.
That's very valuable. You've tested an idea with a working product instead of a slide deck, and you've done it for a fraction of what it would have cost two years ago.
Then you launch, and things start to wobble. A user gets logged out mid-task, someone sees another customer's data, a page that loaded instantly with ten test records takes eight seconds with a thousand, an uploaded file disappears after an update, or a payment goes through but the confirmation never arrives.
This doesn’t mean your app is a flop and you should throw it in, you’ve just reached the point where the requirements change. A demo has to work once, for you, in good conditions. A product has to work every time, for strangers, in bad conditions, including when someone is deliberately trying to break it.
AI tools are good at getting you to a working version quickly. They’re not so good at the scrupulous, careful, defensive work that makes software hold up: handling failures, protecting data, planning for growth, and telling you when something has gone wrong. That part is what this guide is about.
Why the gap exists
Demo mode versus production mode
When you build a prototype, you're answering one question: does this work? In production, the questions multiply:
- Will it still work when hundreds of people use it at once?
- Is it safe if someone sends it something unexpected or hostile?
- What happens when a service it depends on goes down?
- Can we change it next month without breaking last month's work?
- Will we know when something fails, before a customer tells us?
Here’s how the same part of an app behaves in each mode.
Sign-in: In a demo, one test user stays logged in forever. In production, sessions need to expire sensibly, refresh without kicking people out, and lock down after repeated failed attempts.
Data: In a demo, a small test database holds fifty rows. In production, many people write to it at once, searches need to stay fast as it grows, and a bad update must never wipe out customer records.
File uploads: In a demo, files sit on the same machine as the app. In production, many hosting platforms wipe that machine on every update, so uploaded files vanish.
Errors: In a demo, a failure shows a technical error page, and you know what it means. In production, customers see a clear, friendly message, and you receive an alert.
Third-party services: In a demo, payments, email and AI calls use test keys and always succeed. In production, they time out, hit rate limits and fail in ways you haven't seen.
Secrets: In a demo, passwords and keys can sit in the code. In production, anything left there can be found and abused.
Why AI tools skip this
AI coding tools optimise for what you asked for. You described a feature, and they built a successful path through it. You didn't ask for rate limiting, backup strategy or monitoring, so they generally won’t add them.
There's also a structural issue. A prototype built over many chat prompts is shaped by many small, separate instructions. Nobody, including the AI, holds a full picture of how the whole thing fits together. That's fine on a small scale, but it becomes a problem when the app grows, because a change in one place can quietly break something in another.
The good news
If you've built a prototype and people want it, you're in a strong position. You've validated the demand and you know which features matter. You've made your expensive mistakes cheaply. What remains is a known, finite list of work, and most of it is the work of turning something that works into something that lasts.
How ready are you, really?
It depends on what you've built
"Production-ready" isn't one fixed status. What you need depends on what your app does and who relies on it.
Lower risk, usually fine with a careful review:
- Landing pages and content sites
- Internal tools for a small, known team
- Simple apps with one type of record, such as a tracker or a booking form
- Private betas where users know it's early
Higher risk, needs real scrutiny:
- Anything with customer accounts and personal data
- Anything that takes payments
- Apps with many users, many roles or many types of data
- Health, finance or other regulated areas
For the higher-risk group, treat what the AI produced as a strong first draft. You wouldn’t publish a first draft, and your AI-built app still needs professional revision and re-writing before it’s ready for launch
Seven honest questions
Answer these about your app today. Each "no" is a task for your plan.
- Can you deploy to a clean environment without relying on your own devices?
- Are all passwords, keys and tokens stored outside the code?
- Do you have a separate test version of the app, a staging environment, that mirrors the live one?
- Do you know exactly which database your live app or site will use, and have you tested it?
- Will you get an alert if something breaks silently?
- Have you tested with more than one person using the app at the same time?
- Can you restore your data if something goes wrong?
If you answered yes to 6 or 7: you're in good shape.
If you answered yes to 4 or 5: spend extra time on the audit stage.
If you answered yes to 3 or fewer: fix the foundations before launching. It's faster than recovering from a bad launch.
The 5 places AI-built apps typically break
Teams who review and rescue AI-built products report the same patterns again and again, and knowing them tells you where to look first.
1. A data model that can't grow
The structure behind your data decides how easily the product can change. AI tools build whatever works for today's feature, but they rarely ask what happens when one customer has 10,000 records, or when you add search and filters next quarter.
Typical signs include: important information stored as one big lump instead of in organised tables; no way to recover deleted records; missing indexes that make searches slow as data grows; relationships between things that are too flat for what you need later.
None of this breaks a demo, and all of it is much easier to fix before you’ve launched the app to potentially hundreds or thousands of users.
2. Security that only looks like security
The app or site works… but it also does things it shouldn't if someone sends the wrong request.
The most common issues include:
- Weak checks on what users send in: The code trusts input it shouldn't.
- Access control that only exists on the screen: The button is hidden, but anyone who knows the address can still reach it.
- Users seeing each other's data: Change an ID in a web address, and you see someone else's record.
- Secrets in the wrong place: Keys sitting in the code, or visible in the browser.
- No limits on repeated requests: A bot can hammer a login page or run up your bills.
3. Errors that fail silently
AI-generated code assumes everything goes right. In real life, external services time out, databases drop connections, and people submit forms twice or fill them with unexpected content.
Without proper handling, the result is a blank screen, a request that hangs forever, or a vague error with no explanation. Worse, some failures leave no trace at all, so you only find out when a customer emails you.
4. Tests that tick a box but check nothing
Many AI-built apps have no tests at all. Where AI has written tests, they often pass for the wrong reasons: they assert the wrong thing, or skip the exact action they're meant to check. That green tick feels reassuring but shouldn’t always be trusted.
5. Structure that boxes you in
Early structure decisions open some doors and close others. Common traps include: complexity added where simplicity was needed; outside services wired so deeply that switching is expensive; logic, screens and data access tangled together so every change is risky. Many people don't notice these until months in, when each new feature takes longer, breaks or costs more.
Bonus: Your app uses AI without guardrails
If your product references AI models, there's an extra risk. Without limits, one busy day or one abusive user can generate a huge bill. Without defences, users can try to manipulate the prompts your app sends.
6 steps to production-ready
This is the core of the process. Each step has a way to check that it worked. For a simple app, a focused weekend is a reasonable estimate for the basics, but that depends on your stack and how tangled the code is.
Step 1: Audit your secrets
AI tools often put keys and passwords straight into the code to make an example work. Several edits later, that value sits in your saved history even if you moved it afterwards. Automated bots scan public code for exactly these patterns.
What to do
- Search the whole project and its history for anything that looks like a key, token or password. Free tools can do this.
- Make sure every secret is loaded from environment variables, not written in the code.
- Confirm your environment file is excluded from version control.
- If a secret was ever saved in your history, replace it. Assume it's compromised.
How you know it worked
A scan of your full history comes back clean, and the app fails loudly and clearly if a required secret is missing.
Step 2: Handle errors purposefully
Every time your app talks to something outside itself, such as a payment service, an email provider, a database or an AI model, it can fail.
What to do
- Give every external call a time limit, so a stalled service can't freeze your app.
- Treat different failures differently. A timeout, a rejected password and a "too many requests" message each need their own response.
- Show people something useful. "Something went wrong" isn't helpful. "We couldn't reach the payment provider. Please try again in a moment" is.
- Check what users send in before it reaches your logic. Reject blank, oversized or malformed data with a clear message.
How you know it worked
Cut the database connection mid-request and the app responds gracefully. Send a deliberately broken form and you get a clear, specific error instead of a crash.
Step 3: Lock down who can see and do what
Access control is one of the easiest areas to get wrong and not even notice.
What to check
- Is each sensitive action blocked on the server, not just hidden on the screen?
- Do login sessions expire, and does your app actually enforce that?
- Can a normal user reach an admin area by guessing the address?
- Log in as one customer. Can you open another customer's record by changing an ID?
- Do password reset flows reveal whether an email address exists?
How you know it worked
Every sensitive action refuses a user without permission. Customer A cannot reach Customer B's data under any route you can think of.
Step 4: Set up automatic checks on every change
Without automatic checks, every new feature risks breaking something that used to work.
What to do
- Set up a simple pipeline that runs every time you save a change. It should build the app, check for obvious problems and confirm the app starts.
- Make one rule: if the checks fail, the change doesn't go live.
- Add a preview for each change, so you can see it in a real environment before it reaches customers.
How you know it worked
Break something on purpose. The pipeline stops it before it ships.
Step 5: Test the journeys that make you money
Pick the 3 to 5 flows where a failure would cost you customers or revenue.
- A software product: sign up, do the main thing the product exists for, see or download the result.
- An online shop: browse, add to basket, check out.
- A membership or creator app: join, pay, access the content.
For each flow, set up a test that behaves like a real user: opens the app, clicks through, and confirms the right outcome. Tools exist to write and run these, including AI-powered ones that need little technical skill.
Four tests on your critical paths, running on every change, are worth more than forty tests that never run.
How you know it worked
Break one of those flows on purpose and see if the test fails. Fix it and test again.
Step 6: Make sure you hear about problems first
Steps 1 to 5 reduce the chance of something breaking. Step 6 assumes something will anyway.
You need three things:
- Error tracking: Every unexpected error is captured, grouped and sent to you. Set an alert for sudden spikes, not just single errors.
- Uptime monitoring: A service checks your app every minute and alerts you if it stops responding. Point it at a dedicated health check that confirms your database is reachable, not just your homepage.
- Basic usage insight: Enough to reconstruct what a customer was doing when they reported a bug.
How you know it worked
Trigger an error on purpose and see it arrive in your tracker within a minute. Take the app down briefly and get an alert.
What "done" looks like
Your secrets are out of the code, failures are handled, not hidden, permissions are enforced on the server, every change is checked automatically, your key flows are tested, and you find out about problems before your customers do.
Getting it live
Deployment is the moment your app leaves your device and becomes available to everyone. It's where many founders stall, usually because they pick the wrong type of host before checking what they've built.
You need the right host
On your own machine, your app runs at an address like "localhost," which literally means this computer. For anyone else to use it, it has to run on a server. That is, a computer that's always on, always connected, and managed by someone else.
Today you rarely set up servers by hand. Modern hosting platforms connect to your code repository, build your app, run it, and give you a web address. Updates deploy automatically whenever you save changes to your main version.
Step 1: Know what you've built
The kind of host you need depends on the kind of app you have.
- A static app: Pages and scripts that run in the browser and talk to outside services. Simple hosts built for this work well, and are often free for small projects.
- A full-stack app: It has a server component, a database it writes to, or background jobs. It needs a host that runs a real, continuous server process.
- A Python or similar backend: It needs a runtime environment to execute code.
- A mix: A front end plus a separate back end, often deployed as two services.
A quick check: if your project has a server file or a "start" command, you have a back end and need a host that can run it.
Step 2: Fix the 3 bugs AI often leaves
These are responsible for most "it worked on my machine" failures.
- Hard-coded local addresses: The code points at your own machine. Replace these with relative paths or settings that change per environment.
- Missing settings: Keys and connection details written into the code must move to your host's environment settings.
- Cross-origin errors: If your front end and back end live at different addresses, the back end has to explicitly allow the live address, not only your local one.
A useful trick: when a deployment fails, copy the full error message into the AI tool that built the app and ask it to fix the configuration. It should handle the query when it has the complete log.
Step 3: Choose your database carefully
Many hosting platforms rebuild your app's environment on every update. If your database is a file sitting alongside your code, it disappears each time.
You have two sound options:
- Use a hosted database: Point your app at a managed database service. For most apps, this is the best long-term answer.
- Use a host with persistent storage: Keep your current setup and attach a storage volume that survives updates.
For most apps going to production, a managed relational database is the right choice. It scales, has built-in backups, and avoids a painful move later.
If you're moving from a simple database file to a production database, do it before you have real customer data.
Step 4: Move secrets into the right place
Every key, token and password must live in your host's environment settings, not in your code. In your code, you refer to them by name.
Do this before the first deployment. Remember that even trained engineers get this wrong. Expect your first deployment to fail because a setting is missing or wrong. It's a rite of passage, and it's easy to fix once you know what to look for.
Step 5: Connect, deploy, and add your domain
Push your code to a repository, connect it to your chosen host, and let it detect your framework. Watch the first build. A failed build is often a missing build command or a wrong output folder.
Once you have a live secure address, add your own domain by pointing a record at the host from your domain registrar. Security certificates are usually set up for you.
Understand these 2 kinds of failure
A deployment can go wrong in two places.
- Build time: The app can't be assembled. It could be because of a typo, a missing package, or something else. The good news is that a failed build never goes live, so customers don't see it.
- Runtime: The app built fine but misbehaves once running. This can be tricky for anyone, even the experts. Read the logs your platform provides. Pasting a confusing message into an AI tool to explain is fine, but look at the logs yourself too. That's how you build instinct.
How to avoid breaking things for your actual users
Failure comes for everyone eventually, what matters is how quickly you recover.
- Know your rollback: Every deployment is saved as a snapshot. If an update breaks something, you can revert to the previous working version in a couple of clicks. Find out where that button is before you need it.
- Make database changes additive: For a moment during an update, old code can run against a new database structure. The safe approach is to add the new field while the old one still works, ship the code that uses it, and remove the old one later. Never rename a column in a single step on a live app.
- Use a staging environment: This is a full copy of your app where changes land first and can break harmlessly. It’s where you test migrations and run your full journey before customers see anything.
- Keep your automatic checks on: They catch most problems before they ship.
After you launch
Deployment starts the next phase. Turn on error logging and check it after the first real traffic. Watch for unhandled errors, slow database queries and anything that touches sign-in. Set up a free uptime check so you learn about downtime before your users do.
Taking payments: the checks that matter most
The moment your app takes money, the stakes change. No longer an annoyance, a bug can mean a customer charged twice, a failed payment nobody notices, or a refund you can't process.
Work through this list on your staging copy first, then again on the live app with a real account.
Keys and settings
- Your payment provider is switched to live mode, using live keys rather than test keys.
- Payment keys live in environment settings, not in the code, and the secret key never appears in the browser or page source.
- Any test keys that touched your development setup have been replaced.
The payment journey
- A successful payment works from start to finish, and the customer sees a clear confirmation.
- A declined card shows a helpful message, and nothing is charged or marked as paid.
- A customer who clicks "pay" twice, or refreshes mid-payment, isn't charged twice.
- Prices and totals are calculated on the server, not trusted from the browser.
Webhooks (the messages your payment provider sends back)
- Webhooks point at your live address, not your test one.
- Your app verifies that each message genuinely comes from your payment provider.
- Your app copes with duplicate messages, late messages and messages arriving out of order.
- If a webhook fails, you find out about it. Check that an alert fires.
After the payment
- Customers get a receipt or confirmation email, and failed-payment emails are sent too.
- Refunds work, and the app updates the customer's access or order status when one happens.
- Subscription changes, cancellations and renewals behave correctly, if you offer them.
- Customers can reach you easily if something goes wrong with a payment.
Compliance and trust
- You use your provider's hosted checkout or secure payment fields, so card numbers never touch your own servers. If you handle card numbers directly, get expert help first.
- Your terms, refund policy and privacy policy are visible before purchase.
- Payment logs record what happened without storing sensitive card details.
A rule of thumb: if you can't tick every box in "The payment journey" and "Webhooks," don't launch paid features yet. Payments are one of the clearest signs it's time for an expert review.
Specific guidance by tool
Each AI tool leaves its own fingerprints. If you know which one built your app, these tips will give you a clearer idea of where to direct your efforts.
Lovable
- Check your database access rules carefully. They are often too permissive, so users could read each other's records. Every table should default to "users see only their own data."
- Check what happens when a login session expires. Many apps show a blank page instead of redirecting to sign-in.
- Look at screens that fetch lots of items. Some run one query per item, which slows sharply as data grows.
Bolt
- Don't deploy to production from inside the tool. Export the code and set up a proper pipeline.
- Review every place the app reads a setting. Keys are sometimes written directly in the code.
- Test the full sign-in flow with outside providers on a clean session.
Replit
- Check whether your plan sleeps when idle. A production app can't have a long wait after inactivity.
- Move away from the built-in simple data store to a production database before launch.
- Settings do not automatically carry over to your deployment. Set them again explicitly.
Cursor and other coding assistants
- Long sessions can produce code that contradicts itself. A review of the whole structure is worthwhile.
- Look for places where only the successful path was handled.
- Turn on stricter checking if it's off, and fix what it flags.
UI-only generators
- These produce screens, not back ends. Anything involving data, sign-in or business rules still needs to be built.
Agentic coding tools
- Review every file the agent touched, not only the ones you asked about.
- Monitoring and logging won't be added unless you ask.
If your app uses AI itself
If your product calls AI models for its features, add these protections before launch.
- Spend caps: Set hard limits on what your app can spend on AI calls per user and per day. Without them, one runaway process or abusive user can create a surprise bill.
- Rate limits: Limit how often any one person can trigger an AI request.
- Defences against prompt manipulation: Users will try to trick your prompts into doing things you didn't intend. Separate instructions from user input, and don't let the model's output trigger sensitive actions without checks.
- Reliable handling of outside events: If your product depends on notifications from other services, such as payment or processing updates, make sure it copes with duplicates, delays and failures.
- Graceful failure: When the AI service is slow or down, your app should say so clearly and carry on with everything else.
The prioritised checklist
If you’re feeling overwhelmed, start here.
Before launch
Security
- HTTPS everywhere, with automatic redirects
- Sign-in, sign-out and password reset all work, and protected pages truly require login
- Input is checked on the server for every form
- No secrets visible in the browser or page source
Performance
- Images optimised
- Static files served from a content delivery network
Errors
- A global fallback so crashes show a friendly message, not a blank page
- Custom "page not found" and "something went wrong" pages
- Clear, specific messages on forms
Monitoring
- Error tracking switched on
Backups
- Automatic database backups, with one restore tested
- You know how to roll back a bad update
First week
- Cross-origin access restricted to your own domain
- Rate limiting on your API
- Indexes on searched fields
- Lazy loading for below-the-fold content
- Proper status codes from your API (not a "success" with an error inside)
- Uptime monitoring
- Basic privacy-friendly analytics
First month
- A considered caching strategy
- Structured logging with timestamps and request IDs
- Your domain settings written down somewhere safe
I suggest you don’t try to make every item perfect before launch. A reasonable limit today beats a perfect limit you never ship. Launch with the basic foundation in place, and then refine with real usage data.
Shipping lessons from AI builds
Success isn’t exclusively technical, it’s about how you work and how you consider the broader story and impact of your app or site. Whatever your project, several lessons carry over from different stories of AI builds.
A set time builds momentum: A hard deadline strips away debate and delay and forces you to decide what's essential.
Build for someone you understand: Knowing your customer or target user well turns every decision into a simpler one, because you know more clearly what that person would actually value.
Start with the smallest working version: Instead of trying to ship an elaborate product, start small with a strong foundation, and learn and refine fast.
Show people before you feel ready: The gap between what you think your product does and what users expect is always bigger than you think. Feedback is raw and hugely valuable insight.
Listen to behaviour, not just opinions: By that same token, early users' feedback might just reveal the product was aimed at the wrong job, but it had a feature that people want. It’s time to change direction, and quickly.
Simplify when it gets confusing: Rather than piling hundreds of lines of instructions into your AI tool, ask yourself where you can simplify. More rules are not always better.
Charge early and use price as positioning: Revenue is the clearest validation. A payment link and a conversation can tell you more than a month of surveys. In addition, what you charge shapes who adopts your product and how seriously they use it.
Launch before you feel ready: Readiness is a moving target. Contact with real users teaches you what refinement can't.
The strongest approach is to move quickly. Put the product in front of people, and improve the parts that carry risk as soon as real users and real money are involved.
Are you already live and things are going wrong?
If real users are already in your app and problems are piling up, don't try to fix everything at once. Work through it in order, from the most damaging problems to the least.
First, stabilise
- Take a backup now: Before changing anything, make sure you can get your data back.
- Know your way back: Find your rollback option, so you can return to the last working version if a fix makes things worse.
- Switch on visibility: If you don't have error tracking and uptime monitoring, add them first. You can't prioritise what you can't see.
- List what's broken: Write down every problem, who it affects and how often it happens. Include user reports.
Then fix in this order
- Data loss and data exposure: Anything where customer information could be lost, corrupted or seen by the wrong person comes first. If users can see each other's data, that's an emergency.
- Security gaps: Exposed keys, weak sign-in, missing access checks. Replace any secrets that may have leaked.
- Money problems: Failed or duplicate payments, missing receipts, refunds that don't work.
- Problems that stop people using the app: Crashes, logins that fail, pages that time out.
- Problems affecting some users: Bugs on certain devices, edge cases, slow areas.
- Cosmetic issues: Last, look at more cosmetic problems.
While you work
- Keep users online: Work on a separate branch, use a staging copy, and release changes gradually.
- Time risky changes carefully: Run anything that changes your database structure during quiet periods, with a rollback plan ready. Don't change column types or remove columns while users are active.
- Make database changes additive: Add new fields before removing old ones.
- Communicate honestly: If an issue affects customers, tell them what happened and what you're doing. A short, plain message builds trust.
Know when to call for help
Bring in experienced help if any of these are true:
- Customer data may have been exposed
- Payments are failing or duplicating
- Every fix seems to break something else
- You can't tell what's wrong, even with monitoring
A readiness review will give you a ranked list of problems and a clear recommendation: fix, improve or rebuild. This will ultimately save you time and avoid fixing the wrong things first.
Should you do it yourself or bring in help?
You can do much of this yourself, and this guide is designed to help. But it's worth being honest about when expertise pays for itself.
A simple decision guide
DIY is reasonable if:
- You have a technical co-founder or solid backend experience
- Your app is simple, such as a landing page with a contact form
- You scored 7 or more on the scorecard in Chapter 2
Consider expert help if:
- You're non-technical and the app takes payments or handles sensitive data
- You need to launch within a few weeks
- The code came from several different AI tools and is hard to follow
- A previous launch attempt already failed for technical reasons
What does ‘expert help’ actually mean?
The right kind of collaboration doesn't mean starting over. It typically includes:
- A readiness audit that reviews architecture, security, database and deployment, and gives you a prioritised list of risks and a clear recommendation: refactor or rebuild.
- Fixes in order of risk. Sign-in first, then secrets, data integrity, visibility and performance, so each layer hardens without disturbing the next.
- A parallel track. You may keep building features or conducting market research while the production work happens alongside, joined up through a reviewed workflow.
- Completion of unfinished integrations, such as payments and sign-in, which is where many AI-built products stall.
- Documentation and handover, or an ongoing partnership model, so you’re set up for the future, whatever you decide.
Why I advocate for growth partners, not just a dev team
Getting an app stable is necessary, but the goal is a product that grows: one that converts visitors, keeps customers, earns revenue and improves over time.
That's the difference a growth partner makes. A dev team can close the technical gaps but then often leaves you to it. A growth partner connects the work to the business. They get into which problems cost you the most revenue, which fixes to do first, how to measure results, and what to build next once the foundations are solid. With a growth partner strategy, product and marketing share one plan, so the effort you put into making your app solid also moves the numbers that matter.
Want a second opinion?
Voyage is a growth agency based in Christchurch, New Zealand and working globally. We help founders and creators turn promising prototypes into products that perform. Everything we ship is stable, secure, and built to grow.
We offer a readiness review of your AI-built app, with a clear, prioritised plan for what to fix first and why.


