Connecting
Learn/L15 · Your stack (VPS repos)

Convex .cloud vs .site vs VITE_CONVEX_URL

The browser uses .convex.cloud; webhooks use .convex.site; both come from the same project slug.

Difficulty 2/5

Plain English

When the app loads, it connects to VITE_CONVEX_URL (the .cloud URL). When Stripe or Meta sends a webhook, they hit .convex.site routes you define in convex/http.ts.

Analogy

.cloud is the customer entrance; .site is the loading dock for deliveries.

Jessica's wedding portal

Prod build bakes VITE_CONVEX_URL (api.jessicamiralles.com.py is a custom domain on the same deployment).

Agentify CRM

VITE_CONVEX_URL=https://decisive-warthog-196.convex.cloud — inbox live updates. Webhooks: decisive-warthog-196.convex.site.

Go deeper

Frontend = .cloud. External POST = .site.

Common mistakes

  • Putting API keys in VITE_ vars.
  • Pointing webhooks at .cloud instead of .site.

AI-agent trap

Inventing a third URL type or wrong slug — always read .env.example in the repo.

Summary

Rebuild the frontend if you change VITE_CONVEX_URL — it's compiled into the JS bundle.

Confidence: