Ship-to-Store Orders
Also known as: Ship to Store Order Count, Site to Store Orders, STS Orders, Buy Online Ship to Store Orders, Ship-to-Store Pickup Orders
Distinct online orders shipped from a DC to the chosen store for pickup (Fulfillment Method = ship_to_store). Unlike BOPIS Orders, no store stock is used; it is the count behind Ship-to-Store Rate.
Business Use Case
1️⃣ Merchandising raises on-hand allocation for SKUs driving rising ship-to-store orders at a store.,2️⃣ Customer Service sizes hold-shelf space and pickup-desk staffing from weekly orders per store.,3️⃣ Finance compares ship-to-store with home-delivery orders to quantify parcel cost saved.
Business Criticality
Medium
Journey / Navigation Area
Checkout
Owning Function
Merchandising
Scope
Event
Formula
COUNT(DISTINCT transaction_id) on purchase events WHERE fulfillment_method = 'ship_to_store', by order date in the reporting periodCalculation Notes
1️⃣ COUNT(DISTINCT transaction_id) on purchase events with fulfillment_method = 'ship_to_store'; confirmation-page refires count once.,2️⃣ Counted on the order date, not the ship or pickup date; orders later cancelled or never collected stay in the count.,3️⃣ Pickups fulfilled from store stock (BOPIS, curbside) and home delivery are excluded; the split is the Fulfillment Method value set at checkout.,4️⃣ Mixed carts follow the order-level fulfillment_method, so an order is never counted in both Ship-to-Store Orders and BOPIS Orders.,5️⃣ Internal and test traffic (traffic_type = internal) and purchase events without a transaction_id are excluded.,6️⃣ BOPIS orders the order management system reroutes to ship-to-store after checkout are not reclassified here; reconcile with OMS sourcing data.,7️⃣ Numerator of Ship-to-Store Rate, whose denominator is all Orders; apply the same date range and traffic filters to both.
Technical Details
Events
| Platform | Event |
|---|---|
| Google Analytics 4 | purchase |
| Adobe | purchase |
Data Mappings
W3 Data Layer
{
"digitalData": {
"transaction": {
"transactionID": "txn-1",
"total": {
"transactionTotal": 100,
"currency": "USD"
},
"attributes": {
"fulfillmentMethod": "ship_to_store",
"trafficType": "external"
},
"item": [
{
"productInfo": {
"productID": "SKU-1",
"productName": "item"
},
"quantity": 1,
"price": {
"basePrice": 100
}
}
]
},
"event": [
{
"eventInfo": {
"eventName": "purchase"
}
}
]
}
}GA4 Data Layer
{
"event": "purchase",
"ecommerce": {
"transaction_id": "txn-1",
"value": 100,
"currency": "USD",
"items": [
{
"item_id": "SKU-1",
"item_name": "item",
"price": 100,
"quantity": 1
}
]
},
"fulfillment_method": "ship_to_store",
"traffic_type": "external"
}Adobe Client Data Layer
{
"event": "purchase",
"eventInfo": {
"fulfillmentMethod": "ship_to_store",
"trafficType": "external"
},
"xdm": {
"commerce": {
"purchases": {
"value": 1
},
"order": {
"purchaseID": "txn-1",
"currencyCode": "USD"
}
},
"productListItems": [
{
"SKU": "SKU-1",
"name": "item",
"quantity": 1,
"priceTotal": 100
}
]
}
}XDM Mapping
{
"eventType": "commerce.purchases",
"commerce": {
"purchases": {
"value": 1
},
"order": {
"purchaseID": "txn-1",
"currencyCode": "USD"
}
},
"productListItems": [
{
"SKU": "SKU-1",
"name": "item",
"quantity": 1,
"priceTotal": 100
}
],
"_tenantId": {
"fulfillmentMethod": "ship_to_store",
"trafficType": "external"
}
}SQL Queries
Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
-- Reporting period: last 90 days to yesterday, by order (purchase event) date
DECLARE start_date DATE DEFAULT DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY);
DECLARE end_date DATE DEFAULT DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY);
-- Distinct ship-to-store orders: purchase events with a transaction_id, excluding internal/test traffic; refires collapse on transaction_id
SELECT
COUNT(DISTINCT ecommerce.transaction_id) AS ship_to_store_orders
FROM `your-project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', start_date) AND FORMAT_DATE('%Y%m%d', end_date)
AND event_name = 'purchase'
AND NULLIF(ecommerce.transaction_id, '(not set)') IS NOT NULL
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'fulfillment_method') = 'ship_to_store'
AND COALESCE((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'traffic_type'), '') != 'internal';Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
-- Distinct ship-to-store orders over the last 90 days to yesterday by order date: purchase events with a purchaseID, excluding internal/test traffic; refires collapse on purchaseID
SELECT
COUNT(DISTINCT commerce.order.purchaseID) AS ship_to_store_orders
FROM aep_web_events_dataset
WHERE CAST(timestamp AS DATE) BETWEEN DATE_SUB(CURRENT_DATE, 90) AND DATE_SUB(CURRENT_DATE, 1)
AND eventType = 'commerce.purchases'
AND NULLIF(commerce.order.purchaseID, '') IS NOT NULL
AND _tenantId.fulfillmentMethod = 'ship_to_store'
AND COALESCE(_tenantId.trafficType, '') != 'internal';Source Data
Digital Analytics (GA4)
Dependencies
Prerequisite: List the dependencies required for this Metric
Events:
Dimensions:
Report Attributes
fulfillment-method store-name item-category device-category traffic-source
Recommended Reporting Views
Segment Eligibility
true
Governance
Derived KPIs
Governance
GitHub
catalog/metrics/ship-to-store-orders.yml