{"id":91392,"date":"2026-06-24T07:32:42","date_gmt":"2026-06-24T07:32:42","guid":{"rendered":"https:\/\/www.bloomreach.com\/?page_id=91392"},"modified":"2026-08-26T09:05:00","modified_gmt":"2026-08-26T09:05:00","slug":"marketing-benchmarks","status":"publish","type":"page","link":"https:\/\/www.bloomreach.com\/en\/marketing-benchmarks","title":{"rendered":"Marketing Benchmarks"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"91392\" class=\"elementor elementor-91392\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a0f6188 brcontainer e-flex e-con-boxed e-con e-parent\" data-id=\"a0f6188\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-acbb7db e-con-full e-flex e-con e-child\" data-id=\"acbb7db\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-20b1a62 e-con-full e-flex e-con e-child\" data-id=\"20b1a62\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c39a2ae loomitext elementor-widget elementor-widget-heading\" data-id=\"c39a2ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Marketing Benchmarks<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-33a959e elementor-widget elementor-widget-heading\" data-id=\"33a959e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">How Commerce Brands Actually Perform Across Top Channels<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-558dee4 e-con-full e-flex e-con e-child\" data-id=\"558dee4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-18a5f9e elementor-widget elementor-widget-text-editor\" data-id=\"18a5f9e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Marketing benchmarks by industry powered by Bloomreach customer data. Email, SMS, push, web, and commerce\u2028\u2014 no guesswork, no industry report filler.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-babe3df e-con-full e-flex e-con e-child\" data-id=\"babe3df\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-555b5f6 e-con-full herobox e-flex e-con e-child\" data-id=\"555b5f6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-520cdd6 herobox-hdl elementor-widget elementor-widget-heading\" data-id=\"520cdd6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"><span>6<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-764bb6f elementor-widget elementor-widget-text-editor\" data-id=\"764bb6f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Channels<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-78cf531 e-con-full herobox e-flex e-con e-child\" data-id=\"78cf531\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-457ffaf herobox-hdl elementor-widget elementor-widget-heading\" data-id=\"457ffaf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"><span>15<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d0f5b5e elementor-widget elementor-widget-text-editor\" data-id=\"d0f5b5e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Metrics tracked<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8d324da e-con-full herobox e-flex e-con e-child\" data-id=\"8d324da\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6b061ee herobox-hdl elementor-widget elementor-widget-heading\" data-id=\"6b061ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"><span>16<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d2c1e5f elementor-widget elementor-widget-text-editor\" data-id=\"d2c1e5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Industries<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-40d1cba e-con-full e-flex e-con e-child\" data-id=\"40d1cba\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-09d8c58 e-con-full e-flex e-con e-child\" data-id=\"09d8c58\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0718ba5 elementor-widget elementor-widget-heading\" data-id=\"0718ba5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Built from real sends \u2014 not surveys.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-14b878a e-con-full e-flex e-con e-child\" data-id=\"14b878a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-94bd115 elementor-widget elementor-widget-text-editor\" data-id=\"94bd115\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>How to read this report<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c87258e elementor-widget elementor-widget-text-editor\" data-id=\"c87258e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Each figure in this report is an average from Bloomreach customers within that vertical. Email open and click rates reflect Bloomreach platform data and may include automated activity (e.g., security scanners, mail clients with link prefetching). We recommend using the figures as relative comparisons across industries.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-fa800c2 brcontainer e-flex e-con-boxed e-con e-parent\" data-id=\"fa800c2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-684f1f5 elementor-widget elementor-widget-html\" data-id=\"684f1f5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n#industryFilter,#periodFilter{text-transform:none!important}\n<\/style>\n<div class=\"br-graphs\">\n\n<aside class=\"toc\" aria-label=\"Section navigation\">\n  <div class=\"toc-label\">On this page<\/div>\n  <nav>\n    <a href=\"#sec-kpis\" data-target=\"sec-kpis\"><span>Headline numbers<\/span><\/a>\n    <a href=\"#sec-email-delivery\" data-target=\"sec-email-delivery\"><span>Email delivery<\/span><\/a>\n    <a href=\"#sec-email-open\" data-target=\"sec-email-open\"><span>Email open rate<\/span><\/a>\n    <a href=\"#sec-email-click\" data-target=\"sec-email-click\"><span>Email click rate<\/span><\/a>\n    <a href=\"#sec-sms-delivery\" data-target=\"sec-sms-delivery\"><span>SMS delivery<\/span><\/a>\n    <a href=\"#sec-sms-click\" data-target=\"sec-sms-click\"><span>SMS click rate<\/span><\/a>\n    <a href=\"#sec-basket\" data-target=\"sec-basket\"><span>Cart conversion<\/span><\/a>\n    <a href=\"#sec-table\" data-target=\"sec-table\"><span>Full benchmark table<\/span><\/a>\n    <a href=\"#sec-cta\" data-target=\"sec-cta\"><span>Talk to an expert<\/span><\/a>\n  <\/nav>\n<\/aside>\n\n<div class=\"wrap\" id=\"graphs-wrap\">\n\n  <div class=\"filter-bar\">\n    <div class=\"filter-inner\">\n      <span class=\"filter-label\">Filter by industry<\/span>\n      <select id=\"industryFilter\" class=\"filter-select\" aria-label=\"Filter benchmarks by industry\">\n        <option value=\"__all__\">All Industries (Averages)<\/option>\n      <\/select>\n      <span class=\"filter-label\">in<\/span>\n      <select id=\"periodFilter\" class=\"filter-select\" aria-label=\"Select reporting period\"><\/select>\n      <span class=\"filter-status\" id=\"filterStatus\">Showing the cross-industry average across all industries.<\/span>\n      <button id=\"filterClear\" class=\"filter-clear\" hidden=\"\">Clear filter<\/button>\n    <\/div>\n  <\/div>\n\n  <section class=\"kpi-section\" id=\"sec-kpis\">\n    <div class=\"kpi-header\">\n      <h2>Numbers To Know<\/h2>\n      <p>Averaged across all industries<\/p>\n    <\/div>\n    <div class=\"kpi-grid\">\n      <div class=\"kpi c-email\">\n        <div class=\"kpi-channel\"><\/div>\n        <div class=\"kpi-label\">Email delivery<\/div>\n        <div>\n          <div class=\"kpi-value loomitext\" data-kpi=\"emailDelivery\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n          <div class=\"kpi-ctx\">of messages reaching the inbox<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"kpi c-email\">\n        <div class=\"kpi-channel\"><\/div>\n        <div class=\"kpi-label\">Unique email open<\/div>\n        <div>\n          <div class=\"kpi-value loomitext\" data-kpi=\"emailOpen\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n          <div class=\"kpi-ctx\">of delivered messages opened<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"kpi c-email\">\n        <div class=\"kpi-channel\"><\/div>\n        <div class=\"kpi-label\">Unique email click<\/div>\n        <div>\n          <div class=\"kpi-value loomitext\" data-kpi=\"emailClick\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n          <div class=\"kpi-ctx\">of delivered messages clicked<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"kpi c-sms\">\n        <div class=\"kpi-channel\"><\/div>\n        <div class=\"kpi-label\">SMS delivery<\/div>\n        <div>\n          <div class=\"kpi-value loomitext\" data-kpi=\"smsDelivery\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n          <div class=\"kpi-ctx\">of messages delivered sucessfully<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"kpi c-sms\">\n        <div class=\"kpi-channel\"><\/div>\n        <div class=\"kpi-label\">SMS click rate<\/div>\n        <div>\n          <div class=\"kpi-value loomitext\" data-kpi=\"smsClick\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n          <div class=\"kpi-ctx\">of delivered messages clicked<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"kpi c-commerce\">\n        <div class=\"kpi-channel\"><\/div>\n        <div class=\"kpi-label\">Cart conversion<\/div>\n        <div>\n          <div class=\"kpi-value loomitext\" data-kpi=\"cartConv\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n          <div class=\"kpi-ctx\">carts that convert to orders<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"chart-section\" id=\"sec-email-delivery\">\n    <div class=\"chart-head\">\n      <h3>Email Delivery Rate by Industry<\/h3>\n      <div class=\"lead-stat\">\n        <div class=\"lead-num loomitext\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n        <div class=\"lead-lbl\">Average across industries<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"chart-container\">\n      <div class=\"chart-meta\">\n        <span>Alphabetical<\/span>\n      <\/div>\n      <div class=\"chart-wrap\" style=\"height: 640px;\">\n        <canvas id=\"deliveryChart\" role=\"img\" aria-label=\"Horizontal bar chart of email delivery rates by industry.\"><\/canvas>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"chart-section\" id=\"sec-email-open\">\n    <div class=\"chart-head\">\n      <h3>Unique Email Open Rate by Industry<\/h3>\n      <div class=\"lead-stat\">\n        <div class=\"lead-num loomitext\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n        <div class=\"lead-lbl\">Average across industries<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"chart-container\">\n      <div class=\"chart-meta\">\n        <span>Alphabetical<\/span>\n      <\/div>\n      <div class=\"chart-wrap\" style=\"height: 640px;\">\n        <canvas id=\"emailChart\" role=\"img\" aria-label=\"Horizontal bar chart of email unique open rates by industry.\"><\/canvas>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"chart-section\" id=\"sec-email-click\">\n    <div class=\"chart-head\">\n      <h3>Unique Email Click Rate by Industry<\/h3>\n      <div class=\"lead-stat\">\n        <div class=\"lead-num loomitext\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n        <div class=\"lead-lbl\">Average across industries<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"chart-container\">\n      <div class=\"chart-meta\">\n        <span>Alphabetical<\/span>\n      <\/div>\n      <div class=\"chart-wrap\" style=\"height: 640px;\">\n        <canvas id=\"clickChart\" role=\"img\" aria-label=\"Horizontal bar chart of email unique click rates by industry.\"><\/canvas>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"chart-section\" id=\"sec-sms-delivery\">\n    <div class=\"chart-head\">\n      <h3>SMS Delivery Rate by Industry<\/h3>\n      <div class=\"lead-stat\">\n        <div class=\"lead-num loomitext\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n        <div class=\"lead-lbl\">Average across reporting industries<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"chart-container\">\n      <div class=\"chart-meta\">\n        <span>Alphabetical<\/span>\n      <\/div>\n      <div class=\"chart-wrap\" style=\"height: 640px;\">\n        <canvas id=\"smsDeliveryChart\" role=\"img\" aria-label=\"Horizontal bar chart of SMS delivery rates by industry.\"><\/canvas>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"chart-section\" id=\"sec-sms-click\">\n    <div class=\"chart-head\">\n      <h3>SMS Click Rate by Industry<\/h3>\n      <div class=\"lead-stat\">\n        <div class=\"lead-num loomitext\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n        <div class=\"lead-lbl\">Average across reporting industries<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"chart-container\">\n      <div class=\"chart-meta\">\n        <span>Alphabetical<\/span>\n      <\/div>\n      <div class=\"chart-wrap\" style=\"height: 560px;\">\n        <canvas id=\"smsChart\" role=\"img\" aria-label=\"Horizontal bar chart of SMS click rates by industry.\"><\/canvas>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"chart-section\" id=\"sec-basket\">\n    <div class=\"chart-head\">\n      <h3>Cart Conversion Rate by Industry<\/h3>\n      <div class=\"lead-stat\">\n        <div class=\"lead-num loomitext\">\u2013<span style=\"font-size:0.5em;\">%<\/span><\/div>\n        <div class=\"lead-lbl\">Average across industries<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"chart-container\">\n      <div class=\"chart-meta\">\n        <span>Alphabetical<\/span>\n      <\/div>\n      <div class=\"chart-wrap\" style=\"height: 640px;\">\n        <canvas id=\"basketChart\" role=\"img\" aria-label=\"Horizontal bar chart of basket conversion rates by industry.\"><\/canvas>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"tbl-section\" id=\"sec-table\">\n    <div class=\"chart-head\">\n      <h3>The Complete Benchmark Table<\/h3>\n      <div class=\"lead-stat\">\n        <div class=\"lead-lbl\" style=\"font-size: 1px; text-transform: none; letter-spacing: 0; color: #3B3B3B; max-width: 280px\">Click any column header to sort. A dash indicates that there is insufficient data for that channel.<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"tbl-scroll\">\n      <table class=\"bench\" id=\"benchTable\">\n        <thead>\n          <tr>\n            <th data-col=\"name\" data-type=\"s\" data-tip=\"Industry classification of each reporting brand. Each row is the median of all brands in that vertical that sent through Bloomreach Engagement during the analysis window.\">Industry<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"emailDelivery\" data-type=\"n\" data-tip=\"Share of email sends accepted by the receiving mail server. (Accepted \u00f7 Attempted) \u00d7 100. Excludes hard bounces and provider blocks; soft bounces follow standard retry rules.\">Email Delivery<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"emailOpen\" data-type=\"n\" data-tip=\"Distinct recipients who opened at least once. (Unique Opens \u00f7 Delivered) \u00d7 100. Apple Mail Privacy opens are filtered out so the number reflects real engagement.\">Unique Email Open<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"emailClick\" data-type=\"n\" data-tip=\"Distinct recipients who clicked any tracked link at least once. (Unique Clicks \u00f7 Delivered) \u00d7 100. Bot and link-prefetch clicks are filtered before reporting.\">Unique Email Click<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"smsDelivery\" data-type=\"n\" data-tip=\"Share of SMS messages confirmed delivered by the carrier. (Delivered \u00f7 Submitted) \u00d7 100. Carrier-rejected and unreachable handsets are excluded.\">SMS Delivery<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"smsClick\" data-type=\"n\" data-tip=\"Distinct recipients who clicked the short-link in an SMS at least once. (Unique Short-Link Clicks \u00f7 Delivered) \u00d7 100. Only campaigns with tracked links are counted.\">SMS Click<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"cartConv\" data-type=\"n\" data-tip=\"Share of abandoned-cart recovery flows that completed a purchase within 7 days of trigger. (Recovered Carts \u00f7 Eligible Abandoned Carts) \u00d7 100.\">Cart Conversion<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"waDelivery\" data-type=\"n\" data-tip=\"Share of WhatsApp templates marked delivered by Meta's Cloud API. (Delivered \u00f7 Sent) \u00d7 100. Excludes opted-out and blocked recipients.\">WhatsApp Delivery<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"waOpen\" data-type=\"n\" data-tip=\"Distinct recipients whose device returned a 'read' receipt. (Unique Reads \u00f7 Delivered) \u00d7 100. Recipients with read-receipts disabled are not counted.\">WhatsApp Unique Open<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"waClick\" data-type=\"n\" data-tip=\"Distinct recipients who tapped a CTA, quick reply, or tracked link. (Unique Interactions \u00f7 Delivered) \u00d7 100. Only campaigns with at least one tracked element are included.\">WhatsApp Unique Click<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"pushDelivery\" data-type=\"n\" data-tip=\"Share of push payloads acknowledged by APNs\/FCM across both mobile and web channels. (Acknowledged \u00f7 Sent) \u00d7 100. Stale tokens are removed before send.\">Push Delivery<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"pushClick\" data-type=\"n\" data-tip=\"Distinct recipients who tapped a push notification across mobile and web. (Unique Taps \u00f7 Delivered) \u00d7 100. Excludes silent \/ data-only pushes.\">Push Click<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"mPushDelivery\" data-type=\"n\" data-tip=\"Mobile-only slice of push delivery \u2014 share of payloads accepted by APNs (iOS) and FCM (Android). (Accepted \u00f7 Sent) \u00d7 100.\">Mobile Push Delivery<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"mPushClick\" data-type=\"n\" data-tip=\"Distinct mobile recipients who opened the app from a push within 24 hours. (Unique Opens \u00f7 Delivered) \u00d7 100. App background launches are excluded.\">Mobile Push Click<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"wPushDelivery\" data-type=\"n\" data-tip=\"Web-only slice of push delivery \u2014 share of browser endpoints that accepted the payload. (Accepted \u00f7 Sent) \u00d7 100. Expired subscriptions are pruned weekly.\">Web Push Delivery<span class=\"si\">\u2195<\/span><\/th>\n            <th data-col=\"wPushClick\" data-type=\"n\" data-tip=\"Distinct browser sessions that clicked through a web push to the site. (Unique Clicks \u00f7 Delivered) \u00d7 100. Auto-dismissed notifications are excluded.\">Web Push Click<span class=\"si\">\u2195<\/span><\/th>\n          <\/tr>\n        <\/thead>\n        <tbody id=\"tableBody\"><\/tbody>\n      <\/table>\n    <\/div>\n  <\/section>\n\n<\/div>\n\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-049309e elementor-widget elementor-widget-html\" data-id=\"049309e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\nconst industries = [\n  {name:'Automotive',emailDelivery:98.7,emailOpen:40.8,emailClick:2.4,smsDelivery:90.5,smsClick:10.1,pushClick:2.6,basketConv:45.2,retention:32.0,orderFreq:1.7},\n  {name:'Cosmetics & Beauty',emailDelivery:98.1,emailOpen:35.3,emailClick:2.6,smsDelivery:91.8,smsClick:33.3,pushClick:4.2,basketConv:51.8,retention:46.0,orderFreq:1.4},\n  {name:'Education & Prof. Services',emailDelivery:98.9,emailOpen:41.2,emailClick:3.4,smsDelivery:92.7,smsClick:26.8,pushClick:6.6,basketConv:34.8,retention:53.9,orderFreq:2.8},\n  {name:'Entertainment & Media',emailDelivery:98.3,emailOpen:45.4,emailClick:4.1,smsDelivery:null,smsClick:null,pushClick:4.6,basketConv:59.0,retention:45.0,orderFreq:1.6},\n  {name:'Fashion & Accessories',emailDelivery:98.0,emailOpen:47.0,emailClick:3.5,smsDelivery:91.2,smsClick:30.0,pushClick:3.9,basketConv:40.2,retention:43.9,orderFreq:1.4},\n  {name:'Financial Services',emailDelivery:99.4,emailOpen:42.6,emailClick:3.0,smsDelivery:95.2,smsClick:29.9,pushClick:11.2,basketConv:25.0,retention:48.8,orderFreq:3.1},\n  {name:'Food & Beverage',emailDelivery:98.5,emailOpen:42.1,emailClick:3.2,smsDelivery:92.1,smsClick:40.1,pushClick:7.4,basketConv:42.7,retention:67.3,orderFreq:4.7},\n  {name:'Health & Wellness',emailDelivery:98.6,emailOpen:36.1,emailClick:2.1,smsDelivery:null,smsClick:null,pushClick:18.8,basketConv:31.1,retention:54.3,orderFreq:1.9},\n  {name:'Home & Garden',emailDelivery:98.2,emailOpen:47.4,emailClick:3.7,smsDelivery:90.8,smsClick:28.2,pushClick:3.3,basketConv:37.9,retention:34.7,orderFreq:1.5},\n  {name:'Hospitality & Restaurants',emailDelivery:98.8,emailOpen:48.6,emailClick:5.8,smsDelivery:93.0,smsClick:43.2,pushClick:7.3,basketConv:49.0,retention:41.0,orderFreq:1.6},\n  {name:'iGaming',emailDelivery:97.4,emailOpen:26.9,emailClick:1.7,smsDelivery:88.4,smsClick:22.0,pushClick:5.8,basketConv:100.0,retention:68.6,orderFreq:221.5},\n  {name:'Jewellery, Eyewear & Watches',emailDelivery:98.4,emailOpen:48.5,emailClick:4.5,smsDelivery:91.5,smsClick:39.2,pushClick:null,basketConv:36.7,retention:40.6,orderFreq:1.2},\n  {name:'Misc. Consumer Services',emailDelivery:98.0,emailOpen:43.3,emailClick:3.1,smsDelivery:90.2,smsClick:38.8,pushClick:6.8,basketConv:25.5,retention:55.4,orderFreq:9.9},\n  {name:'Misc. Products',emailDelivery:98.3,emailOpen:41.8,emailClick:2.9,smsDelivery:91.0,smsClick:29.2,pushClick:5.1,basketConv:38.9,retention:50.1,orderFreq:2.2},\n  {name:'Sports & Recreation',emailDelivery:98.5,emailOpen:44.7,emailClick:3.8,smsDelivery:92.4,smsClick:40.7,pushClick:11.5,basketConv:7.4,retention:34.7,orderFreq:1.4},\n  {name:'Technology & Electronics',emailDelivery:99.1,emailOpen:48.0,emailClick:4.7,smsDelivery:93.5,smsClick:38.3,pushClick:7.5,basketConv:57.1,retention:48.2,orderFreq:1.4},\n  {name:'Travel & Transportation',emailDelivery:98.6,emailOpen:45.5,emailClick:5.2,smsDelivery:89.7,smsClick:15.7,pushClick:16.4,basketConv:42.3,retention:47.7,orderFreq:3.0}\n];\n\nconst SPARK = '#FEE31B';\nconst SPARK_DARK = '#B4A813';\nconst ARCTIC = '#019ACE';\nconst ARCTIC_DARK = '#016D92';\nconst SUCCESS = '#01CE7F';\nconst GOLD_DARK = '#6B640B';\n\n\/\/ Chart.js defaults\nChart.defaults.font.family = \"'Bloomreach Sans', 'Space Grotesk', system-ui, sans-serif\";\nChart.defaults.font.size = 12;\n\nconst sortByName = (a, b) => a.name.localeCompare(b.name);\n\nconst CHART_MOBILE_BP = 420;\nconst Y_LABEL_MAX_W = 100;\nconst Y_LABEL_FONT = \"'Bloomreach Sans', 'Space Grotesk', system-ui, sans-serif\";\n\nfunction isSmallChartView(chart) {\n  if (chart?.canvas) {\n    const w = chart.canvas.getBoundingClientRect().width;\n    if (w > 0) return w < CHART_MOBILE_BP;\n  }\n  return window.innerWidth < CHART_MOBILE_BP;\n}\n\nfunction yLabelFontSpec(size, weight = 500) {\n  return `${weight} ${size}px ${Y_LABEL_FONT}`;\n}\n\nfunction mobileYLabelLines(text) {\n  if (!text) return [];\n  if (!text.includes(' ')) return [text];\n\n  const words = text.split(\/\\s+\/);\n  const lines = [];\n  let i = 0;\n\n  while (i < words.length) {\n    let line = words[i];\n    i++;\n    while (i < words.length && words[i] === '&') {\n      line += ' ' + words[i];\n      i++;\n    }\n    lines.push(line);\n  }\n\n  return lines;\n}\n\nfunction configureYTicks(chart, filterName) {\n  const y = chart.options.scales?.y;\n  const ticks = y?.ticks;\n  if (!ticks || !y) return;\n\n  if (!chart._originalLabels) {\n    chart._originalLabels = [...chart.data.labels];\n  }\n  chart._filterName = filterName || null;\n\n  const small = isSmallChartView(chart);\n  const tickColor = chart.options._yTickColor || '#000';\n  const originals = chart._originalLabels;\n\n  delete ticks.maxWidth;\n  chart.data.labels = [...originals];\n\n  y.afterFit = (axis) => {\n    if (isSmallChartView(chart)) {\n      axis.width = Y_LABEL_MAX_W;\n    }\n  };\n\n  chart.options.layout.padding.left = 0;\n\n  if (small) {\n    ticks.callback = () => '';\n    ticks.color = 'transparent';\n    ticks.font = { family: Y_LABEL_FONT, size: 11, weight: 500 };\n    ticks.padding = 8;\n  } else if (filterName) {\n    delete ticks.callback;\n    ticks.color = (ctx) => {\n      const label = originals[ctx.index];\n      return label === filterName ? tickColor : 'rgba(0,0,0,0.35)';\n    };\n    ticks.font = (ctx) => {\n      const label = originals[ctx.index];\n      const highlighted = label === filterName;\n      return {\n        family: Y_LABEL_FONT,\n        size: 13,\n        weight: highlighted ? 600 : 400\n      };\n    };\n    ticks.padding = 8;\n  } else {\n    delete ticks.callback;\n    ticks.color = tickColor;\n    ticks.font = {\n      family: Y_LABEL_FONT,\n      size: 12,\n      weight: 500\n    };\n    ticks.padding = 8;\n  }\n}\n\nconst mobileYLabels = {\n  id: 'mobileYLabels',\n  afterDraw(chart) {\n    if (!isSmallChartView(chart)) return;\n\n    const yScale = chart.scales.y;\n    const meta = chart.getDatasetMeta(0);\n    if (!yScale || !meta?.data?.length) return;\n\n    const labels = chart._originalLabels || chart.data.labels;\n    const filterName = chart._filterName || null;\n    const tickColor = chart.options._yTickColor || '#000';\n    const { ctx } = chart;\n    const x = yScale.right - 6;\n    const lineHeight = 12;\n\n    ctx.save();\n    ctx.textAlign = 'right';\n    ctx.textBaseline = 'middle';\n\n    meta.data.forEach((bar, i) => {\n      if (bar.hidden) return;\n      const raw = labels[i];\n      if (!raw) return;\n\n      const lines = mobileYLabelLines(raw);\n      const highlighted = filterName && raw === filterName;\n      const weight = filterName ? (highlighted ? 600 : 400) : 500;\n      const color = filterName\n        ? (highlighted ? tickColor : 'rgba(0,0,0,0.35)')\n        : tickColor;\n\n      ctx.font = yLabelFontSpec(11, weight);\n      ctx.fillStyle = color;\n\n      const totalH = lines.length * lineHeight;\n      let y = bar.y - (totalH - lineHeight) \/ 2 + lineHeight \/ 2;\n      lines.forEach((line) => {\n        ctx.fillText(line, x, y);\n        y += lineHeight;\n      });\n    });\n\n    ctx.restore();\n  }\n};\n\nconst barValueLabels = {\n  id: 'barValueLabels',\n  afterDatasetsDraw(chart) {\n    const { ctx, data } = chart;\n    const meta = chart.getDatasetMeta(0);\n    if (!meta?.visible) return;\n    ctx.save();\n    ctx.font = \"700 12px 'Space Grotesk', system-ui, sans-serif\";\n    ctx.fillStyle = chart.options.barLabelColor || '#000';\n    ctx.textAlign = 'right';\n    ctx.textBaseline = 'middle';\n    meta.data.forEach((bar, i) => {\n      const value = data.datasets[0].data[i];\n      if (value == null || bar.hidden) return;\n      const label = value.toFixed(1) + '%';\n      const pad = 10;\n      const barLeft = Math.min(bar.base, bar.x);\n      const barRight = Math.max(bar.base, bar.x);\n      const x = Math.max(barLeft + pad, barRight - pad);\n      ctx.fillText(label, x, bar.y);\n    });\n    ctx.restore();\n  }\n};\n\nChart.register(mobileYLabels, barValueLabels);\n\nconst commonOpts = (max, dark = false) => ({\n  indexAxis: 'y',\n  responsive: true,\n  maintainAspectRatio: false,\n  animation: { duration: 600, easing: 'easeOutQuart' },\n  layout: { padding: { left: 0, right: 20 } },\n  _yTickColor: dark ? '#FFFFFF' : '#000',\n  plugins: {\n    legend: { display: false },\n    tooltip: { enabled: false }\n  },\n  scales: {\n    x: {\n      min: 0, max,\n      grid: { color: dark ? 'rgba(255,255,255,0.08)' : '#000', drawBorder: false },\n      border: { display: false },\n      ticks: {\n        color: dark ? 'rgba(255,255,255,0.6)' : '#3B3B3B',\n        font: { family: \"'Space Grotesk'\", size: 11 },\n        callback: v => v + '%'\n      }\n    },\n    y: {\n      grid: { display: false },\n      border: { color: dark ? 'rgba(255,255,255,0.4)' : '#000', width: 1 },\n      ticks: {\n        color: dark ? '#FFFFFF' : '#000',\n        font: { family: \"'Bloomreach Sans'\", size: 12, weight: 500 },\n        padding: 8\n      }\n    }\n  }\n});\n\nconst barDataset = (sortedData, color) => ({\n  data: sortedData.map(d => d.v),\n  backgroundColor: sortedData.map(() => color),\n  borderWidth: 0,\n  borderRadius: 0,\n  borderSkipped: false,\n  barPercentage: 0.72\n});\n\nconst createBarChart = (root, id, sortedData, color, options, labelColor = '#000') => {\n  const el = root.querySelector('#' + id);\n  if (!el) return null;\n  return new Chart(el, {\n    type: 'bar',\n    data: {\n      labels: sortedData.map(d => d.name),\n      datasets: [barDataset(sortedData, color)]\n    },\n    options: { ...options, barLabelColor: labelColor, _yTickColor: options._yTickColor || '#000' }\n  });\n};\n\n\/\/ Each reporting period has its own copy of this shape (industries, per-metric arrays, table rows).\n\/\/ dashboardData1 (\"Q2 2026\"): pulled from report-downloaded.html (quarter 2026Q2, global \/ All-region medians).\nconst dashboardData1 = {\n  emailDeliveryData: [\n    {name:'Automotive', v:99.6},\n    {name:'Cosmetics & Beauty', v:99.7},\n    {name:'Education & Professional Services', v:99.5},\n    {name:'Entertainment & Media', v:99.6},\n    {name:'Fashion & Accessories', v:99.8},\n    {name:'Financial Services', v:99.1},\n    {name:'Food & Beverage', v:99.3},\n    {name:'Health & Wellness', v:98.2},\n    {name:'Home & Garden', v:99.6},\n    {name:'Hospitality & Restaurants', v:99.4},\n    {name:'Jewellery, Eyewear & Watches', v:99.3},\n    {name:'Miscellaneous Consumer Services', v:99.3},\n    {name:'Miscellaneous Products', v:99.6},\n    {name:'Sports & Recreation', v:99.7},\n    {name:'Technology & Electronics', v:99.8},\n    {name:'Travel & Transportation', v:99.0},\n    {name:'iGaming', v:99.4},\n  ],\n  emailClickData: [\n    {name:'Automotive', v:2.5},\n    {name:'Cosmetics & Beauty', v:1.0},\n    {name:'Education & Professional Services', v:1.4},\n    {name:'Entertainment & Media', v:2.3},\n    {name:'Fashion & Accessories', v:1.7},\n    {name:'Financial Services', v:1.9},\n    {name:'Food & Beverage', v:2.0},\n    {name:'Health & Wellness', v:4.1},\n    {name:'Home & Garden', v:2.4},\n    {name:'Hospitality & Restaurants', v:1.7},\n    {name:'Jewellery, Eyewear & Watches', v:1.9},\n    {name:'Miscellaneous Consumer Services', v:1.6},\n    {name:'Miscellaneous Products', v:1.7},\n    {name:'Sports & Recreation', v:1.4},\n    {name:'Technology & Electronics', v:3.1},\n    {name:'Travel & Transportation', v:2.8},\n    {name:'iGaming', v:1.8},\n  ],\n  smsDeliveryData: [\n    {name:'Automotive', v:null},\n    {name:'Cosmetics & Beauty', v:93.6},\n    {name:'Education & Professional Services', v:96.0},\n    {name:'Entertainment & Media', v:91.6},\n    {name:'Fashion & Accessories', v:94.1},\n    {name:'Financial Services', v:95.8},\n    {name:'Food & Beverage', v:96.1},\n    {name:'Health & Wellness', v:null},\n    {name:'Home & Garden', v:96.8},\n    {name:'Hospitality & Restaurants', v:94.2},\n    {name:'Jewellery, Eyewear & Watches', v:96.9},\n    {name:'Miscellaneous Consumer Services', v:93.9},\n    {name:'Miscellaneous Products', v:90.3},\n    {name:'Sports & Recreation', v:94.4},\n    {name:'Technology & Electronics', v:96.6},\n    {name:'Travel & Transportation', v:95.4},\n    {name:'iGaming', v:91.7},\n  ],\n  emailOpenData: [\n    {name:'Automotive', v:41.0},\n    {name:'Cosmetics & Beauty', v:36.0},\n    {name:'Education & Professional Services', v:33.8},\n    {name:'Entertainment & Media', v:44.7},\n    {name:'Fashion & Accessories', v:44.9},\n    {name:'Financial Services', v:40.0},\n    {name:'Food & Beverage', v:40.2},\n    {name:'Health & Wellness', v:31.0},\n    {name:'Home & Garden', v:44.5},\n    {name:'Hospitality & Restaurants', v:41.8},\n    {name:'Jewellery, Eyewear & Watches', v:46.3},\n    {name:'Miscellaneous Consumer Services', v:39.4},\n    {name:'Miscellaneous Products', v:39.5},\n    {name:'Sports & Recreation', v:37.5},\n    {name:'Technology & Electronics', v:46.1},\n    {name:'Travel & Transportation', v:46.4},\n    {name:'iGaming', v:25.3},\n  ],\n  cartConvData: [\n    {name:'Automotive', v:54.2},\n    {name:'Cosmetics & Beauty', v:27.6},\n    {name:'Education & Professional Services', v:43.2},\n    {name:'Entertainment & Media', v:59.4},\n    {name:'Fashion & Accessories', v:34.2},\n    {name:'Financial Services', v:4.9},\n    {name:'Food & Beverage', v:43.6},\n    {name:'Health & Wellness', v:38.3},\n    {name:'Home & Garden', v:33.0},\n    {name:'Hospitality & Restaurants', v:42.0},\n    {name:'Jewellery, Eyewear & Watches', v:26.9},\n    {name:'Miscellaneous Consumer Services', v:15.7},\n    {name:'Miscellaneous Products', v:35.1},\n    {name:'Sports & Recreation', v:null},\n    {name:'Technology & Electronics', v:60.9},\n    {name:'Travel & Transportation', v:40.9},\n    {name:'iGaming', v:100},\n  ],\n  smsClickData: [\n    {name:'Automotive', v:null},\n    {name:'Cosmetics & Beauty', v:28.8},\n    {name:'Education & Professional Services', v:35.5},\n    {name:'Entertainment & Media', v:null},\n    {name:'Fashion & Accessories', v:32.9},\n    {name:'Financial Services', v:45.3},\n    {name:'Food & Beverage', v:44.8},\n    {name:'Health & Wellness', v:null},\n    {name:'Home & Garden', v:22.7},\n    {name:'Hospitality & Restaurants', v:null},\n    {name:'Jewellery, Eyewear & Watches', v:38.6},\n    {name:'Miscellaneous Consumer Services', v:42.1},\n    {name:'Miscellaneous Products', v:30.0},\n    {name:'Sports & Recreation', v:32.5},\n    {name:'Technology & Electronics', v:null},\n    {name:'Travel & Transportation', v:26.7},\n    {name:'iGaming', v:20.7},\n  ],\n  tableRows: [\n    {name:'Automotive', emailDelivery:99.6, emailOpen:41.0, emailClick:2.5, smsDelivery:null, smsClick:null, cartConv:54.2, waDelivery:null, waOpen:null, waClick:null, pushDelivery:15.4, pushClick:5.7, mPushDelivery:null, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'Cosmetics & Beauty', emailDelivery:99.7, emailOpen:36.0, emailClick:1.0, smsDelivery:93.6, smsClick:28.8, cartConv:27.6, waDelivery:null, waOpen:null, waClick:null, pushDelivery:54.5, pushClick:4.1, mPushDelivery:41.8, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'Education & Professional Services', emailDelivery:99.5, emailOpen:33.8, emailClick:1.4, smsDelivery:96.0, smsClick:35.5, cartConv:43.2, waDelivery:83.5, waOpen:70.8, waClick:null, pushDelivery:39.6, pushClick:3.6, mPushDelivery:44.7, mPushClick:3.2, wPushDelivery:99.4, wPushClick:51.1},\n    {name:'Entertainment & Media', emailDelivery:99.6, emailOpen:44.7, emailClick:2.3, smsDelivery:91.6, smsClick:null, cartConv:59.4, waDelivery:74.9, waOpen:55.1, waClick:null, pushDelivery:40.1, pushClick:2.3, mPushDelivery:53.3, mPushClick:5.0, wPushDelivery:43.3, wPushClick:4.8},\n    {name:'Fashion & Accessories', emailDelivery:99.8, emailOpen:44.9, emailClick:1.7, smsDelivery:94.1, smsClick:32.9, cartConv:34.2, waDelivery:86.8, waOpen:78.2, waClick:null, pushDelivery:29.5, pushClick:1.9, mPushDelivery:37.6, mPushClick:3.3, wPushDelivery:18.9, wPushClick:3.7},\n    {name:'Financial Services', emailDelivery:99.1, emailOpen:40.0, emailClick:1.9, smsDelivery:95.8, smsClick:45.3, cartConv:4.9, waDelivery:null, waOpen:null, waClick:null, pushDelivery:58.8, pushClick:8.9, mPushDelivery:79.4, mPushClick:9.1, wPushDelivery:47.7, wPushClick:1.7},\n    {name:'Food & Beverage', emailDelivery:99.3, emailOpen:40.2, emailClick:2.0, smsDelivery:96.1, smsClick:44.8, cartConv:43.6, waDelivery:85.9, waOpen:71.7, waClick:null, pushDelivery:54.8, pushClick:5.5, mPushDelivery:77.2, mPushClick:6.5, wPushDelivery:null, wPushClick:null},\n    {name:'Health & Wellness', emailDelivery:98.2, emailOpen:31.0, emailClick:4.1, smsDelivery:null, smsClick:null, cartConv:38.3, waDelivery:null, waOpen:null, waClick:null, pushDelivery:null, pushClick:null, mPushDelivery:null, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'Home & Garden', emailDelivery:99.6, emailOpen:44.5, emailClick:2.4, smsDelivery:96.8, smsClick:22.7, cartConv:33.0, waDelivery:48.0, waOpen:84.5, waClick:null, pushDelivery:60.8, pushClick:4.7, mPushDelivery:24.2, mPushClick:6.6, wPushDelivery:24.8, wPushClick:2.6},\n    {name:'Hospitality & Restaurants', emailDelivery:99.4, emailOpen:41.8, emailClick:1.7, smsDelivery:94.2, smsClick:null, cartConv:42.0, waDelivery:null, waOpen:null, waClick:null, pushDelivery:42.5, pushClick:5.3, mPushDelivery:null, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'Jewellery, Eyewear & Watches', emailDelivery:99.3, emailOpen:46.3, emailClick:1.9, smsDelivery:96.9, smsClick:38.6, cartConv:26.9, waDelivery:null, waOpen:71.6, waClick:null, pushDelivery:null, pushClick:null, mPushDelivery:31.6, mPushClick:4.7, wPushDelivery:34.3, wPushClick:7.4},\n    {name:'Miscellaneous Consumer Services', emailDelivery:99.3, emailOpen:39.4, emailClick:1.6, smsDelivery:93.9, smsClick:42.1, cartConv:15.7, waDelivery:null, waOpen:null, waClick:null, pushDelivery:60.1, pushClick:4.1, mPushDelivery:54.5, mPushClick:2.4, wPushDelivery:24.8, wPushClick:1.7},\n    {name:'Miscellaneous Products', emailDelivery:99.6, emailOpen:39.5, emailClick:1.7, smsDelivery:90.3, smsClick:30.0, cartConv:35.1, waDelivery:73.0, waOpen:63.8, waClick:6.1, pushDelivery:63.4, pushClick:2.1, mPushDelivery:59.4, mPushClick:3.8, wPushDelivery:18.1, wPushClick:3.2},\n    {name:'Sports & Recreation', emailDelivery:99.7, emailOpen:37.5, emailClick:1.4, smsDelivery:94.4, smsClick:32.5, cartConv:null, waDelivery:null, waOpen:null, waClick:null, pushDelivery:18.5, pushClick:6.3, mPushDelivery:null, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'Technology & Electronics', emailDelivery:99.8, emailOpen:46.1, emailClick:3.1, smsDelivery:96.6, smsClick:null, cartConv:60.9, waDelivery:null, waOpen:null, waClick:null, pushDelivery:24.4, pushClick:4.9, mPushDelivery:null, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'Travel & Transportation', emailDelivery:99.0, emailOpen:46.4, emailClick:2.8, smsDelivery:95.4, smsClick:26.7, cartConv:40.9, waDelivery:null, waOpen:null, waClick:null, pushDelivery:48.3, pushClick:11.1, mPushDelivery:45, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'iGaming', emailDelivery:99.4, emailOpen:25.3, emailClick:1.8, smsDelivery:91.7, smsClick:20.7, cartConv:100, waDelivery:null, waOpen:null, waClick:null, pushDelivery:35.9, pushClick:4, mPushDelivery:41.2, mPushClick:7.2, wPushDelivery:38.5, wPushClick:1.3},\n  ],\n  \/\/ The report's own \"All industries\" row (pooled median across every reporting brand) \u2014 not a mean of\n  \/\/ the per-industry medians above, which skews high on cartConv because of the iGaming:100 outlier.\n  allAverages: { emailDelivery:99.5, emailOpen:40.4, emailClick:1.9, smsDelivery:94.1, smsClick:34.6, cartConv:36.2 }\n};\n\n\/\/ dashboardData2 (\"Q1 2026\"): the benchmark numbers this dashboard shipped with originally.\nconst dashboardData2 = {\n  emailDeliveryData: [\n    {name:'Automotive',                       v:97.6},\n    {name:'Cosmetics & Beauty',               v:99.3},\n    {name:'Education & Professional Services',v:98.3},\n    {name:'Entertainment & Media',            v:98.7},\n    {name:'Fashion',                          v:99.3},\n    {name:'Financial Services',               v:97.8},\n    {name:'Food & Beverage',                  v:98.5},\n    {name:'Health & Wellness',                v:95.9},\n    {name:'Home & Garden',                    v:98.8},\n    {name:'Hospitality & Restaurants',        v:98.5},\n    {name:'iGaming',                          v:99.0},\n    {name:'Jewelry',                          v:98.0},\n    {name:'Consumer Services',                v:97.2},\n    {name:'Sports & Recreation',              v:98.8},\n    {name:'Technology & Electronics',         v:99.2},\n    {name:'Travel & Transportation',          v:98.9},\n  ],\n  emailClickData: [\n    {name:'Automotive', v:4.2},\n    {name:'Cosmetics & Beauty', v:2.9},\n    {name:'Education & Professional Services', v:2.9},\n    {name:'Entertainment & Media', v:4.9},\n    {name:'Fashion', v:2.3},\n    {name:'Financial Services', v:3.4},\n    {name:'Food & Beverage', v:3.9},\n    {name:'Health & Wellness', v:4.5},\n    {name:'Home & Garden', v:4.3},\n    {name:'Hospitality & Restaurants', v:2.7},\n    {name:'iGaming', v:2.6},\n    {name:'Jewelry', v:4.4},\n    {name:'Consumer Services', v:3.9},\n    {name:'Sports & Recreation', v:1.9},\n    {name:'Technology & Electronics', v:3.9},\n    {name:'Travel & Transportation', v:4.0}\n  ],\n  smsDeliveryData: [\n    {name:'Automotive', v:91.0},\n    {name:'Cosmetics & Beauty', v:92.7},\n    {name:'Education & Professional Services', v:89.9},\n    {name:'Entertainment & Media', v:92.6},\n    {name:'Fashion', v:91.2},\n    {name:'Financial Services', v:93.3},\n    {name:'Food & Beverage', v:95.0},\n    {name:'Health & Wellness', v:72.8},\n    {name:'Home & Garden', v:95.4},\n    {name:'Hospitality & Restaurants', v:93.8},\n    {name:'iGaming', v:88.7},\n    {name:'Jewelry', v:97.8},\n    {name:'Consumer Services', v:90.2},\n    {name:'Sports & Recreation', v:95.0},\n    {name:'Technology & Electronics', v:90.5},\n    {name:'Travel & Transportation', v:93.0}\n  ],\n  emailOpenData: [\n    {name:'Automotive', v:40.8},\n    {name:'Cosmetics & Beauty', v:35.3},\n    {name:'Education & Professional Services', v:41.2},\n    {name:'Entertainment & Media', v:45.4},\n    {name:'Fashion', v:47.0},\n    {name:'Financial Services', v:42.6},\n    {name:'Food & Beverage', v:42.1},\n    {name:'Health & Wellness', v:36.1},\n    {name:'Home & Garden', v:47.4},\n    {name:'Hospitality & Restaurants', v:48.6},\n    {name:'iGaming', v:26.9},\n    {name:'Jewelry', v:48.5},\n    {name:'Consumer Services', v:43.3},\n    {name:'Sports & Recreation', v:44.7},\n    {name:'Technology & Electronics', v:48.0},\n    {name:'Travel & Transportation', v:45.5}\n  ],\n  cartConvData: [\n    {name:'Automotive', v:45.2},\n    {name:'Cosmetics & Beauty', v:51.8},\n    {name:'Education & Professional Services', v:34.8},\n    {name:'Entertainment & Media', v:59.0},\n    {name:'Fashion', v:40.2},\n    {name:'Financial Services', v:25.0},\n    {name:'Food & Beverage', v:42.7},\n    {name:'Health & Wellness', v:31.1},\n    {name:'Home & Garden', v:37.9},\n    {name:'Hospitality & Restaurants', v:49.0},\n    {name:'iGaming', v:null},\n    {name:'Jewelry', v:36.7},\n    {name:'Consumer Services', v:25.5},\n    {name:'Sports & Recreation', v:7.4},\n    {name:'Technology & Electronics', v:57.1},\n    {name:'Travel & Transportation', v:42.3}\n  ],\n  smsClickData: [\n    {name:'Automotive', v:10.1},\n    {name:'Cosmetics & Beauty', v:33.3},\n    {name:'Education & Professional Services', v:26.8},\n    {name:'Entertainment & Media', v:null},\n    {name:'Fashion', v:30.0},\n    {name:'Financial Services', v:29.9},\n    {name:'Food & Beverage', v:40.1},\n    {name:'Health & Wellness', v:null},\n    {name:'Home & Garden', v:28.2},\n    {name:'Hospitality & Restaurants', v:43.2},\n    {name:'iGaming', v:22.0},\n    {name:'Jewelry', v:39.2},\n    {name:'Consumer Services', v:38.8},\n    {name:'Sports & Recreation', v:40.7},\n    {name:'Technology & Electronics', v:38.3},\n    {name:'Travel & Transportation', v:15.7}\n  ],\n  tableRows: [\n    {name:'Automotive',                        emailDelivery:97.6, emailOpen:40.8, emailClick:4.2, smsDelivery:91.0, smsClick:10.1, cartConv:45.2, waDelivery:85.7, waOpen:80.4, waClick:null, pushDelivery:33.4, pushClick:2.6, mPushDelivery:27.4, mPushClick:3.3, wPushDelivery:36.1, wPushClick:2.2},\n    {name:'Cosmetics & Beauty',                emailDelivery:99.3, emailOpen:35.3, emailClick:2.9, smsDelivery:92.7, smsClick:33.3, cartConv:51.8, waDelivery:null, waOpen:null, waClick:null, pushDelivery:67.4, pushClick:4.2, mPushDelivery:67.4, mPushClick:4.2, wPushDelivery:null, wPushClick:null},\n    {name:'Education & Professional Services', emailDelivery:98.3, emailOpen:41.2, emailClick:2.9, smsDelivery:89.9, smsClick:26.8, cartConv:34.8, waDelivery:65.8, waOpen:54.4, waClick:10.9, pushDelivery:35.6, pushClick:6.6, mPushDelivery:38.7, mPushClick:6.1, wPushDelivery:32.4, wPushClick:1.9},\n    {name:'Entertainment & Media',             emailDelivery:98.7, emailOpen:45.4, emailClick:4.9, smsDelivery:92.6, smsClick:null, cartConv:59.0, waDelivery:null, waOpen:null, waClick:null, pushDelivery:35.6, pushClick:4.6, mPushDelivery:35.6, mPushClick:4.6, wPushDelivery:null, wPushClick:null},\n    {name:'Fashion',                           emailDelivery:99.3, emailOpen:47.0, emailClick:2.3, smsDelivery:91.2, smsClick:30.0, cartConv:40.2, waDelivery:66.4, waOpen:67.9, waClick:null, pushDelivery:39.8, pushClick:3.9, mPushDelivery:40.7, mPushClick:3.7, wPushDelivery:34.2, wPushClick:18.5},\n    {name:'Financial Services',                emailDelivery:97.8, emailOpen:42.6, emailClick:3.4, smsDelivery:93.3, smsClick:29.9, cartConv:25.0, waDelivery:90.8, waOpen:81.5, waClick:11.2, pushDelivery:58.3, pushClick:11.2, mPushDelivery:61.2, mPushClick:10.6, wPushDelivery:51.2, wPushClick:12.3},\n    {name:'Food & Beverage',                   emailDelivery:98.5, emailOpen:42.1, emailClick:3.9, smsDelivery:95.0, smsClick:40.1, cartConv:42.7, waDelivery:82.5, waOpen:84.3, waClick:null, pushDelivery:61.7, pushClick:7.4, mPushDelivery:61.7, mPushClick:7.4, wPushDelivery:null, wPushClick:null},\n    {name:'Health & Wellness',                 emailDelivery:95.9, emailOpen:36.1, emailClick:4.5, smsDelivery:72.8, smsClick:null, cartConv:31.1, waDelivery:null, waOpen:null, waClick:null, pushDelivery:28.7, pushClick:18.8, mPushDelivery:28.7, mPushClick:18.8, wPushDelivery:null, wPushClick:null},\n    {name:'Home & Garden',                     emailDelivery:98.8, emailOpen:47.4, emailClick:4.3, smsDelivery:95.4, smsClick:28.2, cartConv:37.9, waDelivery:95.8, waOpen:60.9, waClick:17.4, pushDelivery:54.3, pushClick:3.3, mPushDelivery:49.8, mPushClick:3.8, wPushDelivery:72.0, wPushClick:2.2},\n    {name:'Hospitality & Restaurants',         emailDelivery:98.5, emailOpen:48.6, emailClick:2.7, smsDelivery:93.8, smsClick:43.2, cartConv:49.0, waDelivery:87.9, waOpen:83.2, waClick:2.3, pushDelivery:42.2, pushClick:7.3, mPushDelivery:42.2, mPushClick:7.3, wPushDelivery:null, wPushClick:null},\n    {name:'iGaming',                           emailDelivery:99.0, emailOpen:26.9, emailClick:2.6, smsDelivery:88.7, smsClick:22.0, cartConv:null, waDelivery:null, waOpen:null, waClick:null, pushDelivery:37.3, pushClick:5.8, mPushDelivery:43.9, mPushClick:6.2, wPushDelivery:30.5, wPushClick:8.7},\n    {name:'Jewelry',                           emailDelivery:98.0, emailOpen:48.5, emailClick:4.4, smsDelivery:97.8, smsClick:39.2, cartConv:36.7, waDelivery:68.4, waOpen:77.0, waClick:16.5, pushDelivery:9.0, pushClick:null, mPushDelivery:9.0, mPushClick:null, wPushDelivery:null, wPushClick:null},\n    {name:'Consumer Services',                 emailDelivery:97.2, emailOpen:43.3, emailClick:3.9, smsDelivery:90.2, smsClick:38.8, cartConv:25.5, waDelivery:82.6, waOpen:67.9, waClick:null, pushDelivery:52.9, pushClick:6.8, mPushDelivery:54.8, mPushClick:6.6, wPushDelivery:46.0, wPushClick:8.9},\n    {name:'Sports & Recreation',               emailDelivery:98.8, emailOpen:44.7, emailClick:1.9, smsDelivery:95.0, smsClick:40.7, cartConv:7.4,  waDelivery:81.9, waOpen:58.5, waClick:0.4, pushDelivery:18.0, pushClick:11.5, mPushDelivery:15.4, mPushClick:13.8, wPushDelivery:28.1, wPushClick:6.7},\n    {name:'Technology & Electronics',          emailDelivery:99.2, emailOpen:48.0, emailClick:3.9, smsDelivery:90.5, smsClick:38.3, cartConv:57.1, waDelivery:null, waOpen:null, waClick:null, pushDelivery:52.9, pushClick:7.5, mPushDelivery:59.7, mPushClick:11.7, wPushDelivery:42.5, wPushClick:2.9},\n    {name:'Travel & Transportation',           emailDelivery:98.9, emailOpen:45.5, emailClick:4.0, smsDelivery:93.0, smsClick:15.7, cartConv:42.3, waDelivery:87.6, waOpen:79.5, waClick:null, pushDelivery:45.1, pushClick:16.4, mPushDelivery:43.6, mPushClick:17.2, wPushDelivery:54.2, wPushClick:18.8},\n  ]\n};\n\n\nconst pctCols = ['emailDelivery','emailOpen','emailClick','smsDelivery','smsClick','cartConv','waDelivery','waOpen','waClick','pushDelivery','pushClick','mPushDelivery','mPushClick','wPushDelivery','wPushClick'];\n\n\/\/ Reporting periods available in the \"Filter by industry ... in [period]\" selector, most recent first.\nconst PERIODS = [\n  { key: '2026Q2', label: 'Q2 2026', data: dashboardData1 },\n  { key: '2026Q1', label: 'Q1 2026', data: dashboardData2 }\n];\n\nconst LEAD_NUM_SECTIONS = {\n  emailDelivery: 'sec-email-delivery',\n  emailOpen: 'sec-email-open',\n  emailClick: 'sec-email-click',\n  smsDelivery: 'sec-sms-delivery',\n  smsClick: 'sec-sms-click',\n  cartConv: 'sec-basket'\n};\n\nfunction computeSorted(data) {\n  return {\n    dS: [...data.emailDeliveryData].sort(sortByName),\n    cS: [...data.emailClickData].sort(sortByName),\n    sdS: [...data.smsDeliveryData].sort(sortByName),\n    eS: [...data.emailOpenData].sort(sortByName),\n    bS: [...data.cartConvData].filter(d => d.v != null).sort(sortByName),\n    sS: [...data.smsClickData].filter(d => d.v != null).sort(sortByName),\n    tableRows: data.tableRows\n  };\n}\n\nfunction averageOf(arr) {\n  const vals = arr.map(d => d.v).filter(v => v != null);\n  return vals.length ? vals.reduce((a, b) => a + b, 0) \/ vals.length : null;\n}\n\nfunction initBrGraphs(root) {\n  const urlParams = new URLSearchParams(window.location.search);\n  const initialPeriod = PERIODS.find(p => p.key === urlParams.get('period')) || PERIODS[0];\n  const initialSorted = computeSorted(initialPeriod.data);\n\n  let sortCol = 'name', sortAsc = true;\n  let activeIndustry = urlParams.get('industry') || null;\n  let tableRows = initialSorted.tableRows;\n  let periodAverages = {};\n  let currentPeriodKey = initialPeriod.key;\n\n  const chartEmailDelivery = createBarChart(root, 'deliveryChart', initialSorted.dS, SPARK, {\n    ...commonOpts(100),\n    scales: { ...commonOpts(100).scales, x: { ...commonOpts(100).scales.x, min: 0, max: 100 } }\n  }, '#000');\n  const chartEmailClick = createBarChart(root, 'clickChart', initialSorted.cS, SPARK, commonOpts(7), '#000');\n  const chartSmsDelivery = createBarChart(root, 'smsDeliveryChart', initialSorted.sdS, ARCTIC, {\n    ...commonOpts(100),\n    scales: { ...commonOpts(100).scales, x: { ...commonOpts(100).scales.x, min: 70, max: 100 } }\n  }, '#fff');\n  const chartEmailOpen = createBarChart(root, 'emailChart', initialSorted.eS, SPARK, commonOpts(56), '#000');\n  const chartCartConv = createBarChart(root, 'basketChart', initialSorted.bS, SUCCESS, commonOpts(100), '#fff');\n  const chartSmsClick = createBarChart(root, 'smsChart', initialSorted.sS, ARCTIC, commonOpts(50, false), '#fff');\n\n  const chartRegistry = [\n    chartEmailDelivery && { chart: chartEmailDelivery, sortedData: initialSorted.dS, metric: 'emailDelivery', barColor: SPARK, labelColor: '#000' },\n    chartEmailOpen &&     { chart: chartEmailOpen,     sortedData: initialSorted.eS, metric: 'emailOpen',     barColor: SPARK, labelColor: '#000' },\n    chartEmailClick &&    { chart: chartEmailClick,    sortedData: initialSorted.cS, metric: 'emailClick',    barColor: SPARK, labelColor: '#000' },\n    chartSmsDelivery &&   { chart: chartSmsDelivery,   sortedData: initialSorted.sdS, metric: 'smsDelivery',  barColor: ARCTIC, labelColor: '#fff' },\n    chartSmsClick &&      { chart: chartSmsClick,      sortedData: initialSorted.sS, metric: 'smsClick',       barColor: ARCTIC, labelColor: '#fff' },\n    chartCartConv &&      { chart: chartCartConv,      sortedData: initialSorted.bS, metric: 'cartConv',       barColor: SUCCESS, labelColor: '#fff' },\n  ].filter(Boolean);\n\n  let resizeTimer;\n  const onChartsResize = () => {\n    clearTimeout(resizeTimer);\n    resizeTimer = setTimeout(() => {\n      chartRegistry.forEach(e => configureYTicks(e.chart, activeIndustry));\n      chartRegistry.forEach(e => e.chart.update('none'));\n    }, 150);\n  };\n  window.addEventListener('resize', onChartsResize);\n  if (typeof ResizeObserver !== 'undefined') {\n    const ro = new ResizeObserver(onChartsResize);\n    chartRegistry.forEach(e => {\n      const wrap = e.chart.canvas?.closest('.chart-wrap');\n      if (wrap) ro.observe(wrap);\n    });\n  }\n\n  function renderTable() {\n    const tableBody = root.querySelector('#tableBody');\n    if (!tableBody) return;\n    const source = activeIndustry ? tableRows.filter(r => r.name === activeIndustry) : tableRows;\n    const sorted = [...source].sort((a, b) => {\n      const av = a[sortCol], bv = b[sortCol];\n      if (av === null && bv === null) return 0;\n      if (av === null) return 1;\n      if (bv === null) return -1;\n      if (typeof av === 'string') return sortAsc ? av.localeCompare(bv) : bv.localeCompare(av);\n      return sortAsc ? av - bv : bv - av;\n    });\n    tableBody.innerHTML = sorted.map(d => {\n      const cells = pctCols.map(c => {\n        const v = d[c];\n        return v == null ? `<td class=\"na\">\u2014<\/td>` : `<td>${v.toFixed(1)}%<\/td>`;\n      }).join('');\n      return `<tr><td>${d.name}<\/td>${cells}<\/tr>`;\n    }).join('');\n    root.querySelectorAll('#benchTable th').forEach(th => {\n      th.classList.toggle('act', th.dataset.col === sortCol);\n      const si = th.querySelector('.si');\n      if (si) si.textContent = th.dataset.col === sortCol ? (sortAsc ? '\u2191' : '\u2193') : '\u2195';\n    });\n  }\n\n  root.querySelectorAll('#benchTable th').forEach(th => {\n    th.addEventListener('click', () => {\n      if (sortCol === th.dataset.col) sortAsc = !sortAsc;\n      else { sortCol = th.dataset.col; sortAsc = th.dataset.type === 's'; }\n      renderTable();\n    });\n  });\n\n  function recolorChart(entry, name) {\n    const { chart, sortedData, barColor } = entry;\n    const ds = chart.data.datasets[0];\n    const color = barColor || SPARK;\n    ds.backgroundColor = sortedData.map(d => {\n      if (!name) return color;\n      return d.name === name ? color : 'rgba(0,0,0,0.06)';\n    });\n    ds.borderWidth = 0;\n    configureYTicks(chart, name);\n    chart.update();\n  }\n\n  function updateLeadNums() {\n    Object.entries(LEAD_NUM_SECTIONS).forEach(([key, sectionId]) => {\n      const el = root.querySelector('#' + sectionId + ' .lead-num');\n      if (!el) return;\n      const avg = periodAverages[key];\n      el.innerHTML = (avg != null ? avg.toFixed(1) : '\u2014') + '<span style=\"font-size:0.5em;\">%<\/span>';\n    });\n  }\n\n  function updateKPIs(name) {\n    const row = name ? tableRows.find(r => r.name === name) : null;\n    root.querySelectorAll('.kpi-value[data-kpi]').forEach(el => {\n      const key = el.dataset.kpi;\n      let value;\n      if (row && row[key] != null) value = row[key].toFixed(1);\n      else if (row) value = null;\n      else value = periodAverages[key] != null ? periodAverages[key].toFixed(1) : null;\n      if (value === null) {\n        el.innerHTML = '<span style=\"color:#B6B6B6;font-size:0.7em;\">N\/A<\/span>';\n      } else {\n        el.innerHTML = value + '<span style=\"font-size:0.5em;\">%<\/span>';\n      }\n    });\n    const sub = root.querySelector('#sec-kpis .kpi-header p');\n    if (sub) {\n      sub.textContent = name\n        ? 'Showing ' + name + '\u2019s reported numbers across the six core metrics.'\n        : 'Averaged across all ' + tableRows.length + ' industries';\n    }\n  }\n\n  function syncUrl() {\n    const params = new URLSearchParams(window.location.search);\n    if (activeIndustry) params.set('industry', activeIndustry);\n    else params.delete('industry');\n    params.set('period', currentPeriodKey);\n    const qs = params.toString();\n    window.history.replaceState(null, '', window.location.pathname + (qs ? '?' + qs : '') + window.location.hash);\n  }\n\n  function applyFilter(name) {\n    activeIndustry = name || null;\n    chartRegistry.forEach(e => recolorChart(e, activeIndustry));\n    updateKPIs(activeIndustry);\n    renderTable();\n    const status = root.querySelector('#filterStatus');\n    const clearBtn = root.querySelector('#filterClear');\n    if (status) {\n      status.innerHTML = activeIndustry\n        ? 'Filtered to <b>' + activeIndustry + '<\/b>. Charts highlight this industry; the table shows just this row.'\n        : 'Showing the cross-industry average across all ' + tableRows.length + ' industries.';\n    }\n    if (clearBtn) clearBtn.hidden = !activeIndustry;\n    syncUrl();\n  }\n\n  const industryFilter = root.querySelector('#industryFilter');\n\n  function populateIndustryOptions() {\n    if (!industryFilter) return;\n    industryFilter.innerHTML = '<option value=\"__all__\">All Industries (Averages)<\/option>';\n    const names = [...new Set(tableRows.map(r => r.name))].sort((a, b) => a.localeCompare(b));\n    names.forEach(n => {\n      const opt = document.createElement('option');\n      opt.value = n;\n      opt.textContent = n;\n      industryFilter.appendChild(opt);\n    });\n    const stillValid = activeIndustry && names.includes(activeIndustry);\n    industryFilter.value = stillValid ? activeIndustry : '__all__';\n    if (!stillValid) activeIndustry = null;\n  }\n\n  function setPeriod(key) {\n    const period = PERIODS.find(p => p.key === key) || PERIODS[0];\n    currentPeriodKey = period.key;\n    if (periodFilter) periodFilter.value = period.key;\n    const sorted = computeSorted(period.data);\n    tableRows = sorted.tableRows;\n    \/\/ Prefer the source report's own \"All industries\" figure when we have one \u2014 it's the true\n    \/\/ pooled median across every reporting brand, not a mean of the per-industry medians, so it\n    \/\/ isn't skewed by an outlier industry the way averageOf() can be (e.g. cartConv + iGaming:100).\n    const official = period.data.allAverages || {};\n    periodAverages = {\n      emailDelivery: official.emailDelivery ?? averageOf(sorted.dS),\n      emailOpen: official.emailOpen ?? averageOf(sorted.eS),\n      emailClick: official.emailClick ?? averageOf(sorted.cS),\n      smsDelivery: official.smsDelivery ?? averageOf(sorted.sdS),\n      smsClick: official.smsClick ?? averageOf(sorted.sS),\n      cartConv: official.cartConv ?? averageOf(sorted.bS)\n    };\n\n    const sortedByMetric = {\n      emailDelivery: sorted.dS,\n      emailOpen: sorted.eS,\n      emailClick: sorted.cS,\n      smsDelivery: sorted.sdS,\n      smsClick: sorted.sS,\n      cartConv: sorted.bS\n    };\n    chartRegistry.forEach(e => {\n      const d = sortedByMetric[e.metric];\n      e.sortedData = d;\n      e.chart.data.labels = d.map(x => x.name);\n      e.chart.data.datasets[0].data = d.map(x => x.v);\n      delete e.chart._originalLabels;\n    });\n\n    populateIndustryOptions();\n    updateLeadNums();\n    applyFilter(activeIndustry);\n  }\n\n  if (industryFilter) {\n    industryFilter.addEventListener('change', (e) => {\n      const v = e.target.value;\n      applyFilter(v === '__all__' ? null : v);\n    });\n  }\n\n  const filterClear = root.querySelector('#filterClear');\n  if (filterClear) {\n    filterClear.addEventListener('click', () => {\n      if (industryFilter) industryFilter.value = '__all__';\n      applyFilter(null);\n    });\n  }\n\n  const periodFilter = root.querySelector('#periodFilter');\n  if (periodFilter) {\n    periodFilter.innerHTML = PERIODS.map(p => `<option value=\"${p.key}\">${p.label}<\/option>`).join('');\n    periodFilter.addEventListener('change', (e) => setPeriod(e.target.value));\n  }\n\n  root.querySelectorAll('.chart-container').forEach(el => {\n    el.style.border = 'none';\n  });\n\n  setPeriod(initialPeriod.key);\n}\n\nfunction onBrGraphsReady(fn) {\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', fn);\n  } else {\n    fn();\n  }\n}\n\nonBrGraphsReady(() => {\n  const root = document.querySelector('.br-graphs');\n  if (!root) return;\n  initBrGraphs(root);\n});\n\/\/ TOC active-section tracking\n(function(){\n  function init() {\n    const root = document.querySelector('.br-graphs');\n    if (!root) return;\n    const toc = root.querySelector('.toc');\n    const links = root.querySelectorAll('.toc a[data-target]');\n    if (!links.length || !toc) return;\n    const getSection = (id) => document.getElementById(id);\n    const sections = [...links].map(a => getSection(a.dataset.target)).filter(Boolean);\n    const graphsWrap = root.querySelector('#graphs-wrap');\n\n    const setActive = (id) => links.forEach(a => a.classList.toggle('active', a.dataset.target === id));\n\n    const updateTocVisibility = () => {\n      if (!graphsWrap || !toc) return;\n      const rect = graphsWrap.getBoundingClientRect();\n      const midY = window.innerHeight \/ 2;\n      toc.classList.toggle('visible', rect.top <= midY && rect.bottom >= midY);\n    };\n\n    const updateActiveSection = () => {\n      const tocTop = toc.getBoundingClientRect().top;\n      let cur = sections[0]?.id;\n      for (const s of sections) {\n        if (s.getBoundingClientRect().top <= tocTop) cur = s.id;\n        else break;\n      }\n      if (cur) setActive(cur);\n    };\n\n    const onScroll = () => {\n      updateActiveSection();\n      updateTocVisibility();\n    };\n\n    window.addEventListener('scroll', onScroll, { passive: true });\n    window.addEventListener('resize', onScroll, { passive: true });\n    onScroll();\n\n    links.forEach(a => a.addEventListener('click', (e) => {\n      e.preventDefault();\n      const t = getSection(a.dataset.target);\n      if (!t) return;\n      const delta = t.getBoundingClientRect().top - toc.getBoundingClientRect().top;\n      window.scrollTo({ top: window.scrollY + delta, behavior: 'smooth' });\n    }));\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\/\/ Header tooltips for the benchmark table\n(() => {\n  function init() {\n    const root = document.querySelector('.br-graphs');\n    if (!root) return;\n    const headers = root.querySelectorAll('table.bench th[data-tip]');\n    if (!headers.length) return;\n    const tip = document.createElement('div');\n    tip.className = 'col-tip';\n    tip.setAttribute('role', 'tooltip');\n    root.appendChild(tip);\n\n    function position(th) {\n      const rect = th.getBoundingClientRect();\n      const tipRect = tip.getBoundingClientRect();\n      let left = rect.left + rect.width \/ 2 - tipRect.width \/ 2;\n      left = Math.max(8, Math.min(left, window.innerWidth - tipRect.width - 8));\n      let top = rect.bottom + 8;\n      if (top + tipRect.height > window.innerHeight - 8) {\n        top = rect.top - tipRect.height - 8;\n      }\n      tip.style.left = left + 'px';\n      tip.style.top = top + 'px';\n    }\n\n    headers.forEach(th => {\n      th.addEventListener('mouseenter', () => {\n        const label = th.textContent.replace('\u2195','').replace('\u2191','').replace('\u2193','').trim();\n        tip.innerHTML = '<span class=\"col-tip-title\">' + label + '<\/span>' + th.dataset.tip;\n        tip.classList.add('show');\n        requestAnimationFrame(() => position(th));\n      });\n      th.addEventListener('mouseleave', () => {\n        tip.classList.remove('show');\n      });\n      th.addEventListener('focus', () => {\n        const label = th.textContent.replace('\u2195','').replace('\u2191','').replace('\u2193','').trim();\n        tip.innerHTML = '<span class=\"col-tip-title\">' + label + '<\/span>' + th.dataset.tip;\n        tip.classList.add('show');\n        requestAnimationFrame(() => position(th));\n      });\n      th.addEventListener('blur', () => tip.classList.remove('show'));\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f2022ca brcontainer e-flex e-con-boxed e-con e-parent\" data-id=\"f2022ca\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-17d0bbf e-con-full e-flex e-con e-child\" data-id=\"17d0bbf\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-9d5f503 e-con-full e-flex e-con e-child\" data-id=\"9d5f503\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f9a8d62 elementor-widget elementor-widget-html\" data-id=\"f9a8d62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"127\" height=\"49\" viewBox=\"0 0 127 49\" fill=\"none\">\n  <g clip-path=\"url(#clip0_7_716)\">\n    <g clip-path=\"url(#paint0_angular_7_716_clip_path)\" data-figma-skip-parse=\"true\"><g transform=\"matrix(-0.0297813 -0.0227454 0.0396328 -0.00427399 49.1233 30.9273)\"><foreignObject x=\"-3027.08\" y=\"-3027.08\" width=\"6054.15\" height=\"6054.15\"><div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" style=\"background:conic-gradient(from 90deg,rgba(0, 153, 206, 1) 0deg,rgba(253, 212, 0, 1) 64.8deg,rgba(0, 177, 218, 1) 298.8deg,rgba(0, 153, 206, 1) 360deg);height:100%;width:100%;opacity:1\"><\/div><\/foreignObject><\/g><\/g><path d=\"M102.05 2.61036C114.087 2.61036 123.877 12.3955 123.877 24.4255C123.877 36.4556 114.087 46.2407 102.05 46.2407H24.4397C12.4027 46.2407 2.61187 36.4556 2.61187 24.4255C2.61187 12.3955 12.4027 2.61036 24.4397 2.61036H102.05ZM102.05 0H24.4397C10.9438 0 0 10.9374 0 24.4255C0 37.9136 10.9438 48.8511 24.4397 48.8511H102.05C115.546 48.8511 126.489 37.9136 126.489 24.4255C126.489 10.9374 115.546 0 102.05 0Z\" data-figma-gradient-fill=\"{&quot;type&quot;:&quot;GRADIENT_ANGULAR&quot;,&quot;stops&quot;:[{&quot;color&quot;:{&quot;r&quot;:0.99215686321258545,&quot;g&quot;:0.83137255907058716,&quot;b&quot;:0.0,&quot;a&quot;:1.0},&quot;position&quot;:0.18000000715255737},{&quot;color&quot;:{&quot;r&quot;:0.0,&quot;g&quot;:0.69411766529083252,&quot;b&quot;:0.85490196943283081,&quot;a&quot;:1.0},&quot;position&quot;:0.82999998331069946},{&quot;color&quot;:{&quot;r&quot;:0.0,&quot;g&quot;:0.60000002384185791,&quot;b&quot;:0.80784314870834351,&quot;a&quot;:1.0},&quot;position&quot;:1.0}],&quot;stopsVar&quot;:[{&quot;color&quot;:{&quot;r&quot;:0.99215686321258545,&quot;g&quot;:0.83137255907058716,&quot;b&quot;:0.0,&quot;a&quot;:1.0},&quot;position&quot;:0.18000000715255737},{&quot;color&quot;:{&quot;r&quot;:0.0,&quot;g&quot;:0.69411766529083252,&quot;b&quot;:0.85490196943283081,&quot;a&quot;:1.0},&quot;position&quot;:0.82999998331069946},{&quot;color&quot;:{&quot;r&quot;:0.0,&quot;g&quot;:0.60000002384185791,&quot;b&quot;:0.80784314870834351,&quot;a&quot;:1.0},&quot;position&quot;:1.0}],&quot;transform&quot;:{&quot;m00&quot;:-59.562618255615234,&quot;m01&quot;:79.265525817871094,&quot;m02&quot;:39.271797180175781,&quot;m10&quot;:-45.490825653076172,&quot;m11&quot;:-8.5479774475097656,&quot;m12&quot;:57.946693420410156},&quot;opacity&quot;:1.0,&quot;blendMode&quot;:&quot;NORMAL&quot;,&quot;visible&quot;:true}\"\/>\n    <path d=\"M31.5439 34.4982V14.4395H34.7565V34.4982H31.5439Z\" fill=\"white\"\/>\n    <path d=\"M40.5661 33.815C39.4617 33.181 38.596 32.3159 37.9692 31.2195C37.3461 30.1232 37.0327 28.915 37.0327 27.5949C37.0327 26.2748 37.3461 25.0665 37.9692 23.9702C38.5923 22.8738 39.458 22.0087 40.5661 21.3747C41.6743 20.7408 42.9206 20.4238 44.3123 20.4238C45.7041 20.4238 46.9242 20.7408 48.0324 21.3747C49.1368 22.0087 50.0062 22.8738 50.6405 23.9702C51.2748 25.0665 51.592 26.2748 51.592 27.5949C51.592 28.915 51.2748 30.1232 50.6405 31.2195C50.0062 32.3159 49.1368 33.181 48.0324 33.815C46.9242 34.4489 45.6854 34.7659 44.3123 34.7659C42.9392 34.7659 41.6706 34.4489 40.5661 33.815ZM40.7676 29.7093C41.1146 30.3507 41.5997 30.8578 42.2266 31.2345C42.8497 31.6074 43.5474 31.7975 44.3123 31.7975C45.0772 31.7975 45.775 31.6111 46.3981 31.2345C47.0212 30.8615 47.51 30.3507 47.857 29.7093C48.204 29.0679 48.3794 28.3631 48.3794 27.5949C48.3794 26.8267 48.204 26.1219 47.857 25.4805C47.51 24.8391 47.0212 24.3319 46.3981 23.9553C45.775 23.5824 45.0772 23.3922 44.3123 23.3922C43.5474 23.3922 42.8497 23.5786 42.2266 23.9553C41.6034 24.3282 41.1146 24.8391 40.7676 25.4805C40.4206 26.1219 40.2453 26.8267 40.2453 27.5949C40.2453 28.3631 40.4206 29.0641 40.7676 29.7093Z\" fill=\"white\"\/>\n    <path d=\"M56.8979 33.815C55.7934 33.181 54.9278 32.3159 54.3009 31.2195C53.6778 30.1232 53.3644 28.915 53.3644 27.5949C53.3644 26.2748 53.6778 25.0665 54.3009 23.9702C54.924 22.8738 55.7897 22.0087 56.8979 21.3747C58.0061 20.7408 59.2523 20.4238 60.644 20.4238C62.0358 20.4238 63.2559 20.7408 64.3641 21.3747C65.4686 22.0087 66.3379 22.8738 66.9722 23.9702C67.6066 25.0665 67.9237 26.2748 67.9237 27.5949C67.9237 28.915 67.6066 30.1232 66.9722 31.2195C66.3379 32.3159 65.4686 33.181 64.3641 33.815C63.2559 34.4489 62.0171 34.7659 60.644 34.7659C59.2709 34.7659 58.0023 34.4489 56.8979 33.815ZM57.0956 29.7093C57.4426 30.3507 57.9277 30.8578 58.5545 31.2345C59.1777 31.6074 59.8754 31.7975 60.6403 31.7975C61.4052 31.7975 62.103 31.6111 62.7261 31.2345C63.3492 30.8615 63.838 30.3507 64.185 29.7093C64.532 29.0679 64.7074 28.3631 64.7074 27.5949C64.7074 26.8267 64.532 26.1219 64.185 25.4805C63.838 24.8391 63.3492 24.3319 62.7261 23.9553C62.103 23.5824 61.4052 23.3922 60.6403 23.3922C59.8754 23.3922 59.1777 23.5786 58.5545 23.9553C57.9314 24.3282 57.4426 24.8391 57.0956 25.4805C56.7486 26.1219 56.5733 26.8267 56.5733 27.5949C56.5733 28.3631 56.7486 29.0641 57.0956 29.7093Z\" fill=\"white\"\/>\n    <path d=\"M89.7738 21.1251C90.6581 21.5875 91.3596 22.2587 91.8894 23.1313C92.4155 24.0039 92.6804 25.0294 92.6804 26.2078V34.4976H89.4678V26.7411C89.4492 25.723 89.132 24.9138 88.5163 24.306C87.9007 23.7019 87.1395 23.3961 86.2291 23.3961C85.3187 23.3961 84.5612 23.7093 83.953 24.3321C83.3448 24.9548 83.0351 25.7305 83.0165 26.659V34.4976H79.8039V26.7411C79.8039 25.723 79.5016 24.9138 78.8935 24.306C78.2853 23.7019 77.5092 23.3961 76.5652 23.3961C75.6211 23.3961 74.8936 23.7205 74.2779 24.3731C73.6622 25.0257 73.3563 25.82 73.3563 26.7672V34.4976H70.1437V20.6962H73.3563V22.2997C73.8749 21.6956 74.4906 21.2295 75.2033 20.9088C75.9159 20.5881 76.6659 20.4277 77.4532 20.4277C78.3972 20.4277 79.2778 20.6328 80.0875 21.043C80.9009 21.4532 81.5538 22.0312 82.0538 22.7808C82.6061 22.0312 83.3075 21.4532 84.1545 21.043C85.0015 20.6328 85.9082 20.4277 86.8709 20.4277C87.9231 20.4277 88.8932 20.6589 89.7738 21.1251Z\" fill=\"white\"\/>\n    <path d=\"M95.5723 18.1942C95.1693 17.7914 94.9716 17.288 94.9716 16.6839C94.9716 16.0798 95.1731 15.5726 95.5723 15.1736C95.9753 14.7709 96.479 14.5732 97.0834 14.5732C97.6879 14.5732 98.1954 14.7746 98.5946 15.1736C98.9938 15.5726 99.1953 16.0798 99.1953 16.6839C99.1953 17.288 98.9938 17.7952 98.5946 18.1942C98.1916 18.5969 97.6879 18.7946 97.0834 18.7946C96.479 18.7946 95.9715 18.5932 95.5723 18.1942ZM95.479 20.6964H98.6916V34.4978H95.479V20.6964Z\" fill=\"white\"\/>\n  <\/g>\n  <defs>\n    <clipPath id=\"paint0_angular_7_716_clip_path\"><path d=\"M102.05 2.61036C114.087 2.61036 123.877 12.3955 123.877 24.4255C123.877 36.4556 114.087 46.2407 102.05 46.2407H24.4397C12.4027 46.2407 2.61187 36.4556 2.61187 24.4255C2.61187 12.3955 12.4027 2.61036 24.4397 2.61036H102.05ZM102.05 0H24.4397C10.9438 0 0 10.9374 0 24.4255C0 37.9136 10.9438 48.8511 24.4397 48.8511H102.05C115.546 48.8511 126.489 37.9136 126.489 24.4255C126.489 10.9374 115.546 0 102.05 0Z\"\/><\/clipPath><clipPath id=\"clip0_7_716\">\n      <rect width=\"126.453\" height=\"48.8652\" fill=\"white\"\/>\n    <\/clipPath>\n  <\/defs>\n<\/svg>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e84457 elementor-widget elementor-widget-heading\" data-id=\"4e84457\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"sec-cta\" data-target=\"sec-cta\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span>See a Gap Worth Closing<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3b1122e elementor-widget elementor-widget-text-editor\" data-id=\"3b1122e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Join us live on September 23 to see exactly where you land \u2014 and why closing it isn&#8217;t about effort.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b882339 elementor-widget elementor-widget-bloomreach_buttons\" data-id=\"b882339\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"bloomreach_buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div><\/div>        <a class=\"br-cta  br-cta--custom\" href=\"https:\/\/visit.bloomreach.com\/enterprise-email-gap\" target=\"_blank\" rel=\"noopener\"><strong>Register Now<\/strong><span><\/span><\/a>\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Marketing Benchmarks How Commerce Brands Actually Perform Across Top Channels Marketing benchmarks by industry powered by Bloomreach customer data. Email, SMS, push, web, and commerce\u2028\u2014 no guesswork, no industry report filler. 6 Channels 15 Metrics tracked 16 Industries Built from real sends \u2014 not surveys. How to read this report Each figure in this report [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-91392","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/pages\/91392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/comments?post=91392"}],"version-history":[{"count":5,"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/pages\/91392\/revisions"}],"predecessor-version":[{"id":94788,"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/pages\/91392\/revisions\/94788"}],"wp:attachment":[{"href":"https:\/\/www.bloomreach.com\/en\/wp-json\/wp\/v2\/media?parent=91392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}