Report electric vehicle emissions

Numbers checked against the live data on

This page shows queries.

For an electric car you report per kilometre, use the derived well-to-wheel total: 0.04001 kg CO2e per km for the DESNZ average battery car, not the printed 0.02951, which leaves out the fuel chain behind the grid. For a company car, split that same total by scope: the generation leg, 0.02686, is Scope 2; the losses, 0.00266, and the fuel chain, 0.01049, are Scope 3 category 3.

Short answers#

Every value is DESNZ's, for the UK, in kg CO2e under the GWP set DESNZ publishes with (value_co2e_native). The queries that return each number are further down the page.

Your situation What you know Factor to use Where it goes
Company-owned or leased EV, charged on your own meter or card kWh charged UK grid per kWh, leg by leg: generation 0.13096, losses 0.01299, fuel chain 0.03682 + 0.00359 Generation in Scope 2 (location-based). Losses and both fuel-chain legs in Scope 3 category 3. Complete total 0.18436.
Company-owned or leased EV km driven Average battery car per km: generation 0.02686, losses 0.00266, fuel chain 0.01049 Same split: 0.02686 in Scope 2, 0.00266 + 0.01049 in category 3.
Business travel or commuting in an EV you do not own km driven The derived total, 0.04001 per km All of it in Scope 3 category 6 (business travel) or category 7 (commuting).
Electric van you own, or freight you buy by the van km or tonne-km The derived total: 0.06442 per km, 0.20338 per t.km Owned: split as for a company car. Bought-in freight: category 4 or 9.
Plug-in hybrid on business travel km driven The business-travel total, 0.12852 per km Category 6. Do not add the plug-in hybrid's electricity row on top: it is already inside (see below).

Note. The per-km rows are on the UK grid's average mix, so they are location-based. For a market-based figure, start from the kWh charged and use your supplier's factor in place of the generation leg: see market-based and location-based electricity. The losses and the fuel chain stay location-based either way.

Watch out. Compare like with like. The petrol average car is 0.20751 per km well to wheel, which includes the petrol's own fuel chain. Set it against the printed 0.02951 and the electric car looks about a quarter better than it is; set it against 0.04001.

Per kWh: the UK grid, leg by leg#

When you know the kilowatt-hours you charged, the vehicle does not matter: the factor is the grid's.

The UK grid kilowatt-hour as DESNZ prints it, one row per leg, and the two totals open-climate.ai sums from them: the losses with their fuel chain, and the complete total.

Show the SQL
SELECT system_boundary,
       is_derived,
       is_top_parent,
       reference_year,
       round(value_co2e_native::numeric, 5) AS kg_co2e_per_kwh
FROM open_ef.factors_flat
WHERE library = 'desnz'
  AND root_slug = 'ef-desnz-electricity_generated-gb-kwh-grid_supplied-acf0f7bd'
  AND is_default_indicator
  AND is_latest_activity_year
ORDER BY is_derived, system_boundary;
system_boundary is_derived is_top_parent reference_year kg_co2e_per_kwh
generation false false 2026 0.13096
transmission_distribution false false 2026 0.01299
transmission_distribution_upstream false false 2026 0.00359
upstream_fuel false false 2026 0.03682
transmission_distribution true false 2026 0.01658
well_to_use true true 2026 0.18436

generation is what the power stations emit for each kWh you use, and the only leg that is Scope 2. transmission_distribution is the generation emissions of the electricity lost in the wires. upstream_fuel is the extraction, processing and transport of the fuel the stations burn, and transmission_distribution_upstream is the same for the lost electricity. All four are printed by DESNZ; the two derived rows are their sums, and the complete one, 0.18436, is the top-level row. System boundaries says what each code covers.

Per km: the average battery car#

DESNZ prints the electric car's charging electricity in one table and its fuel chain in another. Factor search files all three legs under the same car and sums them.

Every row for the DESNZ average battery car: the three printed legs, the printed total, the derived total over all three, and the managed-assets row; and whether each total includes the fuel chain.

Show the SQL
SELECT activity_full,
       system_boundary,
       is_derived,
       is_top_parent,
       boundary_scope ->> 'upstream_fuel' AS fuel_chain,
       round(value_co2e_native::numeric, 5) AS kg_co2e_per_km
FROM open_ef.factors_flat
WHERE library = 'desnz'
  AND activity_full LIKE '%(by size) - Average car - Battery Electric Vehicle'
  AND is_default_indicator
  AND is_latest_activity_year
ORDER BY activity_full, is_top_parent, is_derived, system_boundary;
activity_full system_boundary is_derived is_top_parent fuel_chain kg_co2e_per_km
Cars (by size) - Average car - Battery Electric Vehicle generation false false out 0.02686
Cars (by size) - Average car - Battery Electric Vehicle transmission_distribution false false out 0.00266
Cars (by size) - Average car - Battery Electric Vehicle upstream_fuel false false in 0.01049
Cars (by size) - Average car - Battery Electric Vehicle well_to_use false true out 0.02951
Cars (by size) - Average car - Battery Electric Vehicle well_to_use true true in 0.04001
Managed cars (by size) - Average car - Battery Electric Vehicle well_to_use false true out 0.02951

