What it is
/welcome is the landing page users are redirected to after a successful one-time license purchase. It shows:
- A success confirmation (with the customer's name when available).
- The license key and the email it's registered to.
- Three onboarding "next steps": access the private GitHub repo, read the quick-start guide, and join the community.
- Primary / secondary CTAs linking to the docs quick-start and the homepage.
The page is server-rendered, i18n-ready, and marked robots: noindex, nofollow — it is only meant to be reached via a redirect from checkout, not indexed.
Query parameters
The page reads the following search params and renders them directly — it does not hit the database:
| Param | Required | Used for |
|---|---|---|
license_key | Optional | Displayed in a highlighted card; hidden if missing. |
email | Optional | Shown alongside the license key ("Registered to …"). |
name | Optional | Personalizes the heading ("Welcome, !"). |
order_id | Optional | Reserved for future use (not rendered today). |
Because values come from the URL, do not pass secrets beyond the license key itself, and make sure your payment provider's redirect is HTTPS.
Where it's wired in
The checkout route in src/app/api/checkout/route.ts sets redirectUrl to ${appConfig.appUrl}/welcome. Your payment provider (Stripe, LemonSqueezy, Polar, or Paddle) appends the license key + customer data as query params via its return URL / webhook. Example LemonSqueezy redirect after a successful purchase:
https://your-app.com/welcome?license_key=ABCD-1234&email=customer@example.com&name=Alex
If you use a different payment provider, configure its post-purchase redirect to the same /welcome URL and the same param names.
Files
| File | Purpose |
|---|---|
src/app/[locale]/(marketing)/welcome/page.tsx | The landing page (server component, reads search params). |
messages/<locale>.json → Welcome namespace | All copy (heading, subtitle, step titles, CTAs). |
src/app/api/checkout/route.ts | Sets redirectUrl so the provider lands users here. |
Not to be confused with…
- Welcome email (
src/lib/email/templates/WelcomeEmail.tsx) — a transactional email sent by the Auth module on signup. Different trigger, different delivery channel, different template. - Onboarding tours (
src/lib/onboarding/) — in-app guided tours for logged-in users. The welcome page runs before login.
Customizing
- Copy — edit the
Welcomenamespace in eachmessages/<locale>.json. - Steps / CTAs — edit the
stepsarray and the two buttons insrc/app/[locale]/(marketing)/welcome/page.tsx. The default steps (GitHub, docs, community) match the license-sale flow; if you're selling a managed SaaS subscription instead of source code, replace them with "Go to dashboard", "Invite your team", etc. - License key block — wrap the
<Card>section with server-side verification (e.g. call your licensing API) if you want to validate the key before rendering it.
Removing the module
If you're not selling one-time licenses (for example, pure subscription SaaS without license keys):
- Delete
src/app/[locale]/(marketing)/welcome/. - In
src/app/api/checkout/route.ts, changeredirectUrlto/dashboard(or any post-checkout page that makes sense for your flow). - Remove the
Welcomenamespace from eachmessages/<locale>.json.