Skip to main content
Back to the Azure Footguns Database
CostGovernanceMediumOccasionalAZF-0057

A reservation expires silently and every covered VM snaps back to pay-as-you-go overnight

A reservation quietly reaches the end of its term and every covered resource reverts to pay-as-you-go rates overnight. The bill jump lands before anyone connects it to the lapse.

Footgun ID
AZF-0057 (Azure Footgun No. 57)
Azure service
Azure Reservations & Savings Plans
Resource type
Microsoft.Capacity/reservationOrders/reservations
Updated
July 9, 2026

What it is

An Azure reservation approaching the end of its one- or three-year term with no renewal decision made. Expiry isn't an error state: the reservation simply stops applying, and every resource it covered starts billing at pay-as-you-go rates from that hour. The workloads keep running, the deployment is untouched, and the only symptom is a bigger invoice weeks later.

Impact (cost)
loss of the reservation discount (commonly 30–60% at list price) on every covered resource, starting the hour the term ends
Basis: Azure list-price differential (illustrative). Figures are estimates, not measurements.

Why it happens

Auto-renewal isn't the safety net it sounds like. Portal purchases default renewal on, but CLI and API purchases default it off, older reservations predate the on-by-default behavior, and anyone can switch it off along the way — so a fleet accumulates a mix, and nobody knows which reservations will actually renew. Azure sends expiry emails, but they go to the reservation's owners and purchasers — routinely a person who has changed teams, a shared mailbox nobody reads, or a service account. Three years is long enough for the purchase to outlive the purchaser.

There is also no forced decision point. An expiring certificate breaks something; an expiring reservation breaks nothing. The infrastructure keeps working at the exact moment the discount disappears, so the first detectable signal is a cost anomaly on the next invoice — and by then you've paid weeks of pay-as-you-go rates on workloads you'd already decided deserved a commitment.

What it costs / blast radius

The reservation discount is commonly 30–60% off list price depending on term and SKU (illustrative; your contract may differ) — and losing it cuts the other way harder: a workload billed $10,000/month under a 40% discount comes back at roughly $16,700/month at list the day after the term ends.

The governance failure compounds the cost one: the lapse also erases a deliberate purchasing decision. Someone once concluded this workload was stable enough to commit to — silent expiry discards that conclusion without anyone re-examining it.

See it

Find it: list reservation orders with their expiry dates
az reservations reservation-order list \
  --query "[].{name:displayName, orderId:name, term:term,
               expires:expiryDate, state:provisioningState}" \
  -o table
# Anything expiring inside your budget cycle needs a decision,
# not a surprise
Fix: make the renewal decision explicitly — renew, or plan the lapse
# If the workload is staying: turn on auto-renewal before the term ends
az reservations reservation update \
  --reservation-order-id <order-id> --reservation-id <reservation-id> \
  --renew true

# If it isn't: let it lapse deliberately, with the PAYG rate difference
# budgeted — or exchange it for a commitment that matches current usage.

How StratoLens helps

StratoLens watches every reservation and savings plan across your subscriptions and flags anything approaching expiry well before the term ends, alongside its utilization history so the renew-or-lapse call is informed. The warning reaches your team inside your own tenant — not a purchaser mailbox from three years ago.

Start Your 28-Day Free Trial

Every feature unlocked. Deploys to your Azure tenant. No data leaves your tenant.

Available now on the Azure Marketplace.

Not ready to install anything? Browse the Azure Footguns Database: 55+ documented ways Azure quietly costs money or creates risk.

Request a demo

StratoLens catches the cost waste, access risk, and config drift across your whole Azure estate, from inside your own tenant, so your data never leaves it.