Before your first customer pays, they should be able to create an account, get a useful result, buy the right plan, and come back to their saved work. You should also know what happens when one of those steps fails.
This Next.js SaaS launch checklist is for a founder or small team shipping a web product with accounts and recurring subscriptions. It focuses on things you can actually verify in a release rehearsal. Adapt the billing steps if you sell one-time purchases or offer a trial.
Start with one complete customer journey
Choose the smallest useful outcome your product offers: creating a project, exporting a report, sending an invoice, or saving a working automation. Write it in one sentence. That outcome is the center of your first release.
Then follow one fresh account through the whole journey. Testing isolated screens can miss the handoff between them: the signup succeeds but verification never arrives, or checkout works but paid access never appears.
- 01Sign upA real account
- 02Get valueOne useful result
- 03UpgradeA clear purchase
- 04Use itThe right access
- 05ReturnEverything intact
Use a staging deployment with production-like configuration and the payment provider's sandbox. Start with an empty account, rather than the admin account you have used throughout development. Keep a short record of each step, its expected result, and any failure you find.
For example, in a project-management SaaS, the rehearsal might be: sign up, verify email, create a project, invite a collaborator if that is part of the launch scope, upgrade, and use the paid feature. Open a new session afterward and check that the project and permissions are still correct.
01. Make identity and data ownership work together
A signed-in customer still needs permission to access each record. Test both the page and the operation behind it. A redirect on a dashboard page cannot, by itself, protect a separate mutation endpoint. The Next.js authentication guide recommends checking authorization in Server Actions and Route Handlers as well.
Create two ordinary accounts. Save a record in account A, copy its ID, and try to read or change it as account B. The operation should fail without revealing account A's data. Repeat the check while signed out.

