Agent skill
ecommerce-by-techstack
Builds a list of online stores filtered by platform, category, installed Shopify apps, technologies, location, social presence and estimated traffic, sales or headcount bands with ScraperCity Store Leads ($0.0039 per lead, band filters applied server-side), intersects or excludes a second technology with Tech Stack Search ($4.99 per technology), keeps only stores with an email, validates them, tiers them by size and exports a CSV.
Filed under Pricing and packaging.
From scrapercity/gtm-skills · 31 skill entries · 0 · pushed 2026-11-02
What it does when it runs
Builds a list of online stores filtered by platform, category, installed Shopify apps, technologies, location, social presence and estimated traffic, sales or headcount bands with ScraperCity Store Leads ($0.0039 per lead, band filters applied server-side), intersects or excludes a second technology with Tech Stack Search ($4.99 per technology), keeps only stores with an email, validates them, tiers them by size and exports a CSV. Use when the user asks for "Shopify apparel stores using Klaviyo", "stores with Recharge", "WooCommerce stores in Germany", "ecommerce leads by tech stack", "DTC brands doing $50k a month", or "Shopify stores without Gorgias".
Automated analysis of the skill and the 12 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- SCRAPERCITY_API_KEY
- Hosts it reaches
- alexberman.com
- app.scrapercity.com
- apps.shopify.com
- aws.amazon.com
- blog.google
- datatracker.ietf.org
- emt.gartnerweb.com
- glockapps.com
- help.instantly.ai
- help.lemlist.com
- helpcenter.smartlead.ai
- knowledge.apollo.io
- knowledge.workspace.google.com
- leanb2bbook.com
- learn.microsoft.com
- publicsuffix.org
- scrapercity.com
- senders.yahooinc.com
- sendersupport.olc.protection.outlook.com
- substrate.office.com
- support.google.com
- support.microsoft.com
- techcommunity.microsoft.com
- u.yourdomain.com
- uribl.com
- www.apple.com
- www.bls.gov
- www.bmj.com
- www.crexi.com
- www.iso.org
- www.linkedin.com
- www.m3aawg.org
- www.rfc-editor.org
- www.shopify.com
- www.spamhaus.org
- www.surbl.org
- www.theregister.com
- www.twilio.com
- www.zerobounce.net
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It only issues instructions, so there is nothing to bound. - Actions present in the files
- None. Instructions only.
Ask about ecommerce-by-techstack
Opens your assistant with this page's recorded context. Check the linked sources before relying on it.
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/scrapercity/gtm-skills.git /tmp/gtm-skills git -C /tmp/gtm-skills sparse-checkout set "skills/list-building/ecommerce-by-techstack" mkdir -p ~/.claude/skills/ecommerce-by-techstack cp -R "/tmp/gtm-skills/skills/list-building/ecommerce-by-techstack/." ~/.claude/skills/ecommerce-by-techstack/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
Or take the whole library
This repo ships a .claude-plugin manifest, so Claude Code can install all 31 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.
/plugin marketplace add scrapercity/gtm-skills /plugin
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
Before you install: this skill will not complete its job on a bare agent. It needs SCRAPERCITY_API_KEY, which you have to obtain separately.
The skill
Source on GitHub ↗Reproduced in full from scrapercity/gtm-skills/blob/46d446143690c8048b17817aecf36990ea6880e5/skills/list-building/ecommerce-by-techstack/SKILL.md, which is licensed MIT (skill frontmatter). 2,943 words, 26 headings.
Ecommerce by Tech Stack
Overview
This skill produces a CSV of online stores that match a platform, a category and a tech stack, each with a validated email and a size tier, plus a report that shows the filters, the test pull, the tier bands, any Tech Stack Search intersection, the funnel and the cost.
It prevents three common failures with ecommerce lists:
- Pulling every Shopify store and filtering locally. Store Leads bills $0.0039 per lead returned; the visits, sales and employee band filters run server-side, so stores outside the band are never returned or billed. Filter in the call.
- Paying for the same page twice. Without
offset, repeat calls with the same filters return the same first page. Page withoffsetor the returnednextOffset. - Targeting on "has Klaviyo" and nothing else. A store with Klaviyo and $8,000 a month in sales cannot pay a $3,000 retainer. Tier by estimated sales or traffic so the offer and the store size match.
When to Use
- "Give me Shopify apparel stores that use Klaviyo and have an email, as a CSV."
- "Find subscription brands on Recharge doing over $100k a month."
- "WooCommerce stores in Germany with a phone number."
- "Shopify stores on Gorgias with an Instagram presence."
- "Stores that use Klaviyo but not Attentive" (exclusion).
Use a different skill when:
| The user wants | Use |
|---|---|
| People at ecommerce companies by title (VP Ecommerce, Head of Growth) across the Lead Database | icp-list-builder |
| The founder or marketing lead at a list of store domains | decision-maker-finder |
| The full market size before choosing a slice | tam-builder |
| A send-ready file carried through to the sequencer | cold-email-list |
| Validation of a store list they already have | email-list-cleaner |
Prerequisites
| Input | Why | Default if unknown |
|---|---|---|
| The offer and its monthly price | Sets the tier floor | Ask |
| Platform | platform filter; apps works on Shopify only | Shopify |
| Category | category filter | Ask; probe values with a 25-row test |
| Apps or technologies that qualify a store | apps (Shopify) or technologies | Ask |
| Apps or technologies that disqualify a store | Tech Stack Search exclusion | None |
| Country, state, city | countryCode, state, city | US |
| Target send-ready count | Sets totalLeads per tier | 1,000 |
| Suppression files | Current clients, past unsubscribes | None supplied; say so |
Authoritative Foundations
| Source | What it contributes here |
|---|---|
ScraperCity catalog (references/scrapercity-catalog.md) | Every scrape_store_leads parameter, the server-side band filters and their aliases, offset paging, apps being Shopify only, prices for Store Leads and Tech Stack Search. |
| scrapercity.com (per scrapercity.com) | 14M+ stores across 10 platforms: Shopify, WooCommerce, Magento, BigCommerce, Squarespace, Ecwid, OpenCart, Webflow, PrestaShop, Demandware. |
| Shopify plan pricing | Shopify Plus starts at $2,300 a month on a 3-year term or $2,500 on a 1-year term. A Plus store has budget; planExclude: ["Shopify Plus"] removes it when the offer is built for smaller stores. |
| Shopify App Store listings and reviews | Klaviyo (email and SMS), Recharge (subscriptions), Gorgias (helpdesk) are listed apps. An installed app tells you what the store already pays for. Each review shows the store name, country, time using the app and date, and the page filters by star rating, so 1 and 2 star reviewers of the app you replace become a named displacement list. |
| Alex Berman (alexberman.com) | Build the list after the offer, and test about 100 emails to one tight niche with one proven result. "Shopify apparel on Klaviyo at $50k to $250k a month" is a niche; "ecommerce" is a market. |
| Google, Yahoo, Microsoft sender rules | Store inboxes are often role addresses on Google Workspace or Microsoft 365. Validate before sending and keep complaints under 0.3%. |
Details and the routing table: references/framework-notes.md.
Workflow
1. Turn the offer into a tier floor
Ask what the offer costs per month and the affordability ratio the user wants: the store's estimated monthly sales as a multiple of the offer's monthly price. No published benchmark sets this ratio, so it is the user's input; set it from the sales of current clients. At the worked example's 20x, a $2,500 a month retainer implies a $50,000 a month sales floor for the core tier. Write the tiers as non-overlapping bands of minEstimatedMonthlySales and maxEstimatedMonthlySales (or visits, or employees). Band presets are in references/tiering-and-tech-intersection.md.
2. Pick a recipe and build the filters
Start from references/filter-recipes.md (recipes by seller type and by app). Always set emails: true for an email list and phones: true for a call list. Use apps only with platform: "shopify"; for other platforms use technologies. Every parameter, its type and its behavior is in references/store-leads-parameter-guide.md.
3. Probe values with a 25-row test
The catalog documents platform and category as case-insensitive strings and apps and technologies as strings, with no list of allowed values. Run the draft with totalLeads: 25 ($0.0975). Read the returned category, apps and technologies columns, and copy the exact app or technology name you see into the filter. A 25-row result under 25 rows means the universe for those filters is that small; widen.
4. Size each tier and confirm the cost
There is no count endpoint for Store Leads. Plan each tier's totalLeads from the target, plus headroom for validation and dedupe losses: use the loss share from the user's last comparable pull, or validate the 25 probe emails ($0.04) and use that share, then replace it with the first tier's actual loss. Cost ceiling = sum of totalLeads x $0.0039, plus $4.99 per Tech Stack Search technology, plus validation at $0.00169 per email. Run check_wallet, show the table and wait for a go-ahead.
5. Pull each tier with offset paging
One run per tier, same filters, different band. For a tier larger than one run, page: offset: 0, then the nextOffset the response returns (or the previous offset plus totalLeads). If a run is cancelled, restart with resumeFromLead. Set fileName per tier so list_runs and the dashboard show it.
6. Intersect or exclude with Tech Stack Search
Store Leads takes one apps and one technologies string per call, and has no "not installed" filter. For a second required technology, or to exclude stores using a competitor, run scrape_builtwith once per technology ($4.99 flat), normalize the returned domains, and join on domain:
| Goal | Join |
|---|---|
| Stores with app A and technology B | Store Leads apps: A rows whose domain is in the B domain list |
| Stores with app A but not B (for example Klaviyo without Attentive) | Store Leads apps: A rows whose domain is not in the B list |
| Flag a signal without filtering (subscription brands) | Add uses_<tech> = true for domains in the list |
| Stores unhappy with the app you replace | Match 1 and 2 star App Store reviewers from the review window the user sets to the competitor-app pull on store name key plus country; flag unhappy_with_<app> and send them first |
Procedure and domain normalization: references/tiering-and-tech-intersection.md sections 5 and 6.
7. Normalize, dedupe, suppress, validate
Normalize domains and emails per references/list-quality-standard.md. Drop platform-host domains (*.myshopify.com when a custom domain exists). Dedupe on domain, then on email (one brand can run several storefronts with one inbox). Apply suppression. Validate every email with validate_emails. Store emails are often role addresses (hello@, team@); keep them, with is_role set, and never pitch a support@ address, which reaches the helpdesk queue.
Then open 20 random rows and record one line: store live (the domain opens a working storefront), category fit, qualifying app visible on the site, sales band plausible for what the site shows, each as "N of 20". Two or more misses on one check means a filter value is wrong: re-probe and re-pull rather than deleting rows.
8. Add named contacts where the founder no longer reads the inbox
Small stores (E3, T3 and T4) are founder-run: the role inbox is enough. From T2 up, add up to 2 named people per store with the title ladder in references/tiering-and-tech-intersection.md section 7: on Growth, the Lead Database by companyDomain costs nothing extra; on Starter, Website Finder with jobTitle: "Founder" ($0.0499 per contact found) on T1 and T2. Validate every named email. Send the named contact first; the role inbox waits in a hold file.
9. Deliver, hand off, refresh
One CSV with a tier column, a hold file for catch-all and unknown, and the report from templates/output-template.md. Sequencer handoff: one campaign per tier, custom variables store_name, category, the qualifying app, any uses_<tech> or unhappy_with_<app> flag and the contact's first name (a role inbox reads "Hi {{store_name}} team"). Re-validate any row whose email_validated_at is older than 30 days before it sends; next month, continue each tier from its saved nextOffset and refresh the technology flags. Run scripts/check-output.py.
ScraperCity Implementation
Tools and prices (from references/scrapercity-catalog.md)
| Step | Tool | Price |
|---|---|---|
| Balance | check_wallet | Free |
| Store pull | scrape_store_leads | $0.0039 per lead |
| Second technology, exclusion | scrape_builtwith (Tech Stack Search) | $4.99 per technology |
| Validation | validate_emails | $0.00169 per email |
| Named contact | scrape_website_finder | $0.0499 per contact found |
| Named contact (Growth plan) | query_lead_database with companyDomain | Included |
Store Leads call with every filter family
{
"platform": "shopify",
"category": "apparel",
"apps": "Klaviyo",
"countryCode": "US",
"state": "California",
"emails": true,
"phones": false,
"instagram": true,
"tiktok": true,
"planExclude": ["Shopify Plus"],
"minEstimatedMonthlySales": 50000,
"maxEstimatedMonthlySales": 249999,
"minEstimatedMonthlyVisits": 20000,
"minEmployeeCount": 2,
"maxEmployeeCount": 50,
"totalLeads": 500,
"offset": 0,
"fileName": "shopify-apparel-klaviyo-ca-t2"
}
Not every call needs every filter; each one narrows the result. technologies takes a technology name string for non-Shopify platforms (for example "platform": "woocommerce", "technologies": "Klaviyo"). city, facebook, youtube, linkedin, twitter and pinterest work the same way as their siblings above. Aliases: visitsMin, visitsMax, salesMin, salesMax, employeesMin, employeesMax.
CLI: npx scrapercity store-leads takes platform, country, category, city, technologies, apps, total-leads, name and the emails, phones, instagram, facebook, tiktok, youtube and linkedin switches in package 1.0.17. The band filters, state, planExclude, offset, twitter and pinterest are MCP and REST only: POST https://app.scrapercity.com/api/v1/scrape/store-leads with the JSON body above.
Tech Stack Search call
{"technology": "Recharge", "fileName": "techstack-recharge-20261013"}
Returns the domains detected using that technology, for $4.99 per technology. The list covers all websites, not only stores, so always join it to a Store Leads pull.
Worked cost estimate
Shopify apparel stores in the US using Klaviyo with an email, three sales tiers, target about 1,150 send-ready, Recharge flagged.
| Line | Units | Unit price | Cost |
|---|---|---|---|
| 25-row value probe | 25 leads | $0.0039 | $0.10 |
| Tier 1 pull, sales $250,000 and up | 212 leads (universe smaller than the 300 requested) | $0.0039 | $0.83 |
| Tier 2 pull, $50,000 to $249,999 | 600 leads | $0.0039 | $2.34 |
| Tier 3 pull, $20,000 to $49,999 | 700 leads | $0.0039 | $2.73 |
| Tech Stack Search, Recharge | 1 technology | $4.99 | $4.99 |
| Validation after dedupe and suppression | 1,461 emails | $0.00169 | $2.47 |
| Total | $13.46 |
Show the ceiling first (requested 1,625 leads x $0.0039 = $6.34, plus $4.99, plus up to 1,625 x $0.00169 = $2.75 validation, $14.08) and wait for a go-ahead.
Errors
| Code | Action |
|---|---|
| 402 | check_wallet, report the shortfall, offer fewer tiers. |
| 409 | Same filters submitted moments ago; reuse the earlier run. |
| 429 | Wait 30 seconds, retry once. |
| Run returns 0 rows | A filter value is spelled differently in the data. Remove apps or category, rerun 25 rows, read the values. |
Output Format
stores-[segment]-[date].csv:domain,store_name,platform,category,apps,technologies,country,state,city,est_monthly_visits,est_monthly_sales,employees, social flags,email,is_role,email_status,email_validated_at,tier,uses_<tech>andunhappy_with_<app>flags,review_note,source = store_leads,source_detail,pulled_at. Valid emails only.stores-[segment]-[date]-contacts.csv: one row per named person (domainas the join key,first_name,last_name,title,email,email_status,contact_source), so a store with two contacts stays one store row.stores-[segment]-[date]-hold.csv: catch-all and unknown, plus role inboxes held behind a named contact.- Report from
templates/output-template.md: target, filters, value probe, tier bands, Tech Stack Search and review flags, funnel, validation, named contacts, cost, sample rows with the QA line, next steps with the sequencer handoff.
What the reader receives is the deliverable only: product names (Store Leads, Tech Stack Search, Email Validator, Website Finder, Lead Database), never tool ids, internal file paths or reference section numbers; filter parameter names appear only in the Filters Used table, where the user needs them to rerun the pull; another skill is named only in a handoff line; no tables of checks that were not run (one "Not checked:" line instead); no repeated identical rows; no legal commentary.
Quality Check
- Every filter name exists in the
scrape_store_leadsschema, andemails: trueis set for an email list. -
appsappears only withplatform: "shopify". - A 25-row probe ran and the app and category values match what the data returned.
- Tier bands do not overlap and each tier was pulled with server-side band filters.
- Every multi-page tier used
offsetornextOffset; no page was bought twice. - Tech Stack Search lists were joined on normalized domains and each technology cost $4.99.
- Main CSV is 100%
email_status = valid; 0 duplicate domains; suppression applied. - Funnel adds up and the tier counts sum to the send-ready total.
- The QA line reads "N of 20" for store live, category fit, app visible and band plausible, with no check under 18 of 20.
- Tiers from T2 up show named-contact coverage (stores with a named valid email) and the method used; T3 and lower may run on role inboxes.
- The report names products, not tool ids or file paths, and carries no legal commentary.
-
scripts/check-output.py report.mdprints PASS.
Common Pitfalls
| Mistake | Why it fails | Fix |
|---|---|---|
| Filtering size after the pull | Billed for every store outside the band | Band filters in the call; they run server-side |
Repeating a call without offset | Same first page returned and billed again | offset 0, then nextOffset |
apps on WooCommerce | apps is Shopify only | technologies for other platforms |
| Guessing app names ("klaviyo-email") | 0 rows or partial matches | 25-row probe, copy the name from the data |
Two apps in one apps string | Behavior with several values is not documented | One app per call; intersect with Tech Stack Search |
| Using Tech Stack Search alone as the list | Returns every website using the tech, stores or not, with no email | Join to Store Leads on domain |
No planExclude for an SMB offer | Plus stores have procurement and agencies on retainer | planExclude: ["Shopify Plus"] |
Sending to support@ with a sales pitch | Goes to a support team that tags it spam | Prefer hello@, info@ or a founder; tailor copy to "your team" |
| One sequence for all tiers | A $20k a month store and a $500k store need different proof | Sequence per tier |
| Quoting the sales estimate in the first line | Estimates are modeled; a wrong number tells the founder the email is automated | Use the estimate to tier; cite the installed app or a visible gap on the site |
| Role inbox only at a $500k a month store | Larger stores route hello@ to support staff, who do not buy | Named contact from the Lead Database or Website Finder for T1 and T2 |
Execution Artifacts
| File | Open it when |
|---|---|
references/framework-notes.md | You need the source behind a rule or which file to open. |
references/store-leads-parameter-guide.md | Writing any scrape_store_leads call: every parameter, alias, paging, value probing. |
references/filter-recipes.md | Choosing filters by seller type, vertical or app. |
references/tiering-and-tech-intersection.md | Setting tier bands from the offer, joining Tech Stack Search lists, exclusions, the App Store review flag, named contacts by tier. |
references/list-quality-standard.md | Normalization, dedupe, validation buckets (shared). |
references/deliverability-primer.md | Sending to role inboxes on Google Workspace and Microsoft 365 (shared). |
references/scrapercity-catalog.md | Prices and schemas (shared). |
references/scrapercity-platform.md | Plans and the Ecommerce Database (shared). |
references/scrapercity-agent-patterns.md | Wallet, polling, retries (shared). |
templates/output-template.md | Writing the report. |
examples/worked-example.md | A finished report for Shopify apparel stores using Klaviyo. |
scripts/check-output.py | Final gate: python3 scripts/check-output.py report.md. |
Related Skills
icp-list-builderfor people-first lists at ecommerce companies.decision-maker-finderfor founders and marketing leads at the store domains.tam-builderto size every store in a category before choosing tiers.cold-email-listandemail-list-cleanerto carry the file to a sequencer.cold-email-copywritingfor tier-specific copy that cites the installed app.scrapercity-apifor REST loops over many tiers or countries.
Files bundled with it
These load only when the skill asks for them, so they cost nothing until it runs.
Other skills for the same job
Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.
- ecommerce-returns by sidchaudhary · 6
- ecommerce-funnel-optimizer by Ad-Superpowers · 5
- ga4-ecommerce-setup by Ad-Superpowers · 5
Need help setting it up?
This page tells you what ecommerce-by-techstack does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.