How to Test Your SaaS Like a Customer: A Pre-Release QA Checklist | Deployxa

Founders test what they built; customers use what they find. A practical pre-release QA checklist for SaaS: the money-path script, fresh-eyes passes, edge cases, and a pass/fail template.

← Back to Dispatch Articles
Engineering Log

How to Test Your SaaS Like a Customer: A Pre-Release QA Checklist

Founders test what they built; customers use what they find. A practical pre-release QA checklist for SaaS: the money-path script, fresh-eyes passes, edge cases, and a pass/fail template.

Founders test what they built. Customers use what they find. Those are never the same product. You click the paths you know exist, from a logged-in admin session, on a fast machine, already knowing what every screen is supposed to say. Your customer arrives with one goal, a phone, a mediocre connection, and zero context. The distance between those two experiences is exactly where one-star reviews and refund requests come from — and closing that distance is the entire job of a pre-release QA pass.

Here is the uncomfortable part: the bugs that cause refunds are rarely crashes. They are the double charge from a double-clicked Pay button, the receipt that landed in spam, the paid feature that never unlocked because a webhook went missing, the subscription nobody could figure out how to cancel. Every one of those is findable in an evening by someone clicking through the app the way a customer would. Almost none of them are caught by admiring your own dashboard with your admin account.

This is a pre-release testing checklist for SaaS founders who have no QA team. It is organized as a series of passes, in priority order: the mindset switch that makes your testing honest, the money-path script you should never skip, the new-user fog test, second-session checks, edge cases worth ten minutes, background behavior, accessibility and performance spot checks, and the discipline that keeps the checklist alive after launch week. You need a spare email address, your payment provider's test keys, and about ninety minutes — no test suite and no hire.

The Tester Mindset Switch: Fresh Eyes, Not Your Dev Machine

Before any checklist item, fix the conditions of the test, because the wrong conditions quietly invalidate every step that follows. Most founder "testing" happens in an environment so privileged it cannot produce a customer's experience at all.

Four moves create honest conditions:

  1. Open a fresh incognito window or a clean browser profile. No cookies, no saved session, no autofill, no admin privileges. You are now a stranger with an email address, which is precisely who your signup flow was built for.
  2. Write down a customer's actual goal — not "check out the settings page," but "sign up and send my first invoice." Every pass in this article is judged against that goal, because customers judge software the same way.
  3. Slow the network down. Your browser's developer tools can throttle to a slow 3G profile, or you can simply run the pass on your phone over cellular. Spinners, timeouts, and retry logic only exist where the network is imperfect.
  4. Put a phone in your hand. Many of your customers will first meet your product on a small screen with one thumb. Test where they live, not where you developed.

The table below is the gap, made explicit. Every row is a way your normal session lies to you:

  • How you usually open the app: Logged-in admin session — What it hides: Signup, email verification, first login, empty states — The customer's version: Fresh email, fresh session, no history
  • How you usually open the app: Localhost or fast office Wi-Fi — What it hides: Loading states, timeouts, retry behavior, error paths — The customer's version: Train Wi-Fi, cellular, shared hotel broadband
  • How you usually open the app: Desktop viewport at 1440px — What it hides: Layout collapse, tap-target sizes, sticky-header overlap — The customer's version: A phone held in one hand
  • How you usually open the app: Founder's knowledge of the product — What it hides: Dead ends, unclear labels, missing next steps — The customer's version: One goal and zero context

None of this requires tooling. It requires refusing to test from the position of the person who built the thing. Every pass below assumes you have made the switch.

The Money-Path Script: The One Pass You Never Skip

The money path is the ordered set of steps between a stranger and your revenue — and, just as importantly, back out of it again. It gets its own script and its own discipline because it is where the most expensive bugs live: payment flows fail silently far more often than they fail loudly. A missed webhook does not throw an error in your face; it leaves a customer who paid for a feature they cannot use — the cleanest recipe for a refund request ever invented.

Three rules before you start. First, use your payment processor's test mode and test payment keys — never a live card, and if you cannot safely exercise payments on production, run this pass on a staging environment first (more on that below). Second, write down the result of every step as you go; memory degrades fast across ninety minutes. Third, no skipping: if step four fails, still run steps five through nine, because you need the complete map of what a customer would experience, not just the first broken thing.

