How emissions are calculated
auditableThe full data lineage, emission factors with citations, and worked examples so you can verify every number on the emissions dashboard.
The calculation chain (data lineage)
From raw AEMO/BoM signals to the number on the dashboard
Raw data ingestion
ingestionPipeline runs every 5 min; fetches AEMO dispatch + SCADA (5-min grain), BoM weather (hourly, 6 stations), supplier facility disclosures, OpenElectricity historical backfill.
dbt transform
warehouseJoins 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.
Emission factors applied
calculation14 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.
Per-interval calculation
calculationScope 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.
Aggregation
calculationSums across intervals and across regions. National intensity is energy-weighted (so a region with 10× the demand of another contributes 10× the weight).
Dashboard rendering
presentationReads via /v1/emissions/* endpoints. Shows total tCO₂e + kg/MWh intensity + per-region breakdown + fuel mix + forecast projection.
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
scope2NSW1How much location-based Scope 2 emissions does 1 hour of NSW1 demand produce, given the region's average grid intensity?
Emission factors & citations
Every kgCO₂e/MWh value used in the calculation, with its bibliographic source
| Factor | Value | Source | Scope | Notes |
|---|---|---|---|---|
| coal_black_mw | 820 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, black coal) | lifecycle | Includes mining, transport, and combustion. NSW Hunter Valley coal sits at the lower end (~820); other basins can reach 1,000+. |
| coal_brown_mw | 1200 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, brown/lignite coal) | lifecycle | Brown coal has 40-60% more carbon per unit of energy than black coal. VIC Latrobe Valley is the main source. |
| gas_ccgt_mw | 370 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, natural gas combined cycle) | lifecycle | Combined-cycle gas turbines are ~33% more efficient than open-cycle, hence the lower factor. |
| gas_ocgt_mw | 520 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (natural gas, peaking plant) | lifecycle | Open-cycle plants are typically used for peak demand. Higher emissions due to lower thermal efficiency. |
| wind_mw | 10 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, onshore + offshore wind) | lifecycle | Mostly manufacturing emissions (steel, concrete, transport). Operating emissions are zero. |
| solar_utility_mw | 30 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, utility-scale PV) | lifecycle | Includes panel manufacturing + balance-of-system. Lower than rooftop because of better panel efficiency at scale. |
| solar_rooftop_mw | 40 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, distributed PV) | lifecycle | Slightly higher than utility due to smaller panels, less efficient inverters. |
| battery_discharge_mw | 50 kg/MWh | AEMO NGES + literature average | lifecycle | Hard to attribute fairly; this is the lifecycle (manufacturing) emissions per MWh of output. Real-world emissions are zero (storage only shifts demand). |
| hydro_mw | 5 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, hydropower) | lifecycle | Mostly concrete/steel in dam construction. Reservoirs can emit methane (not modeled here). |
| biomass_mw | 50 kg/MWh | IPCC AR5 WG III Annex III Table A.III.2 (median, dedicated biomass) | lifecycle | Often considered carbon-neutral at the stack (CO₂ absorbed during growth). Lifecycle still has processing/transport emissions. |
| nem_grid_avg | 660 kg/MWh | AEMO annual emissions intensity (rolling 12-month) | lifecycle | Used as a fallback when the warehouse column `emissions_intensity_kgco2e_per_mwh` is NULL. Refreshed annually. |
| wem_grid_avg | 580 kg/MWh | AEMO WEM annual emissions intensity | lifecycle | WEM 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
AEMO NEM dispatch + SCADA
primaryAEMO WEM market data
primaryBureau of Meteorology (BoM)
primaryOpenElectricity (OpenNEM)
secondaryIPCC AR5 Working Group III
referenceOpen-Meteo ERA5 reanalysis
secondaryElectricity Maps API
secondaryWhat'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.