DEV Community

Hapol Data
Hapol Data

Posted on

How to find WooCommerce, Wix, Squarespace and BigCommerce stores in any niche

If you sell plugins, migrations, design work or wholesale products to small online shops, you start by building a list of real stores in your niche, on the platform you serve. Most tools and tutorials cover Shopify. Lists of WooCommerce, Wix, Squarespace and BigCommerce stores are harder to put together.

This guide covers:

  1. The manual method (free): search footprints, then a check of each site's public endpoints. You can reproduce every check below with curl.
  2. The automated method: Hapol Data's WooCommerce, Wix, Squarespace & BigCommerce Store Leads actor on Apify, which runs the same checks on a whole list.

Disclosure: I build these actors as Hapol Data.


Step 1: Pick narrow niche keywords

Broad terms ("clothing") return marketplaces, blogs and directories. Narrow ones ("handmade ceramics", "beeswax candles", "dog treats") are more likely to surface small independent stores. Write down 5–10 narrow variations before you start.

Step 2: Find candidates with platform footprints

Each platform leaves traces in its URLs. Combine your keyword with a footprint in a search engine:

Platform Footprint Why
WooCommerce "handmade ceramics" "add to cart" inurl:/product/ WooCommerce product pages live under /product/ by default
Wix "handmade ceramics" inurl:/product-page/ Wix Stores product pages use /product-page/
Squarespace "handmade ceramics" inurl:/p/ Squarespace product URLs look like /shop/p/<product> (see the real example below). It's a noisy footprint.
BigCommerce "handmade ceramics" "bigcommerce" Weak footprint, so verification matters most here

Footprints are noisy. Expect blogs, marketplaces and sites that only mention a platform. Step 3 filters those out.

A note on free alternatives: when our actor searched Bing for "handmade ceramics" (1 results page per query), it found 8 candidate sites and 0 confirmed stores. Plain keyword searches without footprints mostly surface non-stores.

Step 3: Verify the platform, and that it's really a store

These checks are all public: the same requests a browser makes. We ran each one against a real store while writing this guide (Oct 9, 2026).

WooCommerce: the public Store API. If this returns product JSON, it's a live WooCommerce store:

curl -s "https://coraandspink.com/wp-json/wc/store/v1/products?per_page=2"
Enter fullscreen mode Exit fullscreen mode

Trimmed result:

Leamington Elephant T-Shirt   price "3200"  GBP  (minor unit 2 → £32.00)
Pouch Potato                  price "2200"  GBP  (→ £22.00)
Enter fullscreen mode Exit fullscreen mode

Tip: prices come in minor units (pence or cents). Divide by 10^currency_minor_unit.

Wix: a response header, then the store sitemap.

curl -sI "https://259-283-2952.wixsite.com/website" | grep -i x-wix-request-id
#  x-wix-request-id: 1791592598.0131...
curl -s -o /dev/null -w "%{http_code}\n" "https://259-283-2952.wixsite.com/website/store-products-sitemap.xml"
#  200  → Wix Stores is publishing products
Enter fullscreen mode Exit fullscreen mode

Squarespace: assets, then product pages in the sitemap.

curl -s https://www.shopmemor.com | grep -o static1.squarespace.com | head -1
#  static1.squarespace.com
curl -s https://www.shopmemor.com/sitemap.xml | grep -o "<loc>[^<]*/p/[^<]*" | head -1
#  <loc>https://www.shopmemor.com/shop/p/christian-casas-x-memor-phone-case-...
Enter fullscreen mode Exit fullscreen mode

BigCommerce: the CDN, then the XML sitemap.

curl -s https://www.bulkapothecary.com | grep -o cdn11.bigcommerce.com | head -1
#  cdn11.bigcommerce.com
curl -s -o /dev/null -w "%{http_code}\n" https://www.bulkapothecary.com/xmlsitemap.php
#  200
Enter fullscreen mode Exit fullscreen mode

A site on the right platform with no public products is a website, not a store. Drop it if you only want merchants.

This is fine for a dozen sites. Past that, it's slow.

Step 4: Automate it with the Store Leads actor

The Store Leads actor runs steps 2–3 for every site:

  1. Open the actor on Apify Store and click Try for free (free Apify account).
  2. Add keywords, a list of domains, or both.
  3. Choose Platforms (e.g. only wix).
  4. Set Max stores, and optionally a max cost per run.
  5. Start the run.

Here's the exact domain-list input we ran for this guide:

{
  "domains": ["coraandspink.com", "www.bulkapothecary.com", "www.shopmemor.com",
              "https://259-283-2952.wixsite.com/website", "cipherskincare.com",
              "brodo.com", "ugmonk.com", "example.com"],
  "platforms": ["woocommerce", "bigcommerce", "wix", "squarespace"],
  "roleEmailsOnly": true,
  "includeNonStores": true
}
Enter fullscreen mode Exit fullscreen mode