Run it exactly in this order:

  1. Sign up as a brand-new customer with an email you have never used in the app. Fill the form the way a customer would — no admin shortcuts, no seeding the database first. [ PASS / FAIL ]
  2. Verify the email. Does the message arrive in seconds? Does the link work? What happens if you click it twice, or after it expires? [ PASS / FAIL ]
  3. Log in with the account you just created — typed credentials in a fresh session, not a password manager autofill from your own account. [ PASS / FAIL ]
  4. Upgrade to paid with a test payment method. Use the processor's test card in test mode. Watch for the confirmation screen, the plan change in the UI, and any error handling on a deliberately declined card. [ PASS / FAIL ]
  5. Receive the receipt. Check the inbox and the spam folder. A receipt that lands in spam is a chargeback waiting to happen. [ PASS / FAIL ]
  6. Use the paid feature. Log the state change all the way through: is the feature actually unlocked, in this session and in a fresh one? [ PASS / FAIL ]
  7. Downgrade to the free plan. Does the UI reflect it immediately, and does access to the paid feature actually end when it should? [ PASS / FAIL ]
  8. Cancel the account or subscription entirely. How many clicks does it take, and is there a working confirmation? [ PASS / FAIL ]
  9. Confirm data handling on cancel. What did the customer receive — a confirmation email, a data-export offer, a retention notice? Is what actually happens to their data what your privacy policy says happens? [ PASS / FAIL ]

How to treat the results: a FAIL on step 4, 5, or 6 is launch-blocking — never let a release ship while the payment flow is broken at any point. A FAIL on step 9 is a trust problem, and increasingly a compliance problem, not just a UX nit. Every FAIL gets a screenshot before you close the tab, because you will need it when you file the fix.

The New-User Fog Test: Can a Stranger Succeed Without You?

You know what your app is for. That knowledge is fog from the customer's side of the glass, and the only way to test through it is to borrow someone who does not share it. Hand your product to a person who has never used it — a friend, a partner, another founder — give them only the goal in writing ("sign up and create your first invoice"), and then stay silent. Completely silent. Every hesitation, every wrong click, every "where do I…?" is an onboarding bug, even when the code is working exactly as designed. You are not testing their intelligence; you are testing your labels, defaults, and flow. Write down the exact moments they hesitate — those moments are where your first activated customers are leaking out.

If no human is available, two cheaper approximations: come back to your own app after forty-eight hours away, and hand yourself a goal you normally complete in a different order. The fog partially returns with time and unfamiliarity — it never fully returns for the founder, which is why the borrowed stranger is worth the favor.

Then run the empty-state check, the fog test's most neglected sibling: what does the app look like with zero data? Empty states are the first screen every new customer sees and the last thing anyone designs. Walk every core page with a brand-new account and judge each one as both a first impression and an instruction. Blank chart frames, a list that says "No results" with no suggested next action, a tile showing a division error instead of a zero — each tells a new customer the product is not ready for them. The test question for every empty screen: does it tell the customer what to do first?

Second-Session Checks: Where Session and Layout Bugs Live

Most founders test the first visit and stop. A remarkable share of bugs live in the second visit, where cached state, expired tokens, and saved preferences first interact with real usage. Three checks cover the territory:

  • Log out, then log back in. Does logout actually end the session — the back button should not resurrect your dashboard? Does login work with the credentials you just created? Does "remember me" remember, and does a forgotten-password email arrive and reset cleanly? Password reset is perennially a top support ticket for young SaaS products; test it before customers do it for you.
  • Open the app on a real phone. Not a resized desktop window — an actual device. Resizing misses what real mobile rendering reveals: tap targets that overlap, a sticky header covering the save button, the on-screen keyboard hiding the field you are typing into. Responsive layout bugs cluster between breakpoints, where no preview pane thinks to look.
  • Open it in a second browser — a different engine, not just another window. Apps are developed in one browser and used in five. Session handling, date pickers, file inputs, and cached local storage all behave differently across engines, and this is where stale-assumption bugs surface.

The unifying theme: session handling and responsive layout are the two bug families that only appear outside your development environment. If you have time for nothing else after the money path, do these three checks.

Edge Cases Worth Ten Minutes

Edge cases sound like developer indulgence until you price them. A duplicated charge is a refund plus a support ticket plus a trust dent; a crashed upload is a customer who now doubts every other feature. Ten minutes on the list below catches the classics:

  • Double-click the submit button on every form that matters — signup, upgrade, and above all the Pay button. If a second click produces a second charge, you have found a very expensive bug: buttons should disable after click and the underlying action should be idempotent.
  • Upload a 50MB file and a 0-byte file. Size limits, validation, error messages, the progress bar — and what happens to the database record when an upload fails halfway.
  • Paste emoji and right-to-left text (Arabic or Hebrew works well) into every text field you own. Save, reload, and export — encoding bugs that corrupt customer data are cheap to find this way and painful to find the other way.
  • Refresh mid-flow — on the upgrade step, and halfway through any multi-step form. Lost state, a half-created record, or a second charge are all common answers.
  • Use the back button after checkout. The classic failure: a "your payment failed" page after a success, or a re-submitted order.
  • Enter extremes in numeric fields — 0, negative one, a million — and paste an email with leading and trailing spaces into your signup form. Then try to log in with the same pasted email.

