* feat: add holidays feature for automatic availability blocking- Add UserHolidaySettings model for storing user preferences- Generate static holiday data for 20 countries using date-holidays- Create HolidayService for runtime holiday queries- Add TRPC router with endpoints for country selection and holiday toggles- Create Holidays tab UI in Availability page with conflict warnings- Integrate holiday blocking into getUserAvailability calculation- Show holiday indicator on blocked dates in booker page- Add warning in OOO modal when dates overlap with holidays * feat: add optimizations, tests, and code quality improvements - Add memoization/caching to HolidayService for better performance - Optimize checkConflicts DB query with OR conditions for specific dates - Add HolidayService unit tests (10 tests) - Add error handling with Alert component for failed queries - Memoize HolidayListItem component to prevent unnecessary re-renders - Extract magic numbers into constants.ts - Use TRPCError consistently in handlers - Add missing i18n keys for error messages - Update handlers to follow Cal.com patterns (default exports, minimal comments) - Add regeneration instructions in constants * refactor: replace static JSON with Google Calendar API integration - Add GoogleHolidayService to fetch holidays from Google Calendar public calendars - Add HolidayCache Prisma model for caching API responses - Add GOOGLE_CALENDAR_API_KEY and HOLIDAY_CACHE_DAYS env variables - Support 38 countries via Google Calendar holiday calendars - Update HolidayService methods to async with database caching - Update all TRPC handlers for async holiday methods - Fix UI to display holiday dates correctly - Remove static holidays.json and generate script * use we instead of calcom in i18n message * address cubics comments * move holidays from availability to ooo * public holidays filter for holidays * follow i18n _one and _other pattern * remove holiday feature flag * revert lint command code change * revert lint command code change 2.0 * revert lint command code change 3.0 * bye bye my christmas emoji :crying-emoji * remove comments * refactor(holidays): add repository pattern, split services, and add tests - Create HolidayRepository for database operations - Split GoogleHolidayService into GoogleCalendarClient and HolidayCacheService - Add dependency injection to HolidayService and HolidayCacheService - Update TRPC handlers to use HolidayRepository - Add tests for HolidayRepository and calculateHolidayBlockedDates - Update calendar IDs to use official holiday format (244 countries + religions) * fix: address PR review feedback - Remove unused date-holidays package - Add pluralization for and_more_holidays_with_conflicts translation - DRY: spread GOOGLE_RELIGIOUS_HOLIDAY_CALENDARS into GOOGLE_HOLIDAY_CALENDARS - Add select to userHolidaySettings query in getUserAvailability - Optimize checkConflicts with pre-computed timestamps * refactor(holidays): apply proxy pattern and move logic to service - Rename HolidayCacheService to HolidayServiceCachingProxy (proxy pattern) - Remove HOLIDAY_CACHE_DAYS env var, use constant directly - Add isSupportedCountry() method to HolidayService - Add getUserSettings() and updateSettings() to HolidayService - Move toggleHoliday logic from handler to service - Move checkConflicts logic from handler to service - Add findBookingsInDateRanges() to HolidayRepository - Simplify all handlers to just call service methods * feat(bookings): add backend validation to prevent booking on holidays Adds explicit holiday conflict validation during booking creation to handle the race condition where a host enables a holiday after a guest selects a date but before they submit the booking. Changes: - Add checkHolidayConflict validation with HolidayRepository integration - Integrate ensureNoHolidayConflict in RegularBookingService - Add BookingOnHoliday error code with proper HTTP 400 response - Handle holiday error display in BookEventForm with name interpolation - Hide trace ID for expected validation errors - Add unit tests for holiday conflict validation * fix failing type check * fix: address PR review comments for holiday feature - Change error code from BAD_REQUEST to INTERNAL_SERVER_ERROR in toggleHoliday handler (errors are internal failures, not bad input) - Refactor ensureNoHolidayConflict to use Promise.all for parallel user checking instead of sequential loop * refactor: use Promise.all with logging in loop for holiday check - Check all users in parallel using Promise.all - Log conflicts inside the loop as they are detected - Wait for all checks to complete before throwing error * fix(holidays): use host timezone for holiday conflict checks The holiday feature was checking booking dates against holidays using server/local timezone instead of the host's timezone. This caused bookings near midnight boundaries to incorrectly pass or fail the holiday check. Example: A booking at Dec 24th 8PM UTC (which is Dec 25th in IST) was not being blocked for an Indian host with Christmas as a holiday. Changes: - Add .utc() to holiday date formatting for consistency - Fetch host's timezone in checkHolidayConflict - Convert booking time to host's timezone before comparison - Add findUserSettingsWithTimezone to HolidayRepository - Update error message to clarify it's the host's local time - Add timezone edge case tests * fix(holidays): align holiday blocking with OOO pattern for consistent timezone handling - Simplify calculateHolidayBlockedDates to match OOO pattern using dayjs.utc() - Fix date range query to use full day bounds (startOfDay/endOfDay) so holidays stored at midnight UTC are correctly found during booking validation - Remove separate checkHolidayConflict booking-time validation - holidays now block through oooExcludedDateRanges like OOO does - Remove getHolidayOnDate from HolidayService (no longer needed) - Remove findUserSettingsWithTimezone from HolidayRepository (no longer needed) - Clean up related tests Holiday blocking now works exactly like OOO: 1. Holidays are added to datesOutOfOffice in calculateHolidayBlockedDates 2. buildDateRanges processes them via processOOO with .tz(timeZone, true) 3. oooExcludedDateRanges excludes those dates from availability 4. ensureAvailableUsers uses oooExcludedDateRanges to block bookings This ensures consistent timezone handling where Dec 25th blocks all hours of Dec 25th in the host's timezone, regardless of booker's timezone. * update test * update .env.example file
512 lines
19 KiB
Bash
512 lines
19 KiB
Bash
# ********** INDEX **********
|
|
#
|
|
# - LICENSE (DEPRECATED)
|
|
# - DATABASE
|
|
# - SHARED
|
|
# - NEXTAUTH
|
|
# - E-MAIL SETTINGS
|
|
# - ORGANIZATIONS
|
|
|
|
# - LICENSE (DEPRECATED) ************************************************************************************
|
|
# https://github.com/calcom/cal.com/blob/main/LICENSE
|
|
#
|
|
# Summary of terms:
|
|
# - The codebase has to stay open source, whether it was modified or not
|
|
# - You can not repackage or sell the codebase
|
|
# - Acquire a commercial license to remove these terms by visiting: cal.com/sales
|
|
#
|
|
|
|
# To enable enterprise-only features please add your environment variable to the .env file then make your way to /auth/setup to select your license and follow instructions.
|
|
|
|
CALCOM_LICENSE_KEY=
|
|
# Signature token for the Cal.com License API (used for self-hosted integrations)
|
|
# We will give you a token when we provide you with a license key this ensure you and only you can communicate with the Cal.com License API for your license key
|
|
CAL_SIGNATURE_TOKEN=
|
|
# The route to the Cal.com License API
|
|
CALCOM_PRIVATE_API_ROUTE="https://goblin.cal.com"
|
|
# ***********************************************************************************************************
|
|
|
|
# - DATABASE ************************************************************************************************
|
|
DATABASE_URL="postgresql://postgres:@localhost:5450/calendso"
|
|
# Needed to run migrations while using a connection pooler like PgBouncer
|
|
# Use the same one as DATABASE_URL if you're not using a connection pooler
|
|
DATABASE_DIRECT_URL="postgresql://postgres:@localhost:5450/calendso"
|
|
INSIGHTS_DATABASE_URL=
|
|
|
|
# Uncomment to enable a dedicated connection pool for Prisma using Prisma Data Proxy
|
|
# Cold boots will be faster and you'll be able to scale your DB independently of your app.
|
|
# @see https://www.prisma.io/docs/data-platform/data-proxy/use-data-proxy
|
|
# PRISMA_GENERATE_DATAPROXY=true
|
|
PRISMA_GENERATE_DATAPROXY=
|
|
|
|
# ***********************************************************************************************************
|
|
|
|
# - SHARED **************************************************************************************************
|
|
# Set this to http://app.cal.local:3000 if you want to enable organizations, and
|
|
# check variable ORGANIZATIONS_ENABLED at the bottom of this file
|
|
NEXT_PUBLIC_WEBAPP_URL='http://localhost:3000'
|
|
# Change to 'http://localhost:3001' if running the website simultaneously
|
|
NEXT_PUBLIC_WEBSITE_URL='http://localhost:3000'
|
|
NEXT_PUBLIC_CONSOLE_URL='http://localhost:3004'
|
|
NEXT_PUBLIC_EMBED_LIB_URL='http://localhost:3000/embed/embed.js'
|
|
|
|
# To enable SAML login, set both these variables
|
|
# @see https://github.com/calcom/cal.com/tree/main/packages/features/ee#setting-up-saml-login
|
|
# SAML_DATABASE_URL="postgresql://postgres:@localhost:5450/cal-saml"
|
|
SAML_DATABASE_URL=
|
|
# SAML_ADMINS='pro@example.com'
|
|
SAML_ADMINS=
|
|
# NEXT_PUBLIC_HOSTED_CAL_FEATURES=1
|
|
NEXT_PUBLIC_HOSTED_CAL_FEATURES=
|
|
# For additional security set to a random secret and use that value as the client_secret during the OAuth 2.0 flow.
|
|
SAML_CLIENT_SECRET_VERIFIER=
|
|
|
|
# If you use Heroku to deploy Postgres (or use self-signed certs for Postgres) then uncomment the follow line.
|
|
# @see https://devcenter.heroku.com/articles/connecting-heroku-postgres#connecting-in-node-js
|
|
# PGSSLMODE='no-verify'
|
|
PGSSLMODE=
|
|
|
|
# Define which hostnames are expected for the app to work on
|
|
ALLOWED_HOSTNAMES='"cal.com","cal.dev","cal-staging.com","cal.community","cal.local:3000","localhost:3000"'
|
|
# Reserved orgs subdomains for our own usage
|
|
RESERVED_SUBDOMAINS='"app","auth","docs","design","console","go","status","api","saml","www","matrix","developer","cal","my","team","support","security","blog","learn","admin"'
|
|
|
|
# - NEXTAUTH
|
|
# @see: https://github.com/calendso/calendso/issues/263
|
|
# @see: https://next-auth.js.org/configuration/options#nextauth_url
|
|
# Required for Vercel hosting - set NEXTAUTH_URL to equal your NEXT_PUBLIC_WEBAPP_URL
|
|
NEXTAUTH_URL='http://localhost:3000'
|
|
# @see: https://next-auth.js.org/configuration/options#nextauth_secret
|
|
# You can use: `openssl rand -base64 32` to generate one
|
|
NEXTAUTH_SECRET=
|
|
# Used for cross-domain cookie authentication
|
|
NEXTAUTH_COOKIE_DOMAIN=
|
|
|
|
# Set this to '1' if you don't want Cal to collect anonymous usage
|
|
CALCOM_TELEMETRY_DISABLED=
|
|
|
|
# ApiKey for cronjobs
|
|
CRON_API_KEY='0cc0e6c35519bba620c9360cfe3e68d0'
|
|
|
|
# Whether to automatically keep app metadata in the database in sync with the metadata/config files. When disabled, the
|
|
# sync runs in a reporting-only dry-run mode.
|
|
CRON_ENABLE_APP_SYNC=false
|
|
|
|
# Application Key for symmetric encryption and decryption
|
|
# must be 32 bytes for AES256 encryption algorithm
|
|
# You can use: `openssl rand -base64 32` to generate one
|
|
CALENDSO_ENCRYPTION_KEY=
|
|
|
|
# Intercom Config
|
|
NEXT_PUBLIC_INTERCOM_APP_ID=
|
|
|
|
# Secret to enable Intercom Identity Verification
|
|
INTERCOM_SECRET=
|
|
|
|
# Intercom api token for free users
|
|
INTERCOM_API_TOKEN=
|
|
|
|
# Posthog Config
|
|
NEXT_PUBLIC_POSTHOG_KEY=
|
|
|
|
NEXT_PUBLIC_POSTHOG_HOST=
|
|
|
|
|
|
|
|
# Dub Config
|
|
DUB_API_KEY=
|
|
NEXT_PUBLIC_DUB_PROGRAM_ID=
|
|
|
|
# Zendesk Config
|
|
NEXT_PUBLIC_ZENDESK_KEY=
|
|
|
|
# Help Scout Config
|
|
NEXT_PUBLIC_HELPSCOUT_KEY=
|
|
|
|
# Fresh Chat Config
|
|
NEXT_PUBLIC_FRESHCHAT_TOKEN=
|
|
NEXT_PUBLIC_FRESHCHAT_HOST=
|
|
|
|
# For holiday feature:
|
|
# Step-by-step: Get a Google Calendar API Key
|
|
# 1. Go to Google Cloud Console: https://console.cloud.google.com/
|
|
# 2. Select or Create a Project
|
|
# 3. Enable Google Calendar API (APIs & Services → Library , Search for Google Calendar API)
|
|
# 4. Create the API Key (APIs & Services → Credentials)
|
|
GOOGLE_CALENDAR_API_KEY=
|
|
|
|
# Google OAuth credentials
|
|
# To enable Login with Google you need to:
|
|
# 1. Set `GOOGLE_API_CREDENTIALS` below
|
|
# 2. Set `GOOGLE_LOGIN_ENABLED` to `true`
|
|
# When self-hosting please ensure you configure the Google integration as an Internal app so no one else can login to your instance
|
|
# @see https://support.google.com/cloud/answer/6158849#public-and-internal&zippy=%2Cpublic-and-internal-applications
|
|
GOOGLE_LOGIN_ENABLED=false
|
|
|
|
# - GOOGLE CALENDAR/MEET/LOGIN
|
|
# Needed to enable Google Calendar integration and Login with Google
|
|
# @see https://github.com/calcom/cal.com#obtaining-the-google-api-credentials
|
|
GOOGLE_API_CREDENTIALS=
|
|
# Token to verify incoming webhooks from Google Calendar
|
|
GOOGLE_WEBHOOK_TOKEN=
|
|
# Optional URL to override for tunelling webhooks. Defaults to NEXT_PUBLIC_WEBAPP_URL.
|
|
GOOGLE_WEBHOOK_URL=
|
|
|
|
# Token to verify incoming webhooks from Microsoft Calendar
|
|
MICROSOFT_WEBHOOK_TOKEN=
|
|
|
|
# Optional URL to override for tunelling webhooks. Defaults to NEXT_PUBLIC_WEBAPP_URL.
|
|
MICROSOFT_WEBHOOK_URL=
|
|
|
|
# Inbox to send user feedback
|
|
SEND_FEEDBACK_EMAIL=
|
|
|
|
# Sendgrid
|
|
# Used for email reminders in workflows and internal sync services
|
|
SENDGRID_API_KEY=
|
|
SENDGRID_EMAIL=
|
|
NEXT_PUBLIC_SENDGRID_SENDER_NAME=
|
|
|
|
# Sentry
|
|
SENTRY_ORG=
|
|
SENTRY_PROJECT=
|
|
SENTRY_AUTH_TOKEN=
|
|
# Used for capturing exceptions and logging messages
|
|
NEXT_PUBLIC_SENTRY_DSN=
|
|
NEXT_PUBLIC_SENTRY_DSN_CLIENT=
|
|
SENTRY_DEBUG=
|
|
SENTRY_MAX_SPANS=
|
|
SENTRY_SAMPLE_RATE=
|
|
SENTRY_TRACES_SAMPLE_RATE=
|
|
SENTRY_REPLAYS_SESSION_SAMPLE_RATE=
|
|
SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE=
|
|
|
|
# Formbricks Experience Management Integration
|
|
NEXT_PUBLIC_FORMBRICKS_HOST_URL=https://app.formbricks.com
|
|
NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID=
|
|
FORMBRICKS_FEEDBACK_SURVEY_ID=
|
|
|
|
# AvatarAPI
|
|
# Used to pre-fill avatar during signup
|
|
AVATARAPI_USERNAME=
|
|
AVATARAPI_PASSWORD=
|
|
|
|
# Twilio
|
|
# Used to send SMS reminders in workflows
|
|
TWILIO_SID=
|
|
TWILIO_TOKEN=
|
|
TWILIO_MESSAGING_SID=
|
|
TWILIO_PHONE_NUMBER=
|
|
TWILIO_WHATSAPP_PHONE_NUMBER=
|
|
TWILIO_WHATSAPP_REMINDER_CONTENT_SID=
|
|
TWILIO_WHATSAPP_CANCELLED_CONTENT_SID=
|
|
TWILIO_WHATSAPP_RESCHEDULED_CONTENT_SID=
|
|
TWILIO_WHATSAPP_COMPLETED_CONTENT_SID=
|
|
# For NEXT_PUBLIC_SENDER_ID only letters, numbers and spaces are allowed (max. 11 characters)
|
|
NEXT_PUBLIC_SENDER_ID=
|
|
TWILIO_VERIFY_SID=
|
|
TWILIO_OPT_OUT_ENABLED=
|
|
|
|
# Set it to "1" if you need to run E2E tests locally.
|
|
NEXT_PUBLIC_IS_E2E=
|
|
|
|
# Used for internal billing system
|
|
NEXT_PUBLIC_STRIPE_PRO_PLAN_PRICE=
|
|
NEXT_PUBLIC_STRIPE_PREMIUM_PLAN_PRICE=
|
|
NEXT_PUBLIC_IS_PREMIUM_NEW_PLAN=0
|
|
NEXT_PUBLIC_STRIPE_PREMIUM_NEW_PLAN_PRICE=
|
|
STRIPE_TEAM_MONTHLY_PRICE_ID=
|
|
NEXT_PUBLIC_STRIPE_CREDITS_PRICE_ID=
|
|
ORG_MONTHLY_CREDITS=
|
|
STRIPE_TEAM_PRODUCT_ID=
|
|
# It is a price ID in the product with id STRIPE_ORG_PRODUCT_ID
|
|
STRIPE_ORG_MONTHLY_PRICE_ID=
|
|
STRIPE_ORG_PRODUCT_ID=
|
|
# Used to pass trial days for orgs during the Stripe checkout session
|
|
STRIPE_ORG_TRIAL_DAYS=
|
|
|
|
STRIPE_WEBHOOK_SECRET=
|
|
STRIPE_WEBHOOK_SECRET_APPS=
|
|
STRIPE_PRIVATE_KEY=
|
|
STRIPE_CLIENT_ID=
|
|
|
|
# Use for internal Public API Keys and optional
|
|
API_KEY_PREFIX=cal_
|
|
# ***********************************************************************************************************
|
|
|
|
# - E-MAIL SETTINGS *****************************************************************************************
|
|
# Cal uses nodemailer (@see https://nodemailer.com/about/) to provide email sending. As such we are trying to
|
|
# allow access to the nodemailer transports from the .env file. E-mail templates are accessible within lib/emails/
|
|
# Configures the global From: header whilst sending emails.
|
|
EMAIL_FROM='notifications@yourselfhostedcal.com'
|
|
EMAIL_FROM_NAME='Cal.com'
|
|
|
|
# Configure SMTP settings (@see https://nodemailer.com/smtp/).
|
|
# Configuration to receive emails locally (mailhog)
|
|
EMAIL_SERVER_HOST='localhost'
|
|
EMAIL_SERVER_PORT=1025
|
|
|
|
# Note: The below configuration for Office 365 has been verified to work.
|
|
# EMAIL_SERVER_HOST='smtp.office365.com'
|
|
# EMAIL_SERVER_PORT=587
|
|
# EMAIL_SERVER_USER='<office365_emailAddress>'
|
|
# Keep in mind that if you have 2FA enabled, you will need to provision an App Password.
|
|
# EMAIL_SERVER_PASSWORD='<office365_password>'
|
|
|
|
# The following configuration for Gmail has been verified to work.
|
|
# EMAIL_SERVER_HOST='smtp.gmail.com'
|
|
# EMAIL_SERVER_PORT=465
|
|
# EMAIL_SERVER_USER='<gmail_emailAddress>'
|
|
## You will need to provision an App Password.
|
|
## @see https://support.google.com/accounts/answer/185833
|
|
# EMAIL_SERVER_PASSWORD='<gmail_app_password>'
|
|
|
|
# Used for E2E for email testing
|
|
# Set it to "1" if you need to email checks in E2E tests locally
|
|
# Make sure to run mailhog container manually or with `yarn dx`
|
|
E2E_TEST_MAILHOG_ENABLED=
|
|
|
|
# Resend
|
|
# Send transactional email using resend
|
|
# RESEND_API_KEY=
|
|
|
|
# **********************************************************************************************************
|
|
|
|
# Cloudflare Turnstile
|
|
NEXT_PUBLIC_CLOUDFLARE_SITEKEY=
|
|
NEXT_PUBLIC_CLOUDFLARE_USE_TURNSTILE_IN_BOOKER=
|
|
CLOUDFLARE_TURNSTILE_SECRET=
|
|
|
|
# 0 = false, 1=true
|
|
NEXT_PUBLIC_VERCEL_USE_BOTID_IN_BOOKER=
|
|
|
|
# Set the following value to true if you wish to enable Team Impersonation
|
|
NEXT_PUBLIC_TEAM_IMPERSONATION=false
|
|
|
|
# Close.com internal CRM
|
|
CLOSECOM_CLIENT_ID=
|
|
CLOSECOM_CLIENT_SECRET=
|
|
|
|
# Sendgrid internal sync service
|
|
SENDGRID_SYNC_API_KEY=
|
|
|
|
# Change your Brand
|
|
NEXT_PUBLIC_APP_NAME="Cal.com"
|
|
NEXT_PUBLIC_SUPPORT_MAIL_ADDRESS="help@cal.com"
|
|
NEXT_PUBLIC_COMPANY_NAME="Cal.com, Inc."
|
|
# Set this to true in to disable new signups
|
|
# NEXT_PUBLIC_DISABLE_SIGNUP=true
|
|
NEXT_PUBLIC_DISABLE_SIGNUP=
|
|
|
|
# Set this to 'non-strict' to enable CSP for support pages. 'strict' isn't supported yet. Also, check the README for details.
|
|
# Content Security Policy
|
|
CSP_POLICY=
|
|
|
|
# Vercel Edge Config
|
|
EDGE_CONFIG=
|
|
|
|
NEXT_PUBLIC_MINUTES_TO_BOOK=5 # Minutes
|
|
NEXT_PUBLIC_BOOKER_NUMBER_OF_DAYS_TO_LOAD=0 # Override the booker to only load X number of days worth of data
|
|
|
|
# Control time intervals on a user's Schedule availability
|
|
NEXT_PUBLIC_AVAILABILITY_SCHEDULE_INTERVAL=
|
|
|
|
# - ORGANIZATIONS *******************************************************************************************
|
|
# Enable Organizations non-prod domain setup, works in combination with organizations feature flag
|
|
# This is mainly needed locally, because for orgs to work a full domain name needs to point
|
|
# to the app, i.e. app.cal.local instead of using localhost, which is very disruptive
|
|
#
|
|
# This variable should only be set to 1 or true if you are in a non-prod environment and you want to
|
|
# use organizations
|
|
ORGANIZATIONS_ENABLED=
|
|
NEXT_PUBLIC_ORGANIZATIONS_MIN_SELF_SERVE_SEATS=30
|
|
NEXT_PUBLIC_ORGANIZATIONS_SELF_SERVE_PRICE_NEW=37 # $37.00 per seat
|
|
|
|
# This variable should only be set to 1 or true if you want to autolink external provider sign-ups with
|
|
# existing organizations based on email domain address
|
|
ORGANIZATIONS_AUTOLINK=
|
|
|
|
# Vercel Config to create subdomains for organizations
|
|
# Get it from https://vercel.com/<TEAM_OR_USER_NAME>/<PROJECT_SLUG>/settings
|
|
PROJECT_ID_VERCEL=
|
|
# Get it from: https://vercel.com/teams/<TEAM_SLUG>/settings
|
|
TEAM_ID_VERCEL=
|
|
# Get it from: https://vercel.com/account/tokens
|
|
AUTH_BEARER_TOKEN_VERCEL=
|
|
# Add the main domain that you want to use for testing vercel domain management for organizations. This is necessary because WEBAPP_URL of local isn't a valid public domain
|
|
# Would create org1.example.com for an org with slug org1
|
|
# LOCAL_TESTING_DOMAIN_VERCEL="example.com"
|
|
|
|
## Set it to 1 if you use cloudflare to manage your DNS and would like us to manage the DNS for you for organizations
|
|
# CLOUDFLARE_DNS=1
|
|
## Get it from: https://dash.cloudflare.com/profile/api-tokens. Select Edit Zone template and choose a zone(your domain)
|
|
# AUTH_BEARER_TOKEN_CLOUDFLARE=
|
|
## Zone ID can be found in the Overview tab of your domain in Cloudflare
|
|
# CLOUDFLARE_ZONE_ID=
|
|
## It should usually work with the default value. This is the DNS CNAME record content to point to Vercel domain
|
|
# CLOUDFLARE_VERCEL_CNAME=cname.vercel-dns.com
|
|
|
|
# - APPLE CALENDAR
|
|
# Used for E2E tests on Apple Calendar
|
|
E2E_TEST_APPLE_CALENDAR_EMAIL=""
|
|
E2E_TEST_APPLE_CALENDAR_PASSWORD=""
|
|
|
|
# - CALCOM QA ACCOUNT
|
|
# Used for E2E tests on Cal.com that require 3rd party integrations
|
|
E2E_TEST_CALCOM_QA_EMAIL="qa@example.com"
|
|
# Replace with your own password
|
|
E2E_TEST_CALCOM_QA_PASSWORD="password"
|
|
E2E_TEST_CALCOM_QA_GCAL_CREDENTIALS=
|
|
E2E_TEST_CALCOM_GCAL_KEYS=
|
|
|
|
# - APP CREDENTIAL SYNC ***********************************************************************************
|
|
# Used for self-hosters that are implementing Cal.com into their applications that already have certain integrations
|
|
# Under settings/admin/apps ensure that all app secrets are set the same as the parent application
|
|
# You can use: `openssl rand -base64 32` to generate one
|
|
CALCOM_CREDENTIAL_SYNC_SECRET=""
|
|
# This is the header name that will be used to verify the webhook secret. Should be in lowercase
|
|
CALCOM_CREDENTIAL_SYNC_HEADER_NAME="calcom-credential-sync-secret"
|
|
# This the endpoint from which the token is fetched
|
|
CALCOM_CREDENTIAL_SYNC_ENDPOINT=""
|
|
# Key should match on Cal.com and your application
|
|
# must be 24 bytes for AES256 encryption algorithm
|
|
# You can use: `openssl rand -base64 24` to generate one
|
|
CALCOM_APP_CREDENTIAL_ENCRYPTION_KEY=""
|
|
|
|
# - OIDC E2E TEST *******************************************************************************************
|
|
|
|
# Ensure this ADMIN EMAIL is present in the SAML_ADMINS list
|
|
E2E_TEST_SAML_ADMIN_EMAIL=
|
|
E2E_TEST_SAML_ADMIN_PASSWORD=
|
|
|
|
E2E_TEST_OIDC_CLIENT_ID=
|
|
E2E_TEST_OIDC_CLIENT_SECRET=
|
|
E2E_TEST_OIDC_PROVIDER_DOMAIN=
|
|
|
|
E2E_TEST_OIDC_USER_EMAIL=
|
|
E2E_TEST_OIDC_USER_PASSWORD=
|
|
|
|
# ***********************************************************************************************************
|
|
|
|
# api v2
|
|
NEXT_PUBLIC_API_V2_URL="http://localhost:5555/api/v2"
|
|
|
|
# Tasker features
|
|
TASKER_ENABLE_WEBHOOKS=0
|
|
TASKER_ENABLE_EMAILS=0
|
|
|
|
# Ratelimiting via unkey
|
|
UNKEY_ROOT_KEY=
|
|
|
|
# Used for Cal.ai Voice AI Agents
|
|
# https://retellai.com
|
|
RETELL_AI_KEY=
|
|
# Local testing overrides for Retell AI
|
|
RETELL_AI_TEST_MODE=false
|
|
# JSON mapping of local to production event type IDs (e.g. {"50": 747280} without any string)
|
|
RETELL_AI_TEST_EVENT_TYPE_MAP=
|
|
RETELL_AI_TEST_CAL_API_KEY=
|
|
|
|
# Used for buying phone number for cal ai voice agent
|
|
STRIPE_PHONE_NUMBER_MONTHLY_PRICE_ID=
|
|
|
|
|
|
CAL_AI_CALL_RATE_PER_MINUTE=0.29
|
|
|
|
|
|
STRIPE_WEBHOOK_SECRET_BILLING=
|
|
|
|
|
|
# Price for buying a phone number for cal.ai voice agent (Default is 5)
|
|
NEXT_PUBLIC_CAL_AI_PHONE_NUMBER_MONTHLY_PRICE=
|
|
|
|
# Used for the huddle01 integration
|
|
HUDDLE01_API_TOKEN=
|
|
|
|
# Used to disallow emails as being added as guests on bookings
|
|
BLACKLISTED_GUEST_EMAILS=
|
|
|
|
# Used to allow browser push notifications
|
|
# You can use: 'npx web-push generate-vapid-keys' to generate these keys
|
|
NEXT_PUBLIC_VAPID_PUBLIC_KEY=
|
|
VAPID_PRIVATE_KEY=
|
|
|
|
# Mintlify chat api
|
|
# Power AI chat in for docs
|
|
MINTLIFY_CHAT_API_KEY=
|
|
NEXT_PUBLIC_ENABLE_MINTLIFY_CHAT=
|
|
NEXT_PUBLIC_CHAT_API_URL=
|
|
NEXT_PUBLIC_DOCS_URL=
|
|
|
|
# Custom privacy policy / terms URLs (for self-hosters: change to your privacy policy / terms URLs)
|
|
NEXT_PUBLIC_WEBSITE_PRIVACY_POLICY_URL=
|
|
NEXT_PUBLIC_WEBSITE_TERMS_URL=
|
|
|
|
# NEXT_PUBLIC_LOGGER_LEVEL=3 sets to log info, warn, error and fatal logs.
|
|
# [0: silly & upwards, 1: trace & upwards, 2: debug & upwards, 3: info & upwards, 4: warn & upwards, 5: error & fatal, 6: fatal]
|
|
NEXT_PUBLIC_LOGGER_LEVEL=
|
|
|
|
# For storing Daily Video recordings on S3 Bucket
|
|
CAL_VIDEO_BUCKET_NAME=
|
|
CAL_VIDEO_BUCKET_REGION=
|
|
CAL_VIDEO_ASSUME_ROLE_ARN=
|
|
|
|
# For local testing of Daily Video
|
|
# Set this to the link of a working Daily Video meeting link
|
|
CAL_VIDEO_MEETING_LINK_FOR_TESTING=
|
|
|
|
# Used to use lingo.dev SDK, a tool for real-time AI-powered localization
|
|
LINGO_DOT_DEV_API_KEY=
|
|
|
|
# Comma-separated list of DSyncData.directoryId to log SCIM API requests for. It can be enabled temporarily for debugging the requests being sent to SCIM server.
|
|
DIRECTORY_IDS_TO_LOG=
|
|
|
|
|
|
# Set this when Cal.com is used to serve only one organization's booking pages
|
|
# Read more about it in the README.md
|
|
NEXT_PUBLIC_SINGLE_ORG_SLUG=
|
|
|
|
IFFY_API_KEY=
|
|
|
|
## Env variables related to avoiding booking failures
|
|
# Request for checking reservation would be attempted to send every these seconds if the request is stale at that time
|
|
NEXT_PUBLIC_QUERY_RESERVATION_INTERVAL_SECONDS=
|
|
# Request for checking reservation of same slot would be sent only after this time has passed. It must be lower than PUBLIC_QUERY_RESERVATION_INTERVAL_SECONDS
|
|
NEXT_PUBLIC_QUERY_RESERVATION_STALE_TIME_SECONDS=
|
|
# Query available slots interval - Should be kept high in minutes as it could cause significant load on the system
|
|
NEXT_PUBLIC_QUERY_AVAILABLE_SLOTS_INTERVAL_SECONDS=
|
|
# Used to invalidate available slots when navigating to booking form
|
|
NEXT_PUBLIC_INVALIDATE_AVAILABLE_SLOTS_ON_BOOKING_FORM=0
|
|
# Used to enable quick availability checks for x% of all visitors
|
|
NEXT_PUBLIC_QUICK_AVAILABILITY_ROLLOUT=10
|
|
|
|
# Used to generate token for cal video recordings expiry token
|
|
# You can use: `openssl rand -base64 32` to generate one
|
|
CAL_VIDEO_RECORDING_TOKEN_SECRET=
|
|
|
|
# Deprecated. Use NEXT_PUBLIC_BODY_SCRIPTS instead. NEXT_PUBLIC_HEAD_SCRIPTS are now injected into the body only.
|
|
NEXT_PUBLIC_HEAD_SCRIPTS=
|
|
NEXT_PUBLIC_BODY_SCRIPTS=
|
|
|
|
DATABASE_CHUNK_SIZE=
|
|
|
|
# Service Account Encryption Key for encrypting/decrypting service account keys
|
|
# You can use: `openssl rand -base64 24` to generate one
|
|
CALCOM_SERVICE_ACCOUNT_ENCRYPTION_KEY=
|
|
|
|
SALESFORCE_GRAPHQL_DELAY_MS=500
|
|
SALESFORCE_GRAPHQL_MAX_DELAY_MS=2000
|
|
SALESFORCE_GRAPHQL_MAX_RETRIES=3
|
|
|
|
# Force Node.js to use UTC as process timezone
|
|
TZ=UTC
|
|
|
|
# test oauth client for `packages/platform/examples/base` (optional)
|
|
SEED_PLATFORM_OAUTH_CLIENT_ID=
|
|
SEED_PLATFORM_OAUTH_CLIENT_SECRET=
|
|
|
|
# Trigger.dev
|
|
ENABLE_ASYNC_TASKER="false" # set to "true" to enable
|
|
TRIGGER_SECRET_KEY=
|
|
TRIGGER_API_URL=https://api.trigger.dev
|
|
TRIGGER_DEV_PROJECT_REF= |