The run summary it produced:

Done: 6 stores saved; 6/8 checked sites were confirmed stores (0 blocked, 1 Shopify skipped).
Enter fullscreen mode Exit fullscreen mode
Domain Platform Confirmed store? Evidence Products
coraandspink.com WooCommerce yes Store API 15
cipherskincare.com WooCommerce yes Store API 16
brodo.com WooCommerce yes Store API 53
bulkapothecary.com BigCommerce yes product sitemap 3,134
shopmemor.com Squarespace yes product pages in sitemap 35
259-283-2952.wixsite.com/website Wix yes store-products sitemap 82
ugmonk.com Shopify not charged (Shopify is handled by a separate actor) – –
example.com none no – –

(Run locally from the actor's source code on Oct 9, 2026. Store data changes, so your numbers will differ.)

Choosing a discovery method (keyword mode):

  • Your own domain list gives the best hit rate. Export one from a directory, an exhibitor list or your CRM.
  • Google (default) uses the footprint queries above through Apify's Google Search Scraper, billed to your own Apify account. Check current pricing on the Google Search Scraper page.
  • Bing is free but best-effort. In our run above it found 0 stores.

Step 5: Read the results

A real WooCommerce record from that run:

{
  "domain": "coraandspink.com",
  "platform": "woocommerce",
  "platformSignals": ["html:wc-plugin-assets", "html:woocommerce-class", "html:wc-blocks", "api:wc-store-v1"],
  "storeConfirmed": true,
  "storeEvidence": "woocommerce-store-api",
  "storeName": "Cora + Spink",
  "productCount": 15,
  "currency": "GBP",
  "priceMin": 17,
  "priceMax": 89,
  "priceAvg": 38.07,
  "priceSampleSize": 15,
  "topCategories": ["Utility Bags", "Best Sellers", "New Stuff", "Tote Bags", "T-Shirts"],
  "socials": {
    "facebook": "https://facebook.com/coraandspink",
    "instagram": "https://instagram.com/coraandspink",
    "tiktok": "https://tiktok.com/@coraandspink",
    "youtube": "https://youtube.com/coraandspink"
  },
  "emails": ["info@coraandspink.com"],
  "phones": [],
  "checkedAt": "2026-10-10T00:35:58.250Z"
}
Enter fullscreen mode Exit fullscreen mode

And a real BigCommerce record. Notice it has no price fields, because BigCommerce doesn't publish prices through a public endpoint we use:

{
  "domain": "bulkapothecary.com",
  "platform": "bigcommerce",
  "platformSignals": ["html:cdn11.bigcommerce", "header:link-bigcommerce", "html:stencil"],
  "storeConfirmed": true,
  "storeEvidence": "bigcommerce-products-sitemap",
  "storeName": "Bulk Apothecary",
  "productCount": 3134,
  "productCountSource": "sitemap",
  "socials": { "facebook": "https://facebook.com/BApothecary", "instagram": "https://instagram.com/bulkapothecary",
               "pinterest": "https://pinterest.com/BulkApothecary", "tiktok": "https://tiktok.com/@bulk_apothecary" },
  "emails": [],
  "phones": ["+18887287612"]
}
Enter fullscreen mode Exit fullscreen mode

What you get depends on the platform:

Field WooCommerce BigCommerce Wix Squarespace
Product count exact (Store API) from sitemap from sitemap from sitemap
Currency, price range, top categories yes – – –
Socials, public emails/phones yes yes yes yes

In our 6-store run, only 1 store published an email address on the pages checked (base mode). Many small stores offer only a contact form. enriched: true also reads up to two contact/about pages (extra per-store charge).

What it costs

The actor charges per confirmed store, with an extra per-store charge in enriched mode. Non-stores, other platforms, Shopify and blocked sites are free. With Google discovery, the Google Search Scraper pages are billed separately on your own account. Check current pricing on the actor page.

What about Shopify?

Shopify has its own public endpoints (/products.json, /meta.json), so I publish a separate actor for it: Shopify Store Leads. The two don't overlap. In the run above, ugmonk.com was detected as Shopify, and the record says so, but it wasn't charged.

Use the data responsibly

This method collects only what stores publish on their own pages, and by default keeps only role addresses (info@, hello@, sales@). Before contacting anyone, check the rules for you and your recipients: GDPR/UK GDPR and PECR in Europe, CAN-SPAM in the US, CASL in Canada. You may need a lawful basis or consent, a clear sender identity and an easy opt-out. This isn't legal advice.

Summary

  • Narrow keywords plus platform footprints give you candidates.
  • Public endpoints (the WooCommerce Store API, Wix/Squarespace/BigCommerce sitemaps) tell you whether a candidate is a real store. Every check above can be reproduced with curl.
  • For more than a handful of sites, Hapol Data's Store Leads actor runs both steps, and you're charged only for confirmed stores.

Hapol Data: Web Data. Automated.

Top comments (0)