OKR Report

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

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 the home row of the pageType-dimensioned report.
  • % visits interacting with content — visit-scope filtered metrics/visits. Per-metric filter on metricContainer.metricFilters[]: container context visits, predicate contains on variables/web.webPageDetails._polo.abTag with the token _hp_ from config.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 of ends-with(":home") and contains(":home:"). Handles both en_gb:home and 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 via bucketMidpoint() 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 via lightenHex(PALETTE.navy, i/(n-1) × 0.7). Rows whose abTag fails the regex are tallied under contentSlotsUnmatched for 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-footer with a top border.
  • Bounce rate (left, bold gold) — metrics/6926c991bce36d457543bdb3 (Single Page Visit) / metrics/visits from the home row. Change badge (grey) inline.
  • Time on page (right, bold gold) — metrics/adobe_timespent (Time Spent, seconds) / metrics/68ecf0054f7efa325ed87bbd (Page Views) from the home row. 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:

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 all daterangeyear rows in the date+webstore-scoped range.
  • Denominator: sessions on the storelocator row 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 as searchTypeSplit.uncategorisedEvents for 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, so london|30|mi and London|50|km roll up under one london entry.
  • Each group's events is the sum across variants; share is against the local-search total. Top 5 displayed.

Pie — Post-search interactions

  • Two metrics summed across daterangeyear rows 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-footer with a top border.
  • Bounce rate (left, bold gold) — same calculation as Home Page, picked from the storelocator row. Change badge (grey) inline.
  • Time on page (right, bold gold) — same calculation as Home Page, picked from the storelocator row. 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 / sessions from the plp row of the page-section report.
  • Visits clicking load more — metrics/web.webInteraction.name_2 (PLP View More) summed across daterangeyear rows / 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 across daterangeyear rows / 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 across daterangeyear rows / 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 value stacked are 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 across daterangeyear rows / 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 across daterangeyear rows, divided by PLP page views. Click rate per grid view.
  • Swatch interaction % — metrics/web.webInteraction.name_12 (PLP Swatch Interaction) summed across daterangeyear rows / PLP page views. Decorated with a row of four coloured polo SVGs.
  • Avg item clicks per visit (small caption) — same eventType_2 total / 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 in public/.

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), metric metrics/68ecf0054f7efa325ed87bbd (Page Views), filtered by pageType=plp. Rows grouped through config.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 across daterangeyear rows. 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-footer with a top border.
  • Bounce rate (left, bold gold) — bounce rate from the plp row. Change badge (grey) inline.
  • Time on page (right, bold gold) — time-on-page from the plp row. 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 the product row of the page-section report.
  • PDP Tab Opens bar list — Dimensioned by variables/698508bcba1a01744efacb39 (Tab Name), metric metrics/web.webInteraction.name_35 (PDP Tab Open). Localized tab labels mapped to four canonical buckets — Product Details, Delivery & Returns, Payment Options, Product Reviews — via bucketPdpTab(). Rendered via simpleRankedList() 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_14 summed across daterangeyear rows.
    • Out of Stock clicks — outOfStockClick (count). metrics/web.webInteraction.name_25 summed across daterangeyear rows.
    • Submits / Product View — notifyMeSubmitRate (%). notifyMeSubmit / productViewsTotal. productViewsTotal is metrics/68ecf0054f7efa325ed87bbd (Page Views) summed across daterangeyear.

