MMazen AlsenihSenior full stack developer
ExperienceExpertiseProductsBlogContact
View CV

Mazen Alsenih

Building clear, resilient software for complex environments.

Germany-based

Navigate

ExperienceExpertiseBlogProducts

Connect

LinkedInGitHubXingX

© 2026 Mazen Alsenih. All rights reserved.

Privacy policy
Automating an Etsy to WooCommerce Image Migration

Field note

Automating an Etsy to WooCommerce Image Migration

How I turned a repetitive Etsy image migration into a small, reliable Python workflow, including the edge cases that mattered and the engineering lessons behind the solution.

February 27, 2024

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:

  1. Read either a CSV or Excel export
  2. Use the product SKU as the folder name
  3. Download every available image from IMAGE1 through IMAGE10
  4. Keep the image order intact
  5. Avoid overwriting data when SKUs are duplicated
  6. 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.

Mazen Alsenih

Written by

Mazen Alsenih

Back to blog posts
#Python#WooCommerce#Etsy#Automation#E-Commerce