📋 STRATEGY BRIEF — SZACOWANE PRZYCHODY

CORE

🎯 Co to pokazuje

Potrafimy oszacować, ile każdy przewoźnik zarabia na pociąg, na korytarz, na dobę. Całka konsumpcji miejsc ważona ceną wzdłuż krzywej rezerwacji. Umożliwia najbardziej uderzające twierdzenie dla zarządu: „Szacowane przychody RegioJet na trasie Praha–Warszawa wynoszą X mln PLN/rok; ich wyjście pozostawia tę pulę do zagospodarowania."

📊 Status danych

✅ Gotowe dla 71% pociągów — price_observations + train_capacities. 🟡 29% bez danych o pojemności (cotygodniowy refresh nie obejmuje nowych pociągów). 98% pokrycia ostatnim snapshotem w ciągu 24h przed odjazdem.

🛠️ Nakład pracy

Średni — całka przychodowa to jedno zapytanie SQL (window query) + sumowanie. UI: siatka przewoźnik × korytarz + widok szczegółowy pociągu. Bez nowej kolekcji danych dla v1.

👥 Rezonans z zarządem

Najsilniejszy mockup pitchowy dla finansowo wykształconych członków zarządu. Przekłada „mamy dane" na „wiemy, ile wart jest rynek". Bezpośrednio wspiera decyzje strategiczne: udział w rynku, skutki wyjścia przewoźnika, scenariusze przejęć.

💡 Moja rekomendacja

Top-3 priorytetów budowy obok 04 Zmiany rynkowe i 07 AI Chat. Wdrożyć z przejrzystym panelem metodologii i zastrzeżeń zgodnie z zasadą „każdy fakt ma źródło".

🔜 Kolejne kroki

(1) Zamknąć lukę 29% pojemności — zbadać cotygodniowy refresh. (2) Dodać fetche T-30/T-20 w daily_fetch.py --horizons. (3) Zbudować zapytanie całki przychodowej na price_observations + train_capacities. (4) Wyrenderować siatkę przewoźnik × korytarz z trendem tydz./tydz.

Łączne przychody rynkowe w tym tygodniu
14,2 mln PLN
↑ +3,1% tydz./tydz. · [źródło]
Wiodący przewoźnik · szacowany udział
PKP IC
58% przychodów korytarzowych [źródło]
Trend przychodów RJ (4 tygodnie)
−18%
↓ Ogłoszenie wyjścia 28 mar · [źródło]
Przychody zagrożone wyjściem RegioJet
2,1 mln PLN/kw.
Szacowane porzucone przychody brutto · [źródło]
Korytarz RJ — RegioJet IC — PKP Intercity LEO — Leo Express Razem
Gdynia – Warszawa – Kraków
248 000 PLN ↓ −6.2% tydz./tydz. [source]
1 320 000 PLN ↑ +4.1% tydz./tydz. [source]
94 000 PLN → +0.5% tydz./tydz. [source]
1 662 000 PLN ↑ +2.8% tydz./tydz.
Warszawa – Kraków
412 000 PLN ↓ −11.3% tydz./tydz. [source]
2 180 000 PLN ↑ +5.8% tydz./tydz. [source]
178 000 PLN ↑ +2.1% tydz./tydz. [source]
2 770 000 PLN ↑ +3.6% tydz./tydz.
Warszawa – Poznań
186 000 PLN ↓ −8.7% tydz./tydz. [source]
1 540 000 PLN ↑ +6.3% tydz./tydz. [source]
nie obsługiwany
1 726 000 PLN ↑ +4.4% tydz./tydz.
Warszawa – Praha
892 000 PLN ↓ −22.4% tydz./tydz. [source]
2 640 000 PLN ↑ +9.1% tydz./tydz. [source]
nie obsługiwany
3 532 000 PLN ↓ −4.2% tydz./tydz.
Praha – Przemyśl
1 140 000 PLN ↓ −14.8% tydz./tydz. [source]
2 260 000 PLN → +0.8% tydz./tydz. [source]
250 000 PLN → −1.2% tydz./tydz. [source]
3 650 000 PLN ↓ −5.1% tydz./tydz.
Suma wszystkich korytarzy 2 878 000 PLN
−14,2% tydz./tydz. · udział 20%
9 940 000 PLN
+5,6% tydz./tydz. · udział 70%
522 000 PLN
+0,6% tydz./tydz. · udział 3,7%
14 208 000 PLN
+3,1% tydz./tydz.

Najedź na komórkę, aby zobaczyć link do źródła API. Przychód = Σ(Δwolne_miejsca × cena) scałkowane przez fetche. Błąd ±10–15% na poziomie pociąg-dzień.

Udział = szacowane tygodniowe przychody brutto przewoźnika ÷ suma korytarza. Udział RJ spada na wszystkich korytarzach od ogłoszenia wyjścia 28 mar.

Trend przychodów przewoźników — 12 sty – 12 kwi 2026
Agregaty tygodniowe · wszystkie 5 korytarzy · mln PLN
RegioJet PKP Intercity Leo Express
▼ 28 mar — ogłoszenie wyjścia RegioJet

Przychody szacowane na podstawie price_observations × train_capacities. Tygodnie przed 12 sty wykluczone z powodu niewystarczającej gęstości snapshotów. [źródło: /api/revenue/timeseries]

