Third-party integrations — one vendor account per environment

Navigator talks to a handful of external services. They fall into two kinds:

The full catalog below lists every external service the application code itself dials. Purely operational layers that sit above the env-var interface — Doppler (secret values), DNSimple (DNS) — are deliberately out of scope here: they are not code dependencies, and a fork can swap them freely.

Why two accounts

How we switch: by env file, not APP_ENV

There is no runtime mode switch — APP_ENV was removed in the SQLite cutover. The environment is selected by which env file is loaded:

Both files use the same variable names (DOCUSIGN_*, XERO_*, …) — the file is the namespace, so no code branches on environment. In the deployed cluster the production values arrive via the Kubernetes Secret (Secret Manager → navigator-web-secrets), so no file is sourced there.

Any vendor left entirely unconfigured falls back to an in-process stub that performs no external calls. That is the safe default: a fresh checkout boots and self-tests without touching a real account.

Current integrations

ServicePurposeKindEnv prefix
DocuSignE-signaturebindingDOCUSIGN_*
XeroAccounting / billing (ACCREC invoices)bindingXERO_*
Restate CloudDurable workflow execution (workflows-service)platformRESTATE_*
Google CloudStorage, Cloud SQL, OIDC, archiveplatformNAVIGATOR_*, GOOGLE_OAUTH_*, DATABASE_URL
Vertex AIA2A agent-router LLM (Gemini Flash in prod)platformNAVIGATOR_GCP_*
SendGridOutbound + inbound emailplatformSENDGRID_*

Notes:

When you add a binding vendor, follow the two-account shape: create the sandbox + production accounts, add a <VENDOR>_* block to .env.example that references this convention, put sandbox credentials in .env and production credentials in .env.production, and fall back to a stub when the vendor is unconfigured. A platform service needs only its own <VENDOR>_* block and a stub/local equivalent (fake-gcs-server, in-cluster Postgres, the NullRouter) so a fresh checkout boots and self-tests without any cloud account.

Not in this catalog — and why

A few external-looking things are deliberately absent. They are not third-party SaaS vendors, so the per-environment account convention does not apply to them: