The setup
Allbirds runs on Shopify with a fairly typical theme — multiple variants per product, color swatches, deep image galleries (front, side, back, sole, lifestyle), and US/EU/UK price/locale routing. It's a realistic stand-in for what most SMB-to-mid-market migrations look like.
The job: extract the full catalog into a format that can be replatformed to either another Shopify store or a fresh WooCommerce install, with images intact (not hot-linked) and full SKU/variant fidelity.
The run
- Installed the WooScraper extension in Chrome. Opened allbirds.com. Extension popup detected Shopify and offered a single “Start scrape” button.
- Backend received the first batch within 30 seconds, started enqueueing image downloads as products arrived — we don't wait for discovery to finish.
- Closed the browser tab after about two minutes. Job kept running on our side — the extension was only ever responsible for fetching with the user's session.
- Came back to the dashboard 30 minutes later, downloaded a single 134 MB ZIP and a Shopify-importable CSV.
What we hit along the way
This wasn't painless. We found and shipped fixes for eight production bugs during this single test, including:
- A silent Postgres parameter-limit bug when enqueueing image jobs for 1,000+ products — we now use a single INSERT…SELECT subquery instead of an array IN.
- A product-dedup query that matched on source_id alone, leaking products across jobs. Now scoped to (job_id, source_id).
- The image-zip worker was loading the entire images table per job. Filtered by job, capped at 1,000, OOM gone.
- Joins that pulled the raw jsonb column were blowing the Neon HTTP response size limit. Explicit column selection everywhere now.
- db.execute() returns jsonbas a JSON string — workers now parse defensively.
Every one of these was found here, fixed here, and ships with v2. See the changelog for the version that made all of this real.
What the export looked like
- products.csv— one row per product with image columns pointing at rehosted Blob URLs. WooCommerce and Shopify both auto-fetch those on import.
- variants.csv— 10,480 rows with full attribute matrix (color × size, with price/SKU per combination).
- images.zip— 2,643 successfully downloaded images (the other ~1,500 were Shopify CDN variants of the same source). Named {sku}-{n}.webp.
- reviews.csv— bundled, no upsell. No third-party review app was active so this came back empty for Allbirds, but the worker ran cleanly.
The honest disclaimer
We don't work with Allbirds and they didn't ask for this. This was a public, unauthenticated, anonymously-browsable storefront and we treated the request budget like a polite human shopper would — jittered delays, max three in flight, real-browser headers. We don't recommend using the tool against stores that have explicitly disallowed scraping or against private/login-gated catalogs.
Want to migrate a catalog this size?
The Large tier covers up to 10,000 products and includes images, variants, and reviews bundled. One-time payment, no subscription.