Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Execute an ElevenLabs production deployment checklist with health checks and rollback. Use when deploying TTS/voice integrations to production, preparing for launch, or implementing go-live procedures for ElevenLabs-powered apps. Trigger with "elevenlabs production", "deploy elevenlabs", "elevenlabs go-live", "elevenlabs launch checklist", or "production TTS".
.claude/skills/jeremylongshore-elevenlabs-prod-checklist/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 49% | 0% |
Complete checklist for deploying ElevenLabs TTS/voice integrations to production. Covers API configuration, health checks, circuit breakers, monitoring, and rollback procedures. The deep code for the resilience primitives lives in references/ so this file stays a fast, scannable runbook — drill in when you need the full implementation.
Walk the checklist below. Every unchecked box is a launch blocker.
Configuration:
ELEVENLABS_API_KEY set in deployment platform's secretseleven_multilingual_v2 or eleven_v3)Code Quality:
grep -r "sk_" src/)Quota Planning:
Production ElevenLabs integrations need three primitives. The full drop-in TypeScript for each is in references/implementation.md — high-level intent:
degraded past 90% quota and unhealthy on any API failure, so a load balancer can gate traffic.
half-open; accepts a fallback (placeholder audio / cached clip / null) so a TTS outage degrades gracefully instead of throwing.
thresholds in the table below into your observability platform.
Before promoting a build, run the pre-flight script — it checks connectivity, quota, voice availability, and a live TTS smoke test, exiting non-zero on any hard failure so it can block a CI/CD deploy step. Full script + CI wiring: references/preflight.md.
bash# The load-bearing first gate — full script in references/preflight.md HTTP=$(curl -s -o /dev/null -w "%{http_code}" \ https://api.elevenlabs.io/v1/user \ -H "xi-api-key: ${ELEVENLABS_API_KEY}") [ "$HTTP" != "200" ] && echo "FAIL: API not reachable" && exit 1
Running this checklist produces:
healthy / degraded / unhealthy plus latency andremaining quota.
=== All checks passed ===, exit 0) gating the deploy.| Alert | Condition | Severity | |-------|-----------|----------| | API unreachable | Health check fails 3x | P1 — Critical | | Quota exhausted | 401 quota_exceeded | P1 — Critical | | High error rate | 5xx > 5% of requests | P2 — High | | Rate limited | 429 > 10/min sustained | P2 — High | | High latency | p99 > 5000ms | P3 — Medium | | Quota warning | > 80% used | P3 — Medium |
| Scenario | Response | |----------|----------| | ElevenLabs API down | Circuit breaker opens; fallback to cached/placeholder audio | | Quota exhausted mid-day | Alert team; switch to Flash model (0.5x cost); queue non-urgent requests | | Voice deleted | Return 404 to caller; alert; fall back to default voice | | Webhook delivery failing | Monitor ElevenLabs webhook health; webhooks auto-disable after 10 failures |
Gate a deploy on the pre-flight script. Run it as the last step before promotion; a non-zero exit blocks the pipeline:
bash$ ELEVENLABS_API_KEY=$PROD_KEY ./scripts/pre-flight-check.sh === ElevenLabs Pre-Flight Check === API connectivity: HTTP 200 Characters remaining: 428193 Voices available: 14 TTS smoke test: HTTP 200 === All checks passed === $ echo $? 0
Poll the health endpoint for a load-balancer probe. A degraded status (quota > 90%) still serves traffic but pages on-call; unhealthy drains the node:
bash$ curl -s https://myapp.example.com/health | jq '.status, .elevenlabs.quotaPctUsed' "healthy" 41
Full worked implementations for both: references/implementation.md and references/preflight.md.
For version upgrades, see elevenlabs-upgrade-migration. For cost optimization, see elevenlabs-cost-tuning.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 25,581 | 23,489 | -8% | 1 | 1 | 0% | 4,513 | 5,998 | +33% | 0 | 0 | — |
case-02 | fail→fail | 23,227 | 24,775 | +7% | 1 | 1 | 0% | 4,199 | 6,560 | +56% | 0 | 0 | — |
case-03 | fail→fail | 23,772 | 23,267 | -2% | 1 | 1 | 0% | 3,462 | 5,839 | +69% | 0 | 0 | — |
case-04 | pass→pass | 21,226 | 10,883 | -49% | 1 | 1 | 0% | 3,696 | 3,636 | -2% | 0 | 0 | — |
case-05 | pass→pass | 15,545 | 13,501 | -13% | 1 | 1 | 0% | 2,442 | 3,814 | +56% | 0 | 0 | — |
case-06 | pass→pass | 18,370 | 5,853 | -68% | 1 | 1 | 0% | 2,660 | 2,515 | -5% | 0 | 0 | — |
case-07 | fail→pass | 14,258 | 5,380 | -62% | 1 | 1 | 0% | 1,879 | 2,339 | +24% | 0 | 0 | — |
case-08 | pass→pass | 17,406 | 13,920 | -20% | 1 | 1 | 0% | 2,562 | 3,513 | +37% | 0 | 0 | — |
case-09 | pass→pass | 8,681 | 5,061 | -42% | 1 | 1 | 0% | 1,526 | 2,301 | +51% | 0 | 0 | — |
case-10 | fail→pass | 24,043 | 4,740 | -80% | 1 | 1 | 0% | 1,930 | 2,227 | +15% | 0 | 0 | — |
case-11 | fail→pass | 15,261 | 7,415 | -51% | 1 | 1 | 0% | 2,196 | 2,377 | +8% | 0 | 0 | — |
case-12 | pass→pass | 10,263 | 3,591 | -65% | 1 | 1 | 0% | 1,525 | 1,991 | +31% | 0 | 0 | — |
case-13 | pass→pass | 13,400 | 3,688 | -72% | 1 | 1 | 0% | 2,349 | 1,965 | -16% | 0 | 0 | — |
case-14 | fail→pass | 17,431 | 18,621 | +7% | 1 | 1 | 0% | 2,727 | 4,067 | +49% | 0 | 0 | — |
case-15 | fail→pass | 18,005 | 3,345 | -81% | 1 | 1 | 0% | 2,520 | 2,047 | -19% | 0 | 0 | — |
case-16 | pass→pass | 10,801 | 6,959 | -36% | 1 | 1 | 0% | 1,788 | 2,455 | +37% | 0 | 0 | — |
case-17 | pass→pass | 20,922 | 10,174 | -51% | 1 | 1 | 0% | 3,047 | 3,253 | +7% | 0 | 0 | — |
case-18 | fail→pass | 15,210 | 5,284 | -65% | 1 | 1 | 0% | 2,031 | 2,203 | +8% | 0 | 0 | — |
case-19 | pass→pass | 4,965 | 1,735 | -65% | 1 | 1 | 0% | 822 | 1,816 | +121% | 0 | 0 | — |
case-20 | fail→fail | 18,025 | 14,846 | -18% | 1 | 1 | 0% | 3,664 | 4,709 | +29% | 0 | 0 | — |
case-21 | fail→fail | 13,648 | 25,168 | +84% | 1 | 1 | 0% | 2,140 | 5,203 | +143% | 0 | 0 | — |
case-22 | fail→fail | 29,197 | 35,290 | +21% | 1 | 1 | 0% | 5,524 | 7,312 | +32% | 0 | 0 | — |
case-23 | pass→pass | 11,032 | 11,124 | +1% | 1 | 1 | 0% | 1,530 | 3,185 | +108% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +30 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.