If you run an online store with external suppliers, you probably know this routine: your supplier updates their inventory, drops a CSV or XML file on an SFTP server, and you need to download it, review it, and import it into Shopify, WooCommerce, or whatever platform you use. Every day. Sometimes multiple times a day.
Miss a download, and you risk selling products that are out of stock. Download too late, and your prices are wrong for hours. The file is always there, waiting on the server. The bottleneck is you remembering to go get it.
How supplier feeds actually work
The typical ecommerce supply chain relies on flat files. Your supplier's ERP or inventory system exports a file containing current stock levels, prices, product descriptions, and availability. This file lands on an SFTP server, either theirs or a shared one.
The format is almost always CSV (comma-separated values), though some suppliers use XML or Excel files. A typical feed includes columns like SKU, product name, quantity on hand, wholesale price, retail price, weight, and category.
The frequency varies. Dropshippers with fast-moving inventory update hourly. Wholesalers with stable stock might update once a day, usually early morning. Some suppliers maintain a single file that gets overwritten; others create timestamped files like inventory_2026-04-15.csv.
What usually goes wrong
The feed itself is straightforward. The problems start with how people handle the download:
- Forgotten downloads. You open FileZilla at 9am, grab the file, import it. But Tuesday you had a meeting at 9 and forgot. By noon, 12 orders went out for products the supplier had already marked as unavailable.
- Format surprises. The supplier changes their CSV delimiter from comma to semicolon, or adds a new column. Your import breaks and you don't notice until a customer complains about a wrong price.
- Multiple suppliers. You work with three suppliers, each with their own SFTP server, their own schedule, their own file format. Logging into three different servers every morning is exactly the kind of task that slips.
- Time zone mismatches. Your supplier in Asia updates their feed at 2am your time. By the time you download it at 9am, it's already seven hours stale.
The script approach (and its limits)
Technical store owners sometimes set up a cron job with sftp or lftp on their Mac to automate the download. It works, until it doesn't:
- No notifications when a download fails. It just silently stops.
- No UI to check status or history. You're grepping log files.
- Credentials stored in plaintext config files on disk.
- If the server changes its host key, the script hangs waiting for confirmation.
For a developer, this is manageable. For a store owner who should be focused on product and sales, it's a maintenance burden that shouldn't exist.
Automating it with FTPull
FTPull is a Mac menu bar app that monitors an FTP, SFTP, or FTPS server and downloads new files automatically. Here's how it fits the ecommerce feed workflow:
- Add your supplier's SFTP connection. Hostname, port, username, password (or SSH key). FTPull stores credentials in macOS Keychain, not in a config file.
- Point to the remote folder where your supplier drops the feed file.
- Choose a local folder on your Mac where you want the files to land. This could be your desktop, a dedicated "Supplier Feeds" folder, or a folder that your import tool watches.
- Set the polling interval. Every 15 minutes for fast-moving inventory. Every hour for daily feeds. FTPull checks the server on schedule and only downloads files that are new or modified.
- Add a file filter if needed. Only download
.csvfiles, or only files matching a pattern. Ignore temp files or backups the supplier leaves on the server.
Once enabled, FTPull runs silently in your menu bar. When a new feed file appears on the server, it downloads automatically and you get a macOS notification. No FileZilla, no terminal, no forgetting.
Multiple suppliers, one app
If you work with several suppliers, add each as a separate connection in FTPull. Each connection has its own server, credentials, remote folder, local folder, and polling schedule. They run independently.
Supplier A drops a CSV every morning at 6am on their SFTP. Supplier B updates an XML feed every 4 hours on a shared server. Supplier C overwrites a single file throughout the day. FTPull handles all three without any interaction from you.
What to do with the downloaded files
FTPull handles the transport. What happens after the file lands on your Mac depends on your setup:
- Manual review and import. Open the CSV in Excel or Numbers, check for anomalies, then upload to your store platform manually. This is the safest approach when you're getting started.
- Shopify apps. Tools like EZ Inventory, Stock Sync (syncX), or Matrixify can watch a local folder or accept scheduled uploads. FTPull drops the file, the app picks it up.
- WooCommerce plugins. Import plugins like WP All Import or WebToffee can process CSVs on a schedule.
- Custom scripts. If you have a Python or Node script that transforms the supplier CSV into your platform's format, point it at the FTPull output folder.
Security considerations
Supplier feeds often contain wholesale pricing, stock levels, and product data you don't want exposed. Always use SFTP (port 22) rather than plain FTP. SFTP encrypts everything, including your credentials.
If your supplier offers SSH key authentication, use it. It's more secure than passwords and eliminates the risk of credential interception. FTPull supports both password and key-based authentication.
FTPull stores all credentials in macOS Keychain, which is encrypted and protected by your Mac's login password. No plaintext files sitting on your disk.
When FTPush comes in
Some workflows go the other direction. If you're the supplier and need to push updated feeds to your retailers' servers, FTPush handles the upload side. Drop your export file into a watched folder, and FTPush uploads it to the retailer's SFTP server automatically.
Together, FTPull and FTPush (bundled as FTPSuite) cover both directions of the ecommerce feed exchange.