Everything an operator needs, in one place. Product runbooks are hosted with their engines; module deploy guides live on this page.
Onboard a number, transfer policy, recording, capture delivery, troubleshooting, admin API.
AgentCloud · chatTenants, agents, the one-tag embed, token billing, admin API, troubleshooting.
SalesThe white-label pitch: keep your number, your domain, your brand. Integration tiers.
ModulesDeploy each module on Railway and wire it into the platform - sections below.
CRM, Meetings, and Communications are Next.js modules in the monorepo (apps/*). Each deploys as its own Railway service:
Yore-code/VC, branch main.RAILWAY_DOCKERFILE_PATH = apps/<module>/Dockerfile. Module images build from the repo root so the workspace packages resolve - setting Root Directory to the app folder breaks the build.DATABASE_URL via the reference picker (never type ${"{{"}…} by hand). Prefer a separate database (or at least separate schema) per module.prisma db push on boot - the schema creates itself. Check /api/health.vc_crm, vc_meetings, vc_comms).Contacts, companies, a kanban deal pipeline (Lead → Qualified → Proposal → Won/Lost, created automatically), activity log - and the platform's lead funnel.
CRM_INGEST_SECRET to any random string.https://<crm-domain>/api/ingest, Webhook secret = the same CRM_INGEST_SECRET.The ingest accepts both the voice engine's call.captured envelope and a flat {name, phone, email?, reason?, source} for manual/other sources. Signature: x-vc-signature: sha256=<HMAC-SHA256 of raw body>.
| Env | Purpose |
|---|---|
| DATABASE_URL | Module's Postgres. |
| CRM_INGEST_SECRET | Optional; when set, unsigned ingest posts are rejected. |
Event types, weekly availability, bookings - plus a brand-neutral public booking page per event type at /book/<slug>.
/app → set Availability (per weekday) → create an Event type.https://<meetings-domain>/book/<slug> - or put it behind the client's own subdomain via CNAME./app/bookings; cancel from there.TZ env to the client's timezone. Per-org timezones are the flagged follow-up.A unified inbox for texts AND calls on the same Twilio account the voice engine uses: threads with calls interleaved, a Calls tab (AI-captured leads, transcripts, recording/voicemail playback), per-number AI call answering, click-to-call, and missed-call text-back. One number, two brains: the number's SMS webhook points at comms, its voice webhook at the voice engine.
TWILIO_ACCOUNT_SID + TWILIO_AUTH_TOKEN (and PUBLIC_BASE_URL if behind a proxy).POST https://<comms-domain>/api/twilio/inbound.CALL_ALLOW_INTL, daily cap, 1h limit. Completed bridges meter to the usage pipe (international legs as bridge-intl at their own wholesale rate).| Env | Purpose |
|---|---|
| DATABASE_URL | Module's Postgres. |
| TWILIO_ACCOUNT_SID / TWILIO_AUTH_TOKEN | Send + validate inbound signatures; place bridge calls. |
| TWILIO_VALIDATE | false only for local debugging. |
| VOICE_ENGINE_URL / VOICE_ADMIN_TOKEN | The voice engine + its admin token - powers AI answering, Call handling, sync, recording playback. |
| ONBOARDING_URL / CLIENT_GRANT_SECRET | Bridge-minute metering into the Welcome Desk usage pipe (signed). |
| CALL_DAILY_CAP / CALL_ALLOW_INTL | Click-to-call guardrails (default 50/day, US-only). |
| COMMS_EVENTS_URL / COMMS_EVENTS_SECRET | Optional: publish comms.message.* / comms.call.* platform events. |
Any service → any branded domain, the same three steps every time:
_railway-verify.<subdomain>).