← Back to Metrics

Store Locator Searches

Also known as: Store Finder Searches, Find a Store Searches, Store Locator Uses, Store Search Count, Locator Searches

EngagementmetricRetail: Omnichannel (BOPIS - Buy Online Pick Up In Store)Retail

Counts the store locator queries shoppers submit to find a physical store (by postal code, city, address or device location), recorded through the unified search event scoped to search_type = 'store_locator' and counted once per qualifying submission. It measures local-intent demand at the top of the pickup and store-visit journey and supplies the volume base for store-selection, pickup-order and store-visit conversion analysis by market, device and entry point.

Business Use Case

1️⃣ The Omnichannel Marketing Manager reviews Store Locator Searches by postal code and DMA every week; when a market with no store within the default radius shows sustained search volume above the network median for four consecutive weeks, they add it to the quarterly new-store and pickup-locker site-selection shortlist sent to Real Estate. 2️⃣ The Digital Product Manager for fulfillment watches the zero-result share by device; when it rises more than two points above its trailing four-week average after a release, they open a defect against the geocoding service and roll back the locator build if it is not fixed within one sprint. 3️⃣ The Local Marketing team schedules paid local-inventory and 'near me' search campaigns: when a store cluster's locator searches climb more than 15% week over week ahead of a holiday, they raise that cluster's geo-targeted bid caps and extend store-hours messaging in the ad copy for the peak window. 4️⃣ The Store Operations lead compares weekly locator searches from PDP and checkout entry points with BOPIS Orders per store; when searches grow but pickup orders stay flat, they audit that store's pickup availability flags and staffing windows before the next weekly labour plan is published.

Business Criticality

Medium

Journey / Navigation Area

Discovery

Owning Function

Marketing

Scope

Event

Formula

COUNT(search events WHERE search_type = 'store_locator' AND search_source <> 'auto_detect' AND COALESCE(is_refire, false) = false AND traffic_type <> 'internal') — identical search_term submissions within 30 seconds in the same session collapse to one

Calculation Notes

1️⃣ Qualification: only the unified search event with search_type = 'store_locator' counts, and only when the shopper explicitly submits a location (postal code, city, street address, 'Use my location' tap or an explicit 'Search this area' action on the map). Typeahead keystrokes, map pan and zoom without a re-query, and radius or store-service filter changes on an existing result set are refinements, not new searches. 2️⃣ Serialization and dedupe: every qualifying submission increments the metric, so a shopper who tries two ZIP codes produces two searches. Identical search_term submissions within 30 seconds in the same session (double-clicks, back-navigation re-renders, SPA route re-mounts) collapse to one, and events flagged is_refire = true are dropped. Sessions follow the standard 30-minute inactivity timeout; a search after a timeout opens a new session and counts again. 3️⃣ Automatic lookups are excluded: the nearest-store prefill that runs on page load from IP or stored preference (search_source = 'auto_detect') is not shopper intent and must not be counted, otherwise the metric tracks traffic rather than local demand. 4️⃣ Entry points are all in scope and must stay separable through search_source: the dedicated store finder page, the PDP 'Check other stores' or 'Change store' modal, the cart fulfillment toggle and the checkout pickup step. Report the PDP and checkout entry points apart from the standalone finder, because they carry purchase intent while the finder page is dominated by hours and directions lookups. A locator query that returns stores with item availability counts here once; the item-level availability view belongs to Store Inventory Checks and is not double counted. 5️⃣ Zero-result searches (search_results_count = 0, typically an address outside the store network or a failed geocode) are included in the count and reported as a separate share; a rising share points to geocoding defects or unserved markets, not to lower demand. 6️⃣ Exclusions and privacy: internal and QA traffic (traffic_type = 'internal', non-production site_environment) and known bots are removed. Free-text addresses are never retained in search_term; the value is normalised to postal code or city before collection, and latitude / longitude are truncated to two decimals (roughly 1 km) so the metric stays aggregate and non-identifying. Sessions without analytics_storage consent are absent from the raw export, so compare trends, not absolute levels, against consent-modelled figures in the GA4 UI. 7️⃣ Timing: searches are attributed to the event timestamp in the property reporting time zone. Daily figures are treated as provisional for 72 hours to absorb late-arriving app hits, and week-over-week comparisons should be made weekday against weekday, since locator demand peaks on Fridays and Saturdays and around holiday store-hour changes.

Technical Details

Measure TypeCounter
Aggregation WindowDaily, Weekly, Monthly

