Flexible Savings Plans (FSPs) are a type of spend-based committed use discount (CUD) that help you save money on your usage on Google Cloud. With an FSP, you commit to a minimum spend amount on a collection of eligible products for a monthly entitlement window, for the duration of the subscription term (1 year or 3 years). In exchange for your commitment, you receive a discounted price on the covered usage.
FSPs introduce two new features to the Spend-Based CUDs:
- Subscriptions as part of the covered SKUs.
- Monthly entitlement windows
Unlike standard spend-based committed use discounts (CUDs) that use an hourly entitlement window, FSPs use a monthly entitlement window. This makes them ideal for workloads with spiky or unpredictable usage patterns.
Find eligible SKUs
Your Gemini Enterprise FSP applies to Google Cloud generative AI models and product offerings. To see the complete list of SKUs in scope, see the Gemini Enterprise Flexible Savings Plan Eligible SKUs page.
How Flexible Savings Plans work
When you purchase a Flexible Savings Plan, you commit to a specific monthly spend amount for a 1-year or 3-year term. The system monitors your usage and applies the applicable consumption model rates.
Important: You cannot cancel the commitments you have purchased. You must pay the agreed-upon monthly amount for the duration of the commitment. Your commitment and the resources covered by it aren't affected by future changes to the standard prices for those resources. If you accidentally purchased a commitment or made a mistake configuring your commitment, contact Cloud Billing support for help.
You are billed a monthly fee for the commitments you purchase (also known as postpay). This fee is billed monthly, in-arrears. If your eligible usage in a given month is less than your commitment, you are charged the full monthly commitment fee (the cost for the unused commitment) at the end of the month.
Scope and pricing
The following rules apply to FSP scope and pricing:
- Subscription term limit: Subscriptions with a term greater than one month cannot be discounted by an FSP. For example, if you have a 1-year subscription to a product, the FSP discount doesn't apply to it.
- Pricing limits: Subscription products that aren't eligible for FSP discounts are billed using the standard pricing, as viewable in your pricing report. FSPs don't increase the price of any product beyond its standard list price.
Entitlement windows
The entitlement window is the recurring period over which your usage is measured against your commitment amount. If you don't use your entire commitment amount within the entitlement window, the remaining amount is lost.
FSPs support a monthly entitlement window. This means you have a full month to consume your committed spend. However, the billing system evaluates your usage and applies the FSP discounts on an hourly basis.
For example, if you have a $100 monthly commitment, the system checks your usage every hour. If you have eligible usage in hour 1, the discount is applied and counts toward your $100 commitment. This continues throughout the month until you reach your $100 limit or the month ends. If you exceed $100 of usage before the end of the month, subsequent usage is charged at the default consumption model rate.
Overutilized commitments (exceeding your commitment)
If your eligible usage in a given month exceeds the monthly amount you committed to, the FSP covers usage up to your limit, and the remainder is billed at the standard on-demand rate.
- Mechanism: The system applies the FSP discounted rate to the usage equal to your monthly commitment amount.
- Cost: Any usage beyond that limit in the month is charged at the standard on-demand price (the "Default" consumption model). You don't receive any discount on the overage.
Underutilized commitments (not meeting your commitment)
If your eligible usage in a given month is less than your committed amount, you are still responsible for the full cost of the commitment.
- No rollover: Unused commitment does NOT carry over to the next month.
- Cost: You pay for the full monthly commitment amount you purchased. You are charged a commitment fee for the unused portion of the commitment at the end of the month.
How discounts are applied
Within an FSP's scope, discounts are applied in the following order:
- Usage time: Costs in an earlier usage hour are applied first.
- Discount level: Usage with the steepest discount within a given usage hour is applied next.
- Proportional application: Finally, the discount is applied proportionally to all costs within the same discount level and usage hour.
If you have a subscription that is covered by an FSP, the subscription benefits apply to your usage first. Your subscription cost counts toward meeting your FSP spend commitment, but the FSP doesn't apply an additional discount to the subscription price.
Start times and proration
When you purchase an FSP, it starts at the start of the next hour. If you purchase a monthly FSP mid-month, you receive a prorated amount of entitlement for the first month and the last month of your term. All other entitlement periods align with calendar months.
Cancellations, migrations, and corrections
After purchase, you cannot cancel or modify an FSP. You must pay the agreed-upon monthly amount for the duration of the commitment. If you accidentally purchased a commitment or made a mistake configuring your commitment, contact Cloud Billing support for help.
Attribution of discounts and fees
FSPs use proportional attribution, which is the same attribution model used for other spend-based committed use discounts (CUDs). Costs are attributed every hour. Fees are applied to the projects in your Cloud Billing account in proportion to the amount of total eligible usage consumed by each project. For details, see Attribution of committed use discount fees and credits.
Purchase a Flexible Savings Plan
You can purchase FSPs directly using the Google Cloud console (self-service) or by using the Cloud Commerce Consumer Procurement API.
To purchase a Flexible Savings Plan, you need the offer ID associated with the commitment term. To find offer IDs, see Identify the Offer you want to purchase.
When configuring your FSP, you specify:
- The subscription term (1 year or 3 years).
- The commitment amount per monthly entitlement window.
- A name for your FSP. This name must be unique across all your FSPs and committed use discounts (CUDs).
View your Flexible Savings Plans
You can view your active and historical Flexible Savings Plans on the Committed use discounts (CUDs) page in the Google Cloud console.
The page provides two levels of detail (Aggregated view and Instance view) to help you manage your commitments. For more information about these views, see View your commitments.
From the Instance view, you can see the breakdown of entitlement windows.
Monitor and analyze your Flexible Savings Plans
You can monitor and manage your FSPs using standard Cloud Billing FinOps tools:
- Cost reports: View your FSP commitment fees and on-demand costs. You can isolate costs for fees and usage covered by your FSPs.
- Cost table report: Reconcile your invoice by viewing the detailed breakdown of your FSP charges.
- Cloud Billing export to BigQuery: Export your billing data to BigQuery to programmatically track your active FSPs, historical performance, and utilization metrics (you can use sample queries to analyze this data).
Sample queries
Use the following sample queries to analyze your Flexible Savings Plans (FSPs) by using your Cloud Billing export to BigQuery data.
Calculate commitment savings
Commitment savings describes the net savings that resulted from your commitments.
Calculate savings in dollars
Use the following queries to calculate your savings in dollars.
Current month actively accruing usage charges (open window)
Open window refers to the billing period month that is actively accruing usage charges.
Use this query to calculate savings for the current billing period month with usage charges that are still accruing.
WITH cost_data AS ( SELECT * FROM `PROJECT.DATASET.gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID` WHERE DATE(TIMESTAMP_TRUNC(usage_start_time, DAY, 'US/Pacific')) BETWEEN 'START_DATE' AND 'END_DATE' ), flexible_saving_plan_cost_data AS ( SELECT *, COALESCE( NULLIF(consumption_model.applied_subscription_instance_id, ''), subscription.instance_id) AS cud_subscription_instance_id FROM cost_data WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ) SELECT cud_subscription_instance_id, consumption_model.id AS consumption_model_id, SUM(cost_at_effective_price_default) - SUM(cost) AS commitment_savings FROM flexible_saving_plan_cost_data GROUP BY ALL;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.BILLING_ACCOUNT_ID: Your Cloud Billing Account API ID.START_DATE: The start date for the query range inYYYY-MM-DDformat.END_DATE: The end date for the query range inYYYY-MM-DDformat.
Completed months after the monthly billing period is closed (closed window)
A completed month (closed window) implies that the billing period is closed and no longer actively accruing charges, and all of the usage costs have been processed by the billing system, with finalized costs and savings included on any invoices issued for the billing period month.
Use this query to calculate savings for completed billing period months.
WITH cost_data AS ( SELECT * FROM `PROJECT.DATASET.gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID` WHERE DATE(TIMESTAMP_TRUNC(usage_start_time, DAY, 'US/Pacific')) BETWEEN 'START_DATE' AND 'END_DATE' ), flexible_saving_plan_cost_data AS ( SELECT COALESCE( NULLIF(consumption_model.applied_subscription_instance_id, ''), subscription.instance_id) AS cud_subscription_instance_id, consumption_model.id AS consumption_model_id, cost_at_effective_price_default, cost, ( SELECT SUM(credit.amount) FROM UNNEST(credits) credit WHERE credit.type = 'FEE_UTILIZATION_OFFSET' ) AS row_fee_utilization_offset FROM cost_data WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ) SELECT cud_subscription_instance_id, consumption_model_id, SUM(cost_at_effective_price_default) - (SUM(cost) + IFNULL(SUM(row_fee_utilization_offset), 0)) AS commitment_savings FROM flexible_saving_plan_cost_data GROUP BY ALL;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.BILLING_ACCOUNT_ID: Your Cloud Billing Account API ID.START_DATE: The start date for the query range inYYYY-MM-DDformat.END_DATE: The end date for the query range inYYYY-MM-DDformat.
Calculate savings as a percentage
Use the following queries to calculate your savings percentage.
Current month (open window)
Use this query to calculate the savings percentage for the current month.
WITH cost_data AS ( SELECT * FROM `PROJECT.DATASET.gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID` WHERE DATE(TIMESTAMP_TRUNC(usage_start_time, DAY, 'US/Pacific')) BETWEEN 'START_DATE' AND 'END_DATE' ), flexible_saving_plan_cost_data AS ( SELECT *, COALESCE( NULLIF(consumption_model.applied_subscription_instance_id, ''), subscription.instance_id) AS cud_subscription_instance_id FROM cost_data WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ) SELECT cud_subscription_instance_id, consumption_model.id AS consumption_model_id, SAFE_DIVIDE( (SUM(cost_at_effective_price_default) - SUM(cost)), SUM(cost_at_effective_price_default)) AS commitment_savings FROM flexible_saving_plan_cost_data GROUP BY ALL;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.BILLING_ACCOUNT_ID: Your Cloud Billing Account API ID.START_DATE: The start date for the query range inYYYY-MM-DDformat.END_DATE: The end date for the query range inYYYY-MM-DDformat.
Completed months (closed window)
Use this query to calculate the savings percentage for completed billing period months.
WITH cost_data AS ( SELECT * FROM `PROJECT.DATASET.gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID` WHERE DATE(TIMESTAMP_TRUNC(usage_start_time, DAY, 'US/Pacific')) BETWEEN 'START_DATE' AND 'END_DATE' ), flexible_saving_plan_cost_data AS ( SELECT COALESCE( NULLIF(consumption_model.applied_subscription_instance_id, ''), subscription.instance_id) AS cud_subscription_instance_id, consumption_model.id AS consumption_model_id, cost_at_effective_price_default, cost, ( SELECT SUM(credit.amount) FROM UNNEST(credits) credit WHERE credit.type = 'FEE_UTILIZATION_OFFSET' ) AS row_fee_utilization_offset FROM cost_data WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ) SELECT cud_subscription_instance_id, consumption_model_id, SAFE_DIVIDE( (SUM(cost_at_effective_price_default) - (SUM(cost) + IFNULL(SUM(row_fee_utilization_offset), 0))), SUM(cost_at_effective_price_default)) AS commitment_savings FROM flexible_saving_plan_cost_data GROUP BY ALL;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.BILLING_ACCOUNT_ID: Your Cloud Billing Account API ID.START_DATE: The start date for the query range inYYYY-MM-DDformat.END_DATE: The end date for the query range inYYYY-MM-DDformat.
Calculate commitment utilization
Commitment utilization measures how effectively you use your commitments.
Current month (open window)
Use this query to calculate utilization for the current month.
WITH cost_data AS ( SELECT * FROM `PROJECT.DATASET.gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID` WHERE usage_start_time BETWEEN 'START_DATE_TIME' AND 'END_DATE_TIME' ), flexible_saving_plan_cost_data AS ( SELECT *, IF(sku.description NOT LIKE '%Flexible Savings Plan%', TRUE, FALSE) AS is_cud_usage_sku, COALESCE( NULLIF(consumption_model.applied_subscription_instance_id, ''), subscription.instance_id) AS cud_subscription_instance_id FROM cost_data WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ), cud_subscriptions AS ( SELECT subscription.instance_id AS cud_subscription_instance_id, subscription.display_name AS subscription_display_name, subscription.entitlement_period AS subscription_entitlement_period, term AS subscription_term, consumption_model.id AS consumption_model_id, commitment_amount.value AS commitment_amount, FROM `PROJECT.DATASET.cud_subscriptions_export` WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ), cud_usage AS ( SELECT COALESCE( fsp_cost.cud_subscription_instance_id, fsp_subs.cud_subscription_instance_id) AS cud_subscription_instance_id, COALESCE(fsp_cost.consumption_model_id, fsp_subs.consumption_model_id) AS consumption_model_id, IF(fsp_cost.is_cud_usage_sku, fsp_cost.cost, 0) AS cud_usage_cost, fsp_subs.subscription_display_name AS subscription_display_name, fsp_subs.subscription_entitlement_period AS subscription_entitlement_period, fsp_subs.subscription_term AS subscription_term, SAFE_DIVIDE( fsp_subs.commitment_amount, NULLIF(fsp_cost.currency_conversion_rate, 1)) AS commitment_amount, FROM flexible_saving_plan_cost_data AS fsp_cost FULL JOIN cud_subscriptions AS fsp_subs USING (cud_subscription_instance_id, consumption_model_id) ) SELECT cud_subscription_instance_id, consumption_model_id, subscription_display_name, subscription_entitlement_period, subscription_term, SAFE_DIVIDE(SUM(cud_usage_cost), commitment_amount) AS commitment_utilization_rate FROM cud_usage GROUP BY ALL;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.BILLING_ACCOUNT_ID: Your Cloud Billing Account API ID.START_DATE_TIME: The start date and time for the query range inYYYY-MM-DD HH:MM:SSformat.END_DATE_TIME: The end date and time for the query range inYYYY-MM-DD HH:MM:SSformat.
Completed months after the monthly billing period is closed (closed window)
Use this query to calculate utilization for completed billing period months.
WITH cost_data AS ( SELECT * FROM `PROJECT.DATASET.gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID` WHERE usage_start_time BETWEEN 'START_DATE_TIME' AND 'END_DATE_TIME' ), flexible_saving_plan_cost_data AS ( SELECT COALESCE( NULLIF(consumption_model.applied_subscription_instance_id, ''), subscription.instance_id) AS cud_subscription_instance_id, consumption_model.id AS consumption_model_id, currency_conversion_rate, ( SELECT SUM(credit.amount) FROM UNNEST(credits) credit WHERE credit.type = 'FEE_UTILIZATION_OFFSET' ) AS row_fee_utilization_offset FROM cost_data WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ), cud_subscriptions AS ( SELECT subscription.instance_id AS cud_subscription_instance_id, subscription.display_name AS subscription_display_name, subscription.entitlement_period AS subscription_entitlement_period, term AS subscription_term, consumption_model.id AS consumption_model_id, commitment_amount.value AS commitment_amount, FROM `PROJECT.DATASET.cud_subscriptions_export` WHERE consumption_model.id IN ('BBB5-D209-3835', 'C109-C9C0-A044') ), cud_usage AS ( SELECT COALESCE( fsp_cost.cud_subscription_instance_id, fsp_subs.cud_subscription_instance_id) AS cud_subscription_instance_id, COALESCE(fsp_cost.consumption_model_id, fsp_subs.consumption_model_id) AS consumption_model_id, fsp_cost.row_fee_utilization_offset, fsp_subs.subscription_display_name AS subscription_display_name, fsp_subs.subscription_entitlement_period AS subscription_entitlement_period, fsp_subs.subscription_term AS subscription_term, SAFE_DIVIDE( fsp_subs.commitment_amount, NULLIF(fsp_cost.currency_conversion_rate, 1)) AS commitment_amount, FROM flexible_saving_plan_cost_data AS fsp_cost FULL JOIN cud_subscriptions AS fsp_subs USING (cud_subscription_instance_id, consumption_model_id) ) SELECT cud_subscription_instance_id, consumption_model_id, subscription_display_name, subscription_entitlement_period, subscription_term, SAFE_DIVIDE(IFNULL(SUM(row_fee_utilization_offset), 0), commitment_amount) AS commitment_utilization_rate FROM cud_usage GROUP BY ALL;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.BILLING_ACCOUNT_ID: Your Cloud Billing Account API ID.START_DATE_TIME: The start date and time for the query range inYYYY-MM-DD HH:MM:SSformat.END_DATE_TIME: The end date and time for the query range inYYYY-MM-DD HH:MM:SSformat.
Size your purchase amount
Use these queries to help determine the optimal FSP commitment size based on historical uncovered usage.
Step 1: Find eligible SKUs and discount rates
This query retrieves eligible SKUs for FSP and their associated discount rates from the cloud pricing export.
WITH PricingExport AS ( SELECT sku.id AS sku_id, sku.description AS sku_description, REPLACE( cmp.consumption_model, 'consumptionModels/', '') AS consumption_model_id, cmp.consumption_model_display_name, cmp.list_price.tiered_rates[SAFE_OFFSET(0)].usd_amount AS internal_list_price, cmp.billing_account_price.tiered_rates[SAFE_OFFSET(0)].usd_amount AS consumption_model_discounted_price FROM `PROJECT.DATASET.cloud_pricing_export`, UNNEST(consumption_model_prices) AS cmp WHERE DATE(_PARTITIONTIME) = 'PARTITION_DATE' ), PricingWithOnDemandPrices AS ( SELECT *, MAX( CASE WHEN consumption_model_display_name = 'Default' THEN internal_list_price END) OVER (PARTITION BY sku_id) AS on_demand_list_price FROM PricingExport ) SELECT sku_id, sku_description, consumption_model_id, consumption_model_display_name, on_demand_list_price, consumption_model_discounted_price, SAFE_DIVIDE( (on_demand_list_price - consumption_model_discounted_price), NULLIF(on_demand_list_price, 0)) * 100 AS discount_rate FROM PricingWithOnDemandPrices WHERE consumption_model_display_name != 'Default' ORDER BY consumption_model_display_name, sku_id;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.PARTITION_DATE: The partition date of the cloud pricing export table to query.
Step 2: Apply discount rates to historical uncovered usage
Use this query to apply the discount rates found in Step 1 to your historical uncovered usage to estimate potential FSP costs.
WITH cost_data AS ( SELECT * FROM `PROJECT.DATASET.gcp_billing_export_resource_v1_BILLING_ACCOUNT_ID` WHERE usage_start_time BETWEEN 'START_DATE_TIME' AND 'END_DATE_TIME' ), flexible_saving_plan_uncovered_cost AS ( SELECT * FROM cost_data WHERE consumption_model.description = 'Default' AND sku.id IN (SKU_LIST) ) SELECT DATE(usage_start_time) AS usage_date, invoice.month AS invoice_month, SUM(cost) AS uncovered_cost, SUM(cost) * DISCOUNT_RATE AS potential_flexible_saving_plan_cost FROM flexible_saving_plan_uncovered_cost GROUP BY ALL;
Replace the following:
PROJECT: The ID of the Google Cloud project that contains your Cloud Billing export dataset.DATASET: The name of the BigQuery dataset containing your Cloud Billing export table.BILLING_ACCOUNT_ID: Your Cloud Billing Account API ID.START_DATE_TIME: The start date and time for the query range inYYYY-MM-DD HH:MM:SSformat.END_DATE_TIME: The end date and time for the query range inYYYY-MM-DD HH:MM:SSformat.SKU_LIST: A comma-separated list of SKU IDs identified in Step 1.DISCOUNT_RATE: The discount rate for each SKU identified in Step 1.