Skip to main content

Understanding Scope 3 Category 6

Business travel covers emissions from the transportation of employees for business-related activities in vehicles not owned or operated by your organization. According to the GHG Protocol Scope 3 Standard, Category 6 includes:
  • Air travel: Commercial flights (domestic and international)
  • Rail travel: Trains, metro, and high-speed rail
  • Road travel: Rental cars, taxis, ride-sharing, buses
  • Other transport: Ferries, company events transport
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              SCOPE 3 CATEGORY 6: Business Travel                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                             β”‚
β”‚  YOUR EMPLOYEES                               TRAVEL MODES                  β”‚
β”‚  ──────────────────                           ─────────────                 β”‚
β”‚                                                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚   Sales      │──┐                    β”Œβ”€β”€β”€β–Ίβ”‚   ✈️ Flights  β”‚               β”‚
β”‚  β”‚   Team       β”‚  β”‚                    β”‚    β”‚   (Aircraft) β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚                    β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                    β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚    β”‚ Business β”‚    β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚  Executive   │──┼───►│  Trips   │────┼───►│   πŸš‚ Rail     β”‚               β”‚
β”‚  β”‚   Team       β”‚  β”‚    β”‚          β”‚    β”‚    β”‚   (Train)    β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                    β”‚         β”‚          β”‚                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚         β”‚          β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚  Technical   β”‚β”€β”€β”˜         β”‚          └───►│   πŸš— Road     β”‚               β”‚
β”‚  β”‚   Team       β”‚            β”‚               β”‚   (Car/Bus)  β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚                              β”‚                                              β”‚
β”‚                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                    β”‚
β”‚                    β”‚    CATEGORY 6     β”‚                                    β”‚
β”‚                    β”‚   Emissions from  β”‚                                    β”‚
β”‚                    β”‚  employee travel  β”‚                                    β”‚
β”‚                    β”‚   for business    β”‚                                    β”‚
β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                    β”‚
β”‚                                                                             β”‚
β”‚  INCLUDED:                             NOT INCLUDED:                        β”‚
β”‚  β€’ Client meetings                     β€’ Daily commuting (Category 7)       β”‚
β”‚  β€’ Conferences & events                β€’ Company-owned vehicles (Scope 1)   β”‚
β”‚  β€’ Site visits                         β€’ Remote work                        β”‚
β”‚  β€’ Training travel                     β€’ Personal travel                    β”‚
β”‚  β€’ Sales trips                                                              β”‚
β”‚                                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Category 6 vs Category 7
  • Category 6 (Business Travel): Trips for business purposes (meetings, conferences, site visits)
  • Category 7 (Employee Commuting): Daily travel between home and work

Prerequisites

Before starting, ensure you have:
Using the Dcycle App?You can track business travel through our web interface:
  • Manual entry for individual trips
  • CSV bulk upload for expense reports
  • Integration with travel management systems

Data Map: Category 6 Requirements Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   CATEGORY 6 DATA REQUIREMENTS OVERVIEW                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ BUSINESS TRAVEL RECORD                                                          β”‚   β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€   β”‚
β”‚  β”‚                                                                                 β”‚   β”‚
β”‚  β”‚  Required Fields              Optional Fields                                   β”‚   β”‚
β”‚  β”‚  ──────────────────           ──────────────────                                β”‚   β”‚
β”‚  β”‚  β€’ origin OR distance_km      β€’ name (trip description)                         β”‚   β”‚
β”‚  β”‚  β€’ destination OR distance_km β€’ vehicle_size                                    β”‚   β”‚
β”‚  β”‚  β€’ transport_type             β€’ fuel_type                                       β”‚   β”‚
β”‚  β”‚  β€’ travel_type (round/one_way)β€’ renewable_energy                                β”‚   β”‚
β”‚  β”‚  β€’ travel_number              β€’ email (traveler)                                β”‚   β”‚
β”‚  β”‚  β€’ start_date                 β€’ file_url (receipt)                              β”‚   β”‚
β”‚  β”‚  β€’ end_date                                                                     β”‚   β”‚
β”‚  β”‚                                                                                 β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ CALCULATION FLOW                                                                β”‚   β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€   β”‚
β”‚  β”‚                                                                                 β”‚   β”‚
β”‚  β”‚  Origin + Destination ──► Distance (km) [via Google Maps API]                   β”‚   β”‚
β”‚  β”‚                                β”‚                                                β”‚   β”‚
β”‚  β”‚  Transport Type ──────────────┼──► Emission Factor (kg COβ‚‚e/km)                 β”‚   β”‚
β”‚  β”‚                               β”‚                                                 β”‚   β”‚
β”‚  β”‚  Travel Type Γ— Number ────────┼──► Trip Multiplier                              β”‚   β”‚
β”‚  β”‚                               β”‚                                                 β”‚   β”‚
β”‚  β”‚  COβ‚‚e = Distance Γ— EF Γ— Trip Multiplier                                         β”‚   β”‚
β”‚  β”‚                                                                                 β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Transport Types

