Consentful
Reference

Environment Variables

Every environment variable, grouped by feature. Secrets live here — never in config files or version control.

Copy .env.example to .env.local and fill in what you need. Only the variables for the features you enable are required; analytics and monitoring stay off until their keys are present.

Core

VariableRequiredDescription
DATABASE_URLYesPostgres connection string
BETTER_AUTH_SECRETYesAuth signing secret (openssl rand -base64 32)
BETTER_AUTH_URLYesWeb app origin serving auth routes
WEB_URLYesPublic web app URL
API_URLYesPublic API origin
NEXT_PUBLIC_API_URLYesAPI URL exposed to the browser
PLUGIN_SLUGYesPlugin identifier (matches the Admin Module)

Auth

VariableDescription
AUTH_MAGIC_LINK / AUTH_PASSKEYS / AUTH_TWO_FACTORFeature toggles (default on)
AUTH_REQUIRE_EMAIL_VERIFICATIONRequire verified email before access
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETGoogle social login
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRETGitHub social login

Billing

Pick one gateway with BILLING_PROVIDER (lemonsqueezy | polar | dodo); only the selected provider's vars are required. LemonSqueezy is the default.

VariableDescription
BILLING_PROVIDERlemonsqueezy (default) / polar / dodo
LEMONSQUEEZY_API_KEY / LEMONSQUEEZY_STORE_ID / LEMONSQUEEZY_WEBHOOK_SECRETLemonSqueezy
POLAR_ACCESS_TOKEN / POLAR_WEBHOOK_SECRET / POLAR_ENVIRONMENTPolar (production / sandbox)
DODO_PAYMENTS_API_KEY / DODO_PAYMENTS_WEBHOOK_SECRET / DODO_PAYMENTS_ENVIRONMENTDodo Payments (test / live)

Webhook URL to register: POST {API_URL}/webhooks/billing.

Email (fallback chain)

The chain is resend → plunk → loops → brevo → mailtrap → postmark → sendgrid. Resend is primary; the rest are free-tier fallbacks and kick in automatically when the one before hits its limit (HTTP 429 / quota) or fails. Configure the providers you want; with none set, emails log to the console in dev.

VariableProvider
EMAIL_FROMDefault sender (all providers)
RESEND_API_KEYResend (primary)
PLUNK_API_KEYPlunk
LOOPS_API_KEY / LOOPS_TRANSACTIONAL_IDLoops
BREVO_API_KEYBrevo
MAILTRAP_API_TOKEN / MAILTRAP_BASE_URLMailtrap
POSTMARK_SERVER_TOKEN / POSTMARK_MESSAGE_STREAMPostmark
SENDGRID_API_KEYTwilio SendGrid
EMAIL_RETRY_ATTEMPTS / EMAIL_RETRY_BASE_MSPer-provider retry/backoff

Storage (S3-compatible)

Off until STORAGE_ACCESS_KEY_ID + STORAGE_BUCKET are set.

VariableDescription
STORAGE_PROVIDERr2 / s3 / minio (informational)
STORAGE_BUCKETBucket name
STORAGE_ACCESS_KEY_ID / STORAGE_SECRET_ACCESS_KEYCredentials
STORAGE_REGIONauto for R2; a region for S3
STORAGE_ENDPOINTCustom endpoint (R2/MinIO)
STORAGE_PUBLIC_URLPublic base URL for objects
STORAGE_MAX_UPLOAD_BYTES / STORAGE_PRESIGN_TTLUpload guards

Analytics (PostHog)

PostHog is the only analytics provider. Off unless a project key is set. Privacy-first and consent-aware (stays opted-out until the visitor accepts).

VariableDescription
NEXT_PUBLIC_POSTHOG_KEYPostHog project key (phc_…)
NEXT_PUBLIC_POSTHOG_HOSTAPI host (default https://us.i.posthog.com)
NEXT_PUBLIC_ANALYTICS_ENABLEDMaster switch (default on when key present)
NEXT_PUBLIC_ANALYTICS_REQUIRE_CONSENTRequire cookie consent (default true)

Monitoring (Sentry)

Off unless a DSN is set.

VariableDescription
SENTRY_DSNServer DSN
NEXT_PUBLIC_SENTRY_DSNBrowser DSN
SENTRY_ENABLEDMaster switch (default on when DSN present)
SENTRY_TRACES_SAMPLE_RATEPerformance sampling (0.0–1.0)
SENTRY_AUTH_TOKEN / SENTRY_ORG / SENTRY_PROJECTSource-map upload (optional)

Background jobs

VariableDescription
QSTASH_TOKENQStash publish token
QSTASH_CURRENT_SIGNING_KEY / QSTASH_NEXT_SIGNING_KEYInbound signature verification
TRIGGER_SECRET_KEYTrigger.dev (optional runner)

Admin connector

VariableDescription
CONNECTOR_SECRETShared service token (openssl rand -base64 48)
ADMIN_CONNECTOR_URLAdmin Module connector endpoint

Plugin public surface

VariableDescription
PLUGIN_PUBLIC_API_KEYPublishable key shipped inside the plugin
PUBLIC_RATE_LIMIT_WINDOW_MS / PUBLIC_RATE_LIMIT_MAXPublic surface rate limits

Keep every secret in the environment — never commit .env.local or hardcode values in packages/config.

On this page

Environment Variables | Consentful