Cloudflare Images Pricing 2026: Storage Limits, Delivery Costs & When to Upgrade
By Nayan Kyada · · 6 min read
Part of Next.js Performance
Cloudflare Images is not 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
Cloudflare Images is not bundled inside the free Cloudflare plan in any meaningful way. There is no perpetual free tier the way Cloudinary or Bunny Stream offer one. Instead, Cloudflare sells a flat-rate storage block and a separate delivery unit.
As of September 2026, the pricing looks like this:
| Unit | Price |
|---|---|
| First 100,000 images stored | $5 / month |
| Each additional 100,000 images | $5 / month |
| Images delivered (variants) | $1 per 100,000 served |
| Free trial | None (credit card required at signup) |
| Flexible variants (custom resize on the fly) | Included |
| 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 unlimited named variants off those originals — 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 does not offer a spending cap on Images — only on Workers. Budget alerts via the Cloudflare dashboard exist but require manual setup.
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 Images has no free tier — you pay from the first image.
| Factor | Cloudflare Images | Cloudinary Free → Paid |
|---|---|---|
| Free tier | None | 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, which is a Fastly-backed 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 (free tier: 10 GB bandwidth, Growth: 1 TB).
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 need Cloudflare Images Flexible Variants with custom aspect ratios that are not expressible in named variants — these require a plan with flexible variants enabled, which is included in the standard paid offering but not available on any "free" workaround.
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.