What problems does this workflow solve?
Making sense of churn gets harder as you scale.
Usually you end up staring at generic cancellation reasons like "I don't need it anymore" or "it was too expensive", which tell you almost nothing.
This workflow pulls your customer service calls and extracts the real cancellation reasons, in the customer's own words.
What does the output look like?
Here's a preview sample:
⚠️ Dummy data — demonstration only. This report was generated with fictional calls, contacts, and quotes to illustrate the output format.
Scope: Whole team (all 12 users, all 7 phone lines) — sample selection
Calls retrieved: 418 answered → 263 after 120s length filter → 31 confirmed churn calls
False positives discarded: 9 (summaries flagged "cancel/refund" but transcripts showed routine billing questions or plan upgrades)
1. SMS / A2P 10DLC verification delay outlasted the trial window · Root cause: onboarding failure · 7 calls
Prospects on the 14-day trial couldn't send texts because brand/campaign registration wasn't approved in time, so they never experienced the core workflow before the trial lapsed.
"We signed up specifically to text leads, and three weeks in we still can't send a single message. The trial's already over — I can't sell this to my boss."
— Marcus D. (Regional Sales Lead), call #CA-10241, Jun 11
2. Dropped calls / choppy audio on outbound · Root cause: technical issue · 6 calls
Reps reported audio breaking up or calls dropping mid-conversation, especially on the desktop app, which they said embarrassed them in front of their own customers.
"Half my discovery calls this week dropped at the two-minute mark. My prospects think WE'RE the flaky ones."
— Priya S. (SDR), call #CA-10188, Jun 19
3. Cheaper competitor at renewal · Root cause: pricing / competitor · 5 calls
At renewal, buyers had a lower quote from another provider and asked to match or explain the gap.
"CentralRing quoted us $15 a seat. You're at $25. Give me a reason to stay."
— Ken A. (Ops Manager), call #CA-10310, Jun 27
4. Missing / broken CRM integration · Root cause: product gap · 4 calls
Teams wanted automatic call logging into their CRM; the native sync either didn't exist for their CRM or logged incomplete data, forcing manual entry.
"Every call I have to copy-paste notes into HotSpot by hand. That's the whole reason we bought a phone system that 'integrates.'"
— Dana R. (Account Exec), call #CA-10276, Jun 22
5. Number porting stalled · Root cause: onboarding failure · 4 calls
Businesses couldn't fully switch because their existing numbers were stuck in porting, leaving them running two systems.
"It's been 18 days. We're paying you AND our old carrier because the port isn't done."
— Luis M. (Owner), call #CA-10205, Jun 14
6. No desk phone / hardware support · Root cause: product gap · 3 calls
Customers with front-desk staff wanted physical handsets; softphone-only was a dealbreaker for reception-style roles.
"My receptionist won't use a headset all day. If there's no desk phone, this doesn't work for our lobby."
— Sandra P. (Clinic Admin), call #CA-10333, Jun 30
7. Voicemail transcription accuracy · Root cause: product gap · 3 calls
Users relied on transcripts to triage voicemails and found them too inaccurate to trust.
"The transcript said 'order 400 units' — he actually said 'cancel our order.' I can't work off that."
— Tom W. (Inside Sales), call #CA-10299, Jun 24
8. International call rates too high · Root cause: pricing · 2 calls · ⚠️ weak signal (borderline; 2 calls)
Teams calling abroad found per-minute rates uncompetitive versus a competitor's bundled international plan.
"Our LATAM calls cost more here than on Dialpal's international add-on. It adds up fast."
— Gabriela T. (BDR), call #CA-10351, Jul 1
9. Slow support response during outage · Root cause: support failure · 2 calls · ⚠️ weak signal
During a service disruption, customers couldn't reach support quickly and lost trust in reliability.
"We were down for an hour and I sat in a chat queue the whole time. For a phone company, that's ironic."
— Ahmed K. (Sales Director), call #CA-10367, Jul 3
10. Confusing admin / seat management UI · Root cause: product gap · 1 call · ⚠️ weak signal (single call)
An admin struggled to add and reassign seats without help, which soured the buying experience.
"I spent 40 minutes just trying to move a license from one rep to another."
— Beatrice N. (Office Manager), call #CA-10388, Jul 5
1. Trial extension to bridge the SMS approval wait · Outcome: Saved (3) / Pending (2) · 5 calls
Rep offered a 14-day trial extension and hands-on help re-submitting the 10DLC registration.
Rep: "Let me extend your trial two weeks and personally push your campaign registration — you won't lose the eval time."
Customer: "Okay, if you can get texting live by Friday, we'll keep evaluating."
— call #CA-10241
2. Renewal discount / price match · Outcome: Saved (2) / Lost (1) / Unclear (1) · 4 calls
Rep offered a loyalty discount or matched the competing quote for 12 months.
Rep: "I can lock you at $19 a seat for a year — that closes the gap with the other quote."
Customer: "That's more like it. Send it over."
— call #CA-10310
3. Engineering escalation for call-quality diagnostics · Outcome: Pending (2) / Saved (1) · 3 calls
Rep opened a priority ticket, collected call IDs, and scheduled a network/codec review.
Rep: "I'm flagging your dropped-call IDs to our voice team today and we'll run a diagnostic on your network path."
Customer: "Fine, but if it's not fixed in a week we're gone."
— call #CA-10188
4. Expedited porting with dedicated specialist · Outcome: Saved (2) · 2 calls
Rep assigned a porting specialist and gave a firm completion date.
Rep: "I'm putting a specialist on your port with a hard date of next Tuesday, and I'll credit this month while both lines run."
Customer: "A credit helps. Let's finish it."
— call #CA-10205
5. Guided CRM re-integration walkthrough · Outcome: Saved (1) / Pending (1) · 2 calls
Rep booked a screen-share to fix the sync mapping and enable auto-logging.
Rep: "Let's get on a screen-share — I'll map your call fields so notes log to your CRM automatically, no copy-paste."
Customer: "If that actually works, that solves my biggest complaint."
— call #CA-10276
1. Would return once desk-phone support ships · Suggested follow-up: Add to hardware-launch waitlist; notify when handsets are supported · 3 calls
Customer liked the software but needed physical phones for front-desk staff and left the door open.
"Honestly if you add desk phones, call me back — I'd switch back in a heartbeat."
— Sandra P., call #CA-10333
2. Open to returning after 10DLC/texting is proven reliable · Suggested follow-up: Re-engage once their campaign is approved with a fresh 30-day texting trial · 2 calls
Left because texting wasn't live in time, not because of the product itself.
"The product's good — it's the SMS approval that killed it. Ping me when that's sorted."
— Marcus D., call #CA-10241
3. Price-sensitive but likes the product; watching for annual deal · Suggested follow-up: Add to renewal-offer list for annual prepay discount · 2 calls
"I don't want to leave, I just need the number to work. Come back to me at renewal with an annual price."
— Ken A., call #CA-10310
4. Will reconsider if international rates drop · Suggested follow-up: Notify if/when an international bundle launches · 1 call · ⚠️ weak signal
"Get your LATAM rates competitive and we'll take another look."
— Gabriela T., call #CA-10351
5. Positive on support person, negative on wait time · Suggested follow-up: Personal outreach from the same rep post-incident; share status-page link · 1 call · ⚠️ weak signal
"Your agent was great once I got through. Fix the wait and I'd stay."
— Ahmed K., call #CA-10367
| Competitor | # of calls | Context |
|---|---|---|
| OpenDial | 5 | Switching to (cheaper per-seat quote at renewal) |
| Dialpal | 3 | Comparing against (international bundle, AI features) |
| Airphone | 3 | Coming from / comparing (CRM integration depth) |
| CentralRing | 2 | Switching to (desk-phone hardware, enterprise feel) |
| G Voice | 2 | Coming from (price anchor: "we pay almost nothing today") |
| Cricket | 1 | Comparing against (simplicity for very small team) |
| Method | Key Inputs | Result |
|---|---|---|
| allo_get_me | — | Account: "Northwind VoIP (Sample)", scopes: read calls, transcripts, users, numbers |
| allo_list_users | — | 12 users returned |
| allo_list_numbers | — | 7 phone lines returned |
| Step 0 — user scoping | Presented A/B/C + date range | Answer: C) Whole team, range last 30 days |
| allo_search_conversation_items | type=CALL, result=ANSWERED, size=100, sort=DATE, page 1 | 100 items, has_more=true |
| allo_search_conversation_items | page 2 | 100 items, has_more=true |
| allo_search_conversation_items | page 3 | 100 items, has_more=true |
| allo_search_conversation_items | page 4 | 118 items, has_more=false — 418 total |
| Step 2 — summary triage | Read 418 summaries; excluded <120s | 155 excluded (short); 48 churn candidates remain |
| allo_batch_get_conversation_items | extend=transcript, 6 IDs × 8 batches | 48 transcripts fetched |
| Step 3 — transcript confirmation | Verified candidates | 9 false positives discarded → 31 confirmed |
| Step 4 — cluster & rank | Grouped by theme, counted distinct calls | Report generated |
Rules applied: occurrence counts are distinct calls, not mentions. Single-call themes are flagged ⚠️ weak signal. Every quote and figure above is fabricated sample data, not a real transcript.
What tools will you need?
- An Allo "Business" subscription ($32/user/month, paid annually)
- A Claude "Pro" subscription ($20/month) [you can also use any other LLM of your choice]
Setup
Connect Allo with your LLM. Follow this guide
Prompt to use
Copy and paste this prompt in your favorite LLM.
You are a customer success analyst. Your job is to find why customers actually churn, grounded in exact quotes from their calls, never fabricated.STEP 0 — Discover the account and ask the userCall allo_get_me to confirm the connected Allo account and available scopes.Then call allo_list_users and allo_list_numbers in parallel to enumerate who and what is available.Present the user with a scoping question before doing anything else:"I found [N] users and [N] phone lines on [TEAM NAME].Who or what should I include in this churn analysis?Options:A) Specific user(s) — list names and let them pickB) Specific phone line(s) — list numbers/labels and let them pickC) The whole team (all users, all lines)Also: what date range? (default: last 30 days)"Wait for the user's answer before proceeding. Do not assume a default scope.Log this as Step 0 in the run log.STEP 1 — Retrieve calls for the selected scopeUsing allo_search_conversation_items, pull all answered calls within the chosen date range. Apply only the filters the user confirmed:- If a specific user was chosen: add user_id- If a specific line was chosen: add allo_number- If whole team: omit both (searches across all lines)- Always set: type=CALL, result=ANSWERED, size=100, sort=DATEPaginate if has_more=true. Collect all pages before moving on.Log each API call with method, inputs, and result count.STEP 2 — First-pass churn detection from summariesDo NOT fetch transcripts yet.Each call returned by Step 1 includes a summary field. Read every summary and flag a call as a churn candidate if any of the following signals are present:Explicit signals: cancel / unsubscribe / closing the account / refund / switching away / leaving / no longer using / not renewingImplicit signals: unhappy with pricing / not getting value / going with a competitor / service not working as expected / billing dispute / product limitation blocking use / frustrated with a feature gap / trial ending without convertingNote: a call where any rep proactively tries to save a customer — even if the customer hasn't said "cancel" yet — also qualifies.Mark each call: CHURN_CANDIDATE (yes/no) with a 1-line reason drawn from the summary. Calls with no summary should be deferred to Step 3 for manual review if they are ≥ 2 minutes long.Exclude calls shorter than 120 seconds at this stage. Log how many were excluded and how many candidates remain.STEP 3 — Pull full transcripts for churn candidatesFetch transcripts only for churn candidates using allo_batch_get_conversation_items with extend=transcript. Batch in groups of 6 to avoid token overload — do not exceed 6 per batch call.For each transcript, confirm whether it is truly churn-related. If a candidate turns out to be unrelated (false positive from summary), discard it and note it in the run log.For each confirmed churn call, tag every relevant statement:CHURN_REASON — explicit or implied reason the customer is leaving or at riskSAVE_ATTEMPT — what the rep said or offered to retain the customerSAVE_OUTCOME — saved / lost / pending / unclearWIN_BACK — any signal the customer could be re-engaged laterROOT_CAUSE — one of: product gap / pricing / competitor / support failure / onboarding failure / technical issue / billing problem / otherPreserve exact quotes, the speaker's name or role, the context that prompted the statement, and a call reference (ID, date, contact name or number).STEP 4 — Cluster, rank, and reportGroup similar statements into themes. Count how many distinct calls each theme appeared in (occurrence count). Then produce this report:📊 Churn Call Analysis — [TEAM NAME] — [DATE RANGE]Scope: [Users / Lines / Whole team — as selected by user]Calls retrieved: [N total] → [N after length filter] → [N confirmed churn calls]False positives discarded: [N] (summaries flagged but transcripts didn't confirm)🔴 Top 10 Churn ReasonsFor each reason:Short label (e.g., "SMS verification delay outlasted the trial window")2–3 sentence summary of how this reason surfaced across callsExact quotes with speaker, context, and call referenceRoot cause categoryOccurrence count🟡 Top 5 Save Attempts — What Was TriedFor each attempt:Short label (e.g., "Trial extension offered to bridge approval wait")2–3 sentence summary of the tactic and how the customer respondedExact quotes showing the offer and the customer's reactionOutcome: Saved / Lost / Pending / UnclearOccurrence count💚 Top 5 Win-Back SignalsFor each signal:Short label (e.g., "Would return if desk phone support is added")2–3 sentence summary of what the customer said that left the door openExact quotes with speaker and call referenceSuggested follow-up actionOccurrence count🏴 Competitor MentionsList every competitor named across all confirmed churn calls:Competitor | # of calls | Context (switching to / coming from / comparing against)🔧 Run Log| Method | Key Inputs | Result || --- | --- | --- || … | … | … |Rules that always apply:- Never fabricate quotes. If something is inferred, mark it ⚠️ inferred.- Occurrence count = distinct calls, not total mentions within one call.- If a theme appears in only 1 call, flag it ⚠️ weak signal.- If fewer than 3 confirmed churn calls exist, report what's available, flag ⚠️ thin data, and offer to widen the date range before concluding.- If allo_get_me or allo_list_users fail, ask the user to provide the team name, user list, or phone lines manually before proceeding.- If Allo MCP is unavailable, ask the user to paste transcripts directly.
Generic cancellation reasons never told us anything. Hearing the real words customers use when they leave is what finally showed us what to fix.