Air Travel (Aircraft)

For flights, emission factors are automatically determined by distance:
Aircraft SizeDistance RangeDescription
very_short0–800 kmRegional flights
short800–1,500 kmDomestic/short-haul
medium1,500–4,000 kmMedium-haul international
long4,000+ kmLong-haul intercontinental
Automatic Aircraft SizingWhen you specify transport_type: "aircraft", Dcycle automatically determines the aircraft size based on the calculated distance between origin and destination. You don’t need to specify vehicle_size for flights.

Ground Transport

Transport TypeDescriptionEmission Factor Basis
carRental cars, taxisPer passenger-km
busCoach busesPer passenger-km
trainRail (intercity, regional)Per passenger-km
metroUrban metro/subwayPer passenger-km
tramTrams/light railPer passenger-km
Vehicle options for cars:
Vehicle SizeFuel TypeExample
smallpetrol, diesel, electric, hybridCompact cars
mediumpetrol, diesel, electric, hybridSedans
largepetrol, diesel, electric, hybridSUVs, luxury cars

Emission Factor Sources

Dcycle uses business travel emission factors from Ecoinvent:
Ecoinvent 3.8+ Cut-off
  • Comprehensive lifecycle emission factors by transport mode
  • Regional variations (country-specific where available)
  • Covers aircraft, rail, road, and public transport
  • Includes vehicle manufacturing and fuel production (WTW)
Google Maps API:
  • Road distances for car, bus travel
  • Direct distance (great circle) for flights
  • Rail network distances where available
If origin/destination aren’t provided, you can supply distance_km directly.

Step 1: Create Business Travel Records

FieldTypeRequiredDescriptionExample
originstring⚠️Departure city/location"Madrid, Spain"
destinationstring⚠️Arrival city/location"London, UK"
distance_kmnumber⚠️Distance (if origin/dest unknown)1250
transport_typestringβœ…Mode of transport"aircraft"
travel_typestringβœ…Round trip or one-way"round"
travel_numbernumberβœ…Number of trips1
start_datedateβœ…Trip start date"2024-03-15"
end_datedateβœ…Trip end date"2024-03-17"
vehicle_sizestring❌For cars: small/medium/large"medium"
fuel_typestring❌For cars: petrol/diesel/electric"petrol"
namestring❌Trip description"Client meeting"
emailstring❌Traveler email"[email protected]"
⚠️ Conditional requirements:
  • Either origin + destination OR distance_km must be provided
  • If both are provided, distance_km takes precedence
Where to get this data:
  • Origin/Destination: Travel bookings, expense reports
  • Transport type: Flight/train tickets, car rental invoices
  • Dates: Itinerary, calendar entries
Track individual business trips:
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"),
}

# Example: Round-trip flight for client meeting
business_travel = {
    "origin": "Madrid, Spain",
    "destination": "London, UK",
    "transport_type": "aircraft",
    "travel_type": "round",  # Round trip (multiplied by 2)
    "travel_number": 1,
    "start_date": "2024-03-15",
    "end_date": "2024-03-17",
    "name": "Client meeting - Acme Corp",
    "email": "[email protected]",
}

response = requests.post(
    "https://api.dcycle.io/api/v1/business_travels",
    headers=headers,
    json=business_travel
).json()

print(f"βœ… Business travel created")
print(f"   ID: {response['id']}")
print(f"   Route: {business_travel['origin']} β†’ {business_travel['destination']}")
print(f"   Transport: {business_travel['transport_type']}")
print(f"   Type: {business_travel['travel_type']} trip")
print(f"   Distance: {response.get('distance_km', 'Calculating...')} km")
print(f"   COβ‚‚e: {response.get('co2e', 'Calculating...')} kg")

Common Travel Scenarios

# Example business travel records for different scenarios

