Skip to main content

Understanding Scope 3 Category 5

Waste generated in operations covers emissions from third-party disposal and treatment of waste generated in your organization’s owned or controlled operations. According to the GHG Protocol Scope 3 Standard, Category 5 includes:
  • Landfill disposal: Emissions from decomposition of waste in landfills
  • Incineration: Emissions from burning waste (with or without energy recovery)
  • Recycling: Emissions from processing waste for material recovery
  • Composting: Emissions from biological treatment of organic waste
  • Waste transport: Emissions from transporting waste to treatment facilities
┌─────────────────────────────────────────────────────────────────────────────┐
│              SCOPE 3 CATEGORY 5: Waste Generated in Operations              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  YOUR FACILITIES                              WASTE TREATMENT               │
│  ──────────────────                           ─────────────────             │
│                                                                             │
│  ┌──────────────┐                            ┌──────────────┐               │
│  │   Office     │──┐                    ┌───►│  Landfill    │               │
│  │              │  │                    │    │    (D01)     │───┐           │
│  └──────────────┘  │                    │    └──────────────┘   |           │
│                    │    ┌──────────┐    │                       |           │
│  ┌──────────────┐  │    │  Waste   │    │    ┌──────────────┐   |           │
│  │  Warehouse   │──┼───►│ Collect  │────┼───►│ Incineration │   |           │
│  │              │  │    │          │    │    │    (D10)     │───┼           │
│  └──────────────┘  │    └──────────┘    │    └──────────────┘   |           │
│                    │         │          │                       |           │
│  ┌──────────────┐  │         │          │    ┌──────────────┐   |           │
│  │  Factory     │──┘         │          └───►│  Recycling   │   |           │
│  │              │            │               │    (R03)     │───┼           │
│  └──────────────┘            │               └──────────────┘   |           │
│                              │                                  |           │
│                    ┌─────────▼─────────┐                        |           │
│                    │    CATEGORY 5     │                        |           │
│                    │   Emissions from  │                        |           │
│                    │ waste treatment + │<───────────────────────┘           │
│                    │    transport      │                                    │
│                    └───────────────────┘                                    │
│                                                                             │
│  EXAMPLE WASTE TYPES:                  EXMAPLE TREATMENT METHODS:           │
│  • Paper/cardboard (150101)            • R01-R13: Recovery operations       │
│  • Plastics (150102)                   • D01-D15: Disposal operations       │
│  • Mixed packaging (150106)            • R03: Recycling                     │
│  • Organic waste (200108)              • R01: Energy recovery               │
│  • Electronic waste (160214)           • D01: Landfill                      │
│  • Hazardous waste (various)           • D10: Incineration                  │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
Category 5 vs Other Waste-Related Emissions
  • Category 5: Waste generated in your operations, treated by third parties
  • Category 12: End-of-life treatment of products you sell (downstream)
  • Scope 1: Waste treatment at facilities you own/control (e.g., on-site incineration)

Prerequisites

Before starting, ensure you have:
  • Dcycle API credentials (get them here)
  • Completed Step 1: Company Structure
  • At least one facility created
  • Waste manifests or invoices from your waste management provider
  • Basic knowledge of Python or JavaScript
Using the Dcycle App?You can track waste through our web interface:

Data Map: Category 5 Requirements Overview

┌────────────────────────────────────────────────────────────────────────────────────────┐
│                   CATEGORY 5 DATA REQUIREMENTS OVERVIEW                                │
├────────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                        │
│  ┌─────────────────────────────────────────────────────────────────────────────────┐   │
│  │ WASTE RECORD (Per waste entry)                                                  │   │
│  ├─────────────────────────────────────────────────────────────────────────────────┤   │
│  │                                                                                 │   │
│  │  Required Fields              Optional Fields                                   │   │
│  │  ──────────────────           ──────────────────                                │   │
│  │  • facility_id                • rd_code (treatment code)                        │   │
│  │  • ler_code (LER/LoW code)    • identification_name                             │   │
│  │  • quantity (kg)              • description                                     │   │
│  │  • start_date                 • destination                                     │   │
│  │  • end_date                   • total_km_to_waste_center                        │   │
│  │                               • file_url (supporting doc)                       │   │
│  │                                                                                 │   │
│  └─────────────────────────────────────────────────────────────────────────────────┘   │
│                                                                                        │
│  ┌─────────────────────────────────────────────────────────────────────────────────┐   │
│  │ CALCULATION FLOW                                                                │   │
│  ├─────────────────────────────────────────────────────────────────────────────────┤   │
│  │                                                                                 │   │
│  │  LER Code + RD Code ──► Waste Emission Factor (kg CO₂e/kg)                      │   │
│  │                                  │                                              │   │
│  │  Quantity (kg) ─────────────────┼──► Treatment Emissions                        │   │
│  │                                 │                                               │   │
│  │  Distance (km) ─────────────────┼──► Transport Emissions                        │   │
│  │                                 │                                               │   │
│  │  Total CO₂e = (Quantity × Waste EF) + (ton-km × Transport EF)                   │   │
│  │                                                                                 │   │
│  └─────────────────────────────────────────────────────────────────────────────────┘   │
│                                                                                         │
└─────────────────────────────────────────────────────────────────────────────────────────┘

