1<!DOCTYPE html><!-- Last Published: Fri Jan 23 2026 12:50:09 GMT+0000 (Coordinated Universal Time) --> 2<html lang="en" data-wf-page="68a7548e0cb9979055a2e555" data-wf-site="6884d0006202816ee3f34324"> 3<head> 4 <meta charset="utf-8"> 5 <title>ROI Genius | Ai Marketing That Generates High-Value Leads for Tree Service Businesses</title> 6 <meta content="Scale your tree removal business with ROI Genius. We create Ai-driven funnels that deliver pre-qualified, high-intent leads on autopilot." name="description"> 7 <meta content="ROI Genius | Ai Marketing That Generates High-Value Leads for Tree Service Businesses" property="og:title"> 8 <meta content="Scale your tree removal business with ROI Genius. We create Ai-driven funnels that deliver pre-qualified, high-intent leads on autopilot." property="og:description"> 9 <meta content="ROI Genius | Ai Marketing That Generates High-Value Leads for Tree Service Businesses" property="twitter:title"> 10 <meta content="Scale your tree removal business with ROI Genius. We create Ai-driven funnels that deliver pre-qualified, high-intent leads on autopilot." property="twitter:description"> 11 <meta property="og:type" content="website"> 12 <meta content="summary_large_image" name="twitter:card"> 13 <meta property="og:image" content="https://roi-genius.ai/images/og-image.jpg"> 14 <meta property="og:image:width" content="1200"> 15 <meta property="og:image:height" content="630"> 16 <meta property="og:image:alt" content="ROI Genius - Ai Marketing for Tree Service Businesses"> 17 <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"> 18 <link rel="canonical" href="https://roi-genius.ai/"> 19 <!-- Performance Optimization: Preconnect to critical third-party origins (limit to 2-3) --> 20 <link rel="preconnect" href="https://image.mux.com" crossorigin> 21 <link rel="preconnect" href="https://stream.mux.com" crossorigin> 22 <!-- Preconnect for mux-player CDN (loads after LCP but preconnect helps) --> 23 <link rel="dns-prefetch" href="https://cdn.jsdelivr.net"> 24 <link rel="dns-prefetch" href="https://assets.calendly.com"> 25 <link rel="dns-prefetch" href="https://d3e54v103j8qbb.cloudfront.net"> 26 <!-- FB preconnect removed - will load after LCP/idle --> 27 <meta content="width=device-width, initial-scale=1" name="viewport"> 28 <!-- Performance Optimization: Load non-critical CSS asynchronously immediately --> 29
29<script> 30 // Async CSS loading - execute immediately to prevent render-blocking 31 // Use requestAnimationFrame to avoid blocking main thread 32 (function() { 33 function loadCSS() { 34 var cssFiles = ['css/tokens.css?v=2','css/normalize.css?v=2','css/components.css?v=2','css/revscaleco.css?v=2']; 35 cssFiles.forEach(function(href) { 36 var link = document.createElement('link'); 37 link.rel = 'stylesheet'; 38 link.href = href; 39 link.media = 'print'; 40 var fallback = setTimeout(function() { link.media = 'all'; }, 100); 41 link.onload = function() { clearTimeout(fallback); this.media = 'all'; }; 42 document.head.appendChild(link); 43 }); 44 } 45 // Use requestAnimationFrame to avoid blocking 46 if (window.requestAnimationFrame) { 47 requestAnimationFrame(loadCSS); 48 } else { 49 loadCSS(); 50 } 51 })(); 52 </script>
52 53 <!-- Performance Optimization: Critical CSS inlined for above-the-fold content to reduce render-blocking --> 54 <style> 55 /* Critical CSS - Above the fold styles */ 56 :root{--faded:#ffffff26;--fadedd:#ce984280} 57 body{color:#fffc;margin-bottom:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:16px} 58 .body{color:#fff;background-color:#fff;line-height:1.5} 59 .body.black{background-color:#0a0a0a} 60 h1{margin-top:0;margin-bottom:16px;font-size:3.75rem;font-weight:600;line-height:1} 61 h4{margin-top:0;margin-bottom:0;font-size:1.25rem;font-weight:600;line-height:1.75rem} 62 a{text-decoration:none} 63 .skip-link{position:absolute;top:-40px;left:0;z-index:100;background:#31fe6c;color:#0a0a0a;padding:8px 16px;font-weight:600;border-radius:0 0 4px 0} 64 .skip-link:focus{top:0} 65 .header{justify-content:space-between;align-items:center;width:95%;max-width:1128px;height:80px;display:flex} 66 .header1{justify-content:center;display:flex} 67 .header1.sticky{background-image:none;border-bottom:1px solid #ffffff26} 68 .div-block-27{display:flex} 69 .div-block-30{grid-column-gap:13px;grid-row-gap:13px;justify-content:center;align-items:center;display:flex} 70 .logo{max-width:200px} 71 .logo.foot.smaller{width:50px;max-width:50px;height:50px;margin-top:0} 72 .button{color:#111112;background-color:#31fe6c;background-image:linear-gradient(90deg,#1fe066,#14eba3);border-radius:30px;margin-top:24px;padding:12px 32px;font-weight:600;box-shadow:0 2px 20px 8px #1fe0664d} 73 .button.head{margin-top:0} 74 .container{text-align:center;flex-flow:column;justify-content:flex-start;align-items:center;width:100%;max-width:1025px;margin-left:auto;margin-right:auto;padding:60px 0;display:flex;position:relative} 75 .container.top{padding-top:2svh} 76 .bubble-div{text-transform:uppercase;background-color:#ef434340;border:1px solid #ef434366;border-radius:6.25rem;flex-flow:column;justify-content:center;align-items:center;margin-bottom:32px;padding:8px 1rem;display:flex;box-shadow:0 2px 20px 2px #ef434366} 77 .tag{font-size:1.125rem;line-height:1.75rem} 78 .tag.red{color:#ef4343;text-transform:capitalize;margin-bottom:32px} 79 .tag.red.weirdsize{font-size:.875rem;line-height:1.25rem} 80 .tag.red.weirdsize.nomarg{margin-bottom:0} 81 .paragraph{color:#fff} 82 .paragraph.sub{color:#999;margin-bottom:24px;font-size:1.87rem} 83 .green{-webkit-text-fill-color:transparent;background-image:linear-gradient(105deg,#1fe066,#14eba3);-webkit-background-clip:text;background-clip:text} 84 .embediv{border-radius:20px;justify-content:center;align-items:center;width:100%;max-width:900px;padding-top:0;padding-bottom:0;display:flex;overflow:hidden;box-shadow:0 18px 50px -12px #1fe06659,0 4px 16px #00000080;aspect-ratio:16/9;min-height:0} 85 .video-wrapper{position:relative;width:100%;line-height:0;border-radius:20px;overflow:hidden;background:transparent;aspect-ratio:16/9} 86 @media (max-width:479px){h1{font-size:2.25rem;line-height:1.25}.header{justify-content:center}.header1{display:none}.header1.sticky{border-bottom-style:none;width:100%;display:flex}.container.top{max-width:100%;padding:0 10px}.button.head{display:none}} 87 </style> 88 <noscript> 89 <link href="css/tokens.css?v=2" rel="stylesheet"> 90 <link href="css/normalize.css?v=2" rel="stylesheet"> 91 <link href="css/components.css?v=2" rel="stylesheet"> 92 <link href="css/revscaleco.css?v=2" rel="stylesheet"> 93 </noscript> 94
94<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
94 95 <link href="images/favicon.png" rel="shortcut icon" type="image/x-icon"> 96 <link href="images/webclip.png" rel="apple-touch-icon"> 97 <!-- Performance Optimization: Preload critical resources (logo) for faster LCP --> 98 <link rel="preload" href="images/Duck-Logo-100x100.webp" as="image" type="image/webp"> 99 <!-- Performance Optimization: Preload hero poster image (LCP element) --> 100 <!-- Preload exact URL that matches poster attribute (768px mobile-first) - desktop upgrade happens later via JS --> 101 <link rel="preload" href="https://image.mux.com/FKtVGCJRjf4lc9tSXIISd5slw3Tumb01JMmuyOX91s7s/thumbnail.webp?width=768" as="image" type="image/webp" fetchpriority="high"> 102 <!-- Performance Optimization: Meta Pixel Code - Deferred until after LCP/idle --> 103
103<script> 104 // Defer FB pixel until after LCP to reduce main-thread work 105 (function() { 106 function loadFBPixel() {
vendor: 453 bytes, lines 106-115
106 107 !function(f,b,e,v,n,t,s) 108 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 109 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 110 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 111 n.queue=[];t=b.createElement(e);t.async=!0; 112 t.src=v;s=b.getElementsByTagName(e)[0]; 113 s.parentNode.insertBefore(t,s)}(window, document,'script', 114 'https://connect.facebook.net/en_US/fbevents.js'); 115 fbq('init', '
1151590921822052039
vendor: 40 bytes, lines 115-117
115'); 116 fbq('track', 'PageView'); 117
117} 118 119 // Load after LCP or idle, whichever comes first 120 if ('requestIdleCallback' in window) { 121 requestIdleCallback(loadFBPixel, { timeout: 2000 }); 122 } else if (document.readyState === 'complete') { 123 setTimeout(loadFBPixel, 1000); 124 } else { 125 window.addEventListener('load', function() { 126 setTimeout(loadFBPixel, 1000); 127 }); 128 } 129 })(); 130 </script>
130 131 <noscript><img height="1" width="1" style="display:none" 132 src="https://www.facebook.com/tr?id=1590921822052039&ev=PageView&noscript=1" 133 /></noscript> 134 <!-- End Meta Pixel Code --> 135
135<script type="application/ld+json"> 136{ 137 "@context": "https://schema.org", 138 "@type": "ProfessionalService", 139 "name": "ROI Genius", 140 "description": "Ai-driven marketing funnels for tree service businesses", 141 "url": "https://roi-genius.ai", 142 "logo": "https://roi-genius.ai/images/Caption--Logo.png", 143 "serviceType": "Digital Marketing Services", 144 "areaServed": { 145 "@type": "Country", 146 "name": "United States" 147 }, 148 "aggregateRating": { 149 "@type": "AggregateRating", 150 "ratingValue": "4.8", 151 "reviewCount": "78" 152 } 153} 154</script>
154 155</head> 156<body class="body black"> 157 <a href="#main-content" class="skip-link">Skip to main content</a> 158 <div class="header1 sticky"> 159 <div class="header"> 160 <div class="div-block-27"> 161 <div class="div-block-30"><picture><source srcset="images/Duck-Logo-100x100.webp" type="image/webp"><img src="images/Duck-Logo.png" loading="eager" fetchpriority="high" alt="ROI Genius logo" width="50" height="50" class="logo foot smaller"></picture> 162 <h4>ROI-GENIUS.AI</h4> 163 </div> 164 </div> 165 <a href="https://form.typeform.com/to/XpyDwezT" class="button head w-button">Book A FREE Strategy Call</a> 166 </div> 167 </div> 168 <div id="main-content" class="container top"> 169 <div class="bubble-div"> 170 <div class="tag red weirdsize nomarg"><strong>2 Spots Left This <span id="current-month">Month</span></strong></div> 171 </div> 172
172<script> 173 (function() { 174 var el = document.getElementById('current-month'); 175 if (el) el.textContent = new Date().toLocaleString('en-US', { month: 'long' }); 176 })(); 177 </script>
177 178 <h1>Watch How <span class="green"><span class="countup green" data-to="78">78</span> Tree Service Owners</span> Scaled Past <span class="green">$<span class="countup green" data-to="750">750</span>k A Year</span> (What Actually Works)</h1> 179 <div class="paragraph sub">(and why we can only take on 4 new Clients per month)<br></div> 180 <div class="embediv"> 181 <div class="mux w-embed w-script"> 182 <div class="video-wrapper"> 183 <mux-player id="muxPlayer" playback-id="FKtVGCJRjf4lc9tSXIISd5slw3Tumb01JMmuyOX91s7s" stream-type="on-demand" autoplay="" muted="" playsinline="" preload="metadata" fetchpriority="high" accent-color="#1dbf38" style="width: 100%; border: none; aspect-ratio: 16/9;" controls="" poster="https://image.mux.com/FKtVGCJRjf4lc9tSXIISd5slw3Tumb01JMmuyOX91s7s/thumbnail.webp?width=768" data-hero-poster="true"> 184 </mux-player> 185 <div id="unmuteOverlay" class="unmute-overlay" role="button" tabindex="0" aria-label="Click for sound"> 186 <div class="overlay-background"></div> 187 <div class="overlay-content"> 188 <svg viewBox="0 0 24 24" class="speaker-icon" aria-hidden="true" fill="currentColor"> 189 <!-- Speaker cone --> 190 <path d="M3 9v6h4l5 5V4L7 9H3z"></path> 191 <!-- Animated sound bars --> 192 <rect x="14" y="10" width="2" height="4" class="sound-bar bar-1"></rect> 193 <rect x="17" y="8" width="2" height="8" class="sound-bar bar-2"></rect> 194 <rect x="20" y="6" width="2" height="12" class="sound-bar bar-3"></rect> 195 </svg> 196 <p class="overlay-text">Click for Sound</p> 197 </div> 198 </div> 199 </div> 200 <style> 201/* --- Keep rounding + clipping, but remove any background from the embed itself --- */ 202.video-wrapper { 203 position: relative; 204 width: 100%; 205 line-height: 0; /* removes baseline gap */ 206 border-radius: 20px; 207 overflow: hidden; 208 background: transparent; /* â¬ ï¸ embed has NO bg */ 209 cursor: pointer; 210} 211/* Make the player clip to radius (Shadow DOM-safe) + NO bg */ 212.video-wrapper mux-player { 213 display: block; 214 border-radius: 20px !important; 215 overflow: hidden !important; 216 background: transparent !important; /* â¬ ï¸ embed has NO bg */ 217} 218/* Clip internal Mux surfaces (only affects video/poster, still NO bg) */ 219.video-wrapper mux-player::part(container), 220.video-wrapper mux-player::part(video), 221.video-wrapper mux-player::part(poster) { 222 border-radius: 20px !important; 223 overflow: hidden !important; 224 background: transparent !important; 225} 226/* Overlay covers entire video wrapper - clicking anywhere unmutes */ 227/* CLS Fix: Ensure overlay never affects document flow - always positioned, use opacity/visibility only */ 228.unmute-overlay { 229 position: absolute; 230 inset: 0; 231 display: flex; 232 align-items: flex-start; 233 justify-content: flex-start; 234 z-index: 1000 !important; 235 cursor: pointer; 236 outline: none; 237 box-shadow: none; 238 pointer-events: auto !important; 239 /* CLS Fix: Always present in layout, use opacity/visibility to show/hide */ 240 /* Note: !important removed to allow JavaScript to control visibility */ 241 visibility: visible; 242 opacity: 1; 243 /* Prevent any layout shifts */ 244 contain: layout style paint; 245 will-change: opacity; 246} 247.overlay-background { 248 position: absolute; 249 inset: 0; 250 /* Prevent layout impact */ 251 contain: strict; 252} 253.overlay-content { 254 position: absolute; 255 /* CLS Fix: Use absolute positioning with fixed dimensions to prevent layout shifts */ 256 top: 20px; 257 left: 20px; 258 display: flex; 259 align-items: center; 260 justify-content: center; 261 gap: 12px; 262 z-index: 1; 263 color: #ffffff; 264 width: 236px; 265 height: 68px; 266 /* Remove margin to prevent shifts, use absolute positioning instead */ 267 margin: 0; 268 border-radius: 10px; 269 background-color: rgba(23, 23, 23, 0.5); 270 border: 4px solid rgba(255, 255, 255, 0.5); 271 outline: none; 272 box-shadow: none; 273 filter: none; 274 /* Prevent layout shifts */ 275 contain: layout style paint; 276 /* Pre-allocate space to prevent font loading shifts */ 277 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; 278 font-size: 21px; 279 font-weight: 700; 280 line-height: 1; 281} 282.speaker-icon { 283 width: 30px; 284 height: 30px; 285 flex-shrink: 0; 286} 287.sound-bar { 288 opacity: 0; 289} 290.bar-1 { 291 animation: bar1 2s ease-in-out infinite; 292} 293.bar-2 { 294 animation: bar2 2s ease-in-out infinite; 295} 296.bar-3 { 297 display: none; /* Hide third bar, only show 2 bars max */ 298} 299@keyframes bar1 { 300 0%, 100% { opacity: 0; } 301 10%, 80% { opacity: 1; } 302} 303@keyframes bar2 { 304 0%, 40% { opacity: 0; } 305 50%, 80% { opacity: 1; } 306 90%, 100% { opacity: 0; } 307} 308.overlay-text { 309 font-size: 21px; 310 font-weight: 700; 311 line-height: 1; 312 margin: 0; 313 color: #ffffff; 314 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; 315} 316/* Tablet + Mobile */ 317@media (max-width: 991px) { 318 .overlay-content { 319 width: 210px; 320 height: 60px; 321 /* CLS Fix: Use absolute positioning instead of margin */ 322 top: 15px; 323 left: 15px; 324 margin: 0; 325 font-size: 13px; 326 } 327 .overlay-text { 328 font-size: 13px; 329 } 330 .speaker-icon { 331 width: 22px; 332 height: 22px; 333 } 334} 335</style> 336
336<script> 337(function () { 338 // Wait for Mux player custom element to be defined 339 function initVideoPlayer() { 340 const player = document.getElementById('muxPlayer'); 341 const overlay = document.getElementById('unmuteOverlay'); 342 343 if (!player || !overlay) { 344 // Retry if elements not ready yet 345 if (document.readyState === 'loading') { 346 document.addEventListener('DOMContentLoaded', initVideoPlayer); 347 return; 348 } 349 setTimeout(initVideoPlayer, 100); 350 return; 351 } 352 353 // Check if mux-player custom element is defined 354 if (customElements.get('mux-player')) { 355 setupVideoPlayer(player, overlay); 356 } else { 357 // Wait for custom element to be defined 358 customElements.whenDefined('mux-player').then(() => { 359 setupVideoPlayer(player, overlay); 360 }); 361 } 362 } 363 364 function setupVideoPlayer(player, overlay) { 365 366 // Debug logging removed for production performance 367 368 // Check if user prefers reduced motion - defer to avoid blocking 369 let prefersReducedMotion = false; 370 if (window.matchMedia) { 371 try { 372 prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 373 } catch(e) {} 374 } 375 376 // Function to update overlay visibility based on muted state 377 // CLS Fix: Never change display property, only use opacity/visibility to prevent layout shifts 378 function updateOverlayVisibility() { 379 // Check both the muted property and the muted attribute (for reliability) 380 const isMuted = player.muted !== false && (player.hasAttribute('muted') || player.muted === true); 381 const shouldShow = isMuted; 382 383 if (shouldShow) { 384 // CLS Fix: Always keep display: flex, only change opacity/visibility 385 overlay.style.display = 'flex'; 386 overlay.style.visibility = 'visible'; 387 overlay.style.opacity = '1'; 388 overlay.style.pointerEvents = 'auto'; 389 } else { 390 // CLS Fix: Hide using opacity/visibility, keep display to prevent reflow 391 overlay.style.opacity = '0'; 392 overlay.style.visibility = 'hidden'; 393 overlay.style.pointerEvents = 'none'; 394 } 395 // Debug logging removed for production performance 396 } 397 398 // Show overlay by default (video starts muted per HTML attribute) 399 // The overlay should be visible initially since video has muted="" attribute 400 // Use requestAnimationFrame to avoid blocking 401 if (window.requestAnimationFrame) { 402 requestAnimationFrame(function() { 403 overlay.style.display = 'flex'; 404 overlay.style.visibility = 'visible'; 405 overlay.style.opacity = '1'; 406 }); 407 } else { 408 overlay.style.display = 'flex'; 409 overlay.style.visibility = 'visible'; 410 overlay.style.opacity = '1'; 411 } 412 413 // Wait for player to be ready, then update visibility based on actual state 414 // Break up into smaller tasks to avoid blocking 415 function checkPlayerReady() { 416 if (player.readyState !== undefined) { 417 // Player might have a readyState 418 if (player.readyState >= 2) { 419 updateOverlayVisibility(); 420 } else { 421 player.addEventListener('loadedmetadata', () => { 422 updateOverlayVisibility(); 423 }, { once: true }); 424 } 425 } else { 426 // Fallback: wait a bit for player to initialize 427 setTimeout(() => { 428 updateOverlayVisibility(); 429 }, 500); 430 // Also check after a longer delay 431 setTimeout(() => { 432 updateOverlayVisibility(); 433 }, 1000); 434 } 435 } 436 437 // Defer player ready check 438 setTimeout(checkPlayerReady, 0); 439 440 if (prefersReducedMotion) { 441 player.removeAttribute('autoplay'); 442 overlay.style.display = 'flex'; 443 overlay.style.opacity = '1'; 444 overlay.style.visibility = 'visible'; 445 overlay.style.pointerEvents = 'auto'; 446 } 447 448 // Simplified: overlay covers entire video, clicking anywhere unmutes and restarts 449 overlay.addEventListener('click', (e) => { 450 // Only allow unmute-and-restart on first click - CLS Fix: Check opacity/visibility instead of display 451 if (overlay.style.opacity === '0' || overlay.style.visibility === 'hidden') return; 452 453 e.stopPropagation(); 454 e.preventDefault(); 455 456 // Mark that user has manually unmuted 457 userHasUnmuted = true; 458 459 // Restart video from beginning 460 player.currentTime = 0; 461 // Unmute the video 462 player.muted = false;
463 player.removeAttribute('muted'); 464 // Play the video 465 player.play().catch(() => {}); // Suppress non-critical errors 466 // Hide overlay immediately - CLS Fix: Use opacity/visibility instead of display 467 overlay.style.opacity = '0'; 468 overlay.style.visibility = 'hidden'; 469 overlay.style.pointerEvents = 'none'; 470 overlay.style.display = 'flex'; // Keep display for CLS, but hidden via opacity/visibility 471 }); 472 473 overlay.addEventListener('keydown', (e) => { 474 if (e.key === 'Enter' || e.key === ' ') { 475 e.preventDefault(); 476 // CLS Fix: Check opacity/visibility instead of display 477 if (overlay.style.opacity === '0' || overlay.style.visibility === 'hidden') return; 478 479 // Mark that user has manually unmuted 480 userHasUnmuted = true; 481 482 // Restart video from beginning 483 player.currentTime = 0; 484 // Unmute the video 485 player.muted = false; 486 player.removeAttribute('muted'); 487 // Play the video 488 player.play().catch(() => {}); // Suppress non-critical errors 489 // Hide overlay immediately - CLS Fix: Use opacity/visibility instead of display 490 overlay.style.opacity = '0'; 491 overlay.style.visibility = 'hidden'; 492 overlay.style.pointerEvents = 'none'; 493 overlay.style.display = 'flex'; // Keep display for CLS, but hidden via opacity/visibility 494 } 495 }); 496 497 // Update overlay visibility when volume changes 498 // But don't re-show if user has already clicked to unmute 499 let userHasUnmuted = false; 500 player.addEventListener('volumechange', () => { 501 // Only update if user hasn't manually unmuted 502 if (!userHasUnmuted) { 503 updateOverlayVisibility(); 504 } 505 }); 506 507 508 // Error handling - only show UI for critical errors, suppress console output 509 player.addEventListener('error', (e) => { 510 // Suppress console errors for non-critical MediaErrors 511 const container = player.closest('.embediv, .mux'); 512 if (container) { 513 container.innerHTML = '<p style="padding: 2rem; text-align: center; color: #fff;">Video temporarily unavailable. <a href="https://form.typeform.com/to/XpyDwezT" style="color: #31fe6c;">Contact us</a> to learn more.</p>'; 514 } 515 }); 516 } 517 518 // Start initialization - use small delay to ensure elements exist but don't block too long 519 // Reduced timeout to ensure event listeners are attached quickly 520 if (document.readyState === 'loading') { 521 document.addEventListener('DOMContentLoaded', function() { 522 setTimeout(initVideoPlayer, 50); 523 }); 524 } else { 525 // DOM ready, initialize quickly 526 setTimeout(initVideoPlayer, 50); 527 } 528})(); 529</script>
529 530 </div> 531 </div> 532 <a href="https://form.typeform.com/to/XpyDwezT" class="button w-button">Book A FREE Strategy Call</a> 533 </div> 534 <div class="container"> 535 <h2 class="_48">Average Tree Client Results</h2> 536 <div class="w-layout-grid grid-3"> 537 <div class="div-block-28"> 538 <div class="paragraph"><strong><em>How Andrew went from 4 estimates a week to doing 8 estimates per day</em></strong></div> 539 <div class="testimony w-embed"><mux-player playback-id="SRCeZoZwqoJ9mstkHPJfr3Wh5I02bXKUb2FR6yCKuDn8" stream-type="on-demand" controls="" preload="none" loading="lazy" accent-color="#1dbf38" style="width: 100%; border: none; aspect-ratio: 16/9;" data-playback-id="SRCeZoZwqoJ9mstkHPJfr3Wh5I02bXKUb2FR6yCKuDn8" data-poster-width-mobile="320" data-poster-width-desktop="480"></mux-player></div> 540 <div class="paragraph location">Mobile, AL</div> 541 </div> 542 <div class="div-block-28"> 543 <div class="paragraph"><strong><em>How Ronnie owner of Tree Rangers closed $182K in his first month using our system</em></strong></div> 544 <div class="testimony w-embed"><mux-player playback-id="wKjTT02MYpj5RBpUle5Q7Ef843FRgbSL8AXfMJf3ftm00" stream-type="on-demand" controls="" preload="none" loading="lazy" accent-color="#1dbf38" style="width: 100%; border: none; aspect-ratio: 16/9;" data-playback-id="wKjTT02MYpj5RBpUle5Q7Ef843FRgbSL8AXfMJf3ftm00" data-poster-width-mobile="320" data-poster-width-desktop="480"></mux-player></div> 545 <div class="paragraph location">Saint Petersburg, FL</div> 546 </div> 547 <div class="div-block-28"> 548 <div class="paragraph"><strong><em>How Mikey increased his sales by 41% within his first 40 days</em></strong></div> 549 <div class="testimony w-embed"><mux-player playback-id="BHbIZanzttSoAK301UCveqnmcernoQ2vCjIzewq00Aciw" stream-type="on-demand" controls="" preload="none" loading="lazy" accent-color="#1dbf38" style="width: 100%; border: none; aspect-ratio: 16/9;" data-playback-id="BHbIZanzttSoAK301UCveqnmcernoQ2vCjIzewq00Aciw" data-poster-width-mobile="320" data-poster-width-desktop="480"></mux-player></div> 550 <div class="paragraph location">Hernando County, FL</div> 551 </div> 552 <div class="div-block-28"> 553 <div class="paragraph"><strong><em>How Brandyn went from $15,000 a month to closing $60,000 in his first 14 days</em></strong></div> 554 <div class="testimony w-embed"><mux-player playback-id="8CoQf7hnYN64tNHbcVkeZy8QkguCxYzhtzQDtfjsavw" stream-type="on-demand" controls="" preload="none" loading="lazy" accent-color="#1dbf38" style="width: 100%; border: none; aspect-ratio: 16/9;" data-playback-id="8CoQf7hnYN64tNHbcVkeZy8QkguCxYzhtzQDtfjsavw" data-poster-width-mobile="320" data-poster-width-desktop="480"></mux-player></div> 555 <div class="paragraph location">Evansville, IN</div> 556 </div> 557 <div class="div-block-28"> 558 <div class="paragraph"><strong><em>How John went from $30k a month to $65k a month in 2 months</em></strong></div> 559 <div class="testimony w-embed"><mux-player playback-id="ENy01qcRib006sVVJcx802CLHxAG79VjKujoA79rjYb2i00" stream-type="on-demand" controls="" preload="none" loading="lazy" accent-color="#1dbf38" style="width: 100%; border: none; aspect-ratio: 16/9;" data-playback-id="ENy01qcRib006sVVJcx802CLHxAG79VjKujoA79rjYb2i00" data-poster-width-mobile="320" data-poster-width-desktop="480"></mux-player></div> 560 <div class="paragraph location">Choctaw County, AL</div> 561 </div> 562 <div class="div-block-28"> 563 <div class="paragraph"><strong><em>How Josh from Manning Outdoors made $4.5 million within his first year with us</em></strong></div> 564 <div class="testimony w-embed"><mux-player playback-id="16clImPSWDe6DooAb02D3SzYunZnG4LrKRGUChWMuEb00" stream-type="on-demand" controls="" preload="none" loading="lazy" accent-color="#1dbf38" style="width: 100%; border: none; aspect-ratio: 16/9;" data-playback-id="16clImPSWDe6DooAb02D3SzYunZnG4LrKRGUChWMuEb00" data-poster-width-mobile="320" data-poster-width-desktop="480"></mux-player></div> 565 <div class="paragraph location">Indianapolis, IN</div> 566 </div> 567 </div> 568 <a href="https://form.typeform.com/to/XpyDwezT" class="button grid w-button">Book A FREE Strategy Call</a> 569 </div> 570 <div class="footer"><picture><source srcset="images/Caption--Logo-220x91.webp" type="image/webp"><img src="images/Caption--Logo.png" loading="lazy" alt="Money actually does grow on trees!" width="220" height="91" class="logo foot head foot2"></picture> 571 <div class="footerdiv"> 572 <p>© 2026. All rights reserved.</p> 573 <a href="/terms-of-service" class="foot-link">Terms of Service</a> 574 <a href="/privacy-policy" class="foot-link">Privacy Policy</a> 575 </div> 576 </div> 577 <!-- Performance Optimization: Defer non-critical JavaScript to improve TBT and INP --> 578
578<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=6884d0006202816ee3f34324" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous" defer></script>
578 579
579<script src="js/revscaleco.js?v=2" type="text/javascript" defer></script>
579 580 <!-- Performance Optimization: Load mux-player script only when needed (after LCP/idle) --> 581
581<script> 582 // Defer mux-player script to reduce initial JS bundle and TBT 583 // CRITICAL: Do not load until after LCP to prevent blocking hero poster 584 (function() { 585 function loadMuxPlayer() { 586 var script = document.createElement('script'); 587 script.src = 'https://cdn.jsdelivr.net/npm/@mux/[email protected]/dist/mux-player.min.js'; 588 script.defer = true; 589 script.crossOrigin = 'anonymous'; 590 document.head.appendChild(script); 591 } 592 593 // Load after LCP/idle - do not block hero poster 594 // Use requestIdleCallback with fallback to ensure LCP completes first 595 if ('requestIdleCallback' in window) { 596 requestIdleCallback(loadMuxPlayer, { timeout: 3000 }); 597 } else { 598 // Fallback: wait for load event + delay to ensure LCP completes 599 window.addEventListener('load', function() { 600 setTimeout(loadMuxPlayer, 2000); 601 }); 602 } 603 })(); 604 </script>
604 605 <!-- Performance Optimization: Optimize Mux thumbnail images with responsive sizing --> 606 <!-- CRITICAL: Defer to prevent LCP request chaining - hero poster loads without waiting for this script --> 607
607<script src="js/mux-image-optimizer.js?v=2" type="text/javascript" defer></script>
607 608
608<script> 609// Lazy load testimonial videos - defer to reduce TBT 610(function() { 611 function initLazyVideos() { 612 if ('IntersectionObserver' in window) { 613 const videoObserver = new IntersectionObserver((entries) => { 614 entries.forEach(entry => { 615 if (entry.isIntersecting) { 616 const player = entry.target; 617 if (player.tagName === 'MUX-PLAYER') { 618 player.setAttribute('preload', 'auto'); 619 } 620 videoObserver.unobserve(player); 621 } 622 }); 623 }, { 624 rootMargin: '100px' 625 }); 626 627 // Observe all testimonial videos (not hero video) 628 document.querySelectorAll('.testimony mux-player').forEach(player => { 629 videoObserver.observe(player); 630 }); 631 } 632 } 633 634 // Defer initialization to reduce TBT 635 if ('requestIdleCallback' in window) { 636 requestIdleCallback(initLazyVideos, { timeout: 3000 }); 637 } else { 638 // Fallback: wait for DOM ready 639 if (document.readyState === 'loading') { 640 document.addEventListener('DOMContentLoaded', initLazyVideos); 641 } else { 642 setTimeout(initLazyVideos, 100); 643 } 644 } 645})(); 646</script>
646 647 <!-- YouTube-style tap-to-toggle: Mux Player only shows controls on a mobile tap 648 instead of toggling play/pause (muxinc/elements#703). Desktop keeps Mux's 649 native click-to-toggle, so we only handle 'touch' to avoid a double-toggle. --> 650
650<script> 651 (function () { 652 function enableTapToToggle(player) { 653 if (player.__tapToggle) return; 654 player.__tapToggle = true; 655 player.addEventListener('pointerup', function (e) { 656 if (e.pointerType !== 'touch') return; // desktop handled natively by Mux 657 if (typeof player.play !== 'function') return; // custom element not upgraded yet 658 var onControls = e.composedPath().some(function (el) { 659 return el.nodeType === 1 && el.matches && 660 el.matches('button, a, input, [role="slider"], media-control-bar, [part~="bottom"], [part~="button"]'); 661 }); 662 if (onControls) return; // let the controls handle their own taps 663 if (player.paused) { player.play().catch(function () {}); } else { player.pause(); } 664 }); 665 } 666 function initTapToToggle() { 667 document.querySelectorAll('mux-player').forEach(enableTapToToggle); 668 } 669 if (document.readyState === 'loading') { 670 document.addEventListener('DOMContentLoaded', initTapToToggle); 671 } else { 672 initTapToToggle(); 673 } 674 })(); 675 </script>
675 676
676<script src="js/enhancements.js?v=2" type="text/javascript" defer></script>
676 677</body> 678</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.