travel_records = [
    # International flight (round trip)
    {
        "origin": "New York, USA",
        "destination": "London, UK",
        "transport_type": "aircraft",
        "travel_type": "round",
        "travel_number": 1,
        "start_date": "2024-01-15",
        "end_date": "2024-01-18",
        "name": "Annual conference",
    },
    # Domestic flight (one way)
    {
        "origin": "Barcelona, Spain",
        "destination": "Madrid, Spain",
        "transport_type": "aircraft",
        "travel_type": "one_way",
        "travel_number": 1,
        "start_date": "2024-02-10",
        "end_date": "2024-02-10",
        "name": "Office visit",
    },
    # Train travel (round trip)
    {
        "origin": "Paris, France",
        "destination": "Brussels, Belgium",
        "transport_type": "train",
        "travel_type": "round",
        "travel_number": 2,  # 2 round trips
        "start_date": "2024-02-01",
        "end_date": "2024-02-28",
        "name": "Monthly client visits",
    },
    # Rental car (multiple one-way trips)
    {
        "origin": "Munich, Germany",
        "destination": "Stuttgart, Germany",
        "transport_type": "car",
        "vehicle_size": "medium",
        "fuel_type": "diesel",
        "travel_type": "one_way",
        "travel_number": 5,
        "start_date": "2024-03-01",
        "end_date": "2024-03-31",
        "name": "Factory visits",
    },
    # Electric rental car
    {
        "origin": "Amsterdam, Netherlands",
        "destination": "Rotterdam, Netherlands",
        "transport_type": "car",
        "vehicle_size": "small",
        "fuel_type": "electric",
        "travel_type": "round",
        "travel_number": 3,
        "start_date": "2024-03-01",
        "end_date": "2024-03-31",
        "name": "Partner meetings",
    },
]

# Create all travel records
for travel in travel_records:
    response = requests.post(
        "https://api.dcycle.io/api/v1/business_travels",
        headers=headers,
        json=travel
    ).json()
    
    trip_type = "↔️" if travel['travel_type'] == 'round' else "β†’"
    print(f"   {travel['name']}: {travel['origin']} {trip_type} {travel['destination']}")
    print(f"      Mode: {travel['transport_type']} | Trips: {travel['travel_number']}")
    print(f"      COβ‚‚e: {response.get('co2e', 'Calculating...')} kg")
    print()

print(f"βœ… Created {len(travel_records)} travel records")

Step 2: Bulk Upload Business Travel

For organizations with many trips, use CSV upload:

CSV Format

description(optional),start_date,end_date,origin,destination,distance_km(optional),transport_type,vehicle_size(optional),fuel_type(optional),travel_type,travel_number,email(optional)
"Annual conference",2024-01-15,2024-01-18,"New York, USA","London, UK",,aircraft,,,round,1,[email protected]
"Client meeting",2024-02-10,2024-02-10,"Barcelona, Spain","Madrid, Spain",,aircraft,,,one_way,1,
"Monthly visits",2024-02-01,2024-02-28,"Paris, France","Brussels, Belgium",,train,,,round,2,
"Factory visits",2024-03-01,2024-03-31,"Munich, Germany","Stuttgart, Germany",,car,medium,diesel,one_way,5,
"Partner meetings",2024-03-01,2024-03-31,,,80,car,small,electric,round,3,
CSV Notes:
  • distance_km can be provided instead of origin/destination
  • vehicle_size and fuel_type only apply to cars
  • travel_type: use round or one_way
  • travel_number: multiply for recurring trips

Upload CSV

import requests
import os

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

# Upload CSV file
with open("business_travel_2024.csv", "rb") as f:
    files = {"file": ("business_travel_2024.csv", f, "text/csv")}
    
    response = requests.post(
        "https://api.dcycle.io/api/v1/business_travels/bulk/csv",
        headers=headers,
        files=files
    )

if response.status_code == 200:
    result = response.json()
    print(f"βœ… Uploaded {result.get('records_processed', 0)} travel records")
    print(f"   Total COβ‚‚e: {result.get('total_co2e', 0):,.0f} kg")
else:
    print(f"❌ Upload failed: {response.text}")

Step 3: Query Category 6 Emissions

Get Business Travel Totals

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 business travel for 2024
response = requests.get(
    "https://api.dcycle.io/api/v1/business_travels",
    headers=headers,
    params={
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
    }
).json()

print(f"πŸ“Š Scope 3 Category 6: Business Travel (2024)")
print("=" * 60)

