Shopify Multi-Store Vendor & Type Comparison
Pricing
from $20.00 / 1,000 comparison rows
Shopify Multi-Store Vendor & Type Comparison
Compare vendors and product-type coverage across permitted storefront public feeds. For Shopify competitive assortment planners. Check the live Pricing tab and input limits.
Pricing
from $20.00 / 1,000 comparison rows
Rating
0.0
(0)
Developer
Practical AI Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Compare the public product feeds of two or three Shopify stores by published vendor, product type, or vendor + type. Every result comes with explicit disclosures about how much of each catalog was actually sampled, so you can judge how far to trust the numbers.
What it does
For each store the Actor checks robots.txt, then reads the public /products.json feed in pages of 250 products, up to your per-store cap. It then groups the sampled products and outputs one row per group showing, for every store:
- number of sampled products and share of that store's sample
- median, lowest and highest "lowest variant price" per product
- share of products with at least one available variant
- a
lowSampleflag when a store has fewer than 5 products in the group
Each group row also reports how many stores carry the group, which store leads by sampled product count (empty on ties), and the median price gap between stores.
A separate store_coverage row per store reports products sampled, pages read, whether the sample was truncated, distinct vendor/type counts, and the share of products with blank vendor or type.
Example input
{"stores": ["store-one.example.com", "store-two.example.com"],"groupBy": "vendor","maxProductsPerStore": 500,"minGroupProducts": 3,"maxGroups": 50,"requestDelaySecs": 1}
Replace the placeholder domains with real Shopify store domains you are allowed to analyze.
Example output (shape)
{"recordType": "group_comparison","groupBy": "vendor","groupName": "Acme","totalProductsInSamples": 42,"storesWithGroup": 2,"presentInAllStores": true,"leadingStore": "store-one.example.com","medianPriceGapPct": 18.4,"perStore": [{"store": "store-one.example.com", "products": 30, "shareOfSamplePct": 6.0,"medianLowestVariantPrice": 24.0, "lowestPrice": 9.0, "highestPrice": 80.0,"availableSharePct": 86.7, "lowSample": false}],"samplingNote": "Counts describe only the sampled feed products ..."}
(Values above illustrate the structure only; they are not real results.)
Limitations and sample-size caveats
- Sample, not census. Only the first products in feed order are read, up to your cap (max 2000 per store). Feed order is not random, so shares can be biased when a catalog is larger than the cap. Truncated stores are flagged
possiblyTruncated: true. - Different sample sizes per store make "leading store" comparisons about the sample, not about real catalog size.
- Small groups are noisy. Medians from fewer than 5 products are flagged
lowSample; treat them as anecdotal. - Currency is not in the feed. Prices are shown in each store's own unlabeled currency and are not converted. The price gap is only meaningful if the stores sell in the same currency.
- Published vendor/type labels are merchant-entered. Spelling variants beyond letter case and spacing are treated as different groups, and blank values appear as
(not published). - Hidden, unpublished or password-protected products are not in the public feed. Some stores disable the feed, block it in
robots.txt, or redirect to another host; these are reported as errors and skipped. - The Actor does not measure sales, traffic, or demand. Product counts are not revenue.
- A page shorter than 250 products is treated as the end of the feed; a store that silently serves smaller pages could be reported as complete when it is not.
Safety and compliance
- Only
httpsstore domains are accepted. IP addresses, credentials, custom ports, local/internal hostnames, and domains resolving to non-public addresses are refused. - Redirects are followed only within the same host.
robots.txtis honored and fails closed if it cannot be verified.Crawl-delayis respected (capped at 10 seconds).- Requests are sequential, delayed, size-limited and time-limited. No proxies, logins, or personal data are used. The feed's vendor and product fields describe products, not people.
- You are responsible for ensuring your use of the data complies with each store's terms and applicable law.
Billing
The code emits a pay-per-event style event named comparison-row, once per output group row, after the rows are stored. Store coverage rows and failed runs are never charged. No payable plan or price is configured in this repository; pricing must be set separately in the platform after review.
Local development
Tests are fully offline (no network, no Apify platform required for the test suite):
python -m unittest discover -s tests -t .
Project layout: src/validation.py (input and URL safety), src/fetcher.py (robots and paging), src/analysis.py (grouping and statistics), src/main.py (Actor entry point).