How emissions are calculated

auditable

The full data lineage, emission factors with citations, and worked examples so you can verify every number on the emissions dashboard.

Back to emissions

The calculation chain (data lineage)

From raw AEMO/BoM signals to the number on the dashboard

1

Raw data ingestion

ingestion
Source
AEMO NEM/WEM, BoM, OpenElectricity, supplier disclosures
Output
MongoDB `ecolens_raw` collections

Pipeline runs every 5 min; fetches AEMO dispatch + SCADA (5-min grain), BoM weather (hourly, 6 stations), supplier facility disclosures, OpenElectricity historical backfill.

typical latency: 1-3 min per source
2

dbt transform

warehouse
Source
dbt 1.7 + Postgres 15
Output
Warehouse `fact_demand_30min` (one row per region per 30-min interval)

Joins demand, generation mix (coal/gas/wind/solar/hydro/battery), weather, holidays. BRIN index on `ts_30` for fast range scans. 5-day lookback window catches late AEMO final-tier data.

typical latency: 2-5 min
3

Emission factors applied

calculation
Source
IPCC AR5 Working Group III + AEMO NGES
Output
Static lookup table (see /v1/emissions/factors)

14 lifecycle factors for each fuel type. Coal brown is the most carbon-intensive (1,200 kgCO₂e/MWh); wind is the cleanest (10 kg/MWh). NEM grid average: 660 kg/MWh. WEM grid average: 580 kg/MWh.

typical latency: <1ms (lookup)
4

Per-interval calculation

calculation
Source
this API (`scope2_from_intensity` + `scope1_from_generation_mix`)
Output
kgCO₂e per 30-min interval per region

Scope 2 (location-based): demand_mw × intensity × 0.5h. Scope 1 (fuel-attributed): sum of (fuel_mw × factor × 0.5h) for each fuel in the generation mix. Each interval is independent and auditable.

typical latency: ~1ms per interval
5

Aggregation

calculation
Source
this API (`aggregate_by_bucket`)
Output
hour/day/month/year rollups + NEM totals

Sums across intervals and across regions. National intensity is energy-weighted (so a region with 10× the demand of another contributes 10× the weight).

typical latency: ~50ms per rollup
6

Dashboard rendering

presentation
Source
Next.js 14 dashboard
Output
Charts, tables, KPIs on /dashboard/emissions

Reads via /v1/emissions/* endpoints. Shows total tCO₂e + kg/MWh intensity + per-region breakdown + fuel mix + forecast projection.

typical latency: Cache hit: 5ms · Cache miss: 80-200ms

Verify a real number

Pick a region and we'll show you the actual warehouse values that went into the calculation

The trace calls GET /v1/emissions/trace?region=NSW1&limit=5 and returns the real warehouse values (`fct_carbon_intensity` + the per-fuel `fct_generation_mix` rows that sum into it) — not a mock.

Worked examples

Verify the math by hand

Scope 2: 1 hour of NSW1 demand

scope2NSW1

How much location-based Scope 2 emissions does 1 hour of NSW1 demand produce, given the region's average grid intensity?

Inputs
Average demand7,800 MW
Grid intensity640 kgCO₂e/MWh
Duration1 hour
Step-by-step
energy_served = demand × hours = 7,800 × 1
7,800 MWh
scope2 = energy × intensity = 7,800 × 640
4,992,000 kgCO₂e
scope2_tonnes = 4,992,000 ÷ 1,000
4,992 tCO₂e
Final answer
1 hour of average NSW1 demand produces ~4,992 tCO₂e (Scope 2).

Emission factors & citations

Every kgCO₂e/MWh value used in the calculation, with its bibliographic source

FactorValueSourceScopeNotes
coal_black_mw820 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, black coal) lifecycleIncludes mining, transport, and combustion. NSW Hunter Valley coal sits at the lower end (~820); other basins can reach 1,000+.
coal_brown_mw1200 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, brown/lignite coal) lifecycleBrown coal has 40-60% more carbon per unit of energy than black coal. VIC Latrobe Valley is the main source.
gas_ccgt_mw370 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, natural gas combined cycle) lifecycleCombined-cycle gas turbines are ~33% more efficient than open-cycle, hence the lower factor.
gas_ocgt_mw520 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (natural gas, peaking plant) lifecycleOpen-cycle plants are typically used for peak demand. Higher emissions due to lower thermal efficiency.
wind_mw10 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, onshore + offshore wind) lifecycleMostly manufacturing emissions (steel, concrete, transport). Operating emissions are zero.
solar_utility_mw30 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, utility-scale PV) lifecycleIncludes panel manufacturing + balance-of-system. Lower than rooftop because of better panel efficiency at scale.
solar_rooftop_mw40 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, distributed PV) lifecycleSlightly higher than utility due to smaller panels, less efficient inverters.
battery_discharge_mw50 kg/MWhAEMO NGES + literature averagelifecycleHard to attribute fairly; this is the lifecycle (manufacturing) emissions per MWh of output. Real-world emissions are zero (storage only shifts demand).
hydro_mw5 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, hydropower) lifecycleMostly concrete/steel in dam construction. Reservoirs can emit methane (not modeled here).
biomass_mw50 kg/MWhIPCC AR5 WG III Annex III Table A.III.2 (median, dedicated biomass) lifecycleOften considered carbon-neutral at the stack (CO₂ absorbed during growth). Lifecycle still has processing/transport emissions.
nem_grid_avg660 kg/MWhAEMO annual emissions intensity (rolling 12-month) lifecycleUsed as a fallback when the warehouse column `emissions_intensity_kgco2e_per_mwh` is NULL. Refreshed annually.
wem_grid_avg580 kg/MWhAEMO WEM annual emissions intensity lifecycleWEM is dirtier than NEM (more coal, less renewables per MWh). Used as fallback for WEM rows.

Data sources

Every input dataset, with its license and what it contributes

What's NOT in scope

Scope 3 (value chain): Not currently modeled. The GHG Protocol's Scope 3 includes purchased goods, transport, employee commute, use-of-sold-product, and end-of-life. We'd need supplier-level data to add this.

Market-based Scope 2: We report location-based Scope 2 (the grid's average intensity). The alternative is market-based Scope 2, which subtracts the renewable attribute of any GreenPower / LGCs you purchased. We can add a market-based view if you tell us your RECs.

Direct facility-level Scope 1: Our Scope 1 is fuel-attributed (i.e. the share of grid generation we can attribute to our demand). For facility-level Scope 1 (combustion of diesel, gas, refrigerants on-site), we combine supplier disclosures and our own metering here.

Reconciliation cadence: Supplier disclosures are annual; our dashboard rolls up monthly. Expect a small divergence at year-end until disclosures land.