PutThrough Product engineering studio
Book a free call

AI-built app audit

Is your AI-built app safe to launch?

You built it with Lovable, Bolt, Cursor or Replit and it works in the demo. Before real customers and real payments go through it, we review it with read-only access and send you a written report — every finding ranked by severity, with a fix estimate. Two business days, $349, fixed.

  • Read-only access
  • Report in two business days
  • Free if it finds nothing material
  • No call required

Not ready to buy? Run the free pre-launch checklist on your own app first

Free The first three audits are free. In return we ask for honest written feedback we can publish, marked as from a free audit, and permission to publish an anonymised version of the report.

01Who it is for

Founders at the moment it starts to matter.

  • You are about to launch, or about to take your first payment.
  • Someone is going to look at the code: an investor, an acquirer, a technical co-founder.
  • An app store rejected your build and you are not sure why.
  • You read about another AI-built app leaking its users’ data and wondered about yours.

Not the right purchase if you need a penetration test or a compliance certificate. That is a specialist firm’s work, and we will say so.

02What we check

Twenty failure modes we look for in every app.

These are the problems AI coding tools produce most often, grouped the way the report groups them. Every one is invisible in a demo.

Security

  • Your database is publicly readable

    Row-level security was never switched on, so the browser key that ships in your JavaScript bundle can read every row in every table — including other customers’ records. From the outside the app looks completely normal.

    What fixing it involves: Access policies written and tested per table, with a test asserting a user of one tenant cannot reach another’s rows, run in CI so a future migration cannot silently remove isolation.

  • A secret key is sitting in your JavaScript bundle

    An admin-level key was used in client code to work around access rules that were never configured. It bypasses every policy you add later, so fixing the policies alone changes nothing.

    What fixing it involves: Rotate the key, move every privileged call behind server-side endpoints, and add a build-time scan of the client bundle that fails the build if a key pattern reappears.

  • Admin buttons are hidden, not blocked

    The role check lives in the React component. The endpoints behind it have none, so anyone who calls them directly can perform administrative actions — including changing their own role.

    What fixing it involves: The role check moves to the server on every privileged endpoint. The interface still hides what you cannot do, but hiding is no longer what stops you.

  • One customer can read another customer’s data

    The tenant identifier used to filter queries is read from a value the client sends. Change it in the request and another organization’s records come back, because the server never checks it against the session.

    What fixing it involves: Tenant identity resolved server-side from the authenticated session only, and the client-supplied parameter rejected outright rather than ignored.

  • Uploaded files are public to anyone with the URL

    The storage bucket was left open and filenames are predictable. Invoices, identity documents and private images are readable without logging in, and enumerable by anyone who guesses the pattern.

    What fixing it involves: Per-object access rules, signed URLs with an expiry, and non-guessable keys — plus a sweep of what is already exposed.

Payments

  • Payments charge but nothing happens

    The card is charged, the customer sees a success screen, and the account is never upgraded. Almost always the webhook is unverified, unhandled, or never arrives at a handler that does anything.

    What fixing it involves: Signature verification on every event, the payment provider treated as the source of truth for subscription state, and a reconciliation pass over what is already wrong.

  • One customer, three subscriptions

    Payment providers retry webhooks by design and occasionally deliver duplicates in normal operation. The handler inserts a row each time, so your database quietly disagrees with the provider about what was bought.

    What fixing it involves: Event IDs stored with a unique constraint, and subscription writes made upserts keyed on the provider’s own identifier rather than blind inserts.

  • Cancellations and refunds never reach your database

    One event is handled — the successful checkout — and nothing else. Canceled customers keep their access, refunded customers still count as revenue, and failed renewals are invisible.

    What fixing it involves: The full lifecycle implemented and tested: renewal, failure, refund, dispute, cancellation, and the grace periods between them.

  • The price is set by the browser

    The amount to charge is sent from the client to the checkout session. Anyone can change it in the request before it is sent, and pay whatever they like.

    What fixing it involves: Price resolved server-side from your own catalog. The client sends an identifier for what it wants to buy, never a number.

