PageSourceSearch

https://www.roi-genius.ai/

html roi-genius.ai collected 2026-10-05 14:42:25 UTC 31,820 bytes, 678 lines download raw bytes

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.