A free, open-source, self-hosted CRM for AI voice agents.
Give your AI voice agents a CRM. Import leads, let an AI agent call them, and every call comes back as structured CRM data — a summary, the detected outcome, and extracted fields — so your pipeline updates itself. Human agents work the same leads alongside the AI: assign, transfer, bulk-edit, and log manual calls, HubSpot-style.
Self-host it for free in a few commands. Bring your own voice provider (Bolcho or Vapi, or add your own) and your own OpenAI key — no vendor lock-in, no per-seat fees, no paid tier.
Free Voice AI CRM · open-source CRM · self-hosted CRM · AI voice agent · AI calling software · voice agent lead management · Vapi CRM · Next.js + Node.js + MongoDB
Licensed under AGPL-3.0 — free to self-host, modify, and use commercially in your own business. See License.
- AI voice calling — an outbound scheduler dials queued leads through a pluggable voice provider and records the result.
- Automatic post-call analysis — after each call, OpenAI writes a summary, classifies the outcome, and extracts structured data against a schema you define.
- Leads workspace — filters, bulk operations (including arithmetic on numeric fields), assignment and transfer between agents, and a performance overview.
- Human + AI agents together — assign leads to teammates, transfer between them, and log manual calls that land in the same timeline without consuming AI analysis.
- Lead sources — import from HubSpot, Zoho, and Facebook Lead Ads, or push leads in via a per-workspace webhook.
- Bookings & workflows — meeting scheduling and automated follow-up sequences.
- Multi-workspace with role-based access and optional white-label branding.
The voice layer is pluggable. Two providers ship built in:
| Provider | How to enable |
|---|---|
| Bolcho (default) | CALL_PROVIDER=bolcho — each workspace pastes its own Bolcho key in the CRM |
| Vapi | CALL_PROVIDER=vapi — set VOLA_TOKEN to your Vapi API key |
Adding another provider (Retell, Twilio, ElevenLabs, …) is one file. Create
src/services/callingProviders/<name>Provider.js exporting two functions:
async function initiateCall({ formattedPhoneNumber, assistantId, phoneNumberId, agency }) { /* place call → { id, status, ... } */ }
async function getCallStatus(callId, agency) { /* fetch call → normalized stats */ }
module.exports = { initiateCall, getCallStatus };Register it in src/services/callingProviders/index.js
and select it with CALL_PROVIDER. In every case, you bring your own voice
account — no calling credits are bundled with this project.
Because this is self-hosted, each deployment connects integrations using its own developer apps — there is no shared cloud app, and there can't be (the OAuth secrets would have to be public). This is normal and the code is built for it: if you don't configure an integration, it simply doesn't appear in the UI.
| Integration | What you create | Notes |
|---|---|---|
| HubSpot | A HubSpot app (OAuth) or just a Private App token | Token path needs no app at all |
| Zoho | A Zoho Self Client or OAuth app | Per-workspace Self Client works with no server config |
| Facebook Lead Ads | A Meta app (Facebook Login for Business) | Requires a public HTTPS URL for OAuth + webhooks |
| Google (sign-in, calendar) | A Google Cloud OAuth client | Optional |
Step-by-step setup for each lives in docs/integrations/.
- Frontend — Next.js 15 (App Router), React Query, Tailwind + shadcn/ui
- Backend — Node.js + Express, Mongoose (MongoDB), Agenda for scheduling
- AI — OpenAI for post-call analysis (bring your own key)
- Node.js 20+ and MongoDB (local or hosted), or just Docker.
git clone <your-repo-url> bolchocrm && cd bolchocrm
cp NbProdBackend/.env.example NbProdBackend/.env # then edit the REQUIRED values
docker compose upThis starts MongoDB, the backend (:3500), and the frontend (:3000). Open
http://localhost:3000.
# 1. Backend
cd NbProdBackend
cp .env.example .env # fill in MONGODB_URI, ACCESS_TOKEN, REFRESH_TOKEN, ENCRYPTION_KEY
npm install
npm run dev # http://localhost:3500
# 2. Frontend (new terminal)
cd NbProdFrontend
cp .env.example .env.local
npm install
npm run dev # http://localhost:3000Then sign up at http://localhost:3000 — the first account creates your workspace.
Only four backend variables are truly required: MONGODB_URI, ACCESS_TOKEN,
REFRESH_TOKEN, and ENCRYPTION_KEY. Generate the secrets with:
openssl rand -hex 32 # ACCESS_TOKEN, REFRESH_TOKEN (use two different ones)
openssl rand -hex 16 # ENCRYPTION_KEY (must be 32 characters)Everything else — voice provider, OpenAI key, integrations — can be added later,
much of it directly in the CRM UI (Settings) rather than in .env.
All backend settings are documented inline in
NbProdBackend/.env.example; the frontend's are in
NbProdFrontend/.env.example. Two things are worth
knowing:
- Per-workspace keys live in the UI, not
.env. A workspace owner sets their Bolcho calling key and their OpenAI analysis key under Settings — stored encrypted at rest. The.envvalues (OPENAI_API_KEY, etc.) are only a deployment-wide fallback for single-tenant setups. ENCRYPTION_KEYmust stay stable. It encrypts those stored keys; changing it makes previously-saved keys unreadable (they can just be re-entered).
NbProdBackend/ Express + Mongoose API, scheduler, call handling, integrations
NbProdFrontend/ Next.js app (dashboard, leads, settings)
docs/ Setup & integration guides
docker-compose.yml One-command local stack
docs/integrations/— connect HubSpot, Zoho, Facebook, Google
Issues and pull requests are welcome. For substantial changes, open an issue first
to discuss the approach. Please don't commit real credentials — .env is gitignored
and .env.example is the template.
Voice AI CRM is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). You may use, modify, and self-host it freely, including for internal business use. If you run a modified version as a network service, the AGPL requires you to make your source available to its users. See LICENSE for the full text.
