Callforge
Founder tier · first 50
The voice-agent boilerplate I wish I'd had three clients ago.
Twilio for calls, Vapi for the assistant, Stripe metering per tenant, Firebase for isolation. Every failure mode from three prod deployments, already solved in the box. No browser-mic demo. Actively maintained by one person who answers builder emails.
How it fits together
inbound consumer call
│
▼
┌─────────────────┐ ┌──────────────────┐
│ Twilio number │ ◄──── │ /provision API │
│ per tenant │ │ (one call → │
└────────┬────────┘ │ number+assistant│
│ SIP │ +webhook bind) │
▼ └──────────────────┘
┌─────────────────┐
│ Vapi assistant │ ┌──────────────────┐
│ (voice + LLM, │ ────► │ Firebase auth │
│ swappable) │ │ tenant isolation│
└────────┬────────┘ └──────────────────┘
│
on-call events + duration
│
▼
┌─────────────────┐ ┌──────────────────┐
│ tenant router │ ────► │ Stripe metered │
│ + SMS handoff │ │ per-minute billing│
└─────────────────┘ └──────────────────┘
Built for three clients — here's what actually broke
Callforge is what I built after shipping three of these by hand. Every one of these cost a weekend.
Plumber pilot — the SMS nobody got
Vapi picked up cleanly. Assistant qualified the caller. SMS handoff to the trade landed in iOS "Unknown Senders" and was never read. Fix: vCard-driven contact-first UX + explicit "save the contact" step in onboarding. Two weeks of "the AI works but nobody's calling me back."
Electrician pilot — the silent provisioning failure
Twilio number purchase returned success in the SDK, but the number was never bound because of a subaccount limit I didn't know existed. First real customer got a dead-number recording. Fix: post-provision verification call + explicit subaccount-limit precheck in the boilerplate.
Carpenter pilot — the double-charge on webhook retry
Stripe webhook retried after a 5xx from our metering endpoint. Bill went out for double minutes. Client threatened refund. Fix: idempotency keys at the metering layer keyed on call_sid + segment_id, not the webhook event id.
What's inside
-
☎️
Real telephony + auto-provisioning
One API call: buy Twilio number, clone Vapi assistant, bind webhooks, register with tenant router.
POST /api/tenants/provision
{
"businessName": "Acme Plumbing",
"country": "US",
"voice": "eleven_labs:rachel"
}
// → { number, assistantId, webhookUrl, tenantId }
-
📊
Per-minute usage billing (idempotent)
Stripe metered billing keyed on call_sid + segment_id. No double-charges on webhook retry.
-
🗣️
Voice + LLM swappable per tenant
ElevenLabs / OpenAI Realtime / Deepgram — bind per tenant, not one shared agent.
-
✅
Production posture, not tutorial
Integration test suite, CI, deploy scripts, observability hooks. Not "educational only" in the README.
-
🛡️
Compliance patterns baked in
US A2P 10DLC registration flow, GDPR consent capture, opt-out handling. Patterns from the regions I've actually shipped in.
Founder tier · first 50 buyers
$329$199
One-time. Ongoing updates during the founder period. Answered by me.
Who's building this? An indie dev who shipped three voice agents the hard way before packaging what was left. If you've wired Twilio → Vapi → per-tenant Stripe metering by hand, you already know why this exists. If you haven't, the "what broke" section above is a preview.