Stop Paying Twice:
CDN + Storage Combo Pricing Exposed
Bundled CDN and storage products look convenient. Most of them are. But when you look at the line items, many site owners are paying for CDN delivery on top of a managed hosting plan that is already supposed to include it, or paying for storage add-ons on top of object storage they already pay for. Here is exactly where the double billing happens and how to stop it.
Updated 2026
Pricing Audit & Cost Optimization

Look carefully at what you are paying each month for your WordPress site’s infrastructure. If you are on a managed WordPress hosting plan, you are probably paying for some form of CDN capability. If you are also paying for an image optimization plugin, you may be paying for CDN delivery a second time. If you have a Cloudflare account on top of that, possibly a third time. If you are running object storage for media offloading and also have a CDN configured separately, you are paying for origin storage and delivery as separate line items that may overlap with what your hosting plan is already providing.
The WordPress infrastructure billing landscape is built around products that bundle features in ways that create genuine value for some customers and genuine waste for others. A managed hosting plan that includes a CDN is excellent value if you use it as your only CDN. It is wasteful if you have also configured BunnyCDN, Cloudflare, or another CDN in front of it. Understanding exactly what each product in your stack delivers, and whether any two products are delivering the same thing, is how you stop paying twice.
This guide audits the most common CDN and storage billing overlap patterns in WordPress setups, shows you how to identify redundancy in your own stack, and explains the clean, non-redundant architecture that delivers what you actually need without duplication.
The six most common double-billing patterns
These patterns are common enough that any WordPress site owner who has been running their site for more than two years has probably fallen into at least one of them. The challenge is that each one was added for a legitimate reason at the time, and the redundancy only becomes visible when you look at the full stack from a billing perspective.
Most managed WordPress hosting plans include a CDN. Kinsta uses Cloudflare’s network. WP Engine has its own CDN product. SiteGround includes Cloudflare. When these plans say “CDN included,” they mean your site’s HTML, CSS, JavaScript, and sometimes images are served from edge nodes. However, many customers on these plans also have a separate Cloudflare free or paid account, or a BunnyCDN subscription, running in parallel. The result is one or two CDN layers doing partial overlapping work.
The classic AWS setup: pay for S3 storage, pay for S3-to-CloudFront data transfer (even though this is intra-AWS and lower than public egress, it is still a charge), and pay for CloudFront distribution. Then sometimes, a BunnyCDN or third-party CDN is added for better global coverage, creating yet another delivery layer. Three billing relationships for one function: store a file, transfer it to CDN, and deliver it to a visitor.
Plugins like ShortPixel Adaptive Images, Imagify, or Jetpack Boost serve images from their own CDN as part of their service. If you are also running BunnyCDN or Cloudflare to serve CSS, JavaScript, and other static assets, you effectively have two CDNs running simultaneously, each handling different file types. This creates routing complexity, two sets of cache rules to manage, and two billing relationships where one could serve both purposes.
This pattern appears when a site owner sets up object storage (S3, Wasabi, or DigitalOcean Spaces) for new uploads but never migrated the existing media library. The existing files remain on the hosting server, consuming the storage add-on capacity. New files go to object storage. Two storage bills are being paid simultaneously for the same site’s media library, split across two systems with no clean separation.
WP Rocket, W3 Total Cache, LiteSpeed Cache, and similar caching plugins all have CDN integration features. When two of these are active simultaneously (sometimes due to partial deactivation or hosting-provided caching conflicts with user-installed plugins), both may be attempting CDN rewriting or CDN prefetching, creating configuration conflicts and potentially double-loading CDN assets.
Sites that set up WP Offload Media with S3 but never enabled local file deletion are paying for S3 storage of all their media, the WP Offload Media plugin license, AND continuing to fill up their hosting server’s disk because local copies were never removed. Three active costs for a system that was supposed to reduce storage costs. The plugin is configured, the offload is happening, but the cleanup step was skipped.
The billing audit: how to find your own redundancy
Finding overlap in your own stack requires listing every product and service you pay for that touches image storage or delivery, then mapping what each one actually does. This is the worksheet approach.
Audit rule: If you count more than one CDN provider, you likely have overlap. If you count more than one storage provider, you likely have files in multiple places. Either condition means you are probably paying twice for the same function.
What “CDN included” in your hosting plan actually means
This is one of the most misunderstood aspects of managed WordPress hosting. When a hosting plan says “CDN included,” it typically means one of three things, and they are not equivalent.
Kinsta’s CDN, for example, serves your site’s HTML, CSS, JavaScript, and images from Cloudflare’s global network. If your media is stored on Kinsta’s servers and served through their CDN, this is a complete CDN solution that eliminates the need for a separate Cloudflare or BunnyCDN account. Using both creates redundancy.
Some hosting CDNs cache the WordPress page output but do not automatically serve media from external storage sources. If your images are on an FTP server or S3 bucket and you have output-based URL rewriting pointing at a CDN domain, your hosting CDN is not involved in media delivery. In this case, the hosting CDN and your separate media CDN are serving genuinely different content and both are needed.
Some lower-tier hosting plans describe geographic load balancing or basic caching as a “CDN.” This provides minimal edge delivery benefit compared to a purpose-built CDN with dozens of global edge nodes. If your included CDN falls into this category, a separate BunnyCDN or Cloudflare is delivering real additional value and the cost is justified.