Understanding Waste Codes

LER Codes (European List of Waste)

The LER code (also called LoW code) is a 6-digit code that identifies the type of waste according to the European List of Waste. Common examples:
LER CodeDescriptionCategory
150101Paper and cardboard packagingNon-hazardous
150102Plastic packagingNon-hazardous
150103Wooden packagingNon-hazardous
150106Mixed packagingNon-hazardous
200108Biodegradable kitchen wasteNon-hazardous
200301Mixed municipal wasteNon-hazardous
160214Electronic equipmentNon-hazardous
150110*Packaging with hazardous residuesHazardous
160601*Lead batteriesHazardous
Hazardous WasteLER codes ending with an asterisk (*) indicate hazardous waste. These typically have different emission factors and require special handling documentation.

RD Codes (Treatment Methods)

The RD code identifies the treatment or disposal method. It consists of R (Recovery) or D (Disposal) followed by a 2-digit number: Recovery Operations (R codes):
CodeDescriptionTypical Impact
R01Energy recovery (incineration with energy)Medium
R02Solvent reclamationLow
R03Recycling/reclamation of organic substancesLow
R04Recycling/reclamation of metalsLow
R05Recycling/reclamation of other inorganicsLow
R10Land treatment (composting)Low
R12Exchange of waste for recoveryVariable
R13Storage pending recoveryN/A
Disposal Operations (D codes):
CodeDescriptionTypical Impact
D01Deposit into or onto land (landfill)High
D02Land treatment (not composting)Medium
D09Physico-chemical treatmentMedium
D10Incineration on land (without energy recovery)High
D14Repackaging prior to disposalN/A
D15Storage pending disposalN/A
When RD Code is UnknownA single LoW/LER code can be associated with multiple treatment methods (RD codes), each with different emission factors. If the RD code is not provided, Dcycle automatically uses the average emission factor across all possible treatment methods for that waste type.For more accurate emissions calculations, provide the RD code when known from your waste management documentation.

Emission Factor Sources

Dcycle uses waste emission factors derived from the IPCC Guidelines for National Greenhouse Gas Inventories:
Intergovernmental Panel on Climate Change (IPCC)
  • Default emission factors for solid waste disposal sites (landfill)
  • Methane (CH₄) emissions from anaerobic decomposition
  • Waste incineration factors for CO₂ and N₂O
  • Covers all standard waste categories and treatment methods
By disposal/recovery method:
  • Landfill (D01): CH₄ from organic decomposition, based on IPCC default methane correction factors
  • Incineration (D10/R01): CO₂ from fossil carbon content + N₂O from combustion
  • Recycling (R03-R05): Processing emissions, often offset by avoided virgin material
  • Composting (R10): CH₄ and N₂O from biological treatment
Waste transport to treatment facility:
  • Based on average truck emissions (Ecoinvent)
  • Calculated using: (quantity_kg / 1000) × distance_km × transport_ef
  • Default transport EF: ~0.1 kg CO₂e per ton-km

Step 1: Create Waste Records

FieldTypeRequiredDescriptionExample
facility_idUUIDFacility generating waste"facility-uuid"
ler_codestring6-digit LER/LoW code"150101"
quantitynumberWaste quantity (kg)500
start_datedatePeriod start"2024-01-01"
end_datedatePeriod end"2024-03-31"
rd_codestringTreatment method code"R03"
identification_namestringReference (invoice #)"WM-2024-001"
descriptionstringWaste description"Office paper waste"
destinationstringTreatment facility name"Green Recycling Ltd"
total_km_to_waste_centernumberDistance to treatment25
Where to get this data:
  • LER code: Waste manifest or transfer note from waste collector
  • RD code: Waste management invoice or certificate
  • Quantity: Weighbridge ticket or estimated from container size
  • Distance: Address of treatment facility (or ask waste provider)
Track individual waste disposal from your facilities:
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"),
}

