Skip to main content
Jira progress: loading…

TROI

Transition ROI Calculator

1. Identity

Loading 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_CRAWLER outputs, 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.

project-cost-profile.jsonGitHub ↗
{
"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_timeline is 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)

impact-profile.jsonGitHub ↗
{
"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)

finance-parameters.jsonGitHub ↗
{
"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:

  • CcapexC_{\text{capex}} = capex_total (or discounted sum if timeline given + discount_rate)
  • CopexC_{\text{opex}} = opex_total (same)
  • RR = reduction_tco2e_total over horizon

If cashflow_timeline is provided and a discount rate rr is supplied, the engine MUST compute present values:

  • Ccapex,PV=PV(CapEx cashflows)C_{\text{capex,PV}} = PV(\text{CapEx cashflows})
  • Copex,PV=PV(OpEx cashflows)C_{\text{opex,PV}} = PV(\text{OpEx cashflows})

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:

  • capex_per_tCO2e=CcapexR\text{capex\_per\_tCO}_2\text{e} = \frac{C_{\text{capex}}}{R}
  • opex_per_tCO2e=CopexR\text{opex\_per\_tCO}_2\text{e} = \frac{C_{\text{opex}}}{R}
  • total_cost_per_tCO2e=Ccapex+CopexR\text{total\_cost\_per\_tCO}_2\text{e} = \frac{C_{\text{capex}} + C_{\text{opex}}}{R}

5.2. Abatement Cost (€/tCO₂e)

If benefits_cashflow_timeline provided, compute net cost:

  • Net Cost=PV(Costs)PV(Benefits)\text{Net Cost} = PV(\text{Costs}) - PV(\text{Benefits})
  • Abatement Cost=Net CostR\text{Abatement Cost} = \frac{\text{Net Cost}}{R}

Present Value Formula

PV(X)=t=0TXt(1+r)tPV(X) = \sum_{t=0}^{T} \frac{X_t}{(1 + r)^t}

Where:

  • XtX_t = cash flow at time t
  • rr = discount rate
  • TT = 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_id in either profile → reject.
    • PV = totals at t=0 (and add flag PV_ASSUMED_T0)
  • If R <= 0 → output €/tCO₂e metrics as null and emit MISSING_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 flag COSTS_UNRECONCILED.

7. Outputs

7.1. Project ROI Metrics (per project)

project-roi-metrics.jsonGitHub ↗
{
"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" or confidence="low"

7.3 Portfolio Rollups (v1)

The engine MUST support optional portfolio rollups across projects to produce board/CFO-ready metrics.

portfolio-rollup.jsonGitHub ↗
{
"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 of by_tco2e | by_cost | unweighted

Rollup calculations For each rollup group (g):

  • Cg=ig(Ccapex,i+Copex,i)C_g = \sum_{i \in g} (C_{\text{capex},i} + C_{\text{opex},i})
  • Rg=igRiR_g = \sum_{i \in g} R_i

Portfolio cost per tCO₂e:

portfolio_total_cost_per_tCO2eg=CgRg\text{portfolio\_total\_cost\_per\_tCO}_2\text{e}_g = \frac{C_g}{R_g}

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)

api-contract.jsonGitHub ↗
{
"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_CRAWLERtransition_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)



GitHub RepoRequest for Change (RFC)