Carbon accounting platforms look complex from the outside: dashboards, scopes, frameworks, audit trails. Underneath, the core calculation is almost embarrassingly simple:
emissions = activity data × emission factor
Everything else is plumbing, provenance, and edge cases. That's where the engineering lives.
The vocabulary
The GHG Protocol is the standard almost every tool builds on. It splits emissions into:
- Scope 1: direct emissions from sources you own or control (company vehicles, boilers, on-site generators).
- Scope 2: indirect emissions from purchased electricity, heat, steam, and cooling.
- Scope 3: everything else in the value chain, across 15 categories (purchased goods, business travel, transport, use of sold products, and more).
Emissions are reported in CO₂-equivalent (CO₂e), converting other gases using their global warming potential (GWP).
The data model
A minimal model looks something like this:
type Activity = { id: string; orgUnitId: string; scope: 1 | 2 | 3; category: string; // e.g. "stationary_combustion", "purchased_goods" quantity: number; unit: string; // "kWh", "litre", "km", "EUR" periodStart: string; periodEnd: string; source: { type: "invoice" | "meter" | "estimate"; ref?: string }; }; type EmissionFactor = { id: string; activityType: string; unit: string; kgCO2ePerUnit: number; region?: string; year: number; source: string; // e.g. "UK DESNZ 2026", "US EPA" gwpBasis: "AR5" | "AR6"; }; type Calculation = { activityId: string; factorId: string; kgCO2e: number; calculatedAt: string; method: "location" | "market" | "spend" | "activity"; };
The important part is that every calculation links to the exact activity and factor version used. Auditors will ask.
The calculation engine
- Normalise units. Litres vs gallons, kWh vs MWh, currencies and years for spend data.
- Match a factor. By activity type, region, year, and unit. Factor matching is where most bugs hide.
- Calculate and store results immutably.
- Aggregate by scope, category, site, and period.
- Recalculate when factors update, keeping the old results for comparison.
Emission factor sources
Common sources include the UK government conversion factors (published annually by DESNZ), the US EPA's emission factors hub, the IPCC, and the IEA for grid electricity (licensed). Spend-based Scope 3 often uses environmentally extended input-output (EEIO) models.
The hard parts
- Scope 3 data. Supplier data is scarce, so most companies start with spend-based estimates. See Scope 3 Emissions Data: Why It's So Hard to Collect.
- Location vs market-based Scope 2. Report both. Model energy contracts properly.
- Double counting across categories and entities.
- Restatements. When methods or factors change, past years may need recalculation.
- Audit trails. Every number must be traceable to a source document.
Where this connects to regulation
EU rules like the CSRD push companies toward audited emissions reporting, which raises the bar for data quality and traceability. I wrote about the developer side in CSRD Data Pipelines in 2027.