SYNTHETIC data, seed 20260929. Not a real-world measurement.

Full log: journey resolution 81.4% (3256/4000). Digital-first journeys that later reach a call: 32.0% (971/3035).

KPI dashboard · seed 20260929

Funnel, first response, and resolution

4000 synthetic journeys and 6376 events. A journey is one customer, one intent, and one or more contacts. Digital channels are ussd, app, web, and social. The assisted channel is call.

Journey resolution

81.4%3256/4000

Digital-first journeys that later reach a call

32.0%971/3035

01

Funnel

Each bar is a committed count divided by its own denominator. The two digital-to-call rows share a numerator and use different denominators.

Journey resolution81.4%

3256/4000 · Journeys whose end reason is resolved.

Resolved on the first contact55.6%

2223/4000

Repeat contact36.5%

1462/4000 · Two or more contacts in the same journey.

Channel switch30.9%

1235/4000 · More than one distinct channel. A second contact on the same channel is not a switch.

Digital-first75.9%

3035/4000 · First contact on ussd, app, web, or social.

Digital-to-call, all journeys24.3%

971/4000 · Numerator is the 971 journeys that start digital and later reach a call.

Digital-to-call, digital-first journeys32.0%

971/3035 · Same 971 journeys, divided by the 3035 digital-first journeys.

Abandoned18.6%

744/4000 · Of the abandoned journeys, chose-abandon ends: 542, and max-contact ends: 202.

02

First channel to journey outcome

The Sankey splits the same 4000 journeys into resolved on the first contact, resolved after another contact, or abandoned.

Resolved on first contact Resolved after another contact Abandoned
ussdn=1289
appn=873
webn=548
socialn=325
calln=965
Bar length follows the committed Sankey counts. Exact counts are in the table.
Committed Sankey counts by first channel. Source: reports/kpis.json.
First channelResolved on first contactResolved after another contactAbandonedJourneys
ussd6163882851289
app502225146873
web276151121548
social7515298325
call75411794965
SYNTHETIC Sankey chart. First channel, ussd, app, web, social, or call, flows to resolved on first contact, resolved after another contact, or abandoned.
Static copy of the committed Sankey. SYNTHETIC data.Interactive HTML on GitHub

03

Time to first response

Delay, in minutes, between a journey's first inbound timestamp and the response on that same first contact. Every synthetic contact has a response. Median and the 90th percentile use DuckDB quantile_cont (linear), shown to one decimal as in reports/headlines.md.

Median 90th percentile
ussdn=1289

median 1.0 min · p90 1.7 min

appn=873

median 2.0 min · p90 4.0 min

webn=548

median 4.8 min · p90 10.5 min

socialn=325

median 30.0 min · p90 69.9 min

calln=965

median 5.9 min · p90 11.2 min

Scale ends at the longest 90th percentile in this table (social, 69.9 minutes).
Synthetic time-to-first-response by first channel.
First channelJourneysMedian minutes90th percentile minutes
ussd12891.01.7
app8732.04.0
web5484.810.5
social32530.069.9
call9655.911.2

04

Contact resolution by channel

Resolved contacts divided by contacts on that channel. A journey has at most one resolved contact, the one that closes it.

ussd43.4%

699/1611

app50.8%

582/1145

web43.9%

317/722

social19.4%

102/526

call65.6%

1556/2372

SYNTHETIC bar chart of contact resolution by channel: ussd 43.4 percent (699 of 1611), app 50.8 percent (582 of 1145), web 43.9 percent (317 of 722), social 19.4 percent (102 of 526), call 65.6 percent (1556 of 2372).
Static copy of the committed channel chart. SYNTHETIC data.

05

Resolution by intent

Complaint journeys move on to the call channel more often than lookup journeys. The rates below are the group totals printed in reports/headlines.md.

self-service candidate

Journey resolution94.7%

1401/1480

Digital-to-call among digital-first12.9%

144/1112

assisted

Journey resolution83.0%

1276/1538

Digital-to-call among digital-first36.6%

434/1185

complaint

Journey resolution59.0%

