If you sell anything to e-commerce brands (an app, an agency service, an integration), your best leads are
stores that already run the stack you plug into. "Shopify stores that use Klaviyo" is the classic example: they
have an email budget, and they already pay for SaaS.
BuiltWith and Wappalyzer answer "what technology is this website using?", but their lead lists are priced
for bigger teams. This post shows a small pay-as-you-go alternative: give it a list of domains, get back the
technologies each site runs, keep the matches. It costs $0.02 per site analysed, and failed sites are free.
What you need
- Python 3.9+ and
requests - A free Apify account. The monthly free credit covers a few hundred sites. Copy your API token from Console > Settings > API & Integrations.
- A list of domains, one per line (a CSV export from anywhere works)
The script
The detector runs as a hosted Apify Actor. Apify's
run-sync-get-dataset-items endpoint starts it, waits for it to finish and returns the results as JSON in a
single HTTP call, so there is no SDK to install:
import csv, os, requests
REQUIRED = {"Shopify", "Klaviyo"}
domains = [d.strip() for d in open("domains.txt") if d.strip()]
resp = requests.post(
"https://api.apify.com/v2/acts/feedsmith~tech-stack-detector/run-sync-get-dataset-items",
params={"timeout": 300},
headers={"Authorization": f"Bearer {os.environ['APIFY_TOKEN']}"},
json={"urls": domains, "technologies": sorted(REQUIRED), "maxConcurrency": 10},
timeout=330,
)
resp.raise_for_status()
sites = resp.json()
matches = [s for s in sites if s["status"] == "ok" and REQUIRED <= set(s["technologyNames"])]
with open("matches.csv", "w", newline="") as f:
w = csv.writer(f)
w.writerow(["domain", "final_url", "title"])
w.writerows([s["domain"], s["finalUrl"], s.get("title") or ""] for s in matches)
print(f"{len(sites)} sites analysed, {len(matches)} run both Shopify and Klaviyo")
The technologies input makes the Actor report only the technologies you care about, so each record stays
small. Leave it out and you get everything it detects: CMS, analytics, ad pixels, payment providers, CDN,
hosting, JavaScript frameworks and more, from about 7,600 fingerprints.
Real run
I ran it on 13 well-known direct-to-consumer brands:
$ python find_shopify_klaviyo.py
13 sites analysed, 4 run both Shopify and Klaviyo -> matches.csv
www.glossier.com
kyliecosmetics.com
www.taylorstitch.com
www.tentree.com
Most of the other nine are on Shopify too, but Klaviyo wasn't visible in their HTML. That is the main caveat,
covered below.
A full record (without the technologies filter) looks like this, trimmed:
{
"domain": "www.allbirds.com",
"status": "ok",
"httpStatus": 200,
"technologyNames": ["Apple Pay", "Cloudflare", "Google Tag Manager", "HSTS", "HTTP/3",
"Open Graph", "PayPal", "Priority Hints", "Shopify", "..."],
"categorySummary": { "Ecommerce": ["Shopify"], "Payment processors": ["Apple Pay", "PayPal"], "...": [] }
}
Where the domain list comes from
The detector checks a list you already have. It does not discover stores for you. Common sources:
- Exports from your CRM, a conference exhibitor list or a partner directory
- Search results you've already collected for your niche ("organic skincare", "running gear", ...)
- Customers of a competitor, from their public case-study pages
Run the list through the script once, then again every month to catch stores that switched platforms.
How accurate is it?
I validated it on 28 sites with a publicly known platform: it identified the platform on 16 of the 20 where
there was an unambiguous answer. The misses are informative:
-
Signals that only exist after JavaScript runs. The detector reads the HTML and HTTP headers, like
curl, not a headless browser. A chat widget or email tool injected later by Google Tag Manager won't show up. That's why Klaviyo is missing on some Shopify stores above. - Sites that block non-browser clients return a challenge page with few signals.
The upside of skipping the browser is speed and price: about 20 sites in 35 seconds on Apify, which is why it can
charge $0.02 a site.
Cost
| Sites | Price |
|---|---|
| 100 | $2 |
| 1,000 | $20 |
Sites that fail (dead domain, timeout) aren't charged. With onlyMatchingSites: true, sites that don't match your
technologies filter are neither saved nor charged.
Links
- Actor page (full input/output docs): https://apify.com/feedsmith/tech-stack-detector
- Runnable examples repo: https://github.com/ankaibua-spec/feedsmith-examples
- Fingerprints: the GPL-licensed enthec/webappanalyzer database (the open-source continuation of Wappalyzer's). The Actor is GPL-3.0 too. It isn't affiliated with Wappalyzer or BuiltWith.
Disclosure: I built this Actor. This article was drafted with AI assistance (Claude); every command, number and output above comes from real runs on 2026-09-18.
Top comments (0)