Item revenue
Also known as: Product Revenue, Sales per Item, Item-level Revenue, Product Sales
Item revenue is the total revenue earned from purchased products, calculated at line-item level as unit price multiplied by quantity for every item in completed orders, excluding tax and shipping. It shows how much each product, SKU, brand or category contributes to sales, so merchandising and finance teams can rank assortment performance independently of order-level totals.
Business Use Case
1️⃣ The merchandising team reviews weekly item revenue by SKU and category and, when a top-20 product drops more than 15% week over week, checks stock, pricing and on-site placement before the next promotional cycle. 2️⃣ Inventory planners use monthly item revenue per SKU to set replenishment quantities and flag long-tail items with negligible revenue for markdown or delisting. 3️⃣ The marketing team compares item revenue for promoted products during a campaign against the prior period to decide whether to extend, rebudget or stop the promotion. 4️⃣ Finance reconciles monthly item revenue with order revenue and the ERP sales ledger, investigating any gap above 2% as a tracking or discount-allocation issue.
Business Criticality
High
Journey / Navigation Area
Monetization
Owning Function
Merchandising
Scope
Event
Formula
SUM(Item Price × Item Quantity) across all items in purchase events for the periodCalculation Notes
1️⃣ Computed per line item from the purchase event items array as price × quantity, where price is the unit price after item-level discounts (coupon / promotion reductions already applied to the item). 2️⃣ Excludes tax, shipping and order-level fees; order-level discounts not allocated to items are not deducted, so the sum of item revenue can differ slightly from order revenue. 3️⃣ Returns and refunds are not netted inside this KPI; they are captured by the refund event and reported alongside it as item refund amount (net item revenue = item revenue − item refund amount). 4️⃣ Deduplicate on transaction_id so a purchase event re-fired on a thank-you page reload is counted once; exclude test orders and zero-value internal transactions. 5️⃣ Report in a single currency: use the reporting-currency field (item_revenue_in_usd in GA4 export) or convert at the order-date exchange rate when stores sell in several currencies. 6️⃣ Attribute revenue to the event date of the purchase in the property time zone; late-arriving hits within the export's 72-hour window may restate the last three days.
Technical Details
Events
| Platform | Event |
|---|---|
| Google Analytics 4 | purchase |
| Adobe | purchase |
Data Mappings
W3 Data Layer
{
"transaction": {
"transactionID": "T-100245",
"total": {
"basePrice": 129.97,
"currency": "USD"
},
"item": [
{
"productInfo": {
"productID": "SKU-12345",
"productName": "Example Product"
},
"category": {
"primaryCategory": "Apparel"
},
"quantity": 2,
"price": {
"basePrice": 49.99,
"currency": "USD"
}
},
{
"productInfo": {
"productID": "SKU-67890",
"productName": "Example Accessory"
},
"category": {
"primaryCategory": "Accessories"
},
"quantity": 1,
"price": {
"basePrice": 29.99,
"currency": "USD"
}
}
]
}
}GA4 Data Layer
{
"event": "purchase",
"ecommerce": {
"transaction_id": "T-100245",
"value": 129.97,
"currency": "USD",
"tax": 10.4,
"shipping": 5,
"coupon": "SUMMER10",
"items": [
{
"item_id": "SKU-12345",
"item_name": "Example Product",
"item_brand": "Example Brand",
"item_category": "Apparel",
"item_variant": "Blue / M",
"price": 49.99,
"discount": 5,
"quantity": 2
},
{
"item_id": "SKU-67890",
"item_name": "Example Accessory",
"item_brand": "Example Brand",
"item_category": "Accessories",
"price": 29.99,
"quantity": 1
}
]
}
}Adobe Client Data Layer
{
"event": "purchase",
"eventInfo": {
"eventName": "purchase"
},
"transaction": {
"purchaseID": "T-100245",
"currencyCode": "USD",
"total": 129.97
},
"product": [
{
"SKU": "SKU-12345",
"name": "Example Product",
"category": "Apparel",
"quantity": 2,
"priceTotal": 99.98
},
{
"SKU": "SKU-67890",
"name": "Example Accessory",
"category": "Accessories",
"quantity": 1,
"priceTotal": 29.99
}
]
}XDM Mapping
{
"eventType": "commerce.purchases",
"commerce": {
"purchases": {
"value": 1
},
"order": {
"purchaseID": "T-100245",
"currencyCode": "USD",
"priceTotal": 129.97
}
},
"productListItems": [
{
"SKU": "SKU-12345",
"name": "Example Product",
"productCategories": [
{
"categoryID": "Apparel"
}
],
"quantity": 2,
"priceTotal": 99.98,
"currencyCode": "USD"
},
{
"SKU": "SKU-67890",
"name": "Example Accessory",
"productCategories": [
{
"categoryID": "Accessories"
}
],
"quantity": 1,
"priceTotal": 29.99,
"currencyCode": "USD"
}
]
}SQL Queries
Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
-- Item revenue per day and SKU from the GA4 export (purchase events, deduplicated by transaction_id)
WITH purchases AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS event_date,
ecommerce.transaction_id AS transaction_id,
item.item_id,
item.item_name,
item.item_category,
COALESCE(item.quantity, 0) AS quantity,
COALESCE(item.item_revenue_in_usd, item.price_in_usd * item.quantity, 0) AS item_revenue_usd,
ROW_NUMBER() OVER (
PARTITION BY ecommerce.transaction_id, item.item_id, item.item_variant
ORDER BY event_timestamp
) AS rn
FROM `your-project.analytics_123456789.events_*`,
UNNEST(items) AS item
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND event_name = 'purchase'
AND ecommerce.transaction_id IS NOT NULL
AND ecommerce.transaction_id != '(not set)'
)
SELECT
event_date,
item_id,
ANY_VALUE(item_name) AS item_name,
ANY_VALUE(item_category) AS item_category,
SUM(quantity) AS items_purchased,
ROUND(SUM(item_revenue_usd), 2) AS item_revenue_usd
FROM purchases
WHERE rn = 1
GROUP BY event_date, item_id
ORDER BY event_date, item_revenue_usd DESC;Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
-- Item revenue per day and SKU from the ExperienceEvent dataset (commerce.purchases, deduplicated by purchaseID)
WITH purchase_items AS (
SELECT
CAST(e.timestamp AS DATE) AS event_date,
e.commerce.order.purchaseID AS purchase_id,
e.timestamp AS event_ts,
explode(e.productListItems) AS pli
FROM analytics_experience_events e
WHERE e.commerce.purchases.value = 1
AND e.commerce.order.purchaseID IS NOT NULL
AND e.timestamp >= date_sub(current_date(), 30)
AND e.timestamp < current_date()
),
ranked AS (
SELECT
event_date,
purchase_id,
pli.SKU AS item_id,
pli.name AS item_name,
COALESCE(pli.quantity, 0) AS quantity,
COALESCE(pli.priceTotal, 0) AS item_revenue,
ROW_NUMBER() OVER (PARTITION BY purchase_id, pli.SKU ORDER BY event_ts) AS rn
FROM purchase_items
)
SELECT
event_date,
item_id,
MAX(item_name) AS item_name,
SUM(quantity) AS items_purchased,
ROUND(SUM(item_revenue), 2) AS item_revenue
FROM ranked
WHERE rn = 1
GROUP BY event_date, item_id
ORDER BY event_date, item_revenue DESC;Source Data
Digital Analytics (GA4) + Adobe Analytics / AEP
Dependencies
Prerequisite: List the dependencies required for this KPI
Events:
Report Attributes
Item ID (SKU) Item Name Item Brand Item Category Item Variant Region Device Category Traffic Source / Medium
Recommended Reporting Views
Segment Eligibility
true
Governance
Governance
GitHub
catalog/kpis/item-revenue.yml