# Get your facility ID
facilities = requests.get(
    "https://api.dcycle.io/api/v1/facilities",
    headers=headers,
    params={"page": 1, "size": 100}
).json()
facility_id = facilities['items'][0]['id']

# Example: Office paper recycling
waste_data = {
    "facility_id": facility_id,
    "ler_code": "150101",       # Paper and cardboard packaging
    "rd_code": "R03",           # Recycling
    "quantity": 500,            # 500 kg
    "start_date": "2024-01-01",
    "end_date": "2024-03-31",
    "identification_name": "WM-2024-Q1-001",
    "description": "Office paper and cardboard waste - Q1 2024",
    "destination": "Green Recycling Ltd",
    "total_km_to_waste_center": 25,  # Distance to recycling facility
}

response = requests.post(
    f"https://api.dcycle.io/api/v1/facilities/{facility_id}/wastes",
    headers=headers,
    json=waste_data
).json()

print(f"✅ Waste record created")
print(f"   ID: {response['id']}")
print(f"   LER Code: {waste_data['ler_code']}")
print(f"   Treatment: {waste_data['rd_code']}")
print(f"   Quantity: {waste_data['quantity']} kg")
print(f"   CO₂e: {response.get('co2e', 'Calculating...')} kg")

Common Waste Types Example

Track multiple waste streams from your facility:
# Track all Q1 2024 waste from a facility
waste_records = [
    {
        "ler_code": "150101",    # Paper/cardboard
        "rd_code": "R03",        # Recycling
        "quantity": 500,
        "description": "Office paper and cardboard",
    },
    {
        "ler_code": "150102",    # Plastic
        "rd_code": "R03",        # Recycling
        "quantity": 150,
        "description": "Plastic packaging",
    },
    {
        "ler_code": "200301",    # Mixed municipal
        "rd_code": "D01",        # Landfill
        "quantity": 200,
        "description": "General office waste (non-recyclable)",
    },
    {
        "ler_code": "200108",    # Organic
        "rd_code": "R10",        # Composting
        "quantity": 100,
        "description": "Canteen food waste",
    },
    {
        "ler_code": "160214",    # Electronics
        "rd_code": "R04",        # Metal recovery
        "quantity": 25,
        "description": "End-of-life IT equipment",
    },
]

created_records = []
for waste in waste_records:
    waste_data = {
        "facility_id": facility_id,
        "ler_code": waste["ler_code"],
        "rd_code": waste["rd_code"],
        "quantity": waste["quantity"],
        "start_date": "2024-01-01",
        "end_date": "2024-03-31",
        "description": waste["description"],
        "total_km_to_waste_center": 25,
    }
    
    response = requests.post(
        f"https://api.dcycle.io/api/v1/facilities/{facility_id}/wastes",
        headers=headers,
        json=waste_data
    ).json()
    
    created_records.append(response)
    print(f"   {waste['description']}: {waste['quantity']} kg → {waste['rd_code']}")

print(f"\n✅ Created {len(created_records)} waste records")
total_waste = sum(w['quantity'] for w in waste_records)
print(f"   Total waste: {total_waste} kg")

Step 2: Upload Waste Documents (PDF)

Dcycle can automatically extract waste data from PDF invoices:
import requests
import os
import base64

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

# Read and encode the PDF file
with open("waste_invoice.pdf", "rb") as f:
    file_content = f.read()

# Upload the waste invoice
files = {
    "file": ("waste_invoice.pdf", file_content, "application/pdf"),
}

data = {
    "supplier": "generic",  # Or specific waste provider if supported
    "kms_to_waste_center": 25,  # Optional: distance to treatment facility
}

response = requests.post(
    f"https://api.dcycle.io/api/v1/facilities/{facility_id}/wastes/upload",
    headers=headers,
    files=files,
    data=data
)

if response.status_code == 200:
    result = response.json()
    print(f"✅ Waste invoice processed")
    for waste in result:
        print(f"   LER: {waste.get('ler_code')} | Treatment: {waste.get('rd_code')}")
        print(f"   Quantity: {waste.get('quantity')} kg")
        print(f"   CO₂e: {waste.get('co2e', 'Calculating...')} kg")
