ONLY VTC Observatory methodology
This document precisely defines each indicator published on theTransport observatory : population measured, time stamps used, validity bounds, publication thresholds. It is versioned : each published edition references the methodology version that produced it, and any change of definition increments the number — a published figure therefore remains interpretable under the rules in force when it was generated.
The figures are calculated directly from our operational database (the platform's real bookings), with no manual reprocessing, by a service in read-only mode.
1. Principles
- Non-selection. Any indicator that reaches the sample threshold over a period is published for that period, whatever its value — including when unfavourable. An indicator may be withdrawn from an edition only for insufficient sample, never because the figure is displeasing. Selectively withdrawing a bad quarter would be a lie by omission.
- Sample always shown. No figure is published without its sample size ("n") visible next to it. A (sub-)category below the threshold shows "insufficient sample", never a number.
- No sensitive business metrics. The Observatory publishes no margins, commissions, occupancy rates, revenue or driver pay. Only indicators of service quality andactivity.
- No individual data. Aggregates only. No identifiable journey, customer or driver is exposed.
- Estimates labelled as such. "Estimated" distances and durations are route calculations made at booking, not on-board telemetry. The public label says so.
2. Common framework
| Element | Rule |
|---|---|
| Base population | Rides with "completed" status and an end date filled in. |
| Time zone | Europe/Paris for any time or calendar breakdown (night, month, quarter). |
| Time stamps | All server, set at the moment of the action (driver, system or scheduled task). No manual re-entry after the fact. |
| Publication threshold | Minimum 15 rides. Any (sub-)category with n < 15 → "insufficient sample". |
| Central tendency | We publish median (highlighted, robust to outliers) and mean, always accompanied by n. |
| Validity bounds | Each time indicator has physical bounds (see §3). Any value outside the bounds is excluded from the calculation and reduces the published n. |
| Immediate vs booked | Scheduled pick-up more than 30 min after the request ⇒ booked in advance ; otherwise immediate request. Business threshold validated (2026-07). |
| Arrival milestone (source) | For the punctuality and thewait, arrival at the pick-up point is the time stamp measured on the server side by geofence, not the driver's tap. The public v2 series restarts on 4 August 2026 (00:00 UTC), with measurement version and trigger radius frozen at 120 m. The 9 exploratory v1 observations remain in the database for audit but are excluded from statistics. |
| Trigger before acceptance of the approach journey | A geofence entry occurring while the ride is merely "accepted" is valid only if it takes place no more than 45 min before the scheduled time. Beyond that, the measurement is kept in the database but invalid for public statistics. |
| Minimum coverage (geofence) | A geofence-sourced indicator is published only if the exact measured/population ratio covers ≥ 80 % of its population. Rounding to one decimal is reserved for display and never decides publication. Below this threshold, the value remains "—", with n/15 progress and coverage published; from n ≥ 15, the summary already measured is shown in a note, labelled provisional — never as the main value nor in exports. |
2.1. Justified exclusions
| Reason | Rationale |
|---|---|
| Uncompleted rides | No measurable end of ride. |
| Incomplete time stamps | The milestone required by the indicator is missing → time cannot be calculated. |
| Automatic closures | End of ride set by the system (up to +6 h) — does not reflect the actual end. |
| Closures forced by an operator | Administrative, not operational, end. |
| Chauffeur hire | The duration is the hired duration; it would skew A→B journey statistics. |
| Early departures | Approach started more than 45 min before the scheduled time: measures the driver's safety margin, not their approach journey. |
Chauffeur hire and automatic/forced closures are counted in the public "exclusions" block of the exports. Other exclusions specific to each indicator are visible through its n, always published with the value or its progress.
3. Indicators — definitions down to the time stamp
Milestones in a ride's life cycle (all server time-stamped): request → driver acceptance → driver departure ("on the way") → arrival at the pick-up point → pick-up (customer on board) → end of ride. Added to these is thescheduled pick-up time, set at booking.
3.0. Publication status (v1.3)
Verified in production on 28 July 2026 (read-only inspection script, versioned in our repository): the progress milestones entered by the driver (arrival, pick-up, end) are partly tapped in a burst at drop-off. Across 127 rides with complete milestones, the arrival → pick-up gap has a median of 10 seconds (48.8% under 10 s) and 21% of rides have arrival/departure/end within 2 minutes. The driver's "arrived" tap therefore marks boarding (or even drop-off), not arrival at the meeting point : it does not measure what it claims to measure.
Collection fix v2 (series active from 4 August 2026, 00:00 UTC): arrival at the pick-up point is measured on the server side by geofence at a frozen public radius of 120 m, and versioned at first trigger. On this consistent source, punctuality and immediate-request waiting time are reactivated from 15 valid measurements and only if the exact coverage ratio reaches 80%. Still suspended: the approach time and the durations. Any reactivation applies the non-selection principle (§1): once the threshold is reached, the indicator is published every period, including when unfavourable — a "98% on time" from this same source would be published just as a bad figure would.
| Indicator | Defined on | v1.3 |
|---|---|---|
| Acceptance time | request → acceptance (action in the app) | ✅ published |
| Share accepted in under 60 s | request → acceptance (action in the app) | ✅ published (v1.3) |
| Advance booking lead time | request → scheduled pick-up | ✅ published (v1.3) |
| Estimated distance | route estimate at booking | ✅ published |
| Long-distance share (> 50 km) | route estimate at booking | ✅ published (v1.3) |
| Airport / night / advance / B2B / assistance shares | booking fields | ✅ published |
| Pick-up municipalities | departure address | ✅ published (v1.3, aggregates n ≥ 15 per municipality) |
| Driver cancellations after acceptance | status and author of cancellation, on accepted rides | ✅ published (v1.3, series since 4 June 2026) |
| Monthly / cumulative volume | count | ✅ published |
| Immediate-request wait | request → arrival measured by geofence | ✅ published from n ≥ 15 and exact coverage ≥ 80% |
| Punctuality | arrival measured by geofence vs scheduled time | ✅ published from n ≥ 15 and exact coverage ≥ 80% |
| Approach time | driver departure → arrival | ⏸ suspended |
| Journey / airport transfer duration | pick-up → end of ride | ⏸ suspended |
| Estimated / actual gap | actual distance and duration | ⏸ suspended (not collected) |
3.1. Times
| Indicator | From → to | Measured population | Valid bounds |
|---|---|---|---|
| Customer wait (immediate request) | request → arrival measured by geofence | immediate requests completed after the v2 switch, arrival measured automatically | 0 – 360 min |
| Approach time (suspended) | driver departure → arrival | booked in advance only | 0.5 – 180 min |
| Acceptance time | request → acceptance | rides broadcast to drivers only | 0 – 7 days |
| Advance booking lead time (v1.3) | request → scheduled pick-up | rides booked in advance only | 0.5 h – 180 days |
Thecustomer wait is the full time experienced by the customer, including the driver search — for a ride booked in advance the customer does not "wait": the driver comes for the agreed time. The approach time is not published for immediate requests: the driver app automatically starts the approach on acceptance, so the measured "approach journey" would be the acceptance→arrival time, already contained in the published wait — redundant and systematically inflated. The acceptance time excludes direct dispatch assignments: almost instant, they do not measure a driver's decision — without this exclusion, the figure would become uninterpretable. Published next to the median (v1.3) is the share accepted in under 60 seconds — same population, same n. The advance booking lead time (v1.3) measures how far ahead the customer orders: an immediate request has no chosen lead time (the scheduled time is set by the system) → excluded; the median is highlighted, as the distribution is very spread out (from a few hours to several weeks).
3.2. Journey
The estimated distance (road route calculated at booking, excluding chauffeur hire, bounds 0.5 – 500 km) is published. The actual journey duration and the airport transfer duration are suspended: defined on the pick-up → end-of-ride milestones, which are bunched together (see §3.0). Sample note: estimated distance is filled in on only some completed rides (assistance imports and older bookings lack it) — these indicators therefore reach the threshold of 15 later than time indicators. This is an accepted consequence of the threshold, not an editorial choice.
3.3. Punctuality
Booked in advance only — an immediate request has no promised time.
- A ride is "on time" if the arrival measured by geofence occurs no later than 5 minutes after the scheduled time (tolerance).
- Published: % of rides on time, median of the signed gap arrival − scheduled time (in minutes; negative = early) and coverage rate of the measurement. The median gap published next to the rate makes the tolerance threshold transparent.
- Extent of delays : mean of gaps beyond the tolerance ("average delay when it occurs") and number of delays, published next to the rate with the same threshold (n ≥ 15, coverage ≥ 80%).
- Provisional display : from n ≥ 15 but below the coverage threshold, the summary already measured is shown in the card's note, labelled "provisional figure". The main value remains "—" and JSON/CSV exports do not expose the provisional figure.
- Coverage = share of the eligible population whose arrival is measured automatically; an uncovered ride (app closed, geofence not triggered) is counted in the denominator, never the numerator. Gap bounds: −180 to +180 min.
3.4. Activity shares
Denominator = base population of the period, unless otherwise stated in the rule. Published only if the denominator ≥ 15.
| Share | Rule |
|---|---|
| Airport | Place type "airport" recorded at departure or arrival; failing that, analysis of the address (Saint-Exupéry, airport, LYS…). |
| Night (7 p.m. – 7 a.m.) | Pick-up time scheduled between 7 p.m. and 7 a.m., Paris time (see §4). |
| Booked in advance | Scheduled pick-up more than 30 min after the request (see §2). |
| B2B | Ride linked to a business account. Non-exclusive category: an assistance mission may also be B2B. Both shares use total completed rides as denominator and do not add up. |
| Support | Mission linked to an assistance case or partner. |
| Long distance (v1.3) | Distance estimated at booking above 50 km. Own denominator : rides with a valid estimated distance (0.5 – 500 km, excluding chauffeur hire) — the same population as the distance statistic (see §3.2). Published to one decimal: the share is small and whole-number rounding would distort it. |
3.5. Ride volume
Monthly volume : number of rides completed per calendar month (Europe/Paris), over the last 6 months — the current month is marked "in progress" (partial volume). Period / cumulative volume : see §5.
3.6. Suspended indicators — awaiting reliable collection
Suspended = defined (above) but not shown on the page or in exports, as long as the underlying data is unreliable. The definition remains frozen so that reactivation is unambiguous.
Cause A — unreliable driver milestones (measured on 28 July 2026): arrival, pick-up and end milestones are partly entered in a block at drop-off. The contamination is biased in one direction only — it inflates waiting and approach, compresses duration — so a median calculated on 80% clean data and 20% data shifted in the same direction is displaced, not "robust". Lifted in v1.2 thanks to the geofence: immediate wait and punctuality (they depended only on arrival). Still suspended: approach time (depends on the "on the way" tap), journey and airport transfer durations (depend on pick-up and end taps).
Cause B — data not collected : actual distance and duration travelled are not captured by the driver app (0 rides filled in out of 191 checked). Suspended on this basis: the estimated / actual gap.
Reactivation rules (strict) :
- No after-the-fact filtering. We do not republish these indicators by keeping only "properly entered" rides: selecting on entry quality introduces an invisible bias (drivers who enter correctly are not representative of others). The only honest way out is to make collection reliable at the source.
- Making collection reliable : automatic milestones measured on the server side (geofence time-stamping arrival; detection of departure and end to come); automatic capture of actual distance/duration via the GPS trace.
- Coverage safeguard : restricting an indicator to rides measured by geofence is a selection on the measurement method, not the result — legitimate provided the measurement covers almost the whole population. Otherwise unmeasured rides (app closed) would recreate a disguised "after-the-fact filtering", correlated with delay. Hence the coverage requirement ≥ 80% (§2), with the rate published next to the indicator so readers can judge for themselves.
- Reactivation : on data after the collection fix, with a dated methodological break marked by a version increment. Once reactivated, the non-selection principle (§1) applies.
3.7. Pick-up municipalities (v1.3)
- Data source : the departure address, a free-text field — there is no structured municipality field in the database. The municipality is extracted by a fixed rule: last segment of the address (comma separator) before "France", postcode removed; a remaining segment containing a digit is rejected (unparsable address → excluded from the count, never guessed).
- Measured population : base population of the period (completed rides).
- Publishing : aggregates only. A municipality is listed only if it has at least 15 pick-ups over the period (the usual threshold, applied per municipality). Published per municipality: number of pick-ups and share of the total. No individual address, no destination, no cross-tabulation (municipality × time, municipality × customer…) is published — protecting the people transported comes first.
- Accepted limitation : two spellings of the same municipality ("St-Priest" / "Saint-Priest") may split a count; aggregation is case-insensitive but does not normalise abbreviations. Lyon-Saint-Exupéry airport appears under its actual municipality, Colombier-Saugnieu.
3.8. Driver cancellations after acceptance (v1.3)
The indicator answers a specific customer question: once my ride is accepted, can the driver let me down?
- Measured population : all accepted rides in the period — not only completed rides: a cancelled ride never completes, so the base population in §2 cannot see it. This is the only Observatory indicator classified by acceptance date (a cancelled ride has no end date).
- Numerator : cancelled rides whose recorded cancellation author is the driver who had accepted.
- Dated break : the series starts on 4 June 2026 (00:00 UTC), the date from which the cancellation author is reliably filled in in production. Never applied retroactively; audited on the full history on 19 September 2026.
- What does not count : a customer no-show recorded by the driver (customer absent at the meeting point) is not a driver cancellation; nor is a cancellation by the customer, an operator or a partner. A reassignment by dispatch (administrative removal of the ride from one driver to assign it to another) is not a cancellation of the ride.
- Accepted limitation : the indicator measures cancellations recorded as such. A withdrawal negotiated by phone and handled by dispatch as a reassignment does not appear in the numerator — but the customer was picked up: that is the promise being measured.
- Publishing : percentage share (one decimal), with numerator, denominator and series start date. Usual threshold: denominator ≥ 15. Non-selection principle (§1): the indicator will remain published even if the figure becomes unfavourable.
4. Night and pricing
The 7 p.m. – 7 a.m. (Europe/Paris) split is not arbitrary: it is the "night" pricing period of the price engine of the platform. Verified in production on 28 July 2026, a night surcharge per kilometre is active (from +17% to +27% depending on the range). Classifying the night share by the time scheduled is therefore consistent with the fare actually applied to the customer. The public promise is the price fixed at booking, known in advance — not the absence of a night scale.
5. Editions and versioning
Editions by calendar quarter (e.g. "2026-T3", Europe/Paris): an edition's metrics are calculated on rides completed during that quarter. A re-issue after closure receives a separate URL (for example /observatoire/2026-t3-v2), with its own exports. The initial edition keeps its URL and figures. An archive = a frozen edition — that is what makes a primary source, not a brochure. An accepted consequence: at the start, several quarterly sub-categories show "insufficient sample". This is a feature (§1), not a flaw.
Cumulative "since the start" edition displayed as the showcase on /observatoire : consolidated figures (time coverage indicated), regenerated and republished automatically every day — publication safeguards (n ≥ 15, coverage ≥ 80%) apply at each recalculation.
Life cycle : a quarterly edition is generated as a draft (idempotent recalculation), then published manually. A published quarterly edition is immutable and references the methodology version that produced it.
6. Publishing
- /observatoire : cumulative showcase + current published quarterly edition + sample size on each figure.
- /observatoire/2026-t3 (etc.): permanent archives of published editions, listed on the main page.
- JSON export and CSV export (read-only): same figures as the page, machine format, licence and attribution included. Parameter
?period=YYYY-QNfor an archived edition.
7. Limitations and biases (publicly displayed)
- Composition of activity : digitised activity today consists mostly of business rides and assistance missions. These figures describe the ONLY VTC platform, not the entire Lyon market.
- Modest samples : the digital platform is ramping up in 2026 (company active since 2016, but phone rides were not time-stamped). Samples range from a few dozen to a few hundred rides depending on the indicator — and are displayed.
- Estimates ≠ telemetry : estimated distances and durations are route calculations made at booking.
- Partial coverage of some fields : estimated distance is filled in on only some rides (see §3.2).
- Unreliable driver milestones : approach time, journey durations and the estimated/actual gap remain suspended (see §3.0 / §3.6). A source that suspends what it cannot measure honestly, rather than publishing it with an asterisk, is precisely what distinguishes it from a brochure.
8. Reproducibility
All the definitions above are implemented in our backend calculation service (read-only, direct aggregations on the operational database) and covered by automated tests versioned with the code. Bounds, thresholds and exclusions are named constants there, matching this document. Journalists and researchers: to discuss the methodology or detailed data, write to contact@onlyvtc.fr.
9. Version log
| Version | Date | Changes |
|---|---|---|
| 1.0 | 28 July 2026 | Initial frozen version. Publication threshold raised to 15. Published: acceptance time, estimated distance, activity shares, volumes. Suspended (defined, not shown): immediate wait, approach time, punctuality, durations — driver milestones bunched at drop-off (measured in production on 28/07); estimated/actual gap — not collected. Reactivation only after collection is made reliable at the source, on later data, with a version increment — never by after-the-fact filtering. |
| 1.1 | 29 July 2026 | Reactivation of punctuality and immediate-request waiting time on the arrival milestone measured on the server side by geofence, without a driver tap. Dated break: calculation only on rides completed after the switch to automatic measurement, never applied retroactively. Publication conditional on coverage ≥ 80%, with the coverage rate published next to each indicator. |
| 1.2 | 3 August 2026 | New geofence v2 series from 4 August 2026 (00:00 UTC): the 9 exploratory v1 observations are kept for audit but excluded. Measurement version and 120 m radius frozen at first trigger; trigger before acceptance valid only within the 45 min before the scheduled time. Coverage compared on the exact ratio before rounding. Below n = 15 or coverage < 80%, the page shows "—", the n/15 progress and coverage. Addendum of 7 September 2026 (no existing definition changed) : publication of the average extent of delays next to the rate; from n ≥ 15 below the coverage threshold, the measured summary is shown in a note as a provisional figure (main value "—", exports unchanged). |
| 1.3 | 19 September 2026 | Five indicators added, no existing definition changed. (1) Driver cancellations after acceptance (§3.8): population = accepted rides, series since 4 June 2026 (reliability of the cancellation author, audited on the full history on 19 September 2026) — the only indicator classified by acceptance date. (2) Advance booking lead time (§3.1): request → scheduled pick-up, booked in advance only, bounds 0.5 h – 180 days. (3) Long-distance share > 50 km (§3.4): own denominator = rides with a valid estimated distance, one decimal. (4) Share accepted in under 60 s (§3.1): same population as the acceptance time. (5) Pick-up municipalities (§3.7): extracted from the departure address, aggregates only, threshold of 15 applied per municipality, no cross-tabulation published. Associated collection fix: driver cancellation now records its author on the booking itself (previously only in the internal event log). |
Licence and citation
Observatory data is published under the licence CC BY 4.0 : cite "ONLY VTC Observatory — onlyvtc.fr/observatoire". Full citation instructions are on the Observatory page.