Google Cloud FinOps: A Complete Guide to Committed Use Discounts

Committed Use Discounts (CUDs) can reduce GCP compute costs by 37-70% for predictable workloads. This guide covers resource-based and spend-based CUDs, analyzing your workload for CUD eligibility, purchasing strategy, and tracking CUD utilization in BigQuery billing exports.

Most organizations look at their GCP bill and see a large number next to Compute Engine, GKE, or Cloud SQL. What they don't always see clearly is how much of that number is on-demand pricing premium — the surcharge for not making a capacity commitment.

Committed Use Discounts (CUDs) let you pay less per unit of compute in exchange for a 1-year or 3-year commitment. The discount is significant: 37% on 1-year commitments, 57% on 3-year commitments for most Compute Engine machine types. For a GKE cluster with predictable baseline load, a 3-year CUD can reduce the majority of your compute spend by more than half.

This guide covers the mechanics of GCP CUDs, how to analyze your workload to determine the right CUD amount, purchasing strategy, and how to monitor CUD utilization after purchase.

CUD Types: Resource-Based vs Spend-Based

Resource-based CUDs commit to a specific amount of vCPU and memory in a specific region for a specific machine type family. They provide higher discounts (37-57%) and apply to Compute Engine, GKE, Cloud SQL, and Dataproc.

Spend-based CUDs commit to spend a minimum dollar amount per month across eligible services. They provide lower discounts (25-30%) but apply more broadly and to flexible usage patterns.

For most teams, resource-based CUDs for Compute Engine and GKE nodes provide the highest value when baseline utilization is predictable.

Sustained Use Discounts: Automatic CUDs for Variable Workloads

Before purchasing any CUDs, understand that GCP already gives you automatic Sustained Use Discounts (SUDs) for any resource that runs for more than 25% of a month. SUDs ramp up as usage increases:

  • 25-50% of month: 20% discount
  • 50-75% of month: 40% discount
  • 75-100% of month: 30% additional discount (totaling ~30%)

SUDs apply automatically with no commitment and no action required. For workloads that run 24/7, SUDs already give you roughly 30% off on-demand pricing.

CUDs provide additional discounts on top of what SUDs give you — but you're making a 1 or 3-year commitment.

Analyzing Your Workload for CUD Eligibility

The key question before purchasing CUDs is: how much compute do you need consistently, and how much is burst capacity?

-- BigQuery billing analysis: identify stable baseline compute usage
-- This query helps you see what your minimum compute usage has been over 90 days
WITH daily_usage AS (
  SELECT
    DATE(usage_start_time) AS usage_date,
    resource.name AS resource_name,
    SUM(usage.amount) AS units_used,
    usage.unit AS unit_type,
    service.description AS service_name
  FROM `my-project.billing.gcp_billing_export_v1_*`
  WHERE service.description IN ('Compute Engine', 'Kubernetes Engine')
    AND _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
    AND usage.unit IN ('hour', 'vCPUHour', 'GiBy.hour')
  GROUP BY 1, 2, 3, 4, 5
),
usage_stats AS (
  SELECT
    resource_name,
    service_name,
    unit_type,
    AVG(units_used) AS avg_daily_usage,
    MIN(units_used) AS min_daily_usage,
    PERCENTILE_CONT(units_used, 0.25) OVER (PARTITION BY resource_name) AS p25_usage,
    PERCENTILE_CONT(units_used, 0.75) OVER (PARTITION BY resource_name) AS p75_usage,
    MAX(units_used) AS max_daily_usage,
    COUNT(*) AS days_with_usage
  FROM daily_usage
  GROUP BY 1, 2, 3
)
SELECT
  resource_name,
  service_name,
  unit_type,
  ROUND(min_daily_usage, 2) AS min_daily,
  ROUND(p25_usage, 2) AS p25_daily,
  ROUND(avg_daily_usage, 2) AS avg_daily,
  ROUND(max_daily_usage, 2) AS max_daily,
  days_with_usage,
  -- CUD recommendation: 75th percentile of min daily usage
  ROUND(p25_usage * 0.8, 2) AS cud_recommendation  -- Conservative: 80% of p25
FROM usage_stats
ORDER BY avg_daily_usage DESC;

The minimum daily usage represents your true baseline. CUDs work best when you commit to ~70-80% of your minimum — this ensures you actually use the committed resources (avoiding waste) while the remaining 20-30% of baseline gets SUD coverage.

