Founder & Lead Engineer, RAITHub
To test a SaaS application, cover six things in order of risk: tenant isolation (no customer can see another's data), roles and permissions, billing and webhooks, onboarding and the core workflow, the public API, and performance under load. Automate the isolation and billing checks so they run on every release, and gate your CI on them so a failing change cannot reach customers.
If you would rather have this suite built and gated for you, see how RAITHub would test this below, or the QA and test automation overview.
What makes testing a SaaS application different?
A SaaS (software as a service) product serves many customers from one shared system, so a single bug can hit everyone at once, and one wrong query can show one customer another's data. That raises the stakes on two things a single-user app barely has: tenant isolation and billing correctness. Everything else, the core workflow, mobile, accessibility, is normal web testing; these two are where SaaS testing earns its keep.
The model also ships often. A SaaS team that releases weekly cannot test everything by hand each time, so the question is not only what to test but what to automate and gate. The architecture behind this is covered in the multi-tenant SaaS architecture guide.
The SaaS testing checklist, in order of risk
| Area | What to test | Automate and gate? |
|---|---|---|
| Tenant isolation | A user in one tenant cannot read, change or delete another tenant's data, through the UI or the API | Yes, always |
| Roles and permissions | Each role sees and does only what it should; an invited user cannot escalate to admin | Yes |
| Billing and subscriptions | Sign-up, upgrade, downgrade, cancel, failed payment, dunning, and webhook handling including retries and duplicates | Yes |
| Onboarding and core workflow | A new tenant can sign up, invite a team and complete the main job end to end, with empty and error states | Core paths yes, edge cases partly |
| The API | Auth, rate limits, input validation, versioning, and contract tests so clients do not break | Yes, via contract tests |
| Performance and limits | Response times under realistic load, plan limits enforced, no one tenant able to starve others | Load tests on a schedule |
| Accessibility and mobile | Keyboard, screen reader and contrast against WCAG 2.2 AA; core workflow on real phones | Smoke in CI, full audit periodically |
Work top to bottom. If you run out of time, you will have covered the areas where a SaaS bug is most expensive.
How do you test tenant isolation?
Tenant isolation is the test that matters most, because getting it wrong is a data breach. The reliable way to test it is adversarial: write a test that logs in as tenant A, then deliberately tries to reach tenant B's records by ID, through every endpoint that takes one. It should get a 404 or 403 every time, never tenant B's data.
import { test, expect } from '@playwright/test'
import { apiAs } from './helpers'
// Isolation test: tenant A must never reach tenant B's invoice.
test('a tenant cannot read another tenant invoice', async () => {
const tenantB = await seedTenantWithInvoice()
const asTenantA = await apiAs('tenant-a')
const res = await asTenantA.get('/api/invoices/' + tenantB.invoiceId)
// Not the invoice, and not a 200. A leak here is a breach.
expect([403, 404]).toContain(res.status)
})
On Sundor Skin, a B2B wholesale platform RAITHub built, CI fails the build if any buyer-scoped table has no row-level-security policy, so isolation is enforced at the database as well as tested at the API. For the full set of weaknesses to probe, use the OWASP Top 10 testing checklist.
How do you test SaaS billing?
Billing is the second-highest risk because bugs there cost money directly. Test it in your payment provider's test mode, across the full lifecycle, not just a happy-path upgrade:
- Sign up to a paid plan, upgrade, downgrade and cancel, and check what each does to access immediately.
- A failed payment and the dunning that follows: is access cut at the right moment, and restored correctly on retry?
- Webhooks: handle retries and duplicates idempotently, so a webhook delivered twice does not charge or provision twice.
- Proration and plan limits: confirm a tenant cannot exceed its plan, and that limits are enforced server-side, not just hidden in the UI.
The reason webhooks need idempotency is covered in idempotency in API design, and the API checks in the API testing guide.
What should you automate and gate in CI?
Automate the checks whose failure is a disaster and whose inputs do not change often: tenant isolation, permissions and billing. Put them in a CI pipeline that blocks a merge when they fail, so no release can quietly break them. Shape it as a test pyramid, many fast unit and API tests, fewer slow end-to-end ones, as set out in the test pyramid for a SaaS. For teams shipping weekly, this is the difference between confident releases and nervous ones; see a SaaS release process for weekly releases.
Buy, build or hire?
Four ways to get your SaaS tested. The right one depends on how often you ship and whether you have a QA lead.
| Route | What it costs on the market | Choose this when |
|---|---|---|
| A tool or SaaS testing platform | Cloud browser and device testing from $29 to $39 a month per user (BrowserStack) | Your developers write and own the tests and only need devices, browsers or a runner |
| Freelancers or crowdtesting | Upwork median $35 an hour for QA engineers (Upwork) | A one-off pass before a big release, not an ongoing gate |
| An in-house QA hire | US median wage $104,300 in May 2025, before benefits (BLS) | Testing is core and continuous and you can lead a QA function |
| A managed QAaaS team | Quoted per scope: a monthly plan or a dedicated team | You ship often and want isolation, billing and regression gates built and kept green |
The models are compared in full in in-house QA vs outsourced QA vs QAaaS.
Why RAITHub for SaaS testing?
- Isolation tested at the database and the API. On Sundor Skin, CI fails if a buyer-scoped table lacks row-level security, and a security suite tries to read other buyers' data.
- Counted suites. PropDesk runs 1,024 automated tests. Sundor Skin runs 530+. TheSkinProof, the founder's own venture, runs 750+.
- Engineers who build SaaS. RAITHub builds multi-tenant B2B platforms as well as tests them; see QA as a Service.
- Tests you keep. The suite and CI configuration live in your repository, with IP assigned to you and an NDA as standard.
When you don't need us for this
- When your developers already maintain isolation, permission and billing tests gated in CI.
- When you need a certified penetration test or a legal accessibility certificate. RAITHub's security testing is application-level, against OWASP guidance, and its accessibility work certifies nothing.
- When you want testers placed under your own managers. RAITHub does not offer staff augmentation.
- When you need round-the-clock coverage across time zones. RAITHub is a single studio in Dhaka.
How RAITHub would test this
- Scope: the tenancy model, roles, billing lifecycle, core workflows, the API and the load profile.
- Isolation and billing first: adversarial tests that try to cross tenants and double-charge, gated in CI so a regression blocks the merge.
- Breadth next: onboarding, API contract tests, a scheduled load test, and accessibility and mobile smoke checks.
- Reporting: a regular report of what was caught and what changed, and a review of which manual checks should become automated tests.
Timeline: a monthly QA plan or dedicated team runs month to month; a one-off hardening pass is fixed in scope first. You receive: the test suite and CI configuration in your repository, a handover document, full IP and an NDA. Next step: a free 15-minute audit, then a written fixed quote. RAITHub publishes no rates.
To build SaaS release gates, tell RAITHub about your product and release pace.
Frequently asked questions
How do you test a SaaS application?
Test in order of risk: tenant isolation, roles and permissions, billing and webhooks, onboarding and the core workflow, the API, then performance. Automate the isolation and billing checks and gate your CI on them so a failing change cannot reach customers.
What is the most important thing to test in a SaaS app?
Tenant isolation: that no customer can read, change or delete another customer's data. Getting it wrong is a data breach, not a bug, so it is the test to automate and gate first, at both the API and the database.
How do you test multi-tenant data isolation?
Adversarially. Write a test that logs in as one tenant and deliberately tries to reach another tenant's records by ID through every endpoint. It should return 403 or 404 every time, never the other tenant's data.
How do you test SaaS billing safely?
In your payment provider's test mode, across the full lifecycle: upgrade, downgrade, cancel, failed payment and dunning, plus webhook retries and duplicates handled idempotently so a repeated webhook never charges or provisions twice.
What should a SaaS team automate and gate in CI?
The checks whose failure is a disaster and whose inputs rarely change: tenant isolation, permissions and billing. Gate the pipeline so a merge is blocked when they fail, and keep the suite shaped as a test pyramid so it stays fast.
How often should you test a SaaS application?
Continuously, through CI, on every change, plus a wider regression pass before each release and periodic full accessibility and load tests. A SaaS ships often, so testing has to run on every release rather than once before launch.
Related posts
Ready to discuss your project?
Book a free 15-minute technical audit with our engineering team.