Why we switched our pricing after a $430 invoice.
Here's the story of how we found a hole in our own billing system, what it cost us, and the pricing refresh we shipped yesterday.
Short version: our customer-side billing was perfect. Our vendor-side COGS tracking didn't exist. The gap caught up with us.
The invoice that didn't match reality.
Our TTS provider is Cartesia. They charge per character spoken. A typical AI-receptionist call makes the bot speak for maybe 30 seconds of a 2-minute call — around 450 characters, or about 3 cents of Cartesia cost.
Across the last 60 days of customer-call activity, we metered 56,625 characters of production TTS. At Cartesia's list rate of $0.065 per 1,000 characters, that's roughly $3.68 in vendor cost.
The Cartesia invoice for the same period was $430.
If a 56,625-character meter can't explain a $430 bill, something unmetered is being spoken. The question becomes: by whom.
The gap, and what caused it.
Four leaks, in rough order of blame:
- A public demo endpoint without a counter. Our homepage has a "Talk to the AI" widget. It calls Cartesia directly. There was a rate limit (40 requests per 5 minutes per IP) and a 400-character ceiling per request, but zero attribution to a tenant and zero daily cap. Any curious visitor hitting replay a few hundred times was costing us real money. Any scripted abuser was costing more.
- Our internal COGS constant was wrong by 2×. The engine's cost estimator used
PRICE_PER_1K_TTS_CHARS = $0.03when the real Cartesia rate is$0.065. So even for traffic we did meter, our math understated what we paid by 55%. - Zombie-call tail. In July we hit a $4.2k Cartesia invoice when a batch of SIP scanners found our public port and triggered calls that kept streaming TTS to dead RTP sockets. We closed the leak that week. But invoices from that era kept settling, and a few more small leaks were still open until October.
- Dev traffic on the production key. One Cartesia API key for everything — our own test calls, Playwright E2E runs, outbound campaign dials, the homepage demo, real customers. No way to look at a Cartesia dashboard and separate "us testing" from "customers."
What all four have in common: our billing system tracked what customers owe us, not what we owe vendors. A one-sided ledger. The first time we ever see what Cartesia will charge us is on the invoice itself.
What we shipped yesterday.
Five changes, applied in a single evening:
- Public demo endpoint now records every call to a
demo_tts_usagetable and enforces two daily ceilings — a global one (100K chars/day) and a per-visitor one (10K chars/day). - Separate Cartesia API key for the public demo so homepage traffic can't drain the production customer key.
- Internal cost constants corrected to real vendor rates. STT, LLM, TTS, S3 — all audited.
- A nightly cron (
vendor_spend_estimate.py) rolls up today's usage × real vendor rates, writes it tovendor_cost_daily, and emails an alert if any single vendor crosses $20/day. First line of defense against the next leak. - 60-day backfill of the new ledger confirmed the baseline: our actual customer-call COGS over 60 days was $2.88 total. The $430 Cartesia bill is almost entirely legacy traffic and the demo endpoint, not real customers.
And the pricing refresh.
Once we knew what things actually cost, we redid the margin math on every tier. Two of the plans were bleeding at full utilization — Professional was running a 47% gross margin at 750 included minutes, well below SaaS norm. So we tightened.
| Plan | Monthly | Minutes | Overage/min | Change |
|---|---|---|---|---|
| Lite NEW | $9 | 20 | $0.25 | Acquisition tier |
| Starter | $29 | 250 | $0.18 | 150 → 250 min |
| Professional | $99 | 750 | $0.17 | Overage lifted |
| Business | $349 | 2,000 | $0.15 | — |
| Enterprise | custom | unlimited | $0.12 floor | Floor raised |
Starter got more minutes (150 → 250) because that tier was already healthy — bump it to match competitor volume. Professional got a higher overage because full-utilization math was below water. Enterprise floor went up because $0.10 was below our COGS + reasonable margin. And we added Lite because the "I'll try next month" friction at $29 was costing us signups.
Why I'm publishing this.
Two reasons.
One, if you're an operator running an AI voice platform or any usage-metered SaaS, there's a lesson here: build the vendor-side ledger before you need it. One-sided billing is a time bomb. Metered customer revenue is table stakes; metered vendor COGS is what tells you a leak started today, not when the next invoice lands.
Two, our product is sold on predictability. "No per-minute math, flat subscription." That's a promise we can only keep if we actually know what we're paying our stack. The pricing we shipped yesterday is designed to be stable for 12 months — not another "we'll figure it out when we see the bill." I wanted the reasoning on record.
If you're on the fence between us and Synthflow, Vapi, or Retell, we have honest comparisons for each. If you want to try the new Lite tier, it's $9/mo. If you want to resell this under your own brand or earn 20% recurring as an affiliate, we're taking partner applications starting today.
— Rjs