Before you build
This page is the pre-build companion to Troubleshooting. It isn't what the data is — see The data — or how to call it — see How to query. It's the short list of places where the data's shape or vocabulary behaves differently than a new builder reasonably expects, drawn from real use.
Two things make this cheaper than it looks:
- It's learn-once. The facts underneath these gotchas are stable — the vertical tokens, the way a metric is computed, and the slug a given retailer resolves to don't shift under you. New retailers and verticals get added, but a slug is never quietly reassigned to a different retailer. So the cost is a single orientation, after which you cache what you resolved and reuse it across the session.
- The answer is already in the tools. Everything below is verifiable with
market_data_docs,market_data_entitlements, and thesearch_*resolution tools. These trip builders up not because the information is missing, but because it's reasonable — for a person or an agent — to shortcut past it. The fix each time is the same one move: check the tool that knows, then trust your cached answer.
An average may describe a subset, not the whole assortment
What you'd expect. An "average" spans everything in scope — average price across the assortment, average discount across the range.
What actually happens. Some aggregates are computed over a conditional population — only the rows that meet a filter — rather than the full set. Average discount depth, for instance, is computed across only the products currently on discount, not the whole assortment. Read as a market-wide figure, it overstates. Nothing errors; the number is just answering a narrower question than you asked.
How to design around it. Before you surface an aggregate, confirm the
population it's computed over — check the metric's definition in
market_data_docs (the metrics topic) rather than assuming it spans
everything. For any time-windowed or period-over-period figure, pair it with
get_retailer_coverage first: a clean-looking aggregate can still be built on a
range with data gaps, and it won't tell you that on its own.
EDITED's terms may not mean what the same word means in your system
What you'd expect. Words like market, category, vertical, and brand carry the definitions they have in your own product or schema.
What actually happens. They're EDITED's terms, with specific meanings that often differ from a builder's:
- Market is a country or region context, not a market segment or a total-addressable-market figure.
- Vertical is a top-level segment of the data (apparel, beauty, home) — not your industry vertical — and the token a tool accepts isn't always the word you'd guess, so resolve it rather than typing it in.
- Category is a resolved product-search concept (via
search_product_searches), not a free-text taxonomy label you supply.
Mapping your word onto EDITED's without checking returns the wrong concept, not an error — the most expensive kind of mismatch to catch, because everything keeps working.
How to design around it. Map each EDITED term to your own vocabulary
deliberately before you build on it, and confirm any definition you're unsure of
in market_data_docs. Each term is defined in full on the page that owns it —
verticals in The data, for instance — so this entry only
has to flag that the words collide, with a single source to keep current.
A retailer identifier isn't portable — resolve it in context
What you'd expect. Once you've got a retailer's slug, it's that retailer's ID everywhere — reuse it across markets and across domains.
What actually happens. Retailer identifiers are contextual:
- Slugs aren't globally unique. The same retailer can slug differently by
market — Zara in the UK may be
zara, notzara-uk— so a name on its own can match the wrong regional storefront. Resolve the market first. - IDs don't cross domains. A slug from the market-data tools isn't a valid filter in the messaging & promotions tools; the two domains identify retailers differently.
Either one returns some other retailer's data, not an error — the same silent kind of wrong as the term collisions above.
How to design around it. Resolve the retailer in the context you're querying:
market first for market data (search_markets, then search_retailers), and
re-resolve with messagingmcp-list_retailers when you move to promotions. The
full sequence is in How to query — this
entry is just the heads-up that one slug won't carry everywhere.
How this page grows
This page is the reported-friction surface: each friction that comes back from real use is one more entry in the same shape — what you'd expect, what actually happens, how to design around it. Each names a class of surprise and how to verify it, never the specific values — so adding a retailer or a vertical never dates the page, and a class that stops being true simply comes off. The goal is a page a builder can trust because it's short and current, not a comprehensive list of caveats.