1<!DOCTYPE html> 2<html lang="en-US"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> 7<link rel="preconnect" href="https://fonts.googleapis.com"> 8<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 9<link rel="icon" type="image/svg+xml" href="https://changetower.com/wp-content/themes/changetower-theme/assets/favicon.svg"> 10 11 <!-- This site is optimized with the Yoast SEO plugin v27.4 - https://yoast.com/product/yoast-seo-wordpress/ --> 12 <title>Price Monitoring Software & Restock Alerts | ChangeTower</title> 13 <meta name="description" content="Watch product, deal and pricing pages as often as every 5 minutes. Get alerted on a price drop, a restock or a new code, with a dated snapshot each time." /> 14 <link rel="canonical" href="https://changetower.com/solutions/product-monitoring/" /> 15 <meta property="og:locale" content="en_US" /> 16 <meta property="og:type" content="article" /> 17 <meta property="og:title" content="Price Monitoring Software & Restock Alerts | ChangeTower" /> 18 <meta property="og:description" content="Watch product, deal and pricing pages as often as every 5 minutes. Get alerted on a price drop, a restock or a new code, with a dated snapshot each time." /> 19 <meta property="og:url" content="https://changetower.com/solutions/product-monitoring/" /> 20 <meta property="og:site_name" content="ChangeTower" /> 21 <meta property="article:modified_time" content="2026-09-10T15:28:23+00:00" /> 22 <meta name="twitter:card" content="summary_large_image" /> 23 <meta name="twitter:label1" content="Est. reading time" /> 24 <meta name="twitter:data1" content="35 minutes" /> 25
25<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/changetower.com\/solutions\/product-monitoring\/","url":"https:\/\/changetower.com\/solutions\/product-monitoring\/","name":"Price Monitoring Software & Restock Alerts | ChangeTower","isPartOf":{"@id":"https:\/\/changetower.com\/#website"},"datePublished":"2026-08-10T09:43:49+00:00","dateModified":"2026-09-10T15:28:23+00:00","description":"Watch product, deal and pricing pages as often as every 5 minutes. Get alerted on a price drop, a restock or a new code, with a dated snapshot each time.","breadcrumb":{"@id":"https:\/\/changetower.com\/solutions\/product-monitoring\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/changetower.com\/solutions\/product-monitoring\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/changetower.com\/solutions\/product-monitoring\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/changetower.com\/"},{"@type":"ListItem","position":2,"name":"Solutions","item":"https:\/\/changetower.com\/solutions\/"},{"@type":"ListItem","position":3,"name":"Price & Product Monitoring"}]},{"@type":"WebSite","@id":"https:\/\/changetower.com\/#website","url":"https:\/\/changetower.com\/","name":"ChangeTower","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/changetower.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}</script>
25 26 <!-- / Yoast SEO plugin. --> 27 28 29<link rel='dns-prefetch' href='//fonts.googleapis.com' /> 30<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://changetower.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fchangetower.com%2Fsolutions%2Fproduct-monitoring%2F" /> 31<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://changetower.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fchangetower.com%2Fsolutions%2Fproduct-monitoring%2F&format=xml" /> 32<style id="wp-img-auto-sizes-contain-inline-css"> 33img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 34/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 35</style> 36<style id="wp-emoji-styles-inline-css"> 37 38 img.wp-smiley, img.emoji { 39 display: inline !important; 40 border: none !important; 41 box-shadow: none !important; 42 height: 1em !important; 43 width: 1em !important; 44 margin: 0 0.07em !important; 45 vertical-align: -0.1em !important; 46 background: none !important; 47 padding: 0 !important; 48 } 49/*# sourceURL=wp-emoji-styles-inline-css */ 50</style> 51<style id="classic-theme-styles-inline-css"> 52/*! This file is auto-generated */ 53.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 54/*# sourceURL=/wp-includes/css/classic-themes.min.css */ 55</style> 56<style id="global-styles-inline-css"> 57:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
57--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
57.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 58:root :where(.wp-block-icon svg){width: 24px;} 59:where(.wp-block-gallery.is-layout-flex){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );}:where(.wp-block-gallery.is-layout-grid){gap: var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) );} 60:where(.wp-block-latest-posts.is-layout-flex){gap: 1.25em;}:where(.wp-block-latest-posts.is-layout-grid){gap: 1.25em;} 61:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} 62:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;} 63:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} 64:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} 65/*# sourceURL=global-styles-inline-css */ 66</style> 67<link rel='stylesheet' id='changetower-mcp-fonts-css' href='https://fonts.googleapis.com/css2?family=Funnel+Display:wght@400;500;600;700&family=Inter:wght@400;500;600;700&display=swap' media='all' /> 68<link rel='stylesheet' id='changetower-mcp-css' href='https://changetower.com/wp-content/plugins/ct-mcp-plugin/dist/frontend.css?ver=1784125683' media='all' /> 69<link rel='stylesheet' id='changetower-fonts-css' href='https://fonts.googleapis.com/css2?family=Funnel+Display:wght@300;400;500;600;700;800&family=Inter:wght@400;500;600;700&display=swap' media='all' /> 70<link rel='stylesheet' id='changetower-main-css' href='https://changetower.com/wp-content/themes/changetower-theme/assets/css/main.css?ver=1.0.0' media='all' /> 71<link rel='stylesheet' id='elementor-frontend-css' href='https://changetower.com/wp-content/plugins/elementor/assets/css/frontend.min.css?ver=4.1.5' media='all' /> 72<style id="elementor-frontend-inline-css"> 73.e-heading-base a, .e-paragraph-base a { all: unset; cursor: pointer; }form[data-element_type="e-form"].form-state-success [data-element_type="e-form-success-message"],form[data-element_type="e-form"].form-state-error [data-element_type="e-form-error-message"]{ display: block; } 74/*# sourceURL=elementor-frontend-inline-css */ 75</style> 76<link rel='stylesheet' id='elementor-post-286-css' href='https://changetower.com/wp-content/uploads/elementor/css/post-286.css?ver=1790764241' media='all' /> 77<link rel='stylesheet' id='elementor-post-932-css' href='https://changetower.com/wp-content/uploads/elementor/css/post-932.css?ver=1790771350' media='all' /> 78<link rel='stylesheet' id='base-desktop-css' href='https://changetower.com/wp-content/uploads/elementor/css/base-desktop.css?ver=6abce4d18ba91' media='all' /> 79<link rel='stylesheet' id='elementor-gf-inter-css' href='https://fonts.googleapis.com/css?family=Inter:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic&display=swap' media='all' />
80<script id="jquery-core-js" src="https://changetower.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 80
80
81<script id="jquery-migrate-js" src="https://changetower.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
81 82<link rel="https://api.w.org/" href="https://changetower.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://changetower.com/wp-json/wp/v2/pages/932" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://changetower.com/xmlrpc.php?rsd" /> 83<meta name="generator" content="WordPress 7.1.2" /> 84<link rel='shortlink' href='https://changetower.com/?p=932' /> 85<!-- HFCM by 99 Robots - Snippet # 1: --> 86<!-- Start of HubSpot Embed Code -->
87<script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/50280033.js"></script>
87 88<!-- End of HubSpot Embed Code --> 89<!-- /end HFCM by 99 Robots --> 90<!-- HFCM by 99 Robots - Snippet # 2: Tracking Scripts -->
91<script src="https://analytics.ahrefs.com/analytics.js" data-key="n/ayaoWWa4s6rbPTfizXqA" async></script>
91 92 93<!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 65 bytes, lines 93-94
93 94<script async src="https://www.googletagmanager.com/gtag/js?id=
94G-89418TDEEM
vendor: 13 bytes, line 94
94"></script>
95<script>
vendor: 132 bytes, lines 96-100
96window.dataLayer = window.dataLayer || []; 97function gtag(){dataLayer.push(arguments);} 98gtag('js', new Date()); 99 100gtag('config', '
100G-89418TDEEM
vendor: 5 bytes, line 100
100');
101gtag('config', 'AW-478850046', { 102 'allow_enhanced_conversions': true 103}); 104</script>
104 105 106<!-- Start cookieyes banner -->
106<script id="cookieyes" type="text/javascript" src="https://cdn-cookieyes.com/client_data/6d32b7e0aac45271fb7cb9c9/script.js"></script>
106 <!-- End cookieyes banner --> 107
108<script type="text/javascript"> 109 (function(c,l,a,r,i,t,y){ 110 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 111 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 112 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 113 })(window, document, "clarity", "script", "uonxn933g4"); 114</script>
114 115 116<!-- Start of HubSpot Embed Code -->
117<script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/50280033.js"></script>
117 118<!-- End of HubSpot Embed Code --> 119
120<script> 121 !function(t,e){var o,n,p,r;e.__SV||(window.posthog && window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init ts ns yi rs os Qr es capture Hi calculateEventProperties hs register register_once register_for_session unregister unregister_for_session fs getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException startExceptionAutocapture stopExceptionAutocapture loadToolbar get_property getSessionProperty vs us createPersonProfile cs Yr ps opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing ls debug O ds getPageViewId captureTraceFeedback captureTraceMetric Vr".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); 122 posthog.init('phc_s0LOCPSMuZqwXDfAoXjuWoA4Qqpy6WVuofzLBbnqyLL', { 123 api_host: 'https://e.changetower.com', 124 defaults: '2025-11-30', 125 person_profiles: 'identified_only', // or 'always' to create profiles for anonymous users as well 126 capture_exceptions: false, 127 }) 128</script>
128 129<!-- /end HFCM by 99 Robots --> 130<!-- HFCM by 99 Robots - Snippet # 3: Intercom -->
131<script> 132Â Â window.intercomSettings = { 133Â Â Â Â api_base: âhttps://api-iam.intercom.ioâ, 134Â Â Â Â app_id: âp3dsxd50", 135Â Â Â Â user_id: user.id, // IMPORTANT: Replace âuser.idâ with the variable you use to capture the userâs ID 136Â Â Â Â name: user.name, // IMPORTANT: Replace âuser.nameâ with the variable you use to capture the userâs name 137Â Â Â Â email: user.email, // IMPORTANT: Replace âuser.emailâ with the variable you use to capture the userâs email address 138Â Â Â Â created_at: user.createdAt, // IMPORTANT: Replace âuser.createdAtâ with the variable you use to capture the userâs sign-up date 139Â Â }; 140</script>
140 141 142 143
144<script> 145Â Â // We pre-filled your app ID in the widget URL: âhttps://widget.intercom.io/widget/p3dsxd50â 146Â Â (function(){var w=window;var ic=w.Intercom;if(typeof ic===âfunctionâ){ic(âreattach_activatorâ);ic(âupdateâ,w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement(âscriptâ);s.type=âtext/javascriptâ;s.async=true;s.src=âhttps://widget.intercom.io/widget/p3dsxd50';var x=d.getElementsByTagName(âscriptâ)[0];x.parentNode.insertBefore(s,x);};if(document.readyState===âcompleteâ){l();}else if(w.attachEvent){w.attachEvent(âonloadâ,l);}else{w.addEventListener(âloadâ,l,false);}}})(); 147</script>
147 148<!-- /end HFCM by 99 Robots --> 149<meta name="generator" content="Elementor 4.1.5; features: e_font_icon_svg, additional_custom_breakpoints; settings: css_print_method-external, google_font-enabled, font_display-swap"> 150 <style> 151 .e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload), 152 .e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) * { 153 background-image: none !important; 154 } 155 @media screen and (max-height: 1024px) { 156 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload), 157 .e-con.e-parent:nth-of-type(n+3):not(.e-lazyloaded):not(.e-no-lazyload) * { 158 background-image: none !important; 159 } 160 } 161 @media screen and (max-height: 640px) { 162 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload), 163 .e-con.e-parent:nth-of-type(n+2):not(.e-lazyloaded):not(.e-no-lazyload) * { 164 background-image: none !important; 165 } 166 } 167 </style> 168 <style id="wp-custom-css"> 169body.page-id-147 section.page-hero.dot-grid, 170body.page-id-137 section.page-hero.dot-grid{display:none!important} 171body.page-id-147 .ct-ds section.page-hero.dot-grid{display:block!important} 172body.page-id-137 .ct-agency section.page-hero.dot-grid{display:block!important} 173/* Domain Scanner page â paste into Appearance > Customize > Additional CSS */ 174 175/* Kill theme's auto page-title hero */ 176main > section.page-hero.dot-grid{display:none!important} 177main > div[class*="ct-"] > section:first-of-type, 178main > div[class*="-wrap"] > section:first-of-type{padding-top:0!important} 179 180/* Full-width break-out */ 181.ct-ds{position:relative} 182.ct-ds > section{ 183 width:100vw;position:relative; 184 margin-left:calc(50% - 50vw); 185 margin-right:calc(50% - 50vw); 186 max-width:100vw; 187} 188 189/* Hero treatment */ 190.ct-ds .page-hero{padding:140px 0 96px} 191.ct-ds .page-hero h1{max-width:860px} 192.ct-ds .page-hero p{max-width:700px;margin-left:auto;margin-right:auto} 193 194/* Live dot */ 195.ct-ds .ct-live-row{display:inline-flex;align-items:center;gap:10px;color:var(--color-text-light);font-size:var(--font-size-sm);letter-spacing:.04em;margin-bottom:14px} 196.ct-ds .ct-live-dot{position:relative;width:8px;height:8px;border-radius:50%;background:var(--color-accent)} 197.ct-ds .ct-live-dot::after{content:'';position:absolute;inset:-6px;border:1px solid var(--color-accent);border-radius:50%;animation:ds-ping 2s cubic-bezier(0,0,.2,1) infinite} 198@keyframes ds-ping{0%{transform:scale(.5);opacity:1}100%{transform:scale(2.2);opacity:0}
198} 199.ct-ds .page-hero-badge{animation:ds-badge-glow 3s ease-in-out infinite} 200@keyframes ds-badge-glow{0%,100%{box-shadow:0 0 0 rgba(136,255,204,0)}50%{box-shadow:0 0 24px rgba(136,255,204,.18)}} 201 202/* Domain tree visual */ 203.ct-tree-wrap{max-width:680px;margin:48px auto 0;background:var(--color-bg-dark-card);border:1px solid rgba(255,255,255,.08);border-radius:var(--border-radius-lg);overflow:hidden;text-align:left;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.85rem;position:relative} 204.ct-tree-head{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.06);color:var(--color-text-muted)} 205.ct-tree-head .dot{width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.18)} 206.ct-tree-head .dot.r{background:rgba(244,63,94,.55)} 207.ct-tree-head .dot.y{background:rgba(245,158,11,.55)} 208.ct-tree-head .dot.g{background:rgba(136,255,204,.55)} 209.ct-tree-head .src{margin-left:auto;font-size:.75rem} 210.ct-tree-body{padding:0} 211.ct-tree-row{display:grid;grid-template-columns:1fr auto;gap:14px;align-items:center;padding:10px 16px;border-bottom:1px dashed rgba(255,255,255,.06);color:var(--color-text-light);font-size:.82rem;position:relative;overflow:hidden} 212.ct-tree-row:last-child{border-bottom:0} 213.ct-tree-row .path{color:#cfe8df;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} 214.ct-tree-row .indent{color:rgba(255,255,255,.25);user-select:none} 215.ct-tree-row .tag{font-size:.72rem;padding:3px 9px;border-radius:999px;letter-spacing:.02em;white-space:nowrap} 216.ct-tree-row .tag.new{color:#88FFCC;background:rgba(136,255,204,.1)} 217.ct-tree-row .tag.ok{color:rgba(255,255,255,.5);background:rgba(255,255,255,.06)} 218.ct-tree-row .tag.gone{color:#F87171;background:rgba(244,63,94,.12)} 219 220/* Feature card shimmer */ 221.ct-ds .feature-card{position:relative;overflow:hidden} 222.ct-ds .feature-card::after{content:'';position:absolute;top:0;left:-120%;width:80%;height:100%;background:linear-gradient(100deg,transparent,rgba(136,255,204,.07),transparent);transition:left .9s ease;pointer-events:none} 223.ct-ds .feature-card:hover::after{left:130%} 224.ct-ds .feature-card:hover .feature-card-icon{transform:scale(1.08)} 225 226/* Use-case cards */ 227.ct-uc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px;margin-top:32px} 228.ct-uc-card{background:var(--color-bg-dark-card);border:1px solid rgba(255,255,255,.08);border-radius:var(--border-radius-md);padding:28px;transition:border-color .3s ease,transform .3s ease} 229.ct-uc-card:hover{border-color:rgba(136,255,204,.2);transform:translateY(-2px)} 230.ct-uc-card h3{font-size:var(--font-size-lg);font-weight:600;color:var(--color-text-white);margin-bottom:8px} 231.ct-uc-card p{color:var(--color-text-light);font-size:var(--font-size-sm);line-height:1.6;margin:0} 232.ct-uc-card .ct-uc-icon{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;margin-bottom:16px} 233.ct-uc-card .ct-uc-icon.teal{background:rgba(20,184,166,.15);color:#14B8A6} 234.ct-uc-card .ct-uc-icon.purple{background:rgba(139,92,246,.15);color:#8B5CF6} 235.ct-uc-card .ct-uc-icon.amber{background:rgba(245,158,11,.15);color:#F59E0B} 236.ct-uc-card .ct-uc-icon.rose{background:rgba(244,63,94,.15);color:#F43F5E} 237 238/* Report card */ 239.ct-report{max-width:600px;margin:48px auto 0;background:var(--color-bg-dark-card);border:1px solid rgba(255,255,255,.08);border-radius:var(--border-radius-lg);padding:28px;text-align:left} 240.ct-report-head{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid rgba(255,255,255,.06)} 241.ct-report-head .icon{width:36px;height:36px;border-radius:8px;background:rgba(136,255,204,.1);display:flex;align-items:center;justify-content:center;color:var(--color-accent)} 242.ct-report-head .title{font-weight:600;color:var(--color-text-white);font-size:var(--font-size-base)} 243.ct-report-head .date{margin-left:auto;color:var(--color-text-muted);font-size:var(--font-size-xs);font-family:ui-monospace,SFMono-Regular,Menlo,monospace} 244.ct-report-stat{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:20px} 245.ct-report-stat .n{font-size:1.5rem;font-weight:400;font-family:'Funnel Display','Inter',sans-serif} 246.ct-report-stat .n.mint{color:var(--color-accent)} 247.ct-report-stat .n.warn{color:#F59E0B} 248.ct-report-stat .n.err{color:#F87171} 249.ct-report-stat .l{color:var(--color-text-muted);font-size:var(--font-size-xs);margin-top:2px} 250.ct-report-rows{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.78rem} 251.ct-report-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px dashed rgba(255,255,255,.04)} 252.ct-report-row:last-child{border-bottom:0} 253.ct-report-row .pip{width:6px;height:6px;border-radius:50%;flex-shrink:0} 254.ct-report-row .pip.g{background:#88FFCC}
254 255.ct-report-row .pip.r{background:#F87171} 256.ct-report-row .pip.y{background:#F59E0B} 257.ct-report-row .url{color:#cfe8df;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 258.ct-report-row .st{margin-left:auto;color:var(--color-text-muted);flex-shrink:0} 259 260/* Signal pipeline */ 261.ct-ds .signal-pipeline{margin-top:32px;position:relative} 262 263/* Reduced motion */ 264@media(prefers-reduced-motion:reduce){ 265 .ct-ds .ct-live-dot::after, 266 .ct-ds .page-hero-badge{animation:none} 267} 268 269/* ===== Compliance Monitoring v2 (page 267) â managed via Cowork ===== */ 270/* Remove the theme content-wrapper's top gap under the header */ 271body.page-id-267 main > section.section-dark{padding-top:0!important;padding-bottom:0!important} 272 273/* Animated hero background: depth + drifting light */ 274.ctv2-hero{position:relative;overflow:hidden} 275.ctv2-hero .ctv2-glows{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden} 276.ctv2-hero .ctv2-glow{position:absolute;border-radius:50%;filter:blur(80px);opacity:.5;will-change:transform} 277.ctv2-hero .ctv2-glow.a{width:560px;height:560px;top:-200px;left:-120px;background:radial-gradient(circle,rgba(136,255,204,.55),transparent 70%);animation:ctv2-drift-a 17s ease-in-out infinite} 278.ctv2-hero .ctv2-glow.b{width:640px;height:640px;top:-240px;right:-180px;background:radial-gradient(circle,rgba(139,92,246,.5),transparent 70%);animation:ctv2-drift-b 21s ease-in-out infinite} 279.ctv2-hero .ctv2-glow.c{width:520px;height:520px;bottom:-280px;left:38%;background:radial-gradient(circle,rgba(20,184,166,.45),transparent 70%);animation:ctv2-drift-c 25s ease-in-out infinite} 280.ctv2-hero .ctv2-inner{position:relative;z-index:1} 281@keyframes ctv2-drift-a{0%,100%{transform:translate(0,0)}50%{transform:translate(70px,45px)}} 282@keyframes ctv2-drift-b{0%,100%{transform:translate(0,0)}50%{transform:translate(-80px,55px)}} 283@keyframes ctv2-drift-c{0%,100%{transform:translate(0,0) scale(1)}50%{transform:translate(40px,-45px) scale(1.12)}} 284 285/* Auto-scrolling logo marquee */ 286.ctv2-marquee{position:relative;overflow:hidden;width:100%;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)} 287.ctv2-marquee-track{display:flex;align-items:center;width:max-content;animation:ctv2-scroll 34s linear infinite} 288.ctv2-marquee:hover .ctv2-marquee-track{animation-play-state:paused} 289.ctv2-marquee-track img{height:30px;width:auto;opacity:.66;flex:0 0 auto;margin-right:64px} 290.ctv2-marquee-track img:hover{opacity:1} 291@keyframes ctv2-scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}} 292 293@media(prefers-reduced-motion:reduce){.ctv2-hero .ctv2-glow{animation:none!important}.ctv2-marquee-track{animation:none!important}} 294 295 296/* ===== Footer ===== */ 297/* GitHub icon removed from the footer social row. Hidden here rather than deleted 298 from footer.php because Cloudflare blocks PHP saves from wp-admin. */ 299.footer-social a[aria-label="GitHub"]{display:none!important} 300 301/* ===== Blog single posts â interim, managed via Cowork ===== 302 index.php renders <main><article><h1>title</h1><div>content</div>. Migrated 303 bodies arrive wrapped in Elementor containers, so spacing uses descendant 304 selectors rather than direct children. 305 Remove this block once single.php + its main.css section are deployed. */ 306body.single-post main:not(.ct-single){max-width:780px;margin:0 auto;padding:140px var(--spacing-xl) 96px} 307body.single-post main:not(.ct-single) article > h1{font-family:var(--font-heading);font-weight:400;line-height:1.2;font-size:clamp(1.75rem,3.2vw,2.5rem);margin-bottom:var(--spacing-xl)} 308/* migrated body copy repeats the title as its own H1 â show only one */ 309body.single-post main:not(.ct-single) article:has(> div h1) > h1{display:none} 310body.single-post main:not(.ct-single) article > div{font-size:1.0625rem;line-height:1.85;color:var(--color-text-light)} 311body.single-post main:not(.ct-single) article p, 312body.single-post main:not(.ct-single) article ul, 313body.single-post main:not(.ct-single) article ol, 314body.single-post main:not(.ct-single) article figure, 315body.single-post main:not(.ct-single) article blockquote, 316body.single-post main:not(.ct-single) article pre, 317body.single-post main:not(.ct-single) article table{margin-top:1.35em} 318body.single-post main:not(.ct-single) article h1, 319body.single-post main:not(.ct-single) article h2, 320body.single-post main:not(.ct-single) article h3, 321body.single-post main:not(.ct-single) article h4{margin-bottom:.55em} 322body.single-post main:not(.ct-single) article h1{font-family:var(--font-heading);font-weight:400;font-size:clamp(1.75rem,3.2vw,2.5rem);color:var(--color-text-white);line-height:1.2;margin-top:1.6em} 323body.single-post main:not(.ct-single) article h2{font-family:var(--font-heading);font-weight:400;font-size:clamp(1.4rem,2.2vw,1.9rem);color:var(--color-text-white);line-height:1.3;margin-top:2.2em} 324body.single-post main:not(.ct-single) article h3{font-weight:600;font-size:var(--font-size-xl);color:var(--color-text-white);margin-top:1.9em} 325body.single-post main:not(.ct-single) article h4{font-weight:600;font-size:var(--font-size-lg);color:var(--color-text-white);margin-top:1.6em} 326body.single-post main:not(.ct-single) article a{color:var(--color-accent);text-decoration:underline;text-underline-offset:3px} 327body.single-post main:not(.ct-single) article a:hover{color:var(--color-accent-hover)} 328body.single-post main:not(.ct-single) article strong{color:var(--color-text-white)} 329body.single-post main:not(.ct-single) article ul,body.single-post main:not(.ct-single) article ol{padding-left:1.35em} 330body.single-post main:not(.ct-single) article li + li{margin-top:.5em} 331body.single-post main:not(.ct-single) article li::marker{color:var(--color-accent)} 332body.single-post main:not(.ct-single) article img{border-radius:var(--border-radius-md);height:auto} 333body.single-post main:not(.ct-single) article figure{margin-left:0;margin-right:0} 334body.single-post main:not(.ct-single) article figcaption{font-size:var(--font-size-xs);color:var(--color-text-muted);text-align:center;margin-top:10px} 335body.single-post main:not(.ct-single) article blockquote{border-left:3px solid var(--color-accent);padding:4px 0 4px 22px;color:var(--color-text-white);font-size:var(--font-size-lg);line-height:1.7} 336body.single-post main:not(.ct-single) article blockquote p{margin-top:0} 337body.single-post main:not(.ct-single) article code{background:rgba(255,255,255,.06);padding:2px 6px;border-radius:5px;font-size:.9em} 338body.single-post main:not(.ct-single) article pre{background:var(--color-bg-dark-card);border:1px solid rgba(255,255,255,.07);border-radius:var(--border-radius-md);padding:var(--spacing-lg);overflow-x:auto} 339body.single-post main:not(.ct-single) article table{width:100%;border-collapse:collapse;font-size:var(--font-size-sm);display:block;overflow-x:auto} 340body.single-post main:not(.ct-single) article th,body.single-post main:not(.ct-single) article td{border:1px solid rgba(255,255,255,.09);padding:10px 14px;text-align:left} 341body.single-post main:not(.ct-single) article th{color:var(--color-text-white);background:rgba(255,255,255,.03)} 342body.single-post main:not(.ct-single) article hr{border:0;border-top:1px solid rgba(255,255,255,.08);margin:2.4em 0} 343@media(max-width:700px){body.single-post main:not(.ct-single){padding:120px var(--spacing-lg) 72px}} 344 345/* migrated bodies carry Elementor section/column wrappers whose own
345spacing 346 fights the reading rhythm â flatten them and let the type rules do the work */ 347body.single-post main:not(.ct-single) article .elementor-section, 348body.single-post main:not(.ct-single) article .elementor-container, 349body.single-post main:not(.ct-single) article .elementor-column, 350body.single-post main:not(.ct-single) article .elementor-widget-wrap, 351body.single-post main:not(.ct-single) article .elementor-element, 352body.single-post main:not(.ct-single) article .elementor-widget-container{margin:0!important;padding:0!important;width:100%!important;max-width:100%!important} 353body.single-post main:not(.ct-single) article .elementor-widget:not(:last-child){margin-block-end:0!important} 354 355/* the original editor left spacer paragraphs behind; drop the empty ones 356 (single.php strips the  ones server-side once deployed) */ 357body.single-post main:not(.ct-single) article p:empty{display:none} 358body.single-post main:not(.ct-single) article p > br:only-child{display:none} 359 360 361/* ===== /sales/ hero: concentric-ring background to match /pricing/ (managed via Cowork) ===== */ 362.ct-sales .page-hero { position: relative; overflow: hidden; } 363.ct-sales .page-hero::before { 364 content: ""; position: absolute; top: 50%; left: 50%; 365 width: 1500px; height: 1500px; transform: translate(-50%, -52%); 366 border-radius: 50%; pointer-events: none; z-index: 0; 367 background: repeating-radial-gradient(circle, rgba(136,255,204,0.055) 0px, rgba(136,255,204,0.055) 1px, transparent 1px, transparent 92px); 368 background-size: auto; 369 -webkit-mask-image: radial-gradient(circle, #000 0%, #000 32%, transparent 62%); 370 mask-image: radial-gradient(circle, #000 0%, #000 32%, transparent 62%); 371 animation: ctSalesRings 20s ease-in-out infinite alternate; 372} 373.ct-sales .page-hero::after { 374 content: ""; position: absolute; top: 50%; left: 50%; 375 transform: translate(-50%, -55%); width: 900px; height: 620px; 376 background: radial-gradient(rgba(136,255,204,0.1) 0%, rgba(20,184,166,0.05) 45%, transparent 72%); 377 pointer-events: none; z-index: 0; 378 animation: ctSalesGlow 14s ease-in-out infinite alternate; 379} 380.ct-sales .page-hero .container { position: relative; z-index: 1; } 381@keyframes ctSalesRings { 0% { transform: translate(-50%,-52%) scale(1); } 100% { transform: translate(-50%,-52%) scale(1.045); } } 382@keyframes ctSalesGlow { 0% { transform: translate(-50%,-55%); } 100% { transform: translate(-50%,-52%); } } 383@media (prefers-reduced-motion: reduce) { .ct-sales .page-hero::before, .ct-sales .page-hero::after { animation: none !important; } } 384 385 386/* ===== Blog featured-article hero (home.php page 1) â managed via Cowork ===== */ 387.blog-lead { padding-top: 140px; } 388.blog-lead .breadcrumb { justify-content: flex-start; margin-bottom: var(--spacing-lg); } 389.blog-lead .page-hero-badge { margin-bottom: var(--spacing-xl); } 390.blog-featured { 391 display: grid; grid-template-columns: 1.05fr 0.95fr; gap: var(--spacing-2xl); 392 align-items: center; background: rgba(136,255,204,0.03); 393 border: 1px solid rgba(136,255,204,0.08); border-radius: var(--border-radius-lg); 394 overflow: hidden; transition: border-color var(--transition-base), transform var(--transition-base); 395} 396.blog-featured:hover { border-color: rgba(136,255,204,0.2); transform: translateY(-2px); } 397.blog-featured-media { position: relative; align-self: stretch; min-height: 320px; background: var(--color-bg-dark-card); } 398.blog-featured-media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; } 399.blog-featured-media:empty, .blog-featured:not(:has(.blog-featured-media img)) .blog-featured-media { display: none; } 400.blog-featured:not(:has(.blog-featured-media img)) { grid-template-columns: 1fr; } 401.blog-featured-body { padding: var(--spacing-2xl) var(--spacing-2xl) var(--spacing-2xl) 0; } 402.blog-featured:not(:has(.blog-featured-media img)) .blog-featured-body { padding: var(--spacing-2xl); } 403.blog-featured-body .blog-category { margin-bottom: var(--spacing-md); } 404.blog-featured-body h1 { 405 font-family: var(--font-heading); font-weight: 400; line-height: 1.2; 406 font-size: clamp(1.6rem, 2.8vw, 2.4rem); color: var(--color-text-white); margin: 0 0 var(--spacing-md); 407} 408.blog-featured-body p { color: var(--color-text-light); font-size: var(--font-size-base); line-height: 1.7; margin: 0 0 var(--spacing-lg); } 409.blog-featured-meta { display: flex; align-items: center; gap: 10px; font-size: var(--font-size-sm); color: var(--color-text-muted); margin-bottom: var(--spacing-lg); } 410.blog-featured-avatar { width: 32px; height: 32px; border-radius: 50%; } 411.blog-featured-author { color: var(--color-text-light); } 412.blog-featured-cta { display: inline-flex; align-items: center; gap: 6px; color: var(--color-accent); font-weight: 600; font-size: var(--font-size-sm); } 413.blog-featured-cta svg { width: 16px; height: 16px; } 414.blog-list { padding-top: var(--spacing-2xl); } 415@media (max-width: 860px) { 416 .blog-featured { grid-template-columns: 1fr; } 417 .blog-featured-media { min-height: 220px; } 418 .blog-featured-body { padding: var(--spacing-xl); } 419} 420 421 422/* ===== Blog lead refinements: pricing-style ring bg, tighter spacing (managed via Cowork) ===== */ 423.blog-lead { position: relative; overflow: hidden; padding: 104px 0 var(--spacing-xl) !important; background: var(--color-bg-dark); } 424.blog-lead::before { 425 content: ""; position: absolute; top: 46%; left: 50%; 426 width: 1500px; height: 1500px; transform: translate(-50%, -50%); 427 border-radius: 50%; pointer-events: none; z-index: 0; 428 background: repeating-radial-gradient(circle, rgba(136,255,204,0.055) 0px, rgba(136,255,204,0.055) 1px, transparent 1px, transparent 92px); 429 background-size: auto; 430 -webkit-mask-image: radial-gradient(circle, #000 0%, #000 34%, transparent 64%); 431 mask-image: radial-gradient(circle, #000 0%, #000 34%, transparent 64%); 432 animation: ctSalesRings 20s ease-in-out infinite alternate; 433} 434.blog-lead::after {
435 content: ""; position: absolute; top: 42%; left: 50%; 436 transform: translate(-50%, -50%); width: 980px; height: 640px; 437 background: radial-gradient(rgba(136,255,204,0.1) 0%, rgba(20,184,166,0.05) 45%, transparent 72%); 438 pointer-events: none; z-index: 0; 439 animation: ctSalesGlow 14s ease-in-out infinite alternate; 440} 441.blog-lead > .container { position: relative; z-index: 1; } 442.blog-lead .page-hero-badge { margin-bottom: var(--spacing-lg); } 443.blog-list { padding-top: var(--spacing-lg) !important; } 444@media (prefers-reduced-motion: reduce){ .blog-lead::before, .blog-lead::after { animation: none !important; } } 445 446 447/* ===== Blog category filter (managed via Cowork) ===== */ 448.blog-filter { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: var(--spacing-xl); } 449.blog-filter-pill { 450 font-size: var(--font-size-sm); font-weight: 500; color: var(--color-text-light); 451 background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.09); 452 padding: 8px 18px; border-radius: var(--border-radius-pill); 453 transition: border-color var(--transition-fast), color var(--transition-fast), background var(--transition-fast); 454} 455.blog-filter-pill:hover { border-color: var(--color-accent-border); color: var(--color-accent); } 456.blog-filter-pill.is-active { 457 background: var(--color-accent); color: var(--color-bg-dark); 458 border-color: var(--color-accent); font-weight: 600; 459} 460 461 462/* ===== Blog cards with featured image (managed via Cowork) ===== */ 463.blog-card { padding: 0 !important; overflow: hidden; display: flex; flex-direction: column; } 464.blog-card-media { 465 aspect-ratio: 16 / 9; overflow: hidden; 466 background: linear-gradient(135deg, var(--color-bg-dark-card), var(--color-teal-bg)); 467 border-bottom: 1px solid rgba(136,255,204,0.06); 468} 469.blog-card-media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.45s ease; } 470.blog-card:hover .blog-card-media img { transform: scale(1.05); } 471.blog-card-body { padding: 1.6rem 1.75rem 1.75rem; display: flex; flex-direction: column; flex: 1; } 472.blog-card-body .blog-category { align-self: flex-start; } 473.blog-card-body .blog-meta { margin-top: auto; padding-top: 1rem; } 474 475 476/* ===== Featured hero: show full image (no side crop) ===== */ 477.blog-lead .blog-featured-media { position: relative; align-self: center; aspect-ratio: 16 / 9; min-height: 0 !important; } 478.blog-lead .blog-featured-media img { object-fit: cover; } 479 480 481</style> 482</head> 483<body class="wp-singular page-template-default page page-id-932 page-child parent-pageid-2173 wp-theme-changetower-theme elementor-default elementor-kit-286 elementor-page elementor-page-932"> 484 485 <nav class="nav" role="navigation" aria-label="Main navigation"> 486 <div class="container nav-inner"> 487 <a href="https://changetower.com/" class="nav-logo" aria-label="ChangeTower Home"> 488 <svg viewBox="25 10 235 150" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M94.48564,15.30913c6.17344,-0.15369 13.06362,0.29054 17.31357,5.40526c7.45825,8.97584 0.59399,23.93305 9.45044,34.22709c11.24033,13.06481 29.63804,2.08902 38.10923,13.81599c6.80713,9.42374 -0.53906,24.71837 10.2085,34.6747c5.31152,4.91941 14.70117,6.18033 21.64014,5.8996c16.16162,-0.65346 24.25928,-7.17487 25.0708,-23.68412c0.17871,-3.62993 -0.47021,-8.56824 0.2168,-11.85283c0.55225,-2.62966 2.06104,-5.17801 3.87744,-7.13209c1.98779,-2.13796 4.64355,-4.17584 7.66553,-4.2809c2.2251,-0.07721 4.50879,0.07414 6.73682,0.10901c5.89893,0.09187 12.16406,-0.00923 16.74756,4.33042c3.854,3.64956 4.8208,8.98566 4.95117,14.0636c0.88916,34.31676 -29.12402,12.48636 -41.82568,29.55881c-8.45361,11.36273 -1.34033,25.75936 -9.5083,34.32262c-3.87012,4.05555 -9.70752,4.62404 -14.98242,4.75736c-4.92627,0.03077 -11.86963,-0.34578 -15.49219,-4.12896c-9.65479,-10.08189 -1.18506,-24.04528 -10.50879,-35.3938c-8.61768,-12.28886 -30.16919,-2.61208 -37.97036,-13.55402c-7.10171,-9.96072 0.4522,-25.11059 -10.53354,-35.06106c-1.49634,-1.36333 -3.20186,-2.47758 -5.05151,-3.29983c-4.34736,-1.91027 -12.08569,-2.86233 -16.72295,-2.60446c-9.65874,0.53713 -18.90747,2.88065 -22.66377,12.77983c-2.69546,6.67027 -2.39868,14.03415 -1.85933,21.14016c0.38936,5.13039 -3.58989,9.80981 -7.92334,12.21472c-0.32666,0.18124 -1.21816,0.48101 -1.60312,0.50079c-15.10195,0.77287 -30.06035,2.32213 -30.95742,-17.14234c-0.77388,-16.78806 5.34214,-22.99989 22.03301,-22.55082c14.54355,-0.24351 23.68433,-7.25223 24.5354,-22.18248c0.44766,-7.85397 -0.40488,-16.96549 6.89868,-21.91919c3.96855,-2.69164 7.57017,-2.84328 12.14766,-3.0131z" fill="var(--color-accent, #88FFCC)"/></svg> 489 ChangeTower 490 </a> 491 <button class="nav-toggle" aria-label="Toggle menu" aria-expanded="false">
492 <span></span><span></span><span></span> 493 </button> 494 <ul class="nav-links"> 495 <li class="nav-flyout-trigger" data-flyout="solutions"> 496 <a href="#">Solutions <svg class="chevron-down" viewBox="0 0 12 12" fill="none"><path d="M3 5L6 8L9 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></a> 497 </li> 498 <li class="nav-flyout-trigger" data-flyout="features"> 499 <a href="/features">Features <svg class="chevron-down" viewBox="0 0 12 12" fill="none"><path d="M3 5L6 8L9 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></a> 500 </li> 501 <li class="nav-flyout-trigger" data-flyout="resources"> 502 <a href="#">Resources <svg class="chevron-down" viewBox="0 0 12 12" fill="none"><path d="M3 5L6 8L9 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></a> 503 </li> 504 <li><a href="/pricing">Pricing</a></li> 505 <li><a href="/sales">Sales</a></li> 506 <li><a href="https://app.changetower.com/login" class="nav-login">Login</a></li> 507 <li class="nav-divider"></li> 508 <li><a href="/sales" class="nav-cta-secondary">Book a Demo</a></li> 509 <li><a href="https://app2.changetower.com/register" class="nav-cta">Start Monitoring</a></li> 510 </ul> 511 </div> 512 </nav> 513 514 <!-- Mega Flyout Overlay --> 515 <div class="mega-flyout-overlay" id="flyoutOverlay"></div> 516 517 <!-- SOLUTIONS MEGA FLYOUT --> 518 <div class="mega-flyout" id="flyout-solutions" role="dialog" aria-label="Solutions menu"> 519 <div class="mega-flyout-inner"> 520 <div class="mega-flyout-header"> 521 <span class="mega-flyout-title">Solutions</span> 522 <button class="mega-flyout-close" aria-label="Close menu">×</button> 523 </div> 524 <div class="mega-flyout-grid cols-4"> 525 <div> 526 <div class="mega-flyout-col-title">Compliance & Legal</div> 527 <a class="mega-flyout-item" href="/solutions/compliance-monitoring-software"> 528 <div class="mega-flyout-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg></div> 529 <div class="mega-flyout-item-text"><h4>Compliance Monitoring</h4><p>Track regulatory pages, terms of service, and policy updates</p></div> 530 </a> 531 <a class="mega-flyout-item" href="/solutions/legal-regulatory-monitoring"> 532 <div class="mega-flyout-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg></div> 533 <div class="mega-flyout-item-text"><h4>Legal Change Tracking</h4><p>Monitor court filings, regulatory updates, and legal documents</p></div> 534 </a> 535 <a class="mega-flyout-item" href="/solutions/security-defacement-alerts"> 536 <div class="mega-flyout-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg></div> 537 <div class="mega-flyout-item-text"><h4>Security & Defacement Alerts</h4><p>Detect unauthorized changes, hacks, and website defacement</p></div> 538 </a> 539 </div> 540 <div> 541 <div class="mega-flyout-col-title">Intelligence</div> 542 <a class="mega-flyout-item" href="/solutions/competitor-monitoring"> 543 <div class="mega-flyout-icon purple"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg></div> 544 <div class="mega-flyout-item-text"><h4>Competitor Intelligence</h4><p>Monitor competitor pricing, features, and messaging in real time</p></div> 545 </a> 546 <a class="mega-flyout-item" href="/solutions/product-monitoring"> 547 <div class="mega-flyout-icon purple"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg></div> 548 <div class="mega-flyout-item-text"><h4>Product Monitoring</h4><p>Watch product pages, feature announcements, and release notes</p></div> 549 </a> 550 <a class="mega-flyout-item" href="/solutions/news-monitoring"> 551 <div class="mega-flyout-icon purple"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-2 2zm0 0a2 2 0 0 1-2-2v-9c0-1.1.9-2 2-2h2"/><path d="M18 14h-8"/>
551<path d="M15 18h-5"/><path d="M10 6h8v4h-8V6z"/></svg></div> 552 <div class="mega-flyout-item-text"><h4>News Monitoring</h4><p>Catch newsroom, press, and regulator announcements the minute they post</p></div> 553 </a> 554 </div> 555 <div> 556 <div class="mega-flyout-col-title">Marketing & Brand</div> 557 <a class="mega-flyout-item" href="/solutions/seo-monitoring"> 558 <div class="mega-flyout-icon blue"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg></div> 559 <div class="mega-flyout-item-text"><h4>SEO Monitoring</h4><p>Detect content changes, broken links, and SEO-impacting edits</p></div> 560 </a> 561 <a class="mega-flyout-item" href="/solutions/reputation-monitoring"> 562 <div class="mega-flyout-icon blue"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div> 563 <div class="mega-flyout-item-text"><h4>Brand & Reputation</h4><p>Guard against unauthorized changes and brand misuse</p></div> 564 </a> 565 <a class="mega-flyout-item" href="/features/domain-monitor/"> 566 <div class="mega-flyout-icon blue"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><line x1="3" y1="9" x2="21" y2="9"/><line x1="9" y1="21" x2="9" y2="9"/></svg></div> 567 <div class="mega-flyout-item-text"><h4>Website Scan</h4><p>Weekly report of every URL on your website, with a dated snapshot of each</p></div> 568 </a> 569 </div> 570 <div> 571 <div class="mega-flyout-col-title">Operations</div> 572 <a class="mega-flyout-item" href="/solutions/digital-experience-monitoring"> 573 <div class="mega-flyout-icon amber"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"/><rect x="9" y="9" width="6" height="6"/><line x1="9" y1="1" x2="9" y2="4"/><line x1="15" y1="1" x2="15" y2="4"/><line x1="9" y1="20" x2="9" y2="23"/><line x1="15" y1="20" x2="15" y2="23"/><line x1="20" y1="9" x2="23" y2="9"/><line x1="20" y1="14" x2="23" y2="14"/><line x1="1" y1="9" x2="4" y2="9"/><line x1="1" y1="14" x2="4" y2="14"/></svg></div> 574 <div class="mega-flyout-item-text"><h4>Functionality Monitoring</h4><p>Digital experience monitoring for critical user journeys</p></div> 575 </a> 576 <a class="mega-flyout-item" href="/features/agency-client-reporting/"> 577 <div class="mega-flyout-icon amber"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg></div> 578 <div class="mega-flyout-item-text"><h4>Agency & Client Reporting</h4><p>White-label monitoring and change reports for client accounts</p></div> 579 </a> 580 <a class="mega-flyout-item" href="/solutions/rfp-monitoring/"> 581 <div class="mega-flyout-icon amber"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg></div> 582 <div class="mega-flyout-item-text"><h4>Government & RFP Monitoring</h4><p>New solicitations, addenda and moved deadlines, the morning they post</p></div> 583 </a> 584 </div> 585 </div> 586 </div> 587 </div> 588 589 <!-- FEATURES MEGA FLYOUT --> 590 <div class="mega-flyout" id="flyout-features" role="dialog" aria-label="Features menu"> 591 <div class="mega-flyout-inner"> 592 <div class="mega-flyout-header">
593 <span class="mega-flyout-title">Features</span> 594 <button class="mega-flyout-close" aria-label="Close menu">×</button> 595 </div> 596 <div class="mega-flyout-grid cols-4"> 597 <div> 598 <div class="mega-flyout-col-title">Monitor</div> 599 <a class="mega-flyout-item" href="/features/scheduled-website-monitoring/"><div class="mega-flyout-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg></div><div class="mega-flyout-item-text"><h4>Scheduled Checks</h4><p>Automated monitoring from every 5 min to weekly</p></div></a> 600 <a class="mega-flyout-item" href="/features/selective-monitoring/"><div class="mega-flyout-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 7V5a2 2 0 0 1 2-2h2"/><path d="M17 3h2a2 2 0 0 1 2 2v2"/><path d="M21 17v2a2 2 0 0 1-2 2h-2"/><path d="M7 21H5a2 2 0 0 1-2-2v-2"/><rect x="7" y="7" width="10" height="10" rx="1"/></svg></div><div class="mega-flyout-item-text"><h4>Selective Monitoring</h4><p>Watch only the page elements that matter and ignore the noise</p></div></a> 601 <a class="mega-flyout-item" href="/features/screenshots-archiving/"><div class="mega-flyout-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg></div><div class="mega-flyout-item-text"><h4>Visual Screenshots</h4><p>Full-page pixel-level screenshot comparison</p></div></a> 602 </div> 603 <div> 604 <div class="mega-flyout-col-title">Detect</div> 605 <a class="mega-flyout-item" href="/features/ai-monitoring-software/"><div class="mega-flyout-icon purple"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/></svg></div><div class="mega-flyout-item-text"><h4>AI Change Analysis</h4><p>Smart detection that filters noise from meaningful changes</p></div></a> 606 <a class="mega-flyout-item" href="/features/content-monitoring/"><div class="mega-flyout-icon purple"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M9 15l2 2 4-4"/></svg></div><div class="mega-flyout-item-text"><h4>Content Monitor</h4><p>Track headlines, copy, and pricing text with exact before-and-after diffs</p></div></a> 607 <a class="mega-flyout-item" href="/features/keyword-monitoring/"><div class="mega-flyout-icon purple"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/></svg></div><div class="mega-flyout-item-text"><h4>Keyword Triggers</h4><p>Alert only when specific terms appear or disappear</p></div></a> 608 </div> 609 <div> 610 <div class="mega-flyout-col-title">Alert</div> 611 <a class="mega-flyout-item" href="/features/email-notifications/"><div class="mega-flyout-icon amber"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg></div><div class="mega-flyout-item-text"><h4>Email Alerts</h4><p>Instant or digest-style change notifications</p></div></a> 612 <a class="mega-flyout-item" href="/integrations/"><div class="mega-flyout-icon amber"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><circle cx="5" cy="5" r="2"/><circle cx="19" cy="5" r="2"/><circle cx="5" cy="19" r="2"/><circle cx="19" cy="19" r="2"/><path d="m6.5 6.5 3.2 3.2M17.5 6.5l-3.2 3.2M6.5 17.5l3.2-3.2M17.5 17.5l-3.2-3.2"/></svg> 613</div><div class="mega-flyout-item-text"><h4>Integrations</h4><p>Connect with various tools</p></div></a> 614 <a class="mega-flyout-item" href="/integrations/webhooks/"><div class="mega-flyout-icon amber"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg></div><div class="mega-flyout-item-text"><h4>Webhooks & API</h4><p>Integrate changes into any workflow or tool</p></div></a> 615 </div> 616 <div> 617 <div class="mega-flyout-col-title">Platform</div> 618 <a class="mega-flyout-item" href="/features/screenshots-archiving/"><div class="mega-flyout-icon blue"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg></div><div class="mega-flyout-item-text"><h4>Change Archive</h4><p>Full history with point-in-time snapshots and rollback</p></div></a> 619 <a class="mega-flyout-item" href="/features/workspaces
619/"><div class="mega-flyout-icon blue"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><line x1="3" y1="9" x2="21" y2="9"/><line x1="9" y1="21" x2="9" y2="9"/></svg></div><div class="mega-flyout-item-text"><h4>Team Dashboard</h4><p>Shared workspace with roles, permissions, and reports</p></div></a> 620 <a class="mega-flyout-item" href="/features/single-sign-on/"><div class="mega-flyout-icon blue"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="4" width="22" height="16" rx="2" ry="2"/><line x1="1" y1="10" x2="23" y2="10"/></svg></div><div class="mega-flyout-item-text"><h4>Enterprise SSO</h4><p>SAML/SSO, audit logs, and compliance-grade security</p></div></a> 621 </div> 622 </div> 623 </div> 624 </div> 625 626 <!-- RESOURCES MEGA FLYOUT --> 627 <div class="mega-flyout" id="flyout-resources" role="dialog" aria-label="Resources menu"> 628 <div class="mega-flyout-inner"> 629 <div class="mega-flyout-header"> 630 <span class="mega-flyout-title">Resources</span> 631 <button class="mega-flyout-close" aria-label="Close menu">×</button> 632 </div> 633 <div class="mega-flyout-grid cols-3"> 634 <div> 635 <div class="mega-flyout-col-title">Learn</div> 636 <a class="mega-flyout-item" href="/insights/"><div class="mega-flyout-icon emerald"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg></div><div class="mega-flyout-item-text"><h4>Blog</h4><p>Insights on web monitoring, compliance, and competitive intelligence</p></div></a> 637 <a class="mega-flyout-item" href="/insights/"><div class="mega-flyout-icon emerald"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg></div><div class="mega-flyout-item-text"><h4>Guides & Whitepapers</h4><p>In-depth resources on monitoring strategies and best practices</p></div></a> 638 </div> 639 <div> 640 <div class="mega-flyout-col-title">Proof</div> 641 <a class="mega-flyout-item" href="/insights/"><div class="mega-flyout-icon rose"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg></div><div class="mega-flyout-item-text"><h4>Case Studies</h4><p>See how teams use ChangeTower to stay ahead of changes</p></div></a> 642 <a class="mega-flyout-item" href="/product-updates"><div class="mega-flyout-icon rose"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20V10"/><path d="M18 20V4"/><path d="M6 20v-4"/></svg></div><div class="mega-flyout-item-text"><h4>Product Updates</h4><p>Latest features, improvements, and platform enhancements</p></div></a> 643 </div> 644 <div> 645 <div class="mega-flyout-col-title">Support</div> 646 647 <a class="mega-flyout-item" target="_blank" href="https://help.changetower.com/"><div class="mega-flyout-icon blue"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div><div class="mega-flyout-item-text"><h4>Help Center</h4><p>Documentation, tutorials, and troubleshooting guides</p></div></a> 648 <a class="mega-flyout-item" href="/faqs/"><div class="mega-flyout-icon teal"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12" y2="17"/></svg></div><div class="mega-flyout-item-text"><h4>FAQs</h4><p>Answers to the questions we get asked most</p></div></a> 649 </div> 650 </div> 651 </div> 652 </div> 653 <main> 654 <section class="page-hero dot-grid"> 655 <div class="dot-grid-bg"></div> 656 <div class="container"> 657 <h1>Price & Product Monitoring</h1> 658 </div> 659 </section> 660 <section class="section-dark"> 661 <div class="container"> 662 <div data-elementor-type="wp-page" data-elementor-id="932" class="elementor elementor-932"> 663 <div class="elementor-element elementor-element-ctppc01 e-con-full e-flex e-con e-parent" data-id="ctppc01" data-element_type="container" data-e-type="container"> 664 <div class="elementor-element elementor-element-ctpps01 elementor-widget elementor-widget-html" data-id="ctpps01" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"> 665 <style> 666/* ============================================================ 667 ChangeTower â Price & Product Monitoring (v1) 668 Cloned from the Legal & Regulatory Change Monitoring v1 page 669 (925) and rebuilt for the price & product monitoring use case: 670 B2C-leaning (price drops, restocks, deals and coupons) with B2B 671 hints (your own product pages verified, offered discounts
672 archived, supplier price lists). Same widget layout as 925; 673 copy and mocks rewritten for shoppers, deal hunters and the 674 teams that sell. 675 676 HARD CONTENT RULES â DO NOT BREAK: 677 · ChangeTower does NOT do visual comparison and does NOT do image 678 monitoring. Never describe snapshots as being diffed, compared or 679 monitored. A snapshot is an ARCHIVING artefact: a dated record you 680 can retrieve. Detection is content/HTML-level only. Nothing is ever 681 drawn on a captured page: no boxes, no arrows, no two captures side 682 by side. Highlighting goes on the TEXT. 683 · No SOC 2 or certification claims. No uptime/SLA claims. 684 · No em dashes in copy. No invented product nouns. 685 · The word is SNAPSHOTS, not "results". 686 687 Class prefixes: everything is .ctpp-*. Never use bare `.nav` 688 (the theme's fixed site header) or `.tab-btn` / `.faq-question` 689 (bound by theme JS). 690 ============================================================ */ 691body.page-id-932 main > section.page-hero{display:none!important} 692body.page-id-932 .elementor-section, 693body.page-id-932 .e-con{padding-left:0!important;padding-right:0!important} 694 695.ctpp{ 696 --nav:#0C1E2B; --nav2:#091822; --card:#112B3A; --mint:#88FFCC; 697 --mint2:#6CEDB8; --wht:#fff; --mut:rgba(255,255,255,.65); 698 --mut2:rgba(255,255,255,.45); --rule:rgba(255,255,255,.10); 699 --rule2:rgba(255,255,255,.06); 700 --ap:#16745F; --apt:#E7F5F1; --apbg:#F3FBF8; --aln:#E5E7EB; --aln2:#ECEEF0; 701 --atx:#374151; --atx2:#4B5563; --amu:#9AA2AC; --amu2:#8A93A0; 702 --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; 703 --hd:'Funnel Display',Inter,sans-serif; 704 font-family:Inter,-apple-system,system-ui,sans-serif;color:var(--mut); 705} 706.ctpp *{box-sizing:border-box} 707.ctpp > section{width:100vw;position:relative;margin-left:calc(50% - 50vw); 708 margin-right:calc(50% - 50vw);max-width:100vw;padding:0 24px} 709.ctpp .in{max-width:1180px;margin:0 auto;padding:88px 0} 710.ctpp .in.tight{padding:52px 0} 711/* TYPE SCALE. Four ranks, and the gap between each is wide enough to read 712 as a rank rather than as a slightly smaller version of the one above: 713 h1 hero ~50px display 400, centred 714 h2 section title ~38px display 400, centred 715 h3 sub-head ~24px display 400, left (.ctpp-row .txt h3) 716 h3 card heading ~17px Inter 600, left (.ctpp-vs/-cov/-uc/-feat) 717 Card headings are h3 and not h4: those grids sit directly under the 718 section h2 with nothing in between, so h4 would skip a level. Nothing 719 on the page is an h4. */ 720.ctpp h1,.ctpp h2,.ctpp h3{font-family:var(--hd);color:var(--wht); 721 font-weight:400;margin:0;letter-spacing:-.01em} 722.ctpp h1{font-size:clamp(2.1rem,4.4vw,3.1rem);line-height:1.08} 723.ctpp h2{font-size:clamp(1.7rem,3.6vw,2.4rem);line-height:1.18} 724.ctpp h3{font-size:1.5rem;line-height:1.24} 725.ctpp p{margin:0;line-height:1.62} 726.ctpp .eyebrow{font-size:.72rem;font-weight:700;letter-spacing:.14em; 727 text-transform:uppercase;color:var(--mint);margin-bottom:12px} 728.ctpp .hd{max-width:760px;margin:0 auto 48px;text-align:center} 729.ctpp .hd p{margin-top:16px;color:var(--mut);font-size:1.05rem} 730.ctpp .btn{display:inline-block;padding:13px 28px;border-radius:100px; 731 font-weight:600;font-size:.95rem;text-decoration:none} 732.ctpp .btn-p{background:var(--mint);color:var(--nav)} 733.ctpp .btn-p:hover{background:var(--mint2)} 734.ctpp .btn-g{color:var(--wht);border:1px solid rgba(255,255,255,.22)} 735.ctpp .btn-g:hover{border-color:rgba(255,255,255,.5)} 736.ctpp .ticks{display:flex;flex-direction:column;gap:11px;margin-top:20px} 737.ctpp .ticks div{display:flex;gap:11px;font-size:.94rem;color:var(--wht);line-height:1.5} 738.ctpp .ticks div::before{content:"â";color:var(--mint);font-weight:800;flex:0 0 auto} 739 740/* ---------- HERO ---------- */ 741.ctpp-hero{background:linear-gradient(180deg,#0C1E2B 0%,#0A1925 55%,#091822 100%);overflow:hidden} 742.ctpp-hero .in{padding:132px 0 84px} 743.ctpp-glows{position:absolute;inset:0;pointer-events:none} 744.ctpp-glows span{position:absolute;border-radius:50%;filter:blur(90px)} 745.ctpp-glows .a{width:420px;height:420px;background:#88FFCC;top:-190px;left:-160px;opacity:.075} 746.ctpp-glows .b{width:340px;height:340px;background:#3B82F6;top:0;right:-170px;opacity:.055} 747.ctpp-glows .c{width:300px;height:300px;background:#14B8A6;bottom:-200px;left:42%;opacity:.04} 748@media(max-width:1100px){ 749 .ctpp-glows .a{width:320px;height:320px;opacity:.06} 750 .ctpp-glows .b{width:260px;height:260px;opacity:.04} 751 .ctpp-glows .c{display:none} 752} 753.ctpp-hero .lead{position:relative;max-width:780px;margin:0 auto;text-align:center} 754.ctpp-hero .pill{display:inline-flex;align-items:center;gap:8px;font-size:.74rem;font-weight:600; 755 letter-spacing:.04em;
755color:var(--mint);background:rgba(136,255,204,.08); 756 border:1px solid rgba(136,255,204,.2);padding:6px 15px;border-radius:100px;margin-bottom:22px} 757.ctpp-hero h1{margin-bottom:20px} 758.ctpp-hero .lede{font-size:1.08rem;color:var(--mut);max-width:64ch;margin:0 auto} 759.ctpp-hero .acts{display:flex;gap:14px;margin-top:30px;flex-wrap:wrap;justify-content:center} 760.ctpp-hero .fine{margin-top:16px;font-size:.82rem;color:var(--mut2)} 761.ctpp-hero .fine b{color:var(--mint)} 762.ctpp-stage{position:relative;margin-top:56px} 763 764 765/* ---------- manual vs ChangeTower comparison ---------- */ 766.ctpp-vs{display:grid;grid-template-columns:1fr 1fr;gap:24px;max-width:1000px;margin:0 auto} 767.ctpp-vs .col{border-radius:16px;border:1px solid var(--rule2);background:var(--card); 768 padding:26px 26px 10px} 769.ctpp-vs .col.b{background:linear-gradient(180deg,rgba(136,255,204,.055),rgba(136,255,204,.02)); 770 border-color:rgba(136,255,204,.22)} 771.ctpp-vs .ch{display:flex;align-items:center;gap:14px;padding-bottom:20px; 772 border-bottom:1px solid var(--rule2);margin-bottom:6px} 773.ctpp-vs .ico{width:40px;height:40px;border-radius:11px;flex:0 0 auto;display:flex; 774 align-items:center;justify-content:center;background:rgba(255,255,255,.05)} 775.ctpp-vs .col.b .ico{background:rgba(136,255,204,.12)} 776.ctpp-vs .ico svg{width:19px;height:19px;fill:none;stroke:var(--mut2);stroke-width:1.7; 777 stroke-linecap:round;stroke-linejoin:round} 778.ctpp-vs .col.b .ico svg{stroke:var(--mint)} 779.ctpp-vs h3{font-family:Inter,sans-serif;font-size:1.05rem;font-weight:600; 780 line-height:1.3;color:var(--wht)} 781.ctpp-vs .col.a h3{color:var(--mut)} 782.ctpp-vs .sub{display:block;font-size:.78rem;color:var(--mut2);margin-top:3px} 783.ctpp-vs .r{padding:15px 0;border-bottom:1px solid var(--rule2)} 784.ctpp-vs .r:last-child{border-bottom:none} 785.ctpp-vs .k{display:block;font-size:.66rem;font-weight:700;letter-spacing:.11em; 786 text-transform:uppercase;color:var(--mut2);margin-bottom:5px} 787.ctpp-vs .col.b .k{color:rgba(136,255,204,.55)} 788.ctpp-vs .v{display:block;font-size:.94rem;line-height:1.5;color:var(--mut)} 789.ctpp-vs .col.b .v{color:var(--wht)} 790@media(max-width:860px){.ctpp-vs{grid-template-columns:1fr;gap:16px}} 791 792/* ---------- alternating feature rows ---------- */ 793.ctpp-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.08fr); 794 gap:52px;align-items:center} 795.ctpp-row.flip > .txt{order:2} 796.ctpp-row .txt h3{margin-bottom:14px;max-width:20ch} 797.ctpp-row .txt p{color:var(--mut);font-size:1rem;max-width:48ch} 798@media(max-width:960px){ 799 .ctpp-row{grid-template-columns:1fr;gap:36px} 800 .ctpp-row.flip > .txt{order:0} 801} 802 803/* ---------- coverage grid ---------- */ 804.ctpp-cov{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--rule2); 805 border:1px solid var(--rule2);border-radius:14px;overflow:hidden} 806.ctpp-cov .c{background:var(--nav2);padding:24px 22px} 807.ctpp-cov .c:hover{background:#0B2130} 808.ctpp-cov h3{font-family:Inter,sans-serif;font-size:1.05rem;font-weight:600; 809 line-height:1.3;margin-bottom:8px} 810.ctpp-cov p{font-size:.86rem;color:var(--mut);line-height:1.55} 811.ctpp-cov .cad{display:inline-block;margin-top:12px;font-size:.68rem;font-weight:600; 812 color:var(--mint);background:rgba(136,255,204,.08);border:1px solid rgba(136,255,204,.2); 813 border-radius:100px;padding:3px 11px} 814@media(max-width:1000px){.ctpp-cov{grid-template-columns:repeat(2,1fr)}} 815@media(max-width:600px){.ctpp-cov{grid-template-columns:1fr}} 816 817/* ---------- case studies ---------- */ 818.ctpp-uc{display:grid;grid-template-columns:repeat(2,1fr);gap:24px} 819.ctpp-uc .c{background:var(--card);border:1px solid var(--rule2);border-radius:16px; 820 padding:30px;display:flex;flex-direction:column;transition:border-color .25s,transform .25s} 821.ctpp-uc .c:hover{border-color:rgba(136,255,204,.2);transform:translateY(-4px)} 822.ctpp-uc h3{font-family:Inter,sans-serif;font-size:1.05rem;font-weight:600; 823 line-height:1.3;margin-bottom:10px} 824.ctpp-uc p{font-size:.92rem;color:var(--mut);line-height:1.6} 825.ctpp-uc a{display:inline-block;margin-top:auto;padding-top:20px;color:var(--mint); 826 font-size:.86rem;font-weight:600;text-decoration:none} 827@media(max-width:820px){.ctpp-uc{grid-template-columns:1fr}} 828 829/* ---------- feature cards ---------- */ 830.ctpp-feat{display:grid;grid-template-columns:repeat(3,1fr);gap:24px} 831.ctpp-feat .c{background:var(--card);border:1px solid var(--rule2);border-radius:16px; 832 padding:28px;display:flex;flex-direction:column;text-decoration:none; 833 transition:border-color .25s,transform .25s} 834.ctpp-feat .c:hover{border-color:rgba(136,255,204,.2);transform:translateY(-4px)} 835.ctpp-feat .ico{width:44px;height:44px;border-radius:11px;background:rgba(136,255,204,.1); 836 display:flex;align-items:center;justify-content:center;margin-bottom:16px}
837.ctpp-feat .ico svg{width:21px;height:21px;stroke:var(--mint);fill:none;stroke-width:1.8; 838 stroke-linecap:round;stroke-linejoin:round} 839.ctpp-feat h3{font-family:Inter,sans-serif;font-size:1.05rem;font-weight:600; 840 line-height:1.3;margin-bottom:8px} 841.ctpp-feat p{font-size:.89rem;color:var(--mut);line-height:1.6} 842.ctpp-feat .go{margin-top:auto;padding-top:18px;color:var(--mint);font-size:.82rem;font-weight:600} 843@media(max-width:1000px){.ctpp-feat{grid-template-columns:repeat(2,1fr)}} 844@media(max-width:640px){.ctpp-feat{grid-template-columns:1fr}} 845 846/* ---------- routing strip ---------- */ 847.ctpp-route{display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap} 848.ctpp-route span{display:inline-flex;align-items:center;gap:9px;background:var(--card); 849 border:1px solid var(--rule2);border-radius:100px;padding:10px 20px;font-size:.9rem; 850 font-weight:500;color:var(--wht)} 851.ctpp-route span:hover{border-color:rgba(136,255,204,.2)} 852.ctpp-route svg{width:16px;height:16px;stroke:var(--mint);fill:none;stroke-width:1.9; 853 stroke-linecap:round;stroke-linejoin:round;flex:0 0 auto} 854.ctpp-note{text-align:center;max-width:70ch;margin:26px auto 0;font-size:.88rem; 855 color:var(--mut2);line-height:1.6} 856 857/* ---------- FAQ (details/summary, no JS) ---------- */ 858.ctpp-faq{max-width:820px;margin:0 auto} 859.ctpp-faq details{border-bottom:1px solid var(--rule2)} 860.ctpp-faq summary{list-style:none;cursor:pointer;display:flex;align-items:center; 861 justify-content:space-between;gap:20px;padding:24px 0;font-size:1.05rem;font-weight:500; 862 color:var(--wht)} 863.ctpp-faq summary::-webkit-details-marker{display:none} 864.ctpp-faq summary svg{width:19px;height:19px;stroke:var(--mut2);fill:none;stroke-width:2; 865 flex:0 0 auto;transition:transform .2s} 866.ctpp-faq details[open] summary svg{transform:rotate(180deg);stroke:var(--mint)} 867.ctpp-faq .a{padding:0 0 26px} 868.ctpp-faq .a p{color:var(--mut);font-size:.98rem;line-height:1.75;max-width:70ch} 869 870/* ---------- final CTA ---------- */ 871.ctpp-cta{background:linear-gradient(135deg,#0C1E2B,#0C2E3E);text-align:center} 872/* 24ch plus text-wrap:balance gives two lines of roughly equal length; 873 without balance it still breaks evenly rather than leaving an orphan. */ 874.ctpp-cta h2{max-width:24ch;text-wrap:balance;margin:0 auto 16px} 875.ctpp-cta p{color:var(--mut);max-width:52ch;margin:0 auto 32px;font-size:1.05rem} 876.ctpp-cta .acts{display:flex;gap:14px;justify-content:center;flex-wrap:wrap} 877.ctpp-cta .badges{margin-top:34px;display:flex;gap:26px;justify-content:center;flex-wrap:wrap; 878 font-size:.86rem;color:var(--mut2)} 879.ctpp-cta .badges span{display:inline-flex;align-items:center;gap:8px} 880.ctpp-cta .badges b{color:var(--mint)} 881 882/* ============================================================ 883 WHITE APP-UI MOCKS â entrance animation only, then hold. 884 ============================================================ */ 885@keyframes ctppRise{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}} 886@keyframes ctppFade{from{opacity:0}to{opacity:1}} 887@keyframes ctppFill{to{width:100%}} 888.ctpp-app{background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.05); 889 box-shadow:0 30px 70px rgba(0,0,0,.45);overflow:hidden;min-width:0; 890 font-family:Inter,sans-serif;text-align:left} 891.ctpp-app .bar{display:flex;align-items:center;gap:10px;padding:11px 16px; 892 border-bottom:1px solid var(--aln2)} 893.ctpp-app .dots{display:flex;gap:6px} 894.ctpp-app .dots i{width:9px;height:9px;border-radius:50%;display:block} 895.ctpp-app .dots i:nth-child(1){background:#F55B54} 896.ctpp-app .dots i:nth-child(2){background:#F5BD4F} 897.ctpp-app .dots i:nth-child(3){background:#59C36A} 898.ctpp-app .url{flex:1;min-width:0;text-align:center;font-size:11.5px;color:var(--amu); 899 background:#F5F7F8;border-radius:6px;padding:4px 10px;max-width:310px;margin:0 auto; 900 white-space:nowrap;overflow:hidden;text-overflow:ellipsis} 901.ctpp-app .who{font-size:11px;color:var(--amu);font-weight:600;white-space:nowrap} 902.ctpp-app .pad{padding:18px 20px 20px} 903.ctpp-app .h{font-size:14px;font-weight:700;color:#111827} 904.ctpp-app .sub{font-size:11.5px;color:var(--amu);margin-top:2px} 905.ctpp-chip{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600; 906 padding:4px 10px;border-radius:100px;white-space:nowrap} 907.ctpp-chip.ok{background:var(--apt);color:var(--ap)} 908.ctpp-chip.warn{background:#FEF3C7;color:#B45309} 909.ctpp-chip.mute{background:#F5F7F8;color:var(--amu2)} 910.ctpp-app .btn-app{display:inline-flex;align-items:center;gap:6px;background:var(--ap); 911 color:#fff;font-size:12px;font-weight:600;padding:8px 14px;border-radius:8px;border:none; 912 cursor:pointer;font-family:inherit;text-decoration:none} 913.ctpp-app .btn-app.ghost{background:#fff;color:var(--atx2);border:1px solid var(--aln)} 914.ctpp-cap{text-align:center;font-size:.84rem;color:var(--mut2)} 915 916/* the extension mock's caret in block 2 uses this */
917@keyframes ctppCaret{50%{opacity:0}} 918 919@media(prefers-reduced-motion:reduce){ 920 .ctpp *,.ctpp *::before,.ctpp *::after{animation:none!important;transition:none!important} 921} 922 923body.page-id-932 .elementor-932 .e-con, 924body.page-id-932 .elementor-932 .e-con-full{row-gap:0;--row-gap:0px;--gap:0px} 925 926/* 2 â lead line bigger, supporting copy slightly larger */ 927.ctpp-row .txt h3{font-size:clamp(1.25rem,1.9vw,1.5rem);line-height:1.25;max-width:26ch} 928.ctpp-row .txt p{font-size:1.04rem;line-height:1.6} 929.ctpp .ticks div{font-size:.98rem} 930.ctpp .hd p{font-size:1.08rem} 931 932/* 3 â NARROW-VIEWPORT TRACK FLOORS. 933 A bare `1fr` is minmax(auto,1fr): the track can never shrink below its 934 content's min-content width. Every grid on this page that holds a white 935 app mock hits that floor, because the mocks contain nowrap URLs and chips 936 worth ~380px. minmax(0,1fr) + min-width:0 lets them shrink; the mocks' 937 own rows already ellipsize. */ 938@media(max-width:960px){ 939 .ctpp-row{grid-template-columns:minmax(0,1fr)} 940 .ctpp-row > *{min-width:0} 941} 942.ctpp-flow .fstage{grid-template-columns:minmax(0,1fr)} 943.ctpp-flow .fframe{min-width:0} 944.ctpp-flow .fmsg > div{min-width:0} 945 946/* The trust grid needs 4 columns, not the .ctpp-feat default of 3. A 947 modifier class, never an inline style: an inline grid-template-columns 948 outranks every media query and overflows on phones. */ 949.ctpp-feat.four{grid-template-columns:repeat(4,1fr)} 950@media(max-width:1080px){.ctpp-feat.four{grid-template-columns:repeat(2,1fr)}} 951@media(max-width:640px){.ctpp-feat.four{grid-template-columns:minmax(0,1fr)}} 952.ctpp-feat > *{min-width:0} 953 954/* 4 â SPECIFICITY: `.ctpp p{margin:0}` is (0,1,1); .ctpp-note/.ctpp-cap 955 are (0,1,0), so their margins lose the cascade without these. */ 956.ctpp p.ctpp-note{margin:26px auto 0} 957.ctpp p.ctpp-cap{margin-top:30px} 958@media(min-width:1000px){.ctpp-hero p.ctpp-cap{margin-top:22px}} 959 960/* rows + overflow line */ 961.ctpp-snap .rows .tr:last-child{border-bottom:none} 962.ctpp-snap .more{padding:9px 18px;font-size:11px;color:var(--amu);background:#FAFBFC; 963 border-top:1px solid var(--aln2)} 964.ctpp-snap .empty{padding:22px 18px;font-size:12px;color:var(--amu);text-align:center} 965 966/* 5b â CHANGE DETAIL VIEW. 967 Clicking a row opens the stored snapshot. Content changes on the left, 968 the page screenshot on the right. 969 970 NOTHING IS EVER DRAWN ON THE SCREENSHOT. ChangeTower captures screenshots 971 but detects content changes only: it does not detect visual changes, so 972 marking up the capture would be a claim the product cannot make. The 973 highlighting belongs on the text, which is what detection actually knows. 974 Do not add boxes, arrows or diff colours to the .shot pane. */ 975/* STATIC HEIGHT. The list and the detail sit in the same grid cell: the 976 cell is as tall as the taller of the two at every width, so opening or 977 closing a change moves nothing outside the mock. The hidden view keeps 978 its box (visibility, not display) because that box holds the height. 979 .cursor is absolutely positioned and stays out of the grid flow. */ 980.ctpp-snap{display:grid;grid-template-columns:minmax(0,1fr);align-content:start; 981 align-items:start} 982.ctpp-snap > .bar{grid-area:1/1} 983.ctpp-snap > .crumb{grid-area:2/1} 984/* --snapmin is measured and set by the script: the tallest any state gets 985 at this width. Both panes carry it, so the cell never resizes. */ 986.ctpp-snap > .body, 987.ctpp-snap > .detail{grid-area:3/1;min-width:0;min-height:var(--snapmin,0px)} 988.ctpp-snap .detail{display:block;visibility:hidden;pointer-events:none; 989 padding:20px 22px 22px} 990.ctpp-snap.on-detail .body{visibility:hidden;pointer-events:none} 991.ctpp-snap.on-detail .detail{visibility:visible;pointer-events:auto} 992.ctpp-snap .dtop{display:flex;align-items:center;justify-content:space-between;gap:12px; 993 flex-wrap:wrap;margin-bottom:12px} 994.ctpp-snap .back{appearance:none;border:1px solid var(--aln);background:#fff;cursor:pointer; 995 font-family:inherit;font-size:11.5px;font-weight:600;color:var(--atx2); 996 border-radius:8px;padding:6px 12px} 997.ctpp-snap .back:hover{background:#F5F7F8;color:#111827} 998.ctpp-snap .dttl{font-size:14px;font-weight:700;color:#111827} 999.ctpp-snap .dsub{font-size:11px;color:var(--amu);margin-top:2px} 1000.ctpp-snap .dmeta{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px; 1001 background:var(--aln2);border:1px solid var(--aln);border-radius:9px;overflow:hidden; 1002 margin-bottom:14px} 1003.ctpp-snap .dmeta > div{background:#fff;padding:8px 11px;min-width:0}
1004.ctpp-snap .dmeta span{display:block;font-size:8.5px;font-weight:700;letter-spacing:.08em; 1005 text-transform:uppercase;color:var(--amu);margin-bottom:3px} 1006.ctpp-snap .dmeta b{display:block;font-size:11px;color:#111827;font-weight:600; 1007 overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 1008.ctpp-snap .panes{display:grid;grid-template-columns:1fr 1.2fr;gap:12px;align-items:start} 1009.ctpp-snap .pane{border:1px solid var(--aln);border-radius:10px;padding:12px 13px;min-width:0} 1010.ctpp .plbl{font-size:8.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase; 1011 color:var(--amu);margin-bottom:9px} 1012/* a class, not an inline style, so the pane-levelling rules below can 1013 bottom-align it: an inline style beats every rule in this file */ 1014.ctpp-snap .plbl.held{margin:16px 0 6px} 1015 1016 1017/* THE CAPTURED PAGE. Shared by the hero's change detail and by frame 02 of 1018 the "see it in action" walkthrough in ctppb02 â hence .ctpp, not 1019 .ctpp-snap. Deliberately looks like a real page (a nav, a title, 1020 paragraphs, a plan table, a footer) because "we keep a screenshot of the 1021 page" only lands if the thing looks like a page. Set small rather than 1022 scaled: real type at 6â9px reads as a zoomed-out capture and stays crisp. 1023 1024 NOTHING IS EVER MARKED ON IT. See the note above. */ 1025.ctpp .shot{border:1px solid var(--aln);border-radius:8px;overflow:hidden; 1026 background:#fff;box-shadow:0 2px 10px rgba(16,24,40,.06)} 1027.ctpp .scap{display:flex;align-items:center;justify-content:space-between;gap:8px; 1028 padding:6px 9px;background:#FAFBFC;border-bottom:1px solid var(--aln2); 1029 font-size:8px;color:var(--amu)} 1030.ctpp .scap .su{font-family:var(--mono);overflow:hidden;text-overflow:ellipsis; 1031 white-space:nowrap;min-width:0} 1032.ctpp .scap .sd{flex:0 0 auto;font-family:var(--mono)} 1033.ctpp .spage{padding:11px 13px 13px} 1034/* THE SOURCE PAGE'S OWN LOOK. The capture has to look like somebody else's 1035 website, so each source gets a palette of its own via the 1036 --yb custom properties (the hero script sets them per row; frame 02 sets 1037 them inline). Deliberately nothing like ChangeTower's mint: the moment 1038 the capture borrows our palette it reads as our UI instead of as the 1039 source's page. */ 1040.ctpp .shot{--yb:#1B4B8F;--yb2:#12335F;--ybt:#EDF2FA;--ybl:#2E6BC4} 1041.ctpp .snav{display:flex;align-items:center;gap:9px;background:var(--yb2); 1042 margin:-11px -13px 11px;padding:8px 13px;overflow:hidden} 1043.ctpp .snav .swm{font-size:8px;font-weight:800;letter-spacing:.09em;color:#fff; 1044 background:var(--yb);border-radius:3px;padding:2px 6px;flex:0 0 auto} 1045.ctpp .snav i{font-style:normal;font-size:7px;color:rgba(255,255,255,.60); 1046 letter-spacing:.02em} 1047.ctpp .snav i.on{color:#fff;font-weight:700;border-bottom:1.5px solid #fff; 1048 padding-bottom:2px} 1049.ctpp .snav .slog{margin-left:auto;flex:0 0 auto;font-size:6.5px;font-weight:700; 1050 letter-spacing:.06em;text-transform:uppercase;color:#fff;white-space:nowrap; 1051 border:1px solid rgba(255,255,255,.45);border-radius:20px;padding:2px 7px} 1052.ctpp .sh1{font-family:var(--hd);font-size:13px;line-height:1.2;font-weight:500; 1053 color:#0F2444;margin:0 0 4px} 1054.ctpp .smeta{font-size:7px;color:var(--amu);margin-bottom:9px} 1055.ctpp .smeta b{color:var(--yb);font-weight:600} 1056.ctpp .sp{font-size:7.5px;line-height:1.7;color:#5B6673;margin:0 0 7px;text-align:justify} 1057.ctpp .sp b{color:#111827;font-weight:700} 1058.ctpp .ssec{font-size:8.5px;font-weight:700;color:var(--yb);margin:10px 0 6px; 1059 padding-top:8px;border-top:1px solid var(--ybt)} 1060.ctpp .stab{width:100%;border-collapse:collapse;margin-bottom:9px} 1061.ctpp .stab th{font-size:6.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase; 1062 color:#fff;text-align:left;padding:4px 6px;background:var(--yb)} 1063.ctpp .stab th:last-child,.ctpp .stab td:last-child{text-align:right} 1064.ctpp .stab td{font-size:7.5px;color:#374151;padding:4px 6px;border-bottom:1px solid #F3F5F7} 1065.ctpp .stab tr:nth-child(even) td{background:#F6F9FD} 1066.ctpp .slink{font-size:7.5px;font-weight:600;color:var(--ybl);margin:0 0 4px; 1067 text-decoration:underline;text-underline-offset:2px} 1068.ctpp .sfoot2{margin:9px -13px -13px;padding:7px 13px; 1069 border-top:1px solid #DDE6F3;background:var(--ybt); 1070 font-size:6.5px;color:#5A6B85} 1071.ctpp .sfoot{margin-top:10px;font-size:10px;color:var(--amu2);line-height:1.5} 1072 1073/* CAPTURE CHROME. The .shot block is a deliberately convincing page render; 1074 the chrome below announces "captured image" before anyone reads the 1075 caption: a camera glyph on the pane label, a second one in the strip, and 1076 PNG pixel dimensions. It all sits OUTSIDE the capture. Nothing is drawn 1077 on the capture itself. */ 1078.ctpp .plbl.cam{display:flex;align-items:center;gap:5px} 1079.ctpp .plbl.cam svg{width:11px;height:11px;flex:0 0 auto;stroke:currentColor; 1080 stroke-width:1.8;fill:none;stroke-linecap:round;stroke-linejoin:round} 1081.ctpp .scap .sc{display:inline-flex;align-items:center;gap:5px;min-width:0} 1082.ctpp .scap .sc svg{width:9px;height:9px;flex:0 0 auto;stroke:var(--amu); 1083 stroke-width:1.8;fill:none;stroke-linecap:round;stroke-linejoin:round} 1084.ctpp .scap .sd b{font-weight:700;color:var(--atx2);letter-spacing:.04em} 1085 1086/* content changes â this is where highlighting is honest */ 1087.ctpp-snap .dsum{font-size:10.5px;line-height:1.5;color:var(--atx);background:var(--apbg); 1088 border:1px solid #D6EBE4;border-radius:7px;padding:8px 10px;margin-bottom:10px}
1089.ctpp-snap .dsum b{color:#111827;font-weight:600} 1090.ctpp-snap .dsum s{text-decoration:none;display:inline-flex;align-items:center; 1091 justify-content:center;width:16px;height:16px;border-radius:4px;background:var(--ap); 1092 color:#fff;font-size:7.5px;font-weight:800;margin-right:5px;vertical-align:-3px} 1093.ctpp-snap .dl{font-size:10px;line-height:1.5;padding:7px 9px;border-radius:5px;margin-bottom:5px} 1094.ctpp-snap .dl.del{background:#FEF2F2;color:#B42318;border-left:2px solid #F04438; 1095 text-decoration:line-through} 1096.ctpp-snap .dl.add{background:#ECFDF3;color:#067647;border-left:2px solid #17B26A} 1097.ctpp-snap .dnone{font-size:10.5px;line-height:1.55;color:var(--amu);text-align:center; 1098 padding:18px 8px} 1099.ctpp-snap .dnone b{display:block;color:var(--atx);font-weight:600;margin-bottom:4px} 1100.ctpp-snap .hold{display:flex;align-items:flex-start;gap:7px;font-size:10px;line-height:1.5; 1101 color:var(--atx2);padding:4px 0} 1102.ctpp-snap .hold s{text-decoration:none;color:var(--ap);font-weight:800;font-size:9px; 1103 flex:0 0 auto;padding-top:1px} 1104.ctpp-snap .dacts{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px} 1105.ctpp-snap .dnote{margin-top:11px;font-size:10px;color:var(--amu2);line-height:1.55} 1106 1107/* rows are buttons */ 1108.ctpp-snap .rows .tr{width:100%;appearance:none;background:none;font-family:inherit; 1109 text-align:left;cursor:pointer;border-left:none;border-right:none;border-top:none} 1110.ctpp-snap .rows .tr:hover{background:#FAFBFC} 1111 1112/* the pointer is script-driven, not a keyframe with a forwards fill */ 1113.ctpp-snap .cursor{animation:none!important;left:0;top:0; 1114 transform:translate(-52px,-52px);opacity:0; 1115 transition:opacity .35s ease,transform 1s cubic-bezier(.33,.9,.35,1)} 1116.ctpp-snap .cursor.on{opacity:1} 1117.ctpp-snap .cursor svg{width:19px;height:19px;display:block; 1118 filter:drop-shadow(0 2px 5px rgba(0,0,0,.4));transition:transform .13s ease} 1119.ctpp-snap .cursor.press svg{transform:scale(.78)} 1120.ctpp-snap .cursor .ring{position:absolute;left:-9px;top:-9px;width:38px;height:38px; 1121 border-radius:50%;border:2px solid var(--ap);opacity:0;display:block} 1122.ctpp-snap .cursor.press .ring{animation:ctppRing .55s ease-out} 1123 1124@media(max-width:600px){ 1125 .ctpp-snap .panes{grid-template-columns:1fr} 1126 /* three cells in two columns leaves a dead half-cell, which reads as a 1127 rendering fault; the last one takes the full width instead */ 1128 .ctpp-snap .dmeta{grid-template-columns:repeat(2,minmax(0,1fr))} 1129 .ctpp-snap .dmeta > div:last-child{grid-column:1 / -1} 1130} 1131@media(prefers-reduced-motion:reduce){ 1132 .ctpp-snap .cursor{display:none} 1133} 1134 1135/* ---------- TWO PANES THAT FINISH LEVEL ---------- 1136 The stored screenshot is a taller block than the change summary beside it, 1137 so the left pane stopped short and left a hole under its checklist. The 1138 checklist drops to the foot of its own pane instead. Applies wherever the 1139 panes are actually side by side; below 600 they stack and the flex column 1140 is a no-op. Source order decides at equal specificity, so these stay at 1141 the end of the sheet. */ 1142.ctpp-snap .panes{align-items:stretch} 1143.ctpp-snap .panes > .pane:first-child{display:flex;flex-direction:column} 1144.ctpp-snap .plbl.held{margin-top:auto;margin-bottom:6px} 1145 1146/* The captured page's nav bar needs about 280px. On a phone the sign-in 1147 pill and the inactive nav items are dropped rather than spilling past the 1148 frame; overflow:hidden on .snav is the belt to that pair of braces. */ 1149@media(max-width:430px){ 1150 .ctpp .snav .slog{display:none} 1151 .ctpp .snav i:not(.on){display:none} 1152} 1153 1154/* ---------- NO URL BARS ---------- 1155 No app.changetower.com pills in any browser chrome, per the mock rules in 1156 the style guide. .who is pushed to the right; the Slack window keeps its 1157 pill because "Slack · #bd-pipeline" names the channel, not a URL. */ 1158.ctpp-app .bar .who{margin-left:auto} 1159 1160/* ============================================================ 1161 NEW COMPONENTS, inherited unchanged from the government & RFP 1162 monitoring page (918) this page was cloned from. 1163 ============================================================ */ 1164 1165/* ---------- HERO MOCK â price & product watchlist ---------- 1166 A working watchlist, not a still. Rows and the change detail are rendered 1167 by the script at the bottom of block 1. The scripted intro filters to 1168 Price Changes, opens one change, then hands over: pointer fades, chips 1169 and rows go live. No `forwards` fill on anything the script drives. */ 1170.ctpp-snap{position:relative;font-size:14px} 1171.ctpp-snap .crumb{display:flex;align-items:center;gap:8px;padding:11px 20px; 1172 border-bottom:1px solid var(--aln2);font-size:11px;color:var(--amu);flex-wrap:wrap} 1173.ctpp-snap .crumb i{font-style:normal;color:#C7CDD3} 1174.ctpp-snap .crumb b{color:var(--ap);font-weight:600;background:var(--apt); 1175 padding:3px 9px;border-radius:6px} 1176.ctpp-snap .body{padding:20px 24px 24px} 1177.ctpp-snap .title{font-family:Inter,sans-serif;font-size:18px;font-weight:700;color:#111827} 1178.ctpp-snap .help{margin-top:6px;font-size:11.5px;color:var(--amu);line-height:1.55;max-width:78ch} 1179.ctpp-snap .toolbar{display:flex;align-items:center;justify-content:space-between;gap:14px; 1180 flex-wrap:wrap;margin:16px 0 12px} 1181.ctpp-snap .count{font-size:13.5px;font-weight:700;color:#111827;white-space:nowrap} 1182.ctpp-snap .seg{display:inline-flex;gap:4px;background:#F2F5F7;border-radius:100px;padding:3px} 1183.ctpp-snap .sg{appearance:none;border:none;background:transparent;border-radius:100px; 1184 padding:6px 14px;font-family:inherit;font-size:11.5px;font-weight:600;color:var(--atx2); 1185 cursor:pointer;transition:background .2s,color .2s} 1186.ctpp-snap .sg:hover{color:#111827} 1187.ctpp-snap .sg.on{background:#fff;color:var(--ap);box-shadow:0 1px 3px rgba(16,24,40,.12)} 1188.ctpp-snap .tbl{border:1px solid var(--aln);border-radius:11px;overflow:hidden} 1189.ctpp-snap .th,.ctpp-snap .rows .tr{display:grid;grid-template-columns:1.05fr 1.6fr .45fr; 1190 gap:14px;padding:10px 16px;align-items:center} 1191.ctpp-snap .th{background:#FAFBFC;border-bottom:1px solid var(--aln2);font-size:10px; 1192 font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--amu)} 1193.ctpp-snap .rows .tr{border-bottom:1px solid var(--aln2);font-size:12px;color:var(--atx2)} 1194.ctpp-snap .tr .u{font-family:var(--mono);font-size:11px;color:#111827;font-weight:500; 1195 overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 1196.ctpp-snap .tr .w{display:flex;align-items:center;gap:8px;min-width:0} 1197.ctpp-snap .tr .w em{font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 1198.ctpp-snap .tr .d{color:var(--amu);font-weight:500;white-space:nowrap;text-align:right} 1199/* the pointer's box. The script-driven transform/opacity rules live in the 1200 folded addendum section above; this is the base box they assume. Without 1201 position:absolute the pointer sits in flow and shoves the layout. */ 1202.ctpp-snap .cursor{position:absolute;width:19px;height:19px;z-index:4;pointer-events:none} 1203@media(max-width:820px){ 1204 .ctpp-snap .th,.ctpp-snap .rows .tr{grid-template-columns:minmax(0,1fr) minmax(0,1.4fr); 1205 gap:10px;padding:10px 14px} 1206 .ctpp-snap .th span:nth-child(3),.ctpp-snap .tr .d{display:none} 1207 .ctpp-snap .cursor{display:none} 1208 .ctpp-snap .crumb{font-size:10.5px} 1209}
1210/* the price filter labels (Price Changes, Stock & Restocks, Deals & 1211 Coupons, Your Pages) run wider than 886's original four; without 1212 this the five chips overflow the 390px viewport and the last one clips 1213 against the card edge */ 1214@media(max-width:480px){ 1215 .ctpp-snap .seg{flex-wrap:wrap;justify-content:flex-start} 1216 .ctpp-snap .sg{padding:6px 10px;font-size:11px} 1217} 1218 1219/* ---------- FULL-WIDTH HERO (>=1000px) ---------- 1220 Copy centred above, the watchlist mock takes the whole container beneath. 1221 Same layout page 802 landed on: an application window is landscape, and a 1222 668px column made it portrait. */ 1223@media(min-width:1000px){ 1224 .ctpp-hero .lead{max-width:820px} 1225 .ctpp-hero h1{max-width:22ch;margin-left:auto;margin-right:auto} 1226 .ctpp-hero .lede{max-width:70ch} 1227 .ctpp-stage{margin-top:54px} 1228 .ctpp-hero p.ctpp-cap{margin:26px auto 0;max-width:80ch;text-align:center} 1229} 1230 1231/* the click-pulse ring the hero pointer uses; also defined with the 1232 walkthrough styles in block 2, identically, so either widget stands alone */ 1233@keyframes ctppRing{0%{opacity:.9;transform:scale(.3)}100%{opacity:0;transform:scale(1)}} 1234 1235/* ---------- FOLDED FROM 886's PATCH WIDGET (f0c7866) ---------- 1236 1. WRAPPER PADDING. The page template wraps Elementor content in 1237 <main> > section.section-dark with padding:128px 0 on flat #0C1E2B: 1238 dead navy above the hero and above the footer. Same fix as 802/886. 1239 2. HERO BADGE. The /features/ai-monitoring-software/ badge style: pulsing icon + spaced 1240 uppercase + shimmering underline, no pill background. Icon per page: 1241 price tag here, scales-of-justice on 925, landmark on 918, flask 1242 on 906, target reticle on 886, shield on 802. 1243 The page's reduced-motion blanket above stops both animations. */ 1244body.page-id-932 main > section.section-dark{padding-top:0;padding-bottom:0} 1245 1246.ctpp-hero .pill{background:none;border:none;border-radius:0;padding:0; 1247 position:relative;font-size:13px;font-weight:700;letter-spacing:3px; 1248 text-transform:uppercase;color:#88FFCC; 1249 text-shadow:0 0 16px rgba(136,255,204,.45);gap:9px;margin-bottom:36px} 1250.ctpp-hero .pill::before{content:"";width:18px;height:18px;flex:0 0 auto; 1251 background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2388FFCC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z'/%3E%3Ccircle cx='7.5' cy='7.5' r='.5' fill='%2388FFCC'/%3E%3C/svg%3E") center/contain no-repeat; 1252 filter:drop-shadow(0 0 6px rgba(136,255,204,.6)); 1253 animation:ctppBadgePulse 2.4s ease-in-out infinite} 1254.ctpp-hero .pill::after{content:"";position:absolute;left:50%;bottom:-14px; 1255 transform:translateX(-50%);width:120px;height:2px;border-radius:2px; 1256 background:linear-gradient(90deg,rgba(136,255,204,0),#88FFCC,rgba(136,255,204,0)); 1257 background-size:200% 100%;animation:ctppBadgeShimmer 3s linear infinite} 1258@keyframes ctppBadgePulse{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.2);opacity:1}} 1259@keyframes ctppBadgeShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 1260@media(max-width:480px){.ctpp-hero .pill{font-size:11.5px;letter-spacing:2px}} 1261</style> </div> 1262 <div class="elementor-element elementor-element-ctppb01 elementor-widget elementor-widget-html" data-id="ctppb01" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"> 1263 <style>/* CT-LABEL-ICONS v1 (2026-09-10). Every section label carries an 18px mint glyph, same treatment as the Solutions index (.ct-sol-lic). Replaces the old dash. See claude/section-label-icons-2026-09-10.md */ 1264.section-label:has(>.ct-lic),.eyebrow:has(>.ct-lic){display:inline-flex!important;align-items:center;gap:.6em} 1265.ctrev-eyebrow:has(>.ct-lic),.cttabs-eyebrow:has(>.ct-lic){display:flex!important;align-items:center;justify-content:center;gap:.6em} 1266.section-label:has(>.ct-lic)::before,.eyebrow:has(>.ct-lic)::before{display:none!important} 1267.ct-lic{width:1.3em;height:1.3em;min-width:14px;min-height:14px;flex:none;fill:none;stroke:#88FFCC;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 6px rgba(136,255,204,.55))} 1268</style><!-- BLOCK 1 · hero + price & product monitors mock · AI monitoring (criteria) section --> 1269<div class="ctpp"> 1270 1271<!-- ==================== HERO ==================== --> 1272<section class="ctpp-hero dot-grid">
1273 <div class="ctpp-glows" aria-hidden="true"><span class="a"></span><span class="b"></span><span class="c"></span></div> 1274 <div class="in"> 1275 <div class="lead"> 1276 <span class="pill">Price & Product Monitoring</span> 1277 <h1>Price & Product Monitoring For Actionable Intelligence</h1> 1278 <p class="lede">ChangeTower checks your product, deal and pricing pages as often as every 5 minutes and alerts you the moment your price, stock or promo criteria are met.</p> 1279 <div class="acts"> 1280 <a href="https://app2.changetower.com/register" class="btn btn-p">Start Free Trial</a> 1281 <a href="/sales" class="btn btn-g">Book a Demo</a> 1282 </div> 1283 <p class="fine"><b>â</b> First monitor live in 5 minutes</p> 1284 </div> 1285 1286 <div class="ctpp-stage"> 1287 <!-- INTERACTIVE. A working set of price & product monitors, not a still. 1288 The scripted intro plays once on first view: filter to Price 1289 Changes, open the K7 price-drop change. Then it hands over: the 1290 pointer fades and every control it touched is live. Filter by 1291 signal, open any row. 1292 1293 No `forwards` fill on anything the script drives (see the 802 1294 lesson recorded on 918/906/925: do not reintroduce a pointer 1295 parked forever on a glowing button). 1296 1297 The rows, the filter chips and the change detail are all 1298 rendered by the script at the bottom of this block. role="group", 1299 not role="img": it is operable. 1300 1301 RUNNING EXAMPLE â the arithmetic every mock on this page shares. 1302 "Today" is 14 Jul 2026; the watch group holds 24 pages (the 1303 Slack summary in block 2 says 24 too, and the mock shows 1304 8 of them). Three snapshot series, one per 1305 source folder, each with its own cadence. Frequent monitoring is 1306 this page's story, so the wishlist folder checks HOURLY: 1307 Wishlist & Restocks hourly on the hour since 01 May 2026 1308 00:00: May 31Ã24=744, Jun 30Ã24=720, 01â13 Jul 1309 13Ã24=312, 14 Jul 00:00 to 09:00 = 10 1310 â #1786 at 09:00 14 Jul (price drop); #1784 at 1311 07:00 (restock); the no-change row is also #1786. 1312 Deals & Price Lists daily at 06:00 since 01 Feb 2026: 1313 28+31+30+31+30+14 = 164 at 14 Jul; 13 Jul #163; 1314 12 Jul #162; 10 Jul #160. 1315 Your Store Pages daily at 03:00 since 15 Apr 2026: 1316 16+31+30+14 = 91 at 14 Jul (#91); 11 Jul #88. 1317 The walkthrough in block 2 uses the hourly Wishlist series 1318 (1786) and its export screen sums 1786+1786+1786+1042 = 6400 1319 (the fourth page was only added 01 Jun 2026 00:00, hence its 1320 720+312+10 = 1042). All of these numbers move together or none 1321 of them do. 1322 RETAIL CONTENT IS FICTION: every retailer is invented (Kestrel 1323 Audio, Alderbrook Outdoor Co., Harbor Supply Co., Brightloom 1324 Home, Fernvale Boutique, Lumenplay) with plausible-but-non-live 1325 domains, same stance as Cascadia Cloud / Fenwick Analytics on 1326 925. yourstore.com follows the house placeholder-customer-domain 1327 convention (style guide §4). Prices, codes and dates are 1328 invented placeholders. --> 1329 <div class="ctpp-app ctpp-snap" data-ctpp-watch role="group" aria-label="Interactive demo of your monitored pages: filter them by signal type, from price changes and restocks to new deals and missing elements, and open a change to see the AI summary and the stored snapshot"> 1330 <div class="bar"> 1331 <span class="dots"><i></i><i></i><i></i></span> 1332 <span class="who">14 Jul 2026</span> 1333 </div> 1334 <div class="crumb"> 1335 <span>Monitors</span><i>âº</i> 1336 <b>Price & product watch</b> 1337 </div> 1338 <div class="body"> 1339 <div class="title">Price & product watch</div> 1340 <p class="help">Every page here is under a monitor. ChangeTower checks it on your schedule, stores a dated snapshot each time, and alerts you when your criteria are met.</p> 1341 1342 <div class="toolbar"> 1343 <div class="count"><span class="n">Showing 8 of 24 watched pages</span></div> 1344 <div class="seg" role="group" aria-label="Filter your monitors by signal type"> 1345 <button type="button" class="sg on" data-cat="all">All</button> 1346 <button type="button" class="sg" data-cat="price">Price Changes</button> 1347 <button type="button" class="sg" data-cat="stock">Stock & Restocks</button> 1348 <button type="button" class="sg" data-cat="deal">Deals & Coupons</button> 1349 <button type="button" class="sg" data-cat="own">Your Pages</button> 1350 </div> 1351 </div> 1352 1353 <div class="tbl"> 1354 <div class="th"><span>Page</span><span>Latest change</span><span>When</span></div> 1355 <div class="rows"></div> 1356 </div> 1357 </div> 1358 <!-- CHANGE DETAIL. Reached by clicking a row, and by the scripted
1359 intro. Content changes on the left; on the right, the page 1360 screenshot ChangeTower stored on that check, shown as captured. 1361 1362 The screenshot is never marked up. ChangeTower captures 1363 screenshots but detects content changes only: it does not 1364 detect visual changes, so drawing boxes or diff colours on the 1365 capture would claim something the product does not do. The 1366 highlighting goes on the text, which is what detection knows. 1367 Rows with no change still have a snapshot, and say so. --> 1368 <div class="detail"> 1369 <div class="dtop"> 1370 <div style="display:flex;align-items:center;gap:12px;min-width:0"> 1371 <button type="button" class="back">‹ Monitors</button> 1372 <div style="min-width:0"> 1373 <div class="dttl"></div> 1374 <div class="dsub"><span class="dwhen"></span></div> 1375 </div> 1376 </div> 1377 <span class="ctpp-chip ok dstate">Stored</span> 1378 </div> 1379 <div class="dmeta"> 1380 <div><span>Monitor</span><b class="m0"></b></div> 1381 <div><span>Captured</span><b class="m1"></b></div> 1382 <div><span>Snapshot</span><b class="m2"></b></div> 1383 </div> 1384 <div class="panes"> 1385 <div class="pane"> 1386 <div class="plbl">Content changes</div> 1387 <div class="dbody"></div> 1388 <div class="plbl held">Stored in this snapshot</div> 1389 <div class="hold"><s>✓</s>A screenshot of the page, exactly as a visitor saw it</div> 1390 <div class="hold"><s>✓</s>The full HTML behind it</div> 1391 <div class="hold"><s>✓</s>The exact date and time it was captured</div> 1392 </div> 1393 <div class="pane"> 1394 <div class="plbl cam"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>Screenshot of the page, as rendered</div> 1395 <div class="shot"> 1396 <div class="scap"><span class="sc"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg><span class="su"></span></span><span class="sd"></span></div> 1397 <div class="spage"></div> 1398 </div> 1399 <p class="sfoot">The screenshot stored on that check: the page as a visitor saw it, kept with its HTML and never edited.</p> 1400 </div> 1401 </div> 1402 <div class="dacts"> 1403 <button type="button" class="btn-app">Open screenshot</button> 1404 <button type="button" class="btn-app ghost">Export spreadsheet</button> 1405 </div> 1406 <p class="dnote">Detection is content-level: ChangeTower reads the words and the HTML. The screenshot is the stored record of the page, never compared against anything.</p> 1407 </div> 1408 <div class="cursor" aria-hidden="true"><i class="ring"></i><svg viewBox="0 0 24 24"><path d="M5 2.5l13.5 8.6-6.2 1.4L14 19.5z" fill="#1F2937" stroke="#fff" stroke-width="1.4" stroke-linejoin="round"/></svg></div> 1409 </div> 1410 <p class="ctpp-cap">Every product, deal and pricing page in one place, your own store's included. Open a row for what changed and how the page looked.</p> 1411 </div> 1412 <!-- No trust line on this page, matching 918/906/925's precedent. --> 1413 </div> 1414</section> 1415 1416 1417 1418<style> 1419/* ---------- MOCK â AI monitoring (criteria) ---------- 1420 Replaced the Folders section on Lamija's request (2026-08-10): folders 1421 are not to be highlighted on this page; AI monitoring is. Styles live 1422 in-widget next to the section they serve, same pattern the folders mock 1423 used. Entrance animation only (the fields stagger in, then the triage 1424 rows), then hold. ctppRise and ctppCaret come from the main stylesheet. 1425 1426 RULE 8 â the three triage rows are the SAME events as the walkthrough's 1427 history screen in block 2 (02 Jun price increase $239 to $249, 19 Jun 1428 out of stock, 14 Jul price drop $249 to $199): same dates, same prices. 1429 They move together or not at all. The rule text is the same rule quoted 1430 in the walkthrough's "Your rule" panel and the hero row. 1431 1432 .afld delays use nth-child (children of .pad: 1 .h, 2 .sub, 3-5 .afld,
1433 6 .atlbl, 7 .atri, 8 .anote), not nth-of-type: every child is a div, so 1434 nth-of-type would count .h and .sub first and match nothing. */ 1435.ctpp-ai .afld{border:1px solid var(--aln);border-radius:8px;padding:8px 11px;margin-bottom:8px; 1436 opacity:0;animation:ctppRise .35s ease forwards} 1437.ctpp-ai .afld:nth-child(3){animation-delay:.25s} 1438.ctpp-ai .afld:nth-child(4){animation-delay:.4s} 1439.ctpp-ai .afld:nth-child(5){animation-delay:.55s} 1440.ctpp-ai .afld b{display:block;font-size:8.5px;font-weight:700;letter-spacing:.08em; 1441 text-transform:uppercase;color:var(--amu);margin-bottom:2px} 1442.ctpp-ai .afld span{display:block;font-size:11.5px;color:#111827;font-weight:500;line-height:1.45} 1443.ctpp-ai .afld .mono2{font-family:var(--mono);font-size:10.5px;overflow:hidden; 1444 text-overflow:ellipsis;white-space:nowrap} 1445.ctpp-ai .acaret{display:inline-block;width:1.5px;height:11px;background:var(--ap); 1446 margin-left:2px;vertical-align:-2px;animation:ctppCaret 1s step-end infinite} 1447.ctpp-ai .atlbl{font-size:8.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase; 1448 color:var(--amu);margin:14px 0 8px} 1449.ctpp-ai .atri{border:1px solid var(--aln);border-radius:10px;overflow:hidden} 1450.ctpp-ai .atr{display:flex;align-items:center;justify-content:space-between;gap:10px; 1451 padding:9px 12px;border-bottom:1px solid var(--aln2);font-size:11.5px;color:var(--atx2); 1452 opacity:0;animation:ctppRise .4s ease forwards} 1453.ctpp-ai .atr:last-child{border-bottom:none} 1454.ctpp-ai .atr:nth-child(1){animation-delay:.8s} 1455.ctpp-ai .atr:nth-child(2){animation-delay:.95s} 1456.ctpp-ai .atr:nth-child(3){animation-delay:1.1s} 1457.ctpp-ai .atr .ad{font-family:var(--mono);font-size:10px;color:var(--amu);flex:0 0 auto} 1458.ctpp-ai .atr .aw{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 1459.ctpp-ai .anote{margin-top:13px;font-size:11.5px;color:var(--amu2);display:flex;gap:8px} 1460@media(prefers-reduced-motion:reduce){ 1461 .ctpp-ai .afld,.ctpp-ai .atr{opacity:1!important} 1462} 1463</style> 1464 1465<!-- ==================== AI MONITORING ==================== 1466 Replaced the Folders section on Lamija's request (2026-08-10). The 1467 criteria capability is real and already claimed elsewhere on this 1468 page (hero, walkthrough "Your rule" panel, FAQ) and on /features/ai-monitoring-software/ 1469 and /features/website-monitoring-browser-extension/ (WP 636: plain-language criteria). Nothing 1470 here claims more than those do: rule per monitor, changes read and 1471 classified against it, non-matching changes archived without an 1472 alert, summaries in plain language. --> 1473<section style="background:var(--nav)"> 1474 <div class="in"> 1475 <div class="hd"> 1476 <div class="eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3l1.9 5.4L19.5 10l-5.6 1.6L12 17l-1.9-5.4L4.5 10l5.6-1.6z"/><path d="M18.5 15.5l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8z"/></svg>AI Monitoring</div> 1477 <h2>Monitor only the products, prices, or other content you care about</h2> 1478 <p>Write your alert criteria in plain language, per monitor. The AI reads every change against them: matches reach you, the rest is archived.</p> 1479 </div> 1480 <div class="ctpp-row flip"> 1481 <div class="txt"> 1482 <h3>Criteria in your own words.</h3> 1483 <p>No thresholds buried in settings screens. Say what deserves an alert and the monitor holds to exactly that.</p> 1484 <div class="ticks"> 1485 <div><span>"Alert me if the price drops below $200, or it goes out of stock"</span></div> 1486 <div><span>Every change is classified against your rule before anything reaches you</span></div> 1487 <div><span>Changes that don't match are archived without an alert, so the record stays whole</span></div> 1488 <div><span>Every alert carries a plain-language summary of what moved</span></div> 1489 <div><span>Change the rule any time, per monitor</span></div> 1490 </div> 1491 <div style="display:flex;gap:14px;flex-wrap:wrap;margin-top:28px"> 1492 <a href="/features/ai-monitoring-software/" class="btn btn-p">Explore AI Monitoring</a> 1493 <a href="https://app2.changetower.com/register" class="btn btn-g">Start Free Trial</a> 1494 </div> 1495 </div> 1496 <div> 1497 <div class="ctpp-app ctpp-ai" role="img" aria-label="Creating a ChangeTower monitor with a plain-language AI rule: watch the Kestrel K7 product page and alert if the price drops below 200 dollars or it goes out of stock, checked every 5 minutes. Below it, three past changes show the rule at work: a price increase archived with no alert, an out-of-stock flip that alerted, and the price drop to 199 dollars that alerted."> 1498 <div class="bar">
1499 <span class="dots"><i></i><i></i><i></i></span> 1500 <span class="who">AI Monitoring</span> 1501 </div> 1502 <div class="pad"> 1503 <div class="h">New monitor</div> 1504 <div class="sub" style="margin-bottom:14px">Describe what to watch for. The AI does the triage.</div> 1505 <div class="afld"><b>Page</b><span class="mono2">kestrelaudio.com/products/k7-wireless</span></div> 1506 <div class="afld"><b>Watch for</b><span>Alert me if the price drops below $200, or it goes out of stock<i class="acaret"></i></span></div> 1507 <div class="afld"><b>Checks</b><span>Every 5 minutes</span></div> 1508 <div class="atlbl">How past changes were handled</div> 1509 <div class="atri"> 1510 <div class="atr"><span class="ad">02 Jun</span><span class="aw">Price increase: $239.00 → $249.00</span><span class="ctpp-chip mute">Archived, no alert</span></div> 1511 <div class="atr"><span class="ad">19 Jun</span><span class="aw">Out of stock</span><span class="ctpp-chip warn">Alert sent</span></div> 1512 <div class="atr"><span class="ad">14 Jul</span><span class="aw">Price drop: $249.00 → $199.00</span><span class="ctpp-chip warn">Alert sent</span></div> 1513 </div> 1514 <div class="anote"><span style="color:var(--ap);font-weight:700">✓</span><span>The record keeps everything. The channel only hears what matches.</span></div> 1515 </div> 1516 </div> 1517 <p class="ctpp-cap">One rule, written once. The $249 bump is archived; the out-of-stock flip and the drop below $200 reach you.</p> 1518 </div> 1519 </div> 1520 </div> 1521</section> 1522 1523</div>
1524<script> 1525(function () { 1526 'use strict'; 1527 1528 /* Interactive price & product monitor list for the hero mock. 1529 Markup lives ABOVE this script; an inline script runs at parse time and 1530 cannot see markup below it, so it must stay after the markup AND be 1531 guarded on DOMContentLoaded. Do not move it up. 1532 1533 One source of truth for the rows, the filters and the change detail. 1534 The scripted intro plays once on first view (filter to Price Changes, 1535 open the K7 price-drop change), then hands over: pointer fades, chips 1536 and rows go live. */ 1537 function init() { 1538 document.querySelectorAll('[data-ctpp-watch]').forEach(setup); 1539 } 1540 1541 function setup(root) { 1542 var segBtns = root.querySelectorAll('.seg .sg'); 1543 var rows = root.querySelector('.rows'); 1544 var count = root.querySelector('.count .n'); 1545 var cur = root.querySelector('.cursor'); 1546 var det = root.querySelector('.detail'); 1547 var back = root.querySelector('.back'); 1548 var bodyEl= root.querySelector('.body'); 1549 if (!segBtns.length || !rows || !det) return; 1550 1551 /* The rows: 8 of the group's 24 pages, spread across the signal 1552 types a price watcher actually tracks: a price drop below a set 1553 threshold, a supplier price-list adjustment, a restock, a new 1554 sitewide code, a lowered free-shipping threshold, and two changes 1555 on the watcher's own store (a sale price that stopped displaying, 1556 and a missing promo banner), plus one quiet page (the archive 1557 stores those too). 1558 "Today" is 14 Jul 2026; see the arithmetic note in the markup for 1559 the three snapshot series (the Wishlist folder checks HOURLY). 1560 Retail content is fiction: every retailer is invented with a 1561 plausible-but-non-live domain, and yourstore.com is the house 1562 placeholder-customer-domain convention. It has to stay consistent 1563 with the walkthrough in block 2: same K7 price-drop story, same 1564 dates, same counts. */ 1565 var DATA = [ 1566 { id:'k7', url:'kestrelaudio.com/products/k7-wireless', cat:'price', 1567 chip:'warn', label:'Material', what:'Price drop: $249.00 â $199.00, below your $200 alert', 1568 when:'14 Jul', mon:'Wishlist & Restocks · Kestrel K7', cap:'14 Jul 2026, 09:00', snap:'#1786', 1569 dwhen:'Snapshot stored 14 Jul 2026 at 09:00', state:'Material change', 1570 sum:'The <b>K7 Wireless Headphones</b> dropped from $249.00 to <b>$199.00</b>, a $50 cut that puts the price below your $200 alert threshold. The listing shows in stock, and no coupon code is required.', 1571 del:'Price: $249.00.', 1572 add:'Price: $199.00. Save $50 for a limited time.', 1573 shot:{ brand:'KESTREL AUDIO', c1:'#7C2D12', c2:'#EA580C', ct:'#FDF0E7', cl:'#EA580C', 1574 nav:['Headphones','Speakers','Support'], on:0, px:2040, su:'kestrelaudio.com/products/k7-wireless', 1575 h1:'K7 Wireless Headphones', meta:'In stock · Updated 14 July 2026', 1576 paras:['<b>$199.00.</b> Was $249.00. Save $50 for a limited time.', 1577 'Adaptive noise cancellation, 40-hour battery and multipoint pairing. Free shipping on orders over $50, with 30-day returns.'], 1578 sec:'Product details', tab:null, 1579 tail:'Ships in 1 to 2 business days from the Portland warehouse.', 1580 link:'Add to cart', 1581 foot:'Kestrel Audio' } }, 1582 { id:'wholesale', url:'harborsupply.com/wholesale/price-list', cat:'price', 1583 chip:'mute', label:'Minor', what:'Two wholesale prices adjusted, both under 3%', 1584 when:'12 Jul', mon:'Deals & Price Lists · Harbor Supply', cap:'12 Jul 2026, 06:00', snap:'#162', 1585 dwhen:'Snapshot stored 12 Jul 2026 at 06:00', state:'Minor change', 1586 sum:'Harbor Supply adjusted two lines on its wholesale price list: galvanized fittings up 2.4% and marine rope up 1.8%. No other items changed, and the volume-discount tiers are untouched.', 1587 del:'Galvanized fittings: $84.00 per case.', 1588 add:'Galvanized fittings: $86.00 per case.', 1589 shot:{ brand:'HARBOR SUPPLY', c1:'#1E3A5F', c2:'#2563EB', ct:'#EAF0FB', cl:'#2563EB', 1590 nav:['Wholesale','Catalog','Account'], on:0, px:2410, su:'harborsupply.com/wholesale/price-list', 1591 h1:'Wholesale Price List', meta:'Updated 12 July 2026', 1592 paras:['<b>Galvanized fittings: $86.00 per case</b>, effective 12 July 2026. Marine rope: $27.40 per spool.', 1593 'Volume-discount tiers apply automatically at checkout for account holders.'], 1594 sec:'Recent adjustments', tab:null,
1595 tail:'Prices last reviewed 12 July 2026.', 1596 link:'Download the full price list', 1597 foot:'Harbor Supply Co.' } }, 1598 { id:'restock', url:'alderbrookoutdoor.com/products/ridgepole-2-tent', cat:'stock', 1599 chip:'warn', label:'Material', what:'Back in stock: Ridgepole 2-Person Tent', 1600 when:'14 Jul', mon:'Wishlist & Restocks · Alderbrook Outdoor', cap:'14 Jul 2026, 07:00', snap:'#1784', 1601 dwhen:'Snapshot stored 14 Jul 2026 at 07:00', state:'Material change', 1602 sum:'The <b>Ridgepole 2-Person Tent</b> is back in stock in all three colors after 11 days unavailable. The price is unchanged at $329.00. This matched your rule: alert the moment it comes back in stock.', 1603 del:'Availability: out of stock.', 1604 add:'Availability: in stock, all colors.', 1605 shot:{ brand:'ALDERBROOK OUTDOOR', c1:'#14532D', c2:'#16A34A', ct:'#EAF6EE', cl:'#16A34A', 1606 nav:['Tents','Packs','Sale'], on:0, px:2320, su:'alderbrookoutdoor.com/products/ridgepole-2-tent', 1607 h1:'Ridgepole 2-Person Tent', meta:'In stock · Updated 14 July 2026', 1608 paras:['<b>Back in stock.</b> $329.00, available in forest, slate and clay.', 1609 'Freestanding two-person backpacking tent, 1.9 kg, with a full-coverage fly.'], 1610 sec:'Availability', tab:null, 1611 tail:'Orders placed before 2 PM ship the same day.', 1612 link:'Add to cart', 1613 foot:'Alderbrook Outdoor Co.' } }, 1614 { id:'console-noc', url:'lumenplay.com/consoles/solstice-bundle', cat:'stock', 1615 chip:'ok', label:'No change', what:'No change on the last check', 1616 when:'14 Jul', mon:'Wishlist & Restocks · Solstice bundle', cap:'14 Jul 2026, 09:00', snap:'#1786', 1617 dwhen:'Snapshot stored 14 Jul 2026 at 09:00', state:'Stored, no change', 1618 sum:null, del:null, add:null, 1619 shot:{ brand:'LUMENPLAY', c1:'#312E81', c2:'#4F46E5', ct:'#EDECFA', cl:'#4F46E5', 1620 nav:['Consoles','Games','Support'], on:0, px:1980, su:'lumenplay.com/consoles/solstice-bundle', 1621 h1:'Solstice Console Bundle', meta:'Out of stock · Updated 03 July 2026', 1622 paras:['The Solstice console bundle is currently out of stock. Restocks are announced on this page first.'], 1623 sec:'Availability', tab:null, 1624 tail:'Last restock: 03 July 2026, sold out the same day.', 1625 link:'Notify me', 1626 foot:'Lumenplay' } }, 1627 { id:'promo', url:'brightloomhome.com/sale', cat:'deal', 1628 chip:'warn', label:'Material', what:'New promotion: 20% off sitewide with code BRIGHT20', 1629 when:'13 Jul', mon:'Deals & Price Lists · Brightloom Home', cap:'13 Jul 2026, 06:00', snap:'#163', 1630 dwhen:'Snapshot stored 13 Jul 2026 at 06:00', state:'Material change', 1631 sum:'A sitewide promotion went live on this sale page: <b>20% off with code BRIGHT20</b>, running through 20 Jul 2026. It is the first sitewide code on this page since March.', 1632 del:'Current offer: free shipping on orders over $75.', 1633 add:'20% off sitewide with code BRIGHT20, through 20 Jul 2026.', 1634 shot:{ brand:'BRIGHTLOOM HOME', c1:'#581C87', c2:'#9333EA', ct:'#F5EEFB', cl:'#9333EA', 1635 nav:['Sale','New','Rooms'], on:0, px:2140, su:'brightloomhome.com/sale', 1636 h1:'The Summer Sale', meta:'Updated 13 July 2026', 1637 paras:['<b>20% off sitewide with code BRIGHT20.</b> Runs through 20 July 2026, no minimum order.', 1638 'Discounts apply at checkout. Sale items are marked throughout the store.'], 1639 sec:'Current offers', tab:null, 1640 tail:'Free shipping on orders over $75 continues alongside the code.', 1641 link:'Shop the sale', 1642 foot:'Brightloom Home' } }, 1643 { id:'shipping', url:'fernvaleboutique.com/offers', cat:'deal', 1644 chip:'mute', label:'Minor', what:'Free-shipping threshold lowered: $75 â $50', 1645 when:'10 Jul', mon:'Deals & Price Lists · Fernvale Boutique', cap:'10 Jul 2026, 06:00', snap:'#160', 1646 dwhen:'Snapshot stored 10 Jul 2026 at 06:00', state:'Minor change', 1647 sum:'Fernvale Boutique lowered its free-shipping threshold from $75 to <b>$50</b>. No coupon codes were added or removed.', 1648 del:'Free shipping on orders over $75.', 1649 add:'Free shipping on orders over $50.', 1650 shot:{ brand:'FERNVALE', c1:'#9F1239', c2:'#E11D48', ct:'#FBEAEE', cl:'#E11D48', 1651 nav:['Offers','New In','Edit'], on:0, px:1860, su:'fernvalebout
1651ique.com/offers', 1652 h1:'Current Offers', meta:'Updated 10 July 2026', 1653 paras:['<b>Free shipping on orders over $50.</b> Applied automatically at checkout.', 1654 'Seasonal offers are listed on this page as they go live.'], 1655 sec:'Live offers', tab:null, 1656 tail:'Members see early-access offers after signing in.', 1657 link:'See all offers', 1658 foot:'Fernvale Boutique' } }, 1659 { id:'own-price', url:'yourstore.com/products/alpine-anorak', cat:'own', 1660 chip:'warn', label:'Material', what:'Sale price missing after your catalog update', 1661 when:'14 Jul', mon:'Your Store Pages · product pages', cap:'14 Jul 2026, 03:00', snap:'#91', 1662 dwhen:'Snapshot stored 14 Jul 2026 at 03:00', state:'Material change', 1663 sum:'After last night\'s catalog update, this product page stopped showing its sale price: it now displays the list price of <b>$168.00</b> with no sale price beside it. Your rule flags any change to the displayed price on your own pages.', 1664 del:'Price: $129.00 sale, $168.00 list.', 1665 add:'Price: $168.00.', 1666 shot:{ brand:'YOUR STORE', c1:'#92400E', c2:'#D97706', ct:'#FBF3E6', cl:'#D97706', 1667 nav:['Jackets','Sale','About'], on:0, px:2200, su:'yourstore.com/products/alpine-anorak', 1668 h1:'Alpine Anorak', meta:'In stock · Updated 14 July 2026', 1669 paras:['<b>$168.00.</b>', 1670 'Windproof shell with a packable hood. Free returns within 30 days.'], 1671 sec:'Product details', tab:null, 1672 tail:'Also available: Alpine Anorak Kids.', 1673 link:'Add to cart', 1674 foot:'Your Store' } }, 1675 { id:'own-banner', url:'yourstore.com/landing/summer-sale', cat:'own', 1676 chip:'warn', label:'Material', what:'Missing element: SUMMER15 banner no longer on the page', 1677 when:'11 Jul', mon:'Your Store Pages · landing pages', cap:'11 Jul 2026, 03:00', snap:'#88', 1678 dwhen:'Snapshot stored 11 Jul 2026 at 03:00', state:'Material change', 1679 sum:'<b>Missing element:</b> the summer sale banner and its code SUMMER15 are no longer on this landing page. They were present on every check since monitoring began, and the campaign is scheduled to run through 31 Jul.', 1680 del:'SUMMER15 banner: present.', 1681 add:'SUMMER15 banner: removed.', 1682 shot:{ brand:'YOUR STORE', c1:'#92400E', c2:'#D97706', ct:'#FBF3E6', cl:'#D97706', 1683 nav:['Summer Sale','Jackets','About'], on:0, px:1740, su:'yourstore.com/landing/summer-sale', 1684 h1:'The Summer Sale', meta:'Updated 11 July 2026', 1685 paras:['Seasonal picks across jackets, packs and footwear.',
1686 'This page previously displayed the SUMMER15 sitewide banner above the product grid. As of the latest check, that banner is no longer present.'], 1687 sec:'Page contents', tab:null, 1688 tail:'The product grid itself is unchanged.', 1689 link:'Shop the sale', 1690 foot:'Your Store' } } 1691 ]; 1692 1693 var cat = 'all'; 1694 var shown = DATA[0]; 1695 var live = false; 1696 var timers = []; 1697 function at(fn, ms) { timers.push(setTimeout(fn, ms)); } 1698 function stopTimers() { timers.forEach(clearTimeout); timers = []; } 1699 1700 /* ---------- rendering ---------- */ 1701 1702 function visible() { 1703 return cat === 'all' ? DATA : DATA.filter(function (r) { return r.cat === cat; }); 1704 } 1705 1706 function renderRows() { 1707 var list = visible(); 1708 /* the group holds 24 pages; the Slack summary in block 2 says 24 1709 too, so this line has to agree */ 1710 count.textContent = 'Showing ' + list.length + ' of 24 watched pages'; 1711 rows.innerHTML = ''; 1712 list.forEach(function (r) { 1713 var b = document.createElement('button'); 1714 b.type = 'button'; 1715 b.className = 'tr'; 1716 b.setAttribute('aria-label', 'Open the latest snapshot of ' + r.url); 1717 b.innerHTML = '<span class="u">' + r.url + '</span>' + 1718 '<span class="w"><span class="ctpp-chip ' + r.chip + '">' + r.label + '</span><em>' + r.what + '</em></span>' + 1719 '<span class="d">' + r.when + '</span>'; 1720 b.addEventListener('click', function () { handover(); openDetail(r); }); 1721 rows.appendChild(b); 1722 }); 1723 } 1724
1725 function renderSeg() { 1726 segBtns.forEach(function (b) { 1727 b.classList.toggle('on', b.getAttribute('data-cat') === cat); 1728 }); 1729 } 1730 1731 /* the captured source page, built from the row's data so every row 1732 has an honest screenshot. Nothing is ever drawn on it. */ 1733 function renderShot(r) { 1734 var s = r.shot; 1735 var shot = det.querySelector('.shot'); 1736 shot.style.setProperty('--yb', s.c2); 1737 shot.style.setProperty('--yb2', s.c1); 1738 shot.style.setProperty('--ybt', s.ct); 1739 shot.style.setProperty('--ybl', s.cl); 1740 det.querySelector('.scap .su').textContent = s.su; 1741 /* per-page capture dimensions; the K7 product page's 2040 must match 1742 frame 02 of the walkthrough in block 2, which shows the same capture */ 1743 det.querySelector('.scap .sd').innerHTML = '1440 × ' + (s.px || 2600) + ' · <b>PNG</b>'; 1744 var h = '<div class="snav"><span class="swm">' + s.brand + '</span>'; 1745 s.nav.forEach(function (n, i) { 1746 h += '<i' + (i === s.on ? ' class="on"' : '') + '>' + n + '</i>'; 1747 }); 1748 h += '<span class="slog">Sign in</span></div>'; 1749 h += '<div class="sh1">' + s.h1 + '</div>'; 1750 h += '<div class="smeta">' + s.meta + '</div>'; 1751 s.paras.forEach(function (p) { h += '<p class="sp">' + p + '</p>'; }); 1752 if (s.sec) h += '<div class="ssec">' + s.sec + '</div>'; 1753 if (s.tab) { 1754 h += '<table class="stab">'; 1755 s.tab.forEach(function (row, i) { 1756 h += '<tr>' + row.map(function (c) { 1757 return i === 0 ? '<th>' + c + '</th>' : '<td>' + c + '</td>'; 1758 }).join('') + '</tr>'; 1759 }); 1760 h += '</table>'; 1761 } 1762 if (s.tail) h += '<p class="sp">' + s.tail + '</p>'; 1763 h += '<div class="slink">' + s.link + '</div>'; 1764 h += '<div class="sfoot2">' + s.foot + '</div>'; 1765 det.querySelector('.spage').innerHTML = h; 1766 } 1767 1768 /* fillDetail is separate from openDetail on purpose: the detail is 1769 filled once at setup so the shared grid cell is at its final height 1770 from the first paint. See lockHeight below. */ 1771 function fillDetail(r) { 1772 shown = r; 1773 det.querySelector('.dttl').textContent = '/' + r.url.split('/').slice(1).join('/'); 1774 det.querySelector('.dwhen').textContent = r.dwhen; 1775 det.querySelector('.m0').textContent = r.mon; 1776 det.querySelector('.m1').textContent = r.cap; 1777 det.querySelector('.m2').textContent = r.snap; 1778 var state = det.querySelector('.dstate'); 1779 state.textContent = r.state; 1780 state.className = 'ctpp-chip dstate ' + (r.sum ? (r.chip === 'warn' ? 'warn' : 'mute') : 'ok'); 1781 var body = det.querySelector('.dbody'); 1782 if (!r.sum) { 1783 body.innerHTML = '<div class="dnone"><b>Nothing changed on this check.</b>' + 1784 'The snapshot was stored anyway, so the record has no gaps in it.</div>'; 1785 } else { 1786 var h = '<p class="dsum"><s>AI</s>' + r.sum + '</p>'; 1787 if (r.del) h += '<div class="dl del">' + r.del + '</div>'; 1788 if (r.add) h += '<div class="dl add">' + r.add + '</div>'; 1789 body.innerHTML = h; 1790 } 1791 renderShot(r); 1792 } 1793 1794 function openDetail(r) { fillDetail(r); root.classList.add('on-detail'); } 1795 function closeDetail() { root.classList.remove('on-detail'); } 1796 back.addEventListener('click', function () { handover(); closeDetail(); }); 1797 1798 /* ---------- interaction ---------- */ 1799 1800 function setCat(c) { cat = c; renderSeg(); renderRows(); } 1801 1802 segBtns.forEach(function (b) { 1803 b.addEventListener('click', function () { 1804 handover(); closeDetail(); setCat(b.getAttribute('data-cat')); 1805 }); 1806 }); 1807 1808 /* ---------- scripted intro ---------- */ 1809 1810 function handover() { 1811 if (live) return; 1812 live = true; 1813 stopTimers(); 1814 if (cur) cur.classList.remove('on', 'press'); 1815 } 1816 1817 /* offsetLeft/offsetTop walk, not getBoundingClientRect: elements can be 1818 mid-transition when measured and rects would include the transform */ 1819 function offsetIn(el) { 1820 var x = 0, y = 0, n = el; 1821 while (n && n !== root) { x += n.offsetLeft; y += n.offsetTop; n = n.offsetParent; } 1822 return { x: x, y: y, w: el.offsetWidth, h: el.offsetHeight }; 1823 } 1824 function moveTo(el) { 1825 if (!cur || !el) return; 1826 var p = offsetIn(el); 1827 cur.classList.add('on'); 1828 cur.style.transform = 'translate(' + (p.x + p.w / 2 - 4) + 'px,' + 1829 (p.y + p.h / 2 - 2) + 'px)'; 1830 } 1831 function tap() { 1832 if (!cur) return; 1833 cur.classList.add('press'); 1834 at(function () { cur.classList.remove('press'); }, 190); 1835 } 1836 1837 /* The scripted pass: filter to Price Changes, then open the K7 1838 price-drop change (the same story the walkthrough in block 2 tells). 1839 Plays once, then hands the screen over. Nothing is left stuck. 1840 NOTE the two literals below must match a real data-cat and a real 1841 row id: 906's first build (cloned from 886) shipped this still 1842 reading 'news' and left an empty list; 918 and 925 each caught the 1843 same class of bug on their own clones. Checked here before landing:
1844 'price' is a data-cat above, 'k7' is a row id in DATA. */ 1845 function intro() { 1846 var priceBtn = null, dropRow = null; 1847 segBtns.forEach(function (b) { if (b.getAttribute('data-cat') === 'price') priceBtn = b; }); 1848 DATA.forEach(function (r) { if (r.id === 'k7') dropRow = r; }); 1849 at(function () { moveTo(priceBtn); }, 700); 1850 at(function () { tap(); setCat('price'); }, 1800); 1851 at(function () { 1852 var first = rows.querySelector('.tr'); 1853 if (first) moveTo(first); 1854 }, 2600); 1855 at(function () { tap(); }, 3700); 1856 at(function () { openDetail(dropRow); }, 3900); 1857 at(handover, 5200); 1858 } 1859 1860 renderSeg(); renderRows(); 1861 fillDetail(DATA[0]); 1862 1863 /* ---------- one height for every state ---------- 1864 The list and the change detail share a single grid cell, so the mock 1865 stands as tall as whichever is taller, and the detail's height depends 1866 on which row is open. Render every state once, keep the tallest, pin 1867 both panes to it, and re-measure on resize. Runs off-screen in a 1868 single frame; nothing is visible mid-probe. */ 1869 function lockHeight() { 1870 var wasCat = cat, wasRow = shown; 1871 root.style.removeProperty('--snapmin'); 1872 var tall = 0; 1873 DATA.forEach(function (r) { 1874 fillDetail(r); 1875 if (det.offsetHeight > tall) tall = det.offsetHeight; 1876 }); 1877 cat = 'all'; renderRows(); 1878 if (bodyEl.offsetHeight > tall) tall = bodyEl.offsetHeight; 1879 cat = wasCat; renderSeg(); renderRows(); 1880 fillDetail(wasRow); 1881 root.style.setProperty('--snapmin', tall + 'px'); 1882 } 1883 1884 lockHeight(); 1885 1886 var rt; 1887 window.addEventListener('resize', function () { 1888 clearTimeout(rt); 1889 rt = setTimeout(lockHeight, 160); 1890 }); 1891 1892 var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; 1893 if (reduce) { 1894 live = true; 1895 return; 1896 } 1897 if (!('IntersectionObserver' in window)) { intro(); return; } 1898 var io = new IntersectionObserver(function (entries) { 1899 entries.forEach(function (e) { 1900 if (e.isIntersecting && !live && !timers.length) { intro(); io.unobserve(e.target); } 1901 }); 1902 }, { threshold: 0.25 }); 1903 io.observe(root); 1904 } 1905 1906 if (document.readyState === 'loading') { 1907 document.addEventListener('DOMContentLoaded', init); 1908 } else { 1909 init(); 1910 } 1911})(); 1912</script>
1912 </div> 1913 <div class="elementor-element elementor-element-ctppb02 elementor-widget elementor-widget-html" data-id="ctppb02" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"> 1914 <!-- BLOCK 2 · price & promo history · SEE IT IN ACTION walkthrough · browser extension (routing strip removed on Lamija's request, 2026-08-10) --> 1915<div class="ctpp"> 1916 1917<!-- ==================== PRICE & PROMO HISTORY ==================== --> 1918<section style="background:var(--nav2)"> 1919 <div class="in"> 1920 <div class="hd"> 1921 <div class="eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/><path d="M12 7v5l4 2"/></svg>Price & promo history</div> 1922 <h2>Every product or price change tracked in a single source of truth</h2> 1923 <p>Every check stores a snapshot, changed or not. Prices, offers and codes become a record you can open to any date.</p> 1924 </div> 1925 <div class="ctpp-row"> 1926 <div class="txt"> 1927 <h3>Every price and offer, dated and kept.</h3> 1928 <p>Prove what your pages showed. When a price-match or ad-accuracy question turns on a date, open it and export.</p> 1929 <div class="ticks"> 1930 <div><span>A snapshot on every check, unchanged days included</span></div> 1931 <div><span>The rendered page and its HTML, stored together</span></div> 1932 <div><span>Timestamped and immutable, stored exactly as captured</span></div> 1933 <div><span>Full version history per page, not just the latest change</span></div> 1934 <div><span>Tag and group by retailer, brand, client or campaign</span></div> 1935 <div><span>Export any snapshot or date range as a PDF or spreadsheet report</span></div> 1936 </div> 1937 </div> 1938 <div> 1939 <!-- 01 Feb 2026 â 30 Apr 2026, one snapshot a day: 1940 28 + 31 + 30 = 89. Keep the count and the range in step. 1941 The Deals & Price Lists series starts 01 Feb 2026 (see block 1942 1), so this range is valid for the Brightloom sale page; the 1943 monitor was added when the folder was created. --> 1944 <div class="ctpp-app" role="img" aria-label="Exporting a date range of archived snapshots of a retailer's sale page as a PDF or spreadsheet report."> 1945 <div class="bar"> 1946 <span class="dots"><i></i><i></i><i></i></span> 1947 </div> 1948 <div class="pad"> 1949 <div class="h">Export snapshots</div> 1950 <div class="sub" style="margin-bottom:14px">Pick the pages and dates, then export the report</div> 1951 <div style="border:1px solid var(--aln);border-radius:10px;overflow:hidden;margin-bottom:14px"> 1952 <div style="display:flex;justify-content:space-between;gap:12px;padding:10px 13px;border-bottom:1px solid var(--aln2);font-size:12px;color:var(--atx)"><span style="color:var(--amu)">Pages</span><b style="color:#111827">brightloomhome.com/sale</b></div> 1953 <div style="display:flex;justify-content:space-between;gap:12px;padding:10px 13px;border-bottom:1px solid var(--aln2);font-size:12px;color:var(--atx)"><span style="color:var(--amu)">Date range</span><b style="color:#111827">01 Feb 2026 â 30 Apr 2026</b></div> 1954 <div style="display:flex;justify-content:space-between;gap:12px;padding:10px 13px;font-size:12px;color:var(--atx)"><span style="color:var(--amu)">Snapshots included</span><b style="color:#111827">89</b></div> 1955 </div> 1956 <div style="display:flex;gap:8px;flex-wrap:wrap"> 1957 <button type="button" class="btn-app">Export PDF</button> 1958 <button type="button" class="btn-app ghost">Export spreadsheet</button> 1959 </div> 1960 <div style="margin-top:13px;font-size:11.5px;color:var(--amu2)">One retailer's offers, quarter by quarter, ready to share.</div> 1961 </div> 1962 </div> 1963 </div> 1964 </div> 1965 </div> 1966</section> 1967 1968<style> 1969/* ---------- SEE IT IN ACTION ---------- 1970 No stepper, no progress bar, no captions. One product screen at a fixed 1971 height that plays through four states like a screen recording, and nothing 1972 else. The screens speak for themselves. Pacing is deliberately slow: read, 1973 move, hover, press, hold. See the beats in the script below. */ 1974.ctpp-flow-sec{background:linear-gradient(180deg,#091822 0%,#0A2430 45%,#0C1E2B 100%)} 1975.ctpp-flow-sec .hd{max-width:820px;margin-bottom:44px} 1976 1977.ctpp-flow{max-width:1020px;margin:0 auto} 1978 1979/* the screen. min-height, not height, so tall content still grows it; 1980 every frame stretches to the row so the window never changes size. */ 1981.ctpp-flow .fstage{position:relative;display:grid;min-height:600px} 1982.ctpp-flow .fframe{grid-area:1/1;opacity:0;visibility:hidden;pointer-events:none; 1983 transform:translateY(10px);transition:opacity .5s ease,transform .5s ease,visibility .5s} 1984.ctpp-flow .fframe.on{opacity:1;visibility:visible;pointer-events:auto;transform:none} 1985.ctpp-flow .fframe > .ctpp-app{height:100%;display:flex;flex-direction:column} 1986.ctpp-flow .fframe > .ctpp-app > .pad{flex:1 1 auto;display:flex;flex-direction:column} 1987/* the footnote sits on the bottom edge of the window like a status line, 1988 so a short screen fills its height instead of trailing off into white */ 1989.ctpp-flow .fframe .ffoot{margin-top:auto;padding-top:16px} 1990 1991.ctpp-flow .frow{display:flex;align-items:flex-start;justify-content:space-between;gap:14px; 1992 flex-wrap:wrap;margin-bottom:14px} 1993.ctpp-flow .frow .h{font-size:14px;font-weight:700;color:#111827} 1994.ctpp-flow .frow .sub{font-size:11.5px;color:var(--amu);margin-top:3px} 1995.ctpp-flow .ffoot{margin-top:14px;font-size:11.5px;line-height:1.6;color:var(--amu2)} 1996 1997.ctpp-flow .fmsg{display:flex;gap:12px;border:1px solid var(--aln);border-radius:11px;padding:14px 15px} 1998.ctpp-flow .fav{width:38px;height:38px;border-radius:9px;flex:0 0 auto;display:flex; 1999 align-items:center;justify-content:center;font-size:12px;font-weight:800;color:#0C1E2B; 2000 background:linear-gradient(135deg,#88FFCC,#3B82F6)} 2001.ctpp-flow .fname{font-size:12.5px;font-weight:700;color:#111827} 2002.ctpp-flow .fname s{text-decoration:none;font-size:9.5px;font-weight:700;letter-spacing:.06em; 2003 background:#EEF1F4;color:var(--amu);border-radius:4px;padding:2px 5px;margin-left:4px; 2004 vertical-align:1px} 2005.ctpp-flow .fname span{font-weight:400;color:var(--amu);font-size:11px;margin-left:4px}
2006.ctpp-flow .ftitle{font-size:13px;font-weight:600;color:#111827;margin-top:7px} 2007.ctpp-flow .fbody{font-size:12.5px;line-height:1.55;color:var(--atx);margin-top:5px} 2008.ctpp-flow .fbody b{color:#111827;font-weight:600} 2009.ctpp-flow .fchips{display:flex;gap:7px;flex-wrap:wrap;margin-top:10px} 2010.ctpp-flow .fmsg{margin-bottom:10px} 2011.ctpp-flow .fmsg.dim{opacity:.5} 2012.ctpp-flow .fmsg.new{border-color:#D6EBE4;box-shadow:inset 3px 0 0 var(--ap)} 2013.ctpp-flow .fav.alt{background:linear-gradient(135deg,#C4B5FD,#818CF8)} 2014.ctpp-flow .fchan{display:flex;align-items:center;justify-content:space-between;gap:12px; 2015 padding-bottom:12px;margin-bottom:14px;border-bottom:1px solid var(--aln2); 2016 font-size:12.5px;font-weight:700;color:#111827} 2017.ctpp-flow .fchan span{font-weight:400;font-size:11px;color:var(--amu)} 2018.ctpp-flow .fmeta{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px; 2019 background:var(--aln2);border:1px solid var(--aln);border-radius:10px;overflow:hidden; 2020 margin-bottom:14px} 2021.ctpp-flow .fmeta > div{background:#fff;padding:10px 13px;min-width:0} 2022.ctpp-flow .fmeta span{display:block;font-size:9.5px;font-weight:700;letter-spacing:.08em; 2023 text-transform:uppercase;color:var(--amu);margin-bottom:4px} 2024.ctpp-flow .fmeta b{display:block;font-size:11.5px;color:#111827;font-weight:600; 2025 overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 2026.ctpp-flow .fpages{border:1px solid var(--aln);border-radius:10px;overflow:hidden;margin-bottom:14px} 2027.ctpp-flow .fpages .pg{display:flex;align-items:center;justify-content:space-between;gap:12px; 2028 padding:9px 13px;border-bottom:1px solid var(--aln2);font-size:11.5px;color:var(--atx2)} 2029.ctpp-flow .fpages .pg:last-child{border-bottom:none} 2030.ctpp-flow .fpages .pg u{text-decoration:none;font-family:var(--mono);font-size:10.5px; 2031 overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 2032.ctpp-flow .fpages .pg em{font-style:normal;color:var(--amu);flex:0 0 auto} 2033@media(max-width:700px){ 2034 /* three cells in two columns leaves a dead half-cell on the second row, 2035 which reads as a rendering fault rather than as a layout. The last one 2036 takes the full width instead. */ 2037 .ctpp-flow .fmeta{grid-template-columns:repeat(2,minmax(0,1fr))} 2038 .ctpp-flow .fmeta > div:last-child{grid-column:1 / -1} 2039} 2040 2041.ctpp-flow .fai{background:linear-gradient(180deg,var(--apbg),#fff);border:1px solid #D6EBE4; 2042 border-radius:10px;padding:13px 14px;margin-bottom:14px} 2043.ctpp-flow .fai .lbl{display:flex;align-items:center;gap:7px;font-size:10.5px;font-weight:700; 2044 letter-spacing:.07em;text-transform:uppercase;color:var(--ap);margin-bottom:8px} 2045.ctpp-flow .fai .lbl s{width:18px;height:18px;border-radius:5px;background:var(--ap);color:#fff; 2046 display:flex;align-items:center;justify-content:center;font-size:8.5px;font-weight:800; 2047 text-decoration:none} 2048.ctpp-flow .fai p{font-size:12.5px;line-height:1.55;color:var(--atx)} 2049.ctpp-flow .fai p b{color:#111827;font-weight:600} 2050.ctpp-flow .fdiff{border:1px solid var(--aln);border-radius:10px;overflow:hidden} 2051.ctpp-flow .fdiff .dh{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:700; 2052 color:var(--amu);padding:9px 13px;border-bottom:1px solid var(--aln2);background:#FAFBFC} 2053.ctpp-flow .fdiff .dl{font-size:12px;line-height:1.55;padding:10px 13px} 2054.ctpp-flow .fdiff .del{background:#FEF2F2;color:#B42318;border-left:2px solid #F04438; 2055 text-decoration:line-through} 2056.ctpp-flow .fdiff .add{background:#ECFDF3;color:#067647;border-left:2px solid #17B26A} 2057 2058.ctpp-flow .fhist{border:1px solid var(--aln);border-radius:10px;overflow:hidden} 2059.ctpp-flow .hr{display:grid;grid-template-columns:120px minmax(0,1fr) auto;gap:14px; 2060 align-items:center;padding:11px 14px;border-bottom:1px solid var(--aln2);font-size:12px} 2061.ctpp-flow .hr:last-child{border-bottom:none} 2062.ctpp-flow .hd2{font-family:var(--mono);font-size:11px;color:#111827;font-weight:600} 2063.ctpp-flow .hw{color:var(--atx2)} 2064 2065.ctpp-flow .fpack{border:1px solid var(--aln);border-radius:10px;overflow:hidden;margin-bottom:14px} 2066.ctpp-flow .pr{display:flex;justify-content:space-between;gap:12px;padding:10px 13px; 2067 border-bottom:1px solid var(--aln2);font-size:12px;color:var(--atx)} 2068.ctpp-flow .pr:last-child{border-bottom:none} 2069.ctpp-flow .pr span{color:var(--amu)} 2070.ctpp-flow .pr b{color:#111827} 2071.ctpp-flow .facts{display:flex;gap:8px;flex-wrap:wrap} 2072 2073/* pointer, click pulse, end-state toast */
2074.ctpp-flow .fcta{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px} 2075/* frame 02 runs two columns: the content changes, and the page screenshot 2076 ChangeTower stored on that check. The .shot primitives are shared with the 2077 hero mock and live in the main stylesheet, scoped .ctpp not .ctpp-snap. 2078 Nothing is ever drawn on the capture. */ 2079.ctpp-flow .fpanes{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:start} 2080/* Below 780 the two columns stack, so frame 02 gets much taller than the 2081 rest. Every frame shares one grid cell, so the stage would stand at that 2082 height and leave the other three with a hole in the middle. Below the 2083 breakpoint only, frames take their natural height and the script sets the 2084 stage to whichever one is showing. Desktop keeps the fixed 600px screen. */ 2085@media(max-width:780px){ 2086 .ctpp-flow .fpanes{grid-template-columns:1fr} 2087 .ctpp-flow .fstage{min-height:0;align-items:start;transition:height .4s ease} 2088 .ctpp-flow .fframe > .ctpp-app{height:auto} 2089} 2090.ctpp-flow .fhint{font-size:11.5px;color:var(--amu2)} 2091.ctpp-flow [data-cta]{transition:box-shadow .25s ease,transform .15s ease} 2092.ctpp-flow [data-cta].hot{box-shadow:0 0 0 4px rgba(22,116,95,.16)} 2093.ctpp-flow [data-cta].tap{transform:scale(.955)} 2094.ctpp-flow .cur{position:absolute;left:0;top:0;width:22px;height:22px;z-index:6; 2095 pointer-events:none;opacity:0;transform:translate(-48px,-48px); 2096 transition:opacity .4s ease,transform 1.1s cubic-bezier(.33,.9,.35,1)} 2097.ctpp-flow .cur.on{opacity:1} 2098.ctpp-flow .cur svg{width:22px;height:22px;display:block; 2099 filter:drop-shadow(0 2px 5px rgba(0,0,0,.4));transition:transform .14s ease} 2100.ctpp-flow .cur.press svg{transform:scale(.78)} 2101.ctpp-flow .cur .ring{position:absolute;left:-10px;top:-10px;width:42px;height:42px; 2102 border-radius:50%;border:2px solid #88FFCC;opacity:0;display:block} 2103.ctpp-flow .cur.press .ring{animation:ctppRing .6s ease-out} 2104@keyframes ctppRing{0%{opacity:.9;transform:scale(.3)}100%{opacity:0;transform:scale(1)}} 2105.ctpp-flow .ftoast{position:absolute;right:18px;bottom:18px;z-index:5;display:flex; 2106 align-items:center;gap:9px;background:#111827;color:#fff;border-radius:9px; 2107 padding:10px 14px;font-size:11.5px;box-shadow:0 10px 26px rgba(0,0,0,.35); 2108 opacity:0;transform:translateY(8px);transition:opacity .35s ease,transform .35s ease} 2109.ctpp-flow .ftoast.on{opacity:1;transform:none} 2110.ctpp-flow .freplay-wrap{display:flex;justify-content:center;margin-top:28px} 2111.ctpp-flow .freplay{display:inline-flex;align-items:center;gap:8px;cursor:pointer; 2112 background:transparent;border:1px solid var(--rule2);color:var(--mut2); 2113 border-radius:100px;padding:8px 18px;font-size:.82rem;font-weight:600; 2114 font-family:Inter,sans-serif;transition:border-color .2s,color .2s} 2115.ctpp-flow .freplay:hover{border-color:rgba(136,255,204,.35);color:var(--mint)} 2116 2117@media(max-width:900px){ 2118 .ctpp-flow .fstage{min-height:520px} 2119 .ctpp-flow .hr{grid-template-columns:1fr auto;gap:8px} 2120 .ctpp-flow .hw{grid-column:1/-1;order:3;font-size:11.5px} 2121} 2122@media(max-width:560px){ 2123 .ctpp-flow .fstage{min-height:0} 2124} 2125@media(prefers-reduced-motion:reduce){ 2126 .ctpp-flow .fframe{transition:none} 2127 .ctpp-flow .cur{display:none} 2128} 2129</style> 2130 2131<!-- ==================== SEE IT IN ACTION ==================== 2132 One product screen at a fixed height, playing through four states like a 2133 screen recording. A pointer glides onto the button in each state, presses 2134 it, and that press is what advances the screen: 2135 01 Slack alert > "View change" -> the change detail 2136 02 change detail > "View page history" -> the page's history 2137 03 page history > "Export snapshots" -> the export screen 2138 04 export > "Export spreadsheet" -> done, toast, hold 2139 2140 THE STORY is the K7 price drop, the same change the hero mock's 2141 scripted intro opens: a price-drop story on purpose, because catching 2142 the price below your number while the deal is still live is the core 2143 job of the price & product monitoring use case. The rule that matched 2144 ("below $200, or out of stock") is the AI-monitoring criteria 2145 capability this page highlights. 2146 2147 TERMINOLOGY: there is no product noun for the export. The capability is 2148 exporting snapshots, or a date range of them, as a PDF or spreadsheet 2149 report. Do not invent a name for it on these screens. 2150 2151 NO STEPPER, NO PROGRESS BAR, NO CAPTIONS. Same decision as page 802. 2152 Plays through ONCE when it scrolls into view, then HOLDS on the last 2153 screen. It never loops. The in-frame buttons stay clickable and take 2154 over from the auto-play; "Replay walkthrough" restarts it. 2155 2156 THE SCRIPT LIVES BELOW THIS SECTION, NOT ABOVE IT. An inline script 2157 runs at parse time and matches nothing above its own markup. Do not 2158 move it up. 2159 2160 ARITHMETIC â shared with the hero mock in block 1: the K7 monitor 2161 checks hourly on the hour, first snapshot 01 May 2026 00:00, latest 2162 14 Jul 2026 09:00 = 744+720+312+10 = 1786 snapshots (so the 09:00 2163 check is #1786). The export screen's fourth page was added later 2164 (01 Jun 2026 00:00 = 720+312+10 = 1042), hence: 2165 1786 + 1786 + 1786 + 1042 = 6400. 2166 All of these move together or none of them do. 2167 2168 Frame 02 pairs the CONTENT changes with the page screenshot stored on 2169 that check. The capture is shown as captured and is never marked up: 2170 no boxes, no highlighted pixels, no two captures side by side. --> 2171<section class="ctpp-flow-sec"> 2172 <div class="in"> 2173 <div class="hd"> 2174 <div class="eyebrow">
2174<svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M10 8l6 4-6 4z"/></svg>See it in action</div> 2175 <h2>From the price drop alert to checkout before the deal ends.</h2> 2176 <p>Explore how ChangeTower improves price and stock tracking.</p> 2177 </div> 2178 2179 <div class="ctpp-flow" data-ctpp-flow> 2180 <div class="fstage"> 2181 2182 <div class="fframe on" data-f="0"> 2183 <div class="ctpp-app"> 2184 <div class="bar"> 2185 <span class="dots"><i></i><i></i><i></i></span> 2186 <span class="url">Slack · #price-watch</span> 2187 <span class="who">09:04</span> 2188 </div> 2189 <div class="pad"> 2190 <div class="fchan"><span>#</span>price-watch<span>4 members · Deals, Buying, Store Ops</span></div> 2191 <div class="fmsg dim"> 2192 <span class="fav alt">DM</span> 2193 <div style="min-width:0"> 2194 <div class="fname">Dana Moreno <span>21:18</span></div> 2195 <p class="fbody">Anyone seen the K7s under $200 yet? The gift budget says $200, and the last sale sold out in a morning.</p> 2196 </div> 2197 </div> 2198 <div class="fmsg dim"> 2199 <span class="fav">CT</span> 2200 <div style="min-width:0"> 2201 <div class="fname">ChangeTower <s>APP</s> <span>06:05</span></div> 2202 <div class="ftitle">Daily summary: 24 price & product pages</div> 2203 <p class="fbody">Every monitored page captured on schedule. 2 changes since yesterday, both archived.</p> 2204 </div> 2205 </div> 2206 <div class="fmsg new"> 2207 <span class="fav">CT</span> 2208 <div style="min-width:0"> 2209 <div class="fname">ChangeTower <s>APP</s> <span>09:04</span></div> 2210 <div class="ftitle">Change detected: kestrelaudio.com/products/k7-wireless</div> 2211 <p class="fbody"><b>AI summary:</b> Price dropped from $249.00 to $199.00, below your $200 threshold. The listing shows in stock.</p> 2212 <div class="fchips"> 2213 <span class="ctpp-chip warn">Material change</span> 2214 <span class="ctpp-chip ok">Matched your rule</span> 2215 </div> 2216 <button type="button" class="btn-app" data-cta style="margin-top:12px">View change</button> 2217 </div> 2218 </div> 2219 <p class="ffoot">Routed to the channel you already watch. Email, Teams and webhooks carry the same alert.</p> 2220 </div> 2221 </div> 2222 </div> 2223 2224 <div class="fframe" data-f="1"> 2225 <div class="ctpp-app"> 2226 <div class="bar"> 2227 <span class="dots"><i></i><i></i><i></i></span> 2228 <span class="who">14 Jul 2026</span> 2229 </div> 2230 <div class="pad"> 2231 <div class="frow"> 2232 <div> 2233 <div class="h">kestrelaudio.com/products/k7-wireless · Price drop</div> 2234 <div class="sub">Detected on the 09:00 check · snapshot #1786 stored</div> 2235 </div> 2236 <span class="ctpp-chip warn">Material change</span> 2237 </div> 2238 <div class="fmeta"> 2239 <div><span>Monitor</span><b>Wishlist & Restocks · Kestrel K7</b></div> 2240 <div><span>Detected</span><b>14 Jul 2026, 09:00</b></div> 2241 <div><span>Snapshot</span><b>#1786</b></div> 2242 </div> 2243 <div class="fpanes"> 2244 <div> 2245 <div class="fai"> 2246 <div class="lbl"><s>AI</s>Plain-language summary</div> 2247 <p>The <b>K7 Wireless Headphones</b> dropped from $249.00 to <b>$199.00</b>, a $50 cut that puts the price below your $200 alert threshold. The listing shows in stock, and no coupon code is required.</p> 2248 </div> 2249 <div class="fdiff"> 2250 <div class="dh">Price change</div> 2251 <div class="dl del">Price: $249.00.</div> 2252 <div class="dl add">Price: $199.00. Save $50 for a limited time.</div> 2253 </div> 2254 <div class="fdiff" style="margin-top:12px"> 2255 <div class="dh">Your rule</div>
2256 <!-- a plain .dl (no .del/.add) would inherit the dark 2257 theme's near-white text and vanish on the white 2258 mock; pin the app text colour --> 2259 <div class="dl" style="color:var(--atx)">Alert me if the price drops below $200, or the item goes out of stock.</div> 2260 </div> 2261 </div> 2262 <div> 2263 <div class="plbl cam"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>Screenshot of the page · 14 Jul 2026</div> 2264 <div class="shot" style="--yb:#EA580C;--yb2:#7C2D12;--ybt:#FDF0E7;--ybl:#EA580C"> 2265 <div class="scap"><span class="sc"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg><span class="su">kestrelaudio.com/products/k7-wireless</span></span><span class="sd">1440 × 2040 · <b>PNG</b></span></div> 2266 <div class="spage"> 2267 <div class="snav"><span class="swm">KESTREL AUDIO</span><i class="on">Headphones</i><i>Speakers</i><i>Support</i><span class="slog">Cart</span></div> 2268 <div class="sh1">K7 Wireless Headphones</div> 2269 <div class="smeta">In stock · Updated <b>14 July 2026</b></div> 2270 <p class="sp"><b>$199.00.</b> Was $249.00. Save $50 for a limited time.</p> 2271 <div class="ssec">Product details</div> 2272 <p class="sp">Adaptive noise cancellation, 40-hour battery and multipoint pairing.</p> 2273 <p class="sp">Ships in 1 to 2 business days from the Portland warehouse.</p> 2274 <div class="slink">Add to cart</div> 2275 <div class="sfoot2">Kestrel Audio</div> 2276 </div> 2277 </div> 2278 <p class="sfoot">The screenshot stored on that check: the page as a visitor saw it, kept with its HTML.</p> 2279 </div> 2280 </div> 2281 <div class="fcta"> 2282 <button type="button" class="btn-app ghost" data-cta>View page history</button> 2283 <span class="fhint">1,786 snapshots stored for this page</span> 2284 </div> 2285 </div> 2286 </div> 2287 </div> 2288 2289 <div class="fframe" data-f="2"> 2290 <div class="ctpp-app"> 2291 <div class="bar"> 2292 <span class="dots"><i></i><i></i><i></i></span> 2293 <span class="who">1,786 snapshots</span> 2294 </div> 2295 <div class="pad"> 2296 <div class="frow"> 2297 <div> 2298 <div class="h">kestrelaudio.com/products/k7-wireless</div> 2299 <!-- 1,786 hourly snapshots counted back from 14 Jul 2026 2300 09:00 lands on 01 May 2026 00:00. The hero mock in 2301 block 1 uses the same series, so these two dates and 2302 the 1,786 have to move together. --> 2303 <div class="sub">Every scheduled check since 01 May 2026, hourly</div> 2304 </div> 2305 <span class="ctpp-chip ok">Complete history</span> 2306 </div> 2307 <!-- the history itself shows the breadth of what a product 2308 page goes through: price moves both ways, stock flips, 2309 description edits (all invented placeholders) --> 2310 <div class="fhist"> 2311 <div class="hr"><span class="hd2">14 Jul 2026</span><span class="hw">Price drop: $249.00 → $199.00</span><span class="ctpp-chip warn">Material</span></div> 2312 <div class="hr"><span class="hd2">28 Jun 2026</span><span class="hw">Back in stock after 9 days</span><span class="ctpp-chip warn">Material</span></div> 2313 <div class="hr"><span class="hd2">19 Jun 2026</span><span class="hw">Out of stock</span><span class="ctpp-chip warn">
2313Material</span></div> 2314 <div class="hr"><span class="hd2">02 Jun 2026</span><span class="hw">Price increase: $239.00 → $249.00</span><span class="ctpp-chip mute">Minor</span></div> 2315 <div class="hr"><span class="hd2">12 May 2026</span><span class="hw">Product description updated</span><span class="ctpp-chip mute">Minor</span></div> 2316 <div class="hr"><span class="hd2">01 May 2026</span><span class="hw">First snapshot stored</span><span class="ctpp-chip mute">Baseline</span></div> 2317 </div> 2318 <div class="fcta"> 2319 <button type="button" class="btn-app" data-cta>Export snapshots</button> 2320 <span class="fhint">Pick the pages and the dates</span> 2321 </div> 2322 <p class="ffoot">Every hour in between has a snapshot too, changed or not. So you can answer what the price was at any moment.</p> 2323 </div> 2324 </div> 2325 </div> 2326 2327 <div class="fframe" data-f="3"> 2328 <div class="ctpp-app"> 2329 <div class="bar"> 2330 <span class="dots"><i></i><i></i><i></i></span> 2331 <span class="who">Export</span> 2332 </div> 2333 <div class="pad"> 2334 <div class="frow"> 2335 <div> 2336 <div class="h">Export snapshots</div> 2337 <div class="sub">Everything captured for the pages and dates you selected</div> 2338 </div> 2339 <span class="ctpp-chip ok">Ready</span> 2340 </div> 2341 <!-- 1786 + 1786 + 1786 + 1042 = 6400. The fourth page was 2342 added later (01 Jun), hence its shorter series. --> 2343 <div class="fpack"> 2344 <div class="pr"><span>Pages</span><b>4 selected</b></div> 2345 <div class="pr"><span>Date range</span><b>01 May 2026 – 14 Jul 2026</b></div> 2346 <div class="pr"><span>Snapshots included</span><b>6,400</b></div> 2347 </div> 2348 <div class="fpages"> 2349 <div class="pg"><u>kestrelaudio.com/products/k7-wireless</u><em>1,786 snapshots</em></div> 2350 <div class="pg"><u>alderbrookoutdoor.com/products/ridgepole-2-tent</u><em>1,786 snapshots</em></div> 2351 <div class="pg"><u>lumenplay.com/consoles/solstice-bundle</u><em>1,786 snapshots</em></div> 2352 <div class="pg"><u>kestrelaudio.com/products/k7-travel-case</u><em>1,042 snapshots</em></div> 2353 </div> 2354 <div class="facts"> 2355 <button type="button" class="btn-app" data-cta>Export spreadsheet</button> 2356 <button type="button" class="btn-app ghost">Export PDF</button> 2357 </div> 2358 <p class="ffoot">Every price and stock move this quarter, dated and page by page. Sellers archive their own offers the same way.</p> 2359 </div> 2360 </div> 2361 </div> 2362 2363 <div class="cur" aria-hidden="true"><i class="ring"></i><svg viewBox="0 0 24 24"><path d="M5 2.5l13.5 8.6-6.2 1.4L14 19.5z" fill="#1F2937" stroke="#fff" stroke-width="1.4" stroke-linejoin="round"/></svg></div> 2364 <div class="ftoast" aria-hidden="true"><span style="color:#88FFCC;font-weight:700">✓</span><span>wishlist-snapshots-2026-07-14.xlsx is ready to share</span></div> 2365 </div> 2366 2367 <div class="freplay-wrap"> 2368 <button type="button" class="freplay">↻ Replay walkthrough</button> 2369 </div> 2370 </div> 2371 </div> 2372</section>
2373<script> 2374(function () { 2375 'use strict'; 2376 2377 /* The markup this drives sits ABOVE in the document. Run after the DOM is 2378 parsed, never inline-at-parse-time: page 802's first version executed 2379 above its own markup, matched nothing, and froze on step 01 with dead 2380 buttons. */ 2381 function init() { 2382 var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; 2383 2384 document.querySelectorAll('[data-ctpp-flow]').forEach(function (root) { 2385 var frames = root.querySelectorAll('.fframe'); 2386 var stage = root.querySelector('.fstage'); 2387 var cur = root.querySelector('.cur'); 2388 var toast = root.querySelector('.ftoast'); 2389 var replay = root.querySelector('.freplay'); 2390 2391 /* The beats of one step, in order. Slow on purpose: this reads as a 2392 walkthrough, not a carousel. Roughly 3.6s a screen, ~14s in total. 2393 SETTLE the frame has faded in; you get a moment to read it 2394 MOVE the pointer glides onto the button 2395 HOVER it rests there before pressing 2396 AFTER the pressed state holds so the click registers as a click */ 2397 var SETTLE = 1200, MOVE = 1100, HOVER = 500, AFTER = 800; 2398 var STEP = SETTLE + MOVE + HOVER + AFTER; 2399 var timers = [], played = false; 2400 2401 function clearTimers() { timers.forEach(clearTimeout); timers = []; } 2402 function at(fn, ms) { timers.push(setTimeout(fn, ms)); } 2403 2404 /* offsetLeft/offsetTop walk, not getBoundingClientRect: the frame is 2405 mid-transition when we measure and rects would include its transform */ 2406 function offsetIn(el, anc) { 2407 var x = 0, y = 0, n = el; 2408 while (n && n !== anc) { x += n.offsetLeft; y += n.offsetTop; n = n.offsetParent; } 2409 return { x: x, y: y, w: el.offsetWidth, h: el.offsetHeight }; 2410 } 2411 2412 function show(i) { 2413 frames.forEach(function (f, n) { f.classList.toggle('on', n === i); }); 2414 root.querySelectorAll('[data-cta]').forEach(function (b) { b.classList.remove('hot', 'tap'); }); 2415 if (toast) toast.classList.remove('on'); 2416 fit(); 2417 } 2418 2419 /* see the note on the 780px breakpoint in the stylesheet above */ 2420 var narrow = window.matchMedia ? window.matchMedia('(max-width: 780px)') : null; 2421 function fit() { 2422 if (!stage) return; 2423 if (!narrow || !narrow.matches) { stage.style.height = ''; return; } 2424 var f = root.querySelector('.fframe.on'); 2425 if (f && f.firstElementChild) stage.style.height = f.firstElementChild.offsetHeight + 'px'; 2426 } 2427 window.addEventListener('resize', fit); 2428 window.addEventListener('load', fit); 2429 2430 function park() { 2431 clearTimers(); 2432 if (cur) cur.classList.remove('on', 'press'); 2433 } 2434 2435 function play(i) { 2436 show(i); 2437 var cta = frames[i].querySelector('[data-cta]'); 2438 var last = i === frames.length - 1; 2439 2440 if (!cur || !cta) { 2441 at(function () { last ? finish() : play(i + 1); }, STEP); 2442 return; 2443 } 2444 2445 var p = offsetIn(cta, stage); 2446 at(function () { 2447 cur.classList.add('on'); 2448 cur.style.transform = 'translate(' + (p.x + p.w / 2 - 5) + 'px,' + (p.y + p.h / 2 - 3) + 'px)'; 2449 cta.classList.add('hot'); 2450 }, SETTLE); 2451 at(function () { cur.classList.add('press'); cta.classList.add('tap'); }, SETTLE + MOVE + HOVER); 2452 at(function () { cur.classList.remove('press'); cta.classList.remove('tap'); }, SETTLE + MOVE + HOVER + 190); 2453 at(function () { last ? finish() : play(i + 1); }, STEP); 2454 } 2455 2456 function finish() { 2457 played = true; 2458 if (toast) toast.classList.add('on'); /* pointer stays on the export button */ 2459 } 2460 2461 function start() { played = false; clearTimers(); play(0); } 2462 2463 /* the in-frame buttons ARE the walkthrough's path: pressing one yourself 2464 advances exactly the way the pointer does, and takes over from there */ 2465 frames.forEach(function (f, n) { 2466 var cta = f.querySelector('[data-cta]'); 2467 if (!cta || n === frames.length - 1) return; 2468 cta.addEventListener('click', function () { park(); played = true; show(n + 1); }); 2469 }); 2470 2471 if (replay) replay.addEventListener('click', function () { park(); start(); }); 2472 2473 show(0); 2474 2475 if (reduce) return; /* no auto-play; buttons still work */ 2476 if (!('IntersectionObserver' in window)) { start(); return; } 2477 2478 var io = new IntersectionObserver(function (entries) {
2479 entries.forEach(function (e) { 2480 if (e.isIntersecting && !played && !timers.length) { start(); io.unobserve(e.target); } 2481 }); 2482 }, { threshold: 0.3 }); 2483 io.observe(root); 2484 }); 2485 } 2486 2487 if (document.readyState === 'loading') { 2488 document.addEventListener('DOMContentLoaded', init); 2489 } else { 2490 init(); 2491 } 2492})(); 2493</script>
2493 2494 2495<style> 2496/* ---------- MOCK â browser extension ---------- 2497 Styles live in this widget next to the section they serve, same pattern 2498 as the walkthrough styles above. Entrance animation only (the page rises, 2499 the extension icon pulses a soft ring, the popup pops in, its fields 2500 stagger), then hold. The ring and caret loop deliberately, matching the 2501 live /features/website-monitoring-browser-extension/ page's own demo. ctppRise comes from the main 2502 stylesheet. 2503 2504 NO URL BAR in the browser chrome (house mock rule): the bar keeps its 2505 traffic lights plus the extension icon, and the page identifies itself 2506 through its own content and the popup's Page field. */ 2507.ctpp-ext{position:relative} 2508.ctpp-ext .extb{margin-left:auto;width:26px;height:26px;border-radius:7px;background:var(--apt); 2509 display:flex;align-items:center;justify-content:center;position:relative;flex:0 0 auto} 2510.ctpp-ext .extb svg{width:15px;height:15px;stroke:var(--ap);fill:none;stroke-width:2} 2511.ctpp-ext .extb::after{content:"";position:absolute;inset:-4px;border-radius:10px; 2512 border:2px solid var(--ap);opacity:0;animation:ctppExtRing 1.8s ease-out .6s infinite} 2513@keyframes ctppExtRing{0%{opacity:.5;transform:scale(.85)}70%{opacity:0;transform:scale(1.25)}100%{opacity:0}} 2514/* the card clips overflow, so the page area must stand at least as tall as 2515 the popup (top 44px + ~300px) or the popup's lower fields get cut off */ 2516.ctpp-ext .epage{padding:16px 18px 18px;min-height:400px; 2517 opacity:0;animation:ctppRise .45s ease .15s forwards} 2518.ctpp-ext .epage .spage{padding:0} 2519.ctpp-ext .epage .snav{margin:0 -18px 12px;border-radius:0} 2520.ctpp-ext .epage .sfoot2{margin:10px -18px -18px} 2521.ctpp-ext .epop{position:absolute;top:44px;right:12px;z-index:3; 2522 width:min(272px,calc(100% - 24px));background:#fff;border:1px solid var(--aln); 2523 border-radius:12px;box-shadow:0 18px 44px rgba(16,24,40,.28);padding:13px 14px; 2524 opacity:0;transform:translateY(-8px) scale(.97); 2525 animation:ctppExtPop .4s cubic-bezier(.3,.9,.35,1.1) .9s forwards} 2526@keyframes ctppExtPop{to{opacity:1;transform:none}} 2527.ctpp-ext .eph{display:flex;align-items:center;gap:8px;padding-bottom:10px;margin-bottom:11px; 2528 border-bottom:1px solid var(--aln2)} 2529.ctpp-ext .emark{width:18px;height:18px;border-radius:5px;background:var(--ap);position:relative;flex:0 0 auto} 2530.ctpp-ext .emark::after{content:"";position:absolute;inset:4.5px;border-radius:50%;border:2px solid #88FFCC} 2531.ctpp-ext .eph b{font-size:12px;font-weight:700;color:#111827} 2532.ctpp-ext .eph .ex{margin-left:auto;color:var(--amu2);font-size:12px;line-height:1} 2533.ctpp-ext .ettl{font-size:13px;font-weight:700;color:#111827;margin-bottom:10px} 2534.ctpp-ext .efld{border:1px solid var(--aln);border-radius:8px;padding:7px 10px;margin-bottom:8px; 2535 opacity:0;animation:ctppRise .35s ease forwards} 2536.ctpp-ext .efld:nth-of-type(1){animation-delay:1.25s} 2537.ctpp-ext .efld:nth-of-type(2){animation-delay:1.4s} 2538.ctpp-ext .efld:nth-of-type(3){animation-delay:1.55s} 2539.ctpp-ext .efld b{display:block;font-size:8.5px;font-weight:700;letter-spacing:.08em; 2540 text-transform:uppercase;color:var(--amu);margin-bottom:2px} 2541.ctpp-ext .efld span{display:block;font-size:11px;color:#111827;font-weight:500;line-height:1.4; 2542 overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 2543.ctpp-ext .efld .mono2{font-family:var(--mono);font-size:10.5px} 2544.ctpp-ext .ecaret{display:inline-block;width:1.5px;height:11px;background:var(--ap); 2545 margin-left:2px;vertical-align:-2px;animation:ctppCaret 1s step-end infinite} 2546.ctpp-ext .epop .btn-app{width:100%;justify-content:center;opacity:0;animation:ctppRise .35s ease 1.7s forwards} 2547.ctpp-ext .enote{display:flex;gap:7px;margin-top:10px;font-size:10.5px;line-height:1.5; 2548 color:var(--amu2);opacity:0;animation:ctppRise .35s ease 1.85s forwards} 2549.ctpp-ext .enote s{text-decoration:none;color:var(--ap);font-weight:800;flex:0 0 auto} 2550@media(max-width:600px){ 2551 .ctpp-ext .epop{position:static;width:auto;margin:12px 12px 14px;transform:none} 2552} 2553@media(prefers-reduced-motion:reduce){ 2554 .ctpp-ext .epage,.ctpp-ext .epop,.ctpp-ext .efld,.ctpp-ext .epop .btn-app,.ctpp-ext .enote{ 2555 opacity:1!important;transform:none!important} 2556} 2557</style> 2558
2559<!-- ==================== BROWSER EXTENSION ==================== 2560 Browser extension section carried over from 918/906/886/925: monitors 2561 can be created from anywhere on the internet. Stumble on the perfect 2562 product at the wrong price, click the extension, set up monitoring. 2563 2564 ACCURACY â claims mirror the live /features/website-monitoring-browser-extension/ page (WP 636): 2565 one click from any tab, the page you're on filled in for you, 2566 plain-language criteria, saved and live before you close the tab, 2567 cadence/scope/routing tuned afterwards in the dashboard. The extension 2568 is a Chrome extension. Don't invent flows 636 doesn't claim (e.g. 2569 picking a folder inside the popup). 2570 2571 CONSISTENCY â the example page is a fictional Meridian Cycles product 2572 page. The retailer, the bike, the price and the availability are 2573 INVENTED placeholders (fictional-brand stance, like Kestrel Audio and 2574 Alderbrook Outdoor). It is a page being DISCOVERED, so it is 2575 deliberately not one of the 24 monitored pages the other mocks count. 2576 2577 Background is --nav2 since the routing strip's removal (2026-08-10): 2578 with the nav2 strip gone this section would otherwise sit flush 2579 against block 3's --nav coverage section in the same colour. --> 2580<section style="background:var(--nav2)"> 2581 <div class="in"> 2582 <div class="hd"> 2583 <div class="eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 7h3a2 2 0 1 1 4 0h3v3a2 2 0 1 1 0 4v3h-3a2 2 0 1 0-4 0H4v-3a2 2 0 1 0 0-4V7z"/></svg>Browser extension</div> 2584 <h2>Fire new monitors directly from a product or pricing page</h2> 2585 <p> The ChangeTower browser extension converts any product page into a monitor.</p> 2586 </div> 2587 <div class="ctpp-row flip"> 2588 <div class="txt"> 2589 <h3>From open tab to watched page, in one click.</h3> 2590 <p>Found the bike and want to know when it drops? Click the icon, say what to watch for, and it is monitored.</p> 2591 <div class="ticks"> 2592 <div><span>One click from any tab: the page you're on is filled in</span></div> 2593 <div><span>Describe what to catch: "the price drops below $1,200, or it's back in stock"</span></div> 2594 <div><span>The monitor is live in your account before you close the tab</span></div> 2595 <div><span>Tune the cadence, scope and alert routing from the dashboard</span></div> 2596 <div><span>Every extension monitor gets the full platform: AI summaries, alerts, the archive</span></div> 2597 </div> 2598 <div style="display:flex;gap:14px;flex-wrap:wrap;margin-top:28px"> 2599 <a href="/features/website-monitoring-browser-extension/" class="btn btn-p">Explore the Browser Extension</a> 2600 </div> 2601 </div> 2602 <div> 2603 <div class="ctpp-app ctpp-ext" role="img" aria-label="The ChangeTower browser extension open over a bike retailer's product page. The popup shows the page filled in, a plain-language watch instruction, the check schedule, and a create-monitor button."> 2604 <div class="bar"> 2605 <span class="dots"><i></i><i></i><i></i></span> 2606 <span class="extb" aria-hidden="true"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="3" fill="#16745F" stroke="none"/></svg></span> 2607 </div> 2608 <div class="epage"> 2609 <div class="spage" style="--yb:#0F766E;--yb2:#134E4A;--ybt:#E8F5F3;--ybl:#0F766E"> 2610 <div class="snav"><span class="swm">MERIDIAN CYCLES</span><i class="on">Bikes</i><i>Gear</i><i>Service</i><span class="slog">Cart</span></div> 2611 <div class="sh1">Ridgeline 29 Trail Bike</div> 2612 <div class="smeta">Size M: out of stock · Updated <b>14 July 2026</b></div> 2613 <p class="sp"><b>$1,450.00.</b> Financing available at checkout.</p> 2614 <p class="sp">Aluminum frame, 12-speed drivetrain, 140 mm travel. Sizes S and L in stock; size M is awaiting the next delivery.</p> 2615 <div class="ssec">Availability</div> 2616 <p class="sp">Restocks are listed on this page as they arrive. No date announced for size M.</p> 2617 <div class="slink">Notify me about this bike</div> 2618 <div class="sfoot2">Meridian Cycles</div> 2619 </div> 2620 </div> 2621 <div class="epop"> 2622 <div class="eph"><span class="emark"></span><b>ChangeTower</b><span class="ex">✕
2622</span></div> 2623 <div class="ettl">Monitor this page</div> 2624 <div class="efld"><b>Page</b><span class="mono2">meridiancycles.com/bikes/ridgeline-29</span></div> 2625 <div class="efld"><b>Watch for</b><span>Price below $1,200, or size M back in stock<i class="ecaret"></i></span></div> 2626 <div class="efld"><b>Checks</b><span>Hourly</span></div> 2627 <button type="button" class="btn-app">Create monitor</button> 2628 <div class="enote"><s>✓</s>Live in your account before you close the tab.</div> 2629 </div> 2630 </div> 2631 <p class="ctpp-cap">Found while browsing, monitored before the tab closes, archived from its next check.</p> 2632 </div> 2633 </div> 2634 </div> 2635</section> 2636 2637 2638 2639</div> </div> 2640 <div class="elementor-element elementor-element-ctppb03 elementor-widget elementor-widget-html" data-id="ctppb03" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"> 2641 <!-- BLOCK 3 · coverage · use cases · recommended features --> 2642<div class="ctpp"> 2643 2644<!-- ==================== COVERAGE ==================== --> 2645<section style="background:var(--nav)"> 2646 <div class="in"> 2647 <div class="hd"> 2648 <div class="eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>Coverage</div> 2649 <h2>Purpose-built for the signals price watchers actually track.</h2> 2650 <p>A hot restock is gone in an hour, a supplier price list moves once a quarter, your own store changes every deploy. Set check frequency per page, as often as every 5 minutes.</p> 2651 </div> 2652 <div class="ctpp-cov"> 2653 <div class="c"><h3>Price Drops & Increases</h3><p>Watched for the price itself: every move, or only when it crosses your number.</p><span class="cad">every 5 min – hourly</span></div> 2654 <div class="c"><h3>Stock & Restocks</h3><p>Out-of-stock listings watched for the flip back to available, before it goes again.</p><span class="cad">every 5 min</span></div> 2655 <div class="c"><h3>Deals, Coupons & Promo Codes</h3><p>Sale and offer pages: a new code, a changed threshold, a promotion that quietly ends.</p><span class="cad">daily</span></div> 2656 <div class="c"><h3>Your Own Product Pages</h3><p>Prices, sale badges and availability on your own store, verified after every deploy.</p><span class="cad">daily</span></div> 2657 <div class="c"><h3>Missing-Element Alerts</h3><p>A sale banner, discount code or price block that was there and no longer is.</p><span class="cad">daily</span></div> 2658 <div class="c"><h3>Marketplace Listings</h3><p>Marketplace listings you shop or sell on: price and stock moves, at SKU scale.</p><span class="cad">hourly – daily</span></div> 2659 <div class="c"><h3>Competitor Pricing Pages</h3><p>Competitor price pages, plan tables and fee schedules, watched without anyone remembering.</p><span class="cad">daily</span></div> 2660 <div class="c"><h3>Travel, Tickets & Bookings</h3><p>Fares, ticket releases and availability pages that reward whoever sees them first.</p><span class="cad">hourly</span></div> 2661 <div class="c"><h3>Supplier Price Lists & Fee Pages</h3><p>Wholesale price lists, rate cards and fee pages from the vendors your margins depend on.</p><span class="cad">weekly</span></div> 2662 </div> 2663 </div> 2664</section> 2665 2666<!-- ==================== USE CASES ==================== 2667 Same pattern as 918/906/886/925: "Use cases" eyebrow, four cards, no 2668 links (the case-study pages don't exist). If real case studies ship 2669 later, re-add links per card. --> 2670<section style="background:var(--nav2)"> 2671 <div class="in"> 2672 <div class="hd"> 2673 <div class="eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg>Use cases</div> 2674 <h2>Where price watchers put ChangeTower to work.</h2> 2675 </div> 2676 <div class="ctpp-uc"> 2677 <div class="c"> 2678 <h3>Buy at the right moment, not the moment you remembered</h3> 2679 <p>Set the rule once: below your number, back in stock, new code. With checks as often as every 5 minutes, the alert lands while the deal is live, not after it sells out.</p> 2680 </div> 2681 <div class="c"> 2682 <h3>Keep your own prices right, deploy after deploy</h3> 2683 <p>A catalog update drops a sale price. A promo banner vanishes mid-campaign. An item shows out of stock that isn't. Every check verifies your pages, so you catch it before a customer does.</p> 2684 </div> 2685 <div class="c"> 2686 <h3>
2686An archive of every offer you ran</h3> 2687 <p>Every price and discount your pages displayed, stored as dated snapshots. A price-match request, an ad-accuracy question or a pricing complaint that turns on a date becomes a lookup.</p> 2688 </div> 2689 <div class="c"> 2690 <h3>Watch the market without the tab habit</h3> 2691 <p>Competitor price pages, supplier price lists and marketplace listings, checked on schedule and summarized. The buying team reads what moved in seconds.</p> 2692 </div> 2693 </div> 2694 </div> 2695</section> 2696 2697<!-- ==================== RECOMMENDED FEATURES ==================== 2698 Same card set as 918/906/925 EXCEPT Content Monitoring is swapped for 2699 Manual User Actions, per Lamija's spec for this page: the four 2700 capabilities to highlight are AI Monitoring, Selective Monitoring, 2701 Manual User Actions and frequent monitoring (Scheduled Checks). 2702 /features/manual-change-monitoring/ is the live feature page (WP 2703 663); its claims are the source for the card copy (dismiss banners 2704 and modals, record steps once, replayed before every check). --> 2705<section style="background:var(--nav)"> 2706 <div class="in"> 2707 <div class="hd"> 2708 <div class="eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 21v-7"/><path d="M4 10V3"/><path d="M12 21v-9"/><path d="M12 8V3"/><path d="M20 21v-5"/><path d="M20 12V3"/><path d="M1 14h6"/><path d="M9 8h6"/><path d="M17 16h6"/></svg>Recommended setup</div> 2709 <h2>For price & product monitoring, turn these on.</h2> 2710 <p>The capabilities price watchers lean on hardest.</p> 2711 </div> 2712 <div class="ctpp-feat"> 2713 <a href="/features/ai-monitoring-software/" class="c"> 2714 <div class="ico"><svg viewBox="0 0 24 24"><rect x="5" y="5" width="14" height="14" rx="2"/><path d="M9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3"/></svg></div> 2715 <h3>AI Monitoring</h3> 2716 <p>Alert criteria in your own words: "alert me if the price drops below $200, or it goes out of stock." Changes come summarized, and only matches reach you.</p> 2717 <span class="go">Explore â</span> 2718 </a> 2719 <a href="/features/selective-monitoring/" class="c"> 2720 <div class="ico"><svg viewBox="0 0 24 24"><path d="M7 3v14a2 2 0 0 0 2 2h12"/><path d="M3 7h14a2 2 0 0 1 2 2v12"/></svg></div> 2721 <h3>Selective Monitoring</h3> 2722 <p>Watch just the price block, the stock badge or the coupon field, and ignore the rest. It catches a missing sale banner as readily as a changed price.</p> 2723 <span class="go">Explore â</span> 2724 </a> 2725 <a href="/features/manual-change-monitoring/" class="c"> 2726 <div class="ico"><svg viewBox="0 0 24 24"><path d="M9 11.5 4.5 7A2.1 2.1 0 0 1 7.5 4l4.5 4.5"/><path d="m14 6.5 2.5-2.5a2.1 2.1 0 0 1 3 3L17 9.5"/><path d="M8 21c-3 0-5-2-5-5v-4l6.5 6.5"/><path d="M13.5 10.5 21 18c0 2-1 3-3 3l-7.5-7.5"/></svg></div> 2727 <h3>Manual User Actions</h3> 2728 <p>Some pages hide the price behind a cookie banner, a popup or a size picker. Record the steps once; ChangeTower replays them before every check, on exactly the part you need.</p> 2729 <span class="go">Explore â</span> 2730 </a> 2731 <a href="/features/scheduled-website-monitoring/" class="c"> 2732 <div class="ico"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/></svg></div> 2733 <h3>Scheduled Checks</h3> 2734 <p>Set frequency per page: as often as every 5 minutes for a fast restock, weekly for a price list that rarely moves.</p> 2735 <span class="go">Explore â</span> 2736 </a> 2737 <a href="/features/bulk-setup/" class="c"> 2738 <div class="ico"><svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7" rx="1.5"/><rect x="14" y="3" width="7" height="7" rx="1.5"/><rect x="3" y="14" width="7" height="7" rx="1.5"/><path d="M14 17.5h7M17.5 14v7"/></svg></div> 2739 <h3>Bulk Setup</h3> 2740 <p>Import a whole wishlist, SKU list or competitor set in one pass. The catalog is monitored in an afternoon.</p> 2741 <span class="go">Explore â</span> 2742 </a> 2743 <a href="/integrations/slack/" class="c"> 2744 <div class="ico"><svg viewBox="0 0 24 24">
2744<path d="M5 9h14M5 15h14M11 4 7 20M17 4l-4 16"/></svg></div> 2745 <h3>Slack & Teams Alerts</h3> 2746 <p>Push price and stock changes into the channel you already watch, summary attached. Email and webhooks carry the same alert.</p> 2747 <span class="go">Explore â</span> 2748 </a> 2749 </div> 2750 </div> 2751</section> 2752 2753</div> </div> 2754 <section class="elementor-section elementor-top-section elementor-element elementor-element-67ee55d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="67ee55d" data-element_type="section" data-e-type="section"> 2755 <div class="elementor-container elementor-column-gap-default"> 2756 <div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-dd5a3ab" data-id="dd5a3ab" data-element_type="column" data-e-type="column"> 2757 <div class="elementor-widget-wrap elementor-element-populated"> 2758 <div class="elementor-element elementor-element-3d25167 elementor-widget elementor-widget-html" data-id="3d25167" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"> 2759 <!-- CT-G2-REVIEWS v3 styles (1 of 2). Canonical copy: page 1714. Script-free â stars are CSS, cards are duplicated in the markup widget for the seamless loop. --> 2760<style>.ctrev-wrap{font-family:Inter,sans-serif}.ctrev-head{max-width:1080px;margin:0 auto 36px;text-align:center}.ctrev-eyebrow{color:#88FFCC;font-size:14px;font-weight:600;letter-spacing:2px;text-transform:uppercase;margin:0 0 12px}.ctrev-title{color:#fff;font-family:'Funnel Display',sans-serif;font-size:40px;font-weight:400;margin:0 0 20px}.ctrev-badge{display:inline-flex;align-items:center;gap:10px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);border-radius:100px;padding:8px 18px;color:#fff;font-size:15px;font-weight:500;text-decoration:none;transition:background .2s}.ctrev-badge:hover{background:rgba(136,255,204,0.12)}.ctrev-badge::before{content:'\2605\2605\2605\2605\2605';color:#88FFCC;letter-spacing:2px;font-size:14px}.ctrev-viewport{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}.ctrev-track{display:flex;gap:22px;width:max-content;animation:ctrevScroll 70s linear infinite}.ctrev-viewport:hover .ctrev-track{animation-play-state:paused}@keyframes ctrevScroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}.ctrev-card{flex:0 0 360px;box-sizing:border-box;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.08);border-radius:14px;padding:28px;display:flex;flex-direction:column}.ctrev-card::before{content:'\2605\2605\2605\2605\2605';color:#88FFCC;font-size:15px;letter-spacing:3px;line-height:1;display:block;margin-bottom:14px}.ctrev-quote{color:rgba(255,255,255,0.82);font-size:16px;line-height:1.6;margin:0 0 20px;flex:1}.ctrev-person{display:flex;flex-direction:column;gap:2px}.ctrev-name{color:#fff;font-weight:600;font-size:15px}.ctrev-role{color:rgba(255,255,255,0.55);font-size:13px}.ctrev-src{color:rgba(255,255,255,0.4);font-size:12px;margin-top:10px}@media(max-width:900px){.ctrev-title{font-size:32px}.ctrev-card{flex-basis:300px}} 2761/* CT-MOBILEFIX v3 (2026-08-30, rev 2). Adds a slower review scroll on phones (constant px/s felt too fast on a 375px screen). iOS Safari (WebKit) blanks a mask-image'd wrapper whose child runs a composited transform animation, so the edge-fade mask comes off at phone widths and the masked wrappers get their own compositing layer for desktop Safari. Stacks final-CTA / hero buttons full-width on small screens (theme has no mobile rule for .final-cta-actions; the v1 use-case pages use .acts). The :has() rules stop the G2 wrapper section from computing wider than the viewport when it sits inside a root e-con container (v1 pages rendered it 767px wide at 375px). Covers the G2 reviews block and, where present on the page, the cthm- logo marquee. */ 2762.ctrev-viewport,.cthm-marquee{-webkit-transform:translateZ(0);transform:translateZ(0)} 2763.elementor-section:has(.ctrev-wrap),.elementor-section:has(.ctrev-wrap) .elementor-container,.elementor-section:has(.ctrev-wrap) .elementor-column,.elementor-section:has(.ctrev-wrap) .elementor-widget-wrap,.elementor-section:has(.ctrev-wrap) .elementor-widget{max-width:100%!important;min-width:0!important} 2764@media(max-width:768px){.ctrev-viewport,.cthm-marquee{-webkit-mask-image:none!important;mask-image:none!important}.ctrev-card{flex-basis:280px}.ctrev-track{animation-duration:140s}.cthm-marquee-track img{margin-right:40px}} 2765@media(max-width:600px){.final-cta-actions,.page-hero-actions,.acts{flex-direction:column;align-items:stretch}.final-cta-actions .btn-primary,.final-cta-actions .btn-secondary,.page-hero-actions .btn-primary,.page-hero-actions .btn-secondary{width:100%;justify-content:center;text-align:center}.acts .btn{width:100%!important;justify-content:center;text-align:center}}</style>
2766 </div> 2767 <div class="elementor-element elementor-element-8be1d79 elementor-widget elementor-widget-html" data-id="8be1d79" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"> 2768 <!-- CT-G2-REVIEWS v3 markup (2 of 2). Canonical copy: page 1714. Cards appear twice so the marquee loops seamlessly â edit both copies. --> 2769<div class="ctrev-wrap"><div class="ctrev-head"><p class="ctrev-eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/></svg>Reviews</p><h2 class="ctrev-title">What Our Customers Say</h2><a class="ctrev-badge" href="https://www.g2.com/products/changetower/reviews" target="_blank" rel="noopener">4.6 / 5 on G2</a></div><div class="ctrev-viewport"><div class="ctrev-track"><div class="ctrev-card"><p class="ctrev-quote">âOne of the most powerful website monitoring tools I have used. It detects even the smallest changes across text, images, and complex DOM structures — with impressive results tracking competitor pricing in real time.â</p><div class="ctrev-person"><span class="ctrev-name">Corey M.</span><span class="ctrev-role">Sr. Full Stack Developer</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âChangeTower lets me monitor changelogs, release notes, and pricing pages on competing products. The change detection is accurate and detailed — I can see exactly what was added or removed.â</p><div class="ctrev-person"><span class="ctrev-name">Eric L.</span><span class="ctrev-role">VP of Product, Mid-Market</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âThe ability to track dozens of competitor websites at once and tailor alert rules to each client is handy. Continually impressed with how it applies across very different industries.â</p><div class="ctrev-person"><span class="ctrev-name">Daniel B.</span><span class="ctrev-role">Managing Principal, Small-Business</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âCreating monitors is very easy — I have around 200 active at any given time. I haven’t come across a webpage yet that I couldn’t get ChangeTower to work for.â</p><div class="ctrev-person"><span class="ctrev-name">Alex Z.</span><span class="ctrev-role">Project Manager, Enterprise</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âI can’t say enough great things about the ChangeTower team. They took a problem I couldn’t solve and delivered results quickly and professionally. Highly recommend!â</p><div class="ctrev-person"><span class="ctrev-name">Patrick B.</span><span class="ctrev-role">Program Manager, Small-Business</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âChangeTower makes it easy to monitor competitor websites for updates. I love the visual differences that highlight exactly what’s changed. The alert system is reliable.â</p><div class="ctrev-person"><span class="ctrev-name">Joe B.</span><span class="ctrev-role">CFO, Mid-Market</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âI use ChangeTower to monitor competitor brand pages and keep our own marketing content consistent across touchpoints. The notifications and team dashboard are very intuitive.â</p><div class="ctrev-person"><span class="ctrev-name">Evan F.</span><span class="ctrev-role">Director, Innovation Marketing</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âChangeTower helps us stay on top of compliance-related webpage changes. The real-time notifications are critical, letting us respond quickly when updates occur.â</p><div class="ctrev-person"><span class="ctrev-name">Verified User</span><span class="ctrev-role">Financial Services, Mid-Market</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âOne of the most powerful website monitoring tools I have used. It detects even the smallest changes across text, images, and complex DOM structures — with impressive results tracking competitor pricing in real time.â</p><div class="ctrev-person"><span class="ctrev-name">Corey M.</span><span class="ctrev-role">Sr. Full Stack Developer</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âChangeTower lets me monitor changelogs, release notes, and pricing pages on competing products. The change detection is accurate and detailed — I can see exactly what was added or removed.â</p><div class="ctrev-person"><span class="ctrev-name">Eric L.</span><span class="ctrev-role">VP of Product, Mid-Market</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âThe ability to track dozens of competitor websites at once and tailor alert rules to each client is handy. Continually impressed with how it applies across very different industries.â</p><div class="ctrev-person"><span class="ctrev-name">Daniel B.</span><span class="ctrev-role">Managing Principal, Small-Business</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âCreating monitors is very easy — I have around 200 active at any given time. I haven’t come across a webpage yet that I couldn’t get ChangeTower to work for.â</p><div class="ctrev-person"><span class="ctrev-name">Alex Z.</span><span class="ctrev-role">Project Manager, Enterprise</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âI can’t say enough great things about the ChangeTower team. They took a problem I couldn’t solve and delivered results quickly and professionally. Highly recommend!â</p><div class="ctrev-person"><span class="ctrev-name">Patrick B.</span><span class="ctrev-role">Program Manager, Small-Business</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âChangeTower makes it easy to monitor competitor websites for updates. I love the visual differences that highlight exactly what’s changed. The alert system is reliable.â</p><div class="ctrev-person"><span class="ctrev-name">Joe B.</span><span class="ctrev-role">CFO, Mid-Market</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âI use ChangeTower to monitor competitor brand pages and keep our own marketing content consistent across touchpoints. The notifications and team dashboard are very intuitive.â</p><div class="ctrev-person"><span class="ctrev-name">Evan F.</span><span class="ctrev-role">Director, Innovation Marketing</span></div><div class="ctrev-src">via G2</div></div><div class="ctrev-card"><p class="ctrev-quote">âChangeTower helps us stay on top of compliance-related webpage changes. The real-time notifications are critical, letting us respond quickly when updates occur.â
2769</p><div class="ctrev-person"><span class="ctrev-name">Verified User</span><span class="ctrev-role">Financial Services, Mid-Market</span></div><div class="ctrev-src">via G2</div></div></div></div></div> </div> 2770 </div> 2771 </div> 2772 </div> 2773 </section> 2774 <div class="elementor-element elementor-element-ctppb04 elementor-widget elementor-widget-html" data-id="ctppb04" data-element_type="widget" data-e-type="widget" data-widget_type="html.default"> 2775 <!-- BLOCK 4 · FAQ · final CTA (reliability & trust section removed on Lamija's request, 2026-08-10) --> 2776<div class="ctpp"> 2777 2778 2779 2780<!-- ==================== FAQ ==================== 2781 8 questions, matching 918/906/925's post-removal count. No 2782 domain-scanning Q&A on this page (removed house-wide direction 2783 pending; see 906's build log). If it ever comes back, mind the claims 2784 doc: the scan runs on a cadence the USER sets (weekly, biweekly, 2785 monthly), is not continuous, and discovered pages are NOT monitored 2786 automatically. Never "as they appear" or "minutes after publication". 2787 The frequency FAQ uses the "as often as every 5 minutes" figure, 2788 confirmed by Lamija 2026-08-10 (style guide §6 updated the same day). --> 2789<section style="background:var(--nav2)"> 2790 <div class="in"> 2791 <div class="hd"> 2792 <div class="eyebrow"><svg class="ct-lic" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><path d="M12 17h.01"/></svg>FAQ</div> 2793 <h2>Questions price watchers ask first.</h2> 2794 </div> 2795 <div class="ctpp-faq"> 2796 <details name='ctpp-faq'> 2797 <summary>How does price and stock monitoring work?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2798 <div class="a"><p>You add the product, deal or pricing pages you care about and write the rule in plain language, such as alert me below $200 or when it is back in stock. ChangeTower checks each page as often as every 5 minutes and emails you when the rule is met, with a dated snapshot of what the page showed.</p></div> 2799 </details> 2800 <details name='ctpp-faq'> 2801 <summary>What is a snapshot, and how long is it kept?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2802 <div class="a"><p>A dated capture of a page: what was rendered and the HTML behind it, stored on every check, changed or not. Each is timestamped and retrievable, so "I'm sure it was cheaper last week" becomes a record.</p></div> 2803 </details> 2804 <details name='ctpp-faq'> 2805 <summary>Can I get an alert only when the price drops below a number I set?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2806 <div class="a"><p>Yes, that's the recommended setup. Describe your criteria in plain language: "alert me if the price drops below $200, or it goes out of stock". The AI reads every change against that rule and archives what doesn't cross your threshold, without an alert: the history stays complete, your channel hears only what matters.</p></div> 2807 </details> 2808 <details name='ctpp-faq'> 2809 <summary>How often are product and pricing pages checked?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2810 <div class="a"><p>As often as every 5 minutes, set per monitor: every few minutes for a restock that sells out in an hour, weekly for a supplier price list. Tune it any time, up before a sale, back down after.</p></div> 2811 </details> 2812 <details name='ctpp-faq'> 2813 <summary>Can you watch a price that only appears after a cookie banner, a size picker or a login?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2814 <div class="a"><p>Yes. Record the steps once as manual user actions: close the cookie banner, dismiss the popup, pick the size. ChangeTower replays them before every check, so you watch the price a shopper would see.</p></div> 2815 </details> 2816 <details name='ctpp-faq'> 2817 <summary>Can I watch just the price and ignore the rest of the page?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2818 <div class="a"><p>Yes. Selective monitoring watches just the part you care about: the price block, the stock badge, the coupon field. Reviews, recommendations and rotating banners stop counting as changes, most of a retail page's noise.</p></div> 2819 </details> 2820 <details name='ctpp-faq'> 2821 <summary>Will I get too many alerts?<svg viewBox="0 0 24 24">
2821<path d="m6 9 6 6 6-6"/></svg></summary> 2822 <div class="a"><p>No, and that's the point of the AI layer. Banners rotate, review counts tick up, recommendations reshuffle: retail pages change constantly. Your criteria decide what deserves an alert; everything else is read, classified and archived quietly. The record stays complete, your channel quiet.</p></div> 2823 </details> 2824 <details name='ctpp-faq'> 2825 <summary>Can I monitor my own store's prices and stock?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2826 <div class="a"><p>Yes, and sellers lean on it hard. Watch your own product and landing pages: confirm every price, sale badge and discount survives each deploy, and get alerted if a sale banner or price block goes missing mid-campaign. The snapshots double as a dated archive of every offer.</p></div> 2827 </details> 2828 <details name='ctpp-faq'> 2829 <summary>How many products or brands can we track at once?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2830 <div class="a"><p>Yes. Bulk setup imports a whole SKU list or wishlist in one pass. Monitors stay organized by retailer, brand or client, each group's alerts routed to its own channel: restocks to you, price-list changes to the buying team. The archive filters the same way.</p></div> 2831 </details> 2832 <details name='ctpp-faq'> 2833 <summary>Where do price alerts get sent?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2834 <div class="a"><p>Email, Slack or Microsoft Teams. Alert rules decide what reaches you, so a price crossing your number lands immediately while a reworded description is archived quietly.</p></div> 2835 </details> 2836 <details name='ctpp-faq'> 2837 <summary>Can you alert me when an item comes back in stock?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2838 <div class="a"><p>Yes. Say so in plain language when you set the monitor, and the check that finds the item available again is the one that emails you.</p></div> 2839 </details> 2840 <details name='ctpp-faq'> 2841 <summary>How is this different from a browser price tracker or a deal site?<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg></summary> 2842 <div class="a"><p>A deal site shows you what it decided to list, and most trackers only follow big marketplaces. ChangeTower watches any page you can reach by URL, including supplier price lists and your own store, and keeps a dated record of what each page showed.</p></div> 2843 </details> 2844 </div> 2845 </div> 2846</section> 2847 2848<!-- ==================== FINAL CTA ==================== --> 2849<section class="ctpp-cta"> 2850 <div class="in"> 2851 <h2>Stop finding out about the drop after it's gone.</h2> 2852 <p>Put the pages you care about under a monitor and get alerted the moment your criteria are met. First monitor live in under 5 minutes.</p> 2853 <div class="acts"> 2854 <a href="https://app2.changetower.com/register" class="btn btn-p">Start Free Trial</a> 2855 <a href="/sales" class="btn btn-g">Book a Demo</a> 2856 </div> 2857 <div class="badges"> 2858 <span><b>â</b>Encrypted end to end</span> 2859 <span><b>â</b>Cancel anytime</span> 2860 </div> 2861 </div> 2862</section> 2863 2864</div> </div> 2865 </div> 2866 </div> 2867 </div> 2868 </section> 2869 </main> 2870 2871<footer class="footer" id="footer"> 2872 <div class="container"> 2873 <div class="footer-grid"> 2874 <div class="footer-brand"> 2875 <a href="https://changetower.com/" class="nav-logo"> 2876 <svg viewBox="25 10 235 150" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M94.48564,15.30913c6.17344,-0.15369 13.06362,0.29054 17.31357,5.40526c7.45825,8.97584 0.59399,23.93305 9.45044,34.22709c11.24033,13.06481 29.63804,2.08902 38.10923,13.81599c6.80713,9.42374 -0.53906,24.71837 10.2085,34.6747c5.31152,4.91941 14.70117,6.18033 21.64014,5.8996c16.16162,-0.65346 24.25928,-7.17487 25.0708,-23.68412c0.17871,-3.62993 -0.47021,-8.56824 0.2168,-11.85283c0.55225,-2.62966 2.06104,-5.17801 3.87744,-7.13209c1.98779,-2.13796 4.64355,-4.17584 7.66553,-4.2809c2.2251,-0.07721 4.50879,0.07414 6.73682,0.10901c5.89893,0.09187 12.16406,-0.00923 16.74756,4.33042c3.854,3.64956 4.8208,8.98566 4.95117,14.0636c0.88916,34.31676 -29.12402,12.48636 -41.82568,29.55881c-8.45361,11.36273 -1.34033,25.75936 -9.5083,34.32262c-3.87012,4.05555 -9.70752,4.62404 -14.98242,4.75736c-4.92627,0.03077 -11.86963,-0.34578 -15.49219,-4.12896c-9.65479,-10.08189 -1.18506,-24.04528 -10.50879,-35.3938c-8.61768,-12.28886 -30.16919,-2.61208 -37.97036,-13.55402
2876c-7.10171,-9.96072 0.4522,-25.11059 -10.53354,-35.06106c-1.49634,-1.36333 -3.20186,-2.47758 -5.05151,-3.29983c-4.34736,-1.91027 -12.08569,-2.86233 -16.72295,-2.60446c-9.65874,0.53713 -18.90747,2.88065 -22.66377,12.77983c-2.69546,6.67027 -2.39868,14.03415 -1.85933,21.14016c0.38936,5.13039 -3.58989,9.80981 -7.92334,12.21472c-0.32666,0.18124 -1.21816,0.48101 -1.60312,0.50079c-15.10195,0.77287 -30.06035,2.32213 -30.95742,-17.14234c-0.77388,-16.78806 5.34214,-22.99989 22.03301,-22.55082c14.54355,-0.24351 23.68433,-7.25223 24.5354,-22.18248c0.44766,-7.85397 -0.40488,-16.96549 6.89868,-21.91919c3.96855,-2.69164 7.57017,-2.84328 12.14766,-3.0131z" fill="var(--color-accent, #88FFCC)"/></svg> 2877 ChangeTower 2878 </a> 2879 <p>AI-powered website change monitoring for compliance, marketing, and competitive intelligence teams. Founded in Chicago.</p> 2880 </div> 2881 <div class="footer-col"> 2882 <h4>About</h4> 2883 <a href="/faqs/">FAQs</a> 2884 <a target="_blank" href="https://status.changetower.com/">App Status</a> 2885 <a href="/contact/">Contact Us</a> 2886 <a href="/careers/">Careers</a> 2887 <a href="/pricing/">Pricing</a> 2888 <a href="/security-trust/">Security & Trust</a> 2889 <a href="/terms/">Terms of Service</a> 2890 <a href="/privacy/">Privacy Policy</a> 2891 </div> 2892 <div class="footer-col"> 2893 <h4>Sales & Support</h4> 2894 <a href="/sales/">Sales Inquiry</a> 2895 <a href="https://help.changetower.com/">Help Center</a> 2896 <a href="/cdn-cgi/l/email-protection#c7b4b2b7b7a8b5b387a4afa6a9a0a2b3a8b0a2b5e9a4a8aa">Open a Support Ticket</a> 2897 </div> 2898 <div class="footer-col"> 2899 <h4>Solutions</h4> 2900 <a href="/solutions/compliance-monitoring-software/">Compliance</a> 2901 <a href="/solutions/competitor-monitoring/">Competitive Intelligence</a> 2902 <a href="/solutions/legal-regulatory-monitoring/">Legal Change Tracking</a> 2903 <a href="/solutions/reputation-monitoring/">Brand & Reputation</a> 2904 <a href="/features/agency-client-reporting/">Agency & Client Reporting</a> 2905 </div> 2906 <div class="footer-col"> 2907 <h4>Features</h4> 2908 <a href="/features/ai-monitoring-software/">AI-Powered Monitoring</a> 2909 <a href="/features/selective-monitoring/">Selective Monitoring</a> 2910 <a href="/features/scheduled-website-monitoring/">Schedule Monitors</a> 2911 <a href="/features/manual-user-actions/">Manual User Actions</a> 2912 <a href="/mcp/">MCP</a> 2913 <a href="/features/website-monitoring-browser-extension/">Browser Extension</a> 2914 </div> 2915 </div> 2916 <div class="footer-bottom"> 2917 <p>© 2026 ChangeTower. All rights reserved.</p> 2918 <div class="footer-social"> 2919 <a href="https://x.com/ChangeTower" aria-label="Twitter"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"/></svg></a> 2920 <a href="https://www.linkedin.com/company/changetower" aria-label="LinkedIn"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"/><rect x="2" y="9" width="4" height="12"/><circle cx="4" cy="4" r="2"/></svg></a> 2921 <a href="https://www.linkedin.com/company/changetower" aria-label="GitHub"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/></svg></a> 2922 </div> 2923 </div> 2924 </div> 2925 </footer>
vendor: 112 bytes, lines 2925-2927
2925 2926 2927 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
2927<script type="speculationrules"> 2928{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/changetower-theme/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 2929</script>
2929 2930
2930<script> 2931 const lazyloadRunObserver = () => { 2932 const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); 2933 const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { 2934 entries.forEach( ( entry ) => { 2935 if ( entry.isIntersecting ) { 2936 let lazyloadBackground = entry.target; 2937 if( lazyloadBackground ) { 2938 lazyloadBackground.classList.add( 'e-lazyloaded' ); 2939 } 2940 lazyloadBackgroundObserver.unobserve( entry.target ); 2941 } 2942 }); 2943 }, { rootMargin: '200px 0px 200px 0px' } ); 2944 lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { 2945 lazyloadBackgroundObserver.observe( lazyloadBackground ); 2946 } ); 2947 }; 2948 const events = [ 2949 'DOMContentLoaded', 2950 'elementor/lazyload/observe', 2951 ]; 2952 events.forEach( ( event ) => { 2953 document.addEventListener( event, lazyloadRunObserver ); 2954 } ); 2955 </script>
2955 2956
2956<script id="changetower-mcp-js" src="https://changetower.com/wp-content/plugins/ct-mcp-plugin/dist/frontend.js?ver=1784125683"></script>
vendor: 1 bytes, line 2956
2956
2957<script id="changetower-main-js" src="https://changetower.com/wp-content/themes/changetower-theme/assets/js/main.js?ver=1.0.0"></script>
vendor: 1 bytes, line 2957
2957
2958<script id="elementor-webpack-runtime-js" src="https://changetower.com/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=4.1.5"></script>
vendor: 1 bytes, line 2958
2958
2959<script id="elementor-frontend-modules-js" src="https://changetower.com/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=4.1.5"></script>
vendor: 1 bytes, line 2959
2959
2960<script id="jquery-ui-core-js-before"> 2961jQuery.uiBackCompat = true; 2962//# sourceURL=jquery-ui-core-js-before 2963</script>
vendor: 1 bytes, line 2963
2963
2964<script id="jquery-ui-core-js" src="https://changetower.com/wp-includes/js/jquery/ui/core.min.js?ver=1.14.2"></script>
vendor: 1 bytes, line 2964
2964
2965<script id="elementor-frontend-js-before"> 2966var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnTwitter":"Share on Twitter","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"hasCustomBreakpoints":false},"version":"4.1.5","is_static":false,"experimentalFeatures":{"e_font_icon_svg":true,"additional_custom_breakpoints":true,"container":true,"e_optimized_markup":true,"e_panel_promotions":true,"e_pro_free_trial_popup":true,"nested-elements":true,"e_atomic_elements":true,"atomic_widgets_should_enforce_capabilities":true,"editor_mcp":true,"e_bc_migrations":true,"e_editor_design_system_panel":true,"e_classes":true,"global_classes_should_enforce_capabilities":true,"e_variables":true,"e_variables_manager":true,"e_opt_in_v4_page":true,"e_opt_in_v4":true,"e_components":true,"e_interactions":true,"e_widget_creation":true,"import-export-customization":true},"urls":{"assets":"https:\/\/changetower.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/changetower.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/changetower.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"380d09a0a0","atomicFormsSendForm":"239f0d9c73"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description"},"post":{"id":932,"title":"Price%20Monitoring%20Software%20%26%20Restock%20Alerts%20%7C%20ChangeTower","excerpt":"","featuredImage":false}}; 2967//# sourceURL=elementor-frontend-js-before 2968</script>
vendor: 1 bytes, line 2968
2968
2969<script id="elementor-frontend-js" src="https://changetower.com/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=4.1.5"></script>
vendor: 1 bytes, line 2969
2969
2970<script id="wp-emoji-settings" type="application/json"> 2971{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://changetower.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}} 2972</script>
vendor: 1 bytes, line 2972
2972
2973<script type="module"> 2974/*! This file is auto-generated */ 2975var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); 2976//# sourceURL=https://changetower.com/wp-includes/js/wp-emoji-loader.min.js 2977</script>
vendor: 1 bytes, line 2977
2977
2978<script data-cfasync="false"> 2979 document.onreadystatechange = function () { 2980 if (document.readyState == "complete") { 2981 var logout_link = document.querySelectorAll('a[href*="wp-login.php?action=logout"]'); 2982 if (logout_link) { 2983 for(var i=0; i < logout_link.length; i++) { 2984 logout_link[i].addEventListener( "click", function() { 2985 Intercom('shutdown'); 2986 }); 2987 } 2988 } 2989 } 2990 }; 2991</script>
vendor: 1 bytes, line 2991
2991
2992<script data-cfasync="false"> 2993 window.intercomSettings = {"app_id":"p3dsxd50","installation_type":"wordpress","installation_version":"3.0.2"}; 2994</script>
vendor: 1 bytes, line 2994
2994
2995<script data-cfasync="false">(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/p3dsxd50';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
2995</body> 2996</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.