The 15-Minute Setup: Offloading
Your First 10,000 Images to FTP
Every guide about WordPress media offloading tells you why to do it. This one tells you exactly how, step by step, with the specific settings, the exact fields to fill in, and what to check at each stage. By the time you finish reading, you will have everything you need to go from zero to fully offloaded today.
Updated 2026
Practical How-To Guide

Every piece of content about WordPress media offloading covers the same ground: why your hosting server should not store image files, why S3 egress fees are expensive, why CDN delivery improves LCP scores. All of that is true and worth understanding. But at some point you have read enough analysis and you want to actually do the thing. You want to open the WordPress dashboard, install the plugin, connect it to a storage server, and watch your uploads directory empty out.
This guide is that guide. It covers the complete setup from start to finish: choosing and setting up your FTP storage server, choosing your CDN, installing and configuring WP FTP Media, running the bulk sync of your existing library, and verifying that everything is working correctly. The active configuration steps take roughly 15 minutes. The bulk sync of an existing library runs in the background and takes as long as it takes depending on library size and connection speed.
By the end of this guide, your WordPress media library will be on an FTP server, your images will be served via CDN, your hosting server’s uploads directory will be empty, and new uploads will automatically follow the same path. The entire ongoing cost will be a few dollars per month. Let us walk through it.
Before you begin: what you need
The complete setup requires three things: a WordPress site with admin access, a dedicated FTP or SFTP storage server, and a CDN account. The WordPress site you already have. The FTP server and CDN account take five to ten minutes to set up. Here is exactly what to get and where to get it.
For most WordPress sites, any of these providers works well. Sign up, choose a storage plan that gives you at least twice your current uploads directory size (to accommodate future growth), and note the connection credentials you receive: FTP/SFTP hostname, username, and password.
1TB for $6.00/mo
2TB for $9/mo
1TB for $9.99/mo
Your CDN will pull files from your FTP server and deliver them to visitors from edge nodes worldwide. Create an account, set up a pull zone with your FTP server’s web-accessible URL as the origin, and note the CDN subdomain or custom domain you receive. This becomes your CDN base URL in the plugin settings.
Global edge network
Zero egress with R2
Simple setup
FTP server signup and credential receipt: 5–10 minutes. CDN account setup and pull zone configuration: 5–10 minutes. Plugin installation and configuration: 10–15 minutes. Total active setup time: 20–35 minutes. The bulk sync of your existing library runs unattended in the background and is not included in this estimate.
Phase 1: Set up your FTP storage server (5–10 minutes)
Go to your chosen provider (Hetzner, IONOS, or Contabo) and sign up for a storage plan. Choose a plan that provides at least twice your current uploads directory size. If your uploads directory is 8GB, choose a 20GB or larger plan. The extra headroom accounts for future library growth.
After setup, you will receive three pieces of information: the FTP hostname (e.g., u123456.your-storagebox.de or similar), a username, and a password. Write these down or save them in your password manager. You will enter these into the plugin shortly. Also note whether the provider supports SFTP (encrypted transfer) in addition to FTP — SFTP is preferred for security.
For your CDN to pull files from your FTP server, the server needs to be accessible via HTTP or HTTPS, not just via FTP protocol. Most storage providers give you a web URL alongside the FTP credentials. For Hetzner storage boxes, this looks like https://u123456.your-storagebox.de/. Confirm you have this URL before proceeding to CDN setup.
Phase 2: Set up your CDN (5–10 minutes)
Sign up at BunnyCDN, add a pull zone, and set the Origin URL to your FTP server’s web-accessible URL (the HTTPS URL from Step 3). BunnyCDN will create a CDN hostname for your pull zone, which looks like your-zone-name.b-cdn.net. This CDN hostname is your CDN base URL. Alternatively, you can configure a custom subdomain like cdn.yourdomain.com pointing at the BunnyCDN hostname via a CNAME DNS record, which is recommended for production sites.
Your CDN base URL is what will replace the domain in your WordPress image URLs. It will be either your-zone-name.b-cdn.net or cdn.yourdomain.com if you set up a custom subdomain. Example: if your current image URL is https://yoursite.com/wp-content/uploads/2024/product.jpg, after offloading and setting the CDN base URL to cdn.yourdomain.com, it will become https://cdn.yourdomain.com/wp-content/uploads/2024/product.jpg. Write down or copy this URL exactly as you will enter it in the plugin.
Phase 3: Install and configure WP FTP Media (10–15 minutes)
Purchase and download WP FTP Media from NEXU WP. In your WordPress admin, go to Plugins → Add New → Upload Plugin, select the downloaded zip file, and click Install Now. Activate the plugin. A new menu item will appear in your WordPress admin sidebar.
Navigate to the WP FTP Media settings panel and open the Connection tab. Fill in these fields exactly:
Click the Test Connection button. The plugin will attempt to connect to your FTP server and verify write access. If the test succeeds, you will see a success confirmation. If it fails, double-check the hostname, port, username, and password. Common issues: incorrect port number (try 22 for SFTP or 21 for plain FTP), password copied with a trailing space, or firewall blocking the connection from your hosting server’s IP.

