Companion to: fuel-impact-2026-05-29.html
Generated: 2026-05-29 by build_report.py (fuel-impact-report skill, MC-3483)
Purpose: step-by-step record of every input value used — verify the math from this doc alone.
| # | Source | File | Last read |
|---|---|---|---|
| 1 | IATA Jet Fuel Price Monitor | ~/Dropbox/Safair/Reporting Data/Data Fuel.xlsx |
2026-05-29 |
| 2 | B4i Fuel Feedback (Bernd Feucht) | ~/workspace/PKA/SecondBrain/wiki/concepts/Fuel-Prices-B4i.md |
embedded as base64 in HTML |
| 3 | Radixx route surcharge | ~/workspace/PKA/SecondBrain/wiki/concepts/fuel-surcharge-data/surcharge_history.json |
embedded as pivot JSON in HTML |
| 4 | FinDash kpi_data | ~/workspace/PKA/Projects/findash/data/kpi_data.json |
2026-05-29 |
| 5 | May MTD dashboard | ~/Dropbox/Safair/Reporting Data/dashboard/dashboard_data.json |
2026-05-29 |
| Parameter | Value | Basis | As-of |
|---|---|---|---|
| MAY_FLIGHTS | 4,991 flights | May schedule | 2026-05-29 |
| MAY_SEATS | 943,040 seats | May schedule | 2026-05-29 |
MC-3517 note: March + April estimate constants removed. All cost fields now read
directly from kpi_data.json actuals (fuel_r, fuel_uplift,
avg_fuel_per_liter_uplifted, total_costs, pbt_r).
NON_FUEL_PER_FLIGHT derived at runtime from April actuals: (total_costs − fuel_r) / flights.
| Metric | Value | kpi_data key |
|---|---|---|
| Flights | 5,640 | flights |
| Pax | 952,399 | pax |
| Seats | 1,062,072 | seats |
| Load Factor | 89.7% | load_factor |
| Yield | R1,329 | yield |
| Revenue | R1,233.5M | revenue_r |
| Fuel uplift | 28.613M L | fuel_uplift — ACTUAL |
| Fuel R/L delivered | R14.62 | avg_fuel_per_liter_uplifted — ACTUAL |
| Fuel cost | R418.4M | fuel_r — ACTUAL |
| Non-fuel cost | R717.8M = total_costs − fuel_r | derived |
| — Direct (ex-fuel) | R388.1M = total_direct_costs − fuel_r | kpi_data |
| — Overheads | R329.7M = total_overheads | kpi_data |
| Total costs | R1,136.3M | total_costs — ACTUAL |
| PBT | R127.4M | pbt_r — ACTUAL |
| Reconciliation check | revenue − fuel − non_fuel = R97.2M vs pbt_r R127.4M | gap R30.22M |
| Metric | Value | kpi_data key |
|---|---|---|
| Flights | 5,307 | flights |
| Pax | 861,063 | pax |
| Seats | 999,135 | seats |
| Load Factor | 86.2% | load_factor |
| Yield | R1,628 | yield |
| Revenue | R1,427.2M | revenue_r — ACTUAL |
| Fuel uplift | 26.637M L | fuel_uplift — ACTUAL |
| Fuel R/L delivered | R26.52 | avg_fuel_per_liter_uplifted — ACTUAL |
| Fuel cost | R706.5M | fuel_r — ACTUAL |
| Non-fuel cost | R683.5M = total_costs − fuel_r | derived |
| — Direct (ex-fuel) | R360.2M = total_direct_costs − fuel_r | kpi_data |
| — Overheads | R323.3M = total_overheads | kpi_data |
| Total costs | R1,390.1M | total_costs — ACTUAL |
| PBT | R43.7M | pbt_r — ACTUAL |
| Reconciliation check | revenue − fuel − non_fuel = R37.2M vs pbt_r R43.7M | gap R6.54M |
| Non-fuel/flight | R128,797 | April reference; May uses direct per-flight + overheads flat (Mar–Apr avg) |
| L/flight | 5,019 | apr fuel_uplift / apr flights — used for May |
| Lens | Result |
|---|---|
| Per-pax yield recovery | R299 ÷ R381 = 78% |
| Per-flight rev recovery | R50K ÷ R59K = 85% |
| Network revenue ÷ fuel hike | R194M ÷ R288M = 67% |
| Total absorption (rev + nonfuel saving) ÷ fuel hike | R228M ÷ R288M = 79% |
May (projection) column. The Recovery + comparison tables in the HTML report carry a third May (proj) column = the headline Base-case projection (rev R1,170.8M · fuel R583.4M @ R24.02/L · PBT −R73.7M). It is a projection, not a closed month, and is excluded from the recovery ratios above: those measure absorption of the March→April fuel hike, whereas April→May fuel falls (smaller, lower-volume month + B4i easing) — there is no hike to absorb into May.
Step 1 — Prior-month (April) actual delivered R/L anchor:
Apr actual R/L = 706.54M ÷ 26.637M = R26.5200/L (kpi_data ACTUAL)
Step 2 — Anchored easing (B4i, weighted by uplift-share-by-airport):
Uplift mix (QV fuel burn): JNB 42%, CPT 35%, DUR 8%, HLA 8%
B4i May per-location decreases, weighted by uplift share -> net easing R2.50/L
May central R/L = Apr R26.52 - R2.50 = R24.02/L
CAVEAT: B4i markdown stores weekly deltas, not absolute per-location levels (those live in B4i email attachments, not extracted) — hence an anchored blend, not a full matrix. Fuel R/L is the only May input not yet factual; GL closes at month-end.
Step 3 — Scenario band: Optimistic R23.02 (more easing) · Base R24.02 (central) · Pessimistic R25.02 · Floor R26.52 (April flat, no ease)
Revenue/day = Actual Pax × Pax Yield (validated ~1.8% vs GL April). Flown days 1–28 are actual; remaining days projected at last-week rev/flight (conservative; MTD rev/flight = upside).
| Metric | Value | Source |
|---|---|---|
| MTD period | days 1–28 flown | SummaryExcel LF Daily |
| MTD revenue | R1,053.7M | Actual Pax × Pax Yield |
| MTD flights | 4,422 | SummaryExcel |
| MTD LF | 80.8% | actual flown |
| MTD yield | R1,561 | actual flown |
| Last-week rev/flight | R230,086 | days 22–28 (remainder basis) |
| MTD rev/flight | R238,294 | upside basis |
| Remaining flights | 509 | scheduled |
| Full-month revenue (last-week) | R1,170.8M | MTD + remaining × last-week rev/flight |
| Full-month revenue (MTD basis) | R1,175.0M | upside |
Full-month uplift = Apr actual uplift 26.64M L
x (May flights 4,931 / Apr flights 5,307)
x burn-intensity ratio 0.981 (May burn/blkhr / Apr burn/blkhr)
= 24.29M L
Period-independent: intensity sidesteps the QV partial-month cutoff.
QV fuel burn reconciles 1.00 on uplift vs kpi_data for closed months.
| Parameter | Value | Basis |
|---|---|---|
| Flights (full month) | 4,931 | SummaryExcel actual+booked |
| Fuel volume | 24.29M L | activity×intensity |
| Implied L/flight | 4,926 | volume ÷ flights |
| Non-fuel/flight | R128,797 | Apr actual (total_costs−fuel_r)÷flights |
| Non-fuel total | R661M | direct (ex-fuel) per-flight + overheads flat (Mar–Apr avg) |
| Scenario | Fuel R/L | Yield | LF | Revenue | Fuel | Non-fuel | PBT | Margin |
|---|---|---|---|---|---|---|---|---|
| Optimistic | R23.02 | R1,561 | 80.8% | R1,175M | R559M | R661M | −R45M | -3.9% |
| Base case [actuals] | R24.02 | R1,558 | 80.7% | R1,171M | R583M | R661M | −R74M | -6.3% |
| Pessimistic | R25.02 | R1,558 | 80.7% | R1,171M | R608M | R661M | −R98M | -8.4% |
| Base [MTD rev/flight upside] | R24.02 | R1,561 | 80.8% | R1,175M | R583M | R661M | −R70M | -5.9% |
| Floor — April fuel R/L held flat [downside floor] | R26.52 | R1,558 | 80.7% | R1,171M | R644M | R661M | −R134M | -11.5% |
Floor basis (2026-05-18, Pieter reconciliation): April actual delivered R26.52/L held flat. Same flights/seats/non-fuel/yield/LF as headline Base-MTD; only fuel R/L differs. Defensible because the skill's own M2 caveat flags monthly supplier contracts lag IATA weekly spot (April delivered R/L rose while IATA fell).
Assertion: (revenue − total_costs) ≈ pbt_r.
Gap = non-operating IS items (finance costs, tax, other income) not captured in total_costs.
Warn gate: max(R15M, 1% revenue) — amber NOTE in report.
Fail gate: R50M — red WARNING block in report.
| Month | rev − costs | pbt_r | Gap | other_is | Warn gate | Status |
|---|---|---|---|---|---|---|
| Mar | R97.2M | R127.4M | R30.2M | R30.2M | R15.0M | WARN |
| Apr | R37.2M | R43.7M | R6.5M | R6.5M | R15.0M | PASS |
| May (proj) | −R73.7M | −R73.7M | — | — | — | proj — operating only (rev−costs≡PBT; no non-op IS projected) |
Identity: revenue_Δ − fuel_hike + nonfuel_saving + other_IS_movement = −pbt_drop
Revenue increase: +R193.7M
Fuel hike: −R288.1M
Non-fuel saving: +R34.3M
Other IS movement: −R23.7M (apr_other_is=R6.5M, mar_other_is=R30.2M)
PBT drop: −R83.7M
Bridge check: R288.1M ≈ R288.1M
All figures are closed-month ACTUALS from kpi_data.json (fuel_r, fuel_uplift,
pbt_r, revenue_r, pax, flights, avg_fuel_per_liter_uplifted). No estimates,
no MTD month. CY (2026) and LY (2025) summed over the SAME closed months for a
like-for-like view.
YTD window: Jan–Apr (Jan, Feb, Mar, Apr) — no months excluded
Headline impact (the two side-by-side numbers):
YTD extra fuel spend vs 2025 = Σ fuel_r 2026 − Σ fuel_r 2025
= R1,726.5M − R1,339.8M = +R386.7M
YTD PBT delta vs 2025 = Σ pbt_r 2026 − Σ pbt_r 2025
= R256.1M − R532.6M = −R276.5M
Fuel hike absorbed (not in PBT) = extra fuel + pbt delta = R110.2M
YTD table (Jan–Apr):
| Metric | 2026 | 2025 | Δ |
|---|---|---|---|
| Fuel cost | R1,726.5M | R1,339.8M | +28.9% |
| Fuel volume | 107.4M L | 101.8M L | +5.4% |
| Blended R/L | R16.08 | R13.16 | +22.2% |
| Revenue | R4,633.4M | R4,394.9M | +5.4% |
| PBT | R256.1M | R532.6M | -51.9% |
Apr 2026 vs Apr 2025 (actuals month YoY):
| Metric | Apr 2026 | Apr 2025 | Δ |
|---|---|---|---|
| Fuel cost | R706.5M | R347.3M | +103.4% |
| Fuel R/L | R26.52 | R12.66 | +109.5% |
| Revenue | R1,427.2M | R1,275.2M | +11.9% |
| PBT | R43.7M | R255.0M | -82.9% |
fuel_r, fuel_uplift, total_costs, pbt_r). No estimates used.CONSTANTS dict in build_report.py.Generated 2026-05-29 · build_report.py · MC-3483/MC-3517