WooCommerce Detector | Bulk Store Qualification avatar

WooCommerce Detector | Bulk Store Qualification

Pricing

$3.00 / 1,000 website checkeds

Go to Apify Store
WooCommerce Detector | Bulk Store Qualification

WooCommerce Detector | Bulk Store Qualification

Check supplied websites for WooCommerce, WordPress and related technology signals. Export store-platform matches for agency and integration research. No product catalog, sales estimate or private checkout access.

Pricing

$3.00 / 1,000 website checkeds

Rating

0.0

(0)

Developer

Nick McNemar

Nick McNemar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Find WooCommerce signals in a domain list

WooCommerce Detector: Check supplied websites for WooCommerce, WordPress and related technology signals. Export store-platform matches for agency and integration research. No product catalog, sales estimate or private checkout access.

Start with a small example

  1. Open Input, switch to JSON and paste the example below. Replace the example startUrls with your own research targets when ready.
  2. Check the live Pricing tab and set a run spending limit.
  3. Run the Actor, then open the Workflow output view. Inspect url, matchesFilter, matchedTechnologies, cms, ecommerce, error.
  4. Export JSON for nested data or CSV for a spreadsheet. Review a small sample before increasing the scope.
{
"startUrls": [
"https://woocommerce.com",
"https://offermanwoodshop.com",
"https://barefootbuttons.com"
],
"filterTechnologies": [
"WooCommerce",
"MailChimp for WooCommerce",
"WooCommerce Blocks",
"Klaviyo for WooCommerce",
"WooCommerce PayPal Payments",
"WooCommerce Stripe Gateway"
],
"onlyMatching": false
}

At the rate checked September 9, 2026, 3 saved rows cost $0.009 in Actor event fees ($3.00 per 1,000 rows). Actual returned rows determine the event fee. Taxes and other account services may be separate.

What can I use it for?

  • Selling to WooCommerce merchants. Plugin and theme vendors, payment providers, shipping and 3PL services, managed-WordPress hosts and agencies all need lists of stores actually running WooCommerce. This makes one from any domain list.
  • Agency prospecting. Filter a city's or a niche's businesses down to the WooCommerce stores and approach them with a platform-specific offer.
  • Migration targeting. Find stores on ageing WordPress installs or without a modern page builder, or exclude WooCommerce sites to find merchants on other platforms.
  • Competitive and market research. Measure how much of a category runs on WooCommerce versus Shopify, and which payment and marketing plugins WooCommerce stores pair it with.
  • Enriching your CRM. Add an isWooCommerce column and the surrounding stack to a spreadsheet of accounts in one run.

What data does it return?

One record per website:

FieldMeaning
url, finalUrl, statusCode, titleWhat you asked for, where it resolved to, and the page title
matchesFiltertrue when the site runs any of the WooCommerce signals you listed
matchedTechnologiesWhich of those signals were found, e.g. ["WooCommerce", "MailChimp for WooCommerce"]
cmsWordPress for a match — with the version in technologies when the site exposes it
ecommerceWooCommerce, or whatever else the site runs
paymentProcessorsStripe, PayPal, Klarna and similar where visible on the storefront
analytics, tagManager, advertisingGoogle Analytics, GTM, Meta Pixel and others
marketingAutomation, liveChatMailchimp, Klaviyo, HubSpot, Tidio and similar
hosting, cdn, webServerInfrastructure behind the store
technologyCountTotal technologies detected
technologiesThe complete list with categories, versions and confidence scores
errornull on success, otherwise why the site could not be checked

Sites that time out or refuse the connection are still returned, with an error set, so your input and output line up one to one.

Illustrative output

Values explain the output shape; they are not a live result or guaranteed field coverage.

{
"url": "https://offermanwoodshop.com",
"finalUrl": "https://offermanwoodshop.com/",
"statusCode": 200,
"title": "Offerman Woodshop",
"matchesFilter": true,
"matchedTechnologies": ["WooCommerce", "MailChimp for WooCommerce"],
"cms": "WordPress",
"ecommerce": "WooCommerce",
"marketingAutomation": "MailChimp for WooCommerce",
"technologyCount": 11,
"technologies": [
{ "name": "WooCommerce", "categories": ["Ecommerce"], "version": "9.3.1", "confidence": 100, "website": "https://woocommerce.com" },
{ "name": "WordPress", "categories": ["CMS", "Blogs"], "version": "6.6.2", "confidence": 100, "website": "https://wordpress.org" }
],
"error": null
}

How to use it

  1. Paste your domains under Websites to check, upload a file, or pass them through the API as startUrls. Bare domains like example.com are fine.
  2. Leave WooCommerce signals to look for at its defaults unless you want a stricter or broader definition of a match.
  3. Decide whether to keep everything or only the hits. With Store only matching websites switched on, non-WooCommerce sites are still checked but not saved, so you pay only for the stores you wanted.
  4. Click Start and download the results as JSON, CSV or Excel from the Output tab, or read them from the dataset via the API.

