Purpose of Report
This report is designed to show the Objectives and Key Results (OKRs) of each section of the site. It does not do the more usual reporting of revenue or overall visits, and does not use the standard breakdowns of Webstore or Device type. Instead it looks at the underlying objective of each page and what interactions are completed to achieve those objectives.
For example, the purpose of the Grid page (PLP) is to display lists of products that can be filtered, sorted, and ultimately selected for either a product view or a quick shop open. These key interactions are all shown in the Grid strip on the Consideration page.
To use the report, select a webstore (or "All") on the Admin page. Then choose two dates, the primary reporting date and the comparison date. You can either choose from the list of presets in the drop down, or select a free date range from the calendar controls. Then click the "Fetch Report Data" button. This saves your store and date preferences. Then use the top navigation tabs to open the different sections of the report. The data is fetched (from Adobe Customer Journey Analytics) as you open each page.
Documentation
Per-panel breakdown of the dimensions, metrics, and filters behind each section's queries. Component IDs and segment shapes are listed inline; configuration map keys reference config/config.json.
Conventions
- Date range filter — every report has a
globalFilters[].dateRangecovering the primary or comparison range. The end date is rendered inclusive (start of the day after the user-picked end). - Webstore filter — when not "All", an
eqSegmentonvariables/68f0ec75b9217841b850d105(WebStore) is appended toglobalFilters. Selecting "All" omits the segment so the report covers every store. - Page-section base report — most sections share
pageSectionReport({ pageType })inlib/queries.js. It runs three reports in parallel: one dimensioned byvariables/web.webPageDetails._polo.pageType(single row read at the configured pageType), one dimensioned byhighestPercentViewedwith a pageName suffix segment, one dimensioned bynextPageTypewith a pageType segment. Ratios such as avg views per session, bounce, and time on page are computed in JS from the picked row's columns. - Bounce =
singlePageVisits/sessionsfrom the pageType row. - Time on page =
adobe_timespent(s) /pageViewsfrom the pageType row.
Awareness
Home Page
Endpoint: GET /api/report/homepage · pageType value: home · renderer: renderPageSection
Left stat — Page interaction
- Avg views per session —
metrics/68ecf0054f7efa325ed87bbd(Page Views) /metrics/visits(Sessions). Both columns from thehomerow of the pageType-dimensioned report. - % visits interacting with content — visit-scope filtered
metrics/visits. Per-metric filter onmetricContainer.metricFilters[]: container contextvisits, predicatecontainsonvariables/web.webPageDetails._polo.abTagwith the token_hp_fromconfig.contentTrackingTokens.home. Divided by total Home sessions.
Donut — How much of the page do visitors see?
- Dimension:
variables/web.webPageDetails._polo.percentagePageViewed.highestPercentViewed - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) as the weight - Scoping segment:
pageNameSuffixSegment(variables/...percentagePageViewed.pageName, "home")— OR ofends-with(":home")andcontains(":home:"). Handles bothen_gb:homeand any future sub-path variants. - Buckets are textual (
"Less than 25","25 to 50","50 to 75","75 to 95","95 or more") — mapped to midpoints 12.5 / 37.5 / 62.5 / 85 / 97.5 viabucketMidpoint()for the weighted average reported alongside the chart.
Bar — Which content slots are clicked the most?
- Dimension:
variables/web.webPageDetails._polo.abTag - Metric:
metrics/visits - Filters (AND'd via two separate hit-scope segments):
contains("_hp_")+contains("_slot_") - Slot identifier extracted in JS with
/_slot_([^_\s]+)/i. Visits aggregated by slot, then displayed as share-of-clicks (visits per slot / total slot visits). Chart caps at top 8 by share-of-clicks, shaded from navy to lighter vialightenHex(PALETTE.navy, i/(n-1) × 0.7). Rows whose abTag fails the regex are tallied undercontentSlotsUnmatchedfor tagging-drift visibility.
Bar — Where do visitors go next?
- Dimension:
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) - Filter: hit-scope segment
pageType=home - Raw rows are grouped through
config.nextPageTypeGroups(e.g.search-failed+search-success→search;qrlp:authenticated+qrlp:unauthenticated→qrlp). Unmapped values fall through unchanged. - Exited Site is synthetic — computed as
max(0, pageViews(home) − sum of recorded next-page page views). Highlighted red in the chart. - Shares are computed against total Home page views so all bars sum to ≈100%.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) —
metrics/6926c991bce36d457543bdb3(Single Page Visit) /metrics/visitsfrom thehomerow. Change badge (grey) inline. - Time on page (right, bold gold) —
metrics/adobe_timespent(Time Spent, seconds) /metrics/68ecf0054f7efa325ed87bbd(Page Views) from thehomerow. Change badge (grey) inline.
Division Landing Page
Endpoint: GET /api/report/dlp · pageType value: dlp · renderer: renderPageSection
Identical metric set and layout to Home Page. Differences:
- pageType row picked from the shared report =
dlp. - Content-token filter for both "% interacting with content" and content-slot dimension matching is
_dlp_(config.contentTrackingTokens.dlp). - Percent-viewed pageName suffix segment matches via the
contains(":dlp:")leg ofpageNameSuffixSegment, so it coversen_gb:dlp:women,en_gb:dlp:men,en_gb:dlp:sale:pfs, etc. - Next-page-type segment uses
pageType=dlp; the sameconfig.nextPageTypeGroupsmap is applied.
Store Locator
Endpoint: GET /api/report/storelocator · pageType value: storelocator · renderer: renderStoreLocator (bespoke)
Left stat — Store Locator Submit Rate
- Numerator:
metrics/eventType_19(Store Locator Search) summed across alldaterangeyearrows in the date+webstore-scoped range. - Denominator:
sessionson thestorelocatorrow of the page-section report. - Mirrors the CJA calculated metric Store Locator Submit Rate (which is bound to a different data view and not callable from this report).
Stacked bar — Local vs International search
- Dimension:
variables/siteSearch.query(Search Term) - Metric:
metrics/eventType_19(Store Locator Search) - Filter: date range + webstore only (no further segmentation).
- Bucketed in JS: term contains
|→ Local; otherwise → International. Shares are computed against the categorised total. Events missing a search term are surfaced assearchTypeSplit.uncategorisedEventsfor visibility.
Ranked list — Top local search terms
- Reuses the rows from the search-term breakdown above — no additional query.
- For each row whose term contains
|, the term is split on|and the first segment is taken. Grouped case-insensitively, solondon|30|miandLondon|50|kmroll up under onelondonentry. - Each group's
eventsis the sum across variants; share is against the local-search total. Top 5 displayed.
Pie — Post-search interactions
- Two metrics summed across
daterangeyearrows in the date+webstore-scoped range:metrics/web.webInteraction.name_45(Store Locator: Book Appointment)metrics/web.webInteraction.name_46(Store Locator: Save Store)
- Shares calculated against the two-metric total. No further filtering — both metrics are inherently scoped to the store locator surface by their tagging.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) — same calculation as Home Page, picked from the
storelocatorrow. Change badge (grey) inline. - Time on page (right, bold gold) — same calculation as Home Page, picked from the
storelocatorrow. Change badge (grey) inline.
Consideration
Grid
Endpoint: GET /api/report/grid · pageType value: plp · renderer: renderGrid (bespoke)
Left stat — Grid interaction
- Grid views per session —
pageViews/sessionsfrom theplprow of the page-section report. - Visits clicking load more —
metrics/web.webInteraction.name_2(PLP View More) summed acrossdaterangeyearrows / PLP sessions. Counts click events, not unique visits, so a session that clicks twice contributes 2. - Visits clicking view all —
metrics/web.webInteraction.name_3(PLP View All) summed acrossdaterangeyearrows / PLP sessions. Same per-event nuance as load more.
Combo — Visits applying a filter + Top filter categories
- Top stat (filter usage) —
metrics/web.webInteraction.name(PLP Filter Applied) summed acrossdaterangeyearrows / PLP sessions. Click rate per session — not unique filterers. - Bar list (top categories) — same metric, dimensioned by
variables/siteSearch.filter.attribute(PLP Filter Category). Rows with valuestackedare dropped client-side (it's a list-position sentinel, not a category). Share is computed against the full filtered total (all non-stacked categories), so the displayed % reflects the category's slice of all filter applications. Top 5 shown.
Combo — Visits using sort + sort option breakdown
- Top stat (sort usage) —
metrics/web.webInteraction.name_1(PLP Sort) summed acrossdaterangeyearrows / PLP sessions. - Bar list (option breakdown) — same metric, dimensioned by
variables/697b74319d7f2e3beb4c6954(Sort Selection). Bar widths scale by raw event count; trailing labels show share of all sort events.
Visual — Grid item interaction (How many visitors click through to PDP?)
- Item click % (gold arrow) —
metrics/eventType_2(PLP Item Click) summed acrossdaterangeyearrows, divided by PLP page views. Click rate per grid view. - Swatch interaction % —
metrics/web.webInteraction.name_12(PLP Swatch Interaction) summed acrossdaterangeyearrows / PLP page views. Decorated with a row of four coloured polo SVGs. - Avg item clicks per visit (small caption) — same
eventType_2total / PLP sessions. - Icons are inline SVG in
public/report.js(ICON_GRID,ICON_POLO,POLO_SMALL,ARROW_WITH_TEXT) — swap for<img>tags if brand assets land inpublic/.
Combo — Where do visitors go on next? + Quick shop opens
- Bar chart (top) — same shape as the Home / DLP next-page charts: dimension
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type), metricmetrics/68ecf0054f7efa325ed87bbd(Page Views), filtered bypageType=plp. Rows grouped throughconfig.nextPageTypeGroups; Exited Site computed as the residual. Canvas height is short (130px) to make room for the quick-shop stats underneath. - Quick shop opens — total —
metrics/eventType_5(PLP Quick Shop Open) summed acrossdaterangeyearrows. Displayed as a raw count. - Quick shop opens — % of grid views — same total / PLP page views.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) — bounce rate from the
plprow. Change badge (grey) inline. - Time on page (right, bold gold) — time-on-page from the
plprow. Change badge (grey) inline.
Product Details Page
Endpoint: GET /api/report/pdp · pageType value: product · renderer: renderPDP (bespoke)
Left stat — Product interaction + PDP Tab Opens
- Products viewed per visit —
metrics/68ecf0054f7efa325ed87bbd(Page Views) /metrics/visits(Sessions). Both columns from theproductrow of the page-section report. - PDP Tab Opens bar list — Dimensioned by
variables/698508bcba1a01744efacb39(Tab Name), metricmetrics/web.webInteraction.name_35(PDP Tab Open). Localized tab labels mapped to four canonical buckets —Product Details,Delivery & Returns,Payment Options,Product Reviews— viabucketPdpTab(). Rendered viasimpleRankedList()with navy bars scaled to raw open counts; one row per bucket with label, bar, and count. Empty buckets omitted.
Conversion — Add to cart + Notify Me
- Add to cart visual — Big
atcPerView% rate in gold. Flow row:ICON_POLO→ARROW_PLAIN(solid gold arrow) →ICON_BAG. Label: "PDP views add to cart". Change badge below. - Notify Me sub-section — Divider. Heading. Three-cell grid, each with number, label, and comparison change badge:
- Notify Me Submits —
notifyMeSubmit(count).metrics/eventType_14summed acrossdaterangeyearrows. - Out of Stock clicks —
outOfStockClick(count).metrics/web.webInteraction.name_25summed acrossdaterangeyearrows. - Submits / Product View —
notifyMeSubmitRate(%).notifyMeSubmit / productViewsTotal.productViewsTotalismetrics/68ecf0054f7efa325ed87bbd(Page Views) summed acrossdaterangeyear.
- Notify Me Submits —
Chart — Finding method breakdown
- Dimension:
variables/productListItems._polo.findingMethod - Metrics:
metrics/68ecf0054f7efa325ed87bbd(Page Views, navy bars) andmetrics/web.webInteraction.name_44(Add to Cart, gold bars) - Scoped by date + webstore. Rendered via
chartPanelwithdrawFindingMethodBar, a grouped vertical bar chart displaying one navy–gold bar pair per finding method. Rotated x-axis labels (30–60°) accommodate multi-word method names; legend positioned at the bottom; hover tooltip shows exact per-dataset values.
Two-stat row — PDP interactions (top) + panel visibility pie (bottom)
- Image enlarge clicks —
imageEnlargeRate(%).metrics/web.webInteraction.name_30(Image Enlarge) summed acrossdaterangeyearrows /base.raw.pageViews(Standard Page Views onpageType=product). Rendered as a 30px gold number with label and comparison change badge. - Size chart opens —
sizeChartRate(%).metrics/web.webInteraction.name_18(Size Chart Open) summed acrossdaterangeyearrows /base.raw.pageViews. Same 30px gold number layout with change badge. - Panel visibility pie — Divider, subheading "Panel visibility", then pie chart:
panelVisibility(array of{ label, events }). Five metrics from the PDP report:metrics/web.webInteraction.name_69(Also Available),name_70(CTL),name_71(YMAL),name_72(Recently Viewed),name_73(Similar Items). Each summed acrossdaterangeyearrows (scoped by date + webstore). Rendered viadrawPiewith seven-colour palette (navy, gold, green, sand, dark-gold, light-gold, grey); shares weighted by event count. Legend shows bucket names with share + raw event counts.
Bar — Where do visitors go on next?
- Dimension:
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) - Filter: hit-scope segment
pageType=product - Raw rows are grouped through
config.nextPageTypeGroups(e.g.search-failed+search-success→search;qrlp:authenticated+qrlp:unauthenticated→qrlp). Unmapped values fall through unchanged. - Exited Site is synthetic — computed as
max(0, pageViews(product) − sum of recorded next-page page views). Highlighted red in the chart. - Shares are computed against total Product page views so all bars sum to ≈100%.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) —
metrics/6926c991bce36d457543bdb3(Single Page Visit) /metrics/visitsfrom theproductrow. Change badge (grey) inline. - Time on page (right, bold gold) —
metrics/adobe_timespent(Time Spent, seconds) /metrics/68ecf0054f7efa325ed87bbd(Page Views) from theproductrow. Change badge (grey) inline.
Search / Navigation
Endpoint: GET /api/report/searchnav · pageTypes: search-success + search-failed · renderer: renderSearchNav
First panel — Overview stats (4 stacked stat panels)
- Four gold-number metrics in a
panel-statscolumn, stacked vertically (narrow width matching the stat panels on strips above): total navigation clicks, nav clicks per session, total searches, successful searches %. - Navigation clicks —
metrics/web.webInteraction.name_5(navClickPrimary, fromconfig.metrics) +metrics/web.webInteraction.name_10(navClickSecondary) +metrics/web.webInteraction.name_5_1(navClickContent). Summed acrossdaterangeyearrows in the date+webstore range (no pageType segment — site-wide). The total now encompasses all three nav click types: item, utility, and content. - Nav clicks per session — navigation clicks total /
metrics/visits(Sessions) from the same site-wide scope. - Total searches —
metrics/6926e810800aca54ee6f7d67(successfulSearches) +metrics/695fafe89e983930edb7af6c(failedSearches). Summed acrossdaterangeyearrows (site-wide). - Successful searches % — successfulSearches / totalSearches. Expressed as a percentage.
- Each stat displays value (formatted with locale thousands separators or 2dp), label, and comparison change badge via
statPanel(). All four metrics live ondata.primary.overview+data.comparison.overviewfor easy badge rendering.
Second panel — Nav clicks and searches by page type (two stacked bar charts)
searchNavReportexecutes two separate parallel queries:navBreakdownReportdimensioned byvariables/${config.dimensions.pageType}(current page type) with three metrics for nav clicks:metrics/${config.metrics.navClickPrimary},metrics/${config.metrics.navClickSecondary},metrics/${config.metrics.navClickContent}.searchBreakdownReportdimensioned byvariables/${config.dimensions.previousPageType}(where visitors searched from) with two metrics:metrics/${config.metrics.successfulSearches},metrics/${config.metrics.failedSearches}. Previous pageType is more informative than current (search events always fire on the search page).
- Data is aggregated and grouped through
config.nextPageTypeGroups(same grouping as the next-page chart), nav metrics summed per group, and search metrics summed per group. Each list is sorted descending by event count and capped at top 8. - Two stacked bar charts, each with short canvas height (130px): Nav clicks by page type (top) and Searches by page type (bottom). Both reuse
drawNextPageBarwith grouped-bar styling. Data surfaces ondata.primary.overview.navClicksByPageTypeanddata.primary.overview.searchesByPageType.
Third panel — Meganav hover/click by level
searchNavReportruns apositionReportdimensioned byvariables/${config.dimensions.meganavPosition}(Meganav Level, added to config) with two metrics:metrics/${config.metrics.meganavHover}(Meganav Hover, added) andmetrics/${config.metrics.navClickPrimary}(primary nav click). Results sorted by position number.- Two sub-sections rendered within one panel wrapper:
- Meganav hover by level — horizontal navy bars, one per level, scaled to max hover count. Each bar displays share as
% of total hovers. Data surfaces ondata.primary.overview.meganavByPosition(array of{ position, hover, click, displayValue },displayValueis the computed percentage). - Meganav click by level — horizontal gold bars, same structure, showing share of total clicks per level.
navTypeBreakdownfield still returned bysearchNavReportfor backwards compatibility, but the pie chart render is removed.
- Meganav hover by level — horizontal navy bars, one per level, scaled to max hover count. Each bar displays share as
Fourth panel — Search-aid clicks (concentric doughnut + coverage %)
- Panel title and legend — Title: "Search-aid clicks". Inline caption below title:
"Outer: Current / Inner: Previous"(two colour-coded lines) to clarify the period mapping on the donut. - Concentric doughnut chart — Four metrics (Trending Search, Recommended Product, Division Filter, Popular Category) added to
config.metrics. All four ride on the existingoverviewReport, so no additional CJA query is needed. Outer ring displays primary-range values, inner ring displays comparison-range values in a 35%-lightened tint to distinguish the two periods. Shared four-colour palette: navy, gold, green, sand. Flex-based canvas (min 260px width) allows the chart to reflow instead of fixed 180px. - Search-aid coverage stat — Single inline footer line under a thin top border:
fmtPct1(percentOfSearches)(bold), then" of total searches", then optional" · " + fmtChange()(grey) if a change exists. All three elements inline as<span>tags. Data surfaces ondata.primary.overview.searchAids(object withtrendingSearch,recommendedProduct,divisionFilter,popularCategory,total,percentOfSearches). - Helper function —
drawConcentricDonut()supports any two-dataset doughnut comparison; useful for future before/after analyses.
Fifth panel — Where do visitors go on next? (two stacked bar charts)
searchNavReportruns twopageSectionReportcalls in parallel — one forpageType=search-successand one forsearch-failed— then combines the results.- Each chart shows
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) dimensioned by the respective pageType, metricmetrics/68ecf0054f7efa325ed87bbd(Page Views). Rows grouped throughconfig.nextPageTypeGroups; Exited Site computed as the residual per sub-report. - Canvas height is short (130px) to avoid vertical bloat; side-by-side layout with subheadings "Search success" and "Search failed" lets analysts compare exit patterns at a glance.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) —
metrics/6926c991bce36d457543bdb3(Single Page Visit) /metrics/visitsfrom the combined totals (summed across both search-success and search-failed rows). Change badge (grey) inline. - Time on page (right, bold gold) —
metrics/adobe_timespent(Time Spent, seconds) /metrics/68ecf0054f7efa325ed87bbd(Page Views) from the combined totals. Change badge (grey) inline. - Note — Summing sessions across two pageTypes may slightly under-state the true combined bounce because sessions containing hits of both pageTypes are double-counted in the denominator.
Commitment
Cart
Endpoint: GET /api/report/cart · pageType value: cart · renderer: renderCart
Left stat — Cart interaction
- Avg views per visit —
metrics/68ecf0054f7efa325ed87bbd(Page Views) /metrics/visits(Sessions). Both columns from thecartrow of the page-section report. - ATC → cart-view conversion —
sessionsWithBoth / sessionsWithAtc, wheresessionsWithBothandsessionsWithAtcare visit-count metrics summed acrossdaterangeyearrows viametricContainer.metricFilters(segment-filteredmetrics/visits). Uses saved CJA segmentsconfig.segments.sessionsWithCartViewAndATCandconfig.segments.sessionsWithATC. Rendered as a percentage with label "of ATC sessions also viewed the cart" and comparison change badge aligned inline.
Chart — Cart edit rate + updates breakdown
- Cart-edit rate headline — Computed as
cartUpdatesTotal / pageViewsfromdata.primary.cart. Rendered as a large percentage with label "of cart views had an edit" and comparison change badge aligned inline. Component ID:cart-edit-rate. - Cart updates pie (below headline) — Dimension:
variables/${config.dimensions.cartUpdateType}(Cart Update Type, added to config; maps toweb.webInteraction.name_2). Dimension values are cleaned client-side by stripping the leading"cart update "prefix (case-insensitive) so labels read as"remove","quantity decrease","quantity increase","edit". - Pie metric and scope — Metric:
metrics/${config.metrics.cartUpdate}(Cart Update, added to config; maps toeventType_18). Scoped by date + webstore. Rendered viadrawPiewith five-colour palette (navy, gold, green, sand, grey). Share is computed against the total of all update types.
Two-row visual — Wishlist ↔ Cart
- Row 1: Icon line —
ICON_BAG(left, 56px) ·ICON_ARROWS_LR(centre, navy bidirectional arrows) ·ICON_HEART(right, 56px, solid navy fill). Component ID:panel-cart-wishlist. - Row 2: Stats — Under the bag (left):
cartFromWishlistrate (% of cart page views, bold gold), label "Wishlist to Cart", change badge. Under the heart (right):moveToWishlistrate (% of cart page views, bold gold), label "Cart to Wishlist", change badge. Direction read as left-to-right via the arrow row (wishlist left → cart right; cart right → wishlist left). - Data —
cartFromWishlist: sum ofmetrics/${config.metrics.addToCart}(eventType_1) acrossdaterangeyearrows with segmentpageSubtype=wishlist, divided by cart page views.moveToWishlist: sum ofmetrics/${config.metrics.addToWishlist}(eventType_17) with segmentpageType=cart, divided by cart page views. Both displayed as one decimal place percentage, change badges compare the rates.
Gifting (on cart, % of cart views) — 2×2 stat grid
- Four metrics measuring gift-related activity on the cart surface as a rate per cart page view. Each cell displays rate (% of cart page views, bold gold), label, and comparison change badge.
- Gift box added —
metrics/${config.metrics.giftBoxAdded}(web.webInteraction.name_21). Summed acrossdaterangeyearrows withpageType=cart, divided by cart page views. - Gift box removed —
metrics/${config.metrics.giftBoxRemoved}(web.webInteraction.name_49). Summed acrossdaterangeyearrows withpageType=cart, divided by cart page views. - Gift message added —
metrics/${config.metrics.giftMessageAdded}(web.webInteraction.name_22). Summed acrossdaterangeyearrows withpageType=cart, divided by cart page views. - Gift message removed —
metrics/${config.metrics.giftMessageRemoved}(web.webInteraction.name_51). Summed acrossdaterangeyearrows withpageType=cart, divided by cart page views. - Query shape —
giftingReportdimensioned byvariables/${config.dimensions.pageType}withnonesBehavior: 'exclude-nones'. Cart and checkout rows extracted separately; checkout data fetched for future Purchase-section reuse. Component ID:gift-grid, each cell:gift-cell. All rates formatted to one decimal place; change badges compare the rates, not raw counts.
panel-coupons — Coupon apply rate, applied vs failed, top codes
- Stat row —
applyCouponRate(bold percentage) with label "of cart views applied a coupon" and comparison change badge. Computed asapplyCoupon / pageViews. - 100% stacked bar — Two horizontal segments:
applyCoupon(navy) andcouponFailed(red). Both metrics fromcouponsReport, dimensioned byvariables/daterangeyear. Inline percentage labels per segment; legend underneath with raw counts. - Ranked list — Top 5 coupon codes by
applyCoupon. Dimension:variables/${config.dimensions.couponCode}. "No Value" rows (data-layer sentinel) filtered client-side. Rendered viasimpleRankedList()with navy bars.
Bar — Where do visitors go next?
- Dimension:
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) - Filter: hit-scope segment
pageType=cart - Raw rows are grouped through
config.nextPageTypeGroups. Unmapped values fall through unchanged. - Exited Site is synthetic — computed as
max(0, pageViews(cart) − sum of recorded next-page page views). Highlighted red in the chart. - Shares are computed against total Cart page views so all bars sum to ≈100%.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) —
metrics/6926c991bce36d457543bdb3(Single Page Visit) /metrics/visitsfrom thecartrow. Change badge (grey) inline. - Time on page (right, bold gold) —
metrics/adobe_timespent(Time Spent, seconds) /metrics/68ecf0054f7efa325ed87bbd(Page Views) from thecartrow. Change badge (grey) inline.
Wishlist
Endpoint: GET /api/report/wishlist · pageType+pageSubtype: account + wishlist · renderer: renderWishlist
Left stat — Wishlist views per session + Product view share
- Wishlist views per session —
metrics/68ecf0054f7efa325ed87bbd(Page Views) /metrics/visits(Sessions). Both columns from the wishlist-filtered summary report (pageType=account + pageSubtype=wishlist). Computed from adaterangeyear-dimensioned report scoped by date, webstore, and the two-part filter. - % of product views came from wishlist — Calc metric
metrics/${config.metrics.productViewsFromWishlist}(Product View from Wishlist, bound to data view) divided bymetrics/${config.metrics.productViews}(Page Views). Run in a fourth parallel reportpvFromWishlistReport, dimensioned byvariables/daterangeyear, returning site-wide totals for both metrics. Result computed aspvFromWishlist / pvTotal(null if zero). Rendered as percentage with change badge.
Pie — Where do visitors wishlist a product from?
- Dimension:
variables/${config.dimensions.pageType}(current page type where the Add to Wishlist event fires) - Metric:
metrics/${config.metrics.addToWishlist}(Add to Wishlist, eventType_17) - Scope: date + webstore only (no pageType/pageSubtype filter — this is deliberately site-wide to surface all sources). Rows grouped through
config.nextPageTypeGroupsto align with the next-page chart grouping. Top 7 sources shown; rendered viadrawPiewith a seven-colour palette (navy, gold, green, sand, dark-gold, light-gold, grey).
Two pending panels — Wishlist metrics (TBD)
- Placeholder
pendingPanelentries reserved for future wishlist-specific insights.
Bar — Where do visitors go on next?
- Dimension:
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) - Filter: hit-scope segments
pageType=accountANDpageSubtype=wishlist - Raw rows are grouped through
config.nextPageTypeGroups. Unmapped values fall through unchanged. - Exited Site is synthetic — computed as
max(0, pageViews(wishlist) − sum of recorded next-page page views). Highlighted red in the chart. - Shares are computed against total Wishlist page views so all bars sum to ≈100%.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) —
metrics/6926c991bce36d457543bdb3(Single Page Visit) /metrics/visitsfrom the wishlist summary report. Change badge (grey) inline. - Time on page (right, bold gold) —
metrics/adobe_timespent(Time Spent, seconds) /metrics/68ecf0054f7efa325ed87bbd(Page Views) from the wishlist summary report. Change badge (grey) inline.
Account
Endpoint: GET /api/report/account · pageType value: account · renderer: renderAccount
Left stat — Account page views per session
- Avg views per visit —
metrics/68ecf0054f7efa325ed87bbd(Page Views) /metrics/visits(Sessions). Both columns from theaccountrow of the page-section report.
Right stat panel — Sign in, profile creation, and email sign-ups
- % of sessions include a sign in — visit-scope segment on
variables/userAccount.loginLocationexisting, filtered against total sessions. TheuserAccount.loginmetric cannot be used as a segment attribute, so sign-in presence is inferred from loginLocation existing (set on every login). Returned asdata.primary.account.signInRate(null if zero sessions). - Profiles created —
metrics/userAccount.createProfile(raw count) summed acrossdaterangeyearrows. Returned asdata.primary.account.createProfile. - Email sign-ups —
metrics/eventType_11(raw count) summed acrossdaterangeyearrows. Returned asdata.primary.account.emailSignup. - Query shape —
signupReportdimensioned byvariables/daterangeyear, scoped by date + webstore. Executes in parallel with the page-section base report. Metric container includes visit-scope segmenthasSignInfor the sign-in count, plus three additional metrics:metrics/visits(total sessions),metrics/userAccount.createProfile,metrics/eventType_11. Totals aggregated across all rows. - Rendering — Rendered as a
panel-stats:statPanel()displays the sign-in rate as percentage (top) with change badge. Below it, abig-stat-pairgrid displays profiles created and email sign-ups side-by-side as raw counts with change badges. - Supporting fields
signInSessionsandtotalSessionsstored for reference but not directly displayed.
Pie — Account page subtypes
- Dimension:
variables/${config.dimensions.pageSubtype}(Page Subtype underpageType=account) - Metric:
metrics/${config.metrics.pageViews}(Page Views) as the weight - Scope: date + webstore. Rows with value "No Value" (case-insensitive) filtered client-side. Results sorted by page views descending and capped at top 7; rendered via
drawPiewith a seven-colour palette (navy, gold, green, sand, dark-gold, light-gold, grey). - Data surfaces on
data.primary.account.subtypes(array of{ subtype, pageViews, share }) anddata.primary.account.subtypesTotal(sum of all subtype page views).
Bar — Where do visitors go on next?
- Dimension:
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) - Filter: hit-scope segment
pageType=account - Raw rows are grouped through
config.nextPageTypeGroups. Unmapped values fall through unchanged. - Exited Site is synthetic — computed as
max(0, pageViews(account) − sum of recorded next-page page views). Highlighted red in the chart. - Shares are computed against total Account page views so all bars sum to ≈100%.
Footer strip — Engagement summary
- Rendered below the panel row via
renderEngagementFooter(). Full-width.strip-footerwith a top border. - Bounce rate (left, bold gold) —
metrics/6926c991bce36d457543bdb3(Single Page Visit) /metrics/visitsfrom theaccountrow. Change badge (grey) inline. - Time on page (right, bold gold) —
metrics/adobe_timespent(Time Spent, seconds) /metrics/68ecf0054f7efa325ed87bbd(Page Views) from theaccountrow. Change badge (grey) inline.
Purchase
Shipping Address and Method
Endpoint: GET /api/report/shipping · queries two custom metrics + sessions · renderer: renderShipping (bespoke)
Left stat — Address and delivery method views, step conversion
- No single pageType backs this checkout step — it's measured by two custom view metrics in
config.metrics:shippingAddressViewsanddeliveryMethodViews. - Shipping address views per session —
metrics/6929d2110fcfbf1b8c801e6esummed acrossdaterangeyearrows, divided bymetrics/visits(Sessions). UsesfmtRatio()for precision: values below 0.1 display 3 decimals (e.g.,0.018) to distinguish deep-funnel views; values ≥0.1 show 2 decimals. - Delivery method views per session —
metrics/6929d22a8fdb5f53d707569bsummed acrossdaterangeyearrows, divided by sessions. SamefmtRatio()formatting. - Step conversion (address → delivery) —
deliveryMethodViews / shippingAddressViews(null if address views are zero). Rendered as a percentage viafmtPct(). Indicates the proportion of visitors who progressed from the address entry step to the delivery method selection step. - All three metrics live on
data.primary.metricsanddata.comparison.metricsfor change-badge rendering.
Three-slot stat — Shipping Address Page interactions
- Three event counts displayed in a three-slot grid, each with value, label, and comparison change badge. Shares a
threeSlotStat()renderer (extracted from inline helpers used elsewhere). Each stat displays a right-aligned navy line icon (ICON_COUPON,ICON_EMAIL,ICON_BUTTON_ARROW) to visually distinguish the interaction type. - Apply coupon clicks —
metrics/web.webInteraction.name_38(Apply Coupon) summed acrossdaterangeyearrows with per-metricmetricFilter: hit-scope segmentpageType=checkout. Counts clicks only on the checkout surface; other applies are excluded. Icon: coupon/ticket SVG. - Email opt-in clicks —
metrics/web.webInteraction.name_75(Email Opt-in) summed acrossdaterangeyearrows with per-metricmetricFilter: hit-scope segmentvariables/web.webInteraction._polo.isCheckedis"true". Isolates checked interactions from unchecked/neutral actions. Icon: envelope SVG. - Continue button clicks —
metrics/web.webInteraction.name_56(Continue Button Click) summed acrossdaterangeyearrows. No additional filter applied; this metric is inherently scoped to the shipping address page by tagging. Icon: button with right-arrow SVG. - Query shape —
interactionsReportruns in parallel with the address/delivery-views report insideshippingReport(). Both reports run viaPromise.all, then aggregated in JS. Each metric filter and the no-filter metric are executed within a singlemetricContainer, so CJA engine costs are minimized. Data surfaces ondata.primary.addressPage(object with{ applyCoupon, emailOptIn, continueButton }).
Ranked list — Shipping Method Page
- Dimension:
variables/6a3932b4d3cce17fa2080be8(Shipping Method Selected) - Metric:
metrics/web.webInteraction.name_62(Shipping Method Change) - Scope: date + webstore. Measures which shipping methods customers selected at checkout, sorted by volume descending. Horizontal bars accommodate long method labels (e.g., "Express Ship to Store"). Data surfaces on
data.primary.shippingMethods(array of{ method, changes }). Rendered viasimpleRankedList()with navy bars.
Grid — Gifting (on checkout, % of checkout views)
- Four metrics measuring gift-related activity scoped to
pageType=checkout, expressed as a rate per checkout page view. Each cell displays rate (% of checkout page views, bold gold), label, and comparison change badge. - Gift box added —
metrics/web.webInteraction.name_21summed acrossdaterangeyearrows withpageType=checkout, divided by checkout page views. - Gift box removed —
metrics/web.webInteraction.name_49summed acrossdaterangeyearrows withpageType=checkout, divided by checkout page views. - Gift message added —
metrics/web.webInteraction.name_22summed acrossdaterangeyearrows withpageType=checkout, divided by checkout page views. - Gift message removed —
metrics/web.webInteraction.name_51summed acrossdaterangeyearrows withpageType=checkout, divided by checkout page views. - Query shape —
giftingReportdimensioned byvariables/daterangeyearwithglobalFiltersincludingpageType=checkout. All four gift metrics plusmetrics/68ecf0054f7efa325ed87bbd(Page Views, denominator) fetched in parallel with the other shipping reports. Component ID:gift-grid, each cell:gift-cell. All rates formatted to one decimal place; change badges compare the rates.
Two-stat panel — Exit rates (% of step events)
- Exit on shipping step % — Sessions matching
segments/sF18502BE5329FB670A490D4C@AdobeOrg_6a3cf4df9945f05aa90c8643(exitOnShipping) divided bymetrics/6929d2110fcfbf1b8c801e6e(Shipping Address Views). Indicates the proportion of visitors who reach the shipping address page but exit before proceeding to delivery method selection. - Exit on delivery step % — Sessions matching
segments/sF18502BE5329FB670A490D4C@AdobeOrg_6a3cf4fe4b63ef4e43a3ea84(exitOnDelivery) divided bymetrics/6929d22a8fdb5f53d707569b(Delivery Method Views). Indicates the proportion of visitors who reach the delivery method page but exit before proceeding to payment. - Query shape —
exitReportdimensioned byvariables/daterangeyearwith metric filters onexitShip(segment-filtered sessions) andexitDeliv(segment-filtered sessions). Both segment-filtered session counts and the base event counts (shippingAddressViews, deliveryMethodViews) are aggregated across rows. Ratios computed in JS; both displayed as percentages with change badges.
Billing
Endpoint: GET /api/report/billing · queries two custom metrics + sessions · renderer: renderBilling (bespoke)
Left stat — Payment step views and method change rate
- No single pageType backs this checkout step — it's measured by custom view and interaction metrics in
config.metrics:paymentStepViewsandpaymentMethodChange. - Payment step views per session —
metrics/6929d23c0fcfbf1b8c801e70summed acrossdaterangeyearrows, divided bymetrics/visits(Sessions). Sessions filtered to include only those matchingsegments/sF18502BE5329FB670A490D4C@AdobeOrg_6a3ce4c2ef72d172f42e90d9(Session Includes Payment Step). UsesfmtNumX()to display the multiplier (e.g.,1.51x). - Payment method change rate —
metrics/web.webInteraction.name_63(Payment Method Change) summed acrossdaterangeyearrows, divided bymetrics/6929d23c0fcfbf1b8c801e70(Payment Step Views). Renders as a percentage viafmtPct(), indicating the proportion of payment-step views where a customer changed their method. - Both metrics live on
data.primary.metricsanddata.comparison.metricsfor change-badge rendering.
Pie — Payment method breakdown
- Dimension:
variables/commerce.order._polo.paymentMethods(Payment Method) - Metric:
metrics/web.webInteraction.name_63(Payment Method Change — top-10 by click volume) - Scope: date + webstore. Measures which payment options customers clicked most often on the payment page, not the method the order was finally placed with. Rows sorted by clicks descending and capped at 10; rendered via
drawPiewith ten-colour palette (navy, gold, green, sand, dark-gold, light-gold, grey, dark-grey, red, ink). - Panel note — Small italic text underneath the chart: "Note: this isn't the payment used for the order, this is clicks on the option on the page" — clarifies that the dimension reflects option interaction, not final tender.
- Data surfaces on
data.primary.paymentMethods(array of{ method, changes }).
Bar — Where do visitors go next? (from checkout)
- Dimension:
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) - Filter: hit-scope segment
pageType=checkout— note that billing has no pageType-specific sentinel yet, so checkout is used as a proxy measure for the billing surface. Approximation noted in the panel. - Raw rows are grouped through
config.nextPageTypeGroups. Unmapped values fall through unchanged. - Exited Site is synthetic — computed as
max(0, pageViews(checkout) − sum of recorded next-page page views). Highlighted red in the chart. - Shares are computed against total checkout page views so all bars sum to ≈100%.
Stat — Exit on payment step %
- Exit on payment step % — Sessions matching
segments/sF18502BE5329FB670A490D4C@AdobeOrg_6a3cf8684e6b8b2bff15970b(exitOnPayment) divided bymetrics/6929d23c0fcfbf1b8c801e70(Payment Step Views). Indicates the proportion of visitors who reach the payment page but exit before order completion. - Rendered as a percentage with label "exit on payment step" and comparison change badge. Data surfaces on
data.primary.metrics.exitPaymentRate.
Confirmation
Endpoint: GET /api/report/confirmation · pageType value: confirmation · renderer: renderConfirmation
Left stat — Confirmation views per visit + Average time between cart and order
- Confirmation views per visit —
metrics/68ecf0054f7efa325ed87bbd(Page Views) /metrics/visits(Sessions). Both columns from theconfirmationrow of the page-section report. - Average cart-to-order time —
metrics/68b970ea0a84fd1cb3b1980c(Cart to Order Time, sum of seconds) summed acrossdaterangeyearrows, divided by confirmation page views (≈ orders placed). Measures the average time elapsed between a product addition to cart and order completion. Renders as seconds viafmtSecs(). - Both metrics live on
data.primary.metricsanddata.primary.confirmationfor change-badge rendering.
Stats — Email sign-ups + Profiles created
- Email sign-ups —
metrics/eventType_11(raw count) summed acrossdaterangeyearrows from thesignupReport. Rendered as raw count with change badge. - Profiles created —
metrics/userAccount.createProfile(raw count) summed acrossdaterangeyearrows from the same query. Rendered as raw count with change badge. - Query shape — Separate
signupReportdimensioned byvariables/daterangeyear, filtered by date + webstore +variables/6a22e600309c9052a20c2044(previousPageType) =confirmation. Email signup and create-profile fire on the page load after the order is placed, so they carry previousPageType=confirmation rather than pageType=confirmation. Cart-to-order time remains on the separatecartToOrderReport(scoped by pageType=confirmation). Data surfaces ondata.primary.confirmation.emailSignupanddata.primary.confirmation.createProfile. Rendered as apanel-statswith change badges.
Middle panel — Where do visitors go next?
- Dimension:
variables/6a22e69f1d0e5033b0d64a9c(Next Page Type, derived) - Metric:
metrics/68ecf0054f7efa325ed87bbd(Page Views) - Filter: hit-scope segment
pageType=confirmation - Raw rows are grouped through
config.nextPageTypeGroups. Unmapped values fall through unchanged. - Exited Site is synthetic — computed as
max(0, pageViews(confirmation) − sum of recorded next-page page views). Highlighted red in the chart. - Shares are computed against total Confirmation page views so all bars sum to ≈100%.
Right stat — Exit rate from confirmation + Time spent on page
- Exit the site from confirmation % — The Exited Site share from the next-page breakdown, expressed as a percentage via
fmtPct(). Most confirmation views exit the site as expected for an order-complete page. Data surfaces ondata.primary.confirmation.exitRate. - Time spent on page —
metrics/adobe_timespent(Time Spent, seconds) /metrics/68ecf0054f7efa325ed87bbd(Page Views) from theconfirmationrow of the page-section report. Renders as seconds viafmtSecs(). - Both metrics displayed with comparison change badges.