579/982

Digital-to-call among digital-first53.3%

393/738

SYNTHETIC grouped bars. Self-service candidate: journey resolution 94.7 percent (1401 of 1480) and digital-to-call 12.9 percent (144 of 1112). Assisted: 83.0 percent (1276 of 1538) and 36.6 percent (434 of 1185). Complaint: 59.0 percent (579 of 982) and 53.3 percent (393 of 738).
Static copy of the committed intent-group chart. SYNTHETIC data.
Synthetic results by intent group. Rates match reports/headlines.md.
Intent groupJourneysResolvedJourney resolutionResolved on first contactDigital-firstDigital-to-callDigital-to-call among digital-first
self-service candidate1480140194.7% (1401/1480)1183111214412.9% (144/1112)
assisted1538127683.0% (1276/1538)778118543436.6% (434/1185)
complaint98257959.0% (579/982)26273839353.3% (393/738)

Contact resolution by intent group and channel

The base probability is the config input. The realised rate is the output. Realised rates sit near the base inputs because of sampling and the two adjustments for later attempts and slow responses.

Base probability and realised contact resolution. Source: reports/headlines.md.
Intent groupChannelConfig baseContactsResolved contactsRealised rate
self-service candidateussd0.8254042077.8% (420/540)
self-service candidateapp0.8635130085.5% (300/351)
self-service candidateweb0.7421216075.5% (160/212)
self-service candidatesocial0.301394834.5% (48/139)
self-service candidatecall0.9055447385.4% (473/554)
assistedussd0.3860722637.2% (226/607)
assistedapp0.5246422748.9% (227/464)
assistedweb0.4529112844.0% (128/291)
assistedsocial0.202033416.7% (34/203)
assistedcall0.7895966168.9% (661/959)
complaintussd0.124645311.4% (53/464)
complaintapp0.223305516.7% (55/330)
complaintweb0.182192913.2% (29/219)
complaintsocial0.151842010.9% (20/184)
complaintcall0.6085942249.1% (422/859)

Counts by intent

reports/headlines.md prints rates for the three groups, not a rate for every intent. This table stays in counts from reports/kpis.json.

Synthetic journey counts by intent. No rate is added here.
CategoryIntentGroupJourneysResolved journeysDigital-firstDigital-to-call
BILLINGdispute_invoicecomplaint21212515878
BILLINGinvoicesself-service candidate31729423031
COMPLAINTSget_compensationcomplaint119648841
COMPLAINTSreport_poor_signal_coveragecomplaint22013416389
COMPLAINTSreport_problemcomplaint289173218115
CONSUMPTIONcheck_excess_data_chargesself-service candidate18617914224
CONSUMPTIONcheck_usageself-service candidate46744834742
CONSUMPTIONset_usage_limitsassisted111959038
CONTACTcustomer_serviceassisted15011711536
CONTACThuman_agentcomplaint1428311170
PAYMENTcheck_mobile_paymentsself-service candidate20919416719
PAYMENTpayassisted21718516663
PAYMENTpayment_methodsself-service candidate9187688
PAYMENTschedule_paymentsassisted13110910842
SERVICESactivate_call_management_servicesassisted84726522
SERVICESactivate_phoneassisted115909137
SERVICESactivate_roamingassisted1231018637
SERVICEScheck_signal_coverageself-service candidate14113210617
SERVICESdeactivate_call_management_servicesassisted39343113
SERVICESdeactivate_phoneassisted74636017
SERVICESinstall_internetassisted82576021
SUBSCRIPTIONcancel_planassisted1231139330
SUBSCRIPTIONchange_planassisted16413012744
SUBSCRIPTIONchange_providerassisted4034328
SUBSCRIPTIONcheck_cancellation_feeself-service candidate6967523
SUBSCRIPTIONsign_up_for_planassisted85766126

06

Directly-follows

Among steps that change channel, the largest flow is ussd followed by call (385). A second contact on the same channel counts as a repeat contact and does not count as a channel switch.

  1. call → resolved1556
  2. ussd → resolved699
  3. app → resolved582
  4. ussd → call385
  5. call → call382