else:
    print(f"❌ Upload failed: {response.text}")
Supported Waste Invoice FormatsDcycle’s OCR can extract data from standard waste transfer notes and invoices, including:
  • Spanish DI (Documento de Identificación)
  • Standard European waste manifests
  • Various waste management company formats
The system extracts: LER code, quantity, date, and description automatically.

Step 3: Bulk Upload Waste Records

For organizations with many waste streams, use CSV upload:

CSV Format

facility_id,ler_code,rd_code,quantity,start_date,end_date,description,destination,kms_to_waste_center
"facility-uuid-1","150101","R03",500,"2024-01-01","2024-03-31","Paper recycling","Green Recycling",25
"facility-uuid-1","150102","R03",150,"2024-01-01","2024-03-31","Plastic recycling","Green Recycling",25
"facility-uuid-1","200301","D01",200,"2024-01-01","2024-03-31","General waste","City Landfill",40
"facility-uuid-2","150101","R03",300,"2024-01-01","2024-03-31","Paper recycling","EcoWaste Ltd",15
"facility-uuid-2","200108","R10",75,"2024-01-01","2024-03-31","Food waste","CompostCo",20
CSV Notes:
  • quantity is always in kilograms (kg)
  • kms_to_waste_center is optional but recommended for accurate transport emissions
  • Use the correct facility_id for each waste record

Step 4: Query Category 5 Emissions

Get Waste Totals by Facility

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"),
}

# Get all waste records for a facility
response = requests.get(
    f"https://api.dcycle.io/api/v1/facilities/{facility_id}/wastes",
    headers=headers,
    params={
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
    }
).json()

print(f"📊 Scope 3 Category 5: Waste Generated in Operations (2024)")
print("=" * 60)

total_quantity = 0
total_co2e = 0

for waste in response.get('items', []):
    total_quantity += waste['quantity']
    total_co2e += waste.get('co2e', 0)
    print(f"   {waste['description'][:30]}: {waste['quantity']} kg → {waste.get('co2e', 0):.1f} kg CO₂e")

print("-" * 60)
print(f"   Total waste: {total_quantity:,.0f} kg")
print(f"   Total CO₂e: {total_co2e:,.1f} kg ({total_co2e/1000:.2f} tonnes)")

Analyze by Treatment Method

# Group waste by treatment method
from collections import defaultdict

treatment_summary = defaultdict(lambda: {"quantity": 0, "co2e": 0, "records": 0})

for waste in response.get('items', []):
    rd_code = waste.get('rd_code', 'Unknown')
    treatment_summary[rd_code]["quantity"] += waste['quantity']
    treatment_summary[rd_code]["co2e"] += waste.get('co2e', 0)
    treatment_summary[rd_code]["records"] += 1

print("\n📊 Category 5 by Treatment Method:")
print("-" * 50)

treatment_names = {
    "R01": "Energy recovery",
    "R03": "Recycling",
    "R04": "Metal recovery",
    "R10": "Composting",
    "D01": "Landfill",
    "D10": "Incineration",
}

for rd_code, data in sorted(treatment_summary.items()):
    name = treatment_names.get(rd_code, rd_code)
    print(f"   {rd_code} ({name}):")
    print(f"      Quantity: {data['quantity']:,.0f} kg")
    print(f"      CO₂e: {data['co2e']:,.1f} kg")
    print(f"      Records: {data['records']}")
    print()

Compare to Total Scope 3

# Get total Scope 3 for context
scope3_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": "wastes"
    }
).json()

cat5_total = sum(i.get("co2e", 0) for i in scope3_response.get("items", []))

# Get all Scope 3
all_scope3 = requests.get(
    "https://api.dcycle.io/api/v1/total_impacts",
    headers=headers,
    params={
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
        "scopes": "scope_3"
    }
).json()

scope3_total = sum(i.get("co2e", 0) for i in all_scope3.get("items", []))

print(f"\n📊 Category 5 Context:")
print(f"   Category 5: {cat5_total:,.0f} kg CO₂e")
print(f"   Total Scope 3: {scope3_total:,.0f} kg CO₂e")
if scope3_total > 0:
    print(f"   Category 5 as % of Scope 3: {cat5_total/scope3_total*100:.1f}%")

Best Practices

1. Track All Waste Streams