Reliability

  • Works locally, fails in production

    Different environment variables, a missing build step, a server-only library imported into client code, a database connection that works from your laptop and not from the host. The error is a 500 with nothing behind it.

    What fixing it involves: Environment parity, configuration validated at boot so a missing value fails loudly at deploy rather than silently at runtime, and real errors surfaced instead of swallowed.

  • You find out it is down from a customer

    No error tracking, no uptime check, no alerting. A broken payment path or a failing migration is reported by whoever happens to hit it, and there is no trace left to diagnose from afterwards.

    What fixing it involves: Error tracking with releases and source maps, uptime checks on the paths that matter, and alerts routed somewhere a human actually reads.

  • It got slow and nobody knows why

    Missing indexes, queries issued inside a loop, whole tables fetched and then filtered in memory. All of it is fine with fifty rows and none of it is fine with fifty thousand.

    What fixing it involves: The slow queries identified from real timings, indexes added where they are needed, repeated queries collapsed, and a performance check that fails the build on a regression.

  • There is no way back from a bad deploy

    Deploys go out from a laptop, there is no record of what shipped, and the only way to undo a release is to write the old behavior again by hand under pressure.

    What fixing it involves: Deploys from CI on merge, immutable builds you can identify, and a rollback that has been executed at least once so you know it works.

Data

  • No backups, or none anyone has restored

    Running on defaults with no export schedule, or with backups nobody has ever restored from. A backup that has not been restored is an assumption, not a recovery plan.

    What fixing it involves: Scheduled backups with a retention policy, a documented restore, and that restore actually performed into a scratch environment to prove it works.

  • Staging writes to the live database

    One connection string across every environment. Preview deployments mutate real customer data, and a migration tested on a branch runs against production. There is also nowhere safe to rehearse a restore.

    What fixing it involves: Separate projects per environment with distinct credentials, and a seeded non-production dataset containing no real customer records.

  • Schema changes are made by hand

    Columns added in a dashboard, no migration files, no history. Environments drift apart and nobody can recreate the database from scratch — including whoever has to recover it.

    What fixing it involves: Migrations committed to the repository and applied in CI, so the schema is reproducible from zero and every change is reviewable.

Mobile

  • Rejected by the App Store for minimum functionality

    A web view with nothing a browser could not do. Resubmitting the same build with a better description does not change the outcome, and each attempt costs a review cycle.

    What fixing it involves: Genuine native capability — push, biometric unlock, offline behavior, native share — implemented against the real platform APIs, which is what the guideline actually asks for.

  • Refused at upload for an old target SDK

    Google raises the target API floor every year and refuses new builds below it before review even begins. The upgrade then surfaces layout and orientation changes the app never handled.

    What fixing it involves: Target level raised and the consequences fixed: edge-to-edge layout with correct insets, and large-screen orientation behavior that no longer assumes portrait.

  • Your privacy answers do not match what the app sends

    The data safety form declares no collection while the app ships analytics and account data. That mismatch is itself a policy violation, independent of the collection it fails to declare.

    What fixing it involves: Declarations rewritten from an audit of the network calls the build actually makes, plus privacy manifests and required-reason declarations for every bundled dependency.

  • Push and deep links work in the simulator only

    Certificates, entitlements and associated domains were never configured for a release build, so notifications silently fail and links open the browser instead of the app.

    What fixing it involves: Configured and verified on physical devices against a release build, on both platforms, with the release process written down so you can repeat it.

03How it works

