Here is the shape of a stalled programme, and it is remarkably consistent across companies. There is a cost tool, probably two. Allocation coverage is somewhere north of 85 percent. There is a monthly review with a deck. There was a big win eighteen months ago — a Savings Plan purchase, or someone found a forgotten Redshift cluster — and nothing of comparable size since. Spend grows roughly with headcount. Everyone agrees FinOps is important and nobody's sprint has a cost item in it.
The instinct at this point is to buy better visibility. It never works, because visibility was never the constraint. The constraint is that infrastructure cost is a lagging consequence of engineering decisions made weeks earlier by people who do not see the bill and would not be rewarded for acting on it if they did. A dashboard is a passive artifact in an active system. Getting past the plateau means building routing — mechanisms that put a cost consequence in front of a specific person at the moment they can still change it.
Four capabilities that distinguish a working practice
Not a maturity model with levels. Four things that either exist or do not, and you can check in an afternoon.
1. You can explain any month-over-month change within a day
Pick last month. The bill moved by some amount. Can someone decompose that delta into named causes — this service grew, that commitment expired, this region was added, that data transfer pattern changed — and attribute each to a team, within one business day?
In most organisations this takes a week and produces a partial answer. The reason is that cost data is stored as levels rather than deltas, so every investigation starts from scratch. The fix is a standing decomposition job: compare this period to the last across every allocation dimension, rank the movements by absolute magnitude, and join each to whatever changed in that namespace — deployments, replica count changes, request changes, new resources in Terraform state.
-- daily delta by service, joined against a deploy log
WITH d AS (
SELECT service, day, SUM(amortized_cost) AS cost
FROM cur_allocated
WHERE day >= CURRENT_DATE - 30
GROUP BY 1,2
)
SELECT
service,
cost AS today,
LAG(cost, 7) OVER (PARTITION BY service ORDER BY day) AS week_ago,
cost - LAG(cost, 7) OVER (PARTITION BY service ORDER BY day) AS delta
FROM d
WHERE day = CURRENT_DATE - 1
ORDER BY ABS(delta) DESC
LIMIT 25;
The output of that query, posted daily to a channel with the top five movements and a link to the relevant deploys, replaces most of what a monthly review was trying to accomplish and does it while the change is still fresh.
2. Anomalies route to an owner, not to a dashboard
Every cloud provider ships anomaly detection now and it is mostly worthless as delivered, because the alert lands in a cost console that engineers do not open. The value is entirely in the routing.
An anomaly alert should behave like any other production alert: it fires against a threshold, it resolves to a specific team via the same label taxonomy your allocation model uses, it arrives in that team's channel, and it has an owner and a resolution. Not a page — cost is not a 3 a.m. problem — but a tracked item with a name attached.
Thresholds worth setting: any service moving more than 30 percent week-over-week in absolute terms above a floor (say $200/week, so you are not alerting on rounding); any new resource type appearing in an account that has not used it before; any single resource crossing $1,000/month for the first time. That last one catches the expensive-mistake class — the accidentally-provisioned p5.48xlarge, the cross-region replication someone enabled in a console — which is where the fastest money is.
3. Forecasts are made, recorded, and scored
Almost nobody scores their forecasts, which means nobody knows if they are any good, which means finance discounts them and plans on a different number.
The discipline is small: at the start of each quarter, record a forecast per major cost centre with a stated confidence interval. At the end, compute the error. Track mean absolute percentage error over time. A mature practice runs at 5 to 8 percent MAPE on a 90-day horizon for steady-state workloads. If you are at 25 percent, the useful information is which component is driving the error — usually it is a small number of growth-stage services or a data-transfer line nobody models.
Forecast accuracy is the gate on commitment purchasing, which is the largest single lever most organisations have and the one they under-use out of uncertainty.
4. Commitment coverage is managed as a portfolio
Savings Plans and Reserved Instances are a term-structure problem, not a one-time purchase. The two numbers to run:
- Coverage: what fraction of eligible spend is covered by a commitment. Target 70 to 85 percent of your floor — the level below which usage has not dropped in the last year — not of your current spend.
- Utilisation: what fraction of your purchased commitment is actually consumed. This should sit above 98 percent. Anything lower means you bought commitment you are throwing away, which is worse than not buying.
Ladder the terms. Buying a single three-year commitment covering 85 percent of today's spend is a bet that your architecture will not change for three years, and it is a bet you will lose the next time someone finishes a migration. A ladder of one-year commitments expiring in staggered quarters, topped up with three-year commitments only on the genuinely immovable baseline, gives you most of the discount with a fraction of the lock-in. Compute-flexible Savings Plans over instance-specific RIs, in almost all cases — the extra few percent of discount on the specific type is not worth losing the ability to change instance families, particularly if you are running an autoscaler that picks shapes dynamically.
The structural problem, and the two things that fix it
Everything above is mechanism. The reason mechanisms are needed is structural: the engineer who sets a memory request does not experience the cost of that request. There is no feedback path. In every other domain we solve this with tight loops — a failing test appears in the PR, a latency regression appears in the canary — and cost is the one signal we have left running on a monthly batch cycle.
Move cost into the pull request. Infracost for the Terraform side, a diff of resource requests against current allocation for the Kubernetes side. The comment does not need to be sophisticated. "This change increases the monthly run rate by an estimated $2,100" in a PR is worth more than a quarter of dashboards, because it arrives at the one moment when changing the number costs nothing.
# .github/workflows/cost.yml
- name: Estimate infrastructure cost delta
run: |
infracost diff --path=. \
--format=json --out-file=/tmp/diff.json
infracost comment github \
--path=/tmp/diff.json \
--repo="$GITHUB_REPOSITORY" \
--pull-request="$PR_NUMBER" \
--behavior=update
Give cost an SLO-shaped target. Engineers respond to error budgets because the mechanism is legible: here is a threshold, here is your consumption, here is what happens if you exceed it. Cost budgets can work identically. A team gets a quarterly infrastructure envelope. It is not money — no transfer happens — but exceeding it requires the same kind of written justification as any other resource ask. This is the single highest-leverage organisational change available, and it costs nothing to implement beyond the will to hold the line the first time someone blows through it.
A caution on efficiency targets. Do not set a KPI on cluster utilisation percentage. It is trivially gamed by inflating usage, and it punishes the reserve capacity that keeps things reliable. Target cost per business unit instead, which cannot be gamed without either genuinely improving efficiency or genuinely growing the business. What that denominator should be is most of the work.
What to do first
If you are at the plateau and want an ordered list: build the daily delta report and route it to team channels. Add anomaly alerts with real ownership. Then start recording forecasts, so that in one quarter you have an accuracy number. Then, with that number in hand, restructure the commitment ladder. Only then look at per-workload efficiency work, which is the thing everybody wants to start with and which has the worst ratio of engineering effort to dollars saved until the routing exists to make the savings stick.
The tell that you have moved past the plateau is not a lower bill. It is that someone outside the FinOps team brought a cost consideration into a design review, unprompted, and nobody found it remarkable.