Skip to main content

Understanding Capital Goods Emissions

Capital goods are physical assets with an extended life that your organization uses to manufacture products, provide services, or sell, store, and deliver merchandise. Unlike purchased goods and services, capital goods are amortized over their useful life rather than consumed immediately. Under ISO 14064-1 Category 4, capital goods include:
  • Buildings and facilities: Offices, warehouses, manufacturing plants, retail stores
  • Machinery and equipment: Production lines, HVAC systems, generators, industrial equipment
  • Vehicles: Company fleet vehicles (if purchased, not leased)
  • IT infrastructure: Servers, data centers, computer equipment, networking hardware
  • Furniture and fixtures: Office furniture, shelving, storage systems
┌─────────────────────────────────────────────────────────────────────────────┐
│              ISO 14064-1 CATEGORY 4.1: Capital Goods                        │
├─────────────────────┬─────────────────────┬─────────────────────────────────┤
│  Buildings &        │  Machinery &        │  IT & Other                     │
│  Facilities         │  Equipment          │  Assets                         │
├─────────────────────┼─────────────────────┼─────────────────────────────────┤
│  • Office buildings │  • Production lines │  • Servers & data centers       │
│  • Warehouses       │  • HVAC systems     │  • Computer equipment           │
│  • Manufacturing    │  • Generators       │  • Furniture & fixtures         │
│  • Retail stores    │  • Fleet vehicles   │  • Networking hardware          │
└─────────────────────┴─────────────────────┴─────────────────────────────────┘
Purchased Goods vs Capital Goods
AspectPurchased Goods (4.3)Capital Goods (4.1)
TypeOperational expenditure (OPEX)Capital expenditure (CAPEX)
ConsumptionConsumed/used within reporting yearMulti-year useful life
ExamplesRaw materials, services, suppliesBuildings, machinery, vehicles
AccountingFull emissions in year of purchaseCan be amortized over useful life
Dcycle fieldexpense_type: "opex"expense_type: "capex"

Prerequisites

Before starting, ensure you have:
  • Dcycle API credentials (get them here)
  • Capital asset data: fixed asset register, procurement records, or investment records
  • Understanding of your capital asset categories and their acquisition costs or physical specifications
Using the Dcycle App?You can also manage capital goods through our web interface:

Data Map: Capital Goods Requirements Overview

┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                        CAPITAL GOODS DATA REQUIREMENTS                                   │
├─────────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                         │
│  ┌─────────────────────────────────────────────────────────────────────────────────┐   │
│  │ CAPITAL GOODS DATA                                                              │   │
│  ├─────────────────────────────────────────────────────────────────────────────────┤   │
│  │                                                                                 │   │
│  │  Spend-Based               Activity-Based            Supplier-Specific         │   │
│  │  ────────────────────      ────────────────          ─────────────────         │   │
│  │  • quantity (€)            • quantity (kg, units)    • quantity                │   │
│  │  • unit_id (€)             • unit_id (kg, m², etc.)  • unit_id                 │   │
│  │  • sector                  • product_name            • custom_emission_        │   │
│  │  • product_name            • sector                    factor_id               │   │
│  │  • country                 • country                 • supplier_id             │   │
│  │  • purchase_date           • purchase_date           • purchase_date           │   │
│  │  • expense_type: "capex"   • expense_type: "capex"   • expense_type: "capex"   │   │
│  │                                                                                 │   │
│  └─────────────────────────────────────────────────────────────────────────────────┘   │
│                                                                                         │
│  ┌─────────────────────────────────────────────────────────────────────────────────┐   │
│  │ KEY REQUIREMENT                                                                 │   │
│  ├─────────────────────────────────────────────────────────────────────────────────┤   │
│  │                                                                                 │   │
│  │  ⚠️  Set expense_type = "capex" (not "opex")                                    │   │
│  │                                                                                 │   │
│  │  This field determines whether emissions are classified as:                    │   │
│  │  • Category 4.3 (Purchased goods & services) → expense_type: "opex"            │   │
│  │  • Category 4.1 (Capital goods) → expense_type: "capex"                        │   │
│  │                                                                                 │   │
│  └─────────────────────────────────────────────────────────────────────────────────┘   │
│                                                                                         │
└─────────────────────────────────────────────────────────────────────────────────────────┘

Calculation Methods

