ElevenLabs is a voice platform that sells text-to-speech and conversational phone agents against one monthly pool of credits. Roughly 1 credit per character for standard text-to-speech, by the vendor's own description on elevenlabs.io/pricing. Every product on the account draws from the same pool, which is exactly how a quiet batch job hides behind a loud one.
What we saw
The first scheduled run of our vendor board on 2026-10-08 raised a critical line for ElevenLabs. The subscription API reported 4,091,604 of 3,831,927 credits used, 106.8%, with the period resetting on 2026-10-12 and overage billing switched on. The current overage stood at $46.55 and the next invoice at $375.91.
Our assumption, voiced out loud, was that the phone agents had grown. One agent takes calls for a doctor's office all day. We were wrong by a factor of about 3.
What was actually happening
The usage API breaks characters down by product, by voice and by API key. By product: 2.97M of the period's 4.15M was plain text-to-speech. Conversational AI, the phone agents, used 1.17M for the whole period, which is 1,100 calls and 1,427 minutes on one agent. In October to date, text-to-speech had used 356 characters. The burn had stopped two weeks before anyone looked.
By day, the text-to-speech came in four spikes. On 2026-09-14, 1.0M credits: a full audio course rendered on the eleven_multilingual_v2 model, 5,205 clips. On 2026-09-19, 694,000 credits: the whole course re-voiced on eleven_v3 after we found that multilingual_v2 ignores phoneme rules, so medical terms were being mispronounced. From 2026-09-20 to 2026-09-23, 1.4M credits: 2,340 clips re-rendered on flash_v2 with pronunciation-lexicon fixes.
All of it came through one API key, the same key the phone agents use. That is why the subscription total could say 106% and nothing could say why.
The render pipeline had a cache keyed on voice plus text. It could not help. Adding phonetic markup changed the text of nearly every line, and the model is not part of the key at all, so a model switch invalidated everything by accident rather than by name.
ElevenLabs documents the credit pool and how each product consumes it in its billing guide (ElevenLabs docs: billing). The pool is simple. Attribution across products is the user's job.
What we changed
For the bill itself, nothing. The spend was real and the work was wanted; a course with every medical term pronounced correctly was the goal, and the third render was the one that achieved it. We kept overage billing on, because turning it off is what stopped every phone agent on 2026-09-13, when a past-due subscription made ElevenLabs refuse calls and 14 duplicate alert emails landed in an inbox nobody reads.
For next time, two changes. The board now pulls the product-type breakdown, not just the subscription total, so a batch job is named on the day it runs. And every batch script that calls a metered vendor gets a pre-spend gate: count the characters, compare to the vendor's budget, refuse above a per-run cap unless the command line carries the figure. The 1.0M-credit render would have printed its own cost before sending a byte.
What a monitor should have said
The alert that fired was correct and useless on its own. It named the limit and the reset date. It did not name the spender.
“ElevenLabs OVER character limit: 4,074,135 of 3,831,927 (106.3%), resets 2026-10-12; overage billing is on”Mepa8 alert, 2026-10-08
The line it needed, and raises now, is one level down: the product and the day. A single-day spike above a quarter of the monthly pool is the condition, and it would have fired on 2026-09-14, four weeks before the invoice.
The lesson
A shared credit pool and a shared API key turn a one-off job into a mystery that takes a month to solve. Give each purpose its own key, so attribution is one API call. Make batch scripts state their cost before they run; a monitor can only prevent spend it hears about in advance. And read the breakdown, not the total. The total said over the limit. The breakdown said four days in September. See the ElevenLabs vendor page for what Mepa8 reads and the alert thresholds.
Questions people ask
Did the phone agents cause the overage?
No. Conversational AI used 1.17M credits for the period, which is 1,100 calls and 1,427 minutes on one agent. Batch text-to-speech used 2.97M, almost all of it on 2026-09-14, 2026-09-19 and 2026-09-20 to 2026-09-23, rendering one audio course three times.
Why was the course rendered three times?
The first render used eleven_multilingual_v2, which ignores phoneme rules, so medical terms came out wrong. The second re-voiced everything on eleven_v3. The third moved to flash_v2 with lexicon fixes. Nobody checked the model against the hard words on a 2,000-character sample first.
Should we have turned overage billing off?
No. On 2026-09-13 a past-due subscription made ElevenLabs refuse every call, taking down the phone agent for a doctor's office. A hard stop on a voice line is worse than a 46-dollar overage. The right control is a pre-spend gate on batch jobs and a per-day spike alert.
Sources
- ElevenLabs pricing — Scale $299 for 1.8M credits, Business $990 for 6M, about 1 credit per character; fetched 2026-10-09
- ElevenLabs docs: billing — how products draw from one credit pool
- Mepa8 vendor page: ElevenLabs — what the monitor reads
Change log: October 9, 2026 — First published. Numbers are from our own accounts and logs.