The complete guide

VoiceFlow CRM AI — Documentation

Everything you need to install, set up, use, automate, and resell VoiceFlow CRM AI — written for people, not engineers. Whether you have never run a server before or you are wiring the REST API into your own stack, there is a path here for you.

VoiceFlow CRM AI dashboard
VoiceFlow CRM AI — the self-hosted platform that turns leads into qualified conversations, automatically.

What is VoiceFlow CRM AI?

VoiceFlow CRM AI is a self-hosted, white-label platform that pairs AI voice calling, lead qualification, a built-in CRM, and multi-channel messaging (WhatsApp, SMS, Telegram, email) in one stack that runs on your server. It calls new leads within seconds, qualifies them with your questions, updates their records, follows up across every channel, and hands your team a ranked shortlist — around the clock. You can even run it as an online store's autopilot: a shopper checks out on WooCommerce and the platform confirms the order over WhatsApp and by AI phone call, with zero clicks from you.

📞 AI voice calling

Autonomous agents call & qualify leads 24/7, then log a recording, transcript, summary, and score.

💬 Team inbox

Two-way WhatsApp, SMS & Telegram in one shared inbox with AI reply suggestions.

⚙️ Automation

Sequences, visual workflows, and conversation flows that run your follow-up for you.

🛒 Store autopilot

Connect WooCommerce and confirm every cash-on-delivery order over WhatsApp buttons and AI calls.

🏷️ White-label & resell

Brand it as your own, sign up clients, and bill them — a full SaaS business in a box.

🌍 Multilingual

English, Spanish & Arabic interface with full right-to-left support; calls in Hindi, Bengali & more.

Pick your path

You do not need to read this cover to cover. Jump to the path that fits you:

💡 How to use this site Use the sidebar to browse by section, or press / anywhere to search every page. Tick the boxes in the checklists as you go — your progress is saved in this browser. Toggle dark/light and text direction from the buttons in the top corner. Everything works fully offline — no internet connection is required to read these docs.

Requirements & installation

The product ships as a single Docker Compose stack, so installation is the same on any server that can run Docker. You can be signed in to a live instance in about fifteen minutes.

What you need

RequirementDetails
A serverA Linux machine (a cloud VPS is perfect) with Docker and Docker Compose v2. 2 vCPU / 4 GB RAM is a comfortable starting point; 4 vCPU / 8 GB is roomy.
A domain optionalA domain name pointed at your server, for a public HTTPS install. Not needed for local testing on localhost.
Provider accounts added laterAccounts for the features you want — telephony, AI, speech, messaging. You add these keys after install from inside the app. See Connect a provider.
📋 Requirement Docker Engine 24+ and the Docker Compose plugin (docker compose, v2). Nothing else needs to be installed on the host — the database, cache, and app all run inside the stack.

Install in ~15 minutes

  1. Upload or copy the product files to your server and open a terminal in that folder.
  2. Run the guided installer:
    ./install.sh
    It checks Docker, asks a few plain questions (your public address, your admin login, whether to load demo data, and whether to enable one-click self-update), writes your .env, builds the images, and starts everything.
  3. When it finishes, open your address in a browser and sign in with the admin email & password you chose.
    You should land on the Dashboard with a "Get your platform live" checklist. That means the stack is healthy and you are running.
💡 Prefer to do it by hand? A step-by-step manual path (copy .env.example.env, docker compose up -d, migrations run automatically) is in Operate ▸ Installation. The installer just automates those steps.
⚠️ Keep your .env safe It holds your secrets. Never commit it to a public place, and back it up. Everything runs on your infrastructure — no data leaves your server unless you connect an external provider.

Your first AI call in 15 minutes

This is the hand-held path from a fresh install to hearing your AI agent qualify a real lead. No jargon — just do each step and watch for the ✅ checkpoints. Tick the boxes as you go; your progress is saved.

  • Sign in as your admin
  • Connect a telephony provider (to dial)
  • Connect an AI provider (to think)
  • Connect speech-to-text and text-to-speech (to hear & speak)
  • Add a lead you can safely call (your own phone)
  • Pick a ready-made voice agent
  • Place the call and read the result

1. Sign in

Open your instance's web address and sign in with the admin email and password you set during install. You land on the Dashboard.

2. Connect the four things a call needs

A phone call needs four services connected. Go to Settings → Providers (in the sidebar, under the Calling group) and add one of each. For each card, pick a provider, paste the key, click Save credentials, then Validate — a green Verified badge means it works.

CardWhat it doesEasiest option
TelephonyPlaces the phone callTwilio
AI / LLMThinks & writes the summaryOpenAI or Google Gemini
Speech-to-TextTranscribes what the caller saysDeepgram (or OpenAI)
Text-to-SpeechGives the agent its voiceSarvam, ElevenLabs, or OpenAI

Exact fields and where to find each key are in Connect a provider.

Each of the four cards shows a green Verified badge. You are ready to call.

3. Add a lead you can safely call

Go to Leads → New lead. Put in your own name and phone number (international format, e.g. +14155550100) so your first call rings your pocket. Save.

⚠️ Trial telephony New Twilio accounts can only call verified numbers until you add billing. Verify your own number in Twilio first, or add billing.

4. Pick a voice agent (one is already written for you)

Go to Voice Agents. Five ready-made agents ship with every workspace — Lead Qualifier is a perfect first call. You do not have to write anything.

5. Place the call

Open your lead's row menu and choose Call now (or run a one-lead campaign). In a few seconds your phone rings — answer it and talk to your agent.

Your phone rang, the agent spoke, and a new row appeared under Calls.

6. Read the result

Open Calls and click your call. At the top is the recording player; below it, tabs for Transcript, AI Summary, Qualification (interest, budget, timeline, intent score), Intelligence, and Score. This is exactly what your team sees for every lead the AI calls — at scale.

💡 What next? Import a CSV of real leads (Import), launch a Campaign to call a whole batch, or automate the follow-up with Workflows.

Your first automation

Let's make the CRM do work by itself: the moment a new lead arrives, tag it and send a welcome message — no human involved. You will use the visual Workflows Studio, and you will not write a line of code.

  • Open Workflows and insert a ready-made recipe
  • Understand the trigger → action shape
  • Validate the workflow
  • Activate it
  • Create a test lead and watch it fire

1. Start from a recipe, not a blank page

