Per-bidding-zone carbon intensity for the Nordic grid (NO1–NO5, SE1–SE4), 2025

I have released Khepri, an open per-bidding-zone carbon intensity dataset for the nine Nordic electricity bidding zones — NO1–NO5 and SE1–SE4 — for full-year 2025.

Carbon intensity is derived deterministically from ENTSO-E actual generation per production type and IPCC AR5 Annex III lifecycle emission factors, duration-weighted per zone with an explicit materiality threshold for missing data. Every method choice is fixed in an architecture decision record before computation, so the figures can be recomputed rather than taken on trust.

2025 values range from 14.53 gCO2eq/kWh (SE3, nuclear-dominant) to 39.65 (NO4, the only zone with a material fossil-gas share, 3.63% of its 2025 mix). The annual cross-zone spread — the gap between a country’s cleanest and dirtiest zone in a given year — is consistently wider in Norway (16.7–30.7 gCO2eq/kWh) than in Sweden (5.6–8.0). The release also includes multi-year drift characterisation (NO 2021–2025, SE 2022–2025) and 96-hour per-zone forecasts.

Per-zone Nordic carbon intensity is not new in itself: Electricity Maps covers all nine zones hourly, with open-source parsers and IPCC 2014 factors, and for Sweden the peer-reviewed literature reports per-zone factors too. What this adds is the archived, versioned artefact — a DOI, a fixed method chain, and a pipeline anyone can rerun — rather than a service to query.

The method is production-based. A consumption-based layer using flow tracing is not implemented, and I would be glad to hear from anyone working on zonal flow tracing for the Nordic area.

Regarding consumption‑based flow tracing methods. Is it technically feasible to make loads “responsible” for the marginal carbon they provoke? One potential issue is what happens when an additional megawatt of demand completely changes the dispatch stack and, in the process, bumps the marginal carbon emissions for any number of other loads. Topologically constrained systems can locally saturate in all sorts of unintended and unexpected ways — and do not necessarily behave as docile, smooth systems that play nicely in this context. Thoughts anyone?

@robbie.morrison’s objection lands on marginal attribution, and I think it lands hard. Flow tracing doesn’t make that claim: it’s an average-attribution method, distributing the mix that physically reaches a zone, not the emissions an additional MW provokes. Those are different questions, and the marginal one has the dispatch-stack problem he describes — a single MW can reorder the stack and change the marginal for every other load at once.

The average question is the tractable one, and it’s still not free. Aggregated coupling flow tracing needs no balancing and returns only the mix of net imports; a full consumption mix needs its own balancing step, which is where the method choices become visible and arguable. That’s the layer Khepri doesn’t have yet.

On local saturation: I’d expect it to show up as instability in the attributed mix rather than as a failure of the tracing itself — the tracing follows whatever flows occur. Whether that instability is large enough to matter for the Nordic zones is an empirical question I haven’t answered.

It would be generally useful to be more explicitly about purpose. If you want to deploy operational signals, the flip-flopping of the dispatch stack could present problems should that occur. However, if you want ex-post analysis to attribute carbon to consumption, the dispatch decisions will already have been made and the load flow analysis can then be used to identify the marginal station for each exit node.

It is worth noting that nodal pricing allows for cross-period ramp constraints, which should calm things down a bit too.

Ex-post attribution. The series is realised generation after the fact, so the dispatch decisions are already made by the time anything is computed — which, as you say, is why the flip-flopping doesn’t bite here.

You’re right that identifying the marginal station per exit node is a stronger method than what I have. It needs load flow, which means a network model. Khepri deliberately stops short of that: realised generation by type, lifecycle factors, duration-weighted, no network. So the zone is the finest resolution the method supports, and within a zone there’s no exit node to attribute to.

Worth being explicit about the awkward part, though. Siting, procurement and reporting are forward decisions made with ex-post figures. That doesn’t reintroduce the dispatch problem — the circularity doesn’t come back — but it does mean an average is answering a question a siting decision doesn’t ask. New load asks what the system responds with at the margin; a zonal average says what the mix was. That gap doesn’t close with finer geography, and Khepri doesn’t claim to be a marginal measure.

Clauß et al. looked at hourly average consumption-based emission factors using an input-output method in this paper:

https://www.mdpi.com/1996-1073/12/7/1345

An outdated Python implementation can also be found here:

Full cite added by moderator:

1 Like

Thank you, this is useful. I had not come across it.

Worth adding to your description: it is not only consumption-based. Table 2 gives annual averages in two rows, with imports and without, and the second is a production-side figure. All five Norwegian zones are in that table. So a per-bidding-zone treatment of NO1–NO5 does exist in the peer-reviewed literature, while my preprint and the repository README are written as though it does not. That gets corrected in both.

Their case year is 2015 and mine is 2025, and the factor bases differ: Ecoinvent there, IPCC AR5 medians here. Table A1 sets the two out side by side. The hourly series itself does not appear to be deposited anywhere citable, so what can be checked against a fixed version is the method rather than the numbers. Your implementation narrows that, and its factor file is a useful companion to Table A1.

It also bears on the question above. Their intensity is computed from realised generation and is an average rather than a marginal quantity. The paper draws that distinction explicitly and places its own method on the de-coupled, average side. The intended application is forward, as a penalty signal for predictive control using ENTSO-E’s 72-hour generation forecasts. That removes the ex-post part of the problem I described earlier, but not the average-versus-marginal part.

On the exit-node point, they state the limit plainly. The mix is assumed homogeneous within a bidding zone, one intensity for the whole zone in each hour, and transmission and distribution losses are neglected. The MRIO gives attribution between zones, not the marginal station behind a node inside one.