None of this is exhaustive QA. All of it is the ten percent of edge testing that prevents ninety percent of the embarrassing tickets.

Notifications and Background Behavior

Your app does work the customer never sees, and "the code ran" is not the same as "the outcome happened." Background failures are the silent category — nothing crashes, nothing alerts; the customer simply never receives what they were promised:

  • Background behavior: Transactional emails — How to verify it: Trigger each one (signup, receipt, reset, cancellation); check inbox and spam — Failure signature: Signup confirmed on screen, email never arrives; receipts in spam
  • Background behavior: Payment webhooks — How to verify it: Send a test-mode transaction; watch the endpoint log and the database state — Failure signature: Payment succeeded, feature stayed locked; no error anywhere
  • Background behavior: Scheduled / nightly jobs — How to verify it: Inspect job logs for run count and duration — Failure signature: Reminder email sent twice; metered billing charged twice
  • Background behavior: Retries — How to verify it: Interrupt a job mid-run; let it retry — Failure signature: Duplicate side effects after retry (two emails, two records)

The nightly-jobs row deserves a special warning: if you run more than one app instance and your scheduler lives inside application code, every instance may fire the same job — the report goes out twice, the reminders double, and nobody notices until a customer mentions it. Check the logs for the run count, not just the run. And for anything payment-related, a webhook that never arrives produces a paying customer with an unlocked nothing while every graph looks perfectly healthy.

Accessibility and Performance Spot Checks

These are spot checks to find obvious breakage — not an audit, and not an exercise in chasing a perfect tooling score. Fifteen minutes total:

  • Navigate the money path with the keyboard only. Unplug the mouse and tab through signup → upgrade → pay. Can you complete the flow? Is the focused element visibly highlighted? Can you escape the payment modal, or does it trap you? A money path that traps keyboard users excludes real customers, and the fix is usually a handful of focus states.
  • Check alt text on key images. View your most important pages with images disabled (or inspect the attributes directly). Meaningful images need meaningful alt text; purely decorative images need empty alt attributes. If your onboarding screenshots are the only way to understand a step, keyboard and screen-reader customers are stuck.
  • Load your heaviest page on a throttled connection. Slow-3G throttling, or your phone in a lift if you want the analog version. If the dashboard takes more than three or four seconds to become usable, customers on poor networks feel that every day. Note the number, fix the worst offender, and resist optimizing beyond "usable on a bad connection" before launch.

Regression Discipline: Run It Before Every Release, Not Every Deploy

A checklist you run on every deploy is a checklist you will abandon by week three, so separate two words founders often use interchangeably. A deploy is new code going live. A release is something a customer can notice: a new feature, a pricing change, a new onboarding step, a migration, a redesigned screen. The full checklist belongs in front of every release; small internal fixes can ride behind a shorter smoke pass — can I sign up, log in, reach the paid feature, and is the receipt email firing?

Three habits keep the checklist alive:

  • Keep it in the repository, next to the code it tests. A checklist living in a founder's head dies with founder memory, cannot be handed to your first hire or a contractor, and cannot be improved by anyone but you. Version it like code, and mark which steps a computer could run.
  • Automate what you run daily. The steps that are pure HTTP — signup works, login works, the paid page returns success, the health endpoint answers — make a cheap scripted smoke test that runs after every deploy. The judgment passes stay human: no script can tell you that an empty state feels like a dead end.
  • Re-run the failed steps after fixing. A fix that is not re-tested through the customer's path is a hypothesis, not a fix. This is also where a health-gated rollout earns its keep: when the release does go out, the platform verifies the new version is healthy before traffic switches, so a regression your checklist missed does not become an outage at the same moment.

Recording Results: A Pass/Fail Template

Memory lies after ninety minutes of clicking, so record results as you go — one line per step, and a screenshot for anything you flag. Screenshots settle later arguments about what was broken and when, and they become the bug report itself. This template takes two minutes to fill in and is the whole artifact your fix session will be organized around:

