Deploy in 5 Minutes
Push your directory live on Vercel.
This is the shortest path from local to a public URL on Vercel. You'll end up with a *.vercel.app domain serving your directory.
Before you start
- The site runs locally (
pnpm devworks) - Supabase is connected and your schema is loaded
- Your code is pushed to GitHub, GitLab, or Bitbucket
- You have a Vercel account (free tier is fine)
Vercel needs a Git repo to deploy from. If you started from a ZIP (see Getting Access), create a new private repo on GitHub first, then:
git init
git add .
git commit -m "initial commit"
git remote add origin https://github.com/you/your-directory.git
git push -u origin main1. Import to Vercel
- Go to vercel.com/new
- Click Import Project → pick your repository
- Vercel auto-detects Next.js — leave defaults

Vercel respects the vercel.json in the project — it already says pnpm build. You don't have to configure this manually.
2. Paste your environment variables
Before the first deploy, expand Environment Variables on the import page and paste every value from your .env.local.

The minimum set to boot:
NEXT_PUBLIC_APP_URL— your Vercel URL (update it after the first deploy)NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY,SUPABASE_SERVICE_ROLE_KEYCRON_SECRETSTRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_ID_PREMIUM(if using payments)RESEND_API_KEY(if sending emails)
See the full reference for all optional keys.
3. Click Deploy
Vercel runs pnpm install and pnpm build. First build takes 2–4 minutes. If it fails, open the build log — the error is usually a missing env var.
4. Update NEXT_PUBLIC_APP_URL
The site is live, but canonical URLs and OG tags still point to localhost:3000. Fix that:
- Copy your
*.vercel.appURL - Settings → Environment Variables → edit
NEXT_PUBLIC_APP_URLto that URL - Redeploy (Deployments tab →
...→ Redeploy)
5. Point your Stripe webhook at production
If you configured Stripe, its webhook was pointing at localhost (or nothing). Update it:
- Stripe Dashboard → Developers → Webhooks
- Edit the endpoint → change the URL to
https://your-domain.vercel.app/api/webhooks/stripe - Copy the new Signing secret into Vercel as
STRIPE_WEBHOOK_SECRET - Redeploy
See Payments for full Stripe setup.
6. Cron jobs run automatically
The project defines two cron jobs in vercel.json:
{
"crons": [
{ "path": "/api/cron/competitions", "schedule": "15 8 * * *" },
{ "path": "/api/cron/winner-reminders", "schedule": "0 9 * * *" }
]
}Vercel auto-wires these on the Pro plan. On the Hobby plan, cron runs once per day max — good enough to start. See Cron Jobs for what they do.
7. (Optional) Custom domain
When you're ready, swap the *.vercel.app URL for your own domain. See Domain Setup.
What's next
- Having build errors? → Troubleshooting
- Want to understand what the cron jobs do? → Cron Jobs
- Want to tighten SEO? → Site Config