<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sergio Barguilla</title>
    <description>The latest articles on DEV Community by Sergio Barguilla (@sergio_barguilla_3757e6e7).</description>
    <link>https://dev.to/sergio_barguilla_3757e6e7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4224488%2F5026810b-4d23-41e5-89f8-993d99e5a241.png</url>
      <title>DEV Community: Sergio Barguilla</title>
      <link>https://dev.to/sergio_barguilla_3757e6e7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sergio_barguilla_3757e6e7"/>
    <language>en</language>
    <item>
      <title>How we normalize per-minute vs per-caller voice-AI pricing</title>
      <dc:creator>Sergio Barguilla</dc:creator>
      <pubDate>Tue, 03 Nov 2026 15:00:17 +0000</pubDate>
      <link>https://dev.to/sergio_barguilla_3757e6e7/how-we-normalize-per-minute-vs-per-caller-voice-ai-pricing-2aci</link>
      <guid>https://dev.to/sergio_barguilla_3757e6e7/how-we-normalize-per-minute-vs-per-caller-voice-ai-pricing-2aci</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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: &lt;strong&gt;estimated monthly cost at your call volume and average call length.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The conversion itself is simple arithmetic. Getting it right is the hard part.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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 &lt;a href="https://toolcrew.app/ai-voice-agent-cost-per-minute" rel="noopener noreferrer"&gt;per-minute comparison&lt;/a&gt; does this at 1,000, 10,000 and 50,000 minutes a month.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Here's how each conversion works in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  The common unit
&lt;/h2&gt;

&lt;p&gt;Every estimate starts from two inputs you control: &lt;strong&gt;calls per month&lt;/strong&gt; and &lt;strong&gt;average call length in minutes&lt;/strong&gt;. 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conversions
&lt;/h2&gt;

&lt;p&gt;The figures below are illustrative inputs, not quotes from any vendor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-minute
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;monthly = calls × avg_minutes × rate_per_minute&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-call (or per-caller)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;monthly = calls × price_per_call&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flat plan plus overage
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;monthly = base_fee + max(0, usage − included) × overage_rate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tiered plans
&lt;/h3&gt;

&lt;p&gt;Most vendors sell several plans. We run the flat-plus-overage formula for &lt;strong&gt;every published plan&lt;/strong&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gaps: what per-minute leaves out
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;We don't invent a "true" all-in number by guessing at third-party costs. Instead, the &lt;a href="https://toolcrew.app/ai-voice-agent-cost-per-minute" rel="noopener noreferrer"&gt;per-minute comparison&lt;/a&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pipeline
&lt;/h2&gt;

&lt;p&gt;The math is only as trustworthy as its inputs, so the pipeline is built to fail closed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No-JS scrape.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor-specific parsers.&lt;/strong&gt; Each vendor has its own parser that reads only numbers printed on the page: prices, allowances and overage rates. No inference, no "typical" values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate checks.&lt;/strong&gt; When a price appears in more than one place, such as the plan card and the FAQ, all copies must agree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail closed.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meaningful timestamps.&lt;/strong&gt; A record is rewritten only when a price, plan, allowance or overage rate actually changes, so "last updated" reflects real price movement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ranking
&lt;/h2&gt;

&lt;p&gt;Results are sorted by estimated monthly cost at your volume, &lt;strong&gt;cheapest first&lt;/strong&gt;. 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.&lt;/p&gt;

&lt;p&gt;Some listings use affiliate links. &lt;strong&gt;Commissions never change the order.&lt;/strong&gt; The sort key is the estimate and nothing else. The full policy is on our &lt;a href="https://toolcrew.app/disclosure" rel="noopener noreferrer"&gt;disclosure page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Toolcrew covers US vendors with USD pricing. Enter your monthly calls and average call length at &lt;a href="https://toolcrew.app" rel="noopener noreferrer"&gt;toolcrew.app&lt;/a&gt; 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 &lt;a href="https://toolcrew.app/disclosure" rel="noopener noreferrer"&gt;toolcrew.app/disclosure&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>voice</category>
      <category>pricing</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
