Environment variables
Names below are exactly as the code reads them. Several are prefixed NEXT_ without being
NEXT_PUBLIC_ — those are server-only despite the prefix.
Database
| Variable | Purpose | Missing |
|---|---|---|
|
Pooled connection used at runtime |
Nothing works |
|
Direct connection used by migrations |
Migrations fail |
Supabase
| Variable | Purpose | Missing |
|---|---|---|
|
Project URL (client and server) |
Middleware allows all requests through; Realtime disabled |
|
Anon key |
As above |
|
Admin client |
Admin operations fail |
|
Google OAuth |
Google sign-in unavailable |
|
Google OAuth |
As above |
|
Legacy alias referenced in some code paths |
Depends on the path |
Middleware deliberately allows requests through when the anon config is absent — auth cannot be enforced, and failing every request would make a misconfigured environment unreachable. Never deploy without it.
Retell AI
| Variable | Purpose | Missing |
|---|---|---|
|
Read into |
No calls, no SMS, no agent sync |
|
API base override |
Uses the SDK default |
|
Default outbound agent |
Falls back to the agent registry |
|
Referenced in some paths alongside the |
Set both to the same value |
RETELL_SMS_AGENT_ID is hardcoded in lib/constants.ts, not an environment variable.
Telnyx
| Variable | Purpose | Missing |
|---|---|---|
|
Ed25519 verification of |
Inbound webhooks are rejected ( |
ElevenLabs
| Variable | Purpose | Missing |
|---|---|---|
|
HMAC verification of |
Inbound webhooks are rejected ( |
Carriers and number purchase
| Variable | Purpose | Missing |
|---|---|---|
|
MessagingApp base URL |
Purchase and release fail |
|
MessagingApp key |
As above |
|
Defaults to |
Defaults applied |
|
Twilio SIP trunk |
Twilio import fails |
|
Twilio termination URL |
As above |
|
Plivo SIP trunk |
Plivo import fails |
|
Plivo termination URL |
Falls back to a hardcoded default |
| Variable | Purpose | Missing |
|---|---|---|
|
Sending |
No email is sent |
|
Svix verification |
Verification is skipped — never omit in a deployed environment |
|
Present in the environment file; not used by the current send path |
— |
HubSpot
| Variable | Purpose | Missing |
|---|---|---|
|
Direct API calls |
Engagement logging fails (best-effort, so nothing else breaks) |
|
Inbound signature validation |
Inbound webhooks are rejected |
|
OAuth app |
OAuth flows unavailable |
|
OAuth app |
As above |
|
OAuth refresh |
As above |
|
Read into |
Default applied |
|
Workspace that receives inbound HubSpot contacts, calls, and Payability suppliers from BigQuery |
Contact, call, and supplier import crons return |
AWS SQS
| Variable | Purpose | Missing |
|---|---|---|
|
SQS region |
No CRM or categorisation messages |
|
Credentials |
As above |
|
Credentials |
As above |
|
CRM event queue |
CRM hand-off silently stops |
|
Reply categorisation; defaults to the |
Default applied |
|
Variation generation requests |
That path is unavailable |
Publishers return false rather than throwing, so a missing queue URL degrades to "not published". Watch the
logs, because nothing else will complain.
AI
| Variable | Purpose | Missing |
|---|---|---|
|
Vercel AI Gateway |
No call analysis, variation generation, prompt suggestions or test runs |
|
Defaults to |
Default applied |
|
Direct OpenAI access in some helpers |
Depends on the path |
|
Direct Anthropic access in some helpers |
Depends on the path |
BigQuery
| Variable | Purpose | Missing |
|---|---|---|
|
Defaults to |
Default applied |
|
Service-account PEM, with |
Sequence data gates fail |
|
Key id |
As above |
|
Client id |
As above |
The PEM is stored with escaped \n and restored to real newlines at runtime. Paste it escaped.
Redis
| Variable | Purpose | Missing |
|---|---|---|
|
In-flight call counter |
Broadcast throttling misbehaves — investigate before running campaigns |
Machine secrets
| Variable | Purpose | Missing |
|---|---|---|
|
Broadcast and internal endpoints |
Every broadcast returns |
|
MCP tool server |
MCP returns |
|
Sending Inngest events |
Workflows are never triggered |
|
Serving Inngest functions |
Inngest cannot invoke functions |
|
Nooks verification |
Verification skipped |
|
Present; not used by the webhook path |
— |
INTERNAL_API_SECRET fails closed. An unset value stops all outbound work, which is by design — the
alternative is an open broadcast endpoint.
Monitoring
| Variable | Purpose | Missing |
|---|---|---|
|
Sentry DSN |
No error reporting |
|
Environment tag |
Events are untagged |
.env.sentry-build-plugin holds the build-time source-map upload token.
Application
| Variable | Purpose | Missing |
|---|---|---|
|
Base URL for unsubscribe links |
Falls back to |
|
Provided by Vercel |
Used as the fallback base URL |
|
Standard |
— |
|
Set by Next.js; used to branch Sentry init |
— |
|
Verbose logging |
— |
An incorrect NEXT_PUBLIC_APP_URL produces unsubscribe links pointing at the wrong host — a compliance
problem, not just a broken link. Set it explicitly in production.