Generated from source at build time — this page cannot drift from the running service.
Configuration
Read once at boot by config/config.ts and injected as APP_CONFIG. 68
variables, of which two are hard requirements: INBOX_KEK (32 bytes as 64 hex characters, the key
that encrypts every stored provider credential) and INBOX_REALTIME_JWT_SECRET (at least 32
characters). The service refuses to boot without them.
Nothing loads
.envautomatically.dotenvis a devDependency that is never imported. The start scripts pass--env-file ../../.env, and that file lives at the repo root, not inapps/service/. Runningnest startwithout the flag dies withMissing required env var INBOX_KEK.
Stores are selected by environment, silently
common/persistence.ts uses Prisma only when INBOX_DATABASE_URL is set and the environment
is not test; otherwise it falls back to in-memory stores. The same is true of Redis and the
queues. This is convenient in development and dangerous in deployment: a service that boots cleanly
but has lost its INBOX_DATABASE_URL will serve an empty, non-persistent estate rather than fail.
Check GET /v1/health, which reports which backends are actually wired.
Two settings that must be slugs, never UUIDs
Accounts app ids differ per environment — axis-engage has a different UUID locally than on dev.
INBOX_ACCOUNTS_APP_SLUG and INBOX_OPERATOR_APP_SLUG are matched by slug for exactly this
reason. Hardcoding a UUID works in one environment and silently fails in the next.
INBOX_OPERATOR_APP_SLUG in particular is load-bearing: leave it unset and no user session can
reach the operator surface at all, because isOperator becomes false for everyone.
Core
INBOX_ENVINBOX_PORTINBOX_PUBLIC_URLNODE_ENV
Accounts (identity)
INBOX_ACCOUNTS_APP_SLUGINBOX_ACCOUNTS_BASE_URLINBOX_ACCOUNTS_CACHE_TTL_MSINBOX_ACCOUNTS_SERVICE_KEYINBOX_ACCOUNTS_TENANT_SLUGINBOX_ACCOUNTS_WEBHOOK_SECRET
Behaviour
AXIS_ACCOUNTS_APP_IDINBOX_CAMPAIGN_SESSION_BATCH_CHUNKINBOX_CAMPAIGN_SESSION_BUFFER_SECONDSINBOX_CAMPAIGN_SESSION_DAILY_CAPINBOX_CAMPAIGN_SESSION_MSG_AVG_SECONDSINBOX_CRED_CACHE_TTL_MSINBOX_KEK— requiredINBOX_OPERATOR_APP_SLUGINBOX_REALTIME_JWT_EXPIRES_ININBOX_REALTIME_JWT_SECRET— requiredINBOX_RESPONSE_TIME_CAP_SECONDSINBOX_SHARE_CONNECTIONS_WITH_GROUPSINBOX_SKIP_AUTHINBOX_SKIP_WEBHOOK_VERIFYINBOX_WEBHOOK_CONCURRENCY
Billing
INBOX_BILLING_API_KEYINBOX_BILLING_BASE_URL
Channel providers
INBOX_AGGREGATOR_API_KEYINBOX_AGGREGATOR_BASE_URLINBOX_AGGREGATOR_WEBHOOK_SECRETINBOX_EMAIL_PROVIDER_API_KEYINBOX_EMAIL_PROVIDER_BASE_URLINBOX_EMAIL_PROVIDER_BATCH_SIZEINBOX_EMAIL_PROVIDER_CLICK_TRACKINGINBOX_EMAIL_PROVIDER_OPEN_TRACKINGINBOX_EMAIL_PROVIDER_TIMEOUT_MSINBOX_EMAIL_PROVIDER_VALIDATION_URLINBOX_EMAIL_PROVIDER_WEBHOOK_SECRETINBOX_EMAIL_PROVIDER_WEBHOOK_URLINBOX_INFOBIP_EMAIL_EVENTSINBOX_INFOBIP_SUBSCRIPTIONS_ENABLEDINBOX_INFOBIP_WHATSAPP_EVENTSINBOX_META_APP_IDINBOX_META_APP_SECRETINBOX_META_GRAPH_VERSIONINBOX_META_REDIRECT_URLINBOX_META_WEBHOOK_VERIFY_TOKENINBOX_SMS_WEBHOOK_SECRETINBOX_WHATSAPP_PROVIDER_REPORT_SECRETINBOX_WHATSAPP_SESSION_BASE_URLINBOX_WHATSAPP_SESSION_PROVIDERINBOX_WHATSAPP_SESSION_TOKENINBOX_WHATSAPP_SESSION_WEBHOOK_SECRETINBOX_WHATSAPP_WEBHOOK_SECRET
File storage
INBOX_S3_ACCESS_KEY_IDINBOX_S3_ACLINBOX_S3_BUCKETINBOX_S3_ENDPOINTINBOX_S3_FORCE_PATH_STYLEINBOX_S3_REGIONINBOX_S3_SECRET_ACCESS_KEYS3_ACL
Intelligence (AI)
INBOX_AGENT_RUN_TOKEN_SECRETINBOX_AGENT_RUN_TOKEN_TTLINBOX_AI_DEFAULT_MODELINBOX_ANALYSIS_AGENT_SLUGINBOX_INTELLIGENCE_API_KEYINBOX_INTELLIGENCE_BASE_URL