# Pociąg Przewoźnik Korytarz Szacowane przychody Obłożenie Pewność
1 EIC 4401 IC Warszawa–Praha 312 000 PLN [src] 88% WYSOKA
2 EIC 103 IC Praha–Przemyśl 298 000 PLN [src] 84% WYSOKA
3 IC 5311 IC Warszawa–Kraków 264 000 PLN [src] 91% WYSOKA
4 RJ 1001 RJ Praha–Przemyśl 248 000 PLN [src] 79% WYSOKA
5 EIP 5100 IC Gdynia–Warszawa–Kraków 231 000 PLN [src] 72% WYSOKA
6 IC 5101 IC Warszawa–Poznań 218 000 PLN [src] 68% ŚREDNIA
7 RJ 1003 RJ Warszawa–Praha 196 000 PLN [src] 63% ŚREDNIA
8 LE 731 LEO Warszawa–Kraków 178 000 PLN [src] 61% ŚREDNIA
9 IC 5407 IC Warszawa–Poznań 164 000 PLN [src] 54% ŚREDNIA
10 RJ 1007 RJ Praha–Przemyśl 152 000 PLN [src] 51% NISKA

HIGH = train_capacities present, ≥10 snapshots in week · MEDIUM = capacity known, 5–9 snapshots · LOW = capacity inferred or <5 snapshots

How we estimate revenue

Revenue(train, week) = Σ over fetches t: (free_seats[t-1] − free_seats[t]) × price[t]
where Δfree_seats > 0 represents observed seat consumption between consecutive snapshots.

Data inputs

  • price_observations — price + free_seats per fetch, per train-day-class
  • train_capacities — total seats per train-class (weekly refresh cron)
  • ~5 snapshots per train-day at cruise horizon; 14-snapshot burst within 24h of departure

Coverage & precision

  • 71% of trains have train_capacities data — used directly
  • 29% capacity inferred from class-seat norms — marked LOW confidence
  • ±10–15% margin of error at train-day level; better in weekly aggregate
  • 98% of trains have a final pre-departure snapshot within 24h

What we cannot see

  • BLIND Discount codes & promo fares applied at checkout
  • BLIND Season tickets / passes (occupancy without revenue)
  • BLIND B2B and corporate contract pricing
  • BLIND Ancillaries — food, WiFi, luggage, reserved seating
  • This is gross ticket revenue only, not total carrier revenue

Data accountability

Every fetch is logged with timestamp and source URL. Full source registry available in view 08 — Data Trust. [/api/fetch-log]

29% capacity gap: under investigation — weekly refresh_train_capacities() cron may be missing trains discovered after last full seed. See CLAUDE.md known issue.

What if… RegioJet exits fully on May 3?
Revenue redistribution under three absorption scenarios · quarterly estimate
Baseline: RJ contributes 2.1M PLN/quarter across monitored corridors
Scenario A — Full IC absorption
Scenario B — Partial absorption
Scenario C — Capacity loss
A — IC absorbs all RJ demand
IC revenue gain/Q+2.1M PLN
IC market share↑ 70% → 90%
Total market revenue≈ stable
LEO impactminimal
Market concentrationhigh risk

Assumes IC can add capacity immediately (trainsets available). Historically IC has absorbed RJ exits on domestic corridors within 2–4 weeks.

B — IC absorbs 60%, LEO absorbs 15%
IC revenue gain/Q+1.26M PLN
LEO revenue gain/Q+0.32M PLN
Revenue lost (unmet demand)−0.52M PLN
IC market share↑ 70% → 80%
Market concentrationmoderate risk

Most likely scenario based on 2020 RJ domestic exit pattern. Demand partially suppressed by fare increases (IC tends to price higher post-competition exit).

C — 25% demand destruction
IC revenue gain/Q+0.84M PLN
Revenue lost (modal shift)−1.26M PLN
Net market revenue−0.84M PLN/Q
IC market share↑ 70% → 83%
Price pressure↑ IC prices +15–25%

Worst case: passengers shift to car/bus/plane on international corridors (esp. WAW–Praha), producing net revenue destruction for the rail market.

Scenarios are model estimates based on historical corridor behaviour and current price_observations. Not forecast. [/api/revenue/scenario/rj-exit]

Design Rationale — Revenue Estimation Methodology & Caveats

Revenue integral approach

Standard revenue management practice: integrate the seat-consumption curve against the price curve to approximate gross yield. We observe snapshots of (price, free_seats) per train-day; the difference in free_seats between consecutive fetches represents consumed seats at that observed price. Summation over all fetches approximates the booking-curve integral.

Why ±10–15%?

  • 5 snapshots/day at cruise horizon means ~20% of intra-day seat movements are unobserved between fetches
  • Price shown in API is the lowest available fare — passengers buying higher classes skew our estimate low
  • Capacity inference for the 29% gap adds ~5% absolute error on aggregate
  • Weekly and monthly aggregates benefit from law of large numbers — errors tend to cancel

Stakeholder rule compliance

Per "every fact must have a source": all revenue figures link to the API endpoint that produced them. The methodology box is mandatory on any published view. The "what we can't see" list is displayed by default, not hidden in a footnote.