A higher bill after migration is not a cloud pricing failure. It is the predictable result of renting an architecture that was designed to be owned.
Month fourteen. The migration is done, the datacentre has been served notice, and the programme ahas been declared a success in two all-hands meetings. Then the CFO puts one slide in front of the board: run cost is 22% higher than the year before migration started, and the business case promised 30% lower by now. The board asks the CIO a question, and it is not a technical one. It is whether anyone was watching.
Here is the claim: if your bill went up, the cloud is behaving exactly as designed. You took an architecture built for a world where capacity was bought once and consumed for free, and moved it onto a platform that meters every second, every gigabyte crossing an availability zone boundary, and every log line you ever emitted. Nothing broke. You are paying, line by line, for twenty years of decisions that were rational when the hardware was already bought.
The business case was probably complicit, because most of them model cloud savings as an outcome of migration rather than of work done after it. Moving the workload changes the cost model. Realizing the saving requires re-shaping the workload to fit it, and that is a separate, funded engineering programme almost nobody scopes.
Which points at the fix. Cost is not a finance topic that arrives at month-end. It is a non-functional requirement with the same standing as latency and availability, and it needs the same three things: a named owner, a budgeted target, and a test that fails in the pipeline when you breach it. Install those before migration and month fourteen is a status update. Install them after and you spend a year buying back credibility you should never have lost.
Why lift-and-shift inverts the economics of your architecture
On-premises, capacity was a sunk capital cost. You sized for the December peak, the batch window and three years of growth, then ran it. Once the cheque was signed, idle capacity was free, and an engineer who left a test environment running over Christmas cost the company nothing.
Twenty years of that incentive produced a specific engineering culture, and a rational one. Utilization was somebody else’s problem, and the only cost signal that reached a developer was the capacity request form, which took six weeks. So you asked for more than you needed, once, and never asked again.
In a metered environment every one of those habits has a price tag, billed by the second, forever. The behaviours did not become bad engineering. They became expensive engineering, which is a different thing and needs a different response.
Six on-prem habits that become line items in the cloud
Peak-sized static provisioning. The fleet is sized for the busiest hour of the busiest day and left there. On owned hardware that headroom was capital already spent. On rented hardware you buy the December peak in February and at three on a Sunday morning. In most estates we see, average production CPU utilization sits between 8% and 20%.
Always-on non-production. Development, test, UAT, performance and training environments used to come out of hardware already racked. Now they are full-price compute, running 168 hours a week to serve maybe 45 hours of use.
Chatty synchronous service calls. When two components sat on the same network segment, fifteen extra round trips per transaction cost a millisecond and nothing else. Spread them across availability zones for resilience and every round trip is billed cross-AZ transfer. The architecture did not change. The invoice did.
Full-table scans against a metered database. The nightly reconciliation that scans the whole policy table has run since 2011 and nobody has looked at it, because it always finished before anyone arrived. On managed databases with provisioned IOPS or per-request pricing, that job is now a recurring charge.
Batch that runs on hardware you now rent around the clock. Batch was the original elastic workload: heavy for four hours, idle for twenty, and those twenty were free. Rehost it onto persistent instances sized for the batch window and you rent the peak continuously, taking the workload with the best fit for elastic pricing and giving it the worst possible shape.
Logging everything at DEBUG, forever. Verbosity used to be constrained by local disk, and when disk filled someone turned it down. In the cloud there is no disk to fill, so nothing forces the conversation and the meter runs. Observability is regularly a top-three line item in a mature estate and almost never appears in the business case.
None of this is a pricing problem. Every one of them is an architecture that assumed free idle time, running on a platform that sells time.
The cloud cost line items nobody put in the business case
Business cases model compute and storage, because those are what the pricing calculator asks for. The gap between the modelled number and the real one lives almost entirely in categories the calculator never prompted anyone to enter. The shares below are rules of thumb from estates we have assessed, not published research. Treat them as a shape to check your own bill against.
| Line item | Typical share of cloud spend | Usual root cause |
|---|---|---|
| Over-provisioned compute | 30%–45% | Instances sized from the old physical spec, never revisited after go-live |
| Non-production environments | 20%–35% of compute | No auto-shutdown; environments created per project and never reclaimed |
| Observability and log ingestion | 5%–15% | DEBUG everywhere, indefinite retention, every metric at one-second resolution |
| Data transfer (cross-AZ, egress, inter-region) | 5%–15% | Chatty synchronous calls across AZs; data pulled out to on-prem reporting |
| NAT gateway processing | 1%–5% | All private-subnet traffic routed through NAT, including traffic to services reachable via endpoints |
| Storage sprawl (snapshots, backups, orphans) | 8%–20% | Daily snapshots with no lifecycle policy; volumes surviving their instances |
| Managed-service premium | 10%–25% | Managed database, streaming and Kubernetes control planes priced above self-managed equivalents |
| Licensing (Oracle, SQL Server, SAP, Windows Server) | 5%–25% | Core-counting rules that penalise virtualized and shared-tenancy hosts |
| Support plan tier | 3%–10% | Enterprise support priced as a percentage of spend, so it scales with your waste |
| Idle resources (load balancers, unattached IPs, provisioned throughput) | 2%–8% | Nothing owns deletion; nobody is billed for leaving it running |
Three of these deserve specifics.
Data transfer is architectural, not operational. You cannot negotiate it down or right-size it away. Cross-AZ charges apply per gigabyte in each direction, so a service mesh spread across three zones pays a tax proportional to its chattiness. NAT gateway charges are worse because they are invisible: an hourly rate plus per-gigabyte processing on everything leaving a private subnet, including traffic to object storage that could have gone via a VPC endpoint for a fraction of the cost. Teams find this by reading the bill, never the diagram, because the diagram has no prices on it.
Serverless per-request pricing has a crossover point. Functions and per-request APIs are extraordinarily cheap at low and spiky volume and stop being cheap at sustained high volume. The same code at fifty million invocations a day, with a runtime in the hundreds of milliseconds, can cost more than a modest reserved fleet. Model the crossover before committing to the pattern, and re-check when volume grows tenfold.
Managed services are usually worth the premium, and you should still know its size. Managed Kafka, Postgres and Kubernetes carry a real markup that buys operational capacity you would otherwise staff. The failure is not choosing managed. It is choosing it without quantifying the premium, so nobody notices you are paying it three times for the same capability across three teams.
Licence mobility: the one that arrives as a letter, not an invoice
Oracle, SQL Server, SAP and Windows Server licensing was written for a world of countable physical cores in a room you owned. Move the same workload to shared-tenancy virtual infrastructure and the counting rules change, rarely in your favour. Bring-your-own-licence terms may not extend to the target platform, core factor tables may treat vCPUs differently from physical cores, and dedicated hosts may be required to preserve your entitlement, which reverses the elasticity you migrated for.
This one has a distinctive failure mode: it never appears on the cloud bill. It appears eighteen months later as an audit letter. Review licence positions for every commercial product in scope before you move, and write the answer into the workload’s cost model.
The dual-running period is a real cost with a real duration
Every migration runs both environments for a period, and the business case usually assumes that period is short. It is not. The datacentre contract has a notice period, the DR site has its own, some workload will fail its cutover and go back, and the last 10% of the estate takes as long as the first 60%.
Budget dual-running as a named line with an explicit end date and an owner accountable for it. A programme that plans six months of overlap and takes eighteen has burned a year of duplicate infrastructure nobody approved, and it lands on exactly the slide the board reads in month fourteen.
FinOps is an operating model, not a dashboard
FinOps is usually described in three phases. Inform means every pound attributes to a team, a service and a business capability. Optimize means acting on that attribution. Operate means it runs continuously rather than as a quarterly fire drill. Reciting the phases does not help you, because almost every organization that fails at cloud cost fails inside the first one and skips to the second anyway. The order is not negotiable: an untagged estate cannot be optimized, only guessed at, and guessing produces the familiar pattern of a cost programme that saves 8% in a quarter and gives it back over the next two.
Tagging discipline is the precondition for everything else
Tagging sounds like housekeeping. It is the foundation of the operating model, because attribution is what converts a bill into decisions.
Define a small mandatory tag set and refuse to expand it: owning team, service, environment, cost centre, data classification. Five is enforceable. Fifteen is aspirational, and aspirational standards produce estates where 40% of spend lands in “untagged” and the exercise stalls.
Enforce it in two places. In CI, so a Terraform plan creating untagged resources fails the build. And in policy-as-code at the control plane, so anything created by a console click at two in the morning during an incident is blocked or flagged within the hour. Enforcement in one place is enforcement nowhere, because everybody eventually clicks something by hand.
Set a hard target: 95% of spend attributable to a named team within ninety days, untagged percentage published weekly. It is the most reliable leading indicator of whether a cost programme is real.
Showback, chargeback, and the politics of each
Showback publishes what each team costs without moving money. It is low-friction, it starts conversations, and it can be ignored indefinitely, because nothing on anyone’s P&L changes.
Chargeback moves the money into the consuming business unit’s budget. It changes behaviour fast and carries real political cost. Teams dispute the allocation of shared platform costs, someone tries to cancel spend they do not control, and a product owner discovers their marginal feature has a marginal cost.
Our practical position: start with showback, publish it weekly rather than monthly, and set a date to move the largest three or four consumers to chargeback. Full chargeback across a hundred teams generates more allocation argument than saving. Chargeback on the workloads making up 70% of spend gets most of the behaviour change for a fraction of the politics.
The principle matters more than the mechanism: the engineering team that provisions the resource must be the team that sees the bill. When cost lands in a central infrastructure budget, the people making the expensive decisions get no signal, and every optimization has to be pushed uphill by someone with no authority over the code.
Anomaly detection so a runaway job is caught in hours
Month-end close is a terrible detection mechanism. A misconfigured autoscaling group, a recursive function trigger or a log level left at TRACE in production can add six figures before anyone opens the console.
Configure anomaly detection at service and tag level, not just account level, because a 400% increase in one service is invisible inside total account spend. Route alerts to the owning team’s channel with the resource identifier in the message, set an acknowledgement expectation, and rehearse it once by spinning something expensive up deliberately to confirm the alert reaches a human.
Unit economics: the only cost metric a board should be looking at
Total spend is the wrong metric, and every argument that starts from it loses, because total spend grows with the business. If your bill rises 30% in a year while transaction volume rises 55%, you got materially more efficient and the CFO’s slide says you got 30% worse. You lose that argument on the slide, not on the merits.
The metric that survives contact with a board is cost per unit of business value. Pick the denominator your business already uses for its own volume:
| Sector | Denominator that works | Typical availability |
|---|---|---|
| Insurance | Cost per policy administered per year | Already in the policy admin system |
| Banking and payments | Cost per thousand transactions processed | Already in the payments platform |
| Retail and e-commerce | Cost per thousand orders | Already in the order management system |
| Healthcare | Cost per patient encounter or per claim adjudicated | Already in the EHR or claims system |
| Logistics | Cost per consignment or per delivery stop | Already in the TMS |
| SaaS and digital products | Cost per active customer per month, cost per million API calls | Already in the product analytics |
The point of the right-hand column is that you are not inventing a metric. You are joining a number finance already reports to a number the cloud provider already produces. The join requires the tagging discipline above. Unit economics is the payoff for tagging, which is why organizations that skip it never get to have this conversation.
A worked example
A composite general insurer we will call Calder Mutual moved policy administration and claims off owned infrastructure over two years. Figures rounded.
| Year | Policies administered | Total run cost (£m) | Cost per policy | What happened |
|---|---|---|---|---|
| Year 0 (datacentre baseline) | 1.90m | 14.2 | £7.47 | Owned hardware, three years into a five-year refresh cycle |
| Year 1 (migration, dual-run) | 2.00m | 19.6 | £9.80 | Both estates live; licence remediation; no optimization capacity |
| Year 2 (cutover complete, unoptimized) | 2.20m | 17.1 | £7.77 | Datacentre gone. Lift-and-shift shape intact. Board asks the question |
| Year 3 (FinOps installed, first two optimization waves) | 2.60m | 18.4 | £7.08 | Non-prod shutdown, right-sizing, log retention, storage lifecycle |
| Year 4 (selective re-architecture, commitments) | 3.10m | 19.9 | £6.42 | Batch moved to elastic, chatty paths made async, savings plans on stable base |
Read the total spend column alone and this is a programme that raised run cost 40% in four years. Read the unit column and it cut the cost of administering a policy by 14% while absorbing 63% volume growth without a capital event. Both are true. Only one describes the business.
There is a third figure the board needs and rarely gets: the counterfactual. Calder’s owned estate could serve roughly 2.4 million policies before the next refresh. Reaching 3.1 million on owned infrastructure meant a capital refresh in year three at an estimated £6.2m plus a step change in DR and facilities cost, committed twelve to eighteen months ahead of the demand. That step function is what cloud economics buys, and it vanishes from any slide showing only run cost.
The board narrative is three lines, and you should be able to say them without a deck:
- Unit cost is falling, and here is the trend over eight quarters.
- Total cost is rising because volume is rising faster, and here is the ratio.
- Here is what the alternative would have cost in capital and lead time, including the refresh we did not have to commit to in year three.
Start reporting the unit metric in the first quarter after cutover, especially when the number is embarrassing. A board that has watched unit cost fall for three consecutive quarters will accept a rising total. A board seeing the metric for the first time in month fourteen assumes it was constructed to win an argument.
Sequence your optimization by effort and payback
Most teams jump straight to re-architecture, because re-architecture is the interesting engineering. It is also the slowest, most expensive and highest-risk item on the list, and doing it first means twelve months pass before anything shows up on the bill.
The order below is roughly right for most enterprise estates. Ranges are rules of thumb, and percentages are of addressable spend in that category rather than of total bill.
| Move | Effort | Typical saving | Payback | Watch out for |
|---|---|---|---|---|
| Shut down idle non-production | Low | 20%–40% of non-prod compute | Days | Someone’s long-running test; schedule with an opt-out, not an opt-in |
| Delete orphaned resources | Low | 2%–8% of total | Days | Snapshots under legal hold; check retention obligations first |
| Log sampling and retention tiers | Low | 30%–60% of observability spend | 2–4 weeks | Retaining audit and security logs at full fidelity regardless |
| Right-size compute and databases | Low–medium | 15%–30% of compute | 4–8 weeks | Right-sizing on a quiet month; use 90-day peaks, not averages |
| Storage tiering and lifecycle policies | Medium | 30%–50% of storage | 1–3 months | Retrieval charges on archive tiers for data you actually read |
| Autoscaling that genuinely scales down | Medium | 15%–35% of compute | 2–4 months | Scale-in protection and stateful services that never release |
| Commitment discounts (reserved instances, savings plans, committed use) | Low effort, high consequence | 20%–40% on committed baseline | Immediate | Committing before the workload shape is stable. See below |
| ARM/Graviton and instance family moves | Medium | 15%–25% on eligible compute | 2–4 months | Native dependencies and commercial agents without ARM builds |
| Replace chatty synchronous calls with async patterns | High | 40%–70% of affected data transfer | 6–12 months | Real design work; only worth it on the top two or three paths |
| Re-architect (elastic batch, event-driven, serverless where it fits) | Very high | 30%–60% of that workload | 12–24 months | Do this last, and only where unit economics justifies it |
The top four items are achievable within a quarter by an existing platform team, need no application change, and commonly return 15% to 25% of total bill between them. That is the money that buys credibility and funds the engineering further down the list. Re-architecture at the bottom is not a demotion: it is where the largest structural savings live, and for some workloads the only thing that works. It should just not be item one, because it takes a year to show up and you will be asked about the bill in month fourteen regardless.
The commitment trap
Reserved instances, savings plans and committed use discounts are the fastest saving available: sign a document, save 20% to 40% on the committed baseline, no engineering required. Which is precisely why finance pushes for them early, often during the migration itself.
Here is the trap. A three-year commitment on a workload you intend to re-architect within eighteen months locks in the un-modernized shape, because the moment you halve the fleet you are paying for capacity you no longer use. We have watched that mechanism kill re-architecture work already designed, funded and staffed, on the grounds that it would strand a commitment.
Practical rules. Commit only to the floor you are confident about, typically 50% to 70% of steady-state baseline, never the peak. Prefer one-year terms and flexible instruments in the two years after migration, and accept the lower rate as the price of optionality. Before signing any three-year term, check it against the re-architecture roadmap. And never let discount coverage become a KPI in its own right; coverage targets turn into pressure to commit workloads that should have been shrunk instead.
Where re-architecture stalls, and how to take the risk out of it
The bottom row of that table is where a lot of programmes stop moving. The workload that most needs a new shape is usually the one nobody understands well enough to reshape: a policy admin system or an overnight batch estate carrying decades of business rules in code that has outlived its authors. A manual rewrite means rediscovering those rules by hand, at rewrite prices and with a rewrite failure rate, which is why the item gets designed, funded and then quietly deferred.
Modernize Software’s DMS platform takes a different route. It combines symbolic AI and enhanced compiler technology with generative AI-assisted analysis to restructure applications automatically, changing the architecture around the business rules while leaving the rules themselves intact. Elastic batch, asynchronous service boundaries and cloud-native data access come out as designed outputs of the transformation, produced the same way on the tenth workload as on the first.
That’s the piece most cost programmes are missing. The savings on the last row are the largest available and they’ve stayed out of reach because the execution risk was too high to sign off. Deterministic transformation brings that risk down to something a CFO can approve, so the workloads with the worst fit for metered pricing finally get the shape the platform is priced for.
Repatriation, honestly
Some workloads belong on owned hardware, and saying so has been unfashionable for a decade. The candidates are consistent. Steady-state high-throughput compute with flat demand, where the elasticity premium buys nothing. Large predictable storage with heavy read patterns, where per-gigabyte pricing plus egress dominates. Latency-bound systems where physics rather than architecture sets the floor: trading, industrial control, some real-time processing. And anything carrying punitive licence economics on shared tenancy.
The counter-candidates are equally consistent: anything spiky or seasonal, anything with an uncertain growth curve, anything benefiting from managed services you would otherwise staff, and anything where provisioning in minutes rather than months is the point.
None of this argues against cloud. It argues against a mandate. “Cloud-first” was a useful corrective to a decade of default on-prem and has hardened into a policy that removes the placement decision from the people best positioned to make it. Flexera puts multi-cloud adoption at 89%, so hybrid placement is already the operating reality of nearly every large enterprise. Moving one workload back is not a retreat from a strategy. It is the strategy working, assuming you have one.
Replace the mandate with a workload placement policy: a short document stating the criteria, naming who decides, and requiring every placement decision to be recorded with its cost model and a review date. Re-test material workloads annually, because demand shape changes. The value is not that the policy produces different answers. It is that it produces recorded ones, so the question in month fourteen gets a document rather than an argument.
Install the governance before migration, not after
Everything above is cheaper in advance. Retrofitting cost governance onto a live estate means renegotiating with teams who have already shipped, at roughly three times the work for the same outcome. Sign this off before the first production workload moves.
- A cost model per workload, signed by the workload owner. Monthly run cost at current volume and at plus-50%, itemized to include data transfer, observability, backup and licensing. Signed by the business owner rather than the architect, because the point is accountability, not accuracy.
- A tagging standard enforced in CI and in policy-as-code. Five mandatory tags, a build that fails without them, a control-plane policy catching what the pipeline misses. Target 95% attributable spend within ninety days of the first production workload.
- Budget alerts wired to the engineering channel, not the finance inbox. Thresholds at 50%, 80% and 100% of the workload’s monthly model, owning tag in the alert body.
- A named FinOps owner with authority. One person in the programme org chart with the right to require remediation. A committee will not do this, and neither will a part-time role held by someone whose main job is delivery.
- Non-production auto-shutdown as the default. Environments off outside business hours unless exempted, each exemption carrying an owner and a review date. Default-on with an opt-out saves an order of magnitude more than default-off with an opt-in.
- A cost regression test in the deployment pipeline. Infrastructure-as-code cost estimation on every pull request that touches infrastructure, requiring explicit approval above a defined increase. This is what makes cost a real non-functional requirement rather than a stated value.
- A dual-running budget with a named end date. Owned, reported monthly against that date, escalated when it slips rather than absorbed.
- A licence position review for every commercial product in scope. Done before migration and written into the cost model, so the audit letter in month eighteen is not the first time anyone thought about it.
Items 1, 2 and 5 alone avoid most of the month-fourteen conversation. Item 6 is the one most organizations skip, and the one that keeps the estate honest after the programme team disbands.
Frequently Asked Questions
Is a higher cloud bill after migration always a failure?
No, and treating it as one leads to bad decisions. If volume grew faster than spend, unit cost fell and you avoided a capital refresh, the programme succeeded and the reporting failed. If the bill rose while volume was flat, that is a genuine cost problem with an identifiable cause, usually peak-sized static provisioning plus always-on non-production plus unmanaged observability. The diagnostic is straightforward: divide spend by a business volume metric and look at the trend over four or more quarters. If you cannot compute that number, that is the finding. Fix attribution before you argue about the bill.
How long should we wait after migration before buying commitments?
Long enough for the workload shape to stabilise, which usually means at least two full quarters of post-cutover production running, and longer if re-architecture work is planned. Committing during migration is the most common expensive mistake, because you are locking pricing to an instance footprint you intend to change. When you do commit, cover the floor rather than the peak, typically 50% to 70% of steady-state baseline, and prefer one-year flexible instruments in the first two years. Take the smaller discount. Optionality during a period of active change is worth more than the extra ten points.
Who should own cloud cost, engineering or finance?
Both, with different accountabilities, and the split matters. Finance owns the model, the forecast, the commitment portfolio and the reporting to the board. Engineering owns the consumption, because engineering makes every decision that generates it. The failure mode is a central finance-owned cost programme issuing optimization tickets to teams that never see a bill and have no budget consequence. The arrangement that works: engineering teams see their own spend weekly against a budget they agreed, a named FinOps owner sits between the two functions with authority to require remediation, and cost appears in architecture review alongside latency and availability.
What is a realistic saving from a first optimization wave?
For an estate migrated but not optimized, 15% to 25% of total spend within one quarter is reasonable, achieved almost entirely from non-production shutdown, right-sizing, orphaned resource cleanup, storage lifecycle policies and observability retention. These need no application change and can be delivered by an existing platform team. The next tranche needs engineering work in the applications themselves and moves on a six to twelve month horizon. Be careful about presenting the first wave as a run rate. It is a one-off correction, and forecasting it forward as a trend is how cost programmes lose credibility in their second year.
What is the single most common cause of a post-migration cost overrun?
Non-production. It is the most under-managed category in almost every estate we assess, because nobody is charged for keeping an environment nobody uses. Development, test, UAT, performance and training estates are typically provisioned to production-like specifications, run continuously, and multiply with every project. Default-on auto-shutdown outside business hours, with exemptions requiring a named owner and a review date, is a week of platform work and routinely removes a fifth of compute spend. If you do one thing after reading this, do that, then use the saving to fund the attribution work that makes everything else possible.
The Bottom Line
The bill went up because you rented an architecture designed to be owned. Peak-sized fleets, always-on environments, chatty calls that used to be free, batch on rented steel around the clock, every log line you ever emitted, all metered by the second. The platform is not overpriced. The workload is the wrong shape for it. And with IDC projecting global ICT spend approaching $4 trillion in 2026, and legacy maintenance already consuming 60% to 80% of enterprise IT budgets, a programme that raises the run cost does more damage than the number suggests.
That shape does not change by being moved. It changes by being worked on, in a specific order, by people who can see what it costs. Attribution first, because an untagged estate can only be guessed at. Then the cheap structural wins that pay back inside a quarter. Then commitments, once the shape is stable and not before. Then, only where unit economics justify it, the re-architecture most teams try to do first.
And measure the right thing. Total spend describes your growth. Cost per policy, per claim, per thousand orders describes your engineering. A board that watches the second number fall for three consecutive quarters will fund the next phase. A board that only ever sees the first will ask who was watching, and the honest answer will be nobody, because nobody was given the job.
Give cost an owner, a budget and a test that can fail, exactly as you do for latency or availability, and month fourteen becomes a status update rather than an inquest.
If your estate has been migrated but not optimized, and the unit-cost number does not exist yet, that is a four-week problem rather than a four-quarter one. Modernize Software runs a cloud cost and placement assessment that reconstructs spend by workload, builds the unit economics baseline your board will eventually ask for, and returns a sequenced optimization plan with effort, saving and payback against each item. Worth doing before the next commitment renewal.

info@semanticdesigns.com