Open Workflows (Pro mode — see Finding your way around if you don't see it). Click Templates and insert New-Lead Tag, Enroll & Welcome. The canvas fills with a small graph.

2. Read the shape: trigger → action

Every workflow starts with one trigger (an event, like "a lead was created") and flows into actions (things to do, like "send a message" or "set a field"), optionally through conditions that branch the path. Click any node to configure it in the right-hand panel. Full detail lives in Workflows Studio.

3. Validate, then activate

  1. Click Validate. A green "Definition is valid" confirms the graph is wired correctly.
  2. Click Activate. The engine now watches for the trigger event.
The workflow shows an Active status.

4. Make it fire

Go to Leads → New lead, add a test contact, and save. Within moments the workflow runs — check the lead's tags and message history, and the workflow's run history for a step-by-step log.

💡 The big idea Anything you can do by hand, a workflow can do automatically — across messaging, sequences, fields, knowledge, webhooks, and even placing AI calls. See the full toolbox in Workflows Studio.

Who does what (roles)

Three kinds of people use VoiceFlow CRM AI. Find yours, then follow that path — the sidebar is organised the same way.

RoleWho they areStart at
Owner / AdminYou installed the product and run the instance. You connect providers, package plans, and (optionally) sell access.Set up
Team memberYou use the CRM day to day — leads, calls, the inbox, automations.Use it
Reseller / AgencyYou run your own branded SaaS on top of the product and bill your own clients.Resell

Inside the app, roles are enforced too

Every workspace has four member roles — Owner, Admin, Agent, and Viewer — that control who can change settings, handle live call handoffs, or only read. The same roles apply to the REST API, so an integration can never do more than the member behind its key. Add and manage members under Settings → Members.

First login & the live checklist

You just installed VoiceFlow and you are the instance owner — the person who runs the whole self-hosted platform. This is the first of six setup pages that take you from your very first login to a live, ready-to-sell instance. No technical background is assumed.

💡 You wear two hats As the owner you have an ordinary workspace hat (your own leads, calls, and settings — under Settings) and a platform administrator hat (the whole instance and every customer on it — under the Admin menu, the System Admin Console). Most of this section is about the second hat.

Your owner account already exists

When the product is installed, your owner account is created automatically from the details you set during installation — you do not register it yourself. Open your instance's web address in a browser and sign in with that email and password.

💡 Nobody set a bootstrap admin? If BOOTSTRAP_ADMIN_* was never configured, the first person who registers on a brand-new instance is automatically promoted to system admin — so you can always reach the Admin console.

The welcome screen

On your first sign-in you land on a screen titled "You're the platform administrator." You get three cards:

  1. Set up your platform — takes you straight to the Admin console (payment gateways, plans, providers, your public website). This is the path this section follows.
  2. Continue as a workspace user — the same onboarding your customers see: pick a persona (My business, My agency, or My SaaS) and follow a checklist. Useful for seeing the product as a customer would.
  3. Skip for now — goes straight to the dashboard. This screen won't nag you again.

The "Get your platform live" checklist

However you continue, your Dashboard shows a card called "Get your platform live" with a progress bar and a short checklist: Connect a voice provider, Connect WhatsApp, Load starter templates, Create a voice agent, Import leads, Make your first AI call or send a template, and Configure payments. Each item is a live link — click it to jump to the right screen. The card ticks steps off by itself as you complete them and disappears once everything is done.

Where credentials live: your keys vs. platform keys

VoiceFlow talks to outside services — a phone carrier to place calls, an AI service to write summaries, speech services to transcribe and speak, WhatsApp, Telegram. Each needs a credential. There are two places those credentials can live, and understanding the difference is the single most important concept for an owner.

Settings → Providers
Settings → Providers — connect telephony, AI, speech, and messaging with a Validate button on each.

Settings → Providers — "bring your own keys"

This is your own workspace's set of keys. Anything you enter here is used only for your workspace's calls and messages, billed directly to your accounts at those providers. Find it in the sidebar: Settings → under the Calling group → Providers.

Admin → Platform keys — instance-wide fallback keys

These are instance-wide keys you configure once as the owner. Any customer workspace whose plan grants Platform keys + credits, and that has not entered its own keys, automatically falls back to these — and every call it places is metered against a prepaid credit balance you sell. This is how you resell access without your customers ever needing a Twilio or OpenAI account. Find it under AdminPlatform keys tab.

💡 Which do I use?
  • Running the platform just for yourself, or want the simplest path? Put your keys in Settings → Providers and ignore Platform keys.
  • Reselling to customers who shouldn't bring their own accounts? Configure Platform keys, set a per-minute credit rate, and sell them credits.
  • Both can coexist. If a customer adds their own key in Settings → Providers, it always wins; the platform key is only the fallback. A per-type banner ("Platform keys active") tells a customer when they're running on your keys and drawing down credits.
⚠️ Secrets are one-way Every credential is encrypted at rest and shown masked. Once saved, a secret is never displayed again anywhere in the app — so keep your own copy in a safe place.

Connecting each provider

The steps below are written for Settings → Providers (your own keys), but the Platform keys tab works identically — same cards, same fields, same help boxes — except its save button reads Save platform credential.

Provider cards
Every provider type has its own card. Paste your keys, Save, then Validate — a green check means the connection is live.

How every provider card works

  1. Each provider type has its own card: Telephony, AI / LLM, Speech-to-Text, Text-to-Speech, WhatsApp, Telegram.
  2. Use the Provider dropdown to pick which service you're using. Options marked "— not available in V1" can't be selected yet.
  3. A blue "Where to get these keys" help box appears with an Open button that deep-links to that provider's dashboard, numbered steps, and a "What goes where" map.
  4. Fill the fields, then click Save credentials. The values are encrypted immediately.
  5. The saved credential appears with an Unverified badge. Click Validate to check it live — the badge turns Verified (green) or Invalid (red).
  6. You can keep several providers per type. Click Make active to choose which one handles calls and previews; the active one carries a green Active star. The trash icon removes one.
💡 "Active" only picks the runner It's just which provider runs calls and previews. Others stay configured for features that need them — e.g. ElevenLabs for voice cloning while Sarvam handles the actual calls.

Telephony — Twilio

The carrier that places your outbound calls. Get everything from console.twilio.com.

FieldWhere to find it
Account SIDConsole home → Account Info. Starts with AC….
Auth tokenConsole home → Account Info → Auth Token (click to reveal).
Caller ID numberA Twilio Voice number (Phone Numbers → Manage → Active numbers) in E.164, e.g. +14155551234.
API Key SID optionalAccount → API keys & tokens → Create API key. Starts with SK…. Recommended for production.
API Key Secret optionalShown once, right after you create the API key. Required only if you set an API Key SID.
⚠️ Trial accounts New Twilio accounts get trial credit and can only call verified numbers. Add billing on Twilio to call any number.

AI / LLM — OpenAI or Google Gemini

Generates call summaries and lead-qualification results. Pick one provider; the field is a single API key.

  • OpenAIplatform.openai.com/api-keysCreate new secret key (starts with sk-…, shown once). Requires a paid billing method.
  • Google GeminiGoogle AI StudioCreate API key. Generous free tier; no billing to start.

Speech-to-Text — Deepgram or OpenAI

Transcribes call audio. Single API key field.

  • Deepgram (primary)console.deepgram.com → API Keys → Create a Key. Free sign-up includes trial credit.
  • OpenAI (fallback) — the same OpenAI key also works here (Whisper).

Text-to-Speech — Sarvam, ElevenLabs, or OpenAI

Synthesizes the agent's voice. Single API key field.

  • Sarvam AI — best pronunciation for Bengali and Hindi. Key from dashboard.sarvam.ai. In the app the option reads "Sarvam (Indian-native · Hindi/Bengali)".
  • ElevenLabs — profile → API Keys at elevenlabs.io → Settings → API Keys. Also powers voice cloning.
  • OpenAI — the same OpenAI key works across features.

WhatsApp — Meta Cloud API, Twilio, or one-click Connect

Send WhatsApp messages to leads. Three routes on the WhatsApp card.

Route A — one-click Connect (easiest)

If you (as owner) have configured Embedded Signup on the instance (see System Admin Console ▸ Platform keys), you and your customers see a blue Connect WhatsApp via Facebook button above the manual form. Click it, complete Meta's popup — choosing a WhatsApp Business Account and phone number — and the credential is saved for you (with a long-lived token).

⚠️ Two Meta settings make or break Connect Both under Facebook Login for Business → Settings: "Login with the JavaScript SDK" must be YES, and your exact HTTPS domain must be in "Allowed Domains for the JavaScript SDK." With either missing, clicking Connect silently does nothing. Also allow pop-ups, and use your real domain (or a tunnel URL) — plain localhost is not supported.

Route B — Meta Cloud API (manual)

Choose Meta Cloud API in the Provider dropdown. From your app at developers.facebook.com/apps (add the WhatsApp product first):

FieldWhere
Phone number IDApp → WhatsApp → API Setup → the "From" number's Phone number ID.
Access tokenUse a permanent System-User token (Business Settings → System Users → Generate). The API-Setup "Temporary token" expires in 24 hours.
App secretApp Settings → Basic → App secret → Show. Verifies inbound webhooks.
WhatsApp Business Account ID optionalWhatsApp → API Setup. Needed to manage message templates.

Receiving replies (Routes A and B)

For incoming WhatsApp messages and delivery ticks to reach your inbox, Meta needs a webhook — a one-time step for the whole instance. As owner, open Admin → Platform keys → WhatsApp → Webhook (incoming messages) and copy the Callback URL and Verify token (click Generate token first if none exists — it's created once and then stays fixed). Then in your Meta app go to WhatsApp → Configuration, paste both, click Verify and save, leave "Attach a client certificate" off, and subscribe to the messages field. Done once, it covers every workspace.

The other half — routing your number's messages to that webhook — happens by itself: whenever a Meta Cloud API credential is saved or validated, the product auto-subscribes your WhatsApp Business Account. So if replies ever stop appearing, open the WhatsApp credential row and click Validate — that re-checks the token and repairs the subscription.

💡 Meta asks for a privacy policy URL? Use the pages built into your instance: https://your-domain/privacy and https://your-domain/terms. They're white-label (they carry your product and company name) and satisfy Meta's and Twilio's sign-up forms.

Route C — Twilio WhatsApp

Reuses your existing Twilio account — no separate Meta app. Choose Twilio WhatsApp and enter your Account SID, Auth token, and a WhatsApp-enabled Twilio sender number (Messaging → Senders → WhatsApp senders) in E.164.

Telegram

Message leads who have started your Telegram bot. Choose Telegram Bot and enter a Bot token from @BotFather (send /newbot, pick a name/username, copy the token). An optional Webhook secret is any value you choose.

💡 Telegram has no cold outreach A lead must message your bot first before you can reply — a Telegram platform rule.

Email (SMTP)

Every email the product sends — password resets, notifications, and team invitations — goes over SMTP. Until you set this up, those emails are silently not delivered. Configure it under Admin → Platform keys → Email (SMTP) — no server restart, no editing files. Any SMTP provider works (Brevo's free 300/day: host smtp-relay.brevo.com, port 587; Gmail with an App password; Amazon SES). Enter Host, Port, Username, Password, and a From address, then Save email settings and click Send test email — if it arrives, outgoing email works. The password is write-only; leave it blank on later edits to keep the stored one.

A tour of the System Admin Console

Open it from the sidebar: Admin. The page is titled System Admin Console and marked Instance-wide — these controls affect the whole self-hosted instance and every workspace. A row of thirteen tabs runs across the top.

System Admin Console
The System Admin Console — plans, billing, platform keys, website, and updates in one place.

Overview

Your instance at a glance: aggregate counts (Workspaces, Users, Leads, Calls), a Health panel showing each dependency (database, queue, providers) as Healthy or Unhealthy, and a read-only table of every workspace.

Customers

Your commercial roster: every workspace with owner email, current plan and status, billing provider, member count, credit balances, calls this month, and last activity. Search by name/slug/owner email and filter by plan. Row actions: View entitlements, Assign plan, Grant credits.

Revenue

Read-only per-reseller-org revenue: subscription income plus credit-pack sales, totalled by currency. Populates as resellers subscribe and buy credits.

Plans, Feature packs & Entitlements — how you package and sell

These three tabs are your product catalog — a layer cake:

  • Entitlements are the build-defined switches and limits wired into the code. This tab is a read-only reference: each key's type, default value, whether it's system-critical, and which plans/packs grant it. You set their values via plans and packs, not here.
  • Feature packs bundle a set of entitlement values you can reuse. Create feature pack, then set its values. Packs layer onto plans.
  • Plans are what customers actually get. Create plan → name, price, Public (self-serve) or Private. Per plan: edit Entitlements, attach Feature packs, view Usage, Set default, and Archive / Restore / Delete. A warning badge flags a public paid plan that isn't yet purchasable.
💡 Catalog vs apply Plans and packs are the catalog. You apply a plan to an actual customer from Workspaces → Assign plan.

Billing

Configure Stripe, Razorpay, or PayPal in-app without redeploying — paste credentials, test the connection, enable/disable, set the default gateway, copy the webhook URL, and map each plan to the gateway's native price id. Secrets are write-only. (Stripe, Razorpay, PayPal are implemented; Paddle is shown as planned and not available in this build.)

Platform keys

The instance-wide fallback provider keys. It holds: Call pricing (set Credits per minute; per-call cost is ceil(minutes) × rate), WhatsApp Connect (Embedded Signup) config (App ID, Configuration ID, App secret — from developers.facebook.com), the Webhook (incoming messages) card, the Email (SMTP) card, and a card per provider type (saved with Save platform credential).

Website

The editor for your public marketing site — home page, /resellers page, tab title, footer. Copy-level (not drag-and-drop). Each section is its own card (Brand, Hero, Stats, Testimonials, FAQ, Footer, SEO, Sections, Resellers page) with its own Save and Reset. Changes go live immediately.

Workspaces

The all-workspaces table for cross-workspace admin actions: View entitlements, Assign plan, Grant credits. This is the only place a system admin assigns plans or grants credits to another workspace.

System settings

Base domain — set a domain so every organization gets a free address at <org-slug>.your-domain with automatic HTTPS and no DNS setup. System settings — instance-wide tunables shown as labelled toggles and fields; changes apply within ~5 seconds.

License

Your instance license and edition. The platform always runs — with no license it gracefully uses the free community edition (a calm banner says so). To activate a commercial edition, paste your signed license key and click Activate license. Online activation/transfer are optional and off by default for self-hosted installs — pasting a key is the normal path.

Updates

The offline-first, non-destructive update surface. Shows your current version and release channel, and — only if you configure an update source — whether a newer release exists. Click Check for updates anytime; nothing is ever applied automatically. When enabled, One-click update backs up your database, installs the new version, and restarts with live progress. See Operate ▸ Updating.

Branding your instance (white-label)

Make the product look like yours. Go to Settings → under the Workspace group → Branding. A live preview on the right updates as you type.

Settings → Branding
Settings → Branding is your white-label control panel — set product name, company name, logo, and favicon and watch the live preview update.

These settings apply to everyone in your workspace and override the inherited brand. Sections:

  • BrandProduct name (nav and page titles), Company name (footer and emails), Logo and Favicon (upload a PNG/JPG/WebP up to 2 MB, or paste an https:// URL — SVG isn't supported).
  • Colors & typography — a Primary color picker, an optional Customize accent color toggle, and a Font family from a safe allowlist.
  • Login page — a Login tagline and an optional custom login background color.
  • EmailsFrom name, Header logo URL, and Footer text for transactional emails.
  • Footer & supportFooter text, Copyright, Support URL, and Support email.

Click Save changes. Use Reset to default to clear all overrides.

💡 Two brand surfaces Branding here themes the logged-in app. Your public marketing site is branded separately under Admin → Website → Brand. Resellers get their own agency-level branding — see Resell ▸ White-label branding.

The shortest path to going live

If you just want to make your first AI call and start charging, do exactly this. Tick as you go.

  • Connect telephony (Twilio) and Validate
  • Connect AI, Speech-to-Text, and Text-to-Speech, and Validate each
  • Pick a ready-made voice agent (or write your own)
  • Import a few leads
  • Make your first call (single call or a campaign)
  • To charge: configure a payment gateway and create a purchasable plan
  1. Connect telephony. Settings → Providers → Telephony (Twilio). Save and Validate. This alone unlocks calling.
  2. Connect AI, STT, and TTS. On the same screen, add an AI key (OpenAI or Gemini), an STT key (Deepgram or OpenAI), and a TTS key (Sarvam, ElevenLabs, or OpenAI). Validate each.
  3. Pick a voice agent. Five ready-made starter agents ship with every workspace (sidebar → Voice Agents).
  4. Import a few leads. Sidebar → Import → upload a CSV.
  5. Make your first call. Launch a campaign or place a single AI call. Your dashboard checklist ticks over to "live."
  6. To charge customers, go to Admin → Billing and configure one gateway (Stripe, Razorpay, or PayPal), then Admin → Plans to create at least one purchasable plan.
💡 Selling access with your own keys? After steps 1–2, put those same keys in Admin → Platform keys instead of Settings → Providers, set a Credits per minute rate, create a plan that grants Platform keys + credits, and assign it from Admin → Workspaces. Your customers then start calling with zero provider setup of their own.

Using the CRM — feature guides

This section is your day-to-day handbook: one page per menu item, in the same order they appear in the app's sidebar. Every field is explained in plain terms. Use the sidebar or press / to jump to any feature.

The menu map

The app's sidebar groups pages by purpose. Here's the whole map, so you always know where you are:

💡 Selling online? If you run a WooCommerce store, the Sell on autopilot section ties Leads, Voice Agents, WhatsApp Templates, and Workflows together into a hands-free order-confirmation machine.

Ready-made starters — working examples on every page

The first time you open almost any page, it is already populated with professionally written examples. Instead of staring at an empty screen wondering what a "sequence" or a "scorecard" looks like, you open the page and see a finished one. Use them as-is, edit them, or delete them — they're ordinary items, not locked demos.

✅ The safety rule behind all of them Starters never act on their own. Nothing calls a lead, sends a message, or spends a credit until you explicitly launch, activate, or submit it.
PageWhat's waiting for youUntil you act, it…
Voice Agents5 agents (Lead Qualifier, Appointment Setter, Real Estate Qualifier, Customer Win-back, Feedback & Review Collector)never dials — agents only call when you launch a campaign.
CampaignsOne draft, My first calling campaign, wired to your first agent with zero leadscannot call anyone — pressing Start dispatches nothing until leads are added.
WhatsApp Templates15 template drafts — from a welcome greeting to a product carousel and the COD kitstays a private draft until you submit it to Meta for review.
Sequences3 follow-up drips (New lead follow-up, Missed call recovery, Long-term nurture), all draftsnever sends — a sequence runs only after you Activate it and enroll leads.
WorkflowsA Templates menu of 14 ready automations (COD-first, then Speed-to-Lead, Missed-Call Rescue…)does nothing until you Validate and Activate one.
PipelinesA Sales Pipeline board, created automatically — every new lead lands in its first stagejust displays your leads; dragging cards is always up to you.
Forms / Landing Pages3 forms (Contact us, Get a quote, Book a call) and 2 pages (Lead magnet, Special offer), live at their linksonly ever collects leads — a capture page can't send anything, so live is safe.
Tags5 labels: Hot lead, Warm lead, Cold lead, VIP, Follow upsits there until you tag someone.
Knowledge BaseA Load a sample FAQ button (a button on purpose)does nothing until clicked, because ingesting content uses a little AI credit.
Scorecards3 QA scorecards (Lead Qualification, Appointment Setting, Customer Service)the default one quietly grades each finished call — that's all.
💡 Deleted a starter and want it back? Starters never re-appear on their own. Most pages have a Load starter… button that restores the missing ones in one click — existing items are never duplicated or overwritten.

The Dashboard

Your return-on-investment view — the numbers that tell you the AI is earning its keep.

Dashboard
The Dashboard — your ROI metrics at a glance.

The Dashboard shows total leads, calls attempted/connected, qualified leads, conversion rate, average call duration, and callbacks/meetings requested — filterable by All time / 7 / 30 / 90 days. Below the KPIs, a Call activity chart and Campaign & Agent performance tables show what's working. On a new instance, the "Get your platform live" checklist guides setup and ticks itself off as you go.

💡 Never a blank screen Every list in the product has friendly empty states with a next step, clear loading skeletons, and a retry on any hiccup — so you're never left guessing.

Leads — your contact database

Everything starts with leads. Open Leads from the sidebar to see, add, and organise the contacts your AI will qualify.

Leads workspace
The Leads workspace — search, filter, tag, and open any contact your AI will qualify.
  • Add one by hand: click New lead, fill in Name and Phone (email, company, and status are optional), and save. Phone numbers use international format, e.g. +14155550100.
  • Import a CSV in bulk: click Import CSV (or open Import). Drag your file, map columns, review sample rows, and get a report of Created / skipped-invalid / skipped-duplicate, with a downloadable error report.
  • Find & filter: search by name, phone, or email, and filter by status or tag. Select multiple rows to export or delete in bulk.
Lead detail panel
Open any lead to edit details, tags, custom fields, pipeline stage, and its full message history.

The lead panel

Click a lead's name to open its side panel. Edit its details, place it on a pipeline stage, add free-form custom fields, and manage tags (click a tag to add or remove it). The panel also shows the lead's full message history across email/SMS/WhatsApp/Telegram, the sequences it's enrolled in, and its meetings.

💡 Store orders show here too If you connect WooCommerce, a lead placed from an order gets a read-only Order card in this panel — order number, total, items, store status, and a colour-coded COD confirmation badge. See The Lead Order Card & COD badges.

Pipelines — your sales board

A Kanban board of your sales stages, entirely separate from a lead's call status.

Pipeline board
Drag a lead from New to Won across your sales stages.

A pipeline called Sales Pipeline is created for you automatically with the standard stages (New → Contacted → Qualified → Proposal → Won / Lost), and every new lead is placed in its first stage by itself — whether you typed it in, imported a CSV, or captured it from a form. Open Pipelines and your leads are already on the board; drag a card to move it.

Create more boards with New pipeline (one field — it starts with the standard stages, which you can rename or reorder).

💡 Board looking empty? Leads created before this feature existed aren't on the board yet. Click Add existing leads — one click pulls every unplaced lead into the first stage.

Tags — reusable labels

Tags are colour labels you attach to leads to segment and filter them.

Open Tags (Pro mode) to manage them. Five starters are already there — Hot lead, Warm lead, Cold lead, VIP, Follow up. Rename them or add your own, then click a tag on any lead to apply it, and filter the Leads list by tag. Tags also drive automation: a workflow can add a tag, and you can enroll everyone with a tag into a sequence.

Import — bulk-load leads from a CSV

A guided four-step wizard: Upload, Map columns, Import, Report.

Import wizard
Drop a CSV, map your columns to lead fields, import, and read a full report.
  1. Upload — drag in your .csv file.
  2. Map columns — match each column in your file to a lead field. Name and Phone are required; email, company, and status are optional. Anything else can map to a custom field.
  3. Import — review the sample rows, then run it.
  4. Report — see how many were Created, skipped as invalid, or skipped as duplicates, with a downloadable error report for anything that didn't import.

Every imported lead lands on your Sales Pipeline board automatically, just like a hand-typed one.

The team inbox — two-way messaging

One shared, two-way inbox across WhatsApp, SMS, and Telegram — with delivery ticks, AI reply help, and team tools.

Team inbox
WhatsApp, SMS, and Telegram in one two-way thread, styled like WhatsApp Web.

The left pane lists conversations (filter by All, Unread, WhatsApp, SMS, Telegram, or Assigned to me); the right pane is the full thread with delivery ticks (Sent → Delivered → Read).

  • Reply inline — pick a channel and type. On WhatsApp you can reply freely inside the 24-hour customer-service window (it restarts every time the customer messages you); outside it, send an approved template — a banner tells you which applies.
  • Rich composer — attach files (WhatsApp + Telegram), record and send voice notes, drop in emoji from a built-in picker, and get automatic link-preview cards. The lead-detail composer and the inbox composer are at full parity.
  • AI helpSuggest reply drafts a response that greets the customer by name, speaks as your brand, and pulls facts from your Knowledge Base — landing in the reply box for you to edit (never auto-sent). Summarize condenses a long thread.
  • Team toolsAssign a conversation to a teammate, add colour Labels, and leave internal notes only your team can see.
💡 Opt-outs handle themselves When a customer replies STOP (or unsubscribe, cancel…) on SMS or WhatsApp, they're marked opted out automatically; START opts them back in. You can also flip per-channel opt-out switches on any lead by hand.
⚠️ You own compliance Consent, opt-outs, TCPA/GDPR, and local laws are your responsibility, and each message incurs provider cost. Always honour a lead's opt-out switches.

Capture forms

Build hosted or embeddable lead-capture forms that drop submissions straight into your CRM.

Form builder
The form builder — basics, fields, branding, and automation, with a live preview.
  1. Set the Basics (internal name, title/headline, description, button label) and add Fields (text, email, phone, dropdown, consent checkbox, file upload, and more).
  2. Optionally add Branding (logo, accent colour), spam protection, and automation — auto-assign captured leads to a campaign or tag, and even auto-call them.
  3. Publish, then use Share & embed to copy the hosted URL or an embed snippet.

Where the public link is — and embedding it

Every form lives at your-domain/f/its-name. In the Share & embed panel, click Copy for the hosted link, or pick a Display modeinline (sits in the page), popup (opens from a button), or launcher bubble (floats in the corner) — and copy the snippet. Paste it into any website that accepts HTML; on WordPress use a Custom HTML block. No plugin, no code.

Every submission becomes a lead automatically (no separate submissions inbox) and lands on your pipeline board. If you set auto-call, your AI phones them while their interest is warm.

💡 Five capture surfaces are prebuilt Forms ships Contact us, Get a quote, and Book a call; Landing Pages ships Lead magnet download and Special offer — all already live at their links (safe, because a capture page can only collect a name and phone).

Landing pages

Full branded pages with SEO fields — built with the same simple builder as forms.

Forms & landing pages
Forms & landing pages — capture leads from the web straight into your CRM.

Open Landing Pages → New and pick a template (classic, spark, trust, or offer), then edit its sections (hero, features, testimonials, FAQ, call-to-action) and SEO fields. Publish, and the page lives at your-domain/p/its-name. Two starters — Lead magnet download and Special offer — are live from day one.

Like forms, every submission becomes a lead and lands on your pipeline. Use Share & embed to copy the public link for ads, emails, QR codes, or your bio.

Sequences — scheduled follow-up

An automated drip of email/SMS/WhatsApp/Telegram steps sent on a schedule.

Sequence builder
Each step has a channel, a delay, and a message.

Open Sequences → New sequence, then in the Builder add steps — each with a channel, a delay (minutes/hours/days after the previous step), and a message. Personalise with {{name}}-style tokens. Activate the sequence, then Enroll leads. Enrollments stop automatically when a lead opts out, is deleted, the sequence is archived, or the final step is sent. The Enrollments and Analytics tabs show who's in it and how it's performing.

Three drips are already written for you

  • New lead follow-up — a text right away, an email next day, a final text on day 3.
  • Missed call recovery — a text right away, another next day, an email on day 2.
  • Long-term nurture — an email now, another after two weeks, a text after four.

All three are drafts — a draft never sends. Edit the wording, then Activate and Enroll when you mean it. They use SMS and email only, because a WhatsApp step needs an approved template first.

💡 Templates without codes On a WhatsApp sequence step you pick an approved template and fill each blank from a dropdown — see the fill-the-blanks mapper. No expression syntax to learn.

WhatsApp templates — message anyone beyond the 24-hour window

Once 24 hours have passed since a customer's last message, you can only send a template that Meta has reviewed and approved. Templates are how you start WhatsApp conversations: reminders, order updates, offers, follow-ups.

WhatsApp template builder
Compose name, language, category, header/body/buttons, watch the live phone preview, and submit for Meta's review.

Open WhatsApp Templates (Pro mode / owner page). It's where you build, submit, and track templates.

Fifteen templates are already drafted for you

Your first visit shows 15 ready-made drafts: welcome greeting, appointment reminder, order confirmation, order shipped, OTP verification, payment reminder, feedback request, re-engagement offer, abandoned cart, lead follow-up, a product carousel (swipeable multi-card message), and the four-piece COD kit (Order received, Confirm with buttons, Confirmed, Cancelled). Pick one from "Choose a starter…" and the builder prefills its name, category, body, sample values, and buttons — you just review and submit. A draft lives only in your workspace until you submit.

Getting a template approved

  1. Connect WhatsApp via Meta Cloud API first (Route A or B in Connect a provider) — template management needs your WhatsApp Business Account linked.
  2. Open a starter or build your own with New template: the builder shows a live phone preview as you edit name, language, category, body, header, and buttons. Personalisation slots like {{1}} are filled when you send. Click Submit for review.
  3. Meta reviews it — usually minutes, sometimes up to 24 hours. The status updates as approved or rejected.
  4. Once approved, the template is sendable from the Inbox when the 24-hour window is closed, and usable in sequence and workflow steps.

Frozen wording vs. fillable variables

The key rule: fixed wording is frozen by Meta at approval; variables, images, and URL suffixes are per-send. So a carousel approved with fixed card text can't change that text per send — but its {{1}} variables, header image, and dynamic URL suffix all can.

💡 The product quietly fixes what Meta rejects At submit time, known deal-breakers are cleaned up: emoji stripped from text headers and button labels (Meta hard-rejects them there — body emoji are fine), carousel sample images uploaded in the format Meta demands, OTP templates reshaped to Meta's only accepted structure, and wording that ends on a fill-in slot caught before submission. Your message body is never rewritten. If Meta still says no, you see Meta's actual reason on screen.

Voice Agents — the AI that makes the calls

A voice agent is the caller: a qualification script (its prompt) plus a voice. Five are already written for you, so you can call in minutes without writing a word.

Create an agent
Create an agent — name it and describe how it should behave.

Open Voice Agents → New agent: give it a name, write its qualifying questions as a prompt, and configure its voice and language in the AI & voice card. Or use one of the five starters (Lead Qualifier, Appointment Setter, Real Estate Qualifier, Customer Win-back, Feedback & Review Collector).

The "AI & voice" card, field by field

  • AI providerOpenAI or Google Gemini (the brain that runs the conversation).
  • TTS providerSarvam (Indian-native · Hindi/Bengali), ElevenLabs, or OpenAI (the voice engine).
  • Voice — a gallery of persona cards: each shows a gradient avatar, the voice's name, a one-line description (e.g. "Male — warm, best Hindi"), and language/accent chips. Press the round on any card to hear a real sample — it uses the exact same speech engine as a live call. Pick the one you like.
  • Voice profile — optionally override the voice with a saved profile from the Voice Platform (including a cloned voice). "None" uses the default voice above.
  • Opening language — the language the agent opens the call in. Options: Auto (Hindi + English), हिन्दी, বাংলা, English (India), Español, العربية. Helper text: "The agent opens the call in this language and switches automatically if the caller speaks another."
💡 It follows the caller Opening language is only the starting point. If the caller answers in another language, the agent switches and continues in theirs — full code-switching stays on. Sarvam covers Hindi/Bengali/English natively; ElevenLabs multilingual covers Spanish/Arabic.
💡 The agent hangs up politely When the conversation is genuinely finished (goodbyes exchanged), the agent ends the call by itself — no awkward silence, no runaway minutes.
⚠️ Calls need two providers An AI provider (to think) and a telephony provider (to dial). If either is missing, a banner names the one to set up — see Connect a provider.

Conversation Studio — design the call script

Where a plain prompt isn't enough, Conversation Studio (Conversation Flows) lets you design the exact branching script a voice agent follows on a call.

Conversation Studio
Each flow shows its status and which agent it's attached to.

Open Conversation Studio (Pro mode). Build a flow on the canvas — greet, ask, branch on the answer, capture a field, look up knowledge, book a meeting, or hand off to a human. Then Simulate it safely (no real calls) and Attach it to an agent. When that agent calls, it follows your flow instead of improvising from a prompt alone.

💡 Studio vs Workflows Conversation Studio designs what happens inside a single call. Workflows automate what happens across your CRM (send a message, place a call, set a field) when events fire. Different tools, same visual canvas.

Voice Platform — build & preview voices safely

A premium studio for building provider-agnostic voice profiles, previewing any voice, comparing them, and cloning your own — all without ever placing a call.

Voice Playground
The Playground — type sample text and hear any voice. It generates speech only; it never dials.

Open Voice Platform (Pro mode). It has two tabs:

Library

Your workspace's saved voice profiles — each a reusable "voice" (provider + voice + language + settings) you can attach to any agent. "Open in Playground" seeds a profile for editing.

Playground

Two panes. On the left: pick a Provider, a Voice, a Language, type Sample text, and tune the Settings the provider supports (only the relevant ones show). On the right: the preview "stage." Actions include Save profile, a side-by-side Compare, and Clone a voice.

✅ Safe preview The Playground generates speech only — it never places a phone call. Preview any catalog voice, including the Sarvam Indian-native roster, before you commit it to an agent.

Cloning your own voice

On a clone-capable provider (ElevenLabs) with the voice-cloning entitlement, click Clone a voice, record a ~30-second sample (or upload one), and the cloned voice lands in your Library ready to attach to an agent. If your plan doesn't include cloning, you'll see an upgrade note.

Agent Platform — goal-driven AI agents

Beyond voice-calling agents, the Agent Platform lets you build goal-driven AI agents with a limited, safe toolset, each testable in its own Playground.

Agent Platform
Build assistants, specialists, or multi-agent orchestrators — each with a limited toolset — and dry-run any of them.

Open Agent Platform (Pro mode). Create an assistant, a specialist, or a multi-agent orchestrator, give it a goal and a bounded set of tools, and dry-run it in the Playground with zero real side effects. It's the toolkit for the AI helpers that power features like inbox reply suggestions and knowledge-grounded answers.

Knowledge Base & memory

Ground your AI in your own content so it answers accurately — on calls, in the inbox, and everywhere knowledge is used.

Knowledge Base
Add sources, ingest them, then test what an agent would recall.

Open Knowledge Base (Pro/premium). Add Sources (paste text or add a URL) and ingest them so they can be retrieved. Use Test retrieval to preview what an agent would recall for a given question, and the Memory viewer to review durable facts agents remember across calls.

The fastest start: load the sample FAQ

On the empty page, click Load a sample FAQ. One click creates a source called "Sample: Business FAQ (edit me)" — ready-made Q&A covering hours, services, pricing, quotes, service area, refunds — and ingests it. Each answer has a clearly marked [replace with your real …] placeholder; swap in your details and your AI starts answering like it works for you.

💡 Why a button, not automatic? Ingesting runs content through your AI provider, using a little AI credit — so the product never spends without being asked. The payoff shows everywhere: inbox Suggest reply, agent answers on calls, and Test retrieval all get sharper.

Campaigns — call a batch of leads

A campaign runs your AI agent across a set of leads, with live progress you can pause and resume.

Campaign wizard
Four steps: Name, Voice agent, Leads, Review & launch.

Open Campaigns → New campaign and follow four steps: Name it, pick the Voice agent, choose the Leads to call, then Review & launch. Once running, the page shows live progress (Total leads, Completed, Connected, Qualified) and lets you Pause, Resume, or Start. Calls run in the background under your concurrency limit — walk away and check back.

💡 Call one lead on demand Open a lead's row menu and choose Call now — no campaign needed.
💡 A campaign is already waiting As soon as your workspace has a voice agent, the page shows My first calling campaign — a draft wired to that agent with no leads, so it can't dial anyone even if you press Start. It's there to show you the shape.

Calls — read every result

Every call attempt, its status and outcome — one click from the recording, transcript, and score.

Call detail
Open any call for the full transcript, turn by turn, plus a recording player and six tabs.

Open Calls to see every attempt, its status (Ringing, Completed, No answer…) and outcome (Qualified, Callback, Meeting…). Click any call to open its detail page. At the top is the recording player — play, scrub, switch speed (1x → 2x), or Download the audio (streamed securely through your own server, never a public link). Below it, six tabs:

  • Transcript — the full conversation, turn by turn.
  • AI Summary — a short plain-English recap.
  • Qualification — the structured result: interest, budget, timeline, objections, meeting/callback requested, and an intent score.
  • Intelligence — sentiment, talk-ratio, interruptions, topics, keywords, highlights, action items, and coaching insights.
  • Score — the call graded against a scorecard; the default one scores automatically.
  • Handoff — the timeline if the call was escalated to a human.

Two roll-ups: Transcript Search and Conversation Intelligence.

⚠️ Recording & consent Calls are recorded by default so playback and AI analysis work out of the box. Turn recording off per workspace under Settings → Calling → Voice → Call recording. Laws vary — many places require telling the other party; add a notice to your agent's greeting where required.

Live Handoffs

When an AI call needs a human, it escalates — and you take it live.

Live Handoffs
Monitor and accept AI-to-human call escalations in real time.

Open Live Handoffs (Pro mode) to monitor escalations in real time. Set your callback number and presence (Available/Away/Busy/Offline) in the header; when a handoff arrives, Accept & connect forwards the live call to your number, or Decline it. Each handoff shows its reason, target, and full timeline.

Conversation Intelligence

AI-derived performance across all your calls — not just one.

Open Conversation Intelligence (premium) for a rolled-up view of sentiment trends, common topics and keywords, talk-ratio, objections, and coaching insights across your whole call history. It's the same analysis that appears on each call's Intelligence tab, aggregated so you can spot patterns — which agents, scripts, and times convert best.

Transcript Search

Find every call where a word or phrase was said.

Open Transcript Search (premium), type a word or phrase, and get every call whose transcript contains it — jump straight to that call's detail page. Perfect for "who mentioned refund?", "which leads asked about pricing?", or auditing how a competitor's name came up.

Bookings & meetings

Schedule and track appointments with leads — no external calendar required (though you can connect Google or Outlook to also sync).

Availability
Set your bookable hours once — weekly windows generate the slots leads (and your AI) can book.

Set your bookable hours on the Availability tab (weekly windows generate slots), then create meetings by picking a slot, entering a manual time, or leaving them as a request. Each meeting moves through Requested → Scheduled → Completed / No-show / Cancelled.

The AI books meetings for you

When someone on an AI call agrees to a meeting — or asks for a callback — you don't lift a finger:

  • A meeting titled "AI-requested meeting" appears automatically: Scheduled if the customer agreed a specific time, or a request for you to pick. The AI knows today's date, so "Tuesday at 11" lands on the right Tuesday.
  • For a callback with an agreed time, the lead's status flips to Callback with that time stored — visible on the lead and in the call's Qualification tab.

So after each campaign, a glance at Meetings shows every appointment your AI set up overnight.

Workflows Studio — visual automation

Automate your CRM visually: when an event happens, do something — send a message, place an AI call, set a field, enroll a sequence, call a webhook. No code, but deep enough for serious flows.

Workflow Studio
Drag triggers, actions, and conditions onto the canvas; click any node to configure it.

Open a workflow in the Studio. Every workflow has this shape: one trigger (an event) flows into actions (things to do), optionally routed by conditions (branches) and paced by control nodes (delay, wait-until, loop, set-variable, end). Click any node to configure it in the right-hand panel; "Definition is valid" confirms the graph before you activate it.

Triggers — what starts a workflow

TriggerFires when…
lead.createdA new lead is created in the workspace.
lead.capturedAn external source (API, WooCommerce) pushes a lead — for new and returning leads alike, so store automations cover repeat customers.
call.completedA call finished (connected or otherwise).
qualification.producedThe AI produced a qualification result for a lead.
cod.disposition.producedThe AI produced a COD confirmation outcome (confirmed / cancelled / unclear) — the seam that drives the post-call WhatsApp update.
campaign.completedA calling/messaging campaign finished.
message.sentAn outbound message was dispatched.
booking.createdA calendar booking/appointment was created.
call.handoff.requestedA live call requested a human handoff.
call.handoff.completedA human handoff reached a terminal outcome.

Actions — what a workflow can do

ActionWhat it does
message.sendSend a message to a lead on email/SMS/WhatsApp/Telegram (central suppression & opt-out preserved). Supports approved WhatsApp templates.
call.placePlace an AI voice call to a lead; the transcript & summary land on the Calls page, and call credits/limits apply exactly like a manual call.
sequence.enrollEnroll a lead into an active nurture sequence.
lead.set_fieldSet a single custom field on a lead.
lead.get_fieldRead a lead's current custom-field value into the run variables — so you can branch on live lead state after a delay, not the frozen trigger event.
knowledge.retrieveRetrieve top-k knowledge chunks for a query (RAG). Needs the knowledge-base entitlement.
credits.grantGrant credits to the workspace ledger.
webhook.sendPOST a JSON payload to an outbound webhook URL.

Conditions — branching logic

A condition node routes the flow down a true or false path (with optional else and onError edges). Fourteen operators are available: eq, neq, gt, gte, lt, lte, contains, matches (regex), exists, in, plus and, or, not to combine them. Operands are written in the workflow expression language.

Human-readable node labels

Every node has an optional Label field (placeholder "e.g. Confirmed → WhatsApp", hint "A friendly name shown on this node. Leave blank to use the default."). With a label, that friendly name becomes the card's title and the technical type is demoted to the subtitle (e.g. "message.send · Action"). This is why the ready-made recipes read like plain English on the canvas — "📲 Send Confirm / Cancel buttons", "⏲ Wait for reply (editable)", "📞 AI fallback call".

Filling template blanks — no codes to type

When a message.send node uses a WhatsApp template, you don't hand-write variable expressions. Pick the approved template, and a row appears for each blank labelled "Variable 1", "Variable 2"… — each a dropdown of human-labelled data:

Dropdown labelFills with
Customer namethe lead's name
Phone numberthe lead's phone
Order numberthe store order number
Products in the orderthe item list (e.g. "2× T-shirt, 1× Mug")
Order total / Order status / Order linkthe order's total, store status, or link
Emailthe lead's email
COD outcome / COD reasonthe confirmation result (COD call flows only)

The intro reads: "Match each blank in your template to the data that should fill it. No codes to type — just pick from the list." A Custom… option at the bottom of any dropdown reveals a raw expression field for advanced cases — the power is never taken away, just tucked out of the way.

Ready-made recipes

You don't start from scratch. The "Insert a template" dropdown holds 14 recipes, COD-first:

  1. 🛒 COD Button-First Autopilot — the flagship store flow (see Sell on autopilot ▸ button-first flow).
  2. 🛒 WooCommerce Order Autopilot — instant order-received WhatsApp + tag on every order.
  3. 📞 COD Confirm by AI Call — call to confirm the moment an order lands.
  4. 📣 COD Result → WhatsApp Update — messages the confirmed/cancelled outcome.
  5. ⚡ Instant Speed-to-Lead · 🔥 Hot-Lead Alert with Email→SMS Failover · 📞 Missed-Call Rescue · 🎯 Post-Qualification 3-Way Nurture Split · 🩺 Booking Confirm + Day-Before Reminder · 🚨 Live Human Handoff SLA Safety-Net · 📊 Campaign Wrap-Up Report · 🛍️ D2C High-Intent VIP Offer · 🏡 Real Estate Instant Inquiry Blitz · 🏷️ New-Lead Tag, Enroll & Welcome.

Insert one, tweak its nodes, click Validate, then Activate. Every run is logged in the workflow's run history with a step-by-step trace.

💡 Selling online? The four COD recipes are the engine behind Store Autopilot — that section walks the whole button-first flow with a diagram.

Integrations & the Event Inspector

Two quieter pages you'll meet in the sidebar. Neither needs setup to use the rest of the product.

Integrations

A catalog of outside tools (calendars, CRMs, and more). Pick one, click Connect, and sign in or paste an API key. Once connected, your automations and AI agents can use that tool. Until you connect something, the page is just the catalog — your calendar or CRM is a great place to start.

Event Inspector

A running record of everything that happens in your workspace, written automatically: a lead created, a call ended, a form submitted. It's empty on day one because nothing has happened yet — come back after some activity and it becomes your "what exactly happened, and when?" page. To push events to your own tools, add a subscription here, or use webhooks.

Scorecards — grade every call

A scorecard is a rubric the AI uses to grade calls automatically, so you can measure quality at scale.

Find them under Settings → Scorecards (also in the sidebar in Pro mode). Three professionally written starters ship with every workspace — Lead Qualification QA, Appointment Setting QA, and Customer Service QA — and the default one scores each finished call by itself, with no setup. Build or edit rubrics (criteria + weights), and the grade appears on each call's Score tab.

The wow feature

Sell on WhatsApp autopilot (Store Autopilot)

If you run a cash-on-delivery (COD) store, this is the feature that pays for the product. A shopper checks out, and — with zero clicks from you — they get a WhatsApp message to confirm the order with a tap; anyone who doesn't tap gets an AI phone call; and the order status updates itself in WooCommerce. Fake orders drop, fulfilment gets faster, and your team does nothing.

The whole pipeline in one picture

🛒 WooCommerce order placed 📇 CRM lead + order fields 💬 Confirm buttons, then 📞 AI call if quiet ✅ Settled status back to store

Why it matters

Fewer fake orders

Unconfirmed COD orders are the #1 cost for online sellers. Every order is verified before you ship.

Zero manual work

No one calls, messages, or updates a spreadsheet. The whole loop runs itself.

Cheapest-first

A free WhatsApp button tap settles most orders; only silent ones cost a phone call.

What you'll set up (four pieces)

  1. Connect WooCommerce with the free plugin.
  2. Approve the COD message templates (a four-piece kit is pre-written).
  3. Turn on the button-first workflow — a ready-made recipe.
  4. Give your COD voice agent the right opening language.
💡 In a hurry? The button-first flow page has an interactive diagram — click each stage to see exactly what happens and when.

Connect your WooCommerce store

Our free WordPress plugin turns every shopper into a lead in this CRM, hands abandoned checkouts to a recovery sequence, and lets the CRM write order statuses back after a COD confirmation. The current plugin is version 1.3.0.

What happens automatically once it's connected

  • Someone places an order → a lead appears here. Their name and phone become a lead, and the order number, total, status, currency, items, email, and store URL ride along as custom fields.
  • A repeat customer updates the same lead. An order from a phone already in the CRM updates that lead (upsert-by-phone) instead of being rejected as a duplicate — so store automations fire for returning buyers too.
  • Someone starts checkout but doesn't pay → a recovery lead. A background scan every few minutes sends unpaid checkouts in tagged event = abandoned_cart, ready for your Abandoned cart recovery sequence.
  • After a COD confirmation, the order moves itself. The CRM writes the result back: confirmed → Processing, cancelled → Cancelled.

Set it up in five minutes

  1. Create an API key. In this CRM, go to Settings → Developers and create a key with the leads:write scope. Copy it — it's shown only once (it looks like vf_live_…).
  2. Install the plugin. On your WordPress site, upload and activate VoiceFlow CRM for WooCommerce (Plugins → Add New → Upload Plugin). The zip ships in integrations/dist/voiceflow-crm-woocommerce-1.3.0.zip. WooCommerce must be active.
  3. Connect. Open WooCommerce → VoiceFlow CRM and enter your CRM base URL (no trailing slash, e.g. https://crm.yourbrand.com) and the API key. Choose which order statuses create a lead and enable abandoned-cart recovery. Save.
  4. Test. Click Send test lead, then check Leads here — a lead named "VoiceFlow Test Lead" should appear.
    The test lead appears under Leads. Your store is connected.
  5. Turn on recovery (optional). Activate the Abandoned cart recovery starter sequence and add an automation that enrolls leads whose event is abandoned_cart.
✅ Write-back connects on Save Saving the plugin settings also auto-registers a per-store write-back secret with your CRM — nothing to copy-paste. That's what lets the CRM advance the order status after a confirmation call.
💡 Your checkout is never at risk The plugin talks to the CRM with a short timeout and quietly logs any hiccup (WooCommerce → Status → Logs) instead of slowing the store. One thing to know: a lead needs a phone number, so orders without a billing phone are skipped — make the billing phone required if you want every order captured.

The button-first COD flow

This is the heart of Store Autopilot. Before any call is placed, the customer gets WhatsApp buttons; a tap settles the order instantly at zero cost, and only silent orders escalate to an AI call. Both paths end the same way.

💡 Interactive Click any stage in the diagram to see exactly what happens at that step.
1 · Order placedon your WooCommerce store 2 · Confirm / Cancel buttonssent on WhatsApp · awaiting_reply 3a · Customer tapsinstant · zero call cost 3b · No reply in 15 minAI confirmation call · call_placed 4 · COD dispositionconfirmed · cancelled · unclear 5 · Result + write-backWhatsApp message · store status
Click any stage above to see what happens at that step.

Turning it on

  1. Approve the WhatsApp templates from the COD messaging kit (especially the buttons template).
  2. Open Workflows → Insert a template → 🛒 COD Button-First Autopilot.
  3. On the send step, pick your approved buttons template and match its variables from the dropdowns (Customer name, Order number, Products).
  4. Paste your COD voice agent's id into the call step, and edit the ⏲ Delay if 15 minutes isn't what you want.
  5. Keep the 📣 COD Result → WhatsApp Update recipe active so customers hear the outcome either way. If you run button-first, disable the plain 📞 COD Confirm by AI Call recipe so you don't double-call.
  6. Validate, then Activate.

The COD messaging kit & wiring the recipes

Four ready-written WhatsApp templates cover the whole COD conversation. Find them at the top of the WhatsApp Templates "Choose a starter…" dropdown — pick each, review, and submit to Meta for approval.

StarterBody (variables in {{ }})
🛒 COD: Order received
order_received
"Hi {{1}}, we received your order {{2}} — total {{3}}. Our assistant will call you shortly to confirm it, and we will message the result right here."
🛒 COD: Confirm (buttons)
cod_confirm_buttons
"Hi {{1}}, we received your cash-on-delivery order {{2}} for: {{3}}. Please confirm it below so we can ship right away."
+ two quick-reply buttons: ✅ Confirm order / ❌ Cancel order
🛒 COD: Confirmed
cod_confirmed
"Hi {{1}}, your order {{2}} is confirmed. We are preparing it now and will keep you posted right here. Thank you for shopping with us!"
🛒 COD: Cancelled
cod_cancelled
"Hi {{1}}, your order {{2}} has been cancelled as you requested. Nothing will be charged. Reply here anytime if you would like to reorder."
💡 Names match the recipes on purpose The template names (order_received, cod_confirm_buttons, cod_confirmed, cod_cancelled) are exactly what the workflow recipes expect — so wiring them is just picking from a list.

Wire each template into its workflow step

TemplateGoes into…
cod_confirm_buttonsthe 🛒 COD Button-First Autopilot send step — map its blanks to Customer name / Order number / Products.
order_receivedthe 🛒 WooCommerce Order Autopilot first-touch message.
cod_confirmedthe 📣 COD Result recipe's confirmed branch.
cod_cancelledthe 📣 COD Result recipe's cancelled branch.

Remember: matching a template's blanks is done from human-labelled dropdowns, not by typing expressions — see the fill-the-blanks mapper.

⚠️ Templates must be approved first Submit all four to Meta and wait for approval before activating the workflows. Until a template is approved, its workflow step can't send it.

The Lead Order Card & COD badges

Every store lead gets a read-only Order card in its detail panel, so you can see the order and its confirmation status at a glance — no digging.

The card (subtitle "Placed in your connected store.") shows the Order number linked to your store, the Total, the Items, the Store status, and a COD confirmation badge with its reason. The badge colour tells you exactly where the order stands:

BadgeMeaning
Awaiting WhatsApp replyThe Confirm/Cancel buttons went out; waiting for the customer to tap.
AI call placedNo tap in time — the AI confirmation call is out.
ConfirmedThe customer confirmed (by tap or on the call). Order → Processing in the store.
CancelledThe customer cancelled. Order → Cancelled in the store.
Call failedThe confirmation call couldn't complete — follow up manually.
UnclearThe AI couldn't tell yes from no — review the call and decide.

Under the hood these map to the lead's cod_confirm field values (awaiting_reply, call_placed, confirmed, cancelled, call_failed, unclear), and the reason line comes from cod_confirm_reason. The card is fully localized (EN/ES/AR) and right-to-left safe.

Opening language for COD calls

COD confirmation calls work best when the agent opens in the customer's language. Set it once on your COD voice agent.

Open your COD agent under Voice Agents → the AI & voice card → Opening language. Choose the language your buyers speak — हिन्दी, বাংলা, English (India), Español, العربية, or Auto (Hindi + English). For Indian COD stores, pair it with the Sarvam (Indian-native · Hindi/Bengali) TTS provider for natural pronunciation.

💡 It still follows the caller Opening language is only the start. If the buyer answers in another language, the agent switches automatically and continues in theirs. A clear "yes/no" in any of these languages is understood, so confirmations and cancellations are read correctly.

Troubleshooting COD

SymptomFix
Orders don't become leadsCheck the plugin's CRM URL + API key (Send test lead), the key has leads:write, and the order has a billing phone (phone-less orders are skipped).
Buttons never sendThe cod_confirm_buttons template must be approved by Meta and selected on the workflow send step, and the WhatsApp channel must be connected.
A call fires even when the customer tappedMake sure only one COD recipe is active. If you run button-first, disable the plain 📞 COD Confirm by AI Call recipe.
Store status doesn't update after confirmationRe-save the plugin settings (re-registers the write-back secret). Check WooCommerce → Status → Logs (source voiceflow-crm) for the write-back result. Only confirmed and cancelled change status — unclear never does.
Outcome shows "Unclear"The call was ambiguous. Give the agent a clearer opening language; the buyer can also just tap a button on the follow-up.
Repeat customers rejected as duplicatesEnsure the plugin is 1.1.0 or newer (current: 1.3.0) — it upserts by phone so returning buyers update their existing lead.

Sell it as your own SaaS

VoiceFlow CRM AI isn't just a product you use — it's a product you can sell as your own. The reseller (agency) model turns your copy into a white-label platform: you sign up your own clients, put your logo, colours, and domain on everything, set your prices, and keep the difference. Your clients never see the word "VoiceFlow."

This section is for you if you want to:

  • Start an agency — run AI voice and messaging campaigns for a roster of clients.
  • Launch your own SaaS — put a public marketing site live, let customers self-sign-up, and bill them on a plan.

How the money works, in one breath: you pay the platform a package fee for the right to resell (with a free trial). You then charge your clients whatever you like — a markup, flat price, revenue share, or your own plan. You buy platform usage credits at your tier's wholesale rate and resell that usage at your retail price. The margin is yours.

💡 Two separate money worlds One ledger tracks what your agency owes the platform; a completely separate one tracks what your clients owe you. They're never mixed — your books stay clean and your margin obvious.
✅ No technical setup Every organization gets a free, secure web address the moment it's created (automatic HTTPS, no server work). Custom domains are a few guided clicks. You never touch a config file.

Becoming a reseller — register & run the wizard

About two minutes. You create an organization (your agency) and claim a free branded web address along the way.

Account type
At sign-up, pick the agency / reseller path to branch into the reseller setup flow.

Register as an agency

  1. Go to the Register page.
  2. Pick the card titled "I'm an agency / reseller" — "White-label the platform and sell it to your own clients under your brand." (A link ending in ?as=reseller pre-selects this automatically.)
  3. Enter your name, email, and password, then create your account.

Run the welcome wizard

On the welcome screen ("How will you use VoiceFlow?") choose My agency ("I manage campaigns for clients") or My SaaS ("I'm launching this platform for my own customers"), then Continue. This opens the four-step Reseller setup wizard: Name your agency → Add your brand → Choose a package → You're set up.

  1. On "Name your agency", fill in Agency name (or Platform name for SaaS) and optionally a Handle (a short slug like acme) that becomes part of your free address.
  2. Click Create organization — this starts your free reseller trial.
  3. Copy your free branded address (your-handle.your-domain), live immediately with automatic HTTPS, then Continue.
⚠️ "Reseller mode needs a package"? The platform administrator of this install hasn't added a reseller package yet. Ask whoever runs the install to add one from the admin plan catalog, then click Try again.

White-label branding — make it look like yours

Branding is what makes VoiceFlow disappear and your brand appear. Whatever you set is inherited by every client workspace under your agency.

The two-minute quick-set

On the wizard's "Add your brand" step (the Brand quick-set card): paste a Logo URL (https://), pick a Primary color, and Save & continue (or Skip).

The full branding editor (anytime)

Open your organization → Branding tab (the Agency branding card), organised into five sections: Brand (product name, company name, logo, favicon — upload up to 2 MB or paste a URL), Colors & typography, Login page, Emails, and Footer & support. Click Save changes; Reset to default clears every override.

💡 Branding flows downhill Your agency brand is inherited by all client workspaces. Each client can override individual fields; anything they leave unset falls back to your agency brand, then the platform default.
⚠️ A paid capability If your package doesn't include white-label, the branding controls stay visible but read-only, with an upgrade prompt.

Choosing your reseller package

Your package is your agency's own plan with the platform — the wholesale deal that sets your limits and perks: how many clients you can take on, how many website templates you get, custom domains, whether clients can bring their own keys, and your wholesale credit rate.

Pick one on the wizard's "Choose a package" step (typically Starter, Growth, Unlimited) — click Select package, or I'll choose later. Change it anytime from your organization → Billing → the Your package card (your active one is marked Current, with Upgrade on the others).

What the tiers control

  • Client limit — the maximum number of client workspaces you can run.
  • Website templates — how many marketing-site designs you can use (basic = 2, pro = 4, all = 5). The top tier also unlocks Custom CSS.
  • Custom domains — whether you can attach your own domains.
  • Client keys — whether your clients may bring their own provider keys.
  • Wholesale credit rate — your buy price for platform usage credits.
💡 Free trial Your trial starts the moment you pick a package. Explore everything, then upgrade or change plans anytime from Billing.

Building & publishing your reseller website

A public marketing site where customers learn about your service and sign themselves up — branded entirely as you.

  1. Pick a template — from your organization's website editor, choose one of the marketing-site designs your tier unlocks.
  2. Edit the sections — hero, features, stats, testimonials, FAQ, pricing, and call-to-action are all copy-level cards with a live preview.
  3. Publish and view it live — the site goes live at your branded address; use View site to preview.
💡 Self-serve signup With a public site and at least one purchasable plan, customers can sign up and pay you without you touching anything — a true SaaS.

Connecting a custom domain

Your free your-handle.your-domain address works from day one. When you're ready for your own domain (e.g. app.youragency.com), it's a few guided clicks.

  1. In your organization's domain settings, add your custom domain.
  2. Create the DNS record it shows you at your domain registrar (a CNAME pointing at the platform).
  3. The platform verifies the record and issues an HTTPS certificate automatically — no server work.
💡 Availability depends on your tier Custom domains are unlocked by higher reseller packages. If you don't see the option, upgrade your package.

Bringing on clients

Each client is a workspace under your agency. You can provision it, invite the client in, and apply a template so they start ready to go.

  1. Provision a client workspace — from your organization, create a new client workspace (name it for the client). It inherits your agency branding.
  2. Invite the client in — send an invitation to their email; they set a password and land in their branded workspace.
  3. Apply a template — optionally seed the workspace with starter agents, sequences, and settings so the client isn't staring at a blank slate.
💡 Clients only see their own world A client can't see other clients, your wholesale costs, or the platform. They see your brand, their leads, and their bill from you.

Pricing and billing your clients

You decide what each client pays and how. The platform keeps your agency-to-client billing separate from your agency's own bill.

Set the resale arrangement

For each client you can charge a flat monthly price, a markup on usage, a revenue share, or assign one of your own plans. Configure it from the client's billing settings inside your organization.

Send a payment link and issue invoices

Send the client a payment link (through your connected gateway) and issue branded invoices — they carry your company name and support details, never the platform's.

💡 Your gateway, your money Client payments flow to your own payment gateway. The platform never sits between you and your customer's money.

The credit wallet — buy wholesale, resell at your price

Usage (like call minutes) is metered in credits. You buy credits from the platform at your tier's wholesale rate and resell that usage to clients at whatever retail price you set.

Buy platform credits (wholesale)

From your organization's Billing / credits area, top up your agency's credit balance at your wholesale rate. This is the pool your clients draw from when they run on your platform keys.

Resell usage to your clients (retail)

Set your own Credits per minute retail rate for clients (via the plans you assign them). When a client places a call on your keys, their usage is metered at your retail rate — the difference between that and your wholesale cost is your margin.

💡 Clients need zero provider accounts Because they run on your platform keys and credits, your clients never touch Twilio or OpenAI. They just use the product and pay you — exactly the SaaS experience you're selling.

Reports and supporting your clients

See what you're earning and help your clients — all from your organization view.

See what you're earning

Your organization shows subscription income plus credit-pack sales, and your usage against your package limits. The platform owner's Admin → Revenue tab rolls up per-reseller revenue too.

Support your clients

Because everything is white-labelled, your clients contact you. Set your own Support URL and Support email in branding so every screen and email points to your help channel. You can open any client workspace to see what they see and help them directly.

✅ You are the platform, to them From signup to invoice to support, your clients experience your brand end to end. VoiceFlow is your quiet engine room.

REST API

Everything in the product is backed by a clean REST API, so you can push leads in, read results out, and drive your own automations. This is a quick orientation; the full endpoint reference is in docs/04_API.md.

Base URL & format

The API is served under the /api/v1 prefix on your instance — JSON in, JSON out. Example: https://your-app.com/api/v1/leads. Check the version at GET /api/v1/version (returns { "version": "1.5.0", "channel": … }).

Authentication (session token)

Sign in once to get a session token, then send it as a Bearer token on every request. (For machine-to-machine integrations that only touch leads/calls, prefer a scoped API key — see External API & keys.)

# 1) Get a token
curl -X POST https://your-app.com/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{ "email": "you@example.com", "password": "••••••" }'
# → { "data": { "token": "vf_…", "expiresAt": "2026-…" } }

# 2) Send it on every request
curl https://your-app.com/api/v1/leads \
  -H "Authorization: Bearer vf_…"
💡 Same permissions as the app Requests run in the context of your active workspace and your role (Owner / Admin / Agent / Viewer) — the API respects exactly the same permissions as the UI.

Common resources

  • GET / POST /leads — list and create leads (bulk import at /leads/import).
  • POST /campaigns — launch an AI qualification campaign.
  • GET /calls, GET /calls/:id — call attempts plus each call's transcript, summary, qualification, and score.
  • GET /dashboard — the workspace metrics behind the dashboard.
  • /settings/* — branding, providers, messaging, and webhook endpoints.
curl -X POST https://your-app.com/api/v1/leads \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Priya", "phone": "+91...", "customFields": [] }'

External API & API keys

The external API is the scoped, key-authenticated surface built for integrations like the WooCommerce plugin or your own systems. It's stable, rate-limited, and workspace-bound.

API keys

Create keys in Settings → Developers. Give the key a name, pick an environment, and select scopes; the secret (vf_<env>_…) is shown once. Keys are hashed at rest, bound to the workspace that issued them, and revocable. Scopes use a <resource>:<action> grammar and are exact-match — leads:read does not imply leads:write. Available scopes: leads:read, leads:write, calls:read, voice-agents:read, webhooks:read, webhooks:write.

Endpoints

All under /api/v1/external/*, authenticated with Authorization: Bearer vf_…. Every route enforces its scope, a per-key rate limit, and the API-access entitlement.

Method & pathPurposeScope
GET /externalDiscovery index — version, resources, scope catalogany valid key
GET /external/leadsList leads (paginated)leads:read
GET /external/leads/:idFetch one leadleads:read
POST /external/leadsCreate a lead (with opt-in upsert)leads:write
PATCH /external/leads/:idUpdate a leadleads:write
POST /external/store-connectionRegister the store order write-back secret (WooCommerce)leads:write
GET /external/callsList call records (paginated)calls:read
GET /external/calls/:idFetch one call recordcalls:read
GET /external/voice-agentsList voice agents (paginated)voice-agents:read
GET /external/voice-agents/:idFetch one voice agentvoice-agents:read

Upsert by phone

POST /external/leads accepts an optional "upsert": true. With it, a lead whose phone already exists is updated (and the lead.captured trigger fires for both new and returning leads) — this is how repeat store customers are handled without duplicate errors. Without it, a duplicate phone returns a conflict.

curl -X POST https://your-app.com/api/v1/external/leads \
  -H "Authorization: Bearer vf_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Ekata", "phone": "+91...", "upsert": true,
        "customFields": { "order_number": "#1042", "order_total": "250.00 USD" } }'

Webhooks

Subscribe to events to drive your own automations from outside the product.

Webhooks
Register endpoints under Settings → Developers → Webhooks and subscribe them to events.

Add an endpoint under Settings → Webhooks (or POST /api/v1/settings/webhook-endpoints) and VoiceFlow POSTs a JSON payload to your URL whenever a subscribed event fires — for example a lead being created or a call being qualified.

⚠️ Verify the signature Every delivery is HMAC-signed with the endpoint's signing secret (shown once when you create it). Verify that signature on your side before trusting a payload, so you know the call genuinely came from your instance.
💡 Prefer no code? The visual Workflows engine can send messages, enroll sequences, set fields, and call webhooks on the same events — no API integration required.

Workflow expression language

Conditions, action arguments, and template parameters in Workflows are written in a small, safe expression language. Most users never see it — the fill-the-blanks mapper writes it for you — but here's the full reference for power users.

✅ Safe by design There is no eval and no host access — a hand-written parser + interpreter evaluate expressions with prototype-pollution guards and strict length/token/depth limits. Missing paths return undefined rather than erroring, so optional fields degrade gracefully.

Accessing data

The event that triggered the workflow is available as event (e.g. event.payload.name, event.payload.customFields.order_number). Run variables set earlier are available by name and under vars. Path access supports dot properties and [index].

event.payload.name
event.payload.customFields.order_number
vars.retrievedAnswer

Operators

Precedence low → high: ||, &&, equality (== != === !==), comparison (< <= > >=), additive (+ -), multiplicative (* / %), unary (!, -). &&/|| short-circuit; + concatenates if either side is a string, else adds.

Values & array literals

Numbers, quoted strings (with \n \t \\ \' \" escapes), true/false/null, and array literals [a, b, c]. Array literals are how a WhatsApp template's ordered parameters are written — e.g. the button-first recipe's [event.payload.name, event.payload.customFields.order_number, event.payload.customFields.order_items].

Functions

Only these are callable: now(), lower(s), upper(s), len(x) (string/array length or object key count), and default(a, b) (returns b when a is null/undefined).

String interpolation

In message bodies and other string fields, ${ … } substitutes an expression's value; null/undefined become empty, objects/arrays become compact JSON. Escape a literal with \${.

Hi ${event.payload.name}, your order ${default(event.payload.customFields.order_number, "your order")} is confirmed.

Entitlements reference

Entitlements are the build-defined switches and limits that gate premium features. Owners set their values through plans and feature packs; the code enforces them server-side.

How the layer cake works

  • Entitlement keys are defined in the build — booleans (a feature on/off) or numbers (a cap). You can't create or rename them, only set their values.
  • Feature packs bundle a set of entitlement values you can reuse across plans.
  • Plans grant entitlement values directly and via attached packs. A workspace's effective entitlements are the merge of its plan + packs.

Browse every key, its type, default, and which plans/packs grant it under Admin → Entitlements. Representative keys include messaging.inbox, messaging.whatsapp_templates, ai.voice_profiles, ai.agents, ai.knowledge_base, automation.workflows, integrations.connectors, integrations.events, calls.recording, agency.mode, whitelabel.branding, whitelabel.custom_domain, and the platform-keys/credits and public-API entitlements.

💡 The owner is never blocked System admins bypass entitlement gates entirely. For customers, a locked feature shows an upgrade prompt instead of the feature.

Architecture overview

A high-level map of how the pieces fit together. All of it runs inside your Docker stack.

🌐 Caddy proxy (HTTPS) web (Next.js) api (NestJS) worker (jobs) 🐘 PostgreSQL ⚡ Redis / queues ☁️ ProvidersTwilio · OpenAI · Meta…
  • Caddy terminates HTTPS and routes to the web and api services.
  • web (Next.js) serves the UI and proxies API calls; api (NestJS) is the REST backend.
  • worker processes background jobs from Redis-backed BullMQ queues: placing calls, running AI results, sending sequences, firing workflows, and scanning abandoned carts.
  • PostgreSQL (with pgvector) stores all data and embeddings; Redis holds sessions, cache, and the queues.
  • Providers are external services you connect with your own keys; calls to them are the only time data leaves your server.
📋 Deeper architecture docs Module maps, data model, and design decisions are in the in-repo docs/01_ARCHITECTURE.md, docs/02_MODULE_MAP.md, and docs/03_DATABASE.md.

Installation (deep dive)

The product ships as a single Docker Compose stack. The one-command installer is the easy path; this page also documents the manual path and what every service does, so you can run it confidently on any Docker host.

What runs in the stack

ServiceWhat it is
proxyCaddy 2 reverse proxy with automatic HTTPS (via SITE_ADDRESS / ACME_EMAIL).
webThe Next.js front-end (port 3000).
apiThe NestJS REST API (port 4000).
workerBackground jobs: calls, AI results, sequences, workflows, scans.
migrateOne-shot: applies database migrations, optionally seeds demo data, bootstraps the admin — then exits.
postgresPostgreSQL 16 with pgvector (leads, calls, recordings-metadata, billing, embeddings).
redisSessions, cache, and the BullMQ job queues.
backup optionalA scheduled pg_dump sidecar (enabled with the backup compose profile).

Data lives in named Docker volumes: pgdata, redisdata, recordings, uploads, backups, and Caddy's cert store.

Path A — the one-command installer (recommended)

  1. Copy the product files to your server and open a terminal there.
  2. Run
    ./install.sh
    It checks Docker + Compose v2, asks for your public address and admin login (and whether to load demo data), auto-generates secrets (encryption key, database password), writes a complete .env from .env.example (backing up any existing one to .env.bak), builds the images, and runs docker compose up -d --build.
  3. The migrate step applies migrations, optionally seeds demo data, and bootstraps the admin. When health checks pass, the installer prints your login URL.
💡 Unattended installs Pass --yes and set VF_HOST, VF_ACME_EMAIL, VF_ADMIN_EMAIL, VF_ADMIN_PASSWORD, and VF_SEED_DEMO as environment variables for a fully non-interactive install. On Windows, run inside WSL2.

Path B — by hand

  1. Copy the example environment file:
    cp .env.example .env
  2. Edit .env and set at least the required keys (see Environment reference): DATABASE_URL, REDIS_URL, APP_ENCRYPTION_KEY, PUBLIC_BASE_URL, and your Postgres credentials.
  3. Bring the stack up:
    docker compose up -d --build
    Migrations run automatically via the migrate service.
  4. Open your address and sign in. If you didn't set a bootstrap admin, the first account you register becomes the system admin.
Your address loads the sign-in page, and GET /api/v1/version returns { "version": "1.5.0" }.
📋 The full manual reference Step-by-step deployment, reverse-proxy notes, and production hardening live in the in-repo docs/15_DEPLOYMENT.md.

Environment reference

Configuration lives in a single .env file in your install folder. The installer writes it for you; this is what the most important keys do. The complete list, with placeholders, is in .env.example and docs/17_ENV_REFERENCE.md.

⚠️ Never share your .env It holds your secrets. Keep APP_ENCRYPTION_KEY stable — it decrypts every provider secret you've saved; changing it makes stored credentials unreadable.

Core (required)

VariablePurpose
DATABASE_URLPostgreSQL connection string. Boot fails without it.
REDIS_URLRedis for sessions, cache, and BullMQ job queues.
APP_ENCRYPTION_KEY256-bit master key for AES-256-GCM encryption of all provider secrets. Keep it stable.
PUBLIC_BASE_URLThe public, internet-reachable origin. Required for live voice (Twilio callbacks + the media WebSocket).
APP_ORIGINThe allowed browser origin for CORS (your web app's URL).

First-run & proxy

VariablePurpose
BOOTSTRAP_ADMIN_EMAIL / BOOTSTRAP_ADMIN_PASSWORDFirst-boot system admin. Optional — if unset, the first registered account becomes admin.
SITE_ADDRESS / ACME_EMAILCaddy proxy hostname + email for automatic TLS certificates.
API_BASE_URLThe upstream API URL the web BFF proxies to (in Compose: http://api:4000).
NEXT_PUBLIC_API_MODElive (proxy to the real API) or mock (in-memory fixtures for demos). Docker builds use live.
POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DBPostgres service and backup credentials. Use a strong password in production.

Optional integrations

SMTP (SMTP_*) — usually set from Admin → Platform keys instead. Provider seed keys (OPENAI_API_KEY, DEEPGRAM_API_KEY, TWILIO_ACCOUNT_SID/TWILIO_AUTH_TOKEN, …) — usually entered in the app instead. UPDATE_MANIFEST_URL and SELF_UPDATE_ENABLED — enable one-click updates. GITHUB_UPDATE_TOKEN — read-only PAT for private-repo updates. LOG_LEVEL, NODE_ENV, PORT.

💡 Set keys in the app, not .env You almost never need to put provider keys in .env. Enter them in Settings → Providers or Admin → Platform keys, where they're encrypted, validated, and swappable without a restart.

Updating your instance

You never lose data on an update, and the database is always backed up first. There are three ways to update, and the admin sees a banner when a newer version exists (Admin → Updates).

Option A — from CodeCanyon (default)

  1. Download the new version from your CodeCanyon Downloads page.
  2. Extract it over your install folder (replacing the source).
  3. Run
    ./update.sh
    It checks Docker and .env, writes a database backup into ./backups/, runs docker compose up -d --build (migrations apply automatically), waits for health, and prints the running version. It never touches .env, your secrets, or uploaded data.

Option B — one-click from the admin console

If you set an update source (UPDATE_MANIFEST_URL, and SELF_UPDATE_ENABLED=true), Admin → Updates shows an "update available" banner and an Update now button that backs up the database, installs the new version, and restarts with live progress. Nothing is ever applied automatically — you always click.

Option C — fully hands-off (private GitHub repo)

If you keep your source in a private GitHub repo, set a read-only GITHUB_UPDATE_TOKEN and point the update manifest at your release tarball. Then Update now downloads and applies the new version automatically. Full details in docs/28_UPDATING.md.

✅ Rollback is always possible Every update writes a database backup to ./backups/ first. If an update misbehaves, restore that dump — see Backup & restore.

Backup & restore

All your data lives in PostgreSQL and a few Docker volumes on your own server. Backing up is a database dump plus (optionally) the media volumes.

What to back up

  • The database — leads, calls, transcripts, billing, settings, everything. This is the essential one.
  • Media volumesrecordings (call audio) and uploads (logos, attachments), if you want playback and files preserved.
  • Your .env — keep a safe copy; it holds APP_ENCRYPTION_KEY, without which saved secrets can't be decrypted.

Take a database backup

docker compose exec postgres pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" > backup-$(date +%F).sql

Or enable the built-in backup sidecar (the backup compose profile) for scheduled dumps into the backups volume. Every ./update.sh and one-click update also writes a pre-update dump into ./backups/ automatically.

Restore

cat backup-2026-07-24.sql | docker compose exec -T postgres psql -U "$POSTGRES_USER" "$POSTGRES_DB"
📋 Full procedures Detailed backup schedules, volume snapshots, and disaster-recovery steps are in docs/16_BACKUP_AND_RESTORE.md.

Troubleshooting matrix

The most common "why isn't this working?" situations and their fixes. For everyday feature questions, see the FAQ.

SymptomLikely cause & fix
A page says "offline" or a provider won't validateA credential is missing or wrong. Re-enter the key in Settings → Providers (or Admin → Platform keys) and press Validate.
Calls aren't being placedCheck: (1) a telephony provider is connected and validated, (2) an AI provider is connected, (3) the campaign is started (not paused) and its leads aren't opted out. Also confirm PUBLIC_BASE_URL is publicly reachable.
WhatsApp sends but replies never arriveTwo switches: the instance webhook (Admin → Platform keys → WhatsApp → Webhook, pasted into Meta → WhatsApp → Configuration, subscribe to messages), and your number's subscription (open the WhatsApp credential and click Validate to re-subscribe). Note: localhost can't receive webhooks — you need a public domain.
Password-reset / invite emails never arriveSMTP isn't configured. Set it in Admin → Platform keys → Email (SMTP) and click Send test email.
A feature isn't in the sidebarSwitch to Pro mode (advanced items are hidden in simple mode). Premium features may need a plan entitlement.
I changed a file and the dev server brokeProduction Docker builds are unaffected. In local dev, Next may corrupt .next caches on edits — rm -rf .next and restart.
Where are the server logs?docker compose logs -f api (or web / worker). Each call also carries its own transcript, summary, and score on its detail page.
📋 Deeper checklist A longer troubleshooting reference lives in docs/18_TROUBLESHOOTING.md.

Security & data

Everything runs on your own server and database. Here's how your data is protected and where it lives.

  • Self-hosted: leads, recordings, transcripts, and billing all live in your PostgreSQL database on your infrastructure.
  • Secrets are sealed: provider keys are stored encrypted (AES-256-GCM via APP_ENCRYPTION_KEY) and never shown back in plain text — the UI only ever displays a masked value.
  • Roles & access: the system admin/owner has full control; team members and agency clients only see what their role (Owner / Admin / Agent / Viewer) and plan allow. The REST API respects the same roles.
  • Signed webhooks: every outbound webhook is HMAC-signed; inbound provider webhooks (Twilio, Meta X-Hub-Signature-256, Telegram secret token) are signature-verified before any state change.
  • Backups: take regular database backups (one is made automatically before every update). See Backup & restore.
  • Legal pages built in: your instance ships white-label /privacy and /terms pages that carry your product and company name — ready for Meta, Twilio, or any provider that asks. Review and adapt them to your jurisdiction.
  • Data only leaves when you connect a provider: a third party sees your data only when you connect it (your AI or telephony vendor) to perform a task you asked for.

Requirements

Everything you need to run VoiceFlow CRM AI, in one place.

Server

  • A Linux server (cloud VPS is ideal) with Docker Engine 24+ and the Docker Compose v2 plugin.
  • 2 vCPU / 4 GB RAM minimum; 4 vCPU / 8 GB comfortable. ~10 GB disk to start (call recordings grow over time).
  • Outbound internet access to your chosen providers. A public domain + DNS for HTTPS and inbound webhooks (optional for local testing).
  • Windows users: run inside WSL2.

Nothing else to install

PostgreSQL, Redis, the reverse proxy, and the app all run inside the Docker stack. You do not install Node, a database, or a web server on the host yourself.

Provider accounts (only for the features you use)

FeatureProvider options
Phone callsTwilio
AI (summaries, qualification)OpenAI or Google Gemini
Speech-to-TextDeepgram or OpenAI
Text-to-SpeechSarvam, ElevenLabs, or OpenAI
WhatsAppMeta Cloud API or Twilio WhatsApp
TelegramA BotFather bot token
EmailAny SMTP provider (Brevo, Gmail, Amazon SES, …)
Payments (to charge customers)Stripe, Razorpay, or PayPal
💡 Start with less You only need telephony + AI + STT + TTS for your first AI call. Add messaging and payments when you're ready.

Changelog

Highlights by version. The current release is v1.5.0 (verify at GET /api/v1/version). The full engineering changelog is in the in-repo CHANGELOG.md.

Platform

VersionHighlights
1.5.0WhatsApp-class inbox: link-preview cards, file attachments (WhatsApp + Telegram), a dependency-free emoji picker, voice notes, and both composers at parity.
1.4.0Pre-release hardening: security headers, rate limiting, webhook signature enforcement, KPI polish, and a buyer-facing docs pass.
1.3.xCall recording with a secure in-app player; ready-made starter voice agents; owner-bypass everywhere; conversation intelligence on live calls.
1.2.xFull WhatsApp suite: rich template builder (media, carousel, buttons, live preview) + a two-way team inbox with assignment, notes, labels, and AI-suggested replies.
1.0–1.1Core CRM, AI voice calling & qualification, campaigns, sequences, workflows, conversation studio, pipelines, forms & landing pages, multi-tenant billing, and the reseller model.

Recent feature additions in the current line include the WooCommerce Store Autopilot (button-first COD confirmation, order write-back), the template variable "fill-the-blanks" mapper, voice persona-card galleries with live previews, per-agent opening language, human-readable workflow node labels, and full EN / ES / AR + RTL localization.

WooCommerce plugin

VersionChanges
1.3.0Button-first COD confirmation support; richer order_items (multibyte-safe); works with the Studio's button-first recipe and lead.get_field.
1.2.0Automatic COD order write-back: after the AI confirmation call, orders move themselves (confirmed → Processing, cancelled → Cancelled). Per-store secret auto-registered on Save.
1.1.0Repeat customers sync correctly — an order from a known phone updates that lead instead of being rejected as a duplicate.
1.0.0Initial release: order → lead sync, abandoned-checkout recovery scan, settings page with a test button, HPOS-compatible.

Credits & licenses

VoiceFlow CRM AI is built on excellent open-source software. This page credits the major components and explains your CodeCanyon license.

Your license

Your purchase is governed by the Envato / CodeCanyon license you bought:

  • Regular License — use in a single end product that end users are not charged for. Suitable for running the CRM for your own business.
  • Extended License — use in a single end product that end users can be charged for. Required if you resell access as a SaaS or agency (the reseller model).

The official terms are on your CodeCanyon download page. In the app, Admin → License lets you activate a commercial edition key; with no key, the platform runs the free community edition.

Major open-source components

ComponentRoleLicense
Next.js & ReactWeb front-endMIT
NestJSAPI & worker frameworkMIT
PostgreSQL + pgvectorDatabase & embeddingsPostgreSQL License / OSI
RedisCache, sessions, job queueBSD / RSAL
BullMQBackground job processingMIT
CaddyReverse proxy & automatic HTTPSApache-2.0
PrismaDatabase toolkitApache-2.0
React FlowWorkflow & conversation canvasesMIT
Tailwind CSSStyling systemMIT
Docker & Docker ComposePackaging & orchestrationApache-2.0
💡 Third-party services Twilio, OpenAI, Google Gemini, Deepgram, Sarvam, ElevenLabs, Meta WhatsApp, Telegram, Stripe, Razorpay, and PayPal are optional external services you connect with your own accounts — each under its own terms.

Support policy

How to get help, what's covered, and where to look first.

Before you reach out

  1. Search this documentation (press /) — most questions are answered here.
  2. Check the Troubleshooting matrix and the FAQ.
  3. Confirm your providers show a green Verified badge under Settings → Providers.
  4. Check server logs: docker compose logs -f api.

What support covers

  • Help getting the item installed and running as documented.
  • Answering questions about the item's built-in features and how to use them.
  • Fixing confirmed bugs in the item.

What it doesn't cover

  • Customization, new features, or third-party integrations beyond what ships.
  • Problems caused by your provider accounts (billing, suspended keys, Meta template rejections) — those are handled in each provider's own dashboard.
  • Server administration unrelated to the item.
💡 White-label support If you resell the product, your clients contact you, and you set your own Support URL and Support email in branding — they never see the original author.

FAQ & troubleshooting

Do I have to use every feature?

No. The product works with just the pieces you turn on. Connect an AI + telephony provider for calls; add a WhatsApp number for the inbox; leave the rest for later. Unconfigured features stay quiet — they never error.

Is my data private?

Yes — everything runs on your own server and database. Data only reaches a third party when you connect that provider to perform a task you asked for.

Can I brand it as my own?

Fully. Product name, company name, logo, favicon, colors, fonts, login page, emails, and the public marketing site are all editable. See Branding.

Can my customers use it without their own API keys?

Yes — configure Platform keys and sell credits. Customers call and message on your keys; usage is metered against a balance you top up. See Your keys vs platform keys.

Does it support languages other than English?

The interface is available in English, Spanish, and Arabic (Arabic with full right-to-left). AI voice calls handle many spoken languages, with native-quality Hindi and Bengali via Sarvam. See Voice Platform and Voice Agents.

WhatsApp replies aren't showing up in the Inbox

Two switches must be on: the instance webhook (Admin → Platform keys → WhatsApp → Webhook, pasted into Meta → WhatsApp → Configuration, subscribed to messages), and your number's subscription (open the WhatsApp credential → Validate). Note that localhost can't receive webhooks — you need a public domain.

Where are my logs?

Every call has a transcript, summary, qualification, and score on its detail page. For server logs, docker compose logs -f api. More in Troubleshooting.