PRE-RELEASE QA — v1.4.0 — 2026-05-14 — tester: founderScope: full checklist + money path (test payment keys)PASS = worked as a customer expects. FAIL = bug filed. FLAG = judgment call. 1. Signup (fresh email) ...................... PASS2. Email verification (link, expiry) ......... PASS3. Login (new session) ........................ PASS4. Upgrade to paid (test card) ................ FAIL #15. Receipt email (inbox + spam) ............... PASS6. Paid feature usable ........................ FAIL #17. Downgrade .................................. PASS8. Cancel ..................................... PASS9. Data handling after cancel ................. PASS10. New-user fog test (stranger, one goal) ..... FLAG #211. Empty states on all core pages ............. PASS12. Logout / login / password reset ............ PASS13. Mobile pass (real phone) ................... PASS14. Second browser ............................. PASS15. Edge cases (double-click, uploads, emoji) .. FAIL #116. Emails, webhooks, nightly jobs ............. PASS17. Keyboard-only money path ................... FLAG #318. Heaviest page on throttled connection ...... PASS Issues:#1 Pay button accepts double-click; two test charges created [screenshots 01-02] — BLOCKER, fix before release#2 Empty dashboard gives no first action [screenshot 03] — fix this release if time allows#3 Focus indicator invisible on upgrade modal — next release Verdict: NOT READY — fix blocker #1, then re-run steps 4-6

The verdict line is the discipline. "Mostly fine" is not a state a release can be in; a release is either ready or it is not, and the blockers list is the difference.

The Pre-Release Testing Checklist for SaaS: Printable Summary

The whole article, compressed to the wall-chart version. Print it, tick it, keep it in the repo:

  • Fresh-eyes setup: incognito session, brand-new email, test payment keys, phone charged
  • Money path: sign up → verify email → log in → upgrade with test card → receive receipt → use paid feature → downgrade → cancel → confirm data handling; every step PASS or FAIL, no skipping
  • Payment failures treated as launch blockers; data handling on cancel treated as a trust issue
  • Fog test: a stranger completes the core action with no narration; hesitations written down
  • Empty states reviewed on every core page: does each one say what to do first?
  • Second session: log out and back in, password reset, real phone, second browser engine
  • Edge cases: double-clicked submits, 50MB and 0-byte uploads, emoji and RTL text, refresh mid-flow, back button after checkout, numeric extremes
  • Notifications: every transactional email fires (inbox and spam), payment webhooks arrive and update state, nightly jobs run once
  • Accessibility spot check: keyboard-only money path, visible focus, alt text on key images
  • Performance spot check: heaviest page usable on a throttled connection
  • Results recorded line by line with screenshots; every FAIL has an owner and a re-test
  • Checklist lives in the repo; scripted smoke test covers the daily HTTP steps

Ninety minutes, one evening, no new tools. That is the honest price of the alternative — finding these bugs by refund request.

Where Deployxa Fits — and Where It Doesn't

Everything above is deliberately platform-agnostic, and it works on any stack. Where a deployment platform changes the picture is in where the script runs and what happens after it passes:

A safe place to run the full script. The money-path script should run against a staging or non-production project with test payment keys before a release ever reaches paying customers. On Deployxa, non-production projects deploy the same way production does — Git repositories or local projects as containerized applications, with automatic framework and runtime detection and zero Dockerfile configuration for supported stacks — so the environment you test behaves like the environment you ship, not like a second app you have to keep in sync.

Isolation per feature. For a larger feature, the same idea scales down: give the branch its own environment — a preview deployment, where your workflow supports one — so QA on one feature never races QA on another and a broken experiment never contaminates the shared staging copy. Whether that is a second non-production project or a per-feature preview, the goal is identical: a place the script can run that is not production.

A health-gated production release. When the checklist passes, Deployxa's blue/green releases put the new version in a standby slot, verify its health, and only then switch traffic — with the prior healthy release kept warm for a short rollback window, inside which a rollback can be sub-second. If the first real customers find something your script did not, the cost of being wrong is seconds, not an incident evening.

And the honest limit: no platform can click through your signup flow, catch the double-clicked Pay button, or judge whether an empty state feels like a dead end. QA is your product's responsibility, and no hosting decision changes that. What a platform owes you is a faithful copy of production to test against and a safe mechanism for releasing what passed — the docs cover how those pieces work, but the clicking is yours.

Run the Money Path on Your Live App This Week

Do not save this for the next release. This week, run the money-path script against your current production app — the one customers are using right now — with a fresh email address and your processor's test payment keys. For the payment and cancellation steps, use test mode or a staging copy rather than real charges, and never run destructive steps against real customer data; if the full script is not safe to exercise on your live product yet, that itself is a finding worth acting on, and a non-production project is the afternoon's fix. Most founders who do this find something: a receipt quietly landing in spam, a Pay button that happily charges twice, a cancel flow that ends in a dead end, an empty state that greets every new customer with nothing. Finding it before a customer does is the entire point. The gap between what you tested and what customers use does not close by itself — close it once this week, on purpose, before the next refund request closes it for you.

Ready to deploy with Deployxa?

Deploy your apps globally with automatic SSL and AI diagnostics.

Start Free Now