Capital goods use the same calculation methods as purchased goods, with identical emission factor sources:
The spend-based method uses economic input-output (EEIO) emission factors based on the monetary value of capital purchases.
Acquisition Cost (€) → Sector/Product Category → Exiobase EF → CO₂e
          ↓                     ↓                      ↓           ↓
   Invoice/PO amount      Product mapping         kg CO₂e/€    Total emissions
Key characteristics:
  • Uses Exiobase 3.8.2 input-output emission factors
  • Best for buildings, infrastructure, and mixed assets
  • Lower accuracy but easiest to implement
  • Use when you only have financial data
For spend-based calculations, Dcycle uses emission factors from:
  • Exiobase 3.8.2 - Multi-Regional Environmentally Extended Supply-Use Tables
  • Covers construction, manufacturing, and equipment sectors
  • Source: Exiobase
Common capital goods sectors:
  • Construction - Buildings and infrastructure
  • Manufacture of machinery and equipment n.e.c. - Industrial equipment
  • Manufacture of motor vehicles - Fleet vehicles
  • Manufacture of computer, electronic and optical products - IT equipment
Spend-based emissions are calculated as:CO₂e = Acquisition Cost (€) × Economic Intensity Factor (kg CO₂e/€)Where:
  • Acquisition Cost: Total purchase price including installation/commissioning
  • Economic Intensity Factor: Exiobase emission factor for the asset category
Example (Office Building):
€2,000,000 × 0.35 kg CO₂e/€ = 700,000 kg CO₂e (700 tCO₂e)
Example (Industrial Machinery):
€500,000 × 0.45 kg CO₂e/€ = 225,000 kg CO₂e (225 tCO₂e)

Amortization Approaches

ISO 14064-1 allows two approaches for reporting capital goods emissions:
Report all emissions in the year the asset is acquired.This is the simpler approach and Dcycle’s default behavior.Pros:
  • Simple to implement
  • Matches accounting treatment timing
  • No tracking of asset useful life needed
Cons:
  • Creates emissions “spikes” in years with major investments
  • Year-over-year comparisons more difficult
  • May not reflect when the asset is actually used
# Default behavior: full emissions in purchase year
capital_asset = {
    "description": "New manufacturing facility",
    "expense_type": "capex",
    "quantity": 5000000,  # €5M full cost
    "purchase_date": "2024-01-15",  # All emissions in 2024
    # ...
}
Spread emissions over the asset’s useful life, matching financial depreciation.This approach requires manual calculation and multiple annual entries.Pros:
  • Smoother emissions profile
  • Better reflects when asset value is consumed
  • Aligns with financial depreciation schedules
Cons:
  • More complex to implement
  • Requires tracking useful life for each asset
  • Must create entries for multiple years
# Example: €5M building with 25-year useful life
annual_emissions_value = 5000000 / 25  # €200,000 per year

# Create 25 annual entries
for year in range(2024, 2049):
    capital_asset = {
        "description": f"Manufacturing facility - Year {year - 2023} of 25",
        "expense_type": "capex",
        "quantity": 200000,  # €200K annual portion
        "purchase_date": f"{year}-01-01",
        # ...
    }
Contact Dcycle support for guidance on implementing the depreciation approach for your organization.

Recording Capital Goods

Data Flow

1

Identify Capital Assets

Review your fixed asset register to identify assets acquired during the reporting period
2

Classify by Asset Type

Categorize assets (buildings, machinery, vehicles, IT, etc.) for appropriate emission factors
3

Choose Calculation Method

Select spend-based, activity-based, or supplier-specific based on available data
4

Create Capital Goods Records

Record assets via API with expense_type: "capex" to classify as Category 4.1
5

Query and Analyze

View Category 4.1 emissions separately from Category 4.3 in reports

Create a Spend-Based Capital Good

FieldTypeRequiredDescriptionExample
descriptionstringAsset description"New manufacturing equipment"
sectorstringEconomic sector"Manufacture of machinery"
product_namestringProduct/asset category"Machinery and equipment n.e.c."
quantitynumberAcquisition cost500000
unit_idUUIDCurrency unit (€)"eur-unit-uuid"
countrystringCountry of manufacture"DE"
purchase_datedateAcquisition date"2024-03-15"
expense_typestringMust be “capex”"capex"
supplier_idUUIDLinked supplier"supplier-uuid"
Where to get this data:
  • Quantity: From fixed asset register, purchase orders, or invoices
  • Sector/Product: Map from your asset categories (see Exiobase mapping)
  • Country: Country where the asset was manufactured
