This content was provided as a Professional Contribution through the FinOps Certified Professional program.
Summary: Reduce the manual effort and missed savings associated with frequent AWS Compute Savings Plan (SP) purchases by automating coverage calculations and execution. This approach involves modeling historical usage data to determine an optimal coverage target—typically between 80% and 90%—rather than aiming for full coverage. Surface these insights in a centralized internal tool so that teams can enable streamlined, one-click purchases that maintain consistent commitment levels as cloud usage scales. Automating these renewals frees up analysts from repetitive data pulls and ensures organizations capture continuous savings without introducing complex approval bottlenecks.
Savings Plans (SPs) offer a flexible pricing model that provides savings on AWS usage. Compute Savings Plans provide lower prices on Amazon EC2 instance usage regardless of instance family, size, OS, tenancy, or AWS Region. Savings Plans provide savings beyond On-Demand rates in exchange for a commitment of using a specified amount of compute power (measured per hour) for a one or three year period. For example, purchasing $10.00 of usage per hour for 3 years.
This is an actual story from the Atlassian FinOps team, so it’s important to understand how Atlassian managed their Saving Plans prior to the automation, what led the team to the idea of automations, which data points to consider, as well as design consideration.
Historically, a central Cloud FinOps managed and drove the purchase of SPs in Atlassian. Due to the flexibility that saving plans offer, Cloud FinOps team does not require consent from Engineers or Finance prior to committing. The Cloud FinOps team had a dashboard that shows the current SP converge percentage, which is how much of the EC2 compute usage is covered by Compute Saving Plans.
The FinOps analysts run their analysis to decide on the optimum coverage level, and if needed, they purchase Saving plans whenever the coverage drops beyond the target (80%).
Atlassian has an internal FinOps tool, built in-house by the FinOps team, which will be used as a UI for the automation process.
As a prerequisite for the process of purchasing SP, we first need to calculate the optimum coverage, as well as current SP coverage, and use these as inputs to the purchase process.
We need to understand our recent usage patterns, and optimum coverage. Optimum coverage here refers to the percentage target we want to achieve in terms of how much of our that can be covered by SP, is actually covered by SPs. Below are some definitions:
This can be calculated by the following formula:
Optimum coverage %: (a/b)*100
Where:
a: The hourly amount of our SPs (the ideal amount)
b: The cost coverable by SPs
This requires looking at our usage patterns for the previous period. The previous period can vary from one company to another, however we recommend looking at the last 4 weeks of usage (assuming no holidays occurred in the last 4 weeks).
We do this by looking at the weekly usage on line items eligible for SPs for the last 4 weeks of usage. The line items eligible for the Saving Plans are presented in the sample query below. This query will be valid on CUR line items (with basic update to field names, but should be easy mapping). It’s worth mentioning you should exclude any Spot usage from this, as Spot usage is not eligible for Saving Plan purchases.
– Getting hourly usage coverable by SP for a specific month –
SELECT
CAST(lineitem_usagestartdate AS string) AS lineitem_usagestartdate,
lineitem_usageamount,
unblendedcost_withoutri,
month
FROM
CUR
WHERE
month = '{MONTH}'
AND lineitemtype in ('SavingsPlanCoveredUsage', 'Usage')
AND (
-- Lambda
(
lineitem_productcode = 'AWSLambda'
and productfamily = 'Serverless'
) -- EC2
OR (
lineitem_productcode = 'AmazonEC2'
and productfamily in (
'Compute Instance',
'Compute Instance (bare metal)',
'Dedicated Host'
)
) -- ECS
OR (
lineitem_productcode = 'AmazonECS'
and productfamily = 'Compute'
)
OR (
lineitem_productcode = 'AmazonEKS'
and productfamily = 'Compute'
)
)
AND lineitem_description not like '%Spot%'
The above query will get the hourly usage amount for each hour. However, it will not show 0 usage for hours where there was no usage – because we queried the usage table to get this data, so we need the missing piece of the puzzle- which you still need to analyze to understand vacancy in the SPs. Therefore the above query should be a cartesian join with another query that’s getting numbers of hours (in the same format as CUR timestamp) for the same weeks, so that the final outcome shows total number of hours in the 4 weeks, with 0 usage for hours that had no usage.
Afterwards, you apply a percentile to that hourly usage (for example 10th percentile), and this will show you the usage hour value where 90% of the usage occurs above this value i.e if the query shows you $400, that means for 90% of the hours, you have usage above $400, so it’s safe to assume you can purchase $400/hour of SPs commitments
You can verify this outcome by looking at a sample of a week from the dataset where you multiplied it by the cartesian join to get full 24 hours a day, and look at individual rows, 90% of the hours, the usage should be $400/hour or more.
Another important factor to need to consider in the process is the current SPs commitments, and how much it’s covering from the coverable usage, which is the SP coverage.
To get this number, we look at the current purchased SPs that have not expired:
This can be calculated by the following formula:
SP coverage %: (a/b)*100
Where:
a: Current active SP commitments
b: The cost coverable by SPs
--How to get current hourly SP commitments –
SELECT SUM(lineitem_unblendedcost)/count(DISTINCT lineitem_usagestartdate) as hourly_sp_cost
FROM CUR
WHERE month= '{MONTH}'
AND lineitemtype='SavingsPlanRecurringFee'
In the FinOps Portal, there will be a section for savings plans. It will include stats and a list of current savings plans. The stats will cover the current EC2 hourly commitment and the percentage currently covered by saving plans. The current list of saving plans will be ordered by expiring soon, with those closest to needing a renewal at the top. If a savings plan is three weeks or less till renewal, they will carry a warning.

We have two primary actions in the savings plan section of the FinOps Portal. Renew savings plan or purchase savings plan. AWS offers a list of offerings for Compute Savings Plans (i.e. 1 Year/3 Years. Also, partial upfront, no upfront, full upfront). We only consider one purchase option. We should add an extra confirmation step whenever a purchase or renewal button is put through. This could be an additional modal or an extra tick box to confirm selection. We need to allow for commitment to be edited if required for renewals.
For purchasing, the portal should suggest the amount to be purchased if we are not hitting the target%. If we are a lower %, the purchase modal should suggest what hourly commitment is required to make that happen.
Upon completion of any purchase or renewal, the FinOps Slack bot can post a confirmation post tagging the analysts in the FinOps slack channel.
When our current hourly commitment drops below target %, the FinOps Slack bot should notify the analyst in our Slack channel. We can use a link to the portal in the notification message for easy access.
We have a tool that the Cloud FinOps team can use anytime to see the current hourly SP commitments, current coverage %, target, and if there’s any SPs expiring next month, and any SPs scheduled for purchase.
The tool also includes notifications on Slack to the team members in case the coverage dropped below the target, or if there’s any SPs that will need to be renewed. Below is a screenshot of the actual tool, with dummy data for confidentiality purpose