TROI
Transition ROI Calculator
1. Identity
Depends on module:
2. Purpose
MEID_CALC_TRANSITION_ROI computes climate transition efficiency and ROI metrics by combining:
- Project cost profiles (CapEx/OpEx, optionally time-phased), sourced from:
MEID_ACCT_CRAWLERoutputs, or- manual client input (same schema)
- Emissions reduction / impact profiles (expected and/or realized)
Primary outputs include:
- CapEx per tCO₂e reduced
- OpEx per tCO₂e reduced
- Total cost per tCO₂e reduced
- Abatement cost (€/tCO₂e) under defined horizons
- Optional finance metrics: NPV, IRR, Payback (if cashflow + discount rate provided)
3. Non-Goals
This engine does NOT:
- validate whether projects qualify as “green”
- infer emissions reductions without an explicit impact profile
- replace formal corporate finance models
- determine EU Taxonomy alignment
4. Inputs
4.1. Project Cost Profile (required)
Accepted from accounting crawler or manual input.
{
"transition_project_id": "ZYZ-DECARB-2026-001",
"tenant_id": "TENANT_X",
"entity_id": "Entity_A",
"reporting_year": 2026,
"currency": "EUR",
"capex_total": 48250000,
"opex_total": 9100000,
"cashflow_timeline": [
{ "period": "2026-01", "capex": 1200000, "opex": 100000 },
{ "period": "2026-02", "capex": 900000, "opex": 80000 }
],
"cost_categories": [
{ "category": "equipment", "amount": 38000000 },
{ "category": "installation", "amount": 6500000 },
{ "category": "consulting", "amount": 2500000 }
],
"reconciliation_status": "passed_with_warnings",
"integrity_flags": [],
"ledger_refs": [
{
"source_system": "SAP_S4",
"source_reference": "1900001:1",
"gl_account": "1500",
"posting_date": "2026-03-01",
"amount": 1250000,
"currency": "EUR"
}
],
"source": {
"source_system": "SAP_S4",
"job_id": "JOB-UUID",
"extracted_at": "2026-02-16T00:00:00.000Z"
}
}
Notes:
cashflow_timelineis optional; if absent, the engine assumes totals occur in the reporting year (configurable).reconciliation_status="manual"allowed when user inputs costs directly.
4.2. Emissions Reduction / Impact Profile (required for €/tCO₂e)
{
"transition_project_id": "ZYZ-DECARB-2026-001",
"impact_basis": "expected",
"time_horizon_years": 10,
"baseline_method_ref": null,
"reduction_tco2e_total": 120000,
"reduction_tco2e_annual": [
{ "year": 2026, "tco2e": 12000 },
{ "year": 2027, "tco2e": 12000 }
],
"scope_coverage": ["scope1", "scope2"],
"material_scope3_categories": [],
"confidence": "high",
"uncertainty": {
"distribution": "triangular",
"p10": 90000,
"p50": 120000,
"p90": 150000
},
"source": {
"source_type": "transition_plan",
"source_ref": null,
"measured_at": null
}
}
Rules:
- Engine will not compute €/tCO₂e without
reduction_tco2e_total > 0.
4.3. Optional Finance Parameters (for NPV/IRR/Payback)
{
"discount_rate": 0.08,
"analysis_horizon_years": 10,
"carbon_price_eur_per_tco2e": 0,
"benefits_cashflow_timeline": [
{ "year": 2026, "amount": 0 }
]
}
5. Core Calculations
5.1. Cost per tCO₂e (expected/realized)
Let:
- =
capex_total(or discounted sum if timeline given + discount_rate) - =
opex_total(same) - =
reduction_tco2e_totalover horizon
If cashflow_timeline is provided and a discount rate is supplied, the engine MUST compute present values:
and use PV-based costs for discounted €/tCO₂e outputs. If no timeline is provided, costs are treated as occurring at (t=0) (policy default).
Compute:
5.2. Abatement Cost (€/tCO₂e)
If benefits_cashflow_timeline provided, compute net cost:
Present Value Formula
Where:
- = cash flow at time t
- = discount rate
- = analysis horizon
5.3. NPV / IRR / Payback (optional)
- NPV uses net cashflows over horizon.
- IRR only computed if sign change exists in net cashflow series.
- Payback = first year cumulative net
cashflow ≥ 0.
6. Validation Rules (deterministic)
- If missing
transition_project_idin either profile → reject.- PV = totals at t=0 (and add flag
PV_ASSUMED_T0)
- PV = totals at t=0 (and add flag
- If
R <= 0→ output €/tCO₂e metrics as null and emitMISSING_OR_ZERO_REDUCTION. - If currency mismatch across cost profiles in same request → reject unless fx conversion ref provided.
- If
reconciliation_status="failed"→ compute but emit warning flagCOSTS_UNRECONCILED.
7. Outputs
7.1. Project ROI Metrics (per project)
{
"transition_project_id": "ZYZ-DECARB-2026-001",
"impact_basis": "expected",
"time_horizon_years": 10,
"currency": "EUR",
"capex_total": 48250000,
"opex_total": 9100000,
"total_cost": 57350000,
"capex_pv": 44580000,
"opex_pv": 8200000,
"total_cost_pv": 52780000,
"reduction_tco2e_total": 120000,
"capex_per_tco2e": 402.08,
"opex_per_tco2e": 75.83,
"total_cost_per_tco2e": 477.91,
"abatement_cost": 390.00,
"npv": 12000000,
"irr": 0.14,
"payback_years": 6,
"group_keys": {
"business_unit": "Manufacturing",
"geography": "EU"
},
"provenance": {
"cost_profile_ref": "ZAR:artifact:transition_project_cost_profile@...",
"impact_profile_ref": "ZAR:artifact:project_emissions_reduction_profile@...",
"ruleset_ref": "ZAR:ruleset:transition_roi_policy@...",
"job_id": "JOB-UUID"
},
"flags": ["COSTS_UNRECONCILED"]
}
7.2 Engine-level summary
- totals / medians / percentiles (useful for dashboards)
- output both nominal and PV metrics
Signals (optional):
When mode="signal", the engine may emit ranked outputs and flags such as:
- top/bottom projects by €/tCO₂e
- outliers (e.g., extremely high €/tCO₂e)
- projects with
reconciliation_status="failed"orconfidence="low"
7.3 Portfolio Rollups (v1)
The engine MUST support optional portfolio rollups across projects to produce board/CFO-ready metrics.
{
"rollup_key": "business_unit",
"rollup_value": "Manufacturing",
"project_count": 12,
"total_capex": 180000000,
"total_opex": 35000000,
"total_reduction_tco2e": 420000,
"portfolio_total_cost_per_tco2e": 511.90,
"flags": []
}
Rollup inputs
group_by: list of keys (e.g.,["business_unit", "geography", "program"])rollup_weighting: one ofby_tco2e | by_cost | unweighted
Rollup calculations For each rollup group (g):
Portfolio cost per tCO₂e:
The engine MUST also output project_count, total_capex, total_opex, and total_reduction_tco2e per rollup group.
8. Provenance & Audit Trail
Outputs must include:
- references to input artifacts (ledger refs, reconciliation report refs)
- ruleset refs (if any)
- calculation parameters (discount rate, horizon)
- timestamp + job id
This ensures re-computation reproducibility.
9. API Contract (request)
{
"mode": "calculation",
"reporting_currency": "EUR",
"calculation_params": {
"discount_rate": 0.08,
"analysis_horizon_years": 10,
"pv_method": "discrete_monthly",
"rollup_weighting": "by_tco2e"
},
"rollups": {
"group_by": ["business_unit", "geography"]
},
"projects": [
{
"cost_profile": { },
"impact_profile": { },
"finance_params": { }
}
]
}
Response:
- array of per-project ROI metrics + optional summary.
10. Integration Notes
- Primary upstream source:
MEID_ACCT_CRAWLER→transition_project_cost_profile - Alternative source: manual input from Input Hub
- Downstream consumers:
- ESRS E1-1 financial linkage reporting
- Transition plan dashboards
- Ranking engine (best €/tCO₂e initiatives)
- Monte Carlo scenario engines (cost uncertainty extensions)