For a hypothetical projects table, the ownership boundary can be expressed in the query itself:
SELECT id, title
FROM projects
WHERE id = $1 AND user_id = $2;Here, $1 is the requested project ID. $2 must come from the authenticated server session. Accepting a user ID supplied by the browser would let the caller choose whose records to query. Apply the same ownership condition to updates and deletes.
Also rehearse email verification, sign-out, and password recovery. Open an expired or already-used recovery link and check that the app explains how to request a new one. In Motoko Base, the Better Auth guide documents the session and verification setup you can build on.
Pass condition: the correct customer can reach their work; another customer cannot reach it by changing an ID.
02. Make the first useful result survive a new session
A successful toast is only one part of saving data. Refresh the page, sign out, sign back in, and confirm that the result is still there. Check empty states too: a new account should have a clear next action and an explanation of what it will create.
Try submitting the main form twice. Try invalid input and a request that fails. The screen should preserve useful input and give the customer a practical recovery action, such as retrying the save. If the operation creates an expensive or irreversible side effect, give it an explicit duplicate-prevention strategy.
Before deployment, apply and verify the database migrations the release needs. A schema that exists on your laptop does not establish that production has it. Motoko Base's migration guide covers its Drizzle workflow.
Pass condition: a fresh customer can create one useful result, and it remains correct after a refresh and a new session.
03. Connect payment to the right access
Treat checkout and access control as separate things to verify. A browser arriving at a success URL is not proof that an account has a paid entitlement. The server should make that decision using trusted billing state.
With Polar, verify incoming webhook signatures and inspect failed deliveries. Its webhook delivery documentation explains signature validation, delivery inspection, and redelivery. If your handler triggers a side effect, make repeated delivery safe: sending the same event again should not grant a second credit or create a second order.
Write down the access policy before you test it. Here is an example for a subscription product; your trial and payment-recovery rules may differ.
| Situation | Intended behavior | How to verify it |
|---|---|---|
| No paid subscription | Free features remain available | Call a paid operation from a free account |
| Active subscription | The purchased plan is available | Buy in the sandbox, then use the feature |
| Cancellation at period end | Access continues until the agreed end date | Cancel and check the recorded end date |
| Access period has ended | Paid operations stop | Test an ended subscription |
| Repeated event delivery | No duplicate business side effect | Redeliver the event and compare the result |
Motoko Base maps provider billing state to server-side entitlements; its webhook handler verifies events and invalidates billing caches. Your product still needs to connect those entitlements to its own paid operations. Follow the payments guide when configuring products and checkout.
Pass condition: the right account gets the right access, and cancellation, expiry, and duplicate delivery follow your written policy.
04. Make email a working part of the product
If signup requires a verification email, delivery is part of onboarding. If a customer forgets their password, recovery depends on it too.
Send both messages from the deployed environment to an inbox outside your team. Check the sender, link destination, expiry behavior, and the page reached after clicking. Repeat the flow on a phone. A message that arrives with a localhost link still leaves the customer blocked.
For Resend, configure and verify a domain you own before using it as your production sender. The verified-domain documentation describes that setup. Then check your actual message delivery; domain verification alone does not guarantee that every recipient will receive an email.
Keep transactional emails focused: explain what happened, provide the action, and give the recipient enough context to recognize your product. Motoko Base's email guide describes its sender configuration and templates.
Pass condition: verification and password recovery work from the customer's inbox all the way back to the deployed app.
05. Rehearse the deployed release
Run the checks your project defines, then test the resulting production server. Development mode can hide differences in rendering, environment configuration, and integrations. For Motoko Base, the local commands are:
pnpm lint
pnpm typecheck
pnpm test
pnpm build
pnpm startConfirm that production uses the intended database, public origin, OAuth callbacks, sender identity, payment environment, and product IDs. Keep credentials server-side; Next.js documents that variables prefixed with NEXT_PUBLIC_ are inlined into browser JavaScript. Never use that prefix for a secret.
Use the production setup guide alongside your deployment settings. Check these three surfaces deliberately:
- The customer surface: the main journey works on a phone, with a keyboard, and when a request fails. Pricing and a working support contact are easy to find.
- The public surface: the landing page and published articles have useful titles, descriptions, and canonical URLs. Decide explicitly which account and application pages should be excluded from search. Search directives are not access control.
- The recovery surface: you can identify a failed request without logging passwords, tokens, or private customer content. You can redeploy a previous release and restore a database backup into a safe test environment. Consider migration compatibility before rolling application code back.
The official Next.js production checklist is a useful framework-level companion. The checklist below adds the customer journey and billing checks specific to a small SaaS launch.
Your Next.js SaaS launch checklist
Run a rehearsal against the candidate release. Check each item only after you have observed the result. If something fails, record the behavior and fix it before repeating that part of the journey.
What can wait until after launch?
Keep features that the first customer journey actually requires. A team product may need invitations immediately; a solo writing tool may not. Let that distinction determine the scope.
| Usually needed for the first release | Often reasonable to defer |
|---|---|
| One clear onboarding path | Multiple onboarding variants |
| One understandable paid offer | A large pricing matrix |
| A reliable core workflow | A catalog of secondary features |
| Working support and useful error diagnostics | A custom support dashboard |
| The integrations customers need to finish the task | Integrations added only to lengthen a feature list |
A useful test is: if this is missing, can the first customer still get the result they are paying for? If the answer is yes, keep it in the backlog until real usage gives you a reason to prioritize it.
Where Motoko Base fits
Motoko Base provides a foundation for authentication, database access, billing, email, and the application shell. We built it to make those pieces easier to connect and extend. The examples above use that stack, but the release checks apply when you assemble your own foundation too.
A starter does not validate your product's permissions, configure your production accounts, or decide what customers should be able to do. Use it to spend more of your time on the product-specific workflow, then run the same launch rehearsal against the app you ship.
A few questions before you ship
Do I need every authentication provider at launch?
Start with the sign-in method your intended customers can use reliably. Add another provider when it solves an actual access problem. Test the recovery path for every method you enable.
Can I test payments entirely in a sandbox?
Use the sandbox for repeatable success, cancellation, and failure scenarios. Separately verify your live configuration, approved account, product mapping, and webhook endpoint before accepting customers. A working sandbox does not establish that live settings are correct.
Does this checklist guarantee a secure launch?
No. It is a focused release rehearsal for a small SaaS, not a security audit or a complete reliability program. Extend it for your data, customer requirements, infrastructure, and the consequences of a failure.
