- Label: Search (Text)
- Description: Text search analytics.
- Default group key:
term
When you group search text metrics by term, Layers automatically consolidates spelling and plural variations of the same query into a single canonical form. For example, Layers groups searches for “charm”, “charms”, and “charmed” under one entry.Terms that only share a prefix stay separate. For example, “dress” and “dressing” each keep their own row and counts. This dataset only records completed searches, not autocomplete keystrokes, so every term reflects a query a shopper actually submitted.After consolidation, Layers re-sorts the results so the highest-volume terms appear first. The consolidated view shows search demand without noise from spelling variations or plural forms.Identifier and SKU lookups are the exception: Layers keeps the shopper’s entered code instead of replacing it with a different search term.
Metrics
-
requests (requests)
- Number of search requests.
- Example: COUNT_DISTINCT(requests)
-
results_count (results)
- Results returned per search request.
- Example: AVG(results_count)
-
total_sales (USD)
- Gross sales credited to search by blended attribution, which splits one order fractionally across every surface that contributed to it. Shown in the dashboard as Attributed Revenue (blended). Measures line-item price after line-item discounts, in the store’s own currency: before tax and shipping, and not reduced by refunds or cancellations.
- Example: SUM(total_sales)
-
quantity_purchased (items)
- Number of items purchased from search traffic.
- Example: SUM(quantity_purchased)
-
view_sessions (sessions)
- Distinct sessions in which a product was viewed from search results. Counts sessions, not views: one session that views five products counts once. Shown in the dashboard as Viewing Sessions.
- Example: COUNT_DISTINCT(view_sessions)
-
cart_sessions (sessions)
- Sessions where a product from search results was added to cart.
-
quantity_added_to_cart (items)
- Items added to cart from search results.
-
redirects (requests)
- First-page search requests answered by a semantic redirect instead of results. Redirected requests are excluded from
zero_results. - Example: COUNT_DISTINCT(redirects)
- First-page search requests answered by a semantic redirect instead of results. Redirected requests are excluded from
-
redirect_rate (rate)
- Share of first-page search requests answered by a redirect. Computed as
redirects / requests. - Example: SHOW redirect_rate
- Share of first-page search requests answered by a redirect. Computed as
-
zero_results (requests)
- First-page search requests that returned no results. Excludes redirected requests, SKU/barcode identifier-lane lookups, and requests where the shopper applied filters, so this metric reflects searches that genuinely failed to find relevant products. Filters injected by a request transform do not exclude a request. Track SKU/barcode lookups that matched nothing with
identifier_lane_missesinstead. - Example: SHOW zero_results
- First-page search requests that returned no results. Excludes redirected requests, SKU/barcode identifier-lane lookups, and requests where the shopper applied filters, so this metric reflects searches that genuinely failed to find relevant products. Filters injected by a request transform do not exclude a request. Track SKU/barcode lookups that matched nothing with
-
zero_result_rate (rate)
- Share of first-page search requests with no results. Computed as
zero_results / requests. - Example: SHOW zero_result_rate
- Share of first-page search requests with no results. Computed as
-
transform_scoped_requests (requests)
- First-page search requests constrained by filters injected by a request transform Add filter group action. Use this to see how much search traffic your transforms narrow.
- Example: SHOW transform_scoped_requests
-
transform_scoped_rate (rate)
- Share of search requests constrained by transform filters. Computed as
transform_scoped_requests / requests. - Example: SHOW transform_scoped_rate
- Share of search requests constrained by transform filters. Computed as
-
identifier_lane_lookups (requests)
- First-page searches that query interpretation routed to the SKU/barcode identifier lane. Use this as the denominator when evaluating exact-code lookups.
- Example: SHOW identifier_lane_lookups
-
identifier_lane_misses (requests)
- First-page SKU/barcode lookups that matched no product. The shopper typed an exact code that is not in the catalog. This is a catalog-coverage signal rather than a relevance failure, so these are tracked apart from
zero_results. - Example: SHOW identifier_lane_misses
- First-page SKU/barcode lookups that matched no product. The shopper typed an exact code that is not in the catalog. This is a catalog-coverage signal rather than a relevance failure, so these are tracked apart from
-
identifier_lane_miss_rate (rate)
- Share of SKU/barcode lookups that matched no product. Computed as
identifier_lane_misses / identifier_lane_lookups. - Example: SHOW identifier_lane_miss_rate
- Share of SKU/barcode lookups that matched no product. Computed as
-
filtered_requests (requests)
- Distinct search requests where the shopper applied at least one filter. Filters injected by a request transform do not count.
- Example: COUNT_DISTINCT(filtered_requests)
-
filter_usage_rate (rate)
- Share of search requests with filters applied. Computed as
filtered_requests / requests. - Example: SHOW filter_usage_rate
- Share of search requests with filters applied. Computed as
-
filtered_zero_results (requests)
- Filtered search requests that returned no products. Use this to find filter combinations that dead-end the shopper.
- Example: COUNT_DISTINCT(filtered_zero_results)
-
filtered_zero_result_rate (rate)
- Share of filtered search requests with zero results. Computed as
filtered_zero_results / filtered_requests. - Example: SHOW filtered_zero_result_rate
- Share of filtered search requests with zero results. Computed as
-
ctr (rate)
- Click-through rate: share of text search requests with at least one product click.
- Example: SHOW ctr
-
atc_rate (rate)
- Add-to-cart rate: share of text search requests with at least one add to cart.
- Example: SHOW atc_rate
-
cvr (rate)
- Conversion rate: share of clicked text search requests that produced an order.
- Example: SHOW cvr
-
purchase_rate (rate)
- Share of text search requests that produced an order.
- Example: SHOW purchase_rate
-
aov (USD)
- Average order value: blended revenue divided by blended order credit.
- Example: SHOW aov
-
rpi (USD)
- Revenue per impression: blended revenue divided by engagement-covered text search requests.
- Example: SHOW rpi
-
hover_rate (rate)
- Product hovers divided by product impressions.
- Example: SHOW hover_rate
-
touch_rate (rate)
- Product touches divided by product impressions.
- Example: SHOW touch_rate
Rates are computed over requests on channels that emit engagement events. Channels that record impressions but never emit click, cart, or purchase events (such as the mobile app) are excluded from the denominator, so each rate is the share observed on instrumented traffic. Every rate’s numerator is a subset of its denominator, so a rate can never exceed 100%. A rate returns NULL (an empty value) when its denominator is zero (for example,
cvr on a row with requests but no clicks), rather than 0 or 100%.Dimensions
- term: The search query string.
- query_type: Type of search query.
- language: Best-effort ISO language code inferred from the search query (for example,
en,fr,pt-br). Empty when the query is too short or ambiguous to detect confidently, and only populated for text queries. - num_results: Number of results returned.
- current_page: Current page index for paginated results (1-based).
- shopping_channel: The shopping channel (
weborapp). - locale: Storefront locale code active for the request (e.g.,
en,fr,pt-br). - currency: ISO 4217 currency code applied to the request (e.g.,
USD,EUR). - session_returning: Session type —
neworreturning. - customer_state: Whether the shopper is authenticated —
signed_inorguest. - customer_returning: Customer type —
neworreturning, based on prior order count. - b2b_company: Shopify B2B company location identifier for the signed-in company account.
- billable: Whether this request is counted for billing.
- attribution_token: Token used to attribute downstream events/purchases.
- experiment_id: Experiment identifier.
- experiment_group: Experiment group/variant.
- device: Device category.
- os: Operating system.
- geo_country: Two-letter country code.
- geo_state: Up to three-letter province code.
- geo_city: City name as captured.
- marketing_source: UTM source.
- marketing_medium: UTM medium.
- marketing_campaign: UTM campaign.
- redirect_term: The matched term of the semantic redirect that answered the request. Only populated for redirected requests.
- filter_property: The shopper-applied filter property (for example,
option.color,metafield.custom.material). Transform-injected filters are excluded. - filter_operator: The operator used for the selection (
in,notIn,eq,neq,range,geo, etc.). - filter_value: The selected value. Populated for
in,notIn,eq, andneq;NULLfor range and geo operators, which emit one row per request without values. - filter_name: Display-only merchant label for the filter property, resolved from the attribute’s nickname. Group by
filter_propertyto populate this label.
Grouping by a filter dimension explodes each request into one row per selected value.
SUM(requests) and other request-denominated sums will overcount; use COUNT_DISTINCT(filtered_requests) to count distinct requests. Grouping or segmenting by a filter dimension also disables the filter_usage_rate and filtered_zero_result_rate ratios. Use COUNT_DISTINCT(filtered_requests) (or filtered_zero_results) directly instead.Examples
Search requests by term (last 7 days)zero_results by term, the result includes a row for every term with any search traffic, most of them valued 0. Add HAVING zero_results > 0 so the table only lists terms that actually failed.
Top SKU or barcode lookups that matched no product (last 30 days)
zero_results, grouping identifier_lane_misses by term returns a row for every term with search traffic. HAVING identifier_lane_misses > 0 keeps terms that matched at least one product out of the table.
Search volume by detected language (last 30 days)