The $2,000/Year Cloud Bill
That Shouldn’t Exist: A WooCommerce Horror Story
This is the story of a real billing pattern that WooCommerce store owners encounter when they grow into object storage without understanding the egress fee model. The names are composite, but the numbers are real. And the fix is embarrassingly simple once you see it.
Updated 2026
Cost Audit & Infrastructure Rescue

The email arrived on a Tuesday morning. The subject line read: Your AWS bill for November: $187.43. The WooCommerce store owner who received it had been paying around $40 per month for AWS S3 since their developer set it up two years earlier. The site had grown. Traffic had grown. And apparently so had the bill, quietly and incrementally, over the course of eighteen months, until it crossed a threshold that was hard to ignore.
$187 in November. $164 in October. $143 in September. Looking back through the billing history, the monthly cost had been climbing at roughly 8 to 12% per month as the store grew. Annualized, this store was now paying over $2,000 per year for image storage and delivery, for a site with a 60GB product image library that serves a European customer base from a US-East S3 bucket, with no CDN between S3 and the end user.
This is not an unusual story. It is a predictable outcome of a specific infrastructure pattern that WooCommerce store owners fall into when they grow beyond shared hosting without getting complete advice about the cost structure of object storage. This guide traces exactly how that $2,000 bill is constructed, identifies every unnecessary charge in it, and explains the alternative that reduces it to under $120 per year with better performance.
Anatomy of the $2,000/year bill: line by line
To understand how $40/month becomes $170/month over eighteen months of store growth, you need to understand exactly what each AWS charge component is measuring and how it scales with WooCommerce growth.
The table reveals the problem immediately. S3 storage grew from $0.74 to $1.47 as the catalog doubled. That is expected and acceptable. But egress — data transfer out — grew from $8.10 to $108.00 because traffic grew roughly 13x over eighteen months. This is the nature of egress billing: it is a fee on serving your content to visitors, and it scales directly with the success of your business.
The more successful your store becomes, the more you pay for egress. There is no cap, no ceiling, no negotiated flat rate for a small business. The bill simply grows as traffic grows. For a WooCommerce store operator who is reinvesting revenue into growth, paying an ever-increasing fraction of that revenue back to AWS as egress fees is one of the most backwards cost structures imaginable. You are penalized for succeeding.
The three billing mistakes that made this bill this large
The $2,000/year bill is not just a consequence of growth. It is also a consequence of three specific configuration choices that made the cost higher than it needed to be even within the S3 model.
The original setup served images directly from the S3 bucket URL. Every image request from every visitor triggered an S3 GET request and an S3 egress charge. With 1,200GB of image traffic in a peak month, all 1,200GB was charged at S3’s egress rate of $0.09/GB. Had a CDN been in front of S3, the CDN would have served cached images for most requests. S3 egress would only be charged for CDN cache misses, which on a stable WooCommerce catalog is typically under 5% of total image requests.
The bucket was created in US-East because the developer who set it up was US-based and defaulted to their familiar region. The store’s customers are primarily in Germany, France, and the UK. Cross-region egress from US-East to Europe is charged at $0.09/GB. An EU-region bucket would have cost the same storage rate but with the same egress rate — the real issue is serving directly from S3 rather than region selection. However, the latency impact of a US-East origin to European customers without CDN was adding 150 to 250ms to every image request.
Product images were uploaded as photographer-delivered JPEGs averaging 800KB to 1.2MB per image. No compression plugin was running. No WebP conversion was happening. When these full-size images were served directly from S3 to product pages, visitors were downloading 800KB images for product thumbnails that display at 300×300 pixels. Converting to WebP and serving appropriately-sized images for each context would reduce the total image payload by 50 to 70%, which directly reduces egress volume by the same proportion.
The alternative stack: under $10/month flat for the same result
Replacing the S3 stack with a FTP-based alternative eliminates the egress fee model entirely and replaces it with a flat monthly cost that does not change regardless of traffic volume.
S3 egress (1,200GB direct): $108.00
S3 GET requests: $5.80
S3 PUT requests: $0.52
WP Offload plugin: $16.58
$132.37/month
$1,588/year
BunnyCDN (1,200GB, EU): $12.00
No S3 egress: $0
No S3 requests: $0
WP FTP Media plugin: $4.00
$21.83/month
$262/year
The migration plan: from S3 to FTP without breaking image URLs
Migrating from S3 to FTP storage on a live WooCommerce store requires care to avoid breaking product page images during the transition. The key is maintaining image availability throughout the migration by keeping S3 serving images until FTP and CDN delivery is confirmed working. Here is the sequence.
Create a Hetzner Storage Box account, set up a BunnyCDN pull zone pointed at the storage box’s HTTP URL, install WP FTP Media, configure the connection, and test that a manually uploaded image is accessible via the CDN domain. Do all of this before changing anything about the existing S3 configuration.
Use the AWS CLI, rclone, or S3 Browser to download your entire S3 bucket to a local staging directory. Then upload that directory to your Hetzner Storage Box using SFTP, preserving the same path structure. The directory structure from S3 typically already matches WordPress’s expected uploads path structure, which makes this a straightforward transfer.
Before switching WP FTP Media’s CDN URL to the live site, verify that a representative sample of product image URLs work correctly when the S3 domain is replaced with the CDN domain. Test featured images, gallery images, and thumbnail sizes across several products. Confirm that the path structure on the FTP server matches what WP FTP Media expects.
With WP FTP Media configured and verified, switch the CDN base URL to your new BunnyCDN domain. Disable WP Offload Media but do not delete it yet. Verify that product pages load correctly with images from the new CDN. Test checkout, cart thumbnails, and order confirmation emails. If everything works, deactivate and delete WP Offload Media.
After 48 hours of confirmed operation on the new stack, delete the S3 bucket contents and close the bucket. Keep the AWS account active for 30 days in case any integrations reference S3 URLs that need updating. Cancel WP Offload Media’s subscription. Watch the first month’s billing from AWS to confirm egress charges have dropped to zero.