total_distance = 0
total_co2e = 0
total_trips = 0

for travel in response.get('items', []):
    distance = travel.get('distance_km', 0) or 0
    co2e = travel.get('co2e', 0) or 0
    trips = travel.get('travel_number', 1)
    
    # Account for round trips
    if travel.get('travel_type') == 'round':
        distance *= 2
        trips *= 2
    
    total_distance += distance * trips
    total_co2e += co2e
    total_trips += trips

print(f"   Total trips: {total_trips:,}")
print(f"   Total distance: {total_distance:,.0f} km")
print(f"   Total COβ‚‚e: {total_co2e:,.0f} kg ({total_co2e/1000:.1f} tonnes)")

Analyze by Transport Mode

from collections import defaultdict

# Group by transport type
transport_summary = defaultdict(lambda: {"trips": 0, "distance": 0, "co2e": 0})

for travel in response.get('items', []):
    transport = travel.get('transport_type', 'unknown')
    distance = travel.get('distance_km', 0) or 0
    co2e = travel.get('co2e', 0) or 0
    trips = travel.get('travel_number', 1)
    
    if travel.get('travel_type') == 'round':
        distance *= 2
        trips *= 2
    
    transport_summary[transport]["trips"] += trips
    transport_summary[transport]["distance"] += distance * trips
    transport_summary[transport]["co2e"] += co2e

print("\nπŸ“Š Category 6 by Transport Mode:")
print("-" * 50)

transport_icons = {
    "aircraft": "✈️",
    "train": "πŸš‚",
    "car": "πŸš—",
    "bus": "🚌",
    "metro": "πŸš‡",
}

for transport, data in sorted(transport_summary.items(), key=lambda x: x[1]['co2e'], reverse=True):
    icon = transport_icons.get(transport, "πŸš€")
    percentage = (data['co2e'] / total_co2e * 100) if total_co2e > 0 else 0
    
    print(f"   {icon} {transport.capitalize()}:")
    print(f"      Trips: {data['trips']:,}")
    print(f"      Distance: {data['distance']:,.0f} km")
    print(f"      COβ‚‚e: {data['co2e']:,.0f} kg ({percentage:.1f}%)")
    print()

Analyze by Employee/Traveler

# Group by traveler email
traveler_summary = defaultdict(lambda: {"trips": 0, "co2e": 0})

for travel in response.get('items', []):
    email = travel.get('email', 'Unknown')
    co2e = travel.get('co2e', 0) or 0
    trips = travel.get('travel_number', 1)
    
    if travel.get('travel_type') == 'round':
        trips *= 2
    
    traveler_summary[email]["trips"] += trips
    traveler_summary[email]["co2e"] += co2e

print("\nπŸ“Š Top 10 Travelers by Emissions:")
print("-" * 50)

sorted_travelers = sorted(traveler_summary.items(), key=lambda x: x[1]['co2e'], reverse=True)[:10]

for i, (email, data) in enumerate(sorted_travelers, 1):
    print(f"   {i}. {email}")
    print(f"      Trips: {data['trips']:,} | COβ‚‚e: {data['co2e']:,.0f} kg")

Best Practices

1. Encourage Lower-Carbon Alternatives

# Identify flights that could be replaced by train
def suggest_train_alternatives(travels):
    """Find short flights that could use rail instead"""
    
    suggestions = []
    
    for travel in travels:
        if travel.get('transport_type') != 'aircraft':
            continue
        
        distance = travel.get('distance_km', 0)
        
        # Flights under 500km often have viable train alternatives
        if distance and distance < 500:
            suggestions.append({
                "travel_id": travel['id'],
                "route": f"{travel.get('origin')} β†’ {travel.get('destination')}",
                "distance": distance,
                "current_co2e": travel.get('co2e', 0),
                "potential_savings": "50-80% with train",
            })
    
    return suggestions

alternatives = suggest_train_alternatives(response.get('items', []))

if alternatives:
    print("\nπŸ’‘ Consider Train Alternatives for These Routes:")
    for alt in alternatives[:5]:
        print(f"   β€’ {alt['route']} ({alt['distance']:.0f} km)")
        print(f"     Current: {alt['current_co2e']:.0f} kg COβ‚‚e")
        print(f"     Potential savings: {alt['potential_savings']}")

2. Track Emission Intensity

