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: