Skip to main content

Understanding Scope 3 Category 3

Fuel and energy-related activities (not included in Scope 1 or 2) cover the upstream emissions associated with the production and delivery of fuels and electricity consumed by your organization. According to the GHG Protocol Scope 3 Standard, Category 3 includes:
  • Upstream emissions of purchased fuels: Extraction, refining, and transportation of fuels (Well-to-Tank / WTT)
  • Upstream emissions of purchased electricity: Extraction, refining, and transportation of fuels used in electricity generation
  • Transmission and distribution (T&D) losses: Energy lost in the grid during transmission
  • Generation of purchased electricity: Emissions from power plants (when using market-based method)
┌─────────────────────────────────────────────────────────────────────────────┐
│              SCOPE 3 CATEGORY 3: Fuel & Energy-Related Activities           │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  YOUR SCOPE 1 & 2 EMISSIONS                CATEGORY 3 (UPSTREAM)            │
│  ────────────────────────                  ──────────────────────           │
│                                                                              │
│  ┌─────────────────────┐                   ┌─────────────────────┐          │
│  │ Scope 1: Stationary │ ◄──────────────── │ WTT: Fuel           │          │
│  │ (Boilers, heaters)  │   Fuel burned     │ extraction &        │          │
│  │                     │                   │ refining            │          │
│  └─────────────────────┘                   └─────────────────────┘          │
│                                                                              │
│  ┌─────────────────────┐                   ┌─────────────────────┐          │
│  │ Scope 1: Mobile     │ ◄──────────────── │ WTT: Fuel           │          │
│  │ (Vehicles, fleet)   │   Fuel burned     │ production &        │          │
│  │                     │                   │ transport           │          │
│  └─────────────────────┘                   └─────────────────────┘          │
│                                                                              │
│  ┌─────────────────────┐                   ┌─────────────────────┐          │
│  │ Scope 2: Electricity│ ◄──────────────── │ Grid T&D losses +   │          │
│  │ (Grid power)        │   Power consumed  │ Upstream generation │          │
│  │                     │                   │                     │          │
│  └─────────────────────┘                   └─────────────────────┘          │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘
Automatic CalculationCategory 3 emissions are automatically calculated by Dcycle. You don’t need to upload any additional data—simply ensure your Scope 1 and Scope 2 data is complete, and Category 3 will be calculated automatically.This guide explains:
  • What Category 3 includes
  • How Dcycle calculates it
  • How to view Category 3 emissions in reports

How Category 3 Works in Dcycle

When you upload Scope 1 or Scope 2 data, Dcycle automatically calculates the corresponding Category 3 emissions:
Your Input (Scope 1/2)Dcycle Calculates (Category 3)
Fuel invoice (stationary)stationary_generation - WTT emissions
Vehicle consumptiontransport_generation - WTT emissions
Electricity invoiceelectricity_generation - Upstream generation
Electricity invoiceelectricity_transmission_and_distribution - T&D losses
┌─────────────────────────────────────────────────────────────────────────────┐
│                     AUTOMATIC CATEGORY 3 CALCULATION                         │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  STEP 1: You upload data          STEP 2: Dcycle calculates automatically   │
│  ─────────────────────────        ───────────────────────────────────────   │
│                                                                              │
│  POST /invoices                   ┌─────────────────────────────────┐       │
│  {                                │ Scope 1: Stationary combustion  │       │
│    "type": "heat",        ───────►│ + Category 3: WTT emissions     │       │
│    "quantity": 5000,              └─────────────────────────────────┘       │
│    "facility_fuel_id": "..."                                                │
│  }                                                                          │
│                                                                              │
│  POST /vehicle_consumptions       ┌─────────────────────────────────┐       │
│  {                                │ Scope 1: Mobile combustion      │       │
│    "quantity": 500,       ───────►│ + Category 3: WTT emissions     │       │
│    "vehicle_id": "..."            └─────────────────────────────────┘       │
│  }                                                                          │
│                                                                              │
│  POST /invoices                   ┌─────────────────────────────────┐       │
│  {                                │ Scope 2: Electricity            │       │
│    "type": "electricity", ───────►│ + Category 3: T&D losses        │       │
│    "quantity": 10000,             │ + Category 3: Upstream gen      │       │
│    "unit_id": "kwh-uuid"          └─────────────────────────────────┘       │
│  }                                                                          │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

Category 3 Sub-Categories

3a. Upstream Emissions of Purchased Fuels (WTT)

Well-to-Tank (WTT) emissions cover the full upstream lifecycle of fuels before combustion:
  • Extraction of raw materials (crude oil, natural gas, coal)
  • Refining and processing
  • Transportation to point of sale
When you upload a fuel invoice for stationary combustion (boilers, heaters, generators), Dcycle automatically calculates:
  • Scope 1: Direct emissions from burning the fuel (Tank-to-Wheel / TTW)
  • Category 3: Upstream emissions from fuel production (Well-to-Tank / WTT)
Natural Gas Example:
─────────────────────────────────────────────────────────────────
Your invoice: 5,000 m³ natural gas

Scope 1 (TTW):     5,000 m³ × 2.0 kg CO₂e/m³  = 10,000 kg CO₂e
Category 3 (WTT):  5,000 m³ × 0.4 kg CO₂e/m³  =  2,000 kg CO₂e
─────────────────────────────────────────────────────────────────
Total lifecycle:                               = 12,000 kg CO₂e
Dcycle category: stationary_generation
For Well-to-Tank (WTT) emissions, Dcycle uses emission factors from:DEFRA (UK Department for Environment, Food & Rural Affairs):
  • Comprehensive WTT factors for all fuel types
  • Covers extraction, refining, and transportation of fuels
  • Updated annually with UK Government GHG Conversion Factors
  • Source: UK Government GHG Conversion Factors
Factors are automatically selected based on:
  • Fuel type (natural gas, diesel, petrol, LPG, etc.)
  • Year of consumption
WTT emissions are calculated as:WTT CO₂e = Fuel Quantity × WTT Emission FactorWhere:
  • Fuel Quantity: Amount of fuel consumed (liters, m³, kg, kWh)
  • WTT EF: Well-to-Tank emission factor (kg CO₂e/unit)
WTT factors typically represent 15-25% of total lifecycle emissions for most fuels:
Fuel TypeTTW (Scope 1)WTT (Category 3)WTT as % of Total
Natural Gas~0.18 kg/kWh~0.03 kg/kWh~14%
Diesel~2.5 kg/L~0.6 kg/L~19%
Petrol~2.2 kg/L~0.5 kg/L~19%
LPG~1.6 kg/L~0.3 kg/L~16%
*Note: Actual values vary by country and year.

3b. Upstream Emissions of Purchased Electricity

When you upload an electricity invoice, Dcycle calculates upstream emissions from electricity generation:
Electricity Example:
─────────────────────────────────────────────────────────────────
Your invoice: 10,000 kWh electricity (Spain, 2024)

Scope 2 (Location-based):     10,000 kWh × 0.10 kg/kWh = 1,000 kg CO₂e
Category 3 (Upstream gen):    10,000 kWh × 0.02 kg/kWh =   200 kg CO₂e
─────────────────────────────────────────────────────────────────
Dcycle category: electricity_generation
For upstream electricity generation, Dcycle uses:
  • Grid emission factors adjusted for upstream fuel production
  • Factors account for the fuel mix used in electricity generation
  • Regional/national grid averages
The upstream generation factor represents emissions from:
  • Extraction and processing of fuels used in power plants
  • Transportation of fuels to power plants
  • Construction and maintenance of generation infrastructure

3c. Transmission and Distribution (T&D) Losses

Grid electricity is lost during transmission and distribution. Dcycle calculates emissions associated with generating this lost electricity:
T&D Losses Example:
─────────────────────────────────────────────────────────────────
Your invoice: 10,000 kWh electricity delivered

T&D Loss Rate (Spain): ~5%
Electricity lost in grid: 10,000 × 5% = 500 kWh

Category 3 (T&D losses): 500 kWh × 0.10 kg/kWh = 50 kg CO₂e
─────────────────────────────────────────────────────────────────
Dcycle category: electricity_transmission_and_distribution
Transmission and distribution loss rates vary by country:
CountryTypical T&D Loss Rate
Spain~5%
Germany~4%
France~6%
UK~8%
US (average)~5%
Dcycle uses country-specific T&D loss rates from:
  • IEA (International Energy Agency) statistics

Prerequisites for Category 3

Since Category 3 is automatically calculated, you simply need to ensure complete Scope 1 and Scope 2 data:
1

Complete Scope 1 Data

Upload all fuel consumption records:
  • Stationary combustion invoices (boilers, heaters, generators)
  • Vehicle consumption records (company fleet)
See Step 2: Scope 1 Guide →
2

Complete Scope 2 Data

Upload all electricity consumption records:
  • Electricity invoices for all facilities
  • District heating/cooling (if applicable)
See Step 3: Scope 2 Guide →
3

Category 3 Auto-Calculated

Dcycle automatically calculates Category 3 based on your Scope 1 and Scope 2 data.No additional action required!
Ensure Complete CoverageCategory 3 emissions are only calculated for data you upload. To get accurate Category 3 totals:
  • Include all fuel types across all facilities
  • Cover all vehicles in your fleet
  • Upload electricity for all locations
Missing Scope 1/2 data = Missing Category 3 data

Viewing Category 3 Emissions

Query Category 3 by Sub-Category

import requests
import os

headers = {
    "Authorization": f"Bearer {os.getenv('DCYCLE_API_KEY')}",
    "Content-Type": "application/json",
    "x-organization-id": os.getenv("DCYCLE_ORG_ID"),
    "x-user-id": os.getenv("DCYCLE_USER_ID"),
}

# Query total impacts filtered by Category 3 categories
category_3_categories = [
    "stationary_generation",          # WTT from stationary fuels
    "transport_generation",           # WTT from mobile fuels
    "electricity_generation",         # Upstream electricity
    "electricity_transmission_and_distribution",  # T&D losses
]

response = requests.get(
    "https://api.dcycle.io/api/v1/total_impacts",
    headers=headers,
    params={
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
        "categories": ",".join(category_3_categories),
    },
).json()

# Aggregate by sub-category
from collections import defaultdict
by_category = defaultdict(float)

for impact in response.get("items", []):
    by_category[impact["category"]] += impact["emissions_per_day"]

print("📊 Scope 3 Category 3: Fuel & Energy-Related Activities")
print("=" * 60)

total = 0
for category, co2e in by_category.items():
    label = {
        "stationary_generation": "3a. WTT - Stationary Fuels",
        "transport_generation": "3a. WTT - Mobile Fuels",
        "electricity_generation": "3b. Upstream Electricity",
        "electricity_transmission_and_distribution": "3c. T&D Losses",
    }.get(category, category)

    print(f"   {label}: {co2e:,.0f} kg CO₂e")
    total += co2e

print("=" * 60)
print(f"   Total Category 3: {total:,.0f} kg CO₂e")

Compare Category 3 to Scope 1 and 2

# Get Scope 1 emissions
scope1_response = requests.get(
    "https://api.dcycle.io/api/v1/total_impacts",
    headers=headers,
    params={
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
        "categories": "stationary,transport,recharge",
    },
).json()

scope1_total = sum(i["emissions_per_day"] for i in scope1_response.get("items", []))

# Get Scope 2 emissions
scope2_response = requests.get(
    "https://api.dcycle.io/api/v1/total_impacts",
    headers=headers,
    params={
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
        "categories": "electricity",
    },
).json()

scope2_total = sum(i["emissions_per_day"] for i in scope2_response.get("items", []))

# Category 3 total (from previous query)
cat3_total = total

print("\n📊 Emissions Comparison")
print("=" * 60)
print(f"   Scope 1 (Direct):        {scope1_total:>15,.0f} kg CO₂e")
print(f"   Scope 2 (Electricity):   {scope2_total:>15,.0f} kg CO₂e")
print(f"   Category 3 (Upstream):   {cat3_total:>15,.0f} kg CO₂e")
print("=" * 60)

# Calculate Category 3 as percentage of Scope 1+2
if (scope1_total + scope2_total) > 0:
    cat3_pct = cat3_total / (scope1_total + scope2_total) * 100
    print(f"   Category 3 as % of Scope 1+2: {cat3_pct:.1f}%")
Typical Category 3 RatiosCategory 3 typically represents 15-25% of combined Scope 1 and Scope 2 emissions:
  • WTT emissions: ~15-20% of Scope 1
  • Electricity upstream + T&D: ~5-10% of Scope 2
If your Category 3 is significantly different, check that all Scope 1/2 data is uploaded.

Emission Factor Details

WTT Factors by Fuel Type

FuelUnitTTW (Scope 1)WTT (Cat 3)WTT %
Natural Gaskg CO₂e/kWh~0.18~0.03~14%
Diesel / Gas Oilkg CO₂e/L~2.5~0.6~19%
Petrol / Gasolinekg CO₂e/L~2.2~0.5~19%
LPGkg CO₂e/L~1.6~0.3~16%
Fuel Oilkg CO₂e/L~2.9~0.5~15%
*Values are indicative. Actual factors vary by country and year.

Electricity Factors (Spain Example)

ComponentTypical Value (2024)
Scope 2 Grid EF~0.10 kg CO₂e/kWh
Category 3 Upstream~0.02 kg CO₂e/kWh
T&D Loss Rate~5%
Category 3 T&D~0.005 kg CO₂e/kWh
Dcycle updates Category 3 emission factors:
  • DEFRA WTT factors: Updated annually when UK Government publishes new GHG Conversion Factors
  • Grid factors: Updated with each new Ecoinvent release or regulatory update
  • T&D loss rates: Updated based on national grid operator data
When factors are updated, you can recalculate historical data to apply new factors.

Best Practices

1. Ensure Complete Scope 1/2 Coverage

Category 3 is only as complete as your Scope 1 and Scope 2 data:
# Check for gaps in data coverage
def check_category_3_coverage(org_id, year):
    """Verify that Category 3 data is complete."""

    # Get all facilities
    facilities = requests.get(
        "https://api.dcycle.io/api/v1/facilities",
        headers=headers,
    ).json()

    # Get all vehicles
    vehicles = requests.get(
        "https://api.dcycle.io/api/v1/vehicles",
        headers=headers,
    ).json()

    coverage_issues = []

    # Check each facility has fuel/electricity data
    for facility in facilities.get("items", []):
        # Check for invoices
        invoices = requests.get(
            f"https://api.dcycle.io/api/v1/invoices",
            headers=headers,
            params={
                "facility_id": facility["id"],
                "start_date": f"{year}-01-01",
                "end_date": f"{year}-12-31",
            },
        ).json()

        if not invoices.get("items"):
            coverage_issues.append(
                f"⚠️ Facility '{facility['name']}' has no invoices for {year}"
            )

    # Check each vehicle has consumption data
    for vehicle in vehicles.get("items", []):
        consumptions = requests.get(
            f"https://api.dcycle.io/api/v1/vehicle_consumptions",
            headers=headers,
            params={
                "vehicle_id": vehicle["id"],
                "start_date": f"{year}-01-01",
                "end_date": f"{year}-12-31",
            },
        ).json()

        if not consumptions.get("items"):
            coverage_issues.append(
                f"⚠️ Vehicle '{vehicle['name']}' has no consumptions for {year}"
            )

    return coverage_issues

2. Use Dcycle Reports for Category 3

Category 3 is automatically included in Dcycle’s GHG reports:
  • ISO 14064 Report: Category 3 mapped to appropriate sub-categories
  • GHG Protocol Report: Separate Category 3 line items
  • ESG Reports: Included in Scope 3 totals
Monitor Category 3 over time to validate data quality:
# Compare Category 3 as % of Scope 1+2 across years
for year in [2022, 2023, 2024]:
    # Get totals for each year
    scope1_2 = get_scope_1_2_total(year)
    cat3 = get_category_3_total(year)

    ratio = cat3 / scope1_2 * 100 if scope1_2 > 0 else 0

    print(f"{year}: Category 3 = {ratio:.1f}% of Scope 1+2")

# Ratio should be relatively stable (15-25%)
# Large variations may indicate data gaps

Troubleshooting

Issue: Category 3 is Zero or Missing

# Check if Category 3 is being calculated
cat3_total = get_category_3_total(2024)

if cat3_total == 0:
    print("⚠️ Category 3 is zero. Possible causes:")
    print("   1. No Scope 1 fuel data uploaded")
    print("   2. No Scope 2 electricity data uploaded")
    print("   3. Custom emission factors used (WTT not calculated)")

    # Check for custom emission factors
    # Custom EFs bypass automatic WTT calculation

Issue: Custom Emission Factors and Category 3

Custom Emission FactorsWhen you use a custom emission factor for fuel or electricity, Dcycle does not automatically calculate Category 3 WTT emissions. This is because custom factors may already include lifecycle emissions.If your custom factor is:
  • TTW only: You should manually add Category 3 data
  • WTW (lifecycle): Category 3 is already included—don’t double count
Check with your custom factor source to understand what’s included.

Issue: Category 3 Seems Too High/Low

# Verify ratio is within expected range
expected_range = (0.15, 0.25)  # 15-25% of Scope 1+2

scope1_2 = get_scope_1_2_total(2024)
cat3 = get_category_3_total(2024)
ratio = cat3 / scope1_2 if scope1_2 > 0 else 0

if ratio < expected_range[0]:
    print(f"⚠️ Category 3 ({ratio:.1%}) below typical range")
    print("   Possible causes:")
    print("   - Some fuels using custom EFs (no WTT calculated)")
    print("   - Fuel types with low WTT factors")

elif ratio > expected_range[1]:
    print(f"⚠️ Category 3 ({ratio:.1%}) above typical range")
    print("   Possible causes:")
    print("   - High proportion of electricity vs direct fuel")
    print("   - Countries with high T&D losses")

Next Steps