System boundaries: well-to-wheel, cradle-to-gate, EN 15804

Numbers checked against the live data on

A system boundary says which stages of a life cycle a factor counts. Two factors for the same fuel can differ by 15 % or more only because one covers the burn and the other covers the burn plus the fuel's supply chain. Every row in the data names its boundary in system_boundary, so you can check it before you compare or add. Every boundary, with the stages it covers and what each includes by default, is one download: system-boundaries.xlsx.

The terms you will meet#

Term What it covers system_boundary
Tank-to-wheel, combustion Burning the fuel where you use it. Your Scope 1. combustion
Well-to-tank, upstream Extracting, refining and transporting the fuel before you burn it. Scope 3 category 3. upstream_fuel
Well-to-wheel, well-to-use Both of the above: one unit of energy from the well to the point of use. well_to_use
Generation Burning fuel at the power plant, for electricity, steam or heat you buy. Your Scope 2. generation
Network losses Energy lost in transmission and distribution. transmission_distribution
Cradle-to-gate Raw materials through production, up to the factory gate. cradle_to_gate
Cradle-to-grave Cradle-to-gate plus distribution, use and end of life. cradle_to_grave

For a fuel, well-to-use is upstream plus combustion. For delivered electricity, it is generation, the generation's upstream and the network losses, plus the upstream of the losses (transmission_distribution_upstream). Where an electricity publisher prints generation only, open-climate.ai adds those three legs as marked estimates (Estimated electricity legs). It never includes building the power plant or the vehicle: a boundary that does is energy_lifecycle.

The families#

Every boundary code is grouped three ways, and the three answer different questions. boundary_preset says how much of the life cycle the code covers, and it is what the boundary filter groups by. boundary_role says whether a number on that code may be reported alone: whole, part, credit or unknown. boundary_family records which taxonomy the code comes from: where it was defined, not how much it covers. The 55 codes fall into five families:

  • energy_stage (8 codes): stages of an energy chain, such as combustion, upstream_fuel, generation, fugitive and well_to_use.
  • lifecycle (13 codes): whole or partial product life cycles, such as cradle_to_gate, cradle_to_consumer, cradle_to_grave and end_of_life.
  • asset_stage (16 codes): the EN 15804 modules A1 to C4, used by construction product EPDs.
  • contribution (17 codes): one slice of a product's footprint, such as agriculture, transport or packaging, plus module D and avoided-burden credits.
  • unknown (1 code): the publisher states no boundary and its structure does not reveal one.

The boundary is the publisher's own declaration where they state one. Where they do not, it is read from the structure of their data, never guessed from the activity name.

A preset is not a finer or coarser family: the part presets group the EN 15804 modules together with our own contribution slices, so upstream_slice holds A1 and A2 beside agriculture and inputs. To keep only numbers that stand on their own, filter on boundary_role = 'whole', never on the family.

In factor search, filter one code with bcode, for example combustion factors, or a group of codes with bpreset, for example whole energy chains.

Watch out. A merge can retire a code, and a filter on a retired one fails quietly. September folded well_to_wheel into well_to_use, so WHERE system_boundary = 'well_to_wheel' matches nothing rather than erroring, and an aggregate over nothing reads like a zero. Take the surviving codes from the table above or from the view itself, and see the four kinds of change.

Worked example: butane#

ADEME publishes butane for Europe, per kWh, as a well-to-use total with its two parts. The 2014 edition, whose window has no start and closes at 2018, so it answers for any accounting year up to and including 2018:

Part system_boundary kg CO2e per kWh
Combustion combustion 0.22968
Upstream upstream_fuel 0.03780
Well-to-use total well_to_use 0.26748

0.22968 plus 0.03780 is exactly 0.26748. The two parts carry parent_relation = sums_to_parent, which is the data's promise that they add up to the total.

Use the parts to split your inventory by scope: combustion goes to Scope 1, upstream to Scope 3 category 3. Use the total when you only need one number. Never add a part to its total: that counts the same emissions twice.

The current edition (reference year 2019) prints rounded values, 0.23 and 0.0392 for a total of 0.269. Search ADEME butane factors to see both.

Watch out. DESNZ also publishes butane, with a UK well-to-use total of 0.26843 kg CO2e per kWh. The number is close to ADEME's, but check co2e_basis as well as the boundary before treating them as the same thing: see Biogenic carbon.

EN 15804 modules#

Construction product EPDs report their footprint by module, under the European standard EN 15804:

Module Stage
A1 to A3 Product stage: raw materials, transport to the factory, manufacturing. Together, cradle-to-gate.
A4, A5 Transport to the building site, installation.
B1 to B7 Use stage, including B6 operational energy and B7 operational water.
C1 to C4 End of life: demolition, transport, waste processing, disposal.
D Benefits and loads beyond the system boundary, such as a recycling credit.

ÖKOBAUDAT stores each EPD as one total with its modules as children. For the product ALT 100:

  • the total, cradle_to_grave_embodied (every module except the use stage), is 1250.991 kg CO2e per unit;
  • it is the sum of cradle-to-gate (A1 to A3) 1240, A4 0.481, A5 0.432 and end of life 10.078;
  • end of life is itself C2 0.228 plus C3 9.85;
  • module D is -294, with parent_relation = reported_beside_parent.

Module D sits beside the total and is never added to it. The standard requires it to be reported separately.

When an EPD declares a set of modules that is neither a full cradle-to-grave nor the embodied cut, its total is epd_total: "every module this EPD declared", with the modules listed on the factor.

Which boundaries each library uses#

Library Main boundaries (default top-level factors)
ADEME well_to_use, cradle_to_gate, fugitive, unknown, energy_lifecycle, end_of_life
AGRIBALYSE cradle_to_consumer for every factor
AIB generation
DESNZ well_to_use, fugitive, combustion, end_of_life, cradle_to_gate
U.S. EPA end_of_life, combustion, generation
EXIOBASE, Open CEDA, USEEIO cradle_to_gate for every factor
MITECO generation, combustion, fugitive
ÖKOBAUDAT epd_total, cradle_to_grave, cradle_to_grave_embodied, cradle_to_gate

What the boundary does not tell you#

  • Carbon pools. Whether biogenic CO2 or land-use change is counted is not a boundary question. Read co2e_basis and the gas columns: see Biogenic carbon.
  • Absent stages. boundary_scope lists what a boundary includes, may include and excludes. A stage it does not mention is "not established", not "excluded".