All posts

How to Test Your App Before Launch: A Practical Checklist

The launch checklist that catches embarrassing bugs, plus a starter Playwright test for your money path.

MU

Muhammad Usman

April 10, 2026 · 2 min read

Most launch disasters are not exotic bugs. They are the signup that fails on iPhone, the payment that breaks on a company name with an ampersand, the reset email in spam. A disciplined afternoon catches nearly all of them.

The manual checklist

  • Walk the full core journey as a stranger: signup, main action, payment, logout
  • Repeat it on a real phone, not a resized browser window
  • Try to break every form: empty fields, emojis, very long text, ampersands and quotes
  • Test the money path with declined test cards, not only successful ones
  • Click every email your app sends; check links and spam placement
  • Load list pages with 500 records, not 5
  • Open the browser console and fix every red line before launch

Automate the two paths that matter

Full test coverage can wait. Auth and money cannot. One Playwright test that signs up and pays with a test card pays for itself the first week:

import { test, expect } from '@playwright/test'

test('signup and subscribe', async ({ page }) => {
  await page.goto('/signup')
  await page.fill('[name=email]', `test+${Date.now()}@example.com`)
  await page.fill('[name=password]', 'test-password-123')
  await page.click('button[type=submit]')

  await page.click('text=Upgrade to Pro')
  const stripe = page.frameLocator('iframe[name*=stripe]')
  await stripe.locator('[name=cardnumber]').fill('4242 4242 4242 4242')
  await stripe.locator('[name=exp-date]').fill('12/30')
  await stripe.locator('[name=cvc]').fill('123')
  await page.click('text=Pay')

  await expect(page.locator('text=Welcome to Pro')).toBeVisible()
})

Before you announce anything

Add error tracking like Sentry first. The bugs you did not catch will now email you instead of your users doing it, and the difference in trust is enormous:

import * as Sentry from '@sentry/nextjs'

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  tracesSampleRate: 0.1,
})

Launch day should be boring. If the checklist above is green and the two automated paths pass, it usually is.

Frequently asked questions

Do I need automated tests for an MVP?+

A few tests around money and auth pay for themselves immediately. Full coverage can wait; those two areas cannot.

What is the most commonly missed pre-launch check?+

Emails. Wrong links, spam placement, and missing SPF or DKIM records are the most frequent day-one embarrassments.

Which testing tool should I start with?+

Playwright. It drives a real browser, works with any stack, and one test file covering signup plus payment is a realistic starting point.

More posts