Record a capital asset using the spend-based method:
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 the EUR unit
units = requests.get(
    "https://api.dcycle.io/api/v1/units",
    headers=headers,
    params={"page": 1, "size": 100}
).json()

eur_unit = next(u for u in units['items'] if u['abbreviation'] == '€')

# Create capital good (manufacturing equipment - spend-based)
capital_good_data = {
    "description": "CNC Machining Center - Model X500",
    "sector": "Manufacture of machinery and equipment n.e.c.",
    "product_name": "Machinery and equipment n.e.c.",
    "quantity": 500000,  # €500,000 acquisition cost
    "unit_id": eur_unit['id'],
    "country": "DE",  # Manufactured in Germany
    "purchase_date": "2024-03-15",
    "expense_type": "capex",  # ⚠️ IMPORTANT: This makes it Category 4.1
    "purchase_type": "spend_based",
}

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

capital_good = response.json()
print(f"✅ Capital good recorded: {capital_good['id']}")
print(f"   Description: {capital_good['description']}")
print(f"   Cost: €{capital_good['quantity']:,.2f}")
print(f"   CO₂e: {capital_good.get('co2e', 'Calculating...')} kg")
print(f"   ISO 14064-1 Category: 4.1 (Capital Goods)")
Critical: Set expense_type: "capex"The expense_type field determines which category the emissions are assigned to:
  • expense_type: "opex" → Category 4.3 (Purchased Goods & Services)
  • expense_type: "capex" → Category 4.1 (Capital Goods)
If you omit this field or set it to “opex”, emissions will be incorrectly classified.

Create an Activity-Based Capital Good

FieldTypeRequiredDescriptionExample
descriptionstringAsset description"Steel production equipment"
sectorstringProduct sector"Manufacture of basic metals"
product_namestringSpecific product"Basic iron and steel"
quantitynumberPhysical quantity15000
unit_idUUIDPhysical unit (kg)"kg-unit-uuid"
countrystringCountry of manufacture"DE"
purchase_datedateAcquisition date"2024-03-15"
expense_typestringMust be “capex”"capex"
supplier_idUUIDEquipment manufacturer"supplier-uuid"
Where to get this data:
  • Quantity: From equipment specifications, shipping documents, or technical data sheets
  • Unit: Match the physical characteristic (kg for weight, m² for buildings)
Use activity-based method when you have physical specifications:
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 the kg unit
units = requests.get(
    "https://api.dcycle.io/api/v1/units",
    headers=headers,
    params={"page": 1, "size": 100}
).json()

kg_unit = next(u for u in units['items'] if u['abbreviation'] == 'kg')

# Create capital good (industrial equipment - activity-based)
capital_good_data = {
    "description": "Industrial Steel Press - 15 tonnes",
    "sector": "Manufacture of fabricated metal products",
    "product_name": "Structural metal products",
    "quantity": 15000,  # 15,000 kg (15 tonnes)
    "unit_id": kg_unit['id'],
    "country": "IT",  # Manufactured in Italy
    "purchase_date": "2024-06-01",
    "expense_type": "capex",  # Category 4.1
    "purchase_type": "activity_based",
}

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

capital_good = response.json()
print(f"✅ Capital good recorded (activity-based): {capital_good['id']}")
print(f"   Weight: {capital_good['quantity']:,.0f} kg")
print(f"   CO₂e: {capital_good.get('co2e', 'Calculating...')} kg")
When to Use Activity-Based for Capital GoodsActivity-based is particularly useful for:
  • Heavy equipment: Weight-based calculation (kg CO₂e/kg of steel, aluminum, etc.)
  • Buildings: Area-based calculation (kg CO₂e/m² of floor space)
  • Vehicles: Unit-based calculation (kg CO₂e/vehicle by type)
  • Standardized equipment: When physical specs are readily available

Create a Supplier-Specific Capital Good

FieldTypeRequiredDescriptionExample
descriptionstringAsset description"Low-carbon HVAC system"
quantitynumberPhysical quantity1
unit_idUUIDUnit"unit-uuid"
purchase_datedateAcquisition date"2024-03-15"
expense_typestringMust be “capex”"capex"
supplier_idUUIDEquipment manufacturer"supplier-uuid"
custom_emission_factor_idUUIDCustom EF from manufacturer EPD"custom-ef-uuid"
Where to get this data:
  • Custom Emission Factor: Create from manufacturer’s EPD or Product Carbon Footprint
  • Supplier: Link to the equipment manufacturer
