Appendix D — Environment variables
| Variable | Default | Purpose |
|---|---|---|
SHOP_DATABASE_URL | — (required) | PostgreSQL connection string |
SHOP_SESSION_SECRET | — (required, ≥ 32 chars) | Signs session cookies and signup tokens |
SHOP_SESSION_STORE / SHOP_REDIS_URL | redis / — | Session store (memory for tests only) |
SHOP_SESSION_TTL_SECONDS | 60 days in production (5184000), 12 h in development; max 90 days | Trusted session lifetime, absolute from sign-in |
SHOP_MFA_SECRET_KEY | — (derived from the session secret) | AES-256-GCM key material for authenticator secrets |
SHOP_MFA_CODE_RATE_LIMITS | true (refused as false in production) | false lifts the 1 / minute and 5 / hour e-mail code limits (development / e2e only) |
SHOP_COOKIE_SECURE / SHOP_COOKIE_SAMESITE | auto / strict in production | Cookie flags |
SHOP_PORT | 3100 | API port |
SHOP_WEB_DIST | — | Built web app served by the API |
SHOP_TRUST_PROXY | — | true behind a reverse proxy |
SHOP_WEB_ORIGINS | https://app.zudoworks.com in production | CORS allow-list |
SHOP_APP_BASE_URL / SHOP_API_BASE_URL | — | Links in e-mails / absolute upload URLs |
SHOP_EMAIL_PROVIDER / SHOP_RESEND_API_KEY / SHOP_EMAIL_FROM | console / — / Zudo Works <[email protected]> | E-mail delivery |
SHOP_ADMIN_EMAIL | [email protected] | Receives feedback reports |
SHOP_PASSWORD_RESET_TTL_MINUTES | 30 | Reset link validity |
SHOP_AUTH_RATE_LIMIT_MAX | 5 | Sign-in attempts per minute |
SHOP_SIGNUP_RATE_LIMIT_MAX | 3 | Signups per address per window |
SHOP_RATE_LIMIT_MAX | 600 | API requests per minute per IP |
SHOP_PLAN_LIMITS_ENFORCED | true | Enforce user / storage / API / webhook quotas |
SHOP_WORKFLOW_ALLOW_PRIVATE_HOSTS | false | Dev only: let Invoke URL reach private hosts |
SHOP_STORAGE_DRIVER + R2 settings / SHOP_UPLOADS_DIR | local / ./uploads | File storage (Cloudflare R2 in production) |
ENABLE_SUPER_ADMIN / SUPER_ADMIN_EMAILS | off | Zudo support access |
SHOP_MAIL_GOOGLE_CLIENT_ID / _SECRET | — | Google sign-in for the company mailbox (hidden when unset) |
SHOP_MAIL_MICROSOFT_CLIENT_ID / _SECRET | — | Microsoft 365 / Outlook sign-in (hidden when unset) |
SHOP_MAIL_ZOHO_CLIENT_ID / _SECRET | — | Zoho Mail sign-in (hidden when unset) |
SHOP_MAIL_TOKEN_KEY | — (required to connect mailboxes) | SHA-256 → AES-256-GCM key for stored mailbox credentials |
SHOP_MAIL_RESEND_WEBHOOK_SECRET | — | Svix secret of the Resend delivery webhook |
SHOP_MAIL_ZUDO_FROM | [email protected] | Address of "{Org} via Zudo Works" fallback sends |
SHOP_MAIL_WORKER_ENABLED / SHOP_MAIL_WORKER_INTERVAL_SECONDS | true / 30 | The outbound e-mail retry worker |
SHOP_AI_BASE_URL | — (assistant hidden) | OpenAI-compatible Chat Completions endpoint (Fireworks: https://api.fireworks.ai/inference/v1) |
SHOP_AI_MODEL | qwen2.5:7b | Model name (must support tool calling) |
SHOP_AI_API_KEY | — (required in production) | Bearer token checked by the reverse proxy |
SHOP_AI_TIMEOUT_MS / SHOP_AI_MAX_TOKENS | 60000 / 1024 | Per-request time-out; answer length |
SHOP_AI_REASONING_EFFORT | low | Reasoning models (gpt-oss): low / medium / high; reasoning is never shown or stored |
SHOP_AI_GUARD_MODEL | — (the main model) | Model for the topic-guard classification call (20 tokens, low effort) |
Registered OAuth redirect URIs (exact): {SHOP_API_BASE_URL}/api/v1/mail/oauth/callback/google|microsoft|zoho (production https://api.zudoworks.com/api/v1/mail/oauth/callback/<provider>).
Last updated