<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://floorwalker.dev/docs/blog</id>
    <title>Floor Walker blog</title>
    <updated>2026-10-24T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://floorwalker.dev/docs/blog"/>
    <subtitle>Running a contact center on Twilio Flex: outbound pacing, screen recording and reporting.</subtitle>
    <icon>https://floorwalker.dev/docs/img/favicon.svg</icon>
    <rights>Copyright © 2026 Floor Walker</rights>
    <entry>
        <title type="html"><![CDATA[Twilio Flex reporting without Flex Insights: one set of definitions]]></title>
        <id>https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights</id>
        <link href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights"/>
        <updated>2026-10-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Why live wallboards and next-day reports disagree on Twilio Flex, and how one set of metric definitions, per-queue service levels and IVR journeys fix it.]]></summary>
        <content type="html"><![CDATA[<p>Historical reporting is the part of Twilio Flex that contact center teams ask us about most. The questions are rarely about missing charts. They are about trust: the wallboard said 82% service level at 4 p.m., the report the next morning says 77%, and nobody can explain the difference.</p>
<p>This post covers the decisions behind Floor Walker Reports and what they mean for the people who run a contact center on Flex.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-flex-reporting-gets-hard">Where Flex reporting gets hard<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#where-flex-reporting-gets-hard" class="hash-link" aria-label="Direct link to Where Flex reporting gets hard" title="Direct link to Where Flex reporting gets hard">​</a></h2>
<p>Flex's built-in historical reporting is Flex Insights. It is a reasonable choice for many teams, and it is included in Flex's paid plans. According to Twilio's documentation, a few of its properties shape what you can do with it:</p>
<ul>
<li><strong>Data refreshes every 60 minutes.</strong> Today's report lags the floor by up to an hour.</li>
<li><strong>Custom data has fixed slots.</strong> Up to ten custom conversation attributes and ten measures, with values cut at 128 characters.</li>
<li><strong>The service level threshold is global by default</strong> (60 seconds) and is changed through Twilio support; per-queue thresholds need custom metrics in its own analytics language.</li>
<li><strong>It is built around TaskRouter tasks.</strong> What a caller does in the IVR before a task exists is not part of the picture unless flows are built to create tasks for it.</li>
<li><strong>Its service level settings apply to historical reporting</strong>, not to Flex's real-time queue view.</li>
</ul>
<p>Together they mean two screens can count the same contact center differently, and changing a target is not a supervisor's job.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="one-feed-for-live-and-historical-numbers">One feed for live and historical numbers<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#one-feed-for-live-and-historical-numbers" class="hash-link" aria-label="Direct link to One feed for live and historical numbers" title="Direct link to One feed for live and historical numbers">​</a></h2>
<p>The most important decision: the live wallboard and the historical reports read the same events. Twilio sends the contact center's TaskRouter and Studio events to Floor Walker as they happen, through Event Streams in your Twilio account. The wallboard, the supervisor console and the reports are all built from that one feed, so a call shows up in today's report seconds after it ends.</p>
<p>From those events Floor Walker keeps four kinds of records:</p>
<ul>
<li><strong>Queue visits and agent legs:</strong> every time a task waits in a queue, and every agent's part of it (ring, talk, hold, wrap-up).</li>
<li><strong>Contacts:</strong> one record per customer contact, end to end, across transfers.</li>
<li><strong>IVR and bot journeys:</strong> every Studio execution, step by step, joined to its contact.</li>
<li><strong>15-minute intervals</strong> per queue and per agent, including time in each agent activity.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="decide-every-rule-once">Decide every rule once<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#decide-every-rule-once" class="hash-link" aria-label="Direct link to Decide every rule once" title="Direct link to Decide every rule once">​</a></h2>
<p>The business rules are decided once, when each contact is stored, not in each report. Every queue visit knows whether it was offered, how it ended (answered, abandoned, short abandon, transferred), how long the customer waited, and whether it counted toward service level and was within it.</p>
<p>That makes the definitions short and explicit:</p>
<ul>
<li><strong>Offered</strong> is a customer-initiated inbound contact entering a queue. Outbound calls and transfer legs are not offered, so they do not inflate answered or service level.</li>
<li><strong>Short abandons</strong>, callers who hang up within a few seconds, are not abandons and are left out of service level.</li>
<li><strong>Service level</strong> is contacts answered within the queue's threshold, divided by answered plus abandoned.</li>
<li>Contacts count in the period in which they started, in the report's time zone.</li>
</ul>
<p>Because the rules are part of the stored record, every metric is a plain count, sum or ratio, and anyone who counts the same way gets the same answer, including your analysts in their own tools.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="one-set-of-metric-definitions-everywhere">One set of metric definitions, everywhere<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#one-set-of-metric-definitions-everywhere" class="hash-link" aria-label="Direct link to One set of metric definitions, everywhere" title="Direct link to One set of metric definitions, everywhere">​</a></h2>
<p>Every metric is defined once, with its name, its formula, a plain-language description and whether higher is better. The same definitions drive the <strong>wallboards</strong> on the TVs, the <strong>supervisor console</strong>, the <strong>reports</strong> and report builder, <strong>exports</strong> and <strong>scheduled emails</strong>, and <strong>Ask AI</strong> and the <strong>MCP server</strong> for AI assistants. So "abandoned" means the same thing on the wall at 4 p.m. and in the monthly review, and the same metric over the same period is the same number on every screen. It sounds obvious; in practice it is what ends the morning argument about whose number is right.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="service-level-per-queue-applied-to-history">Service level per queue, applied to history<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#service-level-per-queue-applied-to-history" class="hash-link" aria-label="Direct link to Service level per queue, applied to history" title="Direct link to Service level per queue, applied to history">​</a></h2>
<p>A sales line might aim for 80% in 20 seconds, a collections queue for 90% in 60. In Floor Walker each queue has its own threshold, target and short-abandon time, set by supervisors in one screen, with defaults of 20 seconds, 80% and 5 seconds. There are no separate service level settings on the wallboard or in the console: they read the same values.</p>
<p>When a supervisor changes a queue's threshold, that queue's stored contacts are re-evaluated with the new value, and the confirmation says how many were affected. Last month's report then uses today's definition.</p>
<p>That is a deliberate trade-off: a spreadsheet exported last week can differ from the same report run today. We chose "one definition everywhere" over "numbers frozen when they were run", because comparing this month with last month only works if both are counted the same way.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-ivr-in-the-same-report">The IVR in the same report<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#the-ivr-in-the-same-report" class="hash-link" aria-label="Direct link to The IVR in the same report" title="Direct link to The IVR in the same report">​</a></h2>
<p>Every Studio execution, an IVR call or a bot conversation, becomes a journey with one step per widget, joined to the contact. Each journey ends in one of a few ways: handed to an agent, contained (the flow finished without an agent), abandoned in the IVR, or an error.</p>
<p>That gives containment rate, IVR abandon rate and the menu step where callers hang up, next to queue metrics, without changing flows. Two details matter in practice:</p>
<ul>
<li><strong>Caller input is not stored by default</strong>, because digits and speech can hold card or ID numbers. You can choose specific widgets, such as a main menu, whose input is kept and used for grouping.</li>
<li><strong>Milestones</strong> add meaning a widget cannot carry: "the caller heard their balance", "the bot detected a billing intent". A milestone named for self-service resolution also marks the journey as contained.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="custom-fields-without-slots">Custom fields without slots<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#custom-fields-without-slots" class="hash-link" aria-label="Direct link to Custom fields without slots" title="Direct link to Custom fields without slots">​</a></h2>
<p>Any task attribute can become a report field: a customer tier, a product line, a region. It can be grouped and filtered like any built-in dimension. There is no fixed number of fields and no length limit, and because the values are read from the stored task data, a new field works for history too.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-the-data-out">Getting the data out<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#getting-the-data-out" class="hash-link" aria-label="Direct link to Getting the data out" title="Direct link to Getting the data out">​</a></h2>
<p>A reporting tool should be easy to leave, so the data is open from the start:</p>
<ul>
<li><strong>Saved reports</strong> keep their metrics, groupings, filters and period. A relative period such as "last week" is worked out each time the report runs. Reports are private by default and can be shared with every supervisor.</li>
<li><strong>Email schedules</strong> send a saved report daily, weekly or monthly as Excel or CSV, to up to 50 recipients.</li>
<li><strong>Exports</strong> of any report to Excel or CSV, with queues and agents by name.</li>
<li><strong>Nightly open data files</strong> of every report data set in Parquet and CSV, laid out by date so a data warehouse can pick them up.</li>
<li><strong>A read-only reporting connection</strong> for Power BI, Tableau, Looker or Metabase, and a reporting API for your own applications.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ask-ai-and-mcp">Ask AI and MCP<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#ask-ai-and-mcp" class="hash-link" aria-label="Direct link to Ask AI and MCP" title="Direct link to Ask AI and MCP">​</a></h2>
<p><strong>Ask AI</strong> answers questions such as "which queue had the worst service level last week?". The model plans up to three structured queries against the metric definitions; they run like any report, with the asking user's permissions, and a second step writes the answer from the numbers that came back. The model never writes code or database queries, and every answer shows the queries it ran.</p>
<p>The <strong>MCP server</strong> gives AI assistants such as Claude the same access: list the metrics and their definitions, run a query, ask a question, search contacts and open one contact end to end, from the IVR to the AI summary of the call.</p>
<p>Permissions are the same everywhere: agents see only their own numbers in reports, exports, Ask AI and MCP alike, checked on every request.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-to-start-and-what-you-keep">Where to start, and what you keep<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#where-to-start-and-what-you-keep" class="hash-link" aria-label="Direct link to Where to start, and what you keep" title="Direct link to Where to start, and what you keep">​</a></h2>
<p>TaskRouter keeps 30 days of events, so at switch-on Floor Walker can import the last 30 days and you start with a month of history. IVR journeys and hold times begin from the day the live feed is connected, and anything older stays in Flex Insights or its export. Report data is kept for 25 months by default, in the Floor Walker environment you chose: hosted by us, or in your own cloud or data center.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="faq">FAQ<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="can-i-replace-flex-insights-for-twilio-flex-reporting">Can I replace Flex Insights for Twilio Flex reporting?<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#can-i-replace-flex-insights-for-twilio-flex-reporting" class="hash-link" aria-label="Direct link to Can I replace Flex Insights for Twilio Flex reporting?" title="Direct link to Can I replace Flex Insights for Twilio Flex reporting?">​</a></h3>
<p>Yes. Flex can send its TaskRouter and Studio events through Event Streams as they happen, so a reporting product can count the same contacts with your own definitions. Floor Walker Reports does that and imports the last 30 days when you start.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-i-report-on-ivr-and-studio-flows-in-twilio-flex">How do I report on IVR and Studio flows in Twilio Flex?<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#how-do-i-report-on-ivr-and-studio-flows-in-twilio-flex" class="hash-link" aria-label="Direct link to How do I report on IVR and Studio flows in Twilio Flex?" title="Direct link to How do I report on IVR and Studio flows in Twilio Flex?">​</a></h3>
<p>Treat every Studio execution as a journey: store each widget step and how it ended, and join it to the contact. That gives containment, IVR abandons and menu drop-off without adding tasks to every flow.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-i-keep-wallboard-and-historical-report-numbers-consistent">How do I keep wallboard and historical report numbers consistent?<a href="https://floorwalker.dev/docs/blog/twilio-flex-reporting-without-flex-insights#how-do-i-keep-wallboard-and-historical-report-numbers-consistent" class="hash-link" aria-label="Direct link to How do I keep wallboard and historical report numbers consistent?" title="Direct link to How do I keep wallboard and historical report numbers consistent?">​</a></h3>
<p>Feed both from the same events and count with the same definitions. In Floor Walker the wallboard, the supervisor console and the reports share one set of metric definitions and one per-queue service level setting, so the same metric over the same period is the same number everywhere.</p>
<hr>
<p>Floor Walker adds live and historical reporting, a wallboard, a supervisor console, a predictive dialer and per-task screen recording to Twilio Flex, hosted by us or installed in your own cloud or data center. Read the reports docs at <a href="https://floorwalker.dev/docs/reports" target="_blank" rel="noopener noreferrer">https://floorwalker.dev/docs/reports</a>.</p>
<p>Book a demo: <a href="mailto:hello@floorwalker.dev" target="_blank" rel="noopener noreferrer">hello@floorwalker.dev</a></p>]]></content>
        <author>
            <name>Pavel Kharakh</name>
            <email>hello@floorwalker.dev</email>
            <uri>https://floorwalker.dev</uri>
        </author>
        <category label="Twilio Flex" term="Twilio Flex"/>
        <category label="Reporting" term="Reporting"/>
        <category label="Analytics" term="Analytics"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Pacing a predictive dialer on Twilio Flex]]></title>
        <id>https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex</id>
        <link href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex"/>
        <updated>2026-10-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How our dialer decides how many calls to place each second, keeps customer waits under a 3% target, handles answering machines and hands calls to Flex.]]></summary>
        <content type="html"><![CDATA[<p>Every outbound dialer answers one question, many times a minute: how many numbers should we dial right now? Dial too few and agents sit idle listening to ringing. Dial too many and a customer says "hello" to silence because no agent is free.</p>
<p>Twilio provides the building blocks: voice calls, answering machine detection (AMD), task routing and Flex. It does not decide how many calls to place. This post explains how the Floor Walker dialer makes that decision, and what it means for the people running a campaign and the customers it calls.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="who-waits-four-dialing-modes">Who waits: four dialing modes<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#who-waits-four-dialing-modes" class="hash-link" aria-label="Direct link to Who waits: four dialing modes" title="Direct link to Who waits: four dialing modes">​</a></h2>
<p>Each mode is a choice about who waits: an agent listening to ringing, or a customer who answered.</p>
<table><thead><tr><th>Mode</th><th>Rule</th><th>Who waits</th></tr></thead><tbody><tr><td>Preview</td><td>The agent sees the lead, then dials</td><td>The agent</td></tr><tr><td>Progressive</td><td>One call per free agent</td><td>The agent</td></tr><tr><td>Power</td><td>Dials ahead for free agents, minus a safety margin</td><td>Sometimes the customer</td></tr><tr><td>Predictive</td><td>Like power, plus agents about to finish a call</td><td>Sometimes the customer</td></tr></tbody></table>
<p>Progressive is the default. Power and predictive raise agent utilization by dialing ahead, and accept that a customer occasionally answers when no agent is free.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="agent-first-or-customer-first">Agent first or customer first<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#agent-first-or-customer-first" class="hash-link" aria-label="Direct link to Agent first or customer first" title="Direct link to Agent first or customer first">​</a></h2>
<p>The mode also decides who is put on the line first.</p>
<p><strong>Agent first</strong> (preview, progressive, and callbacks an agent dials). The dialer reserves a free agent, puts them on the line, and only then dials the customer. The customer hears a person right after "hello": in our live test the silence was about 0.3 seconds, against about 3.2 seconds customer first. It also closes a gap: while a customer's phone rings, an agent who is only expected to take the call still looks free to Flex, and another call can take them. Agent first holds the agent from the start. The cost is agent time: the agent listens to every ring, and each dial uses two calls.</p>
<p><strong>Customer first</strong> (power and predictive). The customer is dialed first; when a person answers, the call goes to the first free agent on the campaign. Because these modes open more lines than there are free agents, they cannot hold an agent for every line.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-power-and-predictive-decide-how-many-to-dial">How power and predictive decide how many to dial<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#how-power-and-predictive-decide-how-many-to-dial" class="hash-link" aria-label="Direct link to How power and predictive decide how many to dial" title="Direct link to How power and predictive decide how many to dial">​</a></h2>
<p>Every second, and right after an agent frees up, the dialer works out for each campaign how many new calls to place. Due callbacks take that budget first; regular leads get the rest. Three things go into it:</p>
<ul>
<li><strong>Expected answers.</strong> How many people are likely to answer the calls already ringing, from the campaign's own answer rate and how long its customers take to pick up, both learned from its recent calls.</li>
<li><strong>Free and soon-free agents.</strong> Power dials only for agents who are free now. Predictive also counts agents expected to finish their call and wrap-up within the time it takes to reach a customer. That forecast is the whole difference between the two.</li>
<li><strong>Ramp-up.</strong> A campaign that starts or resumes runs as progressive for a minute, then ramps up over three, so answers don't arrive in one wave.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-safety-margin-measured-in-agents">A safety margin measured in agents<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#a-safety-margin-measured-in-agents" class="hash-link" aria-label="Direct link to A safety margin measured in agents" title="Direct link to A safety margin measured in agents">​</a></h2>
<p>The dialer never dials for every agent it expects to be free. It keeps a <strong>safety margin, counted in agents</strong>, and adjusts it continuously.</p>
<p>We count it in agents rather than as an overdial ratio because the risk behaves that way: with 50 agents a few extra answers almost always find someone; with 12 they collide. It starts at about a quarter of the team (at least one agent, at most six):</p>
<table><thead><tr><th>Situation</th><th>What the dialer does</th></tr></thead><tbody><tr><td>Recent answered calls waited longer than the target allows</td><td>Raises the margin: dials less</td></tr><tr><td>Waits stay well under the target</td><td>Lowers the margin a little: dials more</td></tr><tr><td>Waits exceed four times the target</td><td>Safety breaker: raises the margin, runs the campaign as progressive for five minutes and alerts supervisors</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-counts-as-a-missed-wait">What counts as a missed wait<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#what-counts-as-a-missed-wait" class="hash-link" aria-label="Direct link to What counts as a missed wait" title="Direct link to What counts as a missed wait">​</a></h2>
<p>The margin steers by the campaign's <strong>missed-wait target</strong>, 3% by default: the share of answered calls that waited longer than normal for an agent, hung up while waiting, or reached the hold limit.</p>
<p>"Longer than normal" matters. Even with a free agent, connecting a customer to an agent working in a browser takes a few seconds, about 3.5 in our live measurements. That is not a sign of too few agents, so the dialer learns each campaign's normal connect time, adds two seconds of grace, and counts a miss only beyond that.</p>
<p>3% also appears in some regulators' rules for predictive dialing, but their definitions of an abandoned call differ from country to country and from ours. The target is a campaign setting; confirm the rules for your campaigns with counsel.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="hold-dont-hang-up">Hold, don't hang up<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#hold-dont-hang-up" class="hash-link" aria-label="Direct link to Hold, don't hang up" title="Direct link to Hold, don't hang up">​</a></h2>
<p>Some dialers hang up on a customer who answers when no agent is free. Ours does not: someone you called is better served by a short, explained wait.</p>
<table><thead><tr><th>Time after "hello"</th><th>What the customer hears</th></tr></thead><tbody><tr><td>Up to the normal connect time</td><td>Silence. Most customers are connected here</td></tr><tr><td>Plus two seconds</td><td>Still silence: a message cut off by the agent's "hello" sounds like a fault</td></tr><tr><td>After that</td><td>A message saying who is calling and that an agent is joining, then hold music. Without music the message repeats, so there is never dead air</td></tr><tr><td>90 seconds</td><td>An apology and a promise to call back. The callback is booked automatically and the attempt is not counted</td></tr></tbody></table>
<p>The messages and the music are set per campaign.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-small-teams-should-use-progressive">Why small teams should use progressive<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#why-small-teams-should-use-progressive" class="hash-link" aria-label="Direct link to Why small teams should use progressive" title="Direct link to Why small teams should use progressive">​</a></h2>
<p>Dialing ahead works because, across many agents, someone is almost always about to become free. Below 12 active agents, power and predictive fall back to progressive on their own: in our simulator, holding a 3% target with 10 agents needed a margin of about 40% of the team. The real benefit starts at around 15 agents.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="answering-machines">Answering machines<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#answering-machines" class="hash-link" aria-label="Direct link to Answering machines" title="Direct link to Answering machines">​</a></h2>
<p>AMD is set per campaign, and it trades agent time against the customer's first seconds:</p>
<ul>
<li><strong>Synchronous AMD</strong> (the default) decides human or machine before the call is connected. Voicemail never reaches agents, at the cost of about two seconds of extra silence for a real person.</li>
<li><strong>Asynchronous AMD</strong> connects at once and drops machines when the result arrives. No extra silence, but slow-to-detect voicemail reaches an agent, flagged with a warning.</li>
</ul>
<p>AMD is off on agent-first calls: the agent hears the greeting and can leave a message.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="calling-windows-calendars-and-do-not-call">Calling windows, calendars and do-not-call<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#calling-windows-calendars-and-do-not-call" class="hash-link" aria-label="Direct link to Calling windows, calendars and do-not-call" title="Direct link to Calling windows, calendars and do-not-call">​</a></h2>
<p>Every number is checked when the dialer picks the lead and again at dial time. Two questions decide whether it may be called:</p>
<ul>
<li><strong>Calling windows:</strong> is it too late to call this person? Evaluated in the lead's own time zone.</li>
<li><strong>The contact center calendar:</strong> are we open? Weekly hours, holidays and special events, from the same calendar your IVR uses for opening hours.</li>
</ul>
<p>A lead is called only when both are open; otherwise it is postponed, not dropped, to the next moment when both are. A campaign whose calendar has never loaded does not dial at all. Do-not-call lists and attempt limits are checked in the same pass.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-call-in-flex">The call in Flex<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#the-call-in-flex" class="hash-link" aria-label="Direct link to The call in Flex" title="Direct link to The call in Flex">​</a></h2>
<p>A customer who answers reaches the agent as an ordinary Flex voice task in the campaign's own queue, so hold, transfer and call recording work as usual. The task is accepted automatically, and the agent sees a <strong>lead card</strong> with the customer's name, number, campaign and the lead details your administrator chose to show.</p>
<p>After the call the agent picks a <strong>disposition</strong>: success, closed, try again later, callback (for themselves or anyone on the team), do not call, or invalid number. It decides what happens to the lead next. Calls that rang out or were busy never reach an agent; they are retried by the campaign's rules.</p>
<p>One detail matters for pacing: the dialer only dials for free agents, so an agent who leaves a task in wrap-up quietly drops out of the campaign. An optional automatic wrap-up closes the task a set number of seconds after the disposition is saved.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-the-simulator-shows">What the simulator shows<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#what-the-simulator-shows" class="hash-link" aria-label="Direct link to What the simulator shows" title="Direct link to What the simulator shows">​</a></h2>
<p>We test pacing in a simulator with virtual agents and phone lines: 120-minute runs, synchronous AMD, a 3% target, a connect time of 3.5 seconds give or take 0.7, and a 25% chance that a call reaches a person. Average agent utilization over two runs:</p>
<table><thead><tr><th>Team</th><th>Progressive</th><th>Predictive</th></tr></thead><tbody><tr><td>20 agents</td><td>73.9%</td><td>79.1%</td></tr><tr><td>50 agents</td><td>73.0%</td><td>89.1%</td></tr></tbody></table>
<p>In those runs predictive held the missed-wait rate between 2.9% and 3.2%, and no customer reached the 90-second limit. These are simulator results, not production traffic; the estimates settle over a campaign's first few hundred real calls.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="faq">FAQ<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="does-twilio-flex-include-a-predictive-dialer">Does Twilio Flex include a predictive dialer?<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#does-twilio-flex-include-a-predictive-dialer" class="hash-link" aria-label="Direct link to Does Twilio Flex include a predictive dialer?" title="Direct link to Does Twilio Flex include a predictive dialer?">​</a></h3>
<p>No. Flex lets agents place outbound calls, but pacing, answering machine handling, retries and calling-hour rules have to be built on top of Twilio or added with a product such as Floor Walker.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-a-predictive-dialer-keep-the-abandon-rate-under-3">How does a predictive dialer keep the abandon rate under 3%?<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#how-does-a-predictive-dialer-keep-the-abandon-rate-under-3" class="hash-link" aria-label="Direct link to How does a predictive dialer keep the abandon rate under 3%?" title="Direct link to How does a predictive dialer keep the abandon rate under 3%?">​</a></h3>
<p>It dials ahead from answer rates learned per campaign, keeps a safety margin of agents, and adjusts that margin by watching how many answered customers waited too long. If waits overshoot badly, it falls back to progressive for a few minutes.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="when-should-i-use-progressive-instead-of-predictive-dialing">When should I use progressive instead of predictive dialing?<a href="https://floorwalker.dev/docs/blog/pacing-predictive-dialer-twilio-flex#when-should-i-use-progressive-instead-of-predictive-dialing" class="hash-link" aria-label="Direct link to When should I use progressive instead of predictive dialing?" title="Direct link to When should I use progressive instead of predictive dialing?">​</a></h3>
<p>With small teams (below about 12 to 15 agents), or when every customer must reach a person right after "hello". Predictive pays off for larger teams with low contact rates.</p>
<hr>
<p>Floor Walker adds a predictive dialer, per-task screen recording, a CRM and live and historical reporting to Twilio Flex, hosted by us or installed in your own cloud or data center. Read the dialer docs at <a href="https://floorwalker.dev/docs/dialer" target="_blank" rel="noopener noreferrer">https://floorwalker.dev/docs/dialer</a>.</p>
<p>Book a demo: <a href="mailto:hello@floorwalker.dev" target="_blank" rel="noopener noreferrer">hello@floorwalker.dev</a></p>]]></content>
        <author>
            <name>Pavel Kharakh</name>
            <email>hello@floorwalker.dev</email>
            <uri>https://floorwalker.dev</uri>
        </author>
        <category label="Twilio Flex" term="Twilio Flex"/>
        <category label="Dialer" term="Dialer"/>
        <category label="TaskRouter" term="TaskRouter"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Per-task screen recording in Twilio Flex, even in parallel chats]]></title>
        <id>https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex</id>
        <link href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex"/>
        <updated>2026-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Why a separate video per conversation breaks when agents handle several chats at once, and how recording once and labeling every part gives each its own.]]></summary>
        <content type="html"><![CDATA[<p>A supervisor reviewing a Twilio Flex conversation wants to press play on that conversation and see what the agent saw. That sounds like "one video per task" until you watch an agent work: a voice call open, two chats waiting, a WhatsApp thread they come back to every few minutes. The screen is one picture; the conversations overlap.</p>
<p>This post explains how Floor Walker's screen recording handles that, and what it means for the people who review recordings. The short version: we record each agent's screen once, in parts of about 30 seconds, label every part with the conversations that were open while it was recorded, and give each conversation its own recording made of the parts that carry its label.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-reviewers-need-from-a-screen-recording">What reviewers need from a screen recording<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#what-reviewers-need-from-a-screen-recording" class="hash-link" aria-label="Direct link to What reviewers need from a screen recording" title="Direct link to What reviewers need from a screen recording">​</a></h2>
<p>Quality and compliance reviews start from a conversation, not from an agent's day. The usual questions are:</p>
<ul>
<li>What did the agent look up, and where did they go while the customer was talking?</li>
<li>Why did this chat customer wait four minutes for a reply?</li>
<li>Did the agent follow the script, read the disclosure, close the case properly?</li>
</ul>
<p>All of them need the recording of one conversation, from the moment the agent picked it up to the moment they closed it, found next to the conversation itself. A recording of "Tuesday, 14:00 to 15:00, agent 12" is not something anyone wants to scrub through.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-one-video-per-conversation-doesnt-work">Why one video per conversation doesn't work<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#why-one-video-per-conversation-doesnt-work" class="hash-link" aria-label="Direct link to Why one video per conversation doesn't work" title="Direct link to Why one video per conversation doesn't work">​</a></h2>
<p>The obvious design is to start a new video when a conversation starts and stop it when the conversation ends. It runs into three problems as soon as agents work in parallel:</p>
<ol>
<li><strong>Overlap.</strong> When two chats are open side by side, both recordings need the same screen. Either the agent's computer records the same picture twice, at twice the cost, or one recording is cut into pieces afterwards, which means processing video every time a conversation starts or ends.</li>
<li><strong>Loss.</strong> A video that is uploaded when the conversation ends is lost if the computer crashes or the battery dies in the middle of a 40-minute call. A long call also means a long upload just as the agent should be taking the next customer.</li>
<li><strong>Moving edges.</strong> Conversations are transferred, put in wrap-up and closed in an order nobody controls. Every one of those cases becomes a question about where one video should stop and the next should start.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="record-once-label-every-part">Record once, label every part<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#record-once-label-every-part" class="hash-link" aria-label="Direct link to Record once, label every part" title="Direct link to Record once, label every part">​</a></h2>
<p>Floor Walker records one session per agent, however many conversations are open:</p>
<ol>
<li>When the agent accepts a conversation that the recording policy covers, recording starts.</li>
<li>Conversations accepted later join the same recording.</li>
<li>When a conversation is completed, it leaves the recording; recording continues while anything else is open.</li>
<li>When the last open conversation is completed, the recording is finished.</li>
<li>Floor Walker then creates one recording per conversation, and each appears on the Recordings page and in the CRM.</li>
</ol>
<p>The recording is cut into parts of about 30 seconds as it goes, and every part is labeled with all the conversations that were open at any time while it was recorded. A conversation's recording is simply the parts that carry its label. Nothing is copied or edited per conversation, so three overlapping chats take the same storage as one.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-this-means-when-you-press-play">What this means when you press play<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#what-this-means-when-you-press-play" class="hash-link" aria-label="Direct link to What this means when you press play" title="Direct link to What this means when you press play">​</a></h2>
<p><strong>A conversation's recording covers its whole open period.</strong> That includes time the agent spent looking at another chat. We went back and forth on this and kept it, because it answers the question reviewers ask most: what was the agent doing while this customer waited? If two chats are handled side by side, both recordings show the same footage for that stretch, and each still plays on its own.</p>
<p><strong>Edges are rounded to the part.</strong> A recording can start up to 30 seconds before the conversation was accepted and end up to 30 seconds after it was completed. For quality review we think that is the right trade: reviewers get a little context on either side, and nobody has to reason about frame-accurate cuts.</p>
<p><strong>Long recordings start quickly.</strong> Recordings are streamed in the browser, so even an hour-long recording starts playing right away instead of after a download.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-agent-does-nothing">The agent does nothing<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#the-agent-does-nothing" class="hash-link" aria-label="Direct link to The agent does nothing" title="Direct link to The agent does nothing">​</a></h2>
<p>Recording follows the agent's work in Flex. There is nothing to start, name or upload, and the desktop app on the agent's computer has no settings for agents to fill in; it gets everything it needs from Flex. The Flex header shows <strong>Recording</strong>, <strong>Recording Paused</strong> or <strong>Not Recording</strong>, so the agent always knows the state.</p>
<p><strong>Pausing for sensitive data.</strong> Agents pause recording from the Flex header or the task header before a card number or an ID document appears on screen, and resume when it is gone. Nothing is captured while paused, so the paused time does not exist in the recording; playback simply continues with the next part. Because the screen is shared by every open conversation, pause applies to all of them.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="choosing-what-is-recorded">Choosing what is recorded<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#choosing-what-is-recorded" class="hash-link" aria-label="Direct link to Choosing what is recorded" title="Direct link to Choosing what is recorded">​</a></h2>
<p>By default every accepted conversation is recorded, on every channel. Admins can narrow that in Flex:</p>
<ul>
<li>by <strong>channel</strong> (voice, chat, SMS, video);</li>
<li>by <strong>queue</strong>;</li>
<li>by <strong>rules on task attributes</strong>, such as "record only tasks where the customer tier is premium", combined with AND or OR.</li>
</ul>
<p>Admins can also let agents opt out of recording their own sessions. Changes reach every agent within a minute.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="small-uploads-small-losses">Small uploads, small losses<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#small-uploads-small-losses" class="hash-link" aria-label="Direct link to Small uploads, small losses" title="Direct link to Small uploads, small losses">​</a></h2>
<p>Each part is uploaded as soon as it is finished, so at most about 30 seconds of recording waits on the agent's computer at any moment. A laptop closed mid-call loses seconds, not the call.</p>
<p>The edges are worth knowing before rollout:</p>
<ul>
<li><strong>A recording that is never finished does not appear.</strong> If the agent's computer is switched off mid-call, the recording is not completed and is not listed.</li>
<li><strong>Flex disconnects.</strong> If the Flex tab is closed or reloaded, or the network drops, recording continues for 30 seconds. If Flex comes back in time, nothing is lost; otherwise the recording is finished.</li>
<li><strong>Maximum length.</strong> A recording stops after one hour, and what was recorded up to then is kept.</li>
<li><strong>Failed uploads are not retried.</strong> A part that fails to upload is missing from the recording, so agents' computers need a reliable route to the Floor Walker service.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="audio-and-ai-insights">Audio and AI insights<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#audio-and-ai-insights" class="hash-link" aria-label="Direct link to Audio and AI insights" title="Direct link to Audio and AI insights">​</a></h2>
<p>For voice tasks, the call audio is also recorded on its own and sent for transcription. The transcript feeds the AI summary, sentiment, outcome and topics that appear on the customer's timeline in the Agent Workspace, so a reviewer can read what a call was about before deciding to watch it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="playback-and-coaching-in-flex">Playback and coaching in Flex<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#playback-and-coaching-in-flex" class="hash-link" aria-label="Direct link to Playback and coaching in Flex" title="Direct link to Playback and coaching in Flex">​</a></h2>
<p>Recordings are found where reviewers already work:</p>
<ul>
<li>the <strong>Recordings</strong> page, with filters by status, customer phone number and date;</li>
<li>a play button on each interaction in the <strong>CRM</strong>;</li>
<li>a <strong>Screen Recordings</strong> tab on voice tasks.</li>
</ul>
<p>While watching, supervisors and QA reviewers pin <strong>coaching notes</strong> to moments in the recording, with a category (General, Positive, Needs Improvement, Compliance, Technique, Communication) and an optional 1 to 5 star rating. Notes show as markers on the timeline, and the player has keyboard shortcuts for skipping back and forth. Coaching notes are kept after the recording itself expires.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-recordings-live">Where recordings live<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#where-recordings-live" class="hash-link" aria-label="Direct link to Where recordings live" title="Direct link to Where recordings live">​</a></h2>
<p>Recordings are kept in private storage by the Floor Walker service, which we either host for you or install in your own cloud or data center. They are played only through short-lived links issued to a signed-in Flex user, and the agent's computer and the reviewer's browser only need to reach the Floor Walker service over HTTPS. Recordings are deleted automatically after a retention period, 90 days by default, which we can change for your installation.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="faq">FAQ<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="can-twilio-flex-record-an-agents-screen-natively">Can Twilio Flex record an agent's screen natively?<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#can-twilio-flex-record-an-agents-screen-natively" class="hash-link" aria-label="Direct link to Can Twilio Flex record an agent's screen natively?" title="Direct link to Can Twilio Flex record an agent's screen natively?">​</a></h3>
<p>Flex can record calls, but not the agent's desktop. Screen recording needs software on the agent's computer that captures the screen, plus somewhere private to keep and play the recordings. Floor Walker adds a desktop app for Windows and macOS that follows the agent's Flex tasks, with playback inside Flex.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-each-conversation-get-its-own-recording-when-an-agent-handles-several-chats-at-once">How does each conversation get its own recording when an agent handles several chats at once?<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#how-does-each-conversation-get-its-own-recording-when-an-agent-handles-several-chats-at-once" class="hash-link" aria-label="Direct link to How does each conversation get its own recording when an agent handles several chats at once?" title="Direct link to How does each conversation get its own recording when an agent handles several chats at once?">​</a></h3>
<p>The agent's screen is recorded once, in parts of about 30 seconds, and each part is labeled with every conversation that was open while it was recorded. A conversation's recording is made of the parts that carry its label, so overlapping chats share footage and each plays on its own.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-agents-keep-card-numbers-out-of-screen-recordings">How do agents keep card numbers out of screen recordings?<a href="https://floorwalker.dev/docs/blog/per-task-screen-recording-twilio-flex#how-do-agents-keep-card-numbers-out-of-screen-recordings" class="hash-link" aria-label="Direct link to How do agents keep card numbers out of screen recordings?" title="Direct link to How do agents keep card numbers out of screen recordings?">​</a></h3>
<p>They press Pause Recording in the Flex header or the task header before the sensitive data appears, and Resume when it is gone. Nothing is captured while paused, and the pause covers all of the agent's open conversations.</p>
<hr>
<p>Floor Walker adds per-task screen recording, a predictive dialer, a CRM and live and historical reporting to Twilio Flex, hosted by us or installed in your own cloud or data center. Read more in the screen recorder docs at <a href="https://floorwalker.dev/docs/screen-recorder" target="_blank" rel="noopener noreferrer">https://floorwalker.dev/docs/screen-recorder</a>.</p>
<p>Book a demo: <a href="mailto:hello@floorwalker.dev" target="_blank" rel="noopener noreferrer">hello@floorwalker.dev</a></p>]]></content>
        <author>
            <name>Pavel Kharakh</name>
            <email>hello@floorwalker.dev</email>
            <uri>https://floorwalker.dev</uri>
        </author>
        <category label="Twilio Flex" term="Twilio Flex"/>
        <category label="Screen recording" term="Screen recording"/>
    </entry>
</feed>