Case Study
July 2023

I Measured How Long
Eastlink Hold Times Are

A Python + Twilio experiment to quantify just how long Eastlink makes you wait on hold.

Python
Flask
Twilio
Next.js
Chart.js

The Problem

Two Hours. On Hold. To Cancel Cable.

My mom spent two hours on hold trying to cancel her Eastlink service. Two hours of hold music. Two hours of "Your call is important to us." Two hours of her life, gone forever, absorbed by the void of Canadian telecom customer service.

She eventually gave up. And look, I get it — telecom companies aren't exactly known for their stellar customer service. But two hours? That's not a hold time, that's a hostage situation. That's longer than most movies. You could watch the entire first Lord of the Rings and still have time for bathroom breaks.

When she told me about it, my first thought was: "That can't be right." My second thought was: "I bet I can find out."

I already had some experience with Twilio's telephony API from previous projects. The idea was simple: what if I built something to call Eastlink automatically, navigate their phone tree, and measure exactly how long it takes to reach a human? No anecdotes. No exaggeration. Just cold, hard data on how long these billion-dollar companies make their customers wait.

The Results

What the Data Revealed

0 min
Peak Wait Time
0x
Calls Per Day
~0 PM
Worst Time to Call

The Implementation

Automating the Phone Tree

Anyone who's called a big company knows the drill: "Press 1 for English. Press 2 for French. Press 3 to slowly lose the will to live." Before I could measure hold times, I needed to get the bot past the gatekeepers.

This meant calling the line myself (yes, I suffered for this project) and mapping out every menu option. Eastlink's tree goes three levels deep before you hit the queue. The sequence I needed was 3 → 1 → 1: English, Residential, then Cancel Service. Twilio's TwiML lets you send DTMF tones with precise timing — the bot presses the buttons faster than any human could.

Phone Tree Simulator

TWILIO BOT v1.0
Dialing +1 (888) 345-1111...
TwiML sent to Twilio:
<Response>
  <Pause length="45"/>
  <Play digits="3"/>    <!-- Technical Support -->
  <Pause length="25"/>
  <Play digits="1"/>    <!-- Internet Issues -->
  <Pause length="40"/>
  <Play digits="1"/>    <!-- Speak with Agent -->
  <Pause length="99999"/> <!-- Wait forever... -->
</Response>

Architecture

How It All Connects

Here's where it gets interesting. The bot can't actually talk to anyone — it just sits there in silence. So how do you know when a human picks up? You don't, really. You wait for them to hang up on you.

When a customer service rep answers and hears dead air, they wait a few seconds, say "Hello?" a couple times, then disconnect. That disconnection event is what the bot is actually measuring. It's not elegant, but it works — and the Eastlink agents probably assume it's just another dropped call. (Sorry, Eastlink agents. You're not the enemy here.)

Twilio Bot
Calls Eastlink
Waits on Hold
Rep Hangs Up
Track Time
Pretty Graphs

System Flow

  1. 1Scheduler triggers Flask server during business hours (8 AM - 6 PM AST)
  2. 2Twilio API initiates call to Eastlink: +1 (888) 345-1111
  3. 3TwiML navigates phone tree with DTMF tones: 3 → 1 → 1
  4. 4Call enters hold queue — timer starts counting
  5. 5Agent answers, hears silence, disconnects (sorry, agents)
  6. 6Duration appended to JSON file with timestamp
  7. 7Next.js dashboard polls for updates and renders charts

The Dashboard

Visualizing the Wait

Raw timestamps in a JSON file aren't exactly riveting. The fun part was building a dashboard to display the data — something my mom could actually use to plan her next (hopefully shorter) call attempt.

The frontend polls the Flask backend every 30 seconds. When a new data point comes in, it animates onto the chart. I used Chart.js with some custom styling to make it look less like a spreadsheet and more like something you'd actually want to look at.

LIVE DEMO

EastLink Customer Support

+1 (888) 345-1111

Current Wait Time

42m 27s

Last updated: 1:16:24 AM

Hours

8AM - 6PM

Status

Closed

Eastlink Call Wait Timer UI
Click to enlarge

*Screenshot from the slowest day of the week, peak wait time ~64 minutes

Average Wait Times

Aggregated over one week in July 2023

Minutes on hold
Peak recorded: 2.5 hours at 3 PM

Challenges

What Went Wrong (A Lot)

I'd love to tell you this worked perfectly on the first try. It did not. Building something that interacts with the real phone network has a lot of edge cases you don't think about until your Twilio bill hits $40 and you realize the bot was calling at 3 AM when no one was there to answer.

Per-Minute Billing

Twilio charges per minute of call time. A 2.5-hour hold = $1.50+ per call.

Hover to see solution →

Solution

Set up budget alerts and limited call frequency. Still cheaper than actually waiting on hold myself.

Business Hours Detection

Off-hours calls just hit a recording. Wasted money, no useful data.

Hover to see solution →

Solution

Implemented a scheduler that respects AST business hours (8 AM - 6 PM, Mon-Fri).

Phone Tree Navigation

The IVR system requires specific DTMF sequences to reach the right queue.

Hover to see solution →

Solution

Reverse-engineered the menu structure: Press 3 (English), 1 (Residential), 1 (Cancel).

Call End Detection

How do you detect when a human picks up vs. when you're still on hold?

Hover to see solution →

Solution

The bot stays silent. When an agent answers and hears nothing, they disconnect. That timestamp = hold time.

Findings

So, Did It Help?

Kind of! The data confirmed what most of us already suspected: early morning is the sweet spot. Calls placed at 8 AM averaged 3-5 minutes of hold time. Calls at 2:30 PM? Closer to an hour. The difference is staggering when you see it on a chart.

My mom eventually did cancel her Eastlink service — she called at 8:15 AM and was off the phone in under 10 minutes. Mission accomplished, I guess? Though I suspect Eastlink's retention department wishes I'd kept this information to myself.

Best Time to Call

8:00 AM

Average wait: 3-5 minutes

Worst Time to Call

3:00 PM

Peak recorded: 2.5 hours

Is this a groundbreaking project? Not really. It's a bot that calls a phone number and waits. But there's something satisfying about using technology to expose the small indignities of modern life — the ones we've all just accepted as normal. Maybe you shouldn't have to wait an hour to cancel a service you're paying for. Just a thought.

If you want to build something similar for your own regional telecom, the stack is straightforward: Python Flask for the backend, Twilio for the calls, and Next.js for the dashboard. Fair warning: it'll cost you a few dollars in Twilio credits. But it might save you a few hours of your life. That's a pretty good trade.

BS

Brian Stever

View ResumeMore Projects