Events

PlatformEvent
Google Analytics 4search
Adobesearch

Data Mappings

W3 Data Layer
{
  "event": [
    {
      "eventInfo": {
        "eventName": "search",
        "eventAction": "search"
      },
      "search": {
        "searchType": "store_locator",
        "searchTerm": "60601",
        "searchSource": "store_finder_page",
        "searchResultsCount": 8,
        "isRefire": false,
        "radius": 25,
        "city": "Chicago",
        "region": "IL",
        "country": "US",
        "latitude": 41.88,
        "longitude": -87.63,
        "fulfillmentMethod": "pickup_in_store",
        "pageType": "store_locator"
      },
      "traffic_type": "organic",
      "site_environment": "production"
    }
  ]
}
GA4 Data Layer
{
  "event": "search",
  "search_type": "store_locator",
  "search_term": "60601",
  "search_source": "store_finder_page",
  "search_results_count": 8,
  "is_refire": false,
  "radius": 25,
  "city": "Chicago",
  "region": "IL",
  "country": "US",
  "latitude": 41.88,
  "longitude": -87.63,
  "fulfillment_method": "pickup_in_store",
  "page_type": "store_locator",
  "traffic_type": "organic",
  "site_environment": "production"
}
Adobe Client Data Layer
{
  "event": "search",
  "search": {
    "searchType": "store_locator",
    "searchTerm": "60601",
    "searchSource": "store_finder_page",
    "searchResultsCount": 8,
    "isRefire": false,
    "radius": 25,
    "city": "Chicago",
    "region": "IL",
    "country": "US",
    "latitude": 41.88,
    "longitude": -87.63,
    "fulfillmentMethod": "pickup_in_store",
    "pageType": "store_locator"
  },
  "traffic_type": "organic",
  "site_environment": "production"
}
XDM Mapping
{
  "eventType": "web.webinteraction.linkClicks",
  "web": {
    "webInteraction": {
      "name": "search",
      "type": "other"
    }
  },
  "placeContext": {
    "geo": {
      "latitude": 41.88,
      "longitude": -87.63,
      "countryCode": "US"
    }
  },
  "_tenant": {
    "trafficType": "organic",
    "siteEnvironment": "production",
    "search": {
      "isRefire": false
    }
  },
  "_experience": {
    "analytics": {
      "customDimensions": {
        "eVars": {
          "eVar10": "store_locator",
          "eVar11": "store_finder_page",
          "eVar12": "pickup_in_store"
        },
        "props": {
          "prop10": "60601",
          "prop11": "8"
        }
      }
    }
  }
}

SQL Queries

Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
DECLARE start_date DATE DEFAULT DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY);
DECLARE end_date DATE DEFAULT DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY);

-- Known bots are already removed by the GA4 export; event_date is in the property reporting time zone
-- Unified search events with event params pivoted, one row per event
WITH searches AS (
  SELECT
    CONCAT(e.user_pseudo_id, '.', CAST(MAX(IF(p.key = 'ga_session_id', p.value.int_value, NULL)) AS STRING)) AS session_id,
    e.event_timestamp,
    MAX(IF(p.key = 'search_type', p.value.string_value, NULL)) AS search_type,
    MAX(IF(p.key = 'search_term', p.value.string_value, NULL)) AS search_term,
    MAX(IF(p.key = 'search_source', p.value.string_value, NULL)) AS search_source,
    MAX(IF(p.key = 'is_refire', COALESCE(p.value.string_value, CAST(p.value.int_value AS STRING)), NULL)) AS is_refire,
    MAX(IF(p.key = 'traffic_type', p.value.string_value, NULL)) AS traffic_type,
    MAX(IF(p.key = 'site_environment', p.value.string_value, NULL)) AS site_environment
  FROM `your-project.analytics_123456789.events_*` AS e,
    UNNEST(e.event_params) AS p
  WHERE e._TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', start_date) AND FORMAT_DATE('%Y%m%d', end_date)
    AND e.event_name = 'search'
  GROUP BY e.user_pseudo_id, e.event_timestamp, e.event_bundle_sequence_id
),
-- Qualifying store locator submissions: auto-detect prefills, refires, internal traffic and non-production environments removed
qualified AS (
  SELECT
    session_id,
    search_term,
    search_source,
    event_timestamp,
    LAG(event_timestamp) OVER (PARTITION BY session_id, search_term ORDER BY event_timestamp) AS prev_same_term_ts
  FROM searches
  WHERE search_type = 'store_locator'
    AND COALESCE(search_source, '') <> 'auto_detect'
    AND COALESCE(is_refire, 'false') NOT IN ('true', '1')
    AND COALESCE(traffic_type, '') <> 'internal'
    AND COALESCE(site_environment, 'production') = 'production'
)
-- Store Locator Searches by entry point after collapsing identical search_term submissions within 30 seconds in the same session; the ROLLUP row labelled 'all' is the metric total, a missing entry point is 'unknown'
SELECT
  CASE WHEN GROUPING(search_source) = 1 THEN 'all' ELSE COALESCE(search_source, 'unknown') END AS search_source,
  COUNT(*) AS store_locator_searches
