Mazen Alsenih
Home
Skills
Blog
Projects
Products
Contact

Mazen Alsenih

Senior Full Stack Developer crafting exceptional digital experiences with modern technologies and best practices.

Remote · Germany
Let's Work Together

Quick Links

  • Home
  • Skills
  • Blog
  • Contact

Connect

LinkedIn
Connect professionally
GitHub
View my code
Xing
Professional network
X (Twitter)
Follow my thoughts
© 2026 Mazen Alsenih•Made with and lots of ☕
Site actively maintained
Built withNext.js•TypeScript•Tailwind CSS•MDX
How I Effortlessly Migrated My Etsy Listings to WooCommerce

How I Effortlessly Migrated My Etsy Listings to WooCommerce

February 27, 2024

It started with a request from someone close to me.

She had been running a successful Etsy shop for a couple of years — handmade products, dozens of listings, each with up to ten product photos. Business was growing and the time had come to expand to her own WooCommerce store. More control, better margins, no platform fees eating into every sale.

The product data part was manageable. Etsy lets you export your listings as a CSV — titles, descriptions, prices, SKUs, everything. WooCommerce has importers for that. A few hours of cleanup and it would be done.

Then we looked at the images.


The Problem Nobody Warns You About

Etsy's CSV export includes image URLs, not the images themselves. Columns IMAGE1 through IMAGE10, each holding a CDN link to a photo hosted on Etsy's servers. When you migrate away from Etsy, those links eventually break — you can't rely on Etsy's CDN to serve your images on a competing platform indefinitely.

WooCommerce needs the actual image files, organised in a way that the product importer can match them to the right SKU.

So there we were, looking at a spreadsheet with hundreds of rows and up to ten image columns each. The manual approach: click each URL, save the file, rename it, put it in the right folder, repeat. For every. Single. Product.

I opened my laptop and started writing Python instead.


The Solution: 80 Lines of Python

The logic turned out to be straightforward once I thought it through:

  1. Read the Etsy CSV (or Excel export, since some Etsy exports come as .xlsx)
  2. For each row, grab the SKU value
  3. Create a folder named after that SKU
  4. Download each IMAGE1 through IMAGE10 URL into that folder
  5. Handle edge cases gracefully — missing images, duplicate SKUs, failed downloads

Here's the core of what I ended up with:

The duplicate SKU handling was a small but important detail — Etsy actually allows duplicate SKUs in a shop, which means a naive script would overwrite folders. Appending a timestamp to the folder name makes each one unique while keeping them traceable.

The pd.notna() check skips empty image columns silently, so products with only three photos don't throw errors because IMAGE4 through IMAGE10 are blank.


Running It

With the dependencies installed:

And the Etsy CSV in the project folder, you run:

The script creates a directory — named after your CSV file — containing one subfolder per SKU. Each subfolder holds the downloaded images named IMAGE1.jpg, IMAGE2.jpg, and so on.

The output when it runs looks like this:

Downloaded https://i.etsystatic.com/.../photo1.jpg to SKU-001/IMAGE1.jpg Downloaded https://i.etsystatic.com/.../photo2.jpg to SKU-001/IMAGE2.jpg Downloaded https://i.etsystatic.com/.../photo1.jpg to SKU-002/IMAGE1.jpg ... All images have been downloaded.

A few minutes later, you have your entire image library locally — organised exactly as WooCommerce expects it.


What I Learned from a Sunday Afternoon Script

This whole thing took a couple of hours including testing. What struck me was how often a very targeted, unglamorous script can save someone a genuinely painful amount of time.

No framework. No API. No cloud service. Just pandas, requests, and some file system logic. The kind of thing a developer can throw together quickly and then hand off to someone who's never opened a terminal — as long as the instructions are clear.

That's the part I find most satisfying about this kind of tool: it removes a bottleneck for someone who has real work to do, and then it quietly disappears.

If you're doing an Etsy → WooCommerce migration and need the same thing, the script is open source and free to use:

EtsyShopExportImagesDownloader on GitHub

Clone it, drop in your CSV, and run. The README covers everything you need.


Questions about the script or running into a CSV format it doesn't handle? Open an issue on the repo or get in touch — happy to help.

Mazen Alsenih

Written by

Mazen Alsenih

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