PageSourceSearch

https://changetower.com/solutions/product-monitoring/

html changetower.com collected 2026-10-01 15:30:15 UTC 228,217 bytes, 2,996 lines download raw bytes

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 &amp; 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 &amp; 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 &#038; 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&#038;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&#038;family=Inter:wght@400;500;600;700&#038;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&#038;family=Inter:wght@400;500;600;700&#038;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&#038;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">&times;</button>
523      </div>
524      <div class="mega-flyout-grid cols-4">
525        <div>
526          <div class="mega-flyout-col-title">Compliance &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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">&times;</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 &amp; 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">&times;</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 &amp; 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 &#038; 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 &amp; Product Monitoring</span>
1277      <h1>Price &amp; 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 &amp; product watch</b>
1337        </div>
1338        <div class="body">
1339          <div class="title">Price &amp; 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 &amp; Restocks</button>
1348              <button type="button" class="sg" data-cat="deal">Deals &amp; 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">&lsaquo; 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>&#10003;</s>A screenshot of the page, exactly as a visitor saw it</div>
1390              <div class="hold"><s>&#10003;</s>The full HTML behind it</div>
1391              <div class="hold"><s>&#10003;</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 &rarr; $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 &rarr; $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">&#10003;</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 &times; ' + (s.px || 2600) + ' &middot; <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 &amp; 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 &nbsp;·&nbsp; #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 &middot; 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 &amp; 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 &middot; Price drop</div>
2234                  <div class="sub">Detected on the 09:00 check &middot; 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 &amp; Restocks &middot; 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 &middot; 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 &times; 2040 &middot; <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 &middot; 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 &rarr; $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 &rarr; $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 &ndash; 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">&#10003;</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">&#8635; 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 &middot; 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">&#10005;
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>&#10003;</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 &amp; Increases</h3><p>Watched for the price itself: every move, or only when it crosses your number.</p><span class="cad">every 5 min &ndash; hourly</span></div>
2654      <div class="c"><h3>Stock &amp; 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 &amp; 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 &ndash; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &mdash; 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 &mdash; 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 &mdash; I have around 200 active at any given time. I haven&#8217;t come across a webpage yet that I couldn&#8217;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&#8217;t say enough great things about the ChangeTower team. They took a problem I couldn&#8217;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&#8217;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 &mdash; 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 &mdash; 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 &mdash; I have around 200 active at any given time. I haven&#8217;t come across a webpage yet that I couldn&#8217;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&#8217;t say enough great things about the ChangeTower team. They took a problem I couldn&#8217;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&#8217;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 &amp; 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 &amp; 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 &amp; Reputation</a>
2904          <a href="/features/agency-client-reporting/">Agency &amp; 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>&copy; 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.