DEV Community

Feedsmith
Feedsmith

Posted on

How to find Shopify stores that use Klaviyo (a cheap Wappalyzer/BuiltWith alternative in Python)

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")
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"], "...": [] }
}
Enter fullscreen mode Exit fullscreen mode

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

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)