Cost review · 25 Aug 2026 · Twilio · Archer

Cutting the Twilio bill by more than half

Where the July 2026 bill goes, and what each lever is worth. Numbers are pulled read-only from Twilio usage records (July = last full month) and Firestore prd; savings are monthly at July unit prices, ± 15%.

July bill$7,639 Aug projected≈ $7,150 numbers in Twilio2,728 $2,326/mo secured updated 25 Aug 21:30 UTC
TL;DR

Two lines are 84% of spend: renting 2,728 phone numbers ($3,098) and toll-free SMS ($3,560). Around 2,000 of those numbers have no tenant, no calls in 90 days, or belong to churned accounts, and office texts average 3.9 segments because each carries a 130-character recording URL. Releasing stale numbers and shrinking the texts are worth $4,066/mo in the likely case (−53%, ≈ $49k/yr); the SMS and dead-recipient fixes are merged to main.

00

Progress


Running tally against the $4,066/mo likely case. "Deployed" means live in production; the SMS savings show up in Twilio's usage records from the first post-deploy texts. The Premium Support downgrade was taken off the plan on 25 Aug. "Secured" means the money stops on a known date without further decisions; "built" means code is written on the branch but not yet merged and deployed.

$59
Realized
recordings deleted 25 Aug
$2,267
Scheduled
1,971 numbers release 28 Aug
$1,050–1,745
Deployed
SMS body · dead recipients — live since 25 Aug 21:14 UTC
$790–1,645
Not started
pricing · 10DLC · after-hours · REFER
realizedscheduleddeployednot started
LeverStatus$ / moWhat happened
Delete legacy recordingsdone$5925 Aug — 67,959 recordings / 91,878 min created before 2026-06-01 deleted, 0 failures. delete-legacy-twilio-recordings.ts
Release stale numbers — Tier A (GHL-routed)quarantined$93825 Aug — 816 numbers detached from the Retell trunk, voice → <Reject/>, renamed. Release runs from GitHub Actions on 28 Aug 15:00 UTC (PR #1030 merged); CI dry run verified 20:48 UTC.
Release stale numbers — Tier B (operator-excluded)quarantined$41125 Aug — 357 of 365 quarantined; 3 held as A/B-linked, 5 already in Tier A. Same 28 Aug release.
Release stale numbers — Tier C (unlisted)quarantined$91825 Aug — 798 of 800 quarantined (2 already in Tier A), 0 failures. Same 28 Aug release.
Shrink office SMS bodydeployed$900–1,50025 Aug — PR #1035 merged 21:11 UTC; Vercel production deploys succeeded (backend 21:12, web 21:14). Short dashboard call link (/c/:token) instead of the 130-char recording URL; empty-value and duplicate-summary drops; blank-line compaction. Savings show from the first post-deploy texts.
Suppress dead SMS recipientsdeployed$150–24525 Aug — PR #1035 deployed 21:14 UTC. Per-recipient health from Twilio status callbacks; auto-disable at 3 permanent / 10 transient failures; settings-page re-enable. Ramps as the webhook accumulates failures; first landlines trip after their third failed text.
Volume / committed-use pricingnot started$500–1,200Best negotiated after the number release lands and the bill resets.
Toll-free → 10DLC · after-hours merge · SIP REFERnot started$290–445

Number rental stops accruing at release, not at quarantine — the $2,267 lands on the September invoice. Tier B/C counts are from the live runs and differ slightly from the audit's estimates below.

01

The headline


$7,639
July 2026 Twilio bill
Aug 1–25: $5,762
$4,066
Likely monthly savings
−53% · ≈ $49k / yr
$2,166
Conservative savings
−28% · ≈ $26k / yr
$3,573
Bill after, likely
2,728 → ~730 numbers
02

Where the July bill goes


Voice is already cheap — SIP trunking to Retell is $632 for 144k minutes. The money is in rentals and texts.

Twilio's channels line ($3,555) is the parent bucket for SMS outbound + carrier fees + inbound, not an additional charge; the itemized lines above sum to the $7,639 total. Not in use anywhere: Lookups, Verify, Studio, Conference, transcription, AMD, CNAM, trunk recording.

03

Savings by lever


Conservative vs likely, $/month. Stale-number release and the SMS body format are ~85% of the opportunity between them.

ConservativeLikely
04

Before and after


Bill composition today against the likely case.

July 2026After (likely)
05

Stale and unused numbers


2,728 numbers in Twilio; only 1,919 have a tenant document, and 1,215 of those (63%) have had no call in 90 days. Number rental is 40% of the bill, and nothing in the platform releases a number today — the only intentional release path is the A/B variant delete.

TierWho they areNumbers$ / moGate
ATwilio-only, no numbers doc. 806 route to GoHighLevel/LeadConnector; 691 were bought on 2025-12-19 in a three-minute window — residue of the "7,503 accidental purchases" incident. About 57% are fully idle.813idle ≈ 460$935idle $530Confirm GHL ownership with sales/marketing first
BaccountHealthExclusions — operator-marked test line or dead account — with no call in 90 days366$421Safest cohort; release first
Cunlisted (no HubSpot company) with no call in 90 days, minus A/B-linked numbers802$922128 have a CRM configured — spot-check; 202 were never called at all
Dunclassified with no call in 90 days12$14CSM check
Ecancelled (churned) with no call in 90 days. 11 of the 31 churned numbers still receive calls.8$9Offer forward or port-out; 30–60 day grace
ConservativeA idle + B + E≈ 830$960
LikelyA – E≈ 2,000$2,300
ActualA (all 816) + B (357) + C (798) quarantined 25 Aug; release 28 Aug1,971$2,267D/E not yet done

What could go wrong

Nothing releases todayTenant offboarding never deletes the doc or the Twilio number; disableSelfServeNumber only blanks the voiceUrl and keeps billing. Clones carry no isClone marker and docs have no created-at, so Twilio dateCreated is the only age signal.
A/B siblings19 stale numbers are linked via abtestNumber / isABTestNumber. Releasing one without unlinking sends callers to a dead number through decideNumberToUse; run clear-abtest-link.ts first.
Deny-listThe messaging-service senders (+17206339613, +18559202335, +19786968892) and both toll-free numbers must never be released. Release is irreversible after ~10 days.
Retell sideDeleting from Twilio without removeRetellNumber leaves orphaned retellData and Retell phone objects — 95 already exist.

Release process

  1. Resolve Tier A ownership (GoHighLevel/LeadConnector) — the largest block, with zero Firestore footprint.
  2. Build apps/backend/scripts/release-stale-numbers.ts to fleet-write conventions: dry-run by default, --apply plus a --cohort file, re-verify each number immediately before release (last call, class, A/B link, deny-list), write AuditTrail/{phone}/logs with the Twilio SID, detach from the Retell trunk and delete retellData. Script the revert first — the doc can be restored; the number cannot be re-bought.
  3. Grace step: blank voiceUrl and detach the trunk for 30 days, watch inbound attempts, then release.
  4. Cohort order: B → A idle → C never-called (202) → C 180d → C 90d → E with CSM sign-off.
  5. Structural fix: add a release step to offboarding, and stamp provisionedAt / expiresAt on demo, test and clone numbers so they auto-qualify.

Audit script and output: /tmp/archer-audit/audit-stale-numbers.ts, /tmp/archer-audit/number-audit.json (2,732 rows).

06

Other cost levers


SMS is $3,560 all-in, about $0.0123 per segment. Office lead texts averaged 3.9 segments because shortenUrl() was a stub returning the full ~130-character recording URL, alongside a duplicated summary line. 8.5% of messages failed outright — to the same landlines and dead numbers, call after call — and Twilio bills the failed segments too.

#LeverCons.LikelyEffortStatus · risk
1Shrink office SMS: short dashboard call link (/c/:token, ~50 chars) instead of the recording URL, drop empty values and the summary line when the reason field already carries it, collapse blank lines. Measured 8 → 5 segments on real messages.$900$1,500Lowmerged 25 AugSummary drop is a product call; one constant to tune.
2Suppress dead SMS recipients: auto-disable after 3 consecutive permanent failures (landline 30006, dead 30005, invalid 21211, opt-out) or 10 transient; visible in the call log and Settings → Post Call with one-click re-enable.$150$245Lowmerged 25 AugSavings ramp as the webhook accumulates history.
3Negotiate committed-use / volume pricing (~$7.6k/mo, mostly numbers and toll-free SMS)$500$1,200Sales cycle12-month commitment; shrinks once the levers above land.
4Move office SMS from toll-free to 10DLC senders (carrier fee ~$0.003 vs $0.0042 per segment)$200$290MediumCampaign vetting, per-number daily caps, carrier filtering.
5Delete 67,959 legacy pre-Retell recordings (92k minutes; none created since May 2026)$59$59Lowdone 25 AugDeleted without export; playback on pre-June call docs is gone.
6Merge after-hours lead + action texts; route monitoring.ts error SMS (with stack traces) to Slack$40$80TrivialNone.
7Transfers via SIP REFER instead of Retell bridging (21.6k bridged minutes a month)$50$75Med–HighTwilio-side saving is small; the real win is ~$1,000–1,500/mo on the Retell bill. Unverified that Retell supports REFER on custom trunks.
Retell-purchased numbers instead of TwilioNot recommended: Retell numbers cost more per number.

Outbound campaign calls originate from a Retell-owned number, so the $214 termination line is transfers and after-hours dial-outs only.

07

Totals


BucketConservativeLikely
Stale-number release$960$2,300
SMS format + failed recipients + after-hours / error texts$1,090$1,825
Recordings$59$59
Toll-free → 10DLC, SIP REFER (Twilio side)$250$365
Total, excluding negotiation$2,356$4,546
Volume-pricing negotiation — overlaps; apply to the residual bill$500$1,200

The headline figures ($2,166 / $4,066) are these totals with lever overlap removed — 10DLC and part of the SMS savings shrink once the SMS body shrinks — and negotiation excluded. The Premium Support downgrade ($294) was removed from the plan on 25 Aug.