This guide covers the most common issues encountered when self-hosting Cal.diy, along with their solutions.
Onboarding / Setup Issues
Stripe Payment Features Not Working
Symptom: Stripe-related features (paid events, app store payment integration) are not available, or you see errors when attempting to use payment features.
Cause: The Stripe integration requires several environment variables to be configured. These variables are defined across two files: .env (root) and .env.appStore. If they are missing or empty, the Stripe app will be marked as “not installed” and payment-related features will be unavailable.
Solution: Add the following variables to your .env file (root):
STRIPE_PRIVATE_KEY=sk_test_...
STRIPE_CLIENT_ID=ca_...
STRIPE_WEBHOOK_SECRET=whsec_...And in your .env.appStore file (or .env if using a single file):
NEXT_PUBLIC_STRIPE_PUBLIC_KEY=pk_test_...Note: Replace these with your actual Stripe API keys from the Stripe Dashboard . If you don’t need payment features, you can safely leave these empty — the app will function without them, but Stripe-related features will be disabled.
Related issue: #25993
URL and Redirect Issues
Redirect to localhost:3000 After Deployment
Symptom: After deploying Cal.diy to a server or domain, login redirects or internal links point back to http://localhost:3000 instead of your actual domain.
Cause: The environment variables NEXTAUTH_URL and NEXT_PUBLIC_WEBAPP_URL are not set to your production domain. These variables tell Cal.diy and NextAuth where the app is hosted.
Solution: Update your .env file to use your actual domain:
# Replace with your actual domain
NEXT_PUBLIC_WEBAPP_URL=https://cal.yourdomain.com
NEXTAUTH_URL=https://cal.yourdomain.comImportant notes:
- Do not include a trailing slash.
NEXTAUTH_URLis optional ifNEXT_PUBLIC_WEBAPP_URLis set — NextAuth will infer the base URL from the incoming request’sHostheader whenNEXTAUTH_URLis not explicitly configured.- For Docker deployments, these must be set before building the image, as
NEXT_PUBLIC_WEBAPP_URLis a build-time variable (it is inlined by Next.js during the build). Rebuild the image after changing it. - For Vercel deployments, you do not need to set
NEXTAUTH_URL— Vercel automatically infers it from the deployment URL via theVERCEL_URLenvironment variable.
Related issue: #21921
Docker-Specific Issues
API v2 Service Not Starting
Symptom: After running docker compose up -d, the calcom-api service fails to start or immediately exits. The web app works, but API v2 endpoints (/api/v2/...) return connection errors.
Cause: The API v2 service requires several environment variables that are not in the root .env.example. If any required variable is missing, the service will throw a Missing environment variable error and exit on startup.
Solution: Add the following variables to your root .env file (the docker-compose.yml passes these to the calcom-api service):
# Required for API v2 (service will not start without these)
REDIS_URL=redis://redis:6379
JWT_SECRET=your_random_jwt_secret_here
NEXTAUTH_SECRET=your_nextauth_secret_here
CALENDSO_ENCRYPTION_KEY=your_32_character_encryption_key
STRIPE_API_KEY=sk_test_your_stripe_key
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret
# Optional (have sensible defaults)
WEB_APP_URL=https://cal.yourdomain.com
REDIS_PORT=6379
LOG_LEVEL=warnNote:
STRIPE_API_KEYis the API v2 equivalent ofSTRIPE_PRIVATE_KEYused by the web app. Both are Stripe secret keys but are consumed by different services. If you don’t need Stripe functionality in the API, you can set a placeholder value (e.g.,sk_test_placeholder), but the variable must be present.
You can generate secure secrets with:
openssl rand -base64 32Then restart the stack:
docker compose down && docker compose up -dCheck the API v2 service logs for further details if it still fails:
docker compose logs calcom-apiTip: The API v2 service has its own
.env.exampleatapps/api/v2/.env.examplewith a complete list of all supported variables. Refer to it for the full configuration reference.
CLIENT_FETCH_ERROR in Logs
Symptom: The following error appears in Docker logs, and login/session fails:
[next-auth][error][CLIENT_FETCH_ERROR]
request to http://<your-domain>/api/auth/session failed, reason: getaddrinfo ENOTFOUNDCause: The Docker container cannot resolve the external hostname set in NEXTAUTH_URL from within the container’s network.
Solution: Add your domain to the container’s /etc/hosts so it resolves to itself:
# docker-compose.yml
services:
calcom:
extra_hosts:
- "cal.yourdomain.com:127.0.0.1"This allows the container to resolve your public domain internally while keeping NEXTAUTH_URL set to your public URL (required for OAuth callbacks to work).
Important: This approach works when
NEXTAUTH_URLuses HTTP (e.g.,http://cal.yourdomain.com:3000). If yourNEXTAUTH_URLuses HTTPS, the container will attempt to connect to127.0.0.1:443, while the app listens on port 3000 — this will fail. In that case, ensure your reverse proxy is also running inside the Docker network, or see the SSL section below.
Why not use
localhost? SettingNEXTAUTH_URLtolocalhostwould fix this DNS error, but breaks OAuth — external providers like Google would redirect tolocalhostinstead of your domain.
SSL / HTTPS Issues Behind a Reverse Proxy
Symptom: Requests fail with SSL certificate errors when Cal.diy is behind a load balancer or reverse proxy that handles HTTPS termination.
Solution (choose one):
Option 1: If your proxy forwards HTTP internally (most common)
Keep NEXTAUTH_URL set to your public-facing HTTPS URL:
NEXTAUTH_URL=https://cal.yourdomain.comThen configure your reverse proxy to forward these headers so internal requests work correctly:
# Nginx example
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;Why not use
localhost? SettingNEXTAUTH_URL=http://localhost:3000would fix internal SSL errors, but breaks OAuth callbacks — external providers (Google, Microsoft) would try to redirect users tolocalhost, which fails. Always use your public URL.
Option 2: If using self-signed certificates internally
Add your internal CA to Node’s trusted certificates:
NODE_EXTRA_CA_CERTS=/path/to/your-internal-ca.crtOption 3: Last resort (not recommended for production)
NODE_TLS_REJECT_UNAUTHORIZED=0Security Warning: This disables all TLS certificate verification globally, including external API calls to Stripe, Google Calendar, and other services. This makes your instance vulnerable to man-in-the-middle attacks. Only use this in isolated development environments where you fully control all network traffic.
Database Issues
First User Setup Fails
Symptom: Attempting to create the first admin user via the /setup page results in an error.
Cause: This can occur if the database migrations have not been applied, or if the database is in an inconsistent state.
Solution:
- Ensure database migrations are applied:
# For development
yarn workspace @calcom/prisma db-migrate
# For production / Docker
yarn workspace @calcom/prisma db-deploy-
Verify the database is accessible and the
DATABASE_URLin your.envis correct. -
If the issue persists after migrations, check the application logs for the specific Prisma error message — it will indicate which field or constraint is failing.
Note: The setup endpoint (
/auth/setup) creates the first user with theADMINrole. It only works when theUsertable is completely empty. If a previous setup attempt partially succeeded, you may need to manually clear the users table before retrying.
Getting Further Help
If your issue is not listed here:
- Search the Cal.diy GitHub Issues — many common problems have documented solutions in issue threads.
- Check the Cal.com Community forum.
- Review the Docker configuration and Installation guide for any steps you may have missed.