# Calculate emissions per trip
def calculate_travel_intensity(travels):
    """Calculate kg COβ‚‚e per trip"""
    
    total_trips = 0
    total_co2e = 0
    
    for travel in travels:
        trips = travel.get('travel_number', 1)
        if travel.get('travel_type') == 'round':
            trips *= 2
        
        total_trips += trips
        total_co2e += travel.get('co2e', 0) or 0
    
    if total_trips > 0:
        return total_co2e / total_trips
    return 0

intensity = calculate_travel_intensity(response.get('items', []))
print(f"\nπŸ“Š Average Emission Intensity: {intensity:.1f} kg COβ‚‚e per trip")

# Benchmark
if intensity > 500:
    print("   ⚠️ High intensity - consider reducing long-haul flights")
elif intensity > 200:
    print("   πŸ“ˆ Moderate - look for rail alternatives")
else:
    print("   βœ… Good - maintain low-carbon travel habits")

3. Set Travel Policies

# Define and check against travel policy
travel_policy = {
    "max_flight_distance_for_rail": 500,  # km
    "preferred_car_fuel": "electric",
    "max_co2e_per_trip": 1000,  # kg
}

def check_policy_compliance(travel, policy):
    """Check if travel complies with company policy"""
    
    issues = []
    
    # Check if short flight could be train
    if travel.get('transport_type') == 'aircraft':
        distance = travel.get('distance_km', 0)
        if distance and distance < policy['max_flight_distance_for_rail']:
            issues.append(f"Consider train for routes under {policy['max_flight_distance_for_rail']} km")
    
    # Check car fuel type
    if travel.get('transport_type') == 'car':
        if travel.get('fuel_type') not in [policy['preferred_car_fuel'], 'hybrid']:
            issues.append(f"Prefer {policy['preferred_car_fuel']} vehicles")
    
    # Check emissions threshold
    co2e = travel.get('co2e', 0) or 0
    if co2e > policy['max_co2e_per_trip']:
        issues.append(f"Exceeds max COβ‚‚e threshold ({policy['max_co2e_per_trip']} kg)")
    
    return issues

# Check all travels
non_compliant = []
for travel in response.get('items', []):
    issues = check_policy_compliance(travel, travel_policy)
    if issues:
        non_compliant.append({
            "travel": travel,
            "issues": issues
        })

print(f"\n⚠️ Policy Compliance Check:")
print(f"   Non-compliant trips: {len(non_compliant)} of {len(response.get('items', []))}")
Reduction Strategies for Category 6
  1. Virtual meetings: Replace travel with video conferencing
  2. Rail over air: Use trains for routes under 500 km
  3. Electric vehicles: Choose EVs for rental cars
  4. Trip consolidation: Combine multiple meetings in one trip
  5. Travel policy: Set emissions budgets per employee/department
  6. Carbon offsets: Offset unavoidable travel (last resort)

Troubleshooting

Issue: Distance Not Calculated

# If origin/destination geocoding fails, provide distance directly
business_travel = {
    "distance_km": 1250,  # Provide direct distance
    "transport_type": "aircraft",
    "travel_type": "round",
    "travel_number": 1,
    "start_date": "2024-03-15",
    "end_date": "2024-03-17",
    "name": "Trip with known distance",
}

Issue: Unknown Transport Type

# Valid transport types
valid_transport_types = [
    "aircraft",
    "car",
    "bus",
    "train",
    "metro",
    "tram",
]

# Map common aliases
transport_mapping = {
    "flight": "aircraft",
    "plane": "aircraft",
    "rail": "train",
    "subway": "metro",
    "taxi": "car",
    "rental": "car",
}

# Convert to valid type
user_input = "flight"
transport_type = transport_mapping.get(user_input.lower(), user_input.lower())

if transport_type not in valid_transport_types:
    print(f"⚠️ Unknown transport type: {user_input}")
    print(f"   Valid types: {', '.join(valid_transport_types)}")

Issue: Category 6 Seems Too Low

# Common reasons for underreported business travel:
checks = {
    "Missing data sources": "Check expense reports, travel bookings",
    "Incomplete periods": "Ensure all months are covered",
    "Missing transport types": "Include taxis, rental cars, not just flights",
    "Conference travel": "Don't forget event-related travel",
    "Contractor travel": "Include if paid by your organization",
}

print("πŸ” Checklist for Category 6 completeness:")
for issue, action in checks.items():
    print(f"   ☐ {issue}")
    print(f"      β†’ {action}")

Next Steps