For highest accuracy, use manufacturer-provided emission data:
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"),
}

# Step 1: Create custom emission factor from manufacturer's EPD
kg_unit_id = "61743a63-ff70-459c-9567-5eee8f7dfd5c"  # kg unit UUID

group = requests.post(
    "https://api.dcycle.io/api/v1/custom_emission_groups",
    headers=headers,
    json={
        "name": "GreenTech HVAC - 2024 Product Line",
        "description": "EPD-verified emission factors for GreenTech HVAC systems",
        "category": "capex",  # Note: use capex category
        "ghg_type": 1,
    },
).json()

# Create emission factor from the EPD
factor = requests.post(
    f"https://api.dcycle.io/api/v1/custom_emission_factors/{group['id']}",
    headers=headers,
    json={
        "ef_name": "GreenTech HVAC System Model GT-500 (EPD S-P-54321)",
        "unit_id": "unit-uuid",  # per unit
        "factor_uploaded_by": "[email protected]",
        "tag": "advanced",
        "uncertainty_grade": 10,
        "factor_start_date": "2024-01-01",
        "factor_end_date": "2024-12-31",
        "additional_docs": "EPD No. S-P-54321, Verified by SGS",
        "emission_factor_values": [
            {"gas_type": "CO2", "value": 2500},  # kg CO2 per unit
            {"gas_type": "CH4", "value": 5.0},
            {"gas_type": "N2O", "value": 0.5},
        ],
    },
).json()

# Step 2: Create capital good using the custom emission factor
capital_good_data = {
    "description": "GreenTech HVAC System GT-500 (EPD verified)",
    "quantity": 3,  # 3 units
    "unit_id": "unit-uuid",
    "purchase_date": "2024-04-01",
    "expense_type": "capex",
    "supplier_id": "greentech-supplier-uuid",
    "custom_emission_factor_id": factor['id'],
}

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

capital_good = response.json()
print(f"✅ Capital good recorded (supplier-specific): {capital_good['id']}")
print(f"   Units: {capital_good['quantity']}")
print(f"   CO₂e: {capital_good.get('co2e', 'Calculating...')} kg")
print(f"   Method: EPD-verified (highest accuracy)")
Finding EPDs for Capital EquipmentEnvironmental Product Declarations (EPDs) are increasingly available for:
  • Construction products: Concrete, steel, insulation, windows
  • HVAC equipment: Heating, cooling, ventilation systems
  • Vehicles: Major manufacturers publish vehicle PCFs
  • IT equipment: Servers, computers (check manufacturer websites)
EPD registries:

Bulk Upload Capital Goods

For large capital investments or fixed asset registers:

CSV Format for Capital Goods

description,sector,product_name,quantity,unit_id,country,purchase_date,expense_type,supplier_id,purchase_type
"Manufacturing facility expansion",Construction,Construction work,2000000,eur-uuid,ES,2024-01-15,capex,,spend_based
"CNC Machine Model X500",Manufacture of machinery,Machinery and equipment,500000,eur-uuid,DE,2024-02-01,capex,supplier-uuid-1,spend_based
"Fleet vehicles (10 trucks)",Manufacture of motor vehicles,Motor vehicles,750000,eur-uuid,ES,2024-03-01,capex,supplier-uuid-2,spend_based
"Server infrastructure",Manufacture of computers,Computer and electronic products,300000,eur-uuid,US,2024-04-01,capex,supplier-uuid-3,spend_based
Key points:
  • expense_type must be capex for all capital goods
  • Use appropriate sector/product mapping for each asset type
  • Include supplier_id when available for tracking

Upload Process

# Get presigned URL for bulk upload
upload_response = requests.post(
    "https://api.dcycle.io/api/v1/purchases/bulk/csv",
    headers=headers,
    json={"file_name": "capital_goods_2024.csv"},
).json()

# Upload CSV to presigned URL
with open('capital_goods_2024.csv', 'rb') as f:
    requests.put(upload_response['upload_url'], data=f)

print(f"✅ Capital goods CSV uploaded")
print(f"   Processing will begin automatically")

Common Capital Goods Sectors

