Dev.to WebDev 🛠 Dev 👁 0 📖 5 min read

How we normalize per-minute vs per-caller voice-AI pricing

If you've tried to pick an AI receptionist or voice-agent platform, you've probably hit the same wall we did: every vendor prices in a different unit. Developer platforms like Vapi, Retell and Bland quote a rate per min

If you've tried to pick an AI receptionist or voice-agent platform, you've probably hit the same wall we did: every vendor prices in a different unit.

Developer platforms like Vapi, Retell and Bland quote a rate per minute. Some receptionist products charge per call or per caller. Others sell a monthly plan with a bucket of included minutes or calls, then charge overage once you go past it. A few combine a platform fee with usage. Put them side by side and the headline numbers are meaningless: $0.07 a minute, $1 a call and $49 a month for 100 minutes aren't the same kind of number.

Business owners don't think in any of those units. They think, "We get about 300 calls a month, and most last three minutes. What will this cost me?" So that's the unit we normalize to: estimated monthly cost at your call volume and average call length.

The conversion itself is simple arithmetic. Getting it right is the hard part.

A per-minute rate becomes calls × minutes × rate. A per-call price becomes calls × price. A flat plan is the base fee plus overage on whatever goes past the included allowance, and you have to check every plan a vendor offers, because the cheapest plan at 100 calls is often not the cheapest at 1,000. We price every published plan at your volume and keep the lowest, overage included.

Per-minute developer platforms add another wrinkle: their rates aren't all-in. One covers orchestration only, while another bundles speech and telephony. The lowest number is not always the lowest bill. Rather than invent a "true" all-in cost, we show what each rate covers and what it leaves out. Our per-minute comparison does this at 1,000, 10,000 and 50,000 minutes a month.

All of this is only as good as the input prices, so the data pipeline follows strict rules. Once a day a scraper downloads each vendor's pricing page as plain HTML, without running JavaScript, and a parser written for that vendor reads only numbers printed on the page. When a price appears twice, say on the plan card and again in the FAQ, both copies must agree. If a number is missing or the copies conflict, we don't guess: the vendor's record stays as it was and the failure is logged. A record is only rewritten when a price, plan, allowance or overage rate actually changes, so "last updated" means the last time prices really moved.

Some vendors can't be read this way: their price only appears after JavaScript runs, or there's no public price at all. Those are updated by hand and labeled with their own check date.

Last, the ranking is cheapest first, and vendors we can't estimate go last. We use some affiliate links, but commissions never change the order.

Here's how each conversion works in detail.

The common unit

Every estimate starts from two inputs you control: calls per month and average call length in minutes. Everything else comes from the vendor's published pricing page. The output is one number in USD: estimated monthly cost at that volume. Because every vendor ends up in the same unit, the comparison is finally apples to apples.

The conversions

The figures below are illustrative inputs, not quotes from any vendor.

Per-minute

monthly = calls × avg_minutes × rate_per_minute

At 300 calls of 3 minutes, that's 900 minutes. A $0.07/minute rate comes to $63. Minimums and per-minute billing increments are applied where the vendor publishes them.

Per-call (or per-caller)

monthly = calls × price_per_call

Call length doesn't matter here, which is why per-call pricing can look expensive for short calls and cheap for long ones. At 300 calls and $1 per call, you pay $300 no matter how long each call lasts.

Flat plan plus overage

monthly = base_fee + max(0, usage − included) × overage_rate

Usage is measured in whatever unit the plan meters: minutes or calls. A $49 plan with 100 included minutes, priced at 900 minutes, also bills 800 minutes of overage, and that overage usually dominates the total. A plan that doesn't publish an overage rate can't be estimated past its allowance. We mark that plan as not estimable at that volume rather than assume a rate.

Tiered plans

Most vendors sell several plans. We run the flat-plus-overage formula for every published plan at your volume and keep the lowest result. That's how the "best plan" can change as volume grows: the starter plan wins at 100 calls, and a higher tier with a bigger allowance wins at 1,000. Where pricing is a platform fee plus usage, the fee is added first and usage is priced with the matching formula above.

The gaps: what per-minute leaves out

Developer-platform rates aren't directly comparable, even when they share a unit. One rate covers orchestration only. Another bundles speech-to-text, the LLM, text-to-speech and telephony. A third bundles some of those and bills the rest separately.

We don't invent a "true" all-in number by guessing at third-party costs. Instead, the per-minute comparison labels what each rate includes and what it leaves out, at 1,000, 10,000 and 50,000 minutes a month. If a line says "telephony not included," you know to budget for it. We don't fold in a number we didn't read on the vendor's page.

The pipeline

The math is only as trustworthy as its inputs, so the pipeline is built to fail closed:

  1. No-JS scrape. Once a day we fetch each pricing page as plain HTML, without running JavaScript. That gives us exactly what the server publishes, and it's reproducible.
  2. Vendor-specific parsers. Each vendor has its own parser that reads only numbers printed on the page: prices, allowances and overage rates. No inference, no "typical" values.
  3. Duplicate checks. When a price appears in more than one place, such as the plan card and the FAQ, all copies must agree.
  4. Fail closed. If a number is missing or the copies conflict, the vendor's record stays as it was and the failure is logged for review. A bad parse never overwrites good data.
  5. Meaningful timestamps. A record is rewritten only when a price, plan, allowance or overage rate actually changes, so "last updated" reflects real price movement.

Vendors whose prices only render with JavaScript, or who don't publish prices at all, are updated by hand. They're labeled as manual, with their own check date.

The ranking

Results are sorted by estimated monthly cost at your volume, cheapest first. Vendors we can't estimate, because they have no public price or no overage rate past the allowance, go last instead of getting a made-up number.

Some listings use affiliate links. Commissions never change the order. The sort key is the estimate and nothing else. The full policy is on our disclosure page.

Try it

Toolcrew covers US vendors with USD pricing. Enter your monthly calls and average call length at toolcrew.app to see every vendor priced in the same unit. If you spot a wrong price or disagree with how we normalize something, tell us. Corrections are the fastest way to make the data better. How we handle affiliate links is laid out at toolcrew.app/disclosure.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.