Methodology
How Verdex computes a vendor's monthly cloud carbon footprint and turns it into a 0–1000 score. Every constant on this page is cited so an auditor can replay the math against primary sources.
methodology_version: v3.1-2026-06
1. Frameworks
The calculator follows the GHG Protocol's Scope 2 (location-based) method for operational electricity, plus Scope 3 Category 11 for amortized embodied (manufacturing) emissions. Service-level energy coefficients come from Cloud Carbon Footprint, the de-facto open-source standard. Grid carbon intensities default to IEA 2023 medians and are overridden with real-time Electricity Maps data when available.
GHG Protocol Scope 2 Guidance (2015), GHG Protocol Scope 3 Standard, Cloud Carbon Footprint methodology, IEA Electricity 2023, Electricity Maps2. Core formula & grid intensity
For each service category, we compute operational energy in kWh, multiply by the regional grid intensity at calculation time, then add embodied (manufacturing) carbon. The total emissions for a vendor is the sum across all services across all connected cloud accounts.
Energy_kWh = usage × kWh_per_unit(service) × PUE(provider) Scope_2_kg = Energy_kWh × grid_intensity_g/kWh / 1000 Scope_3_kg = embodied_factor_per_unit × usage_units (v3, see §4) Total_kg = Scope_2_kg + Scope_3_embodied_kg + Scope_3_transport_kg
Grid intensity resolution (v3 Pass 2)
Annual averages misrepresent emissions because intensity varies 5–20× across the day. us-east-1 swings between ~250 g/kWh at solar peak and ~520 g/kWh on overnight gas peakers; eu-west-3 swings from 18 g/kWh (nuclear baseload) to 200+ g/kWh on winter peak imports. Verdex therefore queries Electricity Maps for the trailing-24h hourly series at calculation time and applies the time-weighted mean (trapezoidal integration over the hourly samples). The series is cached in Firestore for 1 hour per zone so concurrent verify runs share one upstream call.
region → Electricity Maps zone (lib/grid-intensity.ts)
zone → /v3/carbon-intensity/history (24 hourly samples)
hours[] → time-weighted mean (gCO2e/kWh)
fingerprint = sha256(canonical_json({zone, hours})) ← in proof.json
fallback chain:
no API key / unknown zone / upstream error
→ REGION_INTENSITY[region] (IEA 2023 annual mean)
→ FALLBACK_REGION_INTENSITY (world average, 400 g/kWh)Every score document records the actual intensity that was applied (region_intensity_g_per_kwh), its provenance (region_intensity_source: hourly_trailing_24h / cache_hit / static_annual_average), and a SHA-256 fingerprint over the hourly series so a buyer's auditor can replay the exact mean.
Honest caveat. v3 ships hourly intensity, not hourly usage matching. Usage is assumed flat across the day — mathematically equivalent to multiplying monthly kWh by the time-weighted mean. True hourly matching needs hourly usage data (AWS Cost Explorer is monthly-only; Azure Carbon Optimization and GCP BigQuery export are month-grained). That lands in Pass 4 when the AWS Sustainability service GA (June 2026) adds per-hour exports. The GHG Protocol's 2026 Scope 2 consultation is moving toward hourly matching as a requirement for market-based claims by 2027.
3. Energy coefficients
| Constant | Value | Source |
|---|---|---|
| AWS_PUE | 1.135 | Amazon 2022 Sustainability Report (PUE) |
| GCP_PUE | 1.1 | Google Environmental Report 2023 (PUE) |
| AZURE_PUE | 1.18 | Microsoft Sustainability Fact Sheet (PUE) |
| STORAGE_KWH_PER_GB_MONTH | 0.00065 | Cloud Carbon Footprint methodology |
| TRANSFER_KWH_PER_GB | 0.001 | Cloud Carbon Footprint methodology |
| SERVERLESS_KWH_PER_GB_SECOND | 4.63e-7 | Cloud Carbon Footprint methodology |
| BUILD_WATTS | 20 | Cloud Carbon Footprint methodology |
4. Embodied carbon — absolute per-unit factors (Scope 3 Cat 11)
v3 replaces the v2 "multiplier on operational" model with absolute per-unit factors. Why: as grids decarbonize, embodied carbon's share of lifetime data-center emissions has grown from ~25% to 40–50%. In clean-grid regions (eu-north-1 at 8 g/kWh) a multiplier-of-operational under-represents embodied by an order of magnitude. Absolute per-unit factors stay correct regardless of grid. Numbers derive from iMasons Climate Accord server LCA disclosures (~922 kg CO₂e per dual-socket server) amortized over a 4-year service life and split by vCPU + memory density.
Compute — kg CO₂e per instance-hour
| Instance type | kg CO₂e / hour |
|---|---|
| t3.nano | 0.0001 |
| t3.micro | 0.0002 |
| t3.small | 0.0005 |
| t3.medium | 0.001 |
| t3.large | 0.0025 |
| t3.xlarge | 0.005 |
| t3.2xlarge | 0.01 |
| m5.large | 0.03 |
| m5.xlarge | 0.06 |
| m5.2xlarge | 0.12 |
| c5.large | 0.03 |
| c5.xlarge | 0.06 |
| r5.large | 0.038 |
| r5.xlarge | 0.076 |
Storage, transfer, serverless, builds
| Unit | kg CO₂e per unit |
|---|---|
| GB-month storage | 0.0005 |
| GB transferred (network gear) | 0.00005 |
| GB-second serverless | 3e-10 |
| CI build minute | 0.00005 |
Fallback: when instance type can't be resolved (e.g., AWS Cost Explorer spend without per-SKU breakdown), the v2 multiplier model is used and the score is tagged as spend_to_kg_fallback with a ±35% confidence band.
5. AWS Cost Explorer fallback factors
When granular usage isn't available (no CUR, no per-instance metrics), we fall back to converting AWS spend into emissions using category-specific factors. These are derived from Cloud Carbon Footprint coefficients combined with AWS list pricing for the dominant SKU in each category. CUR ingestion gives ~5–10× tighter accuracy and is on the registry roadmap.
| Category | kg CO₂e per $1 |
|---|---|
| compute | 0.2 |
| storage | 0.06 |
| transfer | 0.4 |
| database | 0.25 |
| other | 0.15 |
6. Score & tier
ratio = total_kg / size_band_benchmark score = clamp(round(1000 × (1 − ratio)), 0, 1000) Gold 800–1000 (≤ 20% of benchmark) Silver 600–799 (20–40% of benchmark) Bronze 400–599 (40–60% of benchmark) Tracked 0–399 (> 60% of benchmark)
Score is a ratio against a CCF reference deployment at the vendor's size band — not a percentile rank. Each band's benchmark is a deterministic deployment (vCPU + storage + egress mix) run through the same methodology described here. The registry profile says "your emissions are X% of the size-band reference," not "you beat X% of vendors." Once the registry has ≥50 published vendors per band, this benchmark becomes a fallback and a true percentile fromregistry_snapshots takes over.
| Size band | Reference deployment | kg/mo |
|---|---|---|
| indie | 1 vCPU + 50 GB + 10 GB egress | 45 |
| startup | 8 vCPU + 1 TB + 250 GB egress | 180 |
| scaleup | 50 vCPU + 10 TB + 2 TB egress | 1100 |
| enterprise | 300 vCPU + 100 TB + 20 TB egress | 6500 |
6a. Market-based Scope 2 (dual-reporting)
The GHG Protocol's Scope 2 standard requires dual reporting: a location-based number (what was physically emitted on the grid the data centre draws from) and a market-based number (after applying the contractual REC/PPA/CFE claims the cloud provider has made). CSRD and the SEC climate-disclosure rules both expect both numbers. Every Verdex score document therefore carries:
scope_2_kg ← location-based (physical grid mix)
scope_2_market_kg ← location_kg × market_factor.factor
scope_2_market_basis: {
basis: "provider_100pct_match" | "provider_partial_cfe"
| "inherited" | "no_claim" | "self_declared_ppa",
factor: 0.0–1.0,
source: <citation URL>,
year: <year of disclosure>,
note: <caveat>
}The headline total_kg always uses the location-based number — that is the auditable physical footprint. The market number is reported alongside so a buyer can see how much of a "clean" claim depends on REC accounting vs. actually-clean grids.
Provider claims (2024 / 2023)
| Provider | Claim | Source |
|---|---|---|
| AWS | 100% renewable matched (annual, global) | Amazon 2024 |
| Azure | 100% renewable matched (annual, global) | Microsoft 2024 |
| GCP | Per-region hourly CFE % (9% – 97% by region, 2023) | Google 2023 |
| Cloudflare | 100% renewable matched (annual, global) | Cloudflare |
Honest caveat. An annual 100% REC match does not mean the data centre is running on 100% renewable power at any given hour — it means the provider purchased a matching quantity of renewable energy certificates over the year. Only GCP currently publishes hourly carbon-free-energy data per region. The GHG Protocol's 2026 Scope 2 consultation is moving toward hourly matching as a 2027 requirement for market-based claims; vendors will then need to disclose at the hourly grain.
7. Confidence intervals
v3 reports a +/-% confidence interval alongside the headline number. Every score document carries aconfidence_interval_pct field picked from the table below based on how the underlying data was obtained. CSRD reporting requires uncertainty disclosure; the interval is shown as 45.4 kg ± 15%on the registry profile.
| Data source | Interval | Example |
|---|---|---|
| provider_api_granular | ±10% | AWS Carbon Footprint Tool, GCP CFP, Azure Carbon Optimization |
| provider_api_aggregate | ±20% | AWS Cost Explorer per-service spend; provider APIs without per-resource attribution |
| spend_to_kg_fallback | ±35% | AWS Cost Explorer with >40% uncategorized spend |
| self_reported_no_api | ±50% | Cloudflare (no usage API), manual CSV entry |
The legacy accuracy_level enum (high / medium / low / self-reported) is still emitted on every score document for back-compat with old consumers.
8. Per-scope provenance
Each score document includes adata_sources_by_scope field recording exactly which method produced each GHG scope. Auditors should not need to guess which input fed which output:
data_sources_by_scope: {
scope_2_location: [
{ provider: "aws", source: "cost_explorer",
method: "spend_to_kg_per_category",
hash_of_response: "sha256:..." }
],
scope_3_embodied: [
{ provider: "imasons_meta_lca", source: "embodied_kg_per_instance_hour",
method: "absolute_per_unit" }
],
scope_3_transport: [ ... ]
}9. What this methodology does not include
For honesty with vendors and auditors, the following are explicitlyout of scope for the current methodology version:
- Scope 1 — direct emissions from owned vehicles or fuel combustion.
- Scope 3 categories other than Cat 11 (purchased goods, business travel, etc.).
- Third-party auditor signature on the calculation. Verdex signs the proof JSON itself; an external attestation is on the roadmap and not present today.
- The full calculation breakdown lives in the signed proof JSON. Verification is off-chain — via the certificate's Ed25519 signature and its Certificate Key.
- Renewable Energy Certificates (RECs) or market-based Scope 2 — Verdex uses location-based grid intensity only. Market-based Scope 2 is planned (Pass 3 of the methodology roadmap) alongside hourly grid matching.
- Hourly grid intensity matching — v3 still uses long-run regional averages; weighted hourly intensity × hourly usage is planned (Pass 2) ahead of the GHG Protocol's pending 2027 standard.
10. Reproducing a vendor's score
Each vendor's public profile exposes a signedproof.json containing the full per-service breakdown, themethodology_version, and a SHA-256 fingerprint of each upstream API response we used. To reproduce: fetch the proof, look up the constants on this page for the named version, multiply the usage by the cited factors, and verify your sum matches the proof's total.
Equivalences shown elsewhere in the product
"X kg CO₂e equals Y km driven" uses 158 g/km, the European Environment Agency 2022 fleet average. Tree- and flight-equivalents (when shown) use World Bank and ICAO public factors and are noted inline.