Shopify product workflow4 prompts · controlled inputs

Find Shopify competitors selling the same products.

This 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.

5stores shortlisted

Example run · 13 Oct 2026 · ~2 min

Published by Spytrend · 29 Sep 2026 · Methodology

Run in order

A 4-step same-product competitor workflow

Prompts update with the product and market.

Define the product

Create up to three dashed product-URL fragments and set the country evidence boundary.

View promptHide prompt
Prompt 01
I 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.
Discover indexed products

Search indexed Shopify products and build a bounded candidate-domain set.

View promptHide prompt
Prompt 02
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.
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.
Verify exact stores

Use compact exact-domain store rows and classify Direct or Adjacent.

View promptHide prompt
Prompt 03
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.
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.
Write the customer answer

Compare matching products, observed prices and traffic without requiring Meta ads.

View promptHide prompt
Prompt 04
Write 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.
Use the complete workflow in one promptAll evidence rules in one copyable promptView promptHide prompt
Complete workflow
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.`
Example output

Stores with documented phone-case product evidence.

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.

Evidence boundaryDirect means the retained evidence showed the requested product as a central line. Prices are the store catalog currency as observed; traffic remains a third-party estimate.
Same-product competitor shortlistExample run · 13 Oct 2026
StoreFitFound productsObserved priceTraffic estimate
Casekoocasekoo.comDirectLinKOO titanium iPhone case with foldable lanyardUSD 44.9948,728 / month Medium quality
Casezorocasezoro.comDirectPokémon and One Piece anime phone cases (2 products)EUR 16.9533,461 / month Medium quality
Gagacasegagacase.comDirectNaruto anime shockproof phone caseEUR 16.9515,077 / month Medium quality
Casemikucasemiku.comDirectPokémon phone caseEUR 16.9513,903 / month Medium quality
Magic Johnmagicjohn.comAdjacent360° invisible magnetic stand phone case in a broader electronics catalogEUR 22.95253,338 / month Low quality
Three direct stores list anime-themed cases at the same EUR 16.95 catalog price; currencies are kept separate and not converted.
Key findings

A shortlist with a clear qualification path.

01

Direct fit first

Product evidence and allowed entity type determine competitor fit; taxonomy alone is insufficient.

02

Comparable prices stay comparable

Price bands keep currencies separate and do not mix unlike variants, bundles or subscriptions.

03

Sparse results stay sparse

The workflow does not broaden the niche, market or entity rules to fill the shortlist.

Methodology

How same-product stores are discovered and verified.

Published by Spytrend from a dated, bounded example.

Product-URL fragments

Up to three dashed product-URL fragments, such as phone-case and phone-cover, match product page addresses.

Input boundary

Store discovery

Sequential indexed-product searches produce a bounded set of candidate domains.

Discovery

Compact exact-domain check

Each candidate is accepted only from a compact Shopify row matching the normalized domain exactly.

Verification

Tiered result

Direct and Adjacent stores are counted separately, with product, price and traffic evidence limits.

Classification
FAQ

Questions about this workflow.

What qualifies as a direct competitor?

A store needs exact Shopify identity plus several matching indexed products or clear evidence that the requested product is central to its catalog.

What is an adjacent store?

A broader specialist catalog contains a meaningful line of the requested product.

Why use dashed product fragments?

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.

Does country evidence prove shipping or headquarters?

No. The country is returned main-visitor-country context; it does not establish registration, shipping, availability, customers or sales.

Can traffic rank the market?

No. Traffic is modeled context with a quality label, not merchant analytics or proof of market share.

Spytrend MCP

Find Shopify stores selling the same products.

Connect Spytrend MCP, describe a physical product, choose a country and run the four prompts.