# Ensure comprehensive coverage
required_waste_streams = [
    {"category": "Paper/Cardboard", "ler_codes": ["150101", "200101"]},
    {"category": "Plastics", "ler_codes": ["150102", "200139"]},
    {"category": "Glass", "ler_codes": ["150107", "200102"]},
    {"category": "Metals", "ler_codes": ["150104", "200140"]},
    {"category": "Organic", "ler_codes": ["200108", "200201"]},
    {"category": "General/Mixed", "ler_codes": ["200301", "150106"]},
    {"category": "Electronics", "ler_codes": ["160214", "200135*"]},
]

# Check coverage
tracked_ler_codes = set(w.get('ler_code') for w in response.get('items', []))

print("📋 Waste Stream Coverage:")
for stream in required_waste_streams:
    covered = any(ler in tracked_ler_codes for ler in stream['ler_codes'])
    status = "✅" if covered else "❌"
    print(f"   {status} {stream['category']}")

2. Prioritize High-Impact Waste

# Identify waste types with highest emissions
waste_by_impact = sorted(
    response.get('items', []),
    key=lambda w: w.get('co2e', 0),
    reverse=True
)

print("\n🎯 Top 5 Highest Impact Waste:")
for i, waste in enumerate(waste_by_impact[:5], 1):
    print(f"   {i}. {waste['description'][:35]}")
    print(f"      LER: {waste['ler_code']} | Treatment: {waste['rd_code']}")
    print(f"      CO₂e: {waste.get('co2e', 0):,.1f} kg")
    
    # Suggest improvement if using disposal
    if waste.get('rd_code', '').startswith('D'):
        print(f"      💡 Consider recycling (R03) to reduce emissions")
    print()

3. Track Diversion Rate

# Calculate waste diversion from landfill
def calculate_diversion_rate(wastes):
    """Calculate percentage of waste diverted from landfill"""
    
    total_quantity = 0
    diverted_quantity = 0
    
    for waste in wastes:
        quantity = waste.get('quantity', 0)
        rd_code = waste.get('rd_code', '')
        total_quantity += quantity
        
        # R codes (except R13) and some D codes are considered diversion
        if rd_code.startswith('R') and rd_code != 'R13':
            diverted_quantity += quantity
        elif rd_code in ['D09', 'D14']:  # Treatment/processing
            diverted_quantity += quantity
    
    if total_quantity > 0:
        return (diverted_quantity / total_quantity) * 100
    return 0

diversion_rate = calculate_diversion_rate(response.get('items', []))
print(f"\n♻️ Waste Diversion Rate: {diversion_rate:.1f}%")

if diversion_rate < 50:
    print("   ⚠️ Below 50% - significant improvement opportunity")
elif diversion_rate < 75:
    print("   📈 Good progress - target 75%+")
else:
    print("   ✅ Excellent diversion rate!")
Reduction Strategies for Category 5
  1. Reduce waste generation: Source reduction is the most effective strategy
  2. Increase recycling: Switch from D01 (landfill) to R03 (recycling) where possible
  3. Composting: Divert organic waste from landfill to R10
  4. Energy recovery: If recycling isn’t possible, R01 beats D01
  5. Local treatment: Reduce transport emissions with nearby facilities
  6. Supplier engagement: Work with waste providers on lower-carbon options

Troubleshooting

Issue: LER Code Not Found

# Get available LER codes
ler_codes = requests.get(
    "https://api.dcycle.io/api/v1/waste_efs/ler_codes",
    headers=headers
).json()

print("Available LER codes:")
for code in ler_codes[:10]:
    print(f"   {code['low_code']}: {code['low_description']}")

# If your code isn't found, try the generic version
# e.g., "150101" → check if "1501*" or "15*" exists

Issue: Unknown Treatment Method

# Get available RD codes
rd_codes = requests.get(
    "https://api.dcycle.io/api/v1/waste_efs/rd_codes",
    headers=headers
).json()

print("Available treatment codes:")
for code in rd_codes:
    print(f"   {code['rd_code']}: {code['rd_description']}")

Issue: Category 5 Seems Too Low

# Common reasons for underreported waste emissions:
checks = {
    "Missing waste streams": "Check all facilities are tracked",
    "Incomplete periods": "Ensure full year coverage",
    "Missing transport": "Add kms_to_waste_center where known",
    "Contractor waste": "Include waste from on-site contractors",
    "Construction waste": "Don't forget renovation/construction debris",
}

print("🔍 Checklist for Category 5 completeness:")
for issue, action in checks.items():
    print(f"   ☐ {issue}")
    print(f"      → {action}")

Next Steps