Ride-hailing marketplace analytics — Kafka → Parquet lakehouse → dbt → DuckDB. Every figure below is generated from the warehouse and verified in CI.
Each series as a share of its own daily total, so both sit on one axis in the same unit. Levels are not comparable — trips and sessions are different things — but timing is, and timing is the question.
Supply peaks at 6:00; demand peaks at 9:00. Drivers come online before the rush and drop off during it — which is what the 8.7% unmet demand is made of.
| Hour | Trips requested | % of day | Sessions started | % of day |
|---|---|---|---|---|
| 0:00 | 123 | 1.0% | 28 | 0.6% |
| 1:00 | 67 | 0.6% | 49 | 1.1% |
| 2:00 | 37 | 0.3% | 28 | 0.6% |
| 3:00 | 28 | 0.2% | 94 | 2.1% |
| 4:00 | 52 | 0.4% | 212 | 4.7% |
| 5:00 | 94 | 0.8% | 553 | 12.2% |
| 6:00 | 253 | 2.1% | 799 | 17.6% |
| 7:00 | 444 | 3.7% | 767 | 16.9% |
| 8:00 | 2,028 | 16.7% | 525 | 11.6% |
| 9:00 | 2,075 | 17.1% | 321 | 7.1% |
| 10:00 | 537 | 4.4% | 163 | 3.6% |
| 11:00 | 475 | 3.9% | 74 | 1.6% |
| 12:00 | 391 | 3.2% | 80 | 1.8% |
| 13:00 | 406 | 3.3% | 82 | 1.8% |
| 14:00 | 384 | 3.2% | 90 | 2.0% |
| 15:00 | 419 | 3.4% | 122 | 2.7% |
| 16:00 | 525 | 4.3% | 140 | 3.1% |
| 17:00 | 779 | 6.4% | 134 | 2.9% |
| 18:00 | 809 | 6.7% | 88 | 1.9% |
| 19:00 | 772 | 6.4% | 61 | 1.3% |
| 20:00 | 540 | 4.4% | 44 | 1.0% |
| 21:00 | 425 | 3.5% | 41 | 0.9% |
| 22:00 | 291 | 2.4% | 23 | 0.5% |
| 23:00 | 196 | 1.6% | 26 | 0.6% |
Trips reaching each stage. Cumulative, so a trip counted at “Started” is also counted at every earlier stage.
| Stage | Trips | % of requests |
|---|---|---|
| Requested | 12,150 | 100.0% |
| Matched | 11,093 | 91.3% |
| Driver arrived | 10,503 | 86.4% |
| Started | 10,314 | 84.9% |
| Completed | 10,281 | 84.6% |
| Paid | 10,256 | 84.4% |
Share of requests that never matched a driver. Zones with fewer than 50 requests excluded — a percentage over a handful of trips is noise.
| Zone | Unmet demand | Requests |
|---|---|---|
| Marathahalli | 14.2% | 541 |
| Koramangala | 13.8% | 690 |
| Bellandur | 12.7% | 502 |
| Whitefield | 12.1% | 626 |
| Manyata Tech Park | 11.8% | 434 |
| Sarjapur Road | 11.5% | 391 |
| Electronic City | 11.3% | 559 |
| Cubbon Park | 11.0% | 237 |
| MG Road | 10.3% | 439 |
| Kempegowda Intl - Terminal 2 | 9.4% | 405 |
Revenue-weighted: surge revenue ÷ pre-surge revenue. Not the average of surge_multiplier, which averages ratios and is dominated by cheap trips.
| Hour | Weighted surge |
|---|---|
| 0 | 4.7% |
| 1 | 11.1% |
| 2 | 1.1% |
| 3 | 0.0% |
| 4 | 0.0% |
| 5 | 0.0% |
| 6 | 0.5% |
| 7 | 3.8% |
| 8 | 17.6% |
| 9 | 21.1% |
| 10 | 6.7% |
| 11 | 1.8% |
| 12 | 0.3% |
| 13 | 1.9% |
| 14 | 1.9% |
| 15 | 2.2% |
| 16 | 2.2% |
| 17 | 26.8% |
| 18 | 38.7% |
| 19 | 37.8% |
| 20 | 24.9% |
| 21 | 11.1% |
| 22 | 5.5% |
| 23 | 1.1% |
Gross bookings of ₹5,614,646 decompose exactly into these three. The identity is enforced as an error-severity dbt test, so the pipeline refuses to publish if it ever fails.
| Component | Amount |
|---|---|
| Driver payout | ₹4,277,824.24 |
| Platform commission | ₹1,069,454.56 |
| Tax | ₹267,367.54 |
| Total | ₹5,614,646.34 |
Known defect counts, published rather than hidden. Duplicates arrive because Kafka guarantees at-least-once delivery; zero surviving is the two-pass deduplication working.
| Load date | Events landed | Duplicates left | Late arrivals | Clock-skewed | Orphaned trips | Sequence invalid | Unexplained revenue |
|---|---|---|---|---|---|---|---|
| 2026-03-16 | 1,139 | 0 | 0 | 0 | 0 | 0 | ₹0.00 |
| 2026-03-17 | 29,607 | 0 | 0 | 0 | 27 | 65 | ₹13,937.88 |
| 2026-08-05 | 2,827 | 0 | 5 | 1 | 2 | 3 | ₹0.00 |
| 2026-08-06 | 71,558 | 0 | 411 | 132 | 57 | 144 | ₹16,268.09 |
Weighted surge across the day: 15.29%. 212 trips quarantined and excluded from every figure above; they are exported separately for inspection, because a silent exclusion is indistinguishable from data loss.