IVR and Studio journeys
What happens before a contact reaches a queue is part of the report. Every Studio execution (an IVR call or a bot conversation) becomes a journey, with one step per widget it went through, joined to the contact by its call or conversation SID.
No dummy tasks and no flow changes are needed. The only setup is the Event Streams sink in your Twilio account, which is subscribed to the Studio events at installation (see Setup and backfill).
How it works
When an execution ends, Floor Walker reads its context (the trigger's call SID and the input the caller gave) and the flow definition (widget types) from Studio, and completes the journey with them. A flow revision seen for the first time has its widget types read straight away.
Exit types
Each journey ends with one exit type:
| Exit type | Meaning |
|---|---|
handed_off | Reached a widget that sends the contact to Flex (Send to Flex). |
contained | The flow ended by itself, without an agent; or a self_service_resolved milestone was recorded. |
abandoned_in_ivr | The caller hung up inside the flow. Left the IVR at names the widget. |
error | The flow ended on a failed transition. |
in_progress | Still running. |
Containment rate is contained ÷ finished sessions; IVR abandon rate is abandoned ÷ finished sessions. See the IVR metrics in the Metrics catalog.
Reports
- IVR containment: sessions, self-service, hand-offs and abandons per flow.
- Where callers leave the IVR: the widget callers hung up in.
- IVR widgets: visits and time per widget and transition.
A contact's drill-down in Contacts shows its IVR steps before the queue and agent legs. Contact metrics such as Self-served, Avg. IVR time and Avg. customer time include the IVR part.
Caller input
Digits and speech the caller gives can hold card numbers, ID numbers and other sensitive data, so by default only the fact that input was given is stored, not the value. Drill-downs show Input given (not stored).
To store the value for specific widgets, such as a main menu, add them in Reports → Settings → Stored IVR input: the flow SID (or * for every flow) and the widget name. Values are then stored for those widgets only, up to 200 characters, and can be used as the Caller input dimension.
Milestones
Milestones add meaning that widget steps cannot carry: "the caller heard their balance", "the bot detected a billing intent". A milestone is an event name plus optional attributes, attached to the contact.
The event name is 1 to 64 letters, digits, _, . or -. The milestone self_service_resolved marks the journey as contained.
From a Studio flow
Add a Make HTTP Request widget:
POST https://<your-floor-walker-host>/analytics/journey-events/<token>
Content-Type: application/x-www-form-urlencoded
event=self_service_resolved&CallSid={{trigger.call.CallSid}}&topic=balance
<token>is a secret we give you for your Studio flows: either the installation's journey token or an API key with only thejourneys:writescope (one per flow if you like, so it can be revoked on its own). Treat it as a secret; a wrong or revoked token returns404.- The contact is identified by
CallSid/call_sid,ConversationSid/conversation_sid, orExecutionSid/execution_sid. - Every other form field becomes an attribute (here
topic=balance).
From a bot or service
With an API key that has the journeys:write scope:
curl -X POST https://<your-floor-walker-host>/analytics/journey-events \
-H "X-Api-Key: <your-api-key>" -H "Content-Type: application/json" \
-d '{"event":"intent_detected","conversation_sid":"CHxxxxxxxx","attributes":{"intent":"billing"}}'
Attributes may be up to 8,000 characters as JSON. An optional at field sets the time of the milestone. The full request and response are in the reporting API.
Privacy and retention
- Only the trigger's call or conversation SID and, per widget, whether input was given (and the value for allow-listed widgets) are kept from the execution context.
- Raw Studio events are kept for 35 days, so journeys can be folded again while their contact is recent. Journeys themselves are kept as long as the other report data (25 months by default).