Skip to main content

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 dev works)
  • 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)
Downloaded the ZIP instead of forking?

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 main

1. Import to Vercel

  1. Go to vercel.com/new
  2. Click Import Project → pick your repository
  3. Vercel auto-detects Next.js — leave defaults

Vercel Import Git Repository screen

The project uses pnpm and webpack

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.

Vercel env vars settings page

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_KEY
  • CRON_SECRET
  • STRIPE_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:

  1. Copy your *.vercel.app URL
  2. Settings → Environment Variables → edit NEXT_PUBLIC_APP_URL to that URL
  3. 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:

  1. Stripe Dashboard → Developers → Webhooks
  2. Edit the endpoint → change the URL to https://your-domain.vercel.app/api/webhooks/stripe
  3. Copy the new Signing secret into Vercel as STRIPE_WEBHOOK_SECRET
  4. 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