Purchasing Resource-Based CUDs

# Purchase a 1-year CUD for n2 vCPU in europe-west4
gcloud compute commitments create my-n2-commitment   --plan=12-month   --region=europe-west4   --resources=vcpu=80,memory=320GB   # 80 vCPU, 320GB memory
  --type=general-purpose               # n2 family

# Purchase a 3-year CUD for memory-optimized machines
gcloud compute commitments create my-m2-commitment   --plan=36-month   --region=europe-west4   --resources=vcpu=32,memory=1024GB   --type=memory-optimized

# View existing commitments and their status
gcloud compute commitments list   --region=europe-west4   --format="table(name,plan,status,endTimestamp,resources.vcpus,resources.memoryGb)"

Flexible CUDs for Cloud Run and GKE Autopilot

Flexible CUDs work differently — instead of committing to a specific machine type, you commit to a spending level. This is useful for Cloud Run and GKE Autopilot where you don't control the underlying machine type.

# Purchase a spend-based CUD for Cloud Run
gcloud billing accounts describe BILLING_ACCOUNT_ID

# Flexible CUDs are purchased through the GCP Console:
# Billing → Commitments → Purchase commitment → Cloud Run
# Choose 1-year (25% discount) or 3-year (30% discount)
# Set monthly spend commitment

Monitoring CUD Utilization

After purchasing CUDs, track utilization to ensure you're getting value:

-- CUD utilization dashboard query
SELECT
  DATE(start_time) AS date,
  credit.name AS credit_type,
  SUM(ABS(credit.amount)) AS credit_applied,
  SUM(cost) AS gross_cost
FROM `my-project.billing.gcp_billing_export_v1_*`
CROSS JOIN UNNEST(credits) AS credit
WHERE DATE(_PARTITIONTIME) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
  AND credit.name LIKE '%Committed%'
GROUP BY 1, 2
ORDER BY 1 DESC, 3 DESC;

-- CUD waste analysis: credit that went unearned
WITH commitment_data AS (
  SELECT
    DATE(start_time) AS date,
    SUM(ABS(credit.amount)) AS credits_earned
  FROM `my-project.billing.gcp_billing_export_v1_*`
  CROSS JOIN UNNEST(credits) AS credit
  WHERE credit.name LIKE '%Committed%'
    AND DATE(_PARTITIONTIME) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
  GROUP BY 1
)
SELECT
  date,
  credits_earned,
  -- If credits earned is consistently at maximum, you may need more CUDs
  -- If credits earned is consistently below your commitment, you over-committed
  LAG(credits_earned, 7) OVER (ORDER BY date) AS credits_7d_ago,
  credits_earned / LAG(credits_earned, 7) OVER (ORDER BY date) AS week_over_week_ratio
FROM commitment_data
ORDER BY date DESC;

CUD Sharing Across Projects

By default, CUD discounts apply to the project where the commitment was purchased. Enable CUD sharing to distribute discounts across all projects in your billing account:

# Enable discount sharing at the billing account level
# (Must be done through Console: Billing → Commitments → Discount Sharing)
# Or via API:
curl -X POST   -H "Authorization: Bearer $(gcloud auth print-access-token)"   -H "Content-Type: application/json"   -d '{"discountSharingEnabled": true}'   "https://cloudbilling.googleapis.com/v1/billingAccounts/BILLING_ACCOUNT_ID"

With discount sharing enabled, a CUD purchased in the production project applies to equivalent compute in development or staging projects too — maximizing utilization.

Three-Year CUD Decision Framework

Should I buy a 3-year CUD?

1. Is this workload 18+ months old?
   YES → Continue
   NO → Start with 1-year and reassess

2. Has usage been stable (±20%) for the past 6 months?
   YES → Continue
   NO → Use 1-year until usage stabilizes

3. Is the cost savings justified by the commitment risk?
   3-year savings: 57% vs 37% (1-year) = ~20 percentage points more
   For $10,000/month compute: 3-year saves ~$2,400/year more than 1-year
   If you'll use the compute: YES

4. Does the workload architecture support CUDs?
   Compute Engine, GKE (Standard), Cloud SQL: YES
   Cloud Run, GKE Autopilot: Use spend-based CUDs

5. Decision: Purchase 3-year resource CUD at 70-80% of minimum baseline usage

For visualizing CUD utilization in Looker Studio, see our Looker Studio enterprise guide. For the full GCP cost optimization picture, see our GCP cloud billing guide.