Kerem Özdemir

cbam-embedded

A single embedded emissions figure hides the one thing an abatement decision needs.

5 minute read

The problem

A CBAM declarant reports the emissions embedded in each imported good. For a simple product that is one number over one activity level. For anything made in stages it is a chain traced backwards: crude steel carries pig iron, pig iron carries coke and sintered ore, and each of those is a process with its own emissions and its own output. Get the chain wrong in either direction and the declared figure is wrong by a multiple rather than by a margin.

The deeper problem is what the finished figure cannot say. The specific embedded emissions of crude steel tell you how much carbon a tonne of it carries. They do not tell you whether that carbon came out of the coke oven or the blast furnace, and an abatement decision turns entirely on that. Money spent in the wrong shop buys nothing, and the headline number gives no signal at all about which shop is the right one.

There is a third failure that only shows up in a chain with a shared input. Coke feeds the sinter plant and the blast furnace both, so the coke oven is reached down two different paths. Attribute by the immediate supplier and the coke oven appears twice under two different intermediates, and the table adds up to more than the figure it is attributing. A table that does not reconcile is not a rounding problem: it is double counting with a decimal point on it.

The method

Processes are resolved in dependency order by a depth first walk with a visiting set. Each one accumulates the emissions attributed to it plus its electricity plus, for every precursor, the quantity consumed multiplied by that precursor's own specific embedded emissions. The result divided by the activity level is the specific embedded emissions of the good. Direct and indirect are carried as a pair the whole way down and never summed, because CBAM reports them separately and the certificate calculation treats them differently.

The attribution is the part worth getting right. Every entry is keyed by the process that released the emissions rather than by the intermediate it arrived through, and the map of a process is built by folding its precursors' maps into its own, scaled by quantity over activity. A shared input reached down two paths therefore accumulates into one entry with the sum of both contributions. Purchased precursors are keyed under a separate prefix so that a bought good can never collide with a process of the same name.

embedded direct    = attributed + Σ (qty × SEE direct of precursor)
embedded indirect  = MWh × factor + Σ (qty × SEE indirect of precursor)
SEE                = embedded ÷ activity level

origin(p)          = { p: own release ÷ activity }
                     folded with, for each precursor c,
                     origin(c) × qty ÷ activity

                     keyed by who released it, never by who supplied it

The example on the page is an invented integrated steel plant, four processes deep, with coke feeding both the sinter plant and the blast furnace so that the shared input is actually exercised. It resolves to specific embedded emissions of 1.6445 direct and 0.0721 indirect per tonne of crude steel. Those figures come from no published dataset and are labelled as invented on the page itself.

The attribution is where the instrument earns its place. Of the carbon in a tonne of that crude steel, 61.2 per cent was released in the blast furnace, 15.9 in the coke oven, 15.4 in the sinter plant and 7.3 in the steel shop that ships the good. Ninety two point seven per cent of it was released before the steel shop ever saw it. Read the single figure and you would go looking for savings in the wrong building.

What it does

Four processes with every figure editable: activity level, attributed direct emissions, electricity, and the quantity of each precursor consumed. Resolving prints the specific embedded emissions of each process, direct and indirect side by side and never added. A second panel draws the origin of the final good's emissions as a bar per releasing process, and closes with the reconciliation: the attribution added up against the figure it attributes, and the difference between them.

Per processactivity level in tonnes, attributed direct emissions, electricity in MWh
Per precursorthe quantity consumed, and for a purchased one its own SEE from the supplier
Sharedone electricity factor, applied to every process and never merged into direct
Tablespecific embedded emissions per process, direct and indirect in separate columns
Headlinethe share of the final good's carbon released before it reached the last process
Checkthe attribution summed against the SEE it attributes, and the difference printed

What it refuses to do

It refuses a precursor whose emissions nobody stated. If an input has no source process inside the installation it needs supplier data or a default value from the current implementing act, and there is a button on the page whose only job is to empty that field so the refusal can be seen rather than described. Silently treating an unstated input as emission free is the single most reliable way to understate a good, and it is the failure a spreadsheet makes by default.

It refuses to merge direct and indirect into a total. There is no column for the sum anywhere on the page. The streams are reported apart because that is how they are reported to the authority and because the certificate calculation does not treat them alike, and a number that collapses them loses information nothing downstream can recover.

It refuses to iterate a cycle. If two processes each name the other as a precursor the chain has no bottom, and there is no fixed point to converge on that means anything. The instrument prints the loop by name and stops, because a number produced by iterating a circular bill of materials looks exactly like a number produced by a correct one.

Try it

Press the button that leaves a precursor unstated and watch both panels stop rather than quietly returning a smaller number. Then reload the example and read the last line: the attribution and the figure it attributes agree to six decimal places, which is what tells you the shared input was not counted twice.

Open cbam-embedded

github.com/Keremozdemirra/esg-toolkit

A declaration needs one number and this produces it. The reason the rest of the page exists is that the one number is the least useful thing in the chain: it tells a declarant what to report and tells an engineer nothing at all about where to spend.

All tools