All committed directly-follows counts. Rows are the preceding activity.
Fromussdappwebsocialcallresolvedabandoned
ussd180784044385699185
app4272316225758299
web3955421516031794
social1828204322310292
call433941373821556274

Download the committed CSV

07

Friction heatmap

Realised friction is one minus the contact resolution rate. Cells sit near the base probabilities in the config, moved by the attempt penalty and the slow-response penalty.

SYNTHETIC friction heatmap. Rows are intents and columns are channels ussd, app, web, social, and call. Friction is one minus the contact resolution rate. The chart is labelled SYNTHETIC DATA.
Static copy of the committed heatmap. SYNTHETIC data.Interactive HTML on GitHub

Download the committed friction matrix

08

How to read the rates

Time to first response

Time-to-first-response is the delay, in minutes, between a journey's first inbound timestamp and the response timestamp on that same first contact. Median and the 90th percentile use DuckDB quantile_cont (linear). The synthetic generator draws each delay from the channel lognormal in config/synthetic.yaml and then clips it. Every synthetic contact has a response, so there are no censored non-responses.

Repeat contact

Repeat-contact rate is the share of synthetic journeys with two or more contacts. A repeat contact is a later contact in the same journey after an unresolved contact. The synthetic log has one journey per customer, so this is not a later, separate issue from the same person.

Channel switch

Channel-switch rate is the share of synthetic journeys whose contacts use more than one distinct channel. A second contact on the same channel is a repeat contact and is not a channel switch.

Digital-to-call

A synthetic digital-to-call journey starts on a digital channel (ussd, app, web, or social) and has a later contact on the call channel. That is the operational definition of a failed digital attempt that ends in a call. The rate is reported for all journeys and again among digital-first journeys only.

Resolution rate

On the synthetic log, contact resolution rate for a channel, or for an intent group on a channel, is resolved contacts divided by contacts on that slice. A journey has at most one resolved contact, the one that closes it. Journey resolution rate is journeys whose end reason is resolved, divided by journeys. Realised rates are outputs. They are not the base probabilities in the config: each contact multiplies that base by attempt decay and, when the response is slower than the configured threshold, by the slow-response factor.

Design notes from the recommendations file

These are hypotheses for a care journey. Each one names whether it rests on the public Bitext training set or on the synthetic log. docs/recommendations.md

Lookup intents on USSD and in the app

Self-service contacts resolve at base 0.82, realised 77.8% (420/540) on ussd, and base 0.86, realised 85.5% (300/351) on the app. USSD first-contact time-to-first-response has median 1.0 minutes (n=1289). Digital-to-call in this group: 12.9% (144/1112) of its digital-first journeys.

Keep a person available for complaints

Complaint contacts resolve at base 0.12, realised 11.4% (53/464) on ussd, and base 0.60, realised 49.1% (422/859) on call. Journey resolution is 59.0% (579/982). Digital-to-call among its digital-first journeys is 53.3% (393/738).

Treat social as acknowledgement

The social clock is an input (lognormal mu 3.40). On simulated first contacts the median is 30.0 minutes and the 90th percentile is 69.9 minutes (n=325). The model multiplies resolution probability by 0.75 when a response is slower than 30.0 minutes. Lowest realised contact resolution: social, 19.4% (102/526).

Lookup intents, digital-to-call over journeys

The fraction in docs/recommendations.md divides digital-to-call by journeys for that intent. It does not use the digital-first denominator behind the 32.0% headline.

Self-service intents ordered as in docs/recommendations.md. The rate is digital-to-call over journeys.
IntentJourneysDigital-firstDigital-to-callDigital-to-call / journeys
check_usage467347429.0% (42/467)
invoices317230319.8% (31/317)
check_excess_data_charges1861422412.9% (24/186)
check_mobile_payments209167199.1% (19/209)
check_signal_coverage1411061712.1% (17/141)
payment_methods916888.8% (8/91)
check_cancellation_fee695234.3% (3/69)

Channels in the generator, in report order: ussd, app, web, social, call.