π Deploy
Ship with pnpm run deploy. Two Vercel projects, Production only. GitHub is not required for V1.
Your app works locally. Time to put it on the internet.
The primary path is the GoShipped wizard β not a generic Vercel tutorial.
pnpm run deployIt uses the pinned workspace CLI (vercel in the repo package.json, currently 59.3.0) via pnpm exec vercel. Do not switch to a random global vercel@latest. If you need the vendor CLI docs, start at Vercel CLI.
V1 is Production only
The wizard configures the Production environment. Preview/git integration is optional later. GitHub is not required to go live.
Run Production Check locally first (pnpm run doctor). Fix required failures before you deploy.
You will need a Vercel account. The wizard logs you in if needed.
First deploy
You need an interactive terminal. Non-TTY sessions are rejected (use pnpm run doctor:production in CI).
The wizard, in order:
- Checks the pinned CLI and logs you in if needed
- Creates or links two Vercel projects β API (
apps/api, default name{slug}-api) and Web (apps/web, slug fromapp.name) - Resolves Production URLs
- Builds Production env in memory (nothing uploaded yet)
- Asks how to handle Supabase (reuse the current project or a separate Production project)
- Reuses AI keys and optional Resend / tools / Sentry / MCP as prompted
- Asks for Live Stripe keys if billing is on (Test keys are never copied)
- Shows a review without secret values β uploads allowlisted keys to Production only
- Asks
Deploy API now?thenDeploy Web now? - After the API URL exists, can help register the Stripe Live webhook
- Prints dashboard todos + a summary
Same Vercel project for both apps is a hard stop. Root Directory stays ./ for these CLI uploads.
Skipped extras become todos, not wizard crashes.
What you still do in dashboards
The wizard cannot click every vendor screen:
| Task | Where |
|---|---|
Supabase Site URL + /auth/callback + /auth/confirm | Supabase Auth redirect URLs |
Stripe Live webhook to https://<api>/api/v1/billing/webhooks/stripe | Stripe webhooks (if billing is on) |
| Verify Resend sending domain | Resend domains (if product email is on) |
| Optional custom domains | Each Vercel project |
Auth and billing details: Authentication, Payments, Emails.
The wizard uploads Production env vars for you. Use the Vercel dashboard only for leftovers the summary lists.
Migrations are pnpm supabase:push (or the wizardβs db push). They do not run inside the Vercel build.
Fast redeploy
If GoShipped detects all of:
- Web and API already linked
- Two different Vercel projects
- A successful Production deployment (URL) on each
- Required Production env names for the features you enabled
it offers:
Existing GoShipped deployment detected
Deploy latest code? [Yes / No]Yes β skip the setup interview. Production env is left unchanged. Only new code is uploaded (API, then Web).
No β keep current Production. Exit 0. Nothing deploys.
Stripe keys are not a gate for this shortcut. Production Doctor still reports billing separately if the flag is on.
If something fails
Fast redeploy
| What happened | Result |
|---|---|
| API deploy fails | Stop. Web is not deployed. Exit 1. |
| API succeeds, Web fails | Partial: API is live, Web is not. Exit 1. |
| Both succeed | Exit 0. Your app is live. |
| You decline before deploy | Exit 0. Current Production unchanged. |
First run is more conversational: you can skip a deploy prompt; an API CLI failure still lets the wizard ask about Web. The summary then says Production deployment paused (API/Web βnot deployed yetβ). Run pnpm run deploy again when you are ready. A refused login, CLI version mismatch, or both apps pointed at one project still exit 1.
Ctrl-C exits 130.
After it is live
pnpm run doctor:productionThat inspects linked projects and Production env names. It does not prove the app is bug-free. See Production Check.
Hit https://<api-host>/health once yourself.
Launch checklist
-
pnpm run doctoris clean enough to ship (no required failures) -
pnpm run deploycreated or linked two projects and deployed both - Supabase Auth URLs point at the Web origin
- Live Stripe webhook (if
features.billing) - Resend domain (if
EMAIL_ENABLED) -
pnpm run doctor:production - Legal and marketing copy are yours β Landing Page
You shipped. Now keep building the part that is actually the product.