Most marketing channels read your feed straight from its public URL, but some merchants and marketplaces want the file delivered to a server they control — over FTP or SFTP. CTX Feed can do that for you automatically: every time a feed regenerates, the plugin pushes the finished file to the remote server you configure. This guide shows how to set up FTP/SFTP upload for a feed, field by field, and how to confirm the connection works before you rely on it.
FTP delivery is configured per feed on the FTP / SFTP tab of the Make Feed screen, so different feeds can go to different servers.
When you need FTP upload
Reach for FTP/SFTP delivery when a channel or partner cannot pull the file from a URL and instead asks you to drop it into a directory on their (or your) server. Typical cases:
- A marketplace or price-comparison site that ingests files from a folder you upload to.
- A partner who gives you FTP credentials and a target path.
- Your own CDN or static host, where you want the feed to land in a specific directory.
If your channel accepts a feed URL (Google Merchant Center, Meta Commerce Manager, Pinterest, and most others do), you do not need FTP — just submit the feed URL from Manage Feeds. Use FTP only when delivery to a server is required.
Before you start
You will need, from the server’s owner or your hosting control panel:
- The host (a hostname like
ftp.example.comor an IP address — noftp://prefix). - The port (21 for FTP, 22 for SFTP by default).
- A username and password (for SFTP this can be a key passphrase).
- The absolute remote directory where the file should land (for example
/var/www/html/wp-content/uploads/feeds). The directory should already exist on the server; if it doesn’t, the file is uploaded to the server’s root folder instead.
Your server also needs the matching PHP transport module: the ftp extension for FTP, or the ssh2 extension for SFTP. CTX Feed detects these. If neither is available, the FTP / SFTP tab shows a message asking you to have your host enable the module — contact your hosting provider in that case.
Configure FTP or SFTP for a feed
- Go to CTX Feed → Manage Feeds, then open the feed you want to deliver (click its name), or start a new feed with Make Feed.
- Open the FTP / SFTP tab.
- Turn on Upload after every generation. This is the master switch — while it is off, the feed still generates and stays at its public URL, but nothing is pushed anywhere. Turning it on reveals the configuration cards.
- In the Server card, choose the Protocol: FTP (unencrypted) or SFTP (encrypted, over SSH). Prefer SFTP unless the merchant only accepts plain FTP. When you switch protocol, CTX Feed updates the default port for you (21 for FTP, 22 for SFTP) unless you have set a custom one.
- Enter the Host (hostname or IP, with no protocol prefix) and confirm the Port.
- For FTP only, set the Transfer mode: Passive works behind most firewalls and is the right choice in almost every case; only pick Active if the server specifically requires it. (SFTP has no transfer mode, so this control is hidden for SFTP.)
- In the Credentials card, enter the Username and Password (or key passphrase for SFTP). The password is encrypted before it is stored, so it is never saved in plain text. Use the eye icon to reveal what you typed if you need to check it.
- In the Destination card, enter the Remote directory as an absolute path that starts with
/(relative paths and~do not work). CTX Feed previews exactly where the file will land — for example/home/user/public_html/feeds/products.xml— so you can confirm the target before saving. - Save the feed.
From now on, every scheduled auto-update and every manual Regenerate writes the feed file and then uploads it to that directory, overwriting the previous copy so the remote file always matches your live catalog.
The file is uploaded under its final name, never under a temporary name that is renamed afterwards, so servers that pick up a file as soon as it arrives (Google Merchant Center’s SFTP, for example) always receive the real feed name. While the upload runs, the live log under the feed on Manage Feeds shows a line such as Uploading via SFTP… 46% (20 MB of 43 MB), and the run only shows Complete! once the upload has finished. The feed’s log file records the progress too (Uploading… 30% (13 MB of 43 MB), then Uploaded 43 MB in 2m 10s.).

- Upload after every generation — the master switch; turn it on to push the file to a server after every run.
- Server — the protocol (FTP or SFTP), host, port, and (FTP only) transfer mode.
- Credentials — the username and password; the password is stored encrypted.
- Destination — the absolute remote directory, with a preview of exactly where the file will land.
- Connection test — sends a 1 KB test file and deletes it to confirm the settings work.
Test the connection first
Before you depend on automatic delivery, use the Connection test panel on the right of the FTP / SFTP tab:
- Fill in all of the server and credential fields (host, port, username, password, and an absolute path). The test button stays disabled and tells you what is still missing until every field is complete.
- Click Test connection. CTX Feed uploads a tiny 1 KB file to the directory and immediately deletes it, so nothing is left behind.
- A green Connected result confirms the credentials, port, and path all work. A Test failed result means the server could not be reached or the login/path was rejected — fix the flagged values and try again.
The test always runs against the values currently on the form, not the last saved ones, so you can adjust a field and re-test without saving in between. Any edit to a server field clears the previous result so you are never looking at a stale “Connected”.
Troubleshooting
- “Warning! PHP ssh2 extension is not enabled…” (or the same for the ftp extension). Your host is missing that PHP extension. Ask your hosting provider to enable it, or switch to the protocol whose module is available (the tab warns you per protocol).
- Test fails with the right password. Double-check the Host has no
ftp:///sftp://prefix, the Port matches the protocol (21 for FTP, 22 for SFTP), and — for FTP behind a firewall — that Passive mode is selected. - “Must be an absolute path.” The remote directory has to start with
/. Connect over SSH and runpwdin the target folder to find the full path, and make sure the directory already exists. - The file landed in the server’s root folder. The remote directory doesn’t exist or the path is wrong, so the upload fell back to
/. Create the folder or correct the path, then regenerate. - File does not appear on the server. Confirm Upload after every generation is on, then Regenerate the feed. The upload runs at the end of generation, so the file must finish building first.
- Google Merchant Center reports a file ending in
.part. CTX Feed 8.0.32 and 8.0.33 uploaded over SFTP under a temporary.partname first, and Google’s SFTP server processes every file the moment it arrives. Update CTX Feed to 8.0.34 or later, then Regenerate the feed: the file now goes straight to its final name. - The upload takes a long time. A large feed can take many minutes to upload on a slow connection; the progress line on Manage Feeds shows how far it has got. If your channel can fetch a feed URL instead (Google Merchant Center’s scheduled fetch can), that avoids the upload entirely.
- Feed not regenerating on schedule. FTP delivery only happens when the feed regenerates. If scheduled runs are not firing, see the cron guide below.
Related guides
- Fix auto feed update not working
- How to export and import product feed configuration
- How to increase your PHP memory limit and execution time
- Manage Feeds
