cart conversion rate
Also known as: shopping cart conversion rate, cart-to-order conversion rate, basket conversion rate
Cart conversion rate is the percentage of carts created (a shopper's first add_to_cart of the day) that end in a completed purchase within a 7-day conversion window, including purchases made in a later session or visit. It is the cross-session counterpart of the session-scoped Cart-to-Purchase Rate and shows how much cart intent the store turns into orders, including deferred and returning-visit purchases.
Business Use Case
1️⃣ The E-commerce Manager reviews the weekly rate against the session-scoped Cart-to-Purchase Rate; when the gap widens, the team treats it as deferred buying and sizes save-for-later, persistent-cart and cross-device login features. 2️⃣ The CRM & Lifecycle Marketing team uses the share of carts converting in days 2–7 to set the timing and cadence of abandoned-cart email and push sequences, and runs holdout tests on the incremental lift. 3️⃣ The Merchandising team compares the rate by product category and price band; categories with low cart conversion get price-match messaging, shipping-threshold offers or stock-availability fixes. 4️⃣ The Head of Digital Commerce reports the monthly rate by device and traffic source in the trading review and opens a checkout friction investigation when it falls more than 2 points below the trailing 13-week average.
Business Criticality
High
Journey / Navigation Area
Checkout
Owning Function
E-commerce
Scope
User
Formula
(Carts Created that result in a Purchase within 7 days, in any session / Total Carts Created) × 100Calculation Notes
1️⃣ Denominator is every cart created in the reporting period: one cart per user (stitched user_id where available, otherwise the device/ECID identifier) per calendar day, anchored on that day's first add_to_cart; no carts are excluded for later abandonment. 2️⃣ A cart counts as converted when the same user fires a purchase with a non-empty transaction_id at or after the cart's first add_to_cart and within 7 days (168 hours); the session boundary does not matter, which separates this KPI from the session-scoped cart-to-purchase-rate. 3️⃣ Extend the purchase lookup 7 days past the end of the reporting period, and treat the most recent 7 days as provisional until their window closes. 4️⃣ Deduplicate purchases on transaction_id and exclude test orders, internal traffic and fully refunded or cancelled orders flagged within the window. 5️⃣ One purchase can convert several carts from the same user inside the window (for example, carts built on Monday and Wednesday and bought on Thursday); report the rate on carts, not on orders. 6️⃣ Without cross-device identity stitching, carts built on one device and bought on another count as unconverted, so the rate is a lower bound; state the identity basis on the dashboard.
Technical Details
Events
| Platform | Event |
|---|---|
| Google Analytics 4 | purchase |
| Adobe | purchase |
Data Mappings
W3 Data Layer
{
"event": [
{
"eventInfo": {
"eventName": "purchase"
}
}
],
"transaction": {
"transactionID": "T-100245",
"total": {
"basePrice": 118,
"transactionTotal": 129.99,
"currency": "USD"
},
"item": [
{
"productInfo": {
"productID": "SKU-4471",
"productName": "Trail Running Shoe"
},
"category": {
"primaryCategory": "Footwear"
},
"quantity": 1,
"price": {
"basePrice": 118
}
}
]
},
"cart": {
"cartID": "C-88213"
},
"user": [
{
"profile": [
{
"profileInfo": {
"profileID": "U-55190"
}
}
]
}
]
}GA4 Data Layer
{
"event": "purchase",
"user_id": "U-55190",
"ecommerce": {
"transaction_id": "T-100245",
"value": 129.99,
"currency": "USD",
"tax": 8.99,
"shipping": 3,
"items": [
{
"item_id": "SKU-4471",
"item_name": "Trail Running Shoe",
"item_category": "Footwear",
"price": 118,
"quantity": 1
}
]
}
}Adobe Client Data Layer
{
"event": "purchase",
"eventInfo": {
"eventName": "purchase"
},
"user": {
"profileID": "U-55190"
},
"cart": {
"cartID": "C-88213"
},
"transaction": {
"purchaseID": "T-100245",
"total": 129.99,
"currency": "USD",
"products": [
{
"productID": "SKU-4471",
"productName": "Trail Running Shoe",
"category": "Footwear",
"quantity": 1,
"price": 118
}
]
}
}XDM Mapping
{
"eventType": "commerce.purchases",
"commerce": {
"purchases": {
"value": 1
},
"order": {
"purchaseID": "T-100245",
"priceTotal": 129.99,
"currencyCode": "USD"
},
"cart": {
"cartID": "C-88213"
}
},
"productListItems": [
{
"SKU": "SKU-4471",
"name": "Trail Running Shoe",
"quantity": 1,
"priceTotal": 118
}
],
"identityMap": {
"CRMID": [
{
"id": "U-55190",
"primary": false
}
]
}
}SQL Queries
Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
-- Cart conversion rate: carts created (user x day, first add_to_cart) that purchase within 7 days, in any session.
-- Carts: 2026-01-01..2026-01-31; purchase lookup extended 7 days to 2026-02-07.
WITH carts AS (
SELECT
COALESCE(user_id, user_pseudo_id) AS shopper_id,
PARSE_DATE('%Y%m%d', event_date) AS cart_date,
MIN(event_timestamp) AS first_cart_ts
FROM `your-project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260101' AND '20260131'
AND event_name = 'add_to_cart'
GROUP BY shopper_id, cart_date
),
purchase_events AS (
SELECT
COALESCE(user_id, user_pseudo_id) AS shopper_id,
event_timestamp AS purchase_ts,
MAX(IF(ep.key = 'transaction_id', ep.value.string_value, NULL)) AS param_transaction_id,
ANY_VALUE(ecommerce.transaction_id) AS ecommerce_transaction_id
FROM `your-project.analytics_123456789.events_*`,
UNNEST(event_params) AS ep
WHERE _TABLE_SUFFIX BETWEEN '20260101' AND '20260207'
AND event_name = 'purchase'
GROUP BY shopper_id, purchase_ts
),
purchases AS (
-- one row per transaction (deduplicated), earliest occurrence
SELECT
shopper_id,
COALESCE(ecommerce_transaction_id, param_transaction_id) AS transaction_id,
MIN(purchase_ts) AS purchase_ts
FROM purchase_events
WHERE COALESCE(ecommerce_transaction_id, param_transaction_id) IS NOT NULL
AND COALESCE(ecommerce_transaction_id, param_transaction_id) NOT IN ('', '(not set)')
GROUP BY shopper_id, transaction_id
),
cart_outcomes AS (
SELECT
c.shopper_id,
c.cart_date,
LOGICAL_OR(
p.purchase_ts >= c.first_cart_ts
AND p.purchase_ts < c.first_cart_ts + 7 * 24 * 60 * 60 * 1000000
) AS converted
FROM carts AS c
LEFT JOIN purchases AS p
ON p.shopper_id = c.shopper_id
GROUP BY c.shopper_id, c.cart_date
)
SELECT
cart_date,
COUNT(*) AS carts_created,
COUNTIF(IFNULL(converted, FALSE)) AS converted_carts,
ROUND(SAFE_DIVIDE(COUNTIF(IFNULL(converted, FALSE)), COUNT(*)) * 100, 2) AS cart_conversion_rate_pct
FROM cart_outcomes
GROUP BY cart_date
ORDER BY cart_date;Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
-- Cart conversion rate: carts created (person x day, first commerce.productListAdds) that purchase within 7 days, in any session.
-- Carts: 2026-01-01..2026-01-31; purchase lookup extended 7 days to 2026-02-07.
WITH carts AS (
SELECT
COALESCE(identityMap['CRMID'][0].id, endUserIDs._experience.ecid.id) AS shopper_id,
CAST(timestamp AS DATE) AS cart_date,
MIN(timestamp) AS first_cart_ts
FROM web_experience_events
WHERE eventType = 'commerce.productListAdds'
AND timestamp >= TIMESTAMP '2026-01-01 00:00:00'
AND timestamp < TIMESTAMP '2026-02-01 00:00:00'
GROUP BY 1, 2
),
purchases AS (
SELECT
COALESCE(identityMap['CRMID'][0].id, endUserIDs._experience.ecid.id) AS shopper_id,
commerce.order.purchaseID AS purchase_id,
MIN(timestamp) AS purchase_ts
FROM web_experience_events
WHERE eventType = 'commerce.purchases'
AND commerce.order.purchaseID IS NOT NULL
AND commerce.order.purchaseID <> ''
AND timestamp >= TIMESTAMP '2026-01-01 00:00:00'
AND timestamp < TIMESTAMP '2026-02-08 00:00:00'
GROUP BY 1, 2
),
cart_outcomes AS (
SELECT
c.shopper_id,
c.cart_date,
MAX(CASE
WHEN p.purchase_ts >= c.first_cart_ts
AND p.purchase_ts < c.first_cart_ts + INTERVAL 7 DAYS
THEN 1 ELSE 0
END) AS converted
FROM carts c
LEFT JOIN purchases p
ON p.shopper_id = c.shopper_id
GROUP BY c.shopper_id, c.cart_date
)
SELECT
cart_date,
COUNT(*) AS carts_created,
SUM(converted) AS converted_carts,
ROUND(100.0 * SUM(converted) / NULLIF(COUNT(*), 0), 2) AS cart_conversion_rate_pct
FROM cart_outcomes
GROUP BY cart_date
ORDER BY cart_date;Source Data
Digital Analytics (GA4)
Dependencies
Prerequisite: List the dependencies required for this KPI
Report Attributes
device category traffic source / medium product category new vs returning customer country days from cart to purchase
Recommended Reporting Views
Segment Eligibility
true
Governance
Governance
GitHub
catalog/kpis/cart-conversion-rate.yml