FROM qualified
WHERE prev_same_term_ts IS NULL
  OR event_timestamp - prev_same_term_ts > 30 * 1000000
GROUP BY ROLLUP (search_source)
ORDER BY store_locator_searches DESC;
Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
-- Reporting window: the last 90 complete days, dated in the property reporting time zone; known bots are removed by the Analytics source connector
WITH params AS (
  SELECT date_sub(current_date(), 90) AS start_date, date_sub(current_date(), 1) AS end_date
),
-- Unified search events (store locator isolated below via search_type in eVar10); search_source and search_term from eVar11 / prop10; refire, traffic and environment flags from the tenant field group
searches AS (
  SELECT
    concat(e.endUserIDs._experience.ecid.id, '.', CAST(e._experience.analytics.session.num AS STRING)) AS session_id,
    e.timestamp AS event_timestamp,
    e._experience.analytics.customDimensions.eVars.eVar10 AS search_type,
    e._experience.analytics.customDimensions.props.prop10 AS search_term,
    e._experience.analytics.customDimensions.eVars.eVar11 AS search_source,
    CAST(e._tenant.search.isRefire AS STRING) AS is_refire,
    e._tenant.trafficType AS traffic_type,
    e._tenant.siteEnvironment AS site_environment
  FROM aep_web_events_dataset e
  CROSS JOIN params pr
  WHERE e.web.webInteraction.name = 'search'
    AND to_date(from_utc_timestamp(e.timestamp, 'America/New_York')) BETWEEN pr.start_date AND pr.end_date
),
-- Qualifying store locator submissions: auto-detect prefills, refires, internal traffic and non-production environments removed
qualified AS (
  SELECT
    session_id,
    search_term,
    search_source,
    event_timestamp,
    LAG(event_timestamp) OVER (PARTITION BY session_id, search_term ORDER BY event_timestamp) AS prev_same_term_ts
  FROM searches
  WHERE search_type = 'store_locator'
    AND COALESCE(search_source, '') <> 'auto_detect'
    AND COALESCE(is_refire, 'false') NOT IN ('true', '1')
    AND COALESCE(traffic_type, '') <> 'internal'
    AND COALESCE(site_environment, 'production') = 'production'
)
-- Store Locator Searches by entry point after collapsing identical search_term submissions within 30 seconds in the same session; the ROLLUP row labelled 'all' is the metric total, a missing entry point is 'unknown'
SELECT
  CASE WHEN GROUPING(search_source) = 1 THEN 'all' ELSE COALESCE(search_source, 'unknown') END AS search_source,
  COUNT(*) AS store_locator_searches
FROM qualified
WHERE prev_same_term_ts IS NULL
  OR unix_timestamp(event_timestamp) - unix_timestamp(prev_same_term_ts) > 30
GROUP BY ROLLUP (search_source)
ORDER BY store_locator_searches DESC;

Source Data

Digital Analytics (GA4)

Dependencies

Prerequisite: List the dependencies required for this Metric

Dimensions:

store-zip-code-local-marketdevice-category

Report Attributes

Store / ZIP Code / Local Market Search Source (entry point) Device Category Traffic Source Fulfillment Method Zero-Result Flag Page Type

Recommended Reporting Views

Views
BOPIS & Omnichannel PerformanceStore Locator FunnelLocal Market Demand

Segment Eligibility

true

Governance

Data SensitivityInternal

Derived KPIs

Governance

Created bydevyendarm
Created on9/21/2026
Last modified bydevyendarm
Last modified on9/21/2026
Version1.0.0
Validation stateqa passed
StatusPUBLISHED

GitHub

View related Pull Requestcatalog/metrics/store-locator-searches.yml

Community Discussion