Here are the most common Exiobase sectors for capital goods:
Asset TypeExiobase SectorTypical EF (kg CO₂e/€)
Buildings - CommercialConstruction0.30 - 0.45
Buildings - IndustrialConstruction0.35 - 0.50
Machinery - GeneralManufacture of machinery and equipment n.e.c.0.40 - 0.55
Vehicles - TrucksManufacture of motor vehicles0.35 - 0.45
Vehicles - CarsManufacture of motor vehicles0.30 - 0.40
IT - ServersManufacture of computer, electronic and optical products0.25 - 0.40
IT - ComputersManufacture of computer, electronic and optical products0.20 - 0.35
HVAC SystemsManufacture of electrical equipment0.35 - 0.50
FurnitureManufacture of furniture0.25 - 0.40
Construction ProjectsFor major construction projects (new buildings, facility expansions), consider:
  1. Spend-based for initial estimates (total project cost × construction EF)
  2. Activity-based for major materials (steel, concrete, glass tonnage)
  3. EPDs for specific materials from suppliers
This hybrid approach improves accuracy while remaining practical.

Query Capital Goods Emissions

Separate Category 4.1 and Category 4.3 in Reports

# Query purchases filtered by expense_type
capital_goods = requests.get(
    "https://api.dcycle.io/api/v1/purchases",
    headers=headers,
    params={
        "page": 1,
        "size": 50,
        "expense_type": "capex",  # Only capital goods
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
    },
).json()

purchased_goods = requests.get(
    "https://api.dcycle.io/api/v1/purchases",
    headers=headers,
    params={
        "page": 1,
        "size": 50,
        "expense_type": "opex",  # Only regular purchases
        "start_date": "2024-01-01",
        "end_date": "2024-12-31",
    },
).json()

# Calculate totals
cat41_total = sum(p['co2e'] for p in capital_goods['items'])
cat43_total = sum(p['co2e'] for p in purchased_goods['items'])

print(f"📊 ISO 14064-1 Category 4 Summary (2024)")
print(f"   Category 4.1 (Capital goods): {cat41_total:,.0f} kg CO₂e")
print(f"   Category 4.3 (Purchased goods): {cat43_total:,.0f} kg CO₂e")
print(f"   Total: {cat41_total + cat43_total:,.0f} kg CO₂e")

Analyze Capital Goods by Asset Type

from collections import defaultdict

# Aggregate by sector
by_sector = defaultdict(lambda: {'co2e': 0, 'cost': 0, 'count': 0})

for asset in capital_goods['items']:
    sector = asset['sector']
    by_sector[sector]['co2e'] += asset['co2e']
    by_sector[sector]['cost'] += asset['quantity']
    by_sector[sector]['count'] += 1

# Sort by emissions
sorted_sectors = sorted(
    by_sector.items(),
    key=lambda x: x[1]['co2e'],
    reverse=True
)

print(f"\n📊 Capital Goods by Asset Type")
for sector, data in sorted_sectors:
    pct = (data['co2e'] / cat41_total) * 100 if cat41_total > 0 else 0
    print(f"\n{sector}:")
    print(f"   Assets: {data['count']}")
    print(f"   Investment: €{data['cost']:,.0f}")
    print(f"   CO₂e: {data['co2e']:,.0f} kg ({pct:.1f}%)")

Troubleshooting

Issue: Capital Good Showing as Category 4.3

# Check the expense_type field
purchase = requests.get(
    f"https://api.dcycle.io/api/v1/purchases/{purchase_id}",
    headers=headers,
).json()

print(f"Expense type: {purchase['expense_type']}")

if purchase['expense_type'] != 'capex':
    print("⚠️  This is classified as Category 4.3, not Category 4.1")
    print("💡 Update the expense_type to 'capex':")
    
    # Fix the classification
    requests.patch(
        f"https://api.dcycle.io/api/v1/purchases/{purchase_id}",
        headers=headers,
        json={"expense_type": "capex"},
    )

Issue: What Counts as a Capital Good?

"""
CAPITAL GOODS (Category 4.1 - use expense_type: "capex"):
✅ Buildings, facilities, infrastructure
✅ Machinery and production equipment
✅ Vehicles (if purchased, not leased)
✅ IT servers, data centers
✅ Office furniture (if capitalized)
✅ Major renovations/improvements

PURCHASED GOODS (Category 4.3 - use expense_type: "opex"):
✅ Raw materials, components
✅ Office supplies
✅ Services (consulting, cleaning, etc.)
✅ Maintenance and repairs
✅ Items expensed in year of purchase

RULE OF THUMB:
- If it's capitalized on your balance sheet → Category 4.1 (capex)
- If it's expensed in P&L → Category 4.3 (opex)
"""

Next Steps