How to audit your own cloud bill for equivalent charges
The billing pattern in this guide is not unique to S3. DigitalOcean Spaces, Google Cloud Storage, and Backblaze B2 all have egress components that can scale similarly with traffic growth. If you are paying any object storage provider and your monthly bill has been climbing, here is how to audit whether your situation is similar.
Open your cloud storage billing detail and look at the breakdown by charge type. If data transfer out (egress) represents more than 50% of your total bill, you are in the same category as the horror story above. The fix is either adding a CDN in front of your storage (reduces S3 egress by 90%+) or migrating to flat-rate FTP storage entirely.
If your primary customer base is in a different geographic region than your storage bucket, you are paying both the performance penalty of cross-region latency and the egress rate applicable to your bucket’s region. Verify your bucket region against your Google Analytics audience geography. A mismatch is both a performance and cost problem.
If your bill has been growing 8 to 12% per month, project it forward 12 months. An 8% monthly growth rate compounds to a 2.5x annual increase. If you are at $50/month today, you will be at $125/month in a year if you take no action. Understanding the growth trajectory helps prioritize the fix before it becomes the horror story.
According to The Last Week in AWS blog’s analysis of S3 egress costs, egress fees are consistently the most misunderstood component of AWS S3 billing and the most common source of unexpectedly high bills for growing businesses. The analysis notes that egress pricing was designed for data movement between large enterprise systems and is poorly suited to the traffic-based delivery patterns of a growing e-commerce site.
The WooCommerce operator in this story did not make bad decisions. They made reasonable decisions with incomplete information about how S3 costs scale with traffic. The fix is structural rather than behavioral: replace the cost model that penalizes growth with one that does not. WP FTP Media’s WooCommerce S3 egress cost elimination plugin handles the migration from S3 to flat-rate FTP storage precisely so that this story ends with an annual infrastructure bill of $262 instead of $2,000.

Your S3 bill grows every time your store succeeds. That is the wrong cost model.
WP FTP Media migrates your WooCommerce product images from S3 to flat-rate FTP storage, routes delivery through BunnyCDN at $0.01/GB instead of S3’s $0.09/GB egress, and caps your media infrastructure cost regardless of traffic growth.

Doubled my catalog but S3 only went from 74 cents to $1.47. That part's fair at least
Wait, the bill went from $40 to $187 just because of traffic?
This guide saved my store from a $200/month AWS bill totally worth it