Key takeaways
- Most stores do not need a third-party image CDN. Shopify’s built-in CDN already resizes, crops, compresses, and format-negotiates AVIF, WebP or JPEG per request, at no extra cost.
- The Liquid
image_urlfilter handles width, height, crop, format and pad_color up to 5760px, andimage_taggenerates a responsivesrcsetwithloading="lazy"by default.- A third-party image CDN earns its place when the problem is not delivery. Digital asset management, video, art direction at scale, images hosted outside Shopify, and multi-channel reuse are the real triggers.
- Cloudinary is the DAM-plus-transformation option and prices on credits. Bunny Optimizer is the cheap transformation layer at $9.50 per month per website plus bandwidth.
- Neither can replace
cdn.shopify.comfor native product images. Both sit alongside it, which is the maintenance cost people forget to price in.
A Shopify image CDN comparison usually starts from the wrong assumption: that Shopify’s image delivery is a gap you need to fill. It is not. Every Shopify plan ships with a global CDN that resizes, compresses and format-negotiates images on the fly, and you pay nothing extra for it.
So the useful question is narrower. What does the built-in CDN actually do, where does it stop, and does Cloudinary or Bunny Optimizer solve a problem you genuinely have? This guide covers the Shopify default in detail, then compares all three on cost, transformation API, format support, theme integration, Core Web Vitals and lock-in.
Why you can trust us
We have been in the Shopify space for over four years and have worked with hundreds of Shopify brands on their storefronts. Jacques has over 15 years of development experience. We build Fudge, an AI storefront editor with a 5.0 rating on the Shopify App Store and Built for Shopify status, so we work in the theme layer where image delivery is either won or lost.
The short answer: most stores should stay on Shopify’s CDN
If your images live in Shopify, your theme uses image_url and image_tag correctly, and you upload sensible source files, you will not get a meaningful speed win from a third-party image CDN. You will get another vendor, another bill and another failure point.
The stores that do benefit have a different problem. They are managing a large media library across channels, serving video at scale, doing per-audience art direction, or hosting images somewhere other than Shopify. Those are asset management problems, not delivery problems.
If your image issue is “my hero is 1.4 MB”, the fix is your source files and your Liquid, not a new CDN.
What Shopify’s built-in image CDN actually does
Shopify’s CDN is backed by Cloudflare, serves over HTTP/3 with TLS 1.3, and compresses text assets with Brotli and gzip.1 It is included on every plan, with unmetered hosting and unlimited bandwidth.2 There is no bandwidth meter to watch and no per-request charge.
Here is the part people underrate.
Automatic format negotiation: AVIF, WebP and JPEG
Shopify inspects each request and picks the best compatible format for that client, choosing between AVIF, WebP and JPEG based on quality and compressed bytes.3 You do not configure this and you do not pay for it. It has been the default behaviour since 2022.
This is the single feature most third-party image CDNs are sold on. Shopify already does it.
The image_url filter and its parameters
image_url is the current Liquid filter for building image URLs. img_url is deprecated and replaced by it.
It takes:
widthandheight, up to a maximum of 5760px each. You must pass at least one, or the filter errors.4crop, with valuestop,center,bottom,left,rightandregion.format, acceptingjpgorpjpg. Valid conversions are PNG to JPG, PNG to PJPG, and JPG to PJPG.pad_color, as a hex3 or hex6 value.
One rule catches people out: an image is never resized larger than its original dimensions. Ask for 3000px from a 1200px upload and you get 1200px back.
Note the deliberate split. The format parameter is for source conversion, not for forcing AVIF or WebP on the visitor. Format negotiation happens automatically at the edge, per request.
Responsive srcset with image_tag
image_tag generates the <img> element and does the tedious parts for you. It sets width and height attributes from the image’s real aspect ratio, which prevents layout shift, and it builds a srcset from a default set of widths up to the maximum in the URL.
It accepts widths, sizes, srcset, preload, alt, class and any other HTML attribute. Two defaults matter:
- Images get
loading="lazy"automatically unless you passpreload: true. That is the right default for below-fold images and the wrong one for your hero. See how to lazy load images in Shopify for where the line sits. preload: truesends aLinkresource hint as an HTTP header, which is what you want for the LCP image. If your hero is arriving late, our Shopify hero banner eager loading fix walks through the exact change.
A correct hero looks roughly like this.
{{ section.settings.image
| image_url: width: 2400
| image_tag:
widths: '600, 900, 1200, 1600, 2000, 2400',
sizes: '100vw',
preload: true,
loading: 'eager',
alt: section.settings.image.alt
}}
Most “we need an image CDN” conversations end here, once someone reads the theme code and finds a fixed-width <img> with no srcset.
Size limits and supported source formats
Product and collection images must be under 20 MB and up to 5000 x 5000 px, or 25 megapixels. Accepted types are PNG, JPEG, PSD, TIFF, BMP, GIF, SVG, HEIC and WebP, with animated GIF and WebP supported. Shopify suggests 2048 x 2048 px as the size that usually displays best for square product shots.5
Shopify compresses on upload, but it will not rescue a badly exported source. For the pre-upload half of the job, see our guide on how to compress images in Shopify.
When a third-party image CDN earns its place
There are real cases. They are narrower than the marketing suggests.
- Heavy on-the-fly transformations. Overlays, text burn-in, background removal, per-variant composites, generated social crops. Shopify gives you resize, crop and pad. That is it.
- Digital asset management. Versioning, approvals, tagging, search, and a single source of truth your creative team works from. Shopify Files is storage, not a DAM.
- Video. Adaptive bitrate delivery, per-device renditions, thumbnail generation.
- Art direction at scale. Different crops per breakpoint or per audience, driven by rules rather than by hand.
- Images hosted outside Shopify. A PIM, a headless setup, or a marketplace feed that never lands in Shopify Files.
- Multi-channel reuse. The same asset serving Shopify, a marketing site, an app and a wholesale portal from one URL and one transformation set.
The pattern: you are buying asset management and transformation depth, not faster bytes. If none of those describe you, stop here.
Shopify default vs Cloudinary vs Bunny Optimizer
Cost model
Shopify’s CDN is included. Unmetered hosting, unlimited bandwidth, no separate line item.2
Cloudinary prices in credits. As listed on its pricing page today: Free at $0 per month with 25 monthly credits, Plus at $99 per month or $89 per month billed yearly with 225 credits, and Advanced at $249 per month or $224 per month billed yearly with 600 credits. Enterprise is custom. One credit equals 1,000 transformations, or 1 GB of managed storage, or 1 GB of viewing bandwidth.6
The Cloudinary AssetLink app on the Shopify App Store lists its own plans separately: a free tier that requires an external Cloudinary plan, Pro at $999 per month, and Pro Plus at $999 per month plus $0.30 per GB of CDN delivery. The listing shows a 5.0 rating from 3 reviews. Check the live listing before budgeting, since app plans change.
Bunny splits the bill. Bunny Optimizer is $9.50 per month per website, with unlimited requests, optimizations and transformations. CDN bandwidth is billed on top: on the standard network, $0.01/GB for Europe and North America, $0.03/GB for Asia and Oceania, $0.045/GB for South America, $0.06/GB for Middle East and Africa, with a $1 monthly minimum.
Bunny is the cheapest by a wide margin. Cloudinary is priced as a media platform, because that is what it is.
Transformation API
Shopify: width, height, crop, format, pad_color. Deliberately small.
Cloudinary: the deepest of the three. Chained transformations in the URL, f_auto for format selection and q_auto for quality selection, plus overlays, effects, cropping modes and video.
Bunny Optimizer: a middle tier. Its image processing docs list width, height, crop, aspect_ratio, crop_gravity, face_crop, focus_crop, blur, sharpen, brightness, contrast, saturation, hue, tint, sepia, gamma, flip, flop, rotate, quality and format. More than Shopify, well short of Cloudinary.
Format support
| Shopify CDN | Cloudinary | Bunny Optimizer | |
|---|---|---|---|
| Automatic per-request negotiation | Yes, AVIF / WebP / JPEG | Yes, via f_auto | WebP via a settings toggle |
| AVIF output | Yes, automatic | Yes | Not documented in the Optimizer image docs |
| Source formats accepted | PNG, JPEG, PSD, TIFF, BMP, GIF, SVG, HEIC, WebP | Broad, including PDF and video | Standard web formats |
Shopify’s format story is genuinely competitive here. The Bunny Optimizer image processing documentation lists conversion between JPEG, PNG, WebP and GIF and describes WebP auto-serve as a setting, and does not document AVIF output. Treat AVIF on Bunny as unconfirmed until you test your own pull zone.
Ease of integration with a Shopify theme
This is where the comparison turns.
Shopify: zero work. It is already how your theme renders images.
Cloudinary: its Shopify app adds Liquid snippets to your theme and gives you an embedded media library in admin for attaching Cloudinary assets to products, collections and blogs. Workable, but it means theme edits and a parallel asset workflow next to Shopify’s own.
Bunny: no first-party Shopify integration for native product images. A pull zone fronts an origin, and Shopify gives you no way to swap the storefront CDN for product media served from cdn.shopify.com. In practice Bunny is used for assets outside Shopify’s image pipeline: landing page media, downloadables, files hosted elsewhere. That is a real use case, but it is not “replace the Shopify image CDN.”
The blunt version: you cannot fully move off Shopify’s image CDN for native product images. Every third-party option is additive.
Effect on Core Web Vitals
Be sceptical of CDN-driven LCP claims. Once images are already AVIF or WebP, correctly sized, and served from an edge close to the visitor, a second CDN moves very little.
What actually moves LCP on a Shopify store:
- A hero that is lazy-loaded instead of preloaded.
- Missing
srcset, so mobile downloads a desktop-sized file. - Missing width and height, causing layout shift and a worse CLS score.
- A source image far larger than any rendered size.
- App scripts and render-blocking resources delaying the image request in the first place.
A third CDN hop can add a DNS lookup, a TLS handshake and a cold-cache miss on the first request. That is a small regression, not an improvement, until your transformation needs justify it. For where Shopify stores actually stand on these metrics, see the state of Shopify performance in 2026, and for mobile specifically, our guide to Shopify mobile speed.
Maintenance and lock-in
Shopify: nothing to maintain, nothing to unwind. Image URLs are generated by Liquid filters that ship with the platform.
Cloudinary: your image URLs point at Cloudinary. Your transformation logic lives in Cloudinary’s URL syntax, embedded in theme snippets. Migrating away means rewriting those URLs and re-homing the assets. The DAM value is real, and so is the exit cost.
Bunny: lighter lock-in. The transform syntax is query parameters, and swapping the hostname back is straightforward. You are still maintaining a pull zone, cache rules and a second bill.
Every third-party option also adds a second place where an image can be wrong: stale cache, mismatched crop, an asset updated in one system and not the other.
Decision table
| Criterion | Shopify CDN | Cloudinary | Bunny Optimizer |
|---|---|---|---|
| Cost | Included on every plan | Credit-based: Free, Plus $99/mo, Advanced $249/mo | $9.50/mo per website plus bandwidth from $0.01/GB |
| Transformations | Resize, crop, pad, JPG/PJPG | Deep, chained, plus video | Mid-range, query-parameter based |
| Auto format negotiation | AVIF / WebP / JPEG | Yes, f_auto | WebP; AVIF unconfirmed |
| DAM features | No | Yes | No |
| Video | Shopify-native hosting only | Yes | Separate Bunny Stream product |
| Theme integration | Native Liquid filters | App plus theme snippets | Manual, non-Shopify assets only |
| Likely CWV gain | Baseline | Marginal | Marginal |
| Lock-in | None | High | Low |
Verdict by store profile
Small to mid-size store, images in Shopify. Stay on the Shopify CDN. Spend the effort on source files, srcset, and preloading the LCP image. Our guide on how to speed up a Shopify theme covers more of that ground than any CDN swap will.
High-volume store with a creative team and a large media library. Cloudinary, and buy it for the DAM and transformation depth rather than for speed. Price the credits against your real transformation and bandwidth volume first.
Store with meaningful assets outside Shopify. Bunny Optimizer, for those assets only. At $9.50 per month per website plus a cent per gigabyte in Europe and North America, it is cheap enough to be worth it for a media-heavy microsite or a downloads library. Leave product images on Shopify.
Headless or multi-channel setup. Cloudinary if you need one asset source across storefront, app and marketing site. Bunny if you only need transformation and delivery.
Anyone whose actual complaint is a slow hero image. None of the above. Fix the Liquid.
Where Fudge fits
Fudge is an AI storefront editor that writes native theme code: Liquid, CSS and JavaScript, directly in your theme.
Most image performance problems on Shopify are theme problems. A hero without preload, a product grid without srcset, a section hard-coding a 2000px source into a 400px slot. You can describe the fix in plain language, and Fudge writes the image_url and image_tag calls properly into the section.
Because the output is native theme code, there is no extra script and no widget layer, and it survives uninstall. The same applies to anything else you build with the Shopify store editor.
That is usually the cheaper fix. A CDN cannot correct a theme that asks for the wrong image.
FAQ
Yes. Every Shopify plan includes a global CDN backed by Cloudflare, with unmetered hosting and unlimited bandwidth at no extra cost. It resizes, crops and compresses images on request, and picks the best format for each client automatically.
Yes. Shopify inspects each request and selects between AVIF, WebP and JPEG based on client support, quality and compressed size. This has been automatic since 2022 and needs no configuration or theme change from you.
Not for native product images. Shopify has no setting to point storefront product media at a different CDN, so third-party image CDNs sit alongside cdn.shopify.com rather than replacing it. Cloudinary hosts its own copies of assets and links them into products via a Shopify app, and Bunny is generally used for assets outside Shopify's image pipeline.
It is worth it if you need digital asset management, deep transformations, or video across multiple channels. It is not worth it purely for delivery speed, since Shopify already handles format negotiation and edge delivery. Cloudinary prices in credits, with a free tier and paid plans listed at $99 and $249 per month at the time of writing.
Bunny Optimizer is listed at $9.50 per month per website with unlimited requests, optimizations and transformations. CDN bandwidth is charged separately, starting at $0.01 per GB for Europe and North America on the standard network, with a $1 monthly minimum. Check bunny.net for current pricing before committing.
Product and collection images must be under 20 MB and no larger than 5000 x 5000 px, or 25 megapixels. Accepted formats include PNG, JPEG, PSD, TIFF, BMP, GIF, SVG, HEIC and WebP, with animated GIF and WebP supported. Shopify suggests 2048 x 2048 px for square product images.
Rarely by much on Shopify. Once images are format-negotiated and served from a nearby edge, the remaining LCP problems are usually theme-side: a lazy-loaded hero, a missing srcset, or missing width and height attributes. Adding a second CDN can even cost you a DNS lookup and a TLS handshake on the first request.
Footnotes
-
Shopify Dev, “The Shopify platform” - Shopify’s CDN is backed by Cloudflare, with Brotli and gzip compression, HTTP/3 and TLS 1.3. https://shopify.dev/docs/storefronts/themes/best-practices/performance/platform ↩
-
Shopify, “Unlimited web hosting, worldwide” - “Every plan includes quick, reliable and unmetered hosting for your online business.” https://shopify.com/website/hosting ↩ ↩2
-
Shopify Dev Changelog, “Automatic image delivery in AVIF”, 29 August 2022 - Shopify examines the request and determines the best compatible file format, such as AVIF, WebP or JPEG. https://shopify.dev/changelog/automatic-image-delivery-in-avif ↩
-
Shopify Dev, “image_url” Liquid filter - width and height accept values up to 5760px, at least one is required, and images are never upscaled beyond their original dimensions. https://shopify.dev/docs/api/liquid/filters/image_url ↩
-
Shopify Help Center, “Product media types” - images must be under 20 MB and up to 5000 x 5000 px or 25 megapixels. https://help.shopify.com/en/manual/products/product-media/product-media-types ↩
-
Cloudinary, “Pricing” - one credit equals 1,000 transformations, or 1 GB of managed storage, or 1 GB of viewing bandwidth. Plan prices read from the live page. https://cloudinary.com/pricing ↩