Vercel bills are your fault — Websmith Studio<br>Every few weeks someone's Vercel bill goes viral. A screenshot of a scary number, a Reddit thread underneath agreeing that Vercel pricing is a scam, a few replies telling them to buy a VPS. The platform takes the beating, and we f***ing eat it up.<br>I nearly wrote that post. We recently built a site on Next.js with a couple of thousand pages, user logins and steady traffic, and the bill still crept up anyway. So before pointing the finger I read the invoice line by line, and the villain wasn't there, regrettably.<br>The top line wasn't compute. Compute was rounding error, which surprised me more than anything else on the page. The money was in ISR writes, with image transfer coming in at a close second. A write is what you're billed each time Vercel regenerates a cached page and stores the result. Every line traced back to something we'd shipped.<br>Nobody reads the invoice<br>Blaming the platform is easier than auditing the architecture. A big number is shareable and a root cause isn't.<br>But a hosting bill is boring and literal. It doesn't charge you for being popular, it charges you for what you asked it to do. If the number looks wrong, the useful question isn't why Vercel is expensive. It's what you asked for without realising.<br>Don't make every request prove itself<br>The second a page needs to know who you are, it's tempting to render everything per request. But voilà that's your cache gone. We were fortunate that the site's content model let us keep every page static, with the dynamic bits loading in on the client afterwards (where's Astro when you need it?). A small hint cookie tells the browser whether there's a logged-in user worth fetching, so visitors who aren't logged in never trigger the lookup at all.<br>Worth being clear that the hint is not auth. The real session stays httpOnly and is checked server-side, and gated content never relies on the hint. It exists so the logged-out majority can skip an uncacheable request, nothing more.<br>Same thinking for a gated-content check that ran as an API route on every anonymous visit, cold-starting a function to answer one boolean. Anywhere from 100ms to a couple of seconds of boot time for a yes or no. We fixed this by doing a Redis check at the edge instead, a warm read that answers in tens of milliseconds.<br>Edge Config was the obvious first reach, but it caps out around a thousand items and we have more gated pages than that, so Redis it was. It fails closed too, a Redis error means the content is treated as gated. Not free, Upstash bills per command, but it's cheap and it's never cold. If something fires on every request, it shouldn't need to boot anything up first.<br>Prefetch is traffic too<br>Next.js prefetches every link that scrolls into view by default. On a content site, that's a listing page full of cards, each one fetching an article the reader may never open. The platform bills it like any other traffic. Transfer for pages nobody reads, stale pages revalidating for a visitor who never arrives. We swapped the default for a custom Link component that prefetches on hover instead. Navigation still feels instant, the speculative traffic is gone.<br>Yes, a VPS is cheaper<br>Often it's even the right answer. Run this on a $50 box, or start in Astro and skip the Vercel and ISR conversation entirely, and these line items stop existing.<br>But when a VPS is the right call, it's usually obvious. You're serving tens of thousands of visits a day and the platform premium has become real money, or every page is genuinely built per visitor and a CDN cache was never going to help you. At that point the bill is measuring your traffic rather than your mistakes, and flat-rate hardware wins the maths.<br>But for the big unglamorous middle, the money a VPS saves is mostly money you're wasting on mistakes, and a flat rate doesn't fix waste, it just stops itemising it. Go look at your bill, and if you see a line item that looks like a mistake, investiate it and fix it.<br>The platform isn't at fault, we are.
Liked this article? Give it a<br>Share
Back to all blogs