Two top-level rows describe the same car. The printed one, 0.02951, is DESNZ's own total, generation plus losses; it stays as published. The derived one, 0.04001, is 0.02686 + 0.00266 + 0.01049, and its boundary_scope says the fuel chain is in. Pick the derived one when you report well to wheel.

Watch out. The managed-assets row, 0.02951, is the one DESNZ prints for company cars. It is generation plus losses, so it is not all Scope 2: put 0.02686 in Scope 2 and 0.00266 in category 3, and add the fuel chain, 0.01049, to category 3.

Against fossil cars and the plug-in hybrid#

The complete per-km totals of the DESNZ average car by fuel, each one combustion (or charging) plus its fuel chain.

Show the SQL
SELECT activity_full,
       round(value_co2e_native::numeric, 5) AS kg_co2e_per_km
FROM open_ef.factors_flat
WHERE library = 'desnz'
  AND activity_full IN ('Cars (by size) - Average car - Battery Electric Vehicle',
                        'Cars (by size) - Average car - Plug-in Hybrid Electric Vehicle (Business travel- land)',
                        'Cars (by size) - Average car - Petrol',
                        'Cars (by size) - Average car - Diesel')
  AND unit_code = 'km'
  AND system_boundary = 'well_to_use'
  AND is_derived
  AND is_default_indicator
  AND is_latest_activity_year
ORDER BY kg_co2e_per_km;
activity_full kg_co2e_per_km
Cars (by size) - Average car - Battery Electric Vehicle 0.04001
Cars (by size) - Average car - Plug-in Hybrid Electric Vehicle (Business travel- land) 0.12852
Cars (by size) - Average car - Petrol 0.20751
Cars (by size) - Average car - Diesel 0.21411

The plug-in hybrid#

DESNZ prints a plug-in hybrid three ways, and two of them overlap.

Every row for the DESNZ average plug-in hybrid: the electricity it charges, the petrol it burns, and the business-travel row that holds both.

Show the SQL
SELECT activity_full,
       system_boundary,
       is_top_parent,
       round(value_co2e_native::numeric, 5) AS kg_co2e_per_km
FROM open_ef.factors_flat
WHERE library = 'desnz'
  AND activity_full LIKE 'Cars (by size) - Average car - Plug-in Hybrid Electric Vehicle%'
  AND unit_code = 'km'
  AND is_default_indicator
  AND is_latest_activity_year
ORDER BY activity_full, system_boundary;
activity_full system_boundary is_top_parent kg_co2e_per_km
... Plug-in Hybrid Electric Vehicle generation false 0.00873
... Plug-in Hybrid Electric Vehicle transmission_distribution false 0.00086
... Plug-in Hybrid Electric Vehicle upstream_fuel false 0.00269
... Plug-in Hybrid Electric Vehicle well_to_use true 0.01228
... Plug-in Hybrid Electric Vehicle (Business travel- land) combustion false 0.09918
... Plug-in Hybrid Electric Vehicle (Business travel- land) upstream_fuel false 0.02934
... Plug-in Hybrid Electric Vehicle (Business travel- land) well_to_use true 0.12852
... Plug-in Hybrid Electric Vehicle (Passenger vehicles) combustion true 0.08959

The electricity total, 0.01228, is generation 0.00873, losses 0.00086 and the fuel chain behind that electricity, 0.00269. DESNZ prints no fuel chain for a hybrid's electricity on its own, so that leg is estimated from the UK grid (see below) and the total is marked is_estimated.

Watch out. The business-travel row's combustion leg, 0.09918, is the petrol burnt, 0.08959, plus the electricity charged, 0.00873 + 0.00086, and its total, 0.12852, adds DESNZ's own fuel chain of both. Use 0.12852 alone for business travel. Adding the electricity total to it counts the charging twice. For a company plug-in hybrid, report 0.08959 in Scope 1 and the electricity total split as for a battery car: generation in Scope 2, losses and fuel chain in category 3. The petrol's fuel chain has no row of its own: DESNZ prints it only inside the business-travel total.

The electric van#

The DESNZ average electric van up to 3.5 tonnes, per km and per tonne-km: the printed total (charging electricity only) and the derived total with the fuel chain.

Show the SQL
SELECT unit_code,
       is_derived,
       round(value_co2e_native::numeric, 5) AS kg_co2e
FROM open_ef.factors_flat
WHERE library = 'desnz'
  AND activity_full = 'Vans - Average (up to 3.5 tonnes) - Battery Electric Vehicle'
  AND system_boundary = 'well_to_use'
  AND is_default_indicator
  AND is_latest_activity_year
ORDER BY unit_code, is_derived;
unit_code is_derived kg_co2e
km false 0.04680
km true 0.06442
t.km false 0.14699
t.km true 0.20338

The tonne-km row assumes DESNZ's average load. Use it for freight you buy by weight and distance; use the per-km row for a van you run yourself. A freight report under ISO 14083 or the GLEC Framework asks for well-to-wheel emissions, which for an electric vehicle are the electricity's generation, its losses and its fuel chain: that is the derived total, not the printed one.

How the totals are built#

A derived total is a sum, never a new measurement. Factor search adds up the legs the publisher printed and serves the sum as its own top-level row, with is_derived true and co2e_origin = 'summed_from_children'. The legs stay underneath it, each with its own value and boundary, so you can split the total by scope or report one leg alone. Sum a decomposition shows the arithmetic in SQL and decomposition the filters that keep you from adding a total to its own parts.

For the electric car and van, DESNZ prints the charging electricity, generation and losses, in its electric-vehicle tables, with a total of the two. It prints the fuel chain of that electricity in the well-to-tank tables. Factor search files the well-to-tank row under the same vehicle as the other two, so the derived total holds all three, while DESNZ's printed total stays beside it unchanged. boundary_scope tells the two apart: upstream_fuel is in on the derived one and out on the printed one.

An electric vehicle's derived total burns nothing itself: its fuel_combustion term reads out, because no fuel is burnt in the vehicle. The emissions are the grid's, upstream of the plug.

Where the publisher prints no fuel chain#

Some publishers print an electric vehicle's charging electricity but not the fuel chain behind it: New Zealand's Ministry for the Environment for every electric vehicle, DESNZ for the electricity half of a plug-in hybrid. There, open-climate.ai estimates the missing leg from the publisher's own grid rows of the same region and year:

leg = vehicle value × (fuel chain + fuel chain of the losses) ÷ (generation + losses)

The ratio is the share the grid's fuel chain adds to each delivered kWh, and the vehicle value is the publisher's printed charging electricity per km. For the UK the four grid legs are DESNZ's printed ones, a ratio of 0.28072; elsewhere the grid's fuel-chain legs are themselves estimated where that publisher does not print them. The leg is a factor of its own beside the vehicle, with system_boundary = 'upstream_fuel', and:

  • is_estimated is true, and its description gives the vehicle value and the ratio used; over SQL, the leg value's source_record names the four grid values the ratio came from;
  • its quality tier is low at best, and lower when an input is;
  • where the vehicle's electricity is already a derived total (the DESNZ plug-in hybrid), the leg is summed into it as a third leg, and the total is is_estimated too;
  • where the publisher prints the total itself (New Zealand), no new total is minted: add the leg to the printed total yourself, and say in your report that the fuel chain is an estimate.

The rule is a proxy: it assumes the vehicle's electricity has the grid's fuel-chain share. Tested on DESNZ, which prints the leg, it gives less than the publisher's own figure.

The estimation rule applied to the DESNZ average battery car, as a check: the UK grid's fuel-chain ratio, the leg it gives, and the leg DESNZ prints.

Show the SQL
WITH grid AS (
  SELECT sum(value_co2e_native) FILTER (WHERE system_boundary IN ('upstream_fuel', 'transmission_distribution_upstream'))
         / sum(value_co2e_native) FILTER (WHERE system_boundary IN ('generation', 'transmission_distribution')) AS ratio
  FROM open_ef.factors_flat
  WHERE library = 'desnz'
    AND root_slug = 'ef-desnz-electricity_generated-gb-kwh-grid_supplied-acf0f7bd'
    AND NOT is_derived
    AND is_default_indicator
    AND is_latest_activity_year
)
SELECT round(grid.ratio::numeric, 5) AS grid_ratio,
       round((car.value_co2e_native * grid.ratio)::numeric, 5) AS estimated_leg,
       round(wtt.value_co2e_native::numeric, 5) AS printed_leg
FROM grid,
     open_ef.factors_flat car,
     open_ef.factors_flat wtt
WHERE car.slug = 'ef-desnz-cars_by_size_average_car-gb-km-grid_supplied-813341fa'
  AND car.is_default_indicator AND car.is_latest_activity_year
  AND wtt.slug = 'ef-desnz-cars_by_size_average_car-gb-km-upstream_fuel-91398c55'
  AND wtt.is_default_indicator AND wtt.is_latest_activity_year;
grid_ratio estimated_leg printed_leg
0.28072 0.00828 0.01049

That gap is why the tier is capped at low. DESNZ prints its own leg for a battery car, so no estimate is made for it; only the plug-in hybrids get one.

To leave every estimate out, filter on the flag:

Show the SQL
SELECT slug, system_boundary, value_co2e_native
FROM open_ef.factors_flat
WHERE NOT is_estimated
  AND is_default_indicator
  AND is_latest_activity_year;