Some of the most valuable software is not a large platform or a sophisticated product. Sometimes it is a focused script that removes hours of repetitive work.
I encountered exactly that situation while helping someone move an established Etsy shop to WooCommerce. The catalogue data was manageable: Etsy could export titles, descriptions, prices, and SKUs as a spreadsheet. The product images were the difficult part.
Each listing could contain up to ten images. The export included links to those images, but WooCommerce needed local files arranged so they could be associated with the correct products. Downloading, renaming, and sorting hundreds of images manually would have been slow and error-prone.
That was a good candidate for automation.
Turning the migration into a clear workflow
Before writing code, I reduced the task to a small set of rules:
- Read either a CSV or Excel export
- Use the product SKU as the folder name
- Download every available image from
IMAGE1throughIMAGE10 - Keep the image order intact
- Avoid overwriting data when SKUs are duplicated
- Continue processing when an individual download fails
The implementation used Python, pandas, requests, and the standard file system library:
The code is small because the problem is well bounded. That is an advantage, not a limitation.
The edge cases that mattered
The first version could have downloaded images successfully and still produced an unreliable migration. A few details made the difference.
Missing image columns
Not every listing uses all ten image slots. Checking pd.isna() means an empty cell is treated as expected input rather than an error.
Duplicate SKUs
Etsy permits duplicate SKUs. A migration that assumes uniqueness can silently overwrite an earlier product directory. Adding a timestamp preserves both sets and makes the conflict visible for review.
Network failures
External image requests can time out or return an error. A timeout and raise_for_status() prevent the script from waiting indefinitely or saving an error response as if it were an image.
Repeatable naming
Keeping names such as IMAGE1.jpg and IMAGE2.jpg preserves the original ordering. Predictable output also makes the next import step easier to automate.
Running the migration
After installing the dependencies, the workflow is intentionally simple:
The script creates one output directory named after the source file. Inside it, every product receives its own SKU directory with images in their original order.
The result is easy to inspect before import. That inspection step is important: automation should reduce manual work without removing the opportunity to verify the output.
The engineering lesson
This was not a complex technical challenge. It was a practical one.
The value came from understanding the real workflow, identifying the failure cases, and producing an output format that matched the next system. Those same principles apply to much larger integration projects:
- Model the process before choosing the technology
- Make assumptions explicit
- Preserve traceability between source and destination
- Handle partial failure without losing completed work
- Keep the operating instructions simple
The script is available on GitHub:
EtsyShopExportImagesDownloader
It solves one specific problem and stays out of the way. In my experience, that is often what good internal tooling should do.
