What to Review Before Your AI-Built SaaS Takes Its First Payment
A SaaS security checklist for AI-built apps: test customer isolation, billing, backups and release steps before taking real payments.
Oct 28, 2026 · 6 min read
Field Notes from Thunkle, a studio that takes AI-built apps from prototype to secure, production-ready software.
A successful demo tells you that one customer journey can work. It does not tell you whether a different customer can read that account's files, change a price or lose a purchase during a retry. This SaaS security checklist focuses on the checks behind those customer-facing outcomes.
I review those paths through Thunkle. Before a launch, I want a short list of things that must be true, evidence that they are true, and a repair plan for anything that fails. The point is not to delay a small product until its code is perfect. It is to avoid charging people for a workflow the business cannot safely deliver.
Start with a complete customer journey
Pick the thing a customer is paying to do. For a fictional document app, that might be registering, buying credits, uploading a document, receiving a summary and deleting the workspace.
Write down the expected result at each step. Who owns the document? When is a credit consumed? What happens if the analysis fails? Which records should survive deletion for accounting purposes?
Those answers define the review. A repository can contain many tests without checking any of these decisions. Conversely, a small app can establish useful launch evidence with a handful of well-chosen tests.
Use a separate environment with synthetic records and provider test modes. Only test systems you own or have explicit permission to assess.
Trace the price back to its source
During an application review, I found a payment function that read a booking amount from the database before charging it. The earlier write had accepted that amount from the browser.
Reading from the database did not make the value trusted. The same customer who would pay the price had influenced it.
Follow the whole purchase: the product requested, the server's price calculation, the amount charged, the billing event and the account receiving access. A customer should be able to choose an allowed product or quantity, not rewrite the server's pricing rules.
Include an abandoned checkout and a failed payment. A redirect to a success page is not enough evidence that money arrived. If the app supports trials, invoices or delayed payment methods, define the access rule for those states too.
Keep the expected amount, provider result and resulting entitlement together in the test record. That makes an incorrect charge easier to distinguish from an incorrect permission.
Use two ordinary accounts
Create customer A and customer B, each with a few private records. First show that the intended owner can use their own data. Then repeat the relevant requests against the unrelated customer's records.
Include files, exports, background-processing routes and destructive actions. An item disappearing from the sidebar does not establish that the server refuses it.
For a shared workspace, add the roles the product actually supports: a colleague, a read-only member and someone whose access has been removed. Seeing another person's record may be correct inside a team and wrong across unrelated businesses.
The two-account Supabase test is a useful starting point. It does not replace a review of privileged backend functions, file processing or billing.
Reconcile one important number
Take one purchase with inputs you can calculate independently. Follow it through checkout, the stored record, invoice, report and payout.
Record what each amount means. A quoted price, successful charge and settled payout are not interchangeable. Historical invoices may also need to retain the price agreed at the time instead of using today's calculation.
In a marketplace review, I found different interpretations of pricing in different paths. No single screen could establish whether the purchase was right.
Do not let a repair simply make every display match. Find the intended business rule, decide which values should be stored, then test the callers against that rule.
Restore something useful
A client's weekly backup job reported success. The first restore drill showed that saved integration credentials were fingerprints rather than usable secret values. The platform did not return the original secrets after storing them.
There were snapshots, but they could not reconstruct the integrations as the backup process expected.
Restore into a separate, empty environment. Check database records, file contents, required configuration and a useful workflow. Keep credentials in an appropriate recovery process rather than printing them in a test report.
For Supabase, database backups do not include the actual Storage object bytes. Recovery needs to account for both. The provider's plan and retention settings also matter.
If no restore has been attempted, describe recovery as untested. A green backup notification cannot answer that question.
Have somebody else deploy it
Give another authorized person the release instructions. Can they identify the version, obtain configuration through the proper channels, deploy to test and return to the previous working version?
A small product does not need an elaborate release department. It does need a process that does not depend on the original builder remembering an undocumented command.
Check the first release after a database change too. Returning to old application code may not undo a schema change or recover writes made by the new version.
Decide what blocks launch
For each finding, record the affected workflow, expected result, observed result and proposed next step. Keep untested areas visible.
Cross-customer data access and incorrect charges normally need repair before those features take real customers. A non-critical internal report might wait if its limitations are explicit and nobody relies on it for payments or important decisions.
Disabling an affected feature can narrow a launch, but its backend routes and permissions need to be disabled as well. Removing a menu item is not the same thing.
A scoped security audit investigates the agreed sensitive paths. A code review and repair engagement can also address unreliable workflows and deployment problems. I separate findings and remediation guidance from implementation work, so the proposal says what is being reviewed and what is being changed.
What should a founder send before a review?
Send the app URL, stack, main customer journey, roles, integrations and any failures you can reproduce. Do not email production secrets. Access and test boundaries should be agreed separately.
You do not need to diagnose the code first. A clear description of what the customer should be able to do is a better starting point than a list of files you suspect.
If you want to start with the checks yourself, read the free three-page security sample. It covers scanner scope and safe two-account setup, with no email required. For the full checklist, worked examples and coding prompts, get the Vibe Coding Security Launch Kit. The guide is a self-serve resource, not a review of your app.
Review the app before taking customer payments.
Tell me your stack, user roles and launch plan. I will scope the customer-data, billing and release checks that matter for your app.