Input example

{
"startUrls": [
"https://woocommerce.com",
"offermanwoodshop.com",
"https://barefootbuttons.com"
],
"filterTechnologies": ["WooCommerce"],
"onlyMatching": true
}

Raise Max concurrency for large lists. Turn on Proxy configuration only if some target sites block the platform's IP range — the vast majority do not.

How detection works

A WooCommerce store leaves unmistakable fingerprints on its first response: the woocommerce body classes and wc- script handles, /wp-content/plugins/woocommerce/ asset paths with the plugin version, the woocommerce_items_in_cart and wp_woocommerce_session_ cookies, and the WordPress markers underneath — wp-content, wp-includes, the generator meta tag. The detector fetches each homepage once and checks headers, cookies, HTML, script sources and meta tags against more than 7,600 technology fingerprints, adding implied technologies — WooCommerce implies WordPress and PHP — at a lower confidence so you can tell direct evidence from inference.

One rule keeps results honest: a platform is only reported when the evidence sits on the site's own domain, so a store that merely links to a WooCommerce site is not counted.

The fingerprint database is the open-source webappanalyzer technology dataset, used under the GNU GPL v3. The matching engine in this actor is original code.

Pricing

You pay per website saved to the dataset. With Store only matching websites on, that means per WooCommerce store found; with it off, per site checked. There are no subscriptions, seats or minimums, and you can cap the maximum spend of a run before it starts.

Scope and responsible use

The actor requests only the publicly served homepage of each URL you provide, exactly as a browser would. It requires no login, no cookies and no credentials, does not probe wp-admin, checkout or any other endpoint, does not add anything to a cart, does not crawl beyond the page you give it, and does not attempt to bypass any access control or bot-protection challenge. You are responsible for using the results in accordance with the laws that apply to you and the terms of the websites you check.

Limitations

  • Headless WooCommerce storefronts that serve a custom front end expose fewer signals and may be reported at lower confidence.
  • Security plugins that rename wp-content and strip version markers can hide the WordPress layer; WooCommerce is still usually visible through its own cookies and scripts.
  • Very large retail homepages that deliberately stall automated traffic can exceed the request timeout; they come back as rows with an error rather than being dropped.
  • Only the URL you supply is fetched; a shop living under /shop/ on an otherwise brochure site is found when you pass that path.

Something not detected?

Open an issue on this actor's Issues tab with the URL and what you expected. Include a reproducible input and the expected signal so the report can be investigated.

Interpret empty results and errors

A null technology field means no recognized signal was found in the inspected response; it does not prove absence. A returned error means that URL was not successfully analyzed. With onlyMatching: true, non-matches and errors are omitted from the dataset, so a zero-row result cannot distinguish an unavailable site from no matches. Start with onlyMatching: false when checking coverage.

Every saved row, including an error row, incurs the configured per-row event fee. Proxy selection and run duration can affect operating costs. Do not increase concurrency or enable a more expensive proxy merely to work around an unclear result.

For a reproducible problem, open this Actor’s Issues tab with a small public input, expected behavior and relevant error text. Remove tokens and confidential information. No response-time or uptime guarantee is offered.

Use the result in an automation

In Make or n8n, use the Apify integration to run this Actor with the same JSON input, wait for completion, then retrieve its default dataset. Route failed runs and error rows to a review step before sending valid results to your spreadsheet or CRM. Scheduling does not make these Actors emit only new records: deduplicate downstream using the source URL or record ID.

For Node.js, install the official apify-client package and set your own APIFY_TOKEN environment variable. The following example starts a paid run with a small spending limit.

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
"startUrls": [
"https://woocommerce.com",
"https://offermanwoodshop.com",
"https://barefootbuttons.com"
],
"filterTechnologies": [
"WooCommerce",
"MailChimp for WooCommerce",
"WooCommerce Blocks",
"Klaviyo for WooCommerce",
"WooCommerce PayPal Payments",
"WooCommerce Stripe Gateway"
],
"onlyMatching": false
};
const run = await client.actor('keystonelabs/woocommerce-store-detector').call(input, {
memory: 512, timeout: 180, maxTotalChargeUsd: 0.10
});
if (run.status !== 'SUCCEEDED') throw new Error('Run did not succeed: ' + run.id);
const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 100 });
console.log(items);

The first 100 rows are retrieved in this example. Use the dataset API pagination for a larger result. Keep credentials out of shared inputs and source files.

A useful next step

Understand the run at a glance

Open Run summary in Output for counts of unique URLs, analyzed responses, failures, matches and saved rows. It remains useful when onlyMatching produces an empty dataset. The summary is written at normal completion and does not add a billable dataset row. Failed or aborted runs may not have a final summary; check run status first. The summary contains counts only, not a second copy of scraped content.