Skip to content
Vercel's new metric exposes exactly which ISR routes are burning cash

Vercel's new metric exposes exactly which ISR routes are burning cash

6 min read Vercel

Vercel's new write utilization metric for ISR Observability Plus users calculates the ratio of cached requests to ISR writes. This exposes routes that constantly regenerate but rarely get traffic, allowing you to tweak revalidation intervals and cut unnecessary compute costs....

Subscribe to listen
audio-thumbnail
Vercel's new metric exposes exactly which ISR routes are burning cash
0:00
/0
Clinical Summary
Diagnosis

Time-based ISR wastes compute resources and inflates infrastructure costs by repeatedly rebuilding low-traffic, long-tail pages that are never served to human users.

Prescription
  • Calculate Utilization: Use the Vercel CLI to track the ratio of cache hits to ISR writes locally, bypassing premium observability fees.
  • Extend Intervals: Increase arbitrary time intervals for non-critical pages from seconds to days to immediately slash edge compute and database read costs.
  • Shift to On-Demand: Abandon passive polling in favor of active, event-driven on-demand revalidation triggered by reliable webhooks.
Side Effects

Transitioning to event-driven architecture trades financial compute costs for intense engineering complexity, as a single dropped webhook will trap your page in a stale state indefinitely.

Script

Incremental Static Regeneration feels like a cheat code when you first set it up. You declare a revalidation interval—say, sixty seconds—and the framework handles the rest. Your pages load instantly from the edge. Your data stays reasonably fresh. You don't have to think about cache invalidation logic. It's fire and forget. But there's a trap hiding in that simplicity. You're likely paying your cloud provider to repeatedly rebuild pages that absolutely nobody is looking at.

Vercel just released a new metric called write utilization. It exposes exactly how much cash developers are burning on useless ISR regenerations. We need to examine why arbitrary, time-based revalidation is a flawed architecture at scale, and what you should actually be doing to fix it.

The Long-Tail Inventory Trap

Picture this. You run an e-commerce site. You want your product prices and inventory counts to stay perfectly accurate. So, you set up ISR on your product template with a sixty-second revalidation interval. For your top-selling items on the homepage, this works beautifully. A user requests the page, they get a fast cached response, and if the cache is older than sixty seconds, a background regeneration triggers. The next user gets the updated price.

But think about your long-tail inventory. Those thousands of obscure items, spare parts, or discontinued models that maybe get one human page view a week. Because of how ISR works under the hood, any stray request can trigger a revalidation cycle. A random bot scrapes the page. An uptime monitor pings it. A search crawler indexes it. That single request serves the stale page and triggers a background rebuild.

If you have a short interval, you might be paying your backend to silently fetch data, render heavy React components, and rebuild that specific page thousands of times a month. For literally zero human visitors. You're paying for compute to update a file sitting on a CDN that no one will ever download.

Understanding Write Utilization

That's exactly the blind spot Vercel is targeting. Write utilization is defined as the ratio of cached requests to ISR writes. It answers a very simple question: for every time you paid to generate this page, how many times was it actually served to a user?

In a healthy caching architecture, you want a high ratio. You want a page to be written once, and then served from the edge thousands of times. A low write utilization means the opposite. It means you're regenerating the page constantly, but serving it from the cache rarely. An extreme example would be a one-to-one ratio. You build it once, you serve it once, the timer expires, you build it again. You've essentially reinvented Server Side Rendering, but with more steps and delayed data.

These low-traffic, heavily-regenerated pages are a massive hidden cost sink. The damage isn't just on your Vercel invoice for edge compute and write units. Every ISR write hits your underlying infrastructure. It consumes database reads. It eats into your third-party API quotas. It burns bandwidth. You're incurring a full stack of compute costs for data that simply falls into the void.

How to Fix Poor Write Utilization

So, what's the practical fix if you check your metrics and discover your write utilization is terrible? You have two choices.

  1. The first is to increase your time-based interval. Change it from sixty seconds to a few hours, or even an entire day. That stops the bleeding immediately. It drops your write units to a fraction of what they were.

    But it introduces a heavy business cost. Your data might be stale for twenty-three hours. If an item goes out of stock, your site will cheerfully sell it to customers all day long until the timer finally ticks over. For many applications, that's unacceptable.

  2. The second option is what Vercel explicitly recommends in their release: switch to on-demand revalidation. Instead of guessing how often a page needs to be refreshed, you rely on events. A content editor updates a price in your CMS, or an inventory webhook fires from your database, and your server explicitly tells the framework to purge and regenerate that exact route.

An Architectural Shift

The official documentation treats this like a minor configuration tweak to reduce costs. Don't let that framing fool you. Moving from time-based ISR to on-demand revalidation is a major architectural shift.

You're abandoning passive polling in favor of active, event-driven invalidation. That introduces significant operational overhead. You need extremely reliable webhooks. You need dedicated cache invalidation pipelines. You have to handle network failures. What happens when a webhook drops, your server misses the event, and your page gets stuck serving a stale price indefinitely?

With time-based ISR, it self-corrects on the next interval. With on-demand revalidation, a missed webhook means a broken page until someone manually clears the cache. You're trading a financial compute cost for intense engineering complexity.

The Observability Paywall

You also need to ask whether you can even access this new metric without opening your wallet again. The native dashboard integration for write utilization—where a clean column appears in your UI and highlights your worst-performing routes—is completely gated behind Vercel Observability Plus.

If you aren't subscribed to that premium tier, you won't see it. There's a sharp irony in a cloud provider charging you a premium subscription fee just to point out where you're overpaying them for wasted compute. If you have a small number of static routes, the cost of upgrading your observability tier will entirely erase any savings you get from optimizing minor ISR inefficiencies.

The DIY Solution

But you don't have to upgrade your plan to get this data. You can calculate the exact same ratio yourself for free. Vercel provides CLI commands to pull the raw underlying numbers.

You can write a query to fetch the total number of cached requests—filtering for cache hits and stale responses—and group them by route. Then, you run a second query for the ISR write units on those same routes. You divide the first number by the second.

You can run this locally when investigating a creeping invoice. Or, if you want a permanent solution without the monthly upcharge, you can write a scheduled CI job. Have your pipeline run those CLI commands once a week, calculate the math, and pipe a list of your ten worst-offending routes directly into a Slack channel. You get the same actionable insight, entirely on your own terms.

The Lesson: Time is a Blunt Instrument

This new metric teaches us something vital about how we build at scale. Time-based revalidation is a blunt instrument. It's a crutch. It's incredibly easy to set up, which makes it tempting to use everywhere. We use arbitrary time intervals to paper over the fact that building reliable, event-driven cache invalidation is difficult. But convenience comes with a literal price tag.

When you use time intervals, you're guessing when data will change, and you're hoping your user traffic perfectly aligns with those guesses. When you operate at the scale of massive media catalogs or large e-commerce storefronts, those guesses add up to thousands of dollars in wasted backend resources.

Don't let an arbitrary timer manage your infrastructure costs. If a route matters enough to require fresh data, it matters enough to build a webhook for it. If it doesn't matter, let it stay cached for a week. Stop rebuilding pages for ghosts.

This is TAKEYOURPILLS.TECH.

Go ship something.

References

/