Open the URL tab in the plugin settings. This is where you configure CDN delivery.
Do not save yet. You will save after configuring the Upload tab in the next step.
Open the Upload tab and configure automatic upload behavior for new media.

Phase 4: Run the bulk sync (unattended background time)
Open the Sync tab. You will see your library scanned to show how many files are eligible for transfer. Choose Browser Mode for parallel transfers (faster, but requires keeping the browser tab open) or Background Mode (slower per file, but runs without a browser tab). For a library of 10,000 images, Browser Mode with parallel uploads is recommended as it completes significantly faster.
The progress view shows files transferred, files remaining, and any errors. A library of 10,000 images runs at approximately 100–400 files per minute depending on server speed and connection quality. Rough time estimates:

Phase 5: Verify and finalize (10 minutes)
Once the sync completes, visit several pages of your site — the homepage, a product page if you have WooCommerce, and a post with images. Right-click on any image and select “Open image in new tab” or use your browser’s developer tools (Network tab, filter by Images) to check the URL of each image. All image URLs should now show your CDN domain (e.g., cdn.yourdomain.com) rather than your hosting domain. If you see CDN URLs, the setup is working.
Once you have confirmed images are loading correctly from the CDN, go back to the Upload tab in the plugin settings and enable “Delete Local Copy After Upload.” Save. This setting applies to new uploads going forward. To remove the local copies of already-synced files, you can use the cleanup function if available, or delete the contents of your wp-content/uploads directory manually after confirming everything is on the FTP server.
Open the Monitor tab in the plugin. This screen shows the current connection status, system requirements check, and any warnings. All indicators should show green or passing status. If you see any warnings here, address them before relying on the automatic upload feature for new media. The Monitor tab is your ongoing health check screen, worth revisiting after any server changes.


Troubleshooting the most common setup issues
Most first-time setups complete without issues. When problems do occur, they almost always fall into one of these categories.
Check the port number first. SFTP uses port 22, FTP uses port 21. Some providers use non-standard ports — check your provider’s documentation. Second, verify the hostname does not have a trailing slash or extra spaces. Third, confirm that your hosting server’s outbound connections to the FTP server’s port are not blocked by a firewall. Contact your hosting provider if this is unclear.
This means the CDN is not finding the files at the expected path. Verify that the files were actually transferred to the FTP server before enabling URL rewriting. Open an FTP client (like FileZilla) and browse to your FTP server to confirm files exist at the paths matching the CDN URL structure. Also verify the CDN pull zone origin URL is correctly pointing at your FTP server’s web-accessible URL.
Browser mode sync requires keeping the browser tab open. If the tab is closed or the browser sleeps, the sync pauses. Re-open the sync tab and resume from where it stopped — the plugin tracks which files have already been transferred and continues from the last completed file, not from the beginning. For very large libraries, Background Mode avoids this issue.
Disable URL rewriting in the plugin settings. If local file deletion was enabled, re-sync from the FTP server back to your hosting server using an FTP client. Deactivate the plugin. Your site reverts to serving images from the hosting server. The database was never modified, so no database changes are needed to revert. This is the reversibility guarantee of the output-based rewriting approach.
What happens automatically from this point forward
Once the setup is complete and the bulk sync has finished, the workflow requires nothing further from you. Every new image uploaded through the WordPress Media Library is automatically transferred to your FTP server and deleted locally after transfer (if you enabled local deletion). Every page render rewrites image URLs to your CDN domain. Your hosting server’s uploads directory stays empty indefinitely.
Storage warnings from your hosting provider stop arriving. Backup jobs complete in minutes rather than hours. Site migrations take fifteen minutes rather than several hours. LCP scores improve as image requests are served from CDN edge nodes close to your visitors. All of these benefits are now running automatically in the background, from a configuration that took less time to set up than reading this guide.
If you want to verify that the system is continuing to work correctly after the initial setup, a quick check of the Monitor tab once a month is sufficient. According to WordPress’s plugin development documentation, well-built plugins are designed to run invisibly once configured correctly. That is exactly how this workflow is designed: configure once, benefit permanently.
You have everything you need to go from zero to fully offloaded today
WP FTP Media provides the connection, sync, URL rewriting, and automation that makes the 15-minute setup possible. FTP storage, CDN delivery, automatic uploads, and no database changes. Configure once and your WordPress media is offloaded permanently.

So I followed the guide and had everything up and running in about 20 minutes not the 15 they mentioned, but pretty close. the FTP part was straightforward, though the CDN setup had me second guessing myself a couple times. All good now, though! new uploads are going right to FTP like they're supposed to, and my uploads folder is actually staying empty for once. too soon to tell if it's faster, but so far it's doing exactly what it promised.
Hey everyone! I picked up this guide because I was drowning in podcast episode images (10,000+ files no joke) and that "15 minute setup" promise totally sold me. But man, the FTP part was way more complicated than I expected. Turns out you actually need an FTP server ready to go first, which I didn't have, and getting one set up took forever. Then the bulk sync? Took a full 12 hours on my decent internet not exactly the "set it and forget it" speed I was hoping for.
Finally a guide that just tells you what to do instead of explaining why. I followed the steps exactly and got my whole media library offloaded in under 20 minutes no fluff, no upsells, just clear instructions that actually work.