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:- Dcycle API credentials (get them here)
- Completed Step 1: Company Structure
- Travel data: origin, destination, transport mode, dates
- Basic knowledge of Python or JavaScript
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 Size | Distance Range | Description |
|---|---|---|
very_short | 0–800 km | Regional flights |
short | 800–1,500 km | Domestic/short-haul |
medium | 1,500–4,000 km | Medium-haul international |
long | 4,000+ km | Long-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 Type | Description | Emission Factor Basis |
|---|---|---|
car | Rental cars, taxis | Per passenger-km |
bus | Coach buses | Per passenger-km |
train | Rail (intercity, regional) | Per passenger-km |
metro | Urban metro/subway | Per passenger-km |
tram | Trams/light rail | Per passenger-km |
| Vehicle Size | Fuel Type | Example |
|---|---|---|
small | petrol, diesel, electric, hybrid | Compact cars |
medium | petrol, diesel, electric, hybrid | Sedans |
large | petrol, diesel, electric, hybrid | SUVs, luxury cars |
Emission Factor Sources
Dcycle uses business travel emission factors from Ecoinvent:Ecoinvent Database
Ecoinvent Database
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)
Distance Calculation
Distance Calculation
Google Maps API:
- Road distances for car, bus travel
- Direct distance (great circle) for flights
- Rail network distances where available
distance_km directly.Step 1: Create Business Travel Records
📋 Data Map: Single Trip
📋 Data Map: Single Trip
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
origin | string | ⚠️ | Departure city/location | "Madrid, Spain" |
destination | string | ⚠️ | Arrival city/location | "London, UK" |
distance_km | number | ⚠️ | Distance (if origin/dest unknown) | 1250 |
transport_type | string | ✅ | Mode of transport | "aircraft" |
travel_type | string | ✅ | Round trip or one-way | "round" |
travel_number | number | ✅ | Number of trips | 1 |
start_date | date | ✅ | Trip start date | "2024-03-15" |
end_date | date | ✅ | Trip end date | "2024-03-17" |
vehicle_size | string | ❌ | For cars: small/medium/large | "medium" |
fuel_type | string | ❌ | For cars: petrol/diesel/electric | "petrol" |
name | string | ❌ | Trip description | "Client meeting" |
email | string | ❌ | Traveler email | "john@company.com" |
- Either
origin+destinationORdistance_kmmust be provided - If both are provided,
distance_kmtakes precedence
- Origin/Destination: Travel bookings, expense reports
- Transport type: Flight/train tickets, car rental invoices
- Dates: Itinerary, calendar entries
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": "john.smith@company.com",
}
response = requests.post(
"https://api.dcycle.io/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")
const axios = require('axios');
const headers = {
'Authorization': `Bearer ${process.env.DCYCLE_API_KEY}`,
'Content-Type': 'application/json',
'x-organization-id': process.env.DCYCLE_ORG_ID,
'x-user-id': process.env.DCYCLE_USER_ID
};
// Example: Round-trip flight for client meeting
const businessTravel = {
origin: 'Madrid, Spain',
destination: 'London, UK',
transport_type: 'aircraft',
travel_type: 'round',
travel_number: 1,
start_date: '2024-03-15',
end_date: '2024-03-17',
name: 'Client meeting - Acme Corp',
email: 'john.smith@company.com'
};
const response = await axios.post(
'https://api.dcycle.io/v1/business_travels',
businessTravel,
{ headers }
).then(res => res.data);
console.log('✅ Business travel created');
console.log(` ID: ${response.id}`);
console.log(` Route: ${businessTravel.origin} → ${businessTravel.destination}`);
console.log(` Transport: ${businessTravel.transport_type}`);
console.log(` Type: ${businessTravel.travel_type} trip`);
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/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,john@company.com
"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_kmcan be provided instead of origin/destinationvehicle_sizeandfuel_typeonly apply to carstravel_type: useroundorone_waytravel_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/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/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
- Virtual meetings: Replace travel with video conferencing
- Rail over air: Use trains for routes under 500 km
- Electric vehicles: Choose EVs for rental cars
- Trip consolidation: Combine multiple meetings in one trip
- Travel policy: Set emissions budgets per employee/department
- 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
Category 7: Employee Commuting
Track daily commuting emissions
Category 1: Purchased Goods
Track upstream product emissions
Category 4: Upstream Transport
Track inbound logistics
Scope 3 Overview
Back to all Scope 3 categories