Skip to content

Plans & Billing ​

Voicex uses a plan-based access control system. Each organization is linked to a plan that determines model access, agent limits, and feature availability.


Plan Tiers ​

FreeStarterProEnterprise
Monthly Price$0$29$99$499
Annual Price$0$290$990$4,990
Max Agents1525999
Concurrent Calls21050500
Max Call Duration5 min30 min60 min120 min
Monthly Minutes601,00010,000100,000
Custom ProvidersNo15100

Model Access by Plan ​

LLM Models ​

ModelFreeStarterProEnterprise
ollama/llama3.2:3bYesYesYesYes
groq/llama-3.3-70b-versatile—YesYesYes
groq/llama-3.1-8b-instant—YesYesYes
openai/gpt-4o-mini——YesYes
openai/gpt-4o——YesYes

TTS Models ​

ModelFreeStarterProEnterprise
edge/en-US-AriaNeuralYesYesYesYes
edge/en-US-GuyNeuralYesYesYesYes
elevenlabs/21m00Tcm4TlvDq8ikWAM (Rachel)—YesYesYes
openai/alloy——YesYes
openai/nova——YesYes

STT Models ​

ModelFreeStarterProEnterprise
deepgram/nova-2YesYesYesYes

How Plan Access Works ​

Model Access Check ​

Every time an agent is created or updated with a global provider's model, the system checks:

planModelSet = plan.modelSets[category]   // e.g., plan.modelSets.llm
modelKey = `${providerKey}/${modelId}`    // e.g., "groq/llama-3.3-70b-versatile"
allowed = planModelSet.has(modelKey)       // O(1) Set lookup

Client provider models bypass this check entirely. If an org has their own OpenAI provider, they can use any model through it regardless of plan.

Plan Caching ​

Plans are cached in a 2-level cache for performance:

Request → L1 (in-memory Map, 1 min TTL)
  └── MISS → L2 (Redis, 10 min TTL)
              └── MISS → MongoDB

The cached plan includes pre-computed modelSets (JavaScript Set objects) for O(1) lookup:

typescript
interface CachedPlan extends Plan {
  modelSets: {
    llm: Set<string>;    // O(1) .has() check
    tts: Set<string>;
    stt: Set<string>;
  };
}

Cache invalidation: call invalidatePlanCache(planId) after updating a plan.


Agent Status & Plan Enforcement ​

When a user's plan changes (e.g., downgrade from Pro to Free), agents using models above the new plan are automatically paused — not deleted.

Status Computation ​

What Happens on Downgrade ​

  1. User downgrades from pro to free
  2. Agent using groq/llama-3.3-70b-versatile (requires starter+)
  3. Next API call to GET /agents computes status: 'paused_plan'
  4. Agent appears in playground but is disabled (non-selectable)
  5. Agent detail page shows warning: "Model llama-3.3-70b-versatile requires Starter plan"
  6. User can edit the agent to use ollama/llama3.2:3b (free tier) → agent becomes active again
  7. Voice sessions check this at connection time and reject paused agents

Plan Features ​

The features field controls capability flags:

typescript
interface PlanFeatures {
  customProviders: boolean;      // Can client add their own providers?
  maxCustomProviders: number;    // How many client providers allowed?
}
FeatureFreeStarterProEnterprise
customProvidersfalsetruetruetrue
maxCustomProviders015100

Frontend behavior:

  • Free users see "Upgrade to use custom providers" on the providers page
  • Starter users see the providers page but can only add 1 provider
  • The "Add Provider" button is disabled when at limit

Custom Plans ​

Plans can be custom: true for specific clients (sales deals):

javascript
{
  slug: "acme-enterprise",
  name: "Acme Enterprise",
  custom: true,
  public: false,          // not shown on pricing page
  models: { /* ... */ },
  limits: { /* ... */ },
  features: { customProviders: true, maxCustomProviders: 50 }
}

Custom plans:

  • Are created directly in MongoDB or via admin API
  • Are not shown on the public pricing page (public: false)
  • Can have any combination of models and limits
  • Are linked to orgs the same way as standard plans

Public Plans API ​

For the landing page pricing section:

bash
GET /api/plans

Returns all plans where public: true and custom: false, sorted by price. No authentication required.


Provider Costs ​

STT (Speech-to-Text) ​

ProviderCostFree Tier
Deepgram$0.0058/min$200 credit (~34K min)

LLM (Language Model) ​

ProviderCostFree Tier
OllamaFree (self-hosted)Unlimited
Groq~$0.05-0.08/M tokensFree tier available
OpenAI~$0.15-0.60/M tokens—

TTS (Text-to-Speech) ​

ProviderCostFree TierProduction?
ElevenLabs~$0.30/1K chars10K chars/monthYes
OpenAI$15/1M chars—Yes
Edge TTSFreeUnlimitedNo (dev only)

Cost Estimate (1,000 minutes/month, Starter plan) ​

ServiceCost
Deepgram STT$5.80
Groq LLM~$0.50
ElevenLabs TTS~$15-30
Total~$21-36

Built with Deepgram, Groq, and ElevenLabs.