Four steps, and no call unless you want one.

  1. 01

    Request

    Send the short form below. An email follows straight away with the payment details, the testing authorization and the access checklist. A free-audit application hears within one business day whether a place is open.

  2. 02

    Pay and grant access

    You pay by bank transfer, sign the one-page testing authorization and give read-only access: repository, hosting and database, viewer only. No production credentials, no customer data.

  3. 03

    Get the report

    Two business days after access works: every finding ranked by severity, with evidence, a fix estimate in hours and a 20-minute recorded walkthrough.

  4. 04

    Decide what to do

    Fix it yourself, hand it to your developer, or have us fix it on a fixed-price sprint with the audit fee credited. The report is yours either way.

04Price

One price, published.

Paid in full up front. Credited in full against a fix sprint booked within 90 days of the report.

AI-Built App Audit Report

$349 web + mobile $499

A written, ranked account of what is wrong with your app and what each fix costs. Read-only access is enough.

Two business days from access

Included

  • Security review: database access rules, exposed keys and secrets, authentication and session handling
  • Payment path traced end to end, including webhooks and failure states
  • Build, deploy and environment configuration
  • Performance hot spots and schema/migration hygiene
  • Mobile: store-readiness against the current Android and iOS SDK floors (web + mobile tier)
  • Every finding ranked by severity, with evidence and a fix estimate in hours
  • A 20-minute recorded walkthrough of the report
  • A written testing authorization, signed before we begin

Not included

  • No fixes are made during the audit — it is a diagnosis
  • No penetration testing or adversarial security testing
  • No formal accessibility or regulatory certification

Request the audit

Tell us about your app.

A minute to fill in. The payment details and both documents arrive by email straight away, and nothing starts until you have signed the testing authorization.

  • Read by the engineer who does the audit
  • Only apps you own or are authorized to test
  • NDA signed before access, if you want one

Read the testing authorization See what access we need

Built with

A sentence or two is plenty: taking payments, a data leak, an app store rejection, an investor about to look at the code.

Which audit?
When do you launch?

05Questions

Before you buy.

Something not answered here? A call is free and optional.

Book a call
01 Do I have to get on a call?

No. You can request the audit, grant access and receive the report without speaking to us. If you would rather talk first, a call is free — but it is never a step you have to take.

02 How do I pay?

By bank transfer. As soon as you send the request, we email the payment details and a reference: ACH or wire in US dollars, or a local transfer from the UK, Europe and several other countries. Work starts once the payment arrives, usually within a day or two.

03 What if you find nothing?

If the report contains no material finding — nothing that would expose data, lose money, break a deployment or block a store submission — we refund the fee in full and you keep the report.

04 Will you test my live app?

Only with your written permission, given in the testing authorization you sign before we begin. Anything that would write data is reproduced on a local or staging copy, never against production.

05 Is my code safe with you?

Access is read-only and revoked when the report is delivered. An NDA and a data processing agreement are available and signed before any access is granted. We never ask for customer data to do an audit.

06 Can you work on an app built with Lovable, Bolt, Replit or Cursor?

Yes. Those four plus v0 and Base44 are most of what we see, and the backends behind them are usually Supabase, Firebase, Neon or plain Postgres. Some platforms make parts of the stack unreachable — typically the server layer — and where that is the case the audit says which findings cannot be fixed without moving off, and what moving would involve.

07 What access do you need, and when?

Read-only for the audit — your repository plus viewer access to hosting and the database. No production credentials and no customer data. Write access is requested only when a sprint starts and is revoked the day it ends. If a finding needs confirming with a live request, we ask for written permission first and anything that writes data is reproduced on a local or staging copy.

08 How long does it take?

The audit is two business days from the moment access works. A sprint is one to two weeks depending on what the audit found. The largest single factor is whether tenant isolation has to be retrofitted, because that touches every query rather than a handful of files.

Find out before your customers do.

Two business days, read-only access, a fixed price — and the fee back if there is nothing material to find.

Prefer to write? Send your requirements

What do you need?

What it should do, who will use it, the must-haves, and any links. A few sentences is plenty.

Budget, if you have one in mind
When would you like to start?