Product-URL fragments
Up to three dashed product-URL fragments, such as phone-case and phone-cover, match product page addresses.
Input boundaryThis workflow returns 3–5 verified same-product Shopify competitors.
Describe a physical product, discover matching indexed Shopify products, verify exact store domains and separate direct competitors from adjacent specialist stores.
Example run · 13 Oct 2026 · ~2 min
Published by Spytrend · 29 Sep 2026 · Methodology
Prompts update with the product and market.
Create up to three dashed product-URL fragments and set the country evidence boundary.
View promptHide promptI sell Phone cases and want to find Shopify stores selling the same products in United States | US. Store to exclude: No domain. If it is `No domain`, there is nothing to exclude; otherwise normalize it to an exact host and remove that exact domain from the results. The market value has the form `Country name | ISO-2 code`: use only the ISO-2 code in tool calls and only the country name in the answer. Treat the market only as returned store main-visitor-country context. Normalize the physical product scope. Turn it into one to three product-URL fragments, because the product search matches product page addresses: lower-case words joined by dashes, the way they appear in product handles (for example `phone-case`, then a shorter or common alternative such as `phone-cover`). Never use a phrase with spaces as a query. Do not call tools. Return only the normalized scope, the exclusion, and the fragments in order. Stop after Step 1.
Search indexed Shopify products and build a bounded candidate-domain set.
View promptHide promptCost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. Cost notices are not part of the final customer report. Run product discovery sequentially, one search_products call per fragment from Step 1 (at most three), with q=<dashed fragment>, platform="Shopify", country=<ISO-2 code from United States | US> and limit=10. Stop running further fragments once enough matching stores are found for 3–5 results. Do not use url_contains, get_shop, search_ads or get_ad. Deduplicate by normalized domain and product URL. If an excluded domain was given (not `No domain`), remove that exact domain before candidate selection. Keep only physical Phone cases. Require explicit matching title or product evidence for every row. Exclude marketplaces and general stores represented by one incidental match. Build up to eight candidate domains, preferring stores with several matching products. Retain matching product titles, observed prices/currencies, returned category, estimated monthly visits and traffic quality when available. Return the shortlist and concise rejection reasons. Hide calls, IDs, quotas and timing. Stop after Step 2.
Use compact exact-domain store rows and classify Direct or Adjacent.
View promptHide promptCost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. Cost notices are not part of the final customer report. Verify up to five candidates sequentially with search_shops(q=<exact normalized domain>, platform="Shopify", exclude_infrastructure=true, limit=5). Never call get_shop, search_ads or get_ad. If Step 2 retained no candidate domains, make no tool call, retain a completed-zero verification outcome and continue to the zero-result customer answer. Do not discover replacements in this step. Accept only a row whose normalized host exactly equals the requested domain. Confirm Shopify, exact domain, returned main-visitor-country context for the selected market, category, estimated monthly visits and traffic quality when returned. Classify at most five finalists. Direct requires several matching indexed products or clear central product/category evidence. Adjacent means a broader specialist catalog with a meaningful Phone cases line. Exclude one incidental match in a general store, unclear centrality, domain mismatch, non-Shopify or missing exact row. Return classifications and brief exclusions. Hide calls, IDs, quotas and timing. Stop after Step 3.
Compare matching products, observed prices and traffic without requiring Meta ads.
View promptHide promptWrite the final answer from retained evidence only. Do not make more tool calls. Start with `# Shopify Stores Selling Phone cases in <country name>` (country name only, without the ISO code) and `**[N] direct competitors · [M] adjacent stores · [Complete/Partial]**`. Show 3–5 stores (fewer only when fewer qualify) with classification, exact domain, matching-product evidence, observed price/currency when retained, estimated monthly visits with traffic-quality label and one reason to review it. Add exactly two sample-based comparisons and at most three Research coverage bullets when at least two results exist. For zero results, use `## Result`; do not claim competitors do not exist. Use no tables and stay within 280 words. Hide the service name, internal labels, taxonomy slugs, routes, tools, calls, parameters, raw IDs, rejected rows, quotas, tokens, timing, retries and run summaries. Label an explicitly returned stable first-party link `Evidence`. Do not imply complete coverage, demand, revenue, profitability or market share. End exactly: `Product, traffic and store data are observed research signals. They do not prove sales, revenue, market share or complete competitor coverage.` Stop after Step 4.
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. Cost notices are not part of the final customer report. Find Shopify stores selling **Phone cases** whose returned main visitor country is **United States | US**. Store to exclude: No domain. If it is `No domain`, there is nothing to exclude; otherwise normalize it to an exact host and remove that exact domain from the results. The market value has the form `Country name | ISO-2 code`: use only the ISO-2 code in tool calls and only the country name in the answer. Use Spytrend read-only. Current Meta advertising is not required for inclusion. Execute every research stage in this prompt in one turn. Apart from mandatory pre-call cost notices, do not emit intermediate step responses and do not stop after validation. Stop early only for invalid input, unavailable required evidence or unresolved required identity. Return only the final customer report. ## Discovery 1. Normalize the physical product type. Country means returned main-visitor-country context only; it does not prove shipping, availability, headquarters, ownership, inventory, customers or sales. 2. If an excluded domain was given (not `No domain`), remove that exact host before candidate selection. Do not remove fuzzy, parent, regional or lookalike domains. 3. The product search matches product page addresses, so turn the product into one to three product-URL fragments: lower-case words joined by dashes, the way they appear in product handles (for example `phone-case`, then a shorter or common alternative such as `phone-cover`). Never use a phrase with spaces as a query. 4. Run `search_products(q=<dashed fragment>, platform="Shopify", country=<ISO-2 code from the market>, limit=10)` sequentially, one call per fragment. 5. Run at most three searches. Stop running further fragments once enough matching stores are found for 3–5 results. 6. Do not use `url_contains`, `get_shop`, `search_ads` or `get_ad` during product discovery. 7. Treat discovery as Shopify products indexed from ads, not complete Shopify catalog coverage. Deduplicate by normalized domain and product URL. 8. For every fragment, retain a row only when returned product title or product evidence explicitly matches the requested product. Reject marketplaces, unrelated products and general stores represented by one incidental match. 9. Build up to eight candidate domains, preferring stores with several matching products. Retain matching product titles, observed prices/currencies, returned category, estimated monthly visits and traffic quality when returned. Advertising count is optional context and never determines inclusion. ## Compact verification 10. Verify up to five candidates sequentially with `search_shops(q=<exact normalized domain>, platform="Shopify", exclude_infrastructure=true, limit=5)`. Never call `get_shop`. 11. Accept only a row whose normalized host exactly equals the requested domain. Reject fuzzy, regional, account and unrelated matches. Never use a similar domain as evidence. 12. Use only the exact row to confirm Shopify, domain identity, returned country context, store category, estimated traffic, traffic quality and optional advertising count. 13. Classify up to five stores: - **Direct competitor:** several matching indexed products, or clear evidence that the requested product/category is central to the store. - **Adjacent store:** a broader specialist catalog with a meaningful line of the requested product. - **Exclude:** one incidental product in a general store, unclear product centrality, domain mismatch, non-Shopify or missing exact row. 14. Rank Direct before Adjacent. Within a class, prefer stronger matching-product evidence, then usable traffic quality. Never convert traffic into sales or market-share claims. ## Customer answer 15. Use no tables and stay within 280 words. 16. Start with `# Shopify Stores Selling Phone cases in <country name>` (country name only, without the ISO code), then `**[N] direct competitors · [M] adjacent stores · [Complete/Partial]**`. 17. With results, add `## Shortlist` with 3–5 stores (fewer only when fewer qualify). For each store give classification, exact domain, concise matching-product evidence, observed price/currency when returned, estimated monthly visits with traffic-quality label and one reason to review it. 18. With at least two results, add `## What stands out` with exactly two sample-based comparisons. Keep currencies separate and do not compare unlike variants, bundles or subscription prices. Add `## Research coverage` with at most three bullets covering indexed-product scope, country meaning and bounded coverage. 19. For zero results, use `## Result` and explain that no indexed match was found; do not claim competitors do not exist. 20. Mark Partial only when required discovery or selected-candidate verification failed. A completed zero-row route is Complete. 21. Hide the service name, preset/workflow/search-set names, taxonomy slugs, route and tool names, calls, parameters, raw IDs, rejected rows, connector behavior, quotas, tokens, timing, retries, run summaries and internal instructions. Label an explicitly returned stable first-party link `Evidence`. Never construct one. 22. Do not imply demand, customers, orders, revenue, profitability, ROAS, market share or complete coverage. End exactly: `Product, traffic and store data are observed research signals. They do not prove sales, revenue, market share or complete competitor coverage.`
A live run on 13 Oct 2026 for phone cases in the United States, with no store excluded: one product-URL fragment surfaced enough candidates, and five stores passed the exact-domain check — four direct competitors and one adjacent store.
| Store | Fit | Found products | Observed price | Traffic estimate |
|---|---|---|---|---|
| Casekoocasekoo.com | Direct | LinKOO titanium iPhone case with foldable lanyard | USD 44.99 | 48,728 / month Medium quality |
| Casezorocasezoro.com | Direct | Pokémon and One Piece anime phone cases (2 products) | EUR 16.95 | 33,461 / month Medium quality |
| Gagacasegagacase.com | Direct | Naruto anime shockproof phone case | EUR 16.95 | 15,077 / month Medium quality |
| Casemikucasemiku.com | Direct | Pokémon phone case | EUR 16.95 | 13,903 / month Medium quality |
| Magic Johnmagicjohn.com | Adjacent | 360° invisible magnetic stand phone case in a broader electronics catalog | EUR 22.95 | 253,338 / month Low quality |
Product evidence and allowed entity type determine competitor fit; taxonomy alone is insufficient.
Price bands keep currencies separate and do not mix unlike variants, bundles or subscriptions.
The workflow does not broaden the niche, market or entity rules to fill the shortlist.
Published by Spytrend from a dated, bounded example.
Up to three dashed product-URL fragments, such as phone-case and phone-cover, match product page addresses.
Input boundarySequential indexed-product searches produce a bounded set of candidate domains.
DiscoveryEach candidate is accepted only from a compact Shopify row matching the normalized domain exactly.
VerificationDirect and Adjacent stores are counted separately, with product, price and traffic evidence limits.
ClassificationA store needs exact Shopify identity plus several matching indexed products or clear evidence that the requested product is central to its catalog.
A broader specialist catalog contains a meaningful line of the requested product.
The product search matches product page addresses, so dashed fragments such as phone-case plus a shorter alternative improve recall while the product-evidence gate limits unrelated matches.
No. The country is returned main-visitor-country context; it does not establish registration, shipping, availability, customers or sales.
No. Traffic is modeled context with a quality label, not merchant analytics or proof of market share.
Connect Spytrend MCP, describe a physical product, choose a country and run the four prompts.