Chart — Finding method breakdown

  • Dimension: variables/productListItems._polo.findingMethod
  • Metrics: metrics/68ecf0054f7efa325ed87bbd (Page Views, navy bars) and metrics/web.webInteraction.name_44 (Add to Cart, gold bars)
  • Scoped by date + webstore. Rendered via chartPanel with drawFindingMethodBar, 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 across daterangeyear rows / base.raw.pageViews (Standard Page Views on pageType=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 across daterangeyear rows / 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 across daterangeyear rows (scoped by date + webstore). Rendered via drawPie with 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-footer with a top border.
  • Bounce rate (left, bold gold) — metrics/6926c991bce36d457543bdb3 (Single Page Visit) / metrics/visits from the product row. Change badge (grey) inline.
  • Time on page (right, bold gold) — metrics/adobe_timespent (Time Spent, seconds) / metrics/68ecf0054f7efa325ed87bbd (Page Views) from the product row. 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-stats column, 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, from config.metrics) + metrics/web.webInteraction.name_10 (navClickSecondary) + metrics/web.webInteraction.name_5_1 (navClickContent). Summed across daterangeyear rows 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 across daterangeyear rows (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 on data.primary.overview + data.comparison.overview for easy badge rendering.

Second panel — Nav clicks and searches by page type (two stacked bar charts)

  • searchNavReport executes two separate parallel queries:
    • navBreakdownReport dimensioned by variables/${config.dimensions.pageType} (current page type) with three metrics for nav clicks: metrics/${config.metrics.navClickPrimary}, metrics/${config.metrics.navClickSecondary}, metrics/${config.metrics.navClickContent}.
    • searchBreakdownReport dimensioned by variables/${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 drawNextPageBar with grouped-bar styling. Data surfaces on data.primary.overview.navClicksByPageType and data.primary.overview.searchesByPageType.

Third panel — Meganav hover/click by level

  • searchNavReport runs a positionReport dimensioned by variables/${config.dimensions.meganavPosition} (Meganav Level, added to config) with two metrics: metrics/${config.metrics.meganavHover} (Meganav Hover, added) and metrics/${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 on data.primary.overview.meganavByPosition (array of { position, hover, click, displayValue }, displayValue is the computed percentage).
    • Meganav click by level — horizontal gold bars, same structure, showing share of total clicks per level. navTypeBreakdown field still returned by searchNavReport for backwards compatibility, but the pie chart render is removed.

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 existing overviewReport, 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 on data.primary.overview.searchAids (object with trendingSearch, 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)

  • searchNavReport runs two pageSectionReport calls in parallel — one for pageType=search-success and one for search-failed — then combines the results.
  • Each chart shows variables/6a22e69f1d0e5033b0d64a9c (Next Page Type, derived) dimensioned by the respective pageType, metric metrics/68ecf0054f7efa325ed87bbd (Page Views). Rows grouped through config.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-footer with a top border.
  • Bounce rate (left, bold gold) — metrics/6926c991bce36d457543bdb3 (Single Page Visit) / metrics/visits from 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 the cart row of the page-section report.
  • ATC → cart-view conversion — sessionsWithBoth / sessionsWithAtc, where sessionsWithBoth and sessionsWithAtc are visit-count metrics summed across daterangeyear rows via metricContainer.metricFilters (segment-filtered metrics/visits). Uses saved CJA segments config.segments.sessionsWithCartViewAndATC and config.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 / pageViews from data.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 to web.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 to eventType_18). Scoped by date + webstore. Rendered via drawPie with 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): cartFromWishlist rate (% of cart page views, bold gold), label "Wishlist to Cart", change badge. Under the heart (right): moveToWishlist rate (% 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 of metrics/${config.metrics.addToCart} (eventType_1) across daterangeyear rows with segment pageSubtype=wishlist, divided by cart page views. moveToWishlist: sum of metrics/${config.metrics.addToWishlist} (eventType_17) with segment pageType=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 across daterangeyear rows with pageType=cart, divided by cart page views.
  • Gift box removed — metrics/${config.metrics.giftBoxRemoved} (web.webInteraction.name_49). Summed across daterangeyear rows with pageType=cart, divided by cart page views.
  • Gift message added — metrics/${config.metrics.giftMessageAdded} (web.webInteraction.name_22). Summed across daterangeyear rows with pageType=cart, divided by cart page views.
  • Gift message removed — metrics/${config.metrics.giftMessageRemoved} (web.webInteraction.name_51). Summed across daterangeyear rows with pageType=cart, divided by cart page views.
  • Query shape — giftingReport dimensioned by variables/${config.dimensions.pageType} with nonesBehavior: '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 as applyCoupon / pageViews.
  • 100% stacked bar — Two horizontal segments: applyCoupon (navy) and couponFailed (red). Both metrics from couponsReport, dimensioned by variables/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 via simpleRankedList() 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-footer with a top border.
  • Bounce rate (left, bold gold) — metrics/6926c991bce36d457543bdb3 (Single Page Visit) / metrics/visits from the cart row. Change badge (grey) inline.
  • Time on page (right, bold gold) — metrics/adobe_timespent (Time Spent, seconds) / metrics/68ecf0054f7efa325ed87bbd (Page Views) from the cart row. 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 a daterangeyear-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 by metrics/${config.metrics.productViews} (Page Views). Run in a fourth parallel report pvFromWishlistReport, dimensioned by variables/daterangeyear, returning site-wide totals for both metrics. Result computed as pvFromWishlist / 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.nextPageTypeGroups to align with the next-page chart grouping. Top 7 sources shown; rendered via drawPie with a seven-colour palette (navy, gold, green, sand, dark-gold, light-gold, grey).

Two pending panels — Wishlist metrics (TBD)

  • Placeholder pendingPanel entries 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=account AND pageSubtype=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-footer with a top border.
  • Bounce rate (left, bold gold) — metrics/6926c991bce36d457543bdb3 (Single Page Visit) / metrics/visits from 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 the account row 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.loginLocation existing, filtered against total sessions. The userAccount.login metric cannot be used as a segment attribute, so sign-in presence is inferred from loginLocation existing (set on every login). Returned as data.primary.account.signInRate (null if zero sessions).
  • Profiles created — metrics/userAccount.createProfile (raw count) summed across daterangeyear rows. Returned as data.primary.account.createProfile.
  • Email sign-ups — metrics/eventType_11 (raw count) summed across daterangeyear rows. Returned as data.primary.account.emailSignup.
  • Query shape — signupReport dimensioned by variables/daterangeyear, scoped by date + webstore. Executes in parallel with the page-section base report. Metric container includes visit-scope segment hasSignIn for 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, a big-stat-pair grid displays profiles created and email sign-ups side-by-side as raw counts with change badges.
  • Supporting fields signInSessions and totalSessions stored for reference but not directly displayed.

Pie — Account page subtypes

  • Dimension: variables/${config.dimensions.pageSubtype} (Page Subtype under pageType=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 drawPie with 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 }) and data.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-footer with a top border.
  • Bounce rate (left, bold gold) — metrics/6926c991bce36d457543bdb3 (Single Page Visit) / metrics/visits from the account row. Change badge (grey) inline.
  • Time on page (right, bold gold) — metrics/adobe_timespent (Time Spent, seconds) / metrics/68ecf0054f7efa325ed87bbd (Page Views) from the account row. 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: shippingAddressViews and deliveryMethodViews.
  • Shipping address views per session — metrics/6929d2110fcfbf1b8c801e6e summed across daterangeyear rows, divided by metrics/visits (Sessions). Uses fmtRatio() 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/6929d22a8fdb5f53d707569b summed across daterangeyear rows, divided by sessions. Same fmtRatio() formatting.
  • Step conversion (address → delivery) — deliveryMethodViews / shippingAddressViews (null if address views are zero). Rendered as a percentage via fmtPct(). 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.metrics and data.comparison.metrics for 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 across daterangeyear rows with per-metric metricFilter: hit-scope segment pageType=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 across daterangeyear rows with per-metric metricFilter: hit-scope segment variables/web.webInteraction._polo.isChecked is "true". Isolates checked interactions from unchecked/neutral actions. Icon: envelope SVG.
  • Continue button clicks — metrics/web.webInteraction.name_56 (Continue Button Click) summed across daterangeyear rows. No additional filter applied; this metric is inherently scoped to the shipping address page by tagging. Icon: button with right-arrow SVG.
  • Query shape — interactionsReport runs in parallel with the address/delivery-views report inside shippingReport(). Both reports run via Promise.all, then aggregated in JS. Each metric filter and the no-filter metric are executed within a single metricContainer, so CJA engine costs are minimized. Data surfaces on data.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 via simpleRankedList() 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_21 summed across daterangeyear rows with pageType=checkout, divided by checkout page views.
  • Gift box removed — metrics/web.webInteraction.name_49 summed across daterangeyear rows with pageType=checkout, divided by checkout page views.
  • Gift message added — metrics/web.webInteraction.name_22 summed across daterangeyear rows with pageType=checkout, divided by checkout page views.
  • Gift message removed — metrics/web.webInteraction.name_51 summed across daterangeyear rows with pageType=checkout, divided by checkout page views.
  • Query shape — giftingReport dimensioned by variables/daterangeyear with globalFilters including pageType=checkout. All four gift metrics plus metrics/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 by metrics/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 by metrics/6929d22a8fdb5f53d707569b (Delivery Method Views). Indicates the proportion of visitors who reach the delivery method page but exit before proceeding to payment.
  • Query shape — exitReport dimensioned by variables/daterangeyear with metric filters on exitShip (segment-filtered sessions) and exitDeliv (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: paymentStepViews and paymentMethodChange.
  • Payment step views per session — metrics/6929d23c0fcfbf1b8c801e70 summed across daterangeyear rows, divided by metrics/visits (Sessions). Sessions filtered to include only those matching segments/sF18502BE5329FB670A490D4C@AdobeOrg_6a3ce4c2ef72d172f42e90d9 (Session Includes Payment Step). Uses fmtNumX() to display the multiplier (e.g., 1.51x).
  • Payment method change rate — metrics/web.webInteraction.name_63 (Payment Method Change) summed across daterangeyear rows, divided by metrics/6929d23c0fcfbf1b8c801e70 (Payment Step Views). Renders as a percentage via fmtPct(), indicating the proportion of payment-step views where a customer changed their method.
  • Both metrics live on data.primary.metrics and data.comparison.metrics for 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 drawPie with 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 by metrics/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 the confirmation row of the page-section report.
  • Average cart-to-order time — metrics/68b970ea0a84fd1cb3b1980c (Cart to Order Time, sum of seconds) summed across daterangeyear rows, divided by confirmation page views (≈ orders placed). Measures the average time elapsed between a product addition to cart and order completion. Renders as seconds via fmtSecs().
  • Both metrics live on data.primary.metrics and data.primary.confirmation for change-badge rendering.

Stats — Email sign-ups + Profiles created

  • Email sign-ups — metrics/eventType_11 (raw count) summed across daterangeyear rows from the signupReport. Rendered as raw count with change badge.
  • Profiles created — metrics/userAccount.createProfile (raw count) summed across daterangeyear rows from the same query. Rendered as raw count with change badge.
  • Query shape — Separate signupReport dimensioned by variables/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 separate cartToOrderReport (scoped by pageType=confirmation). Data surfaces on data.primary.confirmation.emailSignup and data.primary.confirmation.createProfile. Rendered as a panel-stats with 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 on data.primary.confirmation.exitRate.
  • Time spent on page — metrics/adobe_timespent (Time Spent, seconds) / metrics/68ecf0054f7efa325ed87bbd (Page Views) from the confirmation row of the page-section report. Renders as seconds via fmtSecs().
  • Both metrics displayed with comparison change badges.