Carbon and Scope 3 emissions tracking — GHG Protocol, emission hotspot analysis, Net Zero roadmap generation, SBTi alignment, CSRD-ready reporting
Project description
scope3track
Carbon and Scope 3 emissions tracking for SMBs and enterprise supply chains — GHG Protocol-compliant calculations, supplier-level tracking, CSRD-ready reporting.
Enterprise carbon tools cost $30K–$150K/year. scope3track brings the same capability to Python developers for free.
The Problem
EU CSRD enforcement + enterprise Scope 3 requirements are now cascading to SMB suppliers. Companies are required to report their full value-chain emissions. Enterprise tools cost $30K–$150K/year — nothing exists at the $99–$499/mo SMB price point.
Installation
pip install scope3track
Quick Start
from scope3track import EmissionCalculator, EmissionScope, Scope3Category
from datetime import datetime
calc = EmissionCalculator()
# Calculate Scope 3 Category 4: upstream transport
transport_entry = calc.calculate(
entry_id="ENT-001",
scope=EmissionScope.SCOPE3,
category=Scope3Category.UPSTREAM_TRANSPORT,
source="Freight — Shanghai to LA",
activity_amount=5000, # kg of freight
activity_unit="kg",
factor_key="km_road_freight_hgv",
period_start=datetime(2025, 1, 1),
period_end=datetime(2025, 3, 31),
supplier_id="SUPPLIER-CN-01",
)
print(f"{transport_entry.emissions_kg_co2e:.2f} kg CO2e")
Build a Full Report
entries = [
calc.calculate("e1", EmissionScope.SCOPE1, "Natural gas heating", 10000, "kwh", "kwh_natural_gas", period_start=..., period_end=...),
calc.calculate("e2", EmissionScope.SCOPE2, "Office electricity", 50000, "kwh", "kwh_electricity_us", period_start=..., period_end=...),
calc.calculate("e3", EmissionScope.SCOPE3, "Employee commuting", 200000, "km", "km_passenger_car", category=Scope3Category.EMPLOYEE_COMMUTING, period_start=..., period_end=...),
]
report = calc.build_report(
company_id="ACME-INC",
reporting_year=2025,
entries=entries,
)
print(report.summary())
# {'company_id': 'ACME-INC', 'scope1_t_co2e': 2.02, 'scope2_t_co2e': 19.3, 'scope3_t_co2e': 34.2, 'total_t_co2e': 55.52, ...}
Built-in Emission Factors
scope3track ships with GHG Protocol default factors for:
- Energy: electricity (US/EU grid), natural gas
- Transport: road freight, air freight, sea freight, passenger car, business flights
- Materials: steel, aluminium, plastic, paper, concrete
- Waste: landfill, recycled, composted
Register custom factors:
from scope3track import default_registry
default_registry.register("kwh_solar_ppa", 0.012)
Scope 3 Categories Supported
All 15 GHG Protocol Scope 3 categories (upstream + downstream):
purchased_goods_services, capital_goods, fuel_and_energy_activities, upstream_transportation_distribution, waste_generated_in_operations, business_travel, employee_commuting, upstream_leased_assets, downstream_transportation_distribution, processing_of_sold_products, use_of_sold_products, end_of_life_treatment, downstream_leased_assets, franchises, investments
Advanced Features
Pipeline
from scope3track import EmissionPipeline
pipeline = (
EmissionPipeline()
.filter(lambda e: e.scope == EmissionScope.SCOPE3, name="scope3_only")
.map(lambda entries: sorted(entries, key=lambda e: -e.emissions_kg_co2e), name="sort_by_impact")
.with_retry(count=2)
)
scope3_sorted = pipeline.run(entries)
Caching
from scope3track import EmissionCache
cache = EmissionCache(max_size=1000, ttl_seconds=3600)
@cache.memoize
def get_supplier_emissions(supplier_id):
...
cache.save("emissions_cache.pkl")
cache.load("emissions_cache.pkl")
print(cache.stats())
Export Reports
from scope3track import EmissionReportExporter
print(EmissionReportExporter.to_json(report))
print(EmissionReportExporter.to_csv(report))
print(EmissionReportExporter.to_markdown(report))
Drift Detection
from scope3track import EmissionDriftDetector
detector = EmissionDriftDetector(threshold=0.15)
for period_total in quarterly_totals:
detector.record(period_total)
if detector.is_drifted():
print(f"Emission drift detected: {detector.drift_ratio():.1%}")
Diff Between Periods
from scope3track import diff_entries
diff = diff_entries(q1_entries, q2_entries)
print(diff.summary()) # {'added': 2, 'removed': 0, 'modified': 3}
print(diff.to_json())
Async Batch
from scope3track import abatch_calculate, CancellationToken
token = CancellationToken()
entries = await abatch_calculate(raw_data, calc_fn, max_concurrency=8, token=token)
Streaming NDJSON
from scope3track import entries_to_ndjson
for line in entries_to_ndjson(entries):
output_stream.write(line)
Frameworks Supported
- GHG Protocol Corporate Standard
- EU CSRD / ESRS E1
- ISO 14064-1
Changelog
v1.2.2 (2026-04-10)
- Added Contributing and Author sections to README
v1.2.1 (2026-04-10)
- Added Changelog section to README for release traceability
v1.2.0
- Added
EmissionHotspotAnalyzer— identify top emission contributors across supply chain tiers - Added
NetZeroRoadmapGenerator— generate phased net-zero reduction roadmaps with milestones - Expanded SEO keywords for PyPI discoverability
v1.0.1
- Advanced features: pipeline, caching, validation, diff/trend, streaming, audit log
v1.0.0
- Initial release: Scope 3 emissions tracking, GHG Protocol calculations, supplier-level reporting
License
MIT
Contributing
Contributions are welcome! Here's how to get started:
- Fork the repository on GitHub
- Create a feature branch:
git checkout -b feature/your-feature - Make your changes and add tests
- Run the test suite:
pytest tests/ -v - Submit a pull request
Please open an issue first for major changes to discuss the approach.
Author
Mahesh Makvana — GitHub · PyPI
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scope3track-1.2.2.tar.gz.
File metadata
- Download URL: scope3track-1.2.2.tar.gz
- Upload date:
- Size: 27.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bc2ecfe9ac53485ab2eeff74c2a7fdc6d08fa906842b422c4b35961bd7214f6
|
|
| MD5 |
b21a0e66111897dbbe5e5d353a026c46
|
|
| BLAKE2b-256 |
7322517eb9b96ef2fee62733869019e2ba1df8afc2e77f9d599d787468677efb
|
File details
Details for the file scope3track-1.2.2-py3-none-any.whl.
File metadata
- Download URL: scope3track-1.2.2-py3-none-any.whl
- Upload date:
- Size: 24.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ee676d5bb1b67d07f265519aafb6c3b86452cf5c64017565290aa2dd377274f
|
|
| MD5 |
6e87cd90f961dc79fb8a0447c45271be
|
|
| BLAKE2b-256 |
7d01b20b8366692cd3f26c686e7b48b2f85d85e18735281414448c53c5d0c76a
|