DEV Community

Cover image for Cloudflare Images Pricing 2026: Storage Limits, Delivery Costs & When to Upgrade
Nayan Kyada
Nayan Kyada

Posted on Edited on Originally published at nayankyada.com

Cloudflare Images Pricing 2026: Storage Limits, Delivery Costs & When to Upgrade

Cloudflare Images is only partly free — and the pricing structure is unusual enough that teams routinely underestimate the bill before they hit a threshold. This post breaks down exactly what you get at each tier, what triggers an upgrade, and how the costs stack up if you are serving images from a Sanity CMS project through a Next.js front-end.

How Cloudflare Images pricing actually works

Every account starts on the Images Free plan, but it only covers transformations of images you store elsewhere (up to 5,000 unique transformations a month) — it includes no storage. To store images in Cloudflare Images you need the Paid plan, which sells storage in blocks of 100,000 images, a separate delivery unit, and transformations beyond the first 5,000.

At the time of writing, the pricing looks like this (check Cloudflare's Images pricing page for current numbers):

Unit Price
First 100,000 images stored $5 / month
Each additional 100,000 images $5 / month
Images delivered (variants) $1 per 100,000 served
Unique transformations (images stored elsewhere) First 5,000/month included, then $0.50 per 1,000
Free plan 5,000 unique transformations/month, no storage
Flexible variants (custom resize on the fly) Included (enable in settings)
Max upload size per image 10 MB
Max output dimension 12,000 px on either side

The $5/month base buys you 100,000 stored originals, and the named variants you define off those originals don't count toward storage — Cloudflare pre-generates nothing, it resizes on first request and then caches the result at the edge. Delivery is charged separately at $1 per 100,000 served images (across all variants). If you have 50,000 product images each served in three sizes to 10,000 monthly visitors, the math adds up quickly.

What counts as a stored image

Every original you upload via the API or the dashboard counts as one stored image against your 100,000 block. Variants — resized or cropped outputs — do not count toward storage; only the original does. Deleting an image removes it from the count immediately.

This matters for Sanity projects. Sanity stores its own originals in its asset pipeline. If you decide to also push those assets into Cloudflare Images (via a webhook or a migration script), you are paying for storage twice — once inside Sanity's plan and once inside Cloudflare's. That dual-storage pattern is only worth it if Cloudflare's edge delivery or transform speed genuinely outperforms what cdn.sanity.io delivers for your audience.

Delivery cost: when it becomes the dominant line item

The $5/month storage base is predictable. The $1/100,000 delivery unit is where high-traffic projects get surprised.

A marketing site doing 500,000 image requests per month (not unusual once you factor in retina variants, OG images, and mobile breakpoints) adds $5/month in delivery on top of the base $5. That is $10/month total — cheap. At 5 million requests, you are at $50/month for delivery alone. A mid-sized e-commerce catalogue with aggressive variant counts can push this well past $100/month without the team noticing until the invoice arrives.

Cloudflare's Images pricing page doesn't mention a spending cap, so set up billing notifications in the dashboard and keep an eye on delivery volume.

Cloudflare Images vs Cloudinary: cost comparison

Cloudinary's free tier gives you 25 credits/month (roughly 25,000 transformations or 25 GB of managed storage, depending on how you spend the credits) before charging. Cloudflare's free plan only covers transforming images you host elsewhere; storing images in Cloudflare Images is paid from the first image.

Factor Cloudflare Images Cloudinary Free → Paid
Free tier 5,000 transformations/month, no storage 25 credits/month
Storage base $5/100k images Included up to limit
Delivery fee $1/100k requests Per-credit model
On-the-fly transforms Yes (flexible variants) Yes
AI background removal No Yes (paid feature)
Next.js loader available Community loaders only Official loader
Sanity integration Manual / webhook Official plugin

For a small blog or portfolio under 10,000 images and modest traffic, Cloudinary's free tier wins on pure cost. For large catalogues where you are already a Cloudflare customer and want edge delivery baked in, Cloudflare Images starts to make sense — especially if you are already using Cloudflare Workers or R2 and want a unified vendor bill.

Cloudflare Images vs Sanity's own CDN

Sanity's asset pipeline delivers images from cdn.sanity.io, Sanity's global image CDN. You get GROQ-driven URL transforms (?w=800&auto=format), hotspot-aware crops, and palette extraction — all without a separate image service account. Sanity's CDN costs are included in your Sanity plan (at the time of writing, Free and Growth both include 100 GB bandwidth a month, with Growth overage at $0.30/GB — check sanity.io/pricing).

For most Next.js + Sanity projects I work on, there is no reason to also route images through Cloudflare Images. The Sanity CDN handles WebP and AVIF (auto=format), width capping, and quality tuning at the URL level. Adding Cloudflare Images means a separate upload step, a second monthly bill, and a custom next/image loader to replace the Sanity one.

The one exception is teams that already operate inside a Cloudflare-first infrastructure — Workers for server logic, R2 for assets, Pages for hosting — and want images to live in the same ecosystem with a single invoice. That is a workflow preference more than a performance decision.

What actually triggers an upgrade

  • You exceed 100,000 stored originals (Cloudflare automatically bills the next $5 block).
  • Your monthly delivery volume climbs past the point where the per-100k charge becomes material against your margin.
  • You want to store originals in Cloudflare and resize them with Flexible Variants (arbitrary resize parameters in the URL) — storage needs the Paid plan, and Flexible Variants is a setting you turn on there.
  • You transform more than 5,000 unique images a month from an external origin, which moves you past the free allowance.

Practical recommendation

If you are running a Next.js + Sanity project and looking for an image CDN, start with Sanity's built-in CDN and next/image configured with a Sanity loader. It is the lowest-friction path and the cost is already inside your Sanity subscription. Only consider Cloudflare Images if your infrastructure is already Cloudflare-native, you have an existing R2 bucket you want to connect, or you are running a catalogue large enough that the flat-rate $5/100k storage model is cheaper than per-transformation pricing from alternatives.

For projects with over 500,000 stored images, do the unit economics: Cloudflare's $5/100k storage scales linearly and predictably, which can beat Cloudinary's transformation-based model at scale — but only if delivery volume stays moderate relative to the stored count.

Top comments (0)