Export a WooCommerce store's products to CSV without a plugin (titles, prices, stock)
Short answer: many public WooCommerce shops expose products at /wp-json/wc/store/v1/products. Open that URL, page through, and convert the JSON to CSV. If the API is closed, collect /product/… URLs (often listed in /product-sitemap.xml) and copy title, price and stock from each page or from schema.org Product JSON-LD. For many shops at once, paste the storefront URLs into a product scraper on Apify and download one CSV. If it is your shop, use WooCommerce → Products → Export in wp-admin first; that is free and complete.
Who this is for
- Sellers building a competitor price sheet from WooCommerce shops.
- Agencies auditing a client's catalogue before a migration or redesign.
- Anyone who needs titles, prices and stock from a shop they do not admin.
This guide is WooCommerce-specific. For Shopify's /products.json path, see the related Shopify export guide below. Do not use these methods on marketplaces (Amazon, Flipkart, eBay).
Step 1: confirm it is a WooCommerce storefront
Before you spend time on the API, check a few public signals:
- Product URLs look like
/product/cotton-tee/or/product/cotton-tee/?attribute_pa_size=m. - Add-to-cart links include
?add-to-cart=123or a form that posts to?add-to-cart=. - Page HTML has classes such as
woocommerce,woocommerce-page,product,woocommerce-Price-amount,stock in-stock/out-of-stock. - The site answers at
/wp-json/(WordPress REST) and sometimes at/wp-json/wc/store/. - A product sitemap may exist at
/product-sitemap.xmlor under Yoast/Rank Math sitemaps (/product-sitemap1.xml, …).
None of these alone proves WooCommerce, but together they usually do. If you only see /collections/ and /products/… without WordPress paths, you are probably on Shopify — use the Shopify guide instead.
Step 2: try the public WooCommerce Store API (free, one shop)
- Take the shop homepage, for example
https://example-woo-shop.com. - Open
https://example-woo-shop.com/wp-json/wc/store/v1/products?per_page=100in your browser. - If you get a JSON array of products, you are done for the data side. Add
&page=2,&page=3until a page returns[]. - Paste the JSON into a JSON-to-CSV converter, or import it in Google Sheets / Excel / a small script. Keep at least:
id,name,permalink,prices(regular / sale / currency),is_in_stock,sku.
Prices in the Store API are often in the shop's minor units (paise, cents). Divide by 100 (or the currency's minor-unit factor) when you build the sheet. Currency code is usually in the same prices object.
Some shops disable the Store API, put it behind a firewall, or rate-limit it. If you get 401, 403, 404 or an HTML error page, stop forcing it. Move to Step 3 or drop the shop. Respect robots.txt and the shop's terms of service.
Useful Store API query tips
per_page=100is a common upper bound; if the server rejects it, tryper_page=50.orderby=id&order=asckeeps paging stable.- Category filter (when you only care about one range):
&category=12if you know the category id from/wp-json/wc/store/v1/products/categories.
Step 3: if the API is closed — product pages and sitemap
You can still build a CSV from public HTML when the API is off.
- Collect product URLs. Browse the shop or category pages and copy links that match
/product/…. Or open/product-sitemap.xml(or the Yoast/Rank Math product sitemap) and copy the<loc>URLs. Skip cart, checkout, account and?add-to-cart=action links — those are not product pages. - Open each product page. Copy the title (usually
h1.product_title), the price block (.woocommerce-Price-amountor.price), and the stock line (.stock). - Prefer structured data when present. View page source and search for
"@type":"Product". Many Woo themes output schema.org JSON-LD withname,sku,offers.price,offers.priceCurrencyand sometimesoffers.availability. That is cleaner than scraping CSS classes by hand. - Record one row per product in your sheet (see the example table below).
This is slow for hundreds of SKUs — that is when Step 5 (Apify) saves time. For five to twenty products it is fine and needs no account.
Step 4: the CSV layout (fake example data only)
| product_url | title | sku | regular_price | sale_price | currency | in_stock |
|---|---|---|---|---|---|---|
| https://example-woo-shop.com/product/cotton-tee-black/ | Cotton tee, black | TEE-BLK-M | 799 | 699 | INR | yes |
| https://example-woo-shop.com/product/canvas-tote/ | Canvas tote | TOTE-01 | 1199 | INR | no | |
| https://example-woo-shop.com/product/linen-shirt-blue/ | Linen shirt, blue | SHIRT-BLU | 1899 | 1899 | INR | yes |
- Keep the product URL as the stable key for week-on-week compares.
- Leave sale price blank when there is no sale, rather than copying the regular price twice unless you want that for formulas.
- Never edit a "raw" weekly tab after you paste it; add a new tab next week.
Step 5: many WooCommerce stores at once (Apify, no code)
Doing Steps 2–4 by hand for 10–50 competitor shops every week gets old. The no-code path:
- Create a free Apify account (no card needed for the free plan; see apify.com/pricing for current free monthly usage).
- Open Shopify & WooCommerce Product + Price Tracker (Unadhi's E-commerce Product Scraper on the Apify Store) and click Try for free. Current pricing is shown only on that Store page.
- Paste WooCommerce storefront or category URLs. Example input:
{
"startUrls": [
{ "url": "https://example-woo-shop.com" },
{ "url": "https://another-woo.example/product-category/tees/" }
],
"maxProductsPerShop": 200,
"maxListingPages": 15,
"includeDescription": false
}
Click Save & Start. When the run finishes, open Output / Dataset → Export → CSV.
How the Actor prefers sources (best first): Shopify products.json when present, then the WooCommerce Store API, then schema.org JSON-LD / microdata / OpenGraph on product pages. It checks robots.txt and scans public terms before fetching, and skips shops that forbid scraping — a SHOPS_SUMMARY row explains skips. It never logs in, never fetches Amazon/Flipkart/eBay, and never gets around blocks.
What not to do
- Do not hammer a shop with rapid page requests. Space manual checks; use a polite tool with delays if you automate.
- Do not ignore robots.txt or a terms page that forbids scraping. Drop that shop from your list.
- Do not treat this as legal advice. Public pages are generally visible, but rules differ by country and by each shop's contract with visitors.
- Do not use add-to-cart or checkout URLs as product rows.
This guide is general information, not legal advice. You are responsible for how you use the data and for following each shop's terms and your local law. The Apify Actors mentioned read only public pages, use an honest bot User-Agent, follow robots.txt, never log in and never get around blocks.
Related
- Export Shopify (or Woo) products to CSV — Shopify-first guide
- Build a weekly competitor price sheet (Apify, no code)
- Octoparse alternative for Shopify / WooCommerce product data
- Need a shop's public sales@ or support@ inbox? Related only: Website Contact Scraper: Emails, Phones & WhatsApp (also an Unadhi Apify product). Use for genuine one-to-one enquiries, not bulk cold email.
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.