Skip to main content

Calculate Emissions Overview

Dcycle helps you calculate emissions across all aspects of your organizationโ€™s operations. This guide explains when and how to use each calculation method.

Emission Calculation Methods

Quick Decision Guide

Use this flowchart to determine which method to use:
Are you tracking...

โ”œโ”€ Transportation of goods?
โ”‚  โ””โ”€ Use: Logistics API (ISO 14083)
โ”‚     Example: Calculating emissions of transportation and distribution of goods for a client
โ”‚
โ”œโ”€ Your company vehicles?
โ”‚  โ””โ”€ Use: Fleet/Vehicles API
โ”‚     Example: Calculate the emissions generated by your fleet of vehicles
โ”‚
โ”œโ”€ Facility energy consumption?
โ”‚  โ””โ”€ Use: Invoices or Facilities API
โ”‚     Example: Office electricity, warehouse heating
โ”‚
โ”œโ”€ Purchased products/services?
โ”‚  โ””โ”€ Use: Purchases API
โ”‚     Example: Raw materials, office supplies
โ”‚
โ””โ”€ Waste disposal?
   โ””โ”€ Use: Wastes API
      Example: Recycling, landfill, incineration

Data Requirements

Different calculation methods require different data:

Minimum Data Required

MethodEssential DataOptional Data
LogisticsOrigin, destination, weightVehicle type, year
FleetFuel type, quantityVehicle specs, odometer
FacilitiesEnergy type, consumptionBuilding size, equipment
PurchasesProduct category, amountSupplier, custom factors
WasteWaste type, quantityDisposal method, treatment

Data Accuracy Levels

The more specific your data, the more accurate your calculations:
1

Level 1: Spend-Based (Lowest accuracy)

# Only know the cost
purchase = {
    "category": "office_supplies",
    "spend_amount": 5000,
    "spend_currency": "EUR"
}
# Accuracy: ยฑ50-100%
2

Level 2: Generic Activity Data

# Know physical quantities
purchase = {
    "category": "paper",
    "quantity": 1000,
    "unit": "kg"
}
# Accuracy: ยฑ20-40%
3

Level 3: Specific Product Data

# Know exact product and supplier
purchase = {
    "product": "recycled_paper_A4",
    "supplier_id": "supplier-uuid",
    "quantity": 1000,
    "unit": "kg"
}
# Accuracy: ยฑ10-20%
4

Level 4: Supplier-Verified Data (Highest accuracy)

# Have supplier EPD or custom factor
purchase = {
    "product": "recycled_paper_A4",
    "supplier_id": "supplier-uuid",
    "custom_emission_factor_id": "factor-uuid",
    "quantity": 1000,
    "unit": "kg"
}
# Accuracy: ยฑ5-15%

Common Calculation Patterns

Pattern 1: Bulk Operations

For large datasets, use bulk upload endpoints:
# Upload monthly fleet consumption
csv_url = api.get_bulk_upload_url(type="vehicle_consumptions")

# Upload CSV file
upload_csv_to_s3(csv_url, "fleet_january_2024.csv")

# Poll for results
status = api.check_upload_status(upload_id)
Best for:
  • Monthly utility bills
  • Fleet fuel card data
  • Historical data migration
Bulk Upload APIs โ†’

Pattern 2: Real-Time Calculations

For instant results, use synchronous endpoints:
# Calculate single shipment
result = api.calculate_shipment(
    origin="Madrid, Spain",
    destination="Barcelona, Spain",
    load=1000,
    load_unit="kg",
    toc="van_diesel"
)

# Immediate response with CO2e
print(f"Emissions: {result['co2e']} kg CO2e")
Best for:
  • Quote calculators
  • Route optimization
  • User-facing features

Pattern 3: Batch Processing

For scheduled jobs:
# Process daily orders
for order in daily_orders:
    emissions = api.calculate_shipment(
        origin=order.warehouse,
        destination=order.customer_address,
        load=order.weight,
        # ...
    )

    # Store with order
    order.co2e = emissions['co2e']
    order.save()
Best for:
  • Nightly batch jobs
  • Order processing pipelines
  • Scheduled reports

Combining Multiple Sources

Most organizations need to track emissions from multiple sources:
# Calculate total organizational emissions

# Scope 1: Fleet
fleet_emissions = sum(vehicle_consumptions)

# Scope 2: Purchased electricity
electricity_emissions = sum(electricity_invoices)

# Scope 3: Logistics + Purchases
logistics_emissions = sum(shipments)
purchase_emissions = sum(purchases)

# Total
total_scope1 = fleet_emissions
total_scope2 = electricity_emissions
total_scope3 = logistics_emissions + purchase_emissions

total_emissions = total_scope1 + total_scope2 + total_scope3
Dcycleโ€™s reporting endpoints can aggregate emissions automatically across all sources. See the Logistics Reports API for examples.

Handling Missing Data

When you donโ€™t have complete data, use these strategies:

Strategy 1: Use Defaults

# Don't know vehicle type? Use category default
shipment = api.calculate_shipment(
    origin="Madrid",
    destination="Barcelona",
    load=1000,
    load_unit="kg",
    toc="rigid"  # Generic truck category
)

Strategy 2: Estimate from Similar Activities

# Estimate office electricity from building size
invoice = {
    "type": "electricity",
    "consumption_estimate": building_sqm * 150,  # kWh/sqm/year
    "unit": "kWh",
    "period": "2024-01"
}

Strategy 3: Use Industry Averages

# Use spend-based factor as last resort
purchase = {
    "category": "IT_services",
    "spend_amount": 50000,
    "spend_currency": "EUR"
    # Dcycle applies appropriate spend-based factor
}

Strategy 4: Request Supplier Data

For significant emissions sources, request EPD or LCA data:
# Once you have supplier data, create custom factor
custom_factor = api.create_custom_emission_factor(
    group_id="suppliers-2024",
    ef_name="Aluminum - Supplier ABC",
    emission_factor_values=[
        {"gas_type": "CO2", "value": 2.15},
        {"gas_type": "CH4", "value": 0.008}
    ],
    additional_docs="EPD No. ABC-2024-001"
)

# Use in future calculations
purchase = {
    "product": "aluminum_sheet",
    "custom_emission_factor_id": custom_factor.id,
    "quantity": 1000,
    "unit": "kg"
}
Custom Emission Factors Guide โ†’

Validation and Quality Checks

Before submitting data, validate:

Common Validation Checks

def validate_shipment_data(data):
    """Validate shipment data before submission"""

    # Check required fields
    assert data.get('origin'), "Origin is required"
    assert data.get('destination'), "Destination is required"
    assert data.get('load') > 0, "Load must be positive"

    # Sanity checks
    if data['load'] > 30000:  # 30 tons
        print("โš ๏ธ  Warning: Very heavy load, double-check")

    # Distance check (after geocoding)
    if estimated_distance < 10:  # km
        print("โš ๏ธ  Warning: Very short distance")

    return True

Response Validation

response = api.calculate_shipment(data)

# Validate response
if response['co2e'] == 0:
    print("โŒ Error: Zero emissions calculated")

if response.get('distance_km', 0) == 0:
    print("โŒ Error: Zero distance calculated")

# Log for audit
log_calculation(
    input=data,
    output=response,
    timestamp=datetime.now()
)

Next Steps

Choose a tutorial based on your primary use case:

Advanced Topics