Omni FinOps

How to size an AWS Compute Savings Plan

Size a Compute Savings Plan from your steady on-demand floor so you never pay for commitment you don’t use, and why 80% of the floor is a safe start.

Mateo VargasUpdated · 4 min read
Contents
  1. Which plan to buy
  2. Clean up before you commit
  3. Find your on-demand floor
  4. Commit 80% of the floor
  5. Cross-check with AWS’s own recommendation
  6. Buy it
  7. After you buy

In short

  • A Savings Plan is a commitment in dollars per hour, for one or three years.
  • Size it from the quietest day of the last 60 days, not the average.
  • Committing 80% of that floor keeps it close to fully used, even on the quietest day.

A Savings Plan trades a commitment for a lower rate. You commit to spend a fixed number of dollars per hour on compute for one or three years, and AWS bills the usage that commitment covers at a discount. The commitment bills every hour of the term, used or not.

That last part is the whole risk. A plan sized to your average usage sits partly unused every quiet night and weekend, and you pay for the gap. A plan sized to your lowest usage is used in full every hour. This guide shows how to find that floor and turn it into a commitment.

Which plan to buy

AWS sells two kinds for EC2. As of October 2026, AWS lists:

Plan Discount, up to What it covers
Compute Savings Plan 66% EC2 in any family, size, Availability Zone, Region, OS or tenancy, plus Fargate and Lambda
EC2 Instance Savings Plan 72% One instance family in one Region

Both come in 1-year and 3-year terms, and you can pay all upfront, partially upfront or nothing upfront.

A Compute Savings Plan is the safer first purchase. It keeps covering your usage when you rightsize, move to Graviton, change Region or shift work to Fargate. An EC2 Instance Savings Plan pays more only if you are sure the family and Region won’t change for the whole term.

Clean up before you commit

A commitment locks in today’s usage. If that usage includes idle instances or oversized ones, you commit to paying for them at a discount for a year. Do the cheap work first:

Each of these lowers your floor. Measure the floor after they land, not before.

Find your on-demand floor

The floor is the lowest your on-demand compute spend went over a recent window. Sixty days of daily cost catches month-end batch jobs, holidays and quiet weekends. Cost Explorer has it. Each API call costs $0.01 per paginated request, so this runs for a few cents:

START=$(date -u -v-60d +%F 2>/dev/null || date -u -d '60 days ago' +%F)
END=$(date -u +%F)
aws ce get-cost-and-usage --region us-east-1 \
  --time-period Start=$START,End=$END --granularity DAILY --metrics UnblendedCost \
  --filter '{"Dimensions": {"Key": "SERVICE", "Values": [
      "Amazon Elastic Compute Cloud - Compute",
      "Amazon Elastic Container Service"]}}' \
  --query 'ResultsByTime[].[TimePeriod.Start,Total.UnblendedCost.Amount]' \
  --output text | sort -k2 -g | head -5

This lists the five cheapest days for EC2 compute and Fargate, which bills under Amazon Elastic Container Service. Ignore a most recent day that looks low: Cost Explorer refreshes at least every 24 hours, so the last day can still be filling in.

If Savings Plans or Reserved Instances already cover part of that compute, they have already lowered your on-demand floor. Run the same command with --group-by Type=DIMENSION,Key=PURCHASE_TYPE (and drop the --query) to see how much of each day was on demand, and use only that part.

Divide the lowest day by 24 to get the floor in dollars per hour. A lowest day of $1,200 is a floor of $50 an hour.

Commit 80% of the floor

Start with a 1-year, no-upfront Compute Savings Plan at 80% of the floor: $40 an hour in the example. Two reasons not to commit the full floor:

  • A day’s average hides its quietest hours. The lowest day averages 24 hours. Individual hours inside it dip lower.
  • A committed dollar covers more than a dollar of on-demand usage, because the usage it covers bills at the discounted rate. At a 20% discount, a commitment of 80% of the floor covers exactly the floor. At deeper discounts, it covers a little more, so the quietest hours may leave a small part unused.

If you want to be strict, commit the floor multiplied by one minus your discount rate. Either way, start small. You can buy a second plan later when the floor grows, and plans stack.

What will it save? That depends on your instance families, Regions, term and payment option. Omni FinOps plans with about 27% off on-demand for this 1-year, no-upfront case. That is a planning assumption, not an AWS-published rate: check the rates for your own usage on the Compute Savings Plans pricing page.

Cross-check with AWS’s own recommendation

Cost Explorer recommends a commitment from your usage history. Ask for the same term and payment option, over the same 60 days:

aws ce get-savings-plans-purchase-recommendation --region us-east-1 \
  --savings-plans-type COMPUTE_SP --term-in-years ONE_YEAR \
  --payment-option NO_UPFRONT --lookback-period-in-days SIXTY_DAYS \
  --query 'SavingsPlansPurchaseRecommendation.SavingsPlansPurchaseRecommendationSummary'

If the two are close, you can buy with confidence. If AWS’s number is much higher than yours, compare it with your quietest days before you commit to it.

Buy it

The simplest path is the console: Savings Plans can be bought inside Cost Explorer, which shows the hourly commitment, the term and the payment option before you confirm.

From the CLI, find the offering, then create the plan with your hourly commitment:

aws savingsplans describe-savings-plans-offerings --region us-east-1 \
  --plan-types Compute --durations 31536000 --payment-options "No Upfront" --currencies USD \
  --query 'searchResults[].[offeringId,planType,durationSeconds,paymentOption]' --output table

aws savingsplans create-savings-plan --region us-east-1 \
  --savings-plan-offering-id <offering-id> --commitment 40

A purchase is a commitment for the whole term. Check the number twice, and have whoever owns the budget approve it.

After you buy

Watch the plan’s utilization and coverage in Cost Explorer for the first few weeks. Utilization near 100% means the plan is fully used. Coverage shows how much of your compute it pays for; the rest is still on demand, and it is where the next plan comes from. Revisit the floor every quarter, after the cleanups and moves you made, and layer a new plan on top when it has grown. For the full picture of how a commitment fits next to the rest of your AWS bill, see the AWS page.

Mateo Vargas writes Omni FinOps’ cost guides, from the same rules the product runs on every refresh. Prices are list prices in us-east-1 or us-central1 as of October 11, 2026; check your region’s pricing page.

More guides