The clean architecture: one storage provider, one CDN, no overlap
The non-redundant architecture for WordPress media storage and delivery has three components with clearly defined, non-overlapping responsibilities.
Your hosting plan’s storage is used only for WordPress core, themes, plugins, and the database. No media files. The hosting plan’s included CDN (if any) handles HTML page caching and static asset delivery for theme CSS and JavaScript. It does not need to handle media delivery because media is coming from a dedicated source.
One FTP storage server stores all WordPress media: originals, thumbnails, all variants. No media lives anywhere else. No split between hosting server and FTP, no split between FTP and S3. One storage relationship. Flat monthly cost. Clear ownership. No billing overlap with any other system.
Choose one CDN that serves as the delivery layer in front of your FTP storage. Configure WP FTP Media to point to this CDN’s URL as the base URL for media output rewriting. All media delivery goes through this one CDN. No other CDN is involved in image delivery. No plugin pulls images from a different CDN. One CDN, one billing relationship, clear delivery responsibility.
Hosting storage add-on: $9/mo
Cloudflare Pro: $20/mo
Image optimization CDN plugin: $9/mo
S3 (partially used): $5/mo
WP Offload Media: $25/mo
Total: $98/mo
FTP storage server: $5/mo
BunnyCDN (for media): $1–3/mo
WP FTP Media plugin: $5/mo
Total: $36–38/mo

How to transition from a redundant stack to a clean one
The transition from a redundant stack to the clean architecture is a one-time consolidation effort. The steps are straightforward, but the order matters to avoid creating any gap in media delivery during the transition.
Complete the billing audit worksheet. Identify which products are providing overlapping CDN and storage functions. Calculate the total monthly spend and identify specifically which line items are redundant.
If media is currently split between hosting server and object storage, run a full sync to move everything to the FTP destination. Install WP FTP Media, configure the connection, run the bulk sync, enable local deletion, and confirm all media is now on the FTP server and served through your chosen CDN.
Once media is confirmed serving from your FTP + CDN stack, disable CDN rewriting in any image optimization plugin that was handling delivery, and cancel any object storage subscription whose role has been replaced by the FTP server. Verify that media continues to load correctly after each cancellation.
Evaluate whether your hosting plan’s included CDN now has a clear, non-overlapping role (HTML page caching, CSS/JS delivery) or whether it is redundant with your standalone CDN. If your standalone CDN handles everything more effectively, consider whether the standalone CDN can replace the hosting CDN entirely, potentially allowing a downgrade to a lower hosting tier.
The billing consolidation process typically takes one to two hours of active work and produces immediate monthly savings. According to published analysis of WordPress infrastructure spending patterns, over-provisioned and redundant infrastructure is one of the most common sources of unnecessary cost for sites that have grown organically rather than with a deliberate infrastructure strategy. The clean architecture described in this guide is not just cheaper. It is also simpler to monitor, easier to troubleshoot, and easier to explain to clients or stakeholders who ask what you are paying for infrastructure.
WP FTP Media’s single-stack WordPress media delivery solution is built around the clean architecture by design: one FTP server as the storage origin, one CDN URL for delivery, output-based rewriting that keeps everything routing through that single CDN, and no interaction with any other CDN or storage product in your stack. The redundancy you are paying for today can be eliminated, and the savings accumulate every month from the day the consolidation is complete.
Consolidate to one storage and one CDN. Stop paying for the same thing twice.
WP FTP Media provides the single-stack media architecture that eliminates CDN and storage billing redundancy, routes all media through one FTP server and one CDN, and keeps your infrastructure bill clean and auditable.

Does WP Engine's built in CDN actually cover everything, or would I still need something like BunnyCDN for
Wow, this really opened my eyes! just audited my Kinsta bill and yep double CDN charges hiding in
Finally found a breakdown that explains why my hosting bill kept climbing despite "optimizing" everything. Turns out I was double paying for CDN through my host and an image plugin. Fixed it in 10 minutes with this guide
This guide opened my eyes to how much I was overpaying! i had no idea my managed hosting already included CDN services while I was also paying for Cloudflare. The breakdown of the six double billing patterns was super clear and helped me cut two redundant costs right away. Only wish I'd found this sooner would've saved hundreds last year. Still, better late than never!
Hey everyone, just wanted to share my experience with this pricing guide. As a cashier who also runs a small WordPress site on the side, I was shocked to realize I was paying for CDN delivery three times once through