Data lineage

Data provenance

Where every number on the owner dashboard comes from — colour-coded by origin. Four sources feed our tables; the dashboard only ever shows what they hold.
A

Uber Supplier Platform

Official, server-side. Trip status, location, hours, trips.

→ signed webhook → /ingest/uber-status
B

Company phone

Device agent. Which app is foreground + duration (no content).

→ UsageStats batch → /ingest/device-usage
C

Fleet Dashboard CSV

Manual export. Acceptance / cancellation rate. May be stale.

→ importer parse → /ingest/acceptance
D

Derived

Our backend computes: sessions, trips, utilization, flags.

→ tripBuilder + rules + reports
Origins → tables → dashboard
raw inputs
A Uber status webhook
status · location · vehicle · timestamp
B Foreground-app sample
package + durationMs (category only)
C Acceptance CSV row
acceptance % · cancellation %
postgres tables
driver_status_events A
device_usage_events B
acceptance_imports C
online_sessions · trips · flags · daily_reports D
computed by tripBuilder + rules from A·B·C
Every dashboard cell → its origin
KPI strip
Online now
A
latest status events
Hours online
DA
sessions (or supplier API)
Fleet utilization
D
on_trip ÷ online
Open / high-sev flags
D
flags table
Driver leaderboard
Status pill
A
Uber webhook
Online / on-trip hours
D
from A via tripBuilder
Util%
D
on_trip ÷ online
Accept% imp
C
CSV import
Distraction dots / flags
D
A × B → rules
Coaching queue
distracting_app_on_trip
AB
trip state × foreground app
low_acceptance · high_cancellation
C
acceptance import
idle_but_online · low_utilization
D
from A (sessions)
Per-driver drilldown
Status lane
A
sessions + trips
App-category lane
B
device_usage_events
⚑ flag marker
D
where B overlaps A
Top distracting apps
B
aggregated usage
Location (at a request)
A
status event lat/lng
Honest caveat: the numbers shown on the dashboard mockup are sample data — but the lineage above is the real architecture (tables, ingest endpoints, and joins all exist and are smoke-tested). Uber-side specifics (exact webhook fields; whether acceptance ever becomes an API field instead of a CSV) remain TODO(verify) until Supplier Platform partner access. None of it contains screen content, audio, or off-shift data.