I Measured How Long
Eastlink Hold Times Are
A Python + Twilio experiment to quantify just how long Eastlink makes you wait on hold.
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
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
<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.)
System Flow
- 1Scheduler triggers Flask server during business hours (8 AM - 6 PM AST)
- 2Twilio API initiates call to Eastlink: +1 (888) 345-1111
- 3TwiML navigates phone tree with DTMF tones: 3 → 1 → 1
- 4Call enters hold queue — timer starts counting
- 5Agent answers, hears silence, disconnects (sorry, agents)
- 6Duration appended to JSON file with timestamp
- 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.
EastLink Customer Support
+1 (888) 345-1111
Current Wait Time
Last updated: 1:16:24 AM
Hours
8AM - 6PM
Status
Closed

*Screenshot from the slowest day of the week, peak wait time ~64 minutes
Average Wait Times
Aggregated over one week in July 2023
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.
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.
Brian Stever