Cost Analytics
Cost Analytics connects to Cloud Cost Explorer to give you a complete picture of your cloud spend — broken down by service, region, account, and resource tag — alongside actionable recommendations for reducing waste. Instead of switching between the cloud Console, spreadsheets, and third-party FinOps tools, everything you need to understand and optimise your cloud bill is available directly in Calabi.
Key Capabilities
| Capability | Description |
|---|---|
| Spend breakdown | Filter and group costs by service, region, account, linked account, or tag |
| Month-over-month trends | Line and bar charts comparing current vs. prior periods |
| Rightsizing recommendations | Identify underutilised EC2, idle RDS, and oversized EBS |
| Cost anomaly detection | Alerts when daily spend exceeds expected patterns |
| Savings Plans coverage | See what fraction of your compute is covered by Savings Plans |
| Reserved Instance coverage | Identify on-demand usage that could be replaced by RIs |
| Tag coverage report | Surface untagged resources driving unattributed spend |
Spend Breakdown
The Spend Breakdown view is the primary cost exploration interface. It renders a stacked bar chart for the selected time range and a detailed table beneath it.
Grouping dimensions
| Dimension | Example use case |
|---|---|
| Service | How much is EC2 vs. S3 vs. RDS this month? |
| Region | Which regions are driving the most spend? |
| Linked account | How does spend compare across AWS Organization member accounts? |
| Usage type | Break EC2 cost into compute, data transfer, and EBS components |
| Resource tag | Attribute costs to teams, projects, or environments via tags |
Time range presets
| Preset | Description |
|---|---|
| This month | Month-to-date (MTD) |
| Last month | Full previous calendar month |
| Last 3 months | Rolling 90-day view |
| Last 6 months | Rolling 180-day view |
| Last 12 months | Full year view |
| Custom | Arbitrary start and end date |
Cloud Cost Explorer data has a 24-hour lag. Charges incurred today will appear in Calabi the following day.
Month-over-Month Trends
The Trends tab shows your total cloud spend as a line chart across the last 12 months, with the current month shown as a partial bar. Key trend indicators:
- MoM change (%) — percentage change vs. the prior month
- 3-month moving average — smoothed trend line to filter month-end noise
- Projected month-end — linear projection of the current month's final cost based on daily spend rate
You can overlay a second dimension (e.g., EC2 + RDS) to compare two cost lines on the same chart.
Rightsizing Recommendations
Calabi analyses CloudWatch utilisation metrics alongside Cost Explorer data to surface rightsizing opportunities. Recommendations are grouped by resource type.
EC2 rightsizing
| Finding type | Trigger condition | Potential saving |
|---|---|---|
| Underutilised instance | Average CPU < 5% and network < 5 MB/day for 14 days | Switch to a smaller instance type |
| Idle instance | Average CPU < 1% for 14 days | Stop or terminate the instance |
| Oversized memory | Memory utilisation < 10% for 14 days (requires CloudWatch agent) | Move to a memory-optimised tier |
Each recommendation includes:
- Current instance type and monthly cost
- Recommended instance type and monthly cost
- Estimated monthly saving
- Last 14 days of CPU and network utilisation charts
- A direct link to resize the instance in the cloud Console
RDS rightsizing
| Finding type | Trigger condition |
|---|---|
| Idle cluster | Zero connections for 7 days |
| Oversized instance | Average CPU < 5%, FreeableMemory > 80% for 14 days |
| Single-AZ in production | Non-dev instance with multi_az = false |
EBS optimisation
| Finding type | Trigger condition |
|---|---|
| Unattached volume | state = available for more than 14 days |
| gp2 to gp3 upgrade | Any gp2 volume (gp3 is cheaper and faster by default) |
| Oversized provisioned IOPS | Provisioned IOPS utilisation < 20% for 14 days |
Cost Anomaly Detection
Calabi applies a statistical model to your daily spend time series and alerts you when actual spend deviates significantly from the expected range.
How it works
- Calabi trains on 90 days of historical daily spend per service and account.
- For each new day, it computes an expected spend range (lower and upper bound).
- If the actual daily spend exceeds the upper bound by more than the configured threshold, an anomaly is raised.
- Anomaly alerts are delivered to your configured notification channels (Slack, PagerDuty, email).
Anomaly alert example
[ANOMALY] EC2 spend spike detected
Account: 123456789012 (production)
Service: Amazon EC2
Date: 2026-04-07
Expected: $1,200 – $1,450
Actual: $3,820
Deviation: +163%
Top driver: us-east-1 — 47 new p3.2xlarge instances launched at 14:23 UTC
Savings Plans and Reserved Instance Coverage
Savings Plans coverage
The coverage chart shows what fraction of your EC2, Fargate, and Lambda compute is covered by a Savings Plan commitment vs. on-demand pricing. The uncovered (on-demand) portion is highlighted in orange — these are the hours where a Savings Plan would reduce costs.
| Metric | Description |
|---|---|
| Coverage % | Percentage of eligible compute hours covered by a Savings Plan |
| On-demand cost (uncovered) | Monthly cost of the uncovered compute hours |
| Recommended commitment | Daily Savings Plans commitment that would achieve 80% coverage |
| Estimated annual saving | Projected savings at the recommended commitment level |
Reserved Instance coverage
| Metric | Description |
|---|---|
| RI coverage % | Percentage of RDS or ElastiCache instance hours covered by RIs |
| On-demand hours | Hours running at on-demand price that could be RI-covered |
| Recommended RI purchase | Instance type and term recommendation |
Tag Coverage Report
Untagged resources make it impossible to attribute costs to teams or projects. The Tag Coverage report shows:
- Which resources have missing or incomplete tags
- What fraction of total spend is unattributable (untagged)
- The estimated unattributable cost for the current month
You can define which tag keys are required (e.g., env, team, project) in Configure under Tag Policy.
Example SQL Queries
These queries can be run directly in Query Resources.
Total daily spend by service (last 30 days)
SELECT
service,
usage_start_date,
SUM(unblended_cost_amount) AS daily_cost_usd
FROM
aws_cost_by_service_daily
WHERE
usage_start_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY
service, usage_start_date
ORDER BY
usage_start_date DESC, daily_cost_usd DESC;
Top 10 most expensive services this month
SELECT
service,
ROUND(SUM(unblended_cost_amount)::NUMERIC, 2) AS month_to_date_cost_usd
FROM
aws_cost_by_service_daily
WHERE
usage_start_date >= DATE_TRUNC('month', CURRENT_DATE)
GROUP BY
service
ORDER BY
month_to_date_cost_usd DESC
LIMIT 10;
Month-over-month EC2 spend comparison
SELECT
DATE_TRUNC('month', usage_start_date) AS month,
ROUND(SUM(unblended_cost_amount)::NUMERIC, 2) AS ec2_cost_usd
FROM
aws_cost_by_service_daily
WHERE
service = 'Amazon EC2'
AND usage_start_date >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY
DATE_TRUNC('month', usage_start_date)
ORDER BY
month;
Spend by tag (team)
SELECT
tags ->> 'team' AS team,
ROUND(SUM(unblended_cost_amount)::NUMERIC, 2) AS monthly_cost_usd
FROM
aws_cost_by_service_daily
WHERE
usage_start_date >= DATE_TRUNC('month', CURRENT_DATE)
AND tags ->> 'team' IS NOT NULL
GROUP BY
tags ->> 'team'
ORDER BY
monthly_cost_usd DESC;
Related Pages
- Age Reports — Find stale resources contributing to unnecessary storage costs
- Security Posture — Identify misconfigured resources that may also be driving unexpected spend
- Configure — Set up tag policies and anomaly alert channels