CostLensHow CostLens Detects Waste

How CostLens Detects Waste

The criteria CostLens uses to identify wasted, underutilized, and overprovisioned resources across AWS, Azure, and GCP — the thresholds behind each recommendation, the confidence attached to it, and the safeguards that keep new or business-critical resources from being flagged.

Updated August 20269 min read

Every CostLens recommendation starts from the same question: is this resource costing you money it doesn't need to? This page explains exactly how CostLens answers that — the signals it reads, the thresholds that qualify a resource as waste, how much to trust each finding, and the safeguards that stop it from flagging things you actually need. It applies across AWS, Azure, and Google Cloud, and it's the map that ties together the individual check guides.

The three shapes of waste

CostLens looks for resources that fall into one of three buckets:

ShapeWhat it meansTypical example
WastedProvisioned and billing, but not used at allAn unattached disk, a load balancer with no traffic
UnderutilizedRunning continuously while doing very little workA VM at 3% CPU, a database with no connections
OverprovisionedSized larger than the workload needsA function with double the memory it uses, an oversized instance

The golden rule

CostLens only recommends a change when the resource is actually incurring the cost the change would remove. A stopped instance, a paused database, or a brand-new resource with no usage history is not flagged — an optimization is only real if there's real spend to recover.

How every recommendation is scored

Two dimensions accompany each recommendation so you know what to tackle first and how much to trust it.

Severity — based on the money at stake

Severity is driven purely by the estimated monthly saving, so the biggest opportunities rise to the top:

SeverityEstimated monthly savings
Critical$500 or more
High$100 – $499
Medium$20 – $99
Lowunder $20

Confidence — how strong the evidence is

ConfidenceWhat's behind it
HighDirect evidence — an unattached resource, zero traffic, or the cloud provider's own recommendation — over a complete data window.
MediumA utilization measurement with good coverage, or a tag/name-based heuristic.
LowA short observation window or a single weak signal. Shown, but de-prioritised.

You can filter the Recommendations page by both, so you can focus on, say, only High-confidence Critical findings first.

Safeguards that prevent false positives

These rules apply to every check, and they're what let you trust the list without second-guessing each item:

Lifecycle-state awareness

Stopped, deallocated, or paused resources are skipped — they aren't billing for compute, so there's nothing to recover. CostLens won't tell you to "schedule" a machine that's already off.

Minimum observation window

A resource must be old enough to judge. A weekday schedule, for example, claims a resource is idle at nights and on weekends — so CostLens waits until it has observed at least a full weekly cycle (7 days) before recommending one. A one-day-old instance is never flagged for scheduling.

Seasonal-pattern suppression

Some resources are busy only at predictable times — a payroll job that spikes monthly, a service that peaks on weekends. When CostLens detects a strongly periodic pattern, it lowers the finding's urgency rather than treating a real recurring peak as waste.

Production protection

Resources tagged or named as production are excluded from schedule and stop recommendations, so a business-critical workload is never proposed for shutdown.

Size floors

Trivially small resources (tiny buckets, small snapshots, negligible databases) are ignored — the goal is meaningful savings, not noise.

The scenarios CostLens detects

Each row links to the detailed guide for that check, where you'll find the exact mechanism, permissions, and remediation.

Idle and underutilized compute

VMs, instances, and Kubernetes node pools running around the clock while doing little work.

What we look forTypical criteriaWhat we recommend
Non-production instance running 24/7Low CPU (under ~20%) over the observed windowA weekday off-hours schedule (~70% saving)
Over-provisioned instanceSustained CPU/memory/network below the instance type's headroom (14 days)Right-size one size down — Azure · GCP
Idle virtual machineAverage CPU below 5% over 14 daysDeallocate/stop or right-size — Azure · GCP
Stopped instance still billing for storageStopped for 7+ days with attached disksSnapshot and clean up
Idle Kubernetes node poolAverage CPU below 5% over 14 daysScale to zero or remove (EKS/AKS/GKE)
Over-provisioned or well-utilized node poolCPU 5–25% → downsize · CPU above 25% → SpotRight-size or move to Spot

Overprovisioned CPU, memory, storage, and networking

Capacity allocated well above what the workload sustains.

What we look forTypical criteriaWhat we recommend
Function with excess memoryPeak memory usage below 40% of allocated (14 days)Lower the memory
Over-allocated database storageMore than 60% free (AWS), or under 40% used (Azure/GCP)Right-size storage — RDS · Azure · GCP
Over-provisioned Cosmos DB throughputConsumed RU below ~30% of provisionedLower RU/s or autoscale
Premium disk with low I/OVery low sustained IOPS on a premium tierDowngrade the tier — Azure · GCP
EBS volume still on gp2Any gp2 volume (gp3 is cheaper at equal performance)Migrate gp2 → gp3

Unattached and unused storage

Volumes, disks, and snapshots that bill monthly but aren't attached to anything.

What we look forTypical criteriaWhat we recommend
Unattached volume or managed diskIn the "available" (unattached) stateSnapshot if needed, then deleteAzure · GCP
Orphaned snapshotSource volume no longer existsDelete the orphanAzure · GCP

Unused load balancers, IP addresses, and networking

Networking resources that carry a standing charge while serving no traffic.

What we look forTypical criteriaWhat we recommend
Load balancer with no trafficZero requests over 7 days, or no healthy backendsDelete it — AWS · Azure · GCP
Unassociated IP addressNot attached to any resourceRelease it — AWS · Azure · GCP
Idle NAT gatewayNo subnet attached, or negligible throughputDelete it — AWS · Azure · GCP
Idle VPC endpointUnder ~1 GB/day of trafficRemove the endpoint

Low-utilization databases and managed services

Managed databases and caches running continuously with almost no activity.

What we look forTypical criteriaWhat we recommend
Idle databaseFewer than ~5 connections/day, or CPU under 15%, on 10+ of 14 daysStop, schedule, or downsize — RDS · Azure SQL · Cloud SQL
Idle warehouse or cacheNo queries / negligible throughputPause or downsize — Redshift · Memorystore

Orphaned resources

Resources whose parent workload no longer exists.

What we look forTypical criteriaWhat we recommend
Stranded snapshot, disk, or addressParent resource positively confirmed deletedDelete the orphan (see the storage guides above)
Recommendation for a deleted resourceThe resource was removed after the finding was raisedCostLens auto-resolves the stale recommendation on the next sync

Expired test, development, and temporary environments

Non-production resources that only need to run during working hours.

What we look forTypical criteriaWhat we recommend
Dev / test / staging resource on 24/7Tagged or named non-production, running outside business hoursA weekday off-hours schedule — EC2 · Azure VM · GCP VM

CostLens schedules — it doesn't delete environments

For dev/test resources, CostLens recommends turning them off outside business hours (a fully reversible ~70% saving), not deleting them. Automatically tearing down an "expired" environment would require an explicit expiry/TTL tag on the resource, so CostLens deliberately takes the safe, reversible action instead.

Duplicate, redundant, and oversized resources

Storage that accumulates cold data, old versions, and untagged images — plus oversized configurations.

What we look forTypical criteriaWhat we recommend
Bucket with no lifecycle/tiering policyHolding cold data above a size floorAdd a lifecycle rule — S3 · Azure · GCP
Versioned bucket keeping every old versionNo noncurrent-version cleanup ruleAdd a cleanup rule — S3 · Azure · GCP
Image registry with no retention policyUnbounded image historyAdd a retention policy — ECR · ACR · Artifact Registry

Inefficient autoscaling

Scaling groups pinned to a high fixed baseline instead of scaling with demand.

What we look forTypical criteriaWhat we recommend
Scaling group with a high static sizeLow sustained CPU across the groupLower the baseline and enable demand-based autoscaling — ASG · VMSS · MIG

Unused commitments, reservations, and savings plans

Two opposite problems: on-demand spend that should be under a commitment, and commitments that are under-used or about to lapse.

What we look forTypical criteriaWhat we recommend
Steady usage not under commitmentReserved Instance / Savings Plan coverage below 70%Consider a commitment for the stable baseline — RI coverage · SP coverage
Commitment that's under-usedUtilization below 90% (AWS) or 75% (Azure/GCP)Resize or reallocate — Azure · GCP
Reservation about to expireExpiring within 90 daysRenew before it lapses to on-demand

Commitments are always advisory

Reservations and Savings Plans commit real money for one to three years, so CostLens never buys them automatically. It shows the economics — break-even, term, expected savings — and you make the purchase decision.

What CostLens does — and doesn't — do

Being clear about the boundaries here so nothing is a surprise:

  • Savings figures are estimates for prioritisation. Cloud bills are metered at the service and region level, not per individual resource, so a per-resource saving is a list-price estimate — accurate enough to rank opportunities, and corroborated by your actual spend trends, but not a line-item invoice.
  • Utilization needs history. Several checks require a full observation window before a resource qualifies. A resource connected or created very recently may not appear as a finding until enough data exists — this is intentional, to avoid premature recommendations.
  • "Duplicate" means redundant, not identical. CostLens flags redundant storage tiers, stale versions, and oversized configurations. It does not infer that two independently-running resources are functional duplicates of each other.
  • Environments are scheduled, not reaped. As noted above, dev/test resources are recommended for off-hours scheduling, not deletion.

Acting on recommendations safely

Every recommendation is labelled by how reversible the fix is:

Action typeExamplesHow CostLens applies it
ReversibleSchedules, right-sizing, deallocate/stop, storage-tier changesCan be applied automatically with one-click rollback (see Auto-Fix)
IrreversibleDeleting volumes, snapshots, IP addressesRequires explicit typed confirmation before applying
AdvisoryCommitment purchases, capacity decisionsRecommended only — you take the action in your own tooling

You can review everything that's been applied, and roll back reversible changes within the rollback window, on the Fix History page.

CostLens
Previous
AI Action Plan
CostLens
Next
Billing & Costs