compliance//3 min read
Building CBAM reporting: from meter readings to embedded emissions
CBAM turns plant data into a number on an invoice. How to model installations, processes and precursors, calculate specific embedded emissions, and produce the communication EU customers need, with an audit trail a verifier can follow.

In short
- Model the plant the way the methodology does: installations, production processes, goods and precursors.
- Calculate from source data (fuel, materials, electricity), and keep every factor and its version.
- Specific embedded emissions are attributed emissions divided by the activity level of a process.
- A verifier must be able to follow every number back to a meter, an invoice or a lab result.
For an exporter of steel, aluminium, cement or fertilisers, the Carbon Border Adjustment Mechanism creates a recurring data product: the embedded emissions of every product shipped to the EU, per installation and per period, delivered to customers in a form they can declare. Spreadsheets get the first report out. Software keeps the next twenty consistent.
Model the plant like the methodology
Entity | Meaning | Example |
|---|---|---|
Installation | A site where production happens | An integrated steel plant |
Production process | A part of the installation producing one good or group of goods | Basic oxygen steelmaking |
Source stream | A fuel or material that releases emissions | Coking coal, natural gas, limestone |
Precursor | An input good that itself has embedded emissions | Pig iron, purchased alloys |
Good | What is sold, identified by customs code | Hot-rolled coil |
From source data to emissions
Most direct emissions are calculated rather than measured: activity data (how much fuel or material was used) multiplied by an emission factor, adjusted by an oxidation or conversion factor. Store the inputs, not just the results.
type SourceStream = {
name: string;
quantity: number; // e.g. tonnes of fuel used in the period
netCalorificValue: number; // TJ per tonne
emissionFactor: number; // tCO2 per TJ
oxidationFactor: number; // 0..1
factorSource: string; // where the factor came from, and its version
};
/** Direct CO2 from one source stream, in tonnes. */
export const streamEmissions = (s: SourceStream) =>
s.quantity * s.netCalorificValue * s.emissionFactor * s.oxidationFactor;Attributing emissions to a process
The emissions of an installation are split across its production processes. Each process's specific embedded emissions is its attributed emissions divided by its activity level, the quantity of goods it produced. For complex goods, add the embedded emissions of the precursors consumed.
type Process = {
attributedDirect: number; // tCO2e attributed to this process in the period
attributedIndirect: number; // tCO2e from electricity, where the sector counts it
activityLevel: number; // tonnes of goods produced
precursors: { quantity: number; specificEmbedded: number }[];
};
/** Specific embedded emissions, tCO2e per tonne of product. */
export function specificEmbeddedEmissions(p: Process, countIndirect: boolean) {
const own = p.attributedDirect + (countIndirect ? p.attributedIndirect : 0);
const fromPrecursors = p.precursors.reduce(
(sum, x) => sum + x.quantity * x.specificEmbedded,
0,
);
return (own + fromPrecursors) / p.activityLevel;
}The full methodology has more rules: system boundaries, measurement-based methods for some sources, treatment of heat and waste gases, and which sectors count indirect emissions. Encode them as tested functions with the rule's reference in a comment, not as formulas scattered across sheets.
Precursor data from your own suppliers
If you buy pig iron, alloys or other precursors, their embedded emissions belong in your numbers. Request them in a structured format, record where each figure came from, and fall back to default values, clearly marked, where a supplier cannot provide data.
An audit trail a verifier can follow
- Keep raw readings and documents: meter exports, fuel invoices, lab analyses of carbon content.
- Version every emission factor and methodology choice, with the date it applied from.
- Lock a reporting period once submitted; corrections create a new version with a reason.
- Link each figure in a customer communication back to the inputs that produced it.
Delivering data to EU customers
EU importers need, per good and installation, the specific embedded emissions and the supporting details their declaration asks for. The Commission publishes a communication template for this. Generate it from the system for each customer and period, and offer an API to larger buyers who want to pull data directly.
A verifier should be able to start at any number in the report and walk back to a meter reading.
Build checklist
- To do: Installations, processes, source streams, precursors and goods modelled
- To do: Activity data imported from meters, ERP and invoices, not typed in
- To do: Emission factors versioned with their sources
- To do: Methodology rules implemented as tested functions
- To do: Precursor data requested, tracked and flagged when defaults are used
- To do: Period locking and versioned corrections
- To do: Customer communications generated per good, installation and period


