E-commerce SEO: Dominate 2026 Search Results

Listen to this article · 11 min listen

Key Takeaways

  • Conduct a thorough technical SEO audit annually, focusing on crawlability, indexability, and site speed metrics like Largest Contentful Paint (LCP) to maintain core web vital compliance.
  • Implement structured data markup using JSON-LD for product pages, including price, availability, and review snippets, to enhance search engine result page (SERP) visibility and click-through rates.
  • Prioritize mobile-first indexing by ensuring responsive design and optimizing images and scripts for rapid loading on mobile devices, as over 70% of e-commerce traffic originates from smartphones.
  • Develop a complete internal linking strategy that connects related product categories and high-authority pages, distributing link equity and improving user navigation.
  • Regularly analyze search console data for keyword performance, identifying new opportunities and addressing cannibalization issues to refine content and product descriptions.

Effective e-commerce SEO demands more than basic keyword placement. It requires a strategic, technical approach to boost online visibility and drive sales. The digital storefront of 2026 is a competitive arena, where subtle technical advantages translate into significant market share. How can online retailers ensure their product listings not only appear but dominate search results?

1. Conduct a Complete Technical SEO Audit

Before any content optimization begins, a deep dive into your site’s technical foundation is essential. I’ve seen countless retailers pour resources into product descriptions while their site’s underlying architecture actively hinders search engine crawling and indexing. Begin with a full audit using tools like Screaming Frog SEO Spider or Ahrefs Site Audit. Configure these tools to crawl your entire site, paying close attention to crawl depth and any blocked resources.

Specifically, look for HTTP status codes indicating errors (4xx, 5xx), duplicate content issues, and broken internal links. Your XML sitemap must be up-to-date and submitted to Google Search Console. We typically schedule these audits quarterly, but for sites with frequent product updates or significant structural changes, a monthly check is prudent. For example, ensure your robots.txt file isn’t inadvertently blocking critical product or category pages. A common mistake is blocking CSS or JavaScript files, which prevents search engines from fully rendering your pages, impacting their understanding of content and layout.

Pro Tip: Core Web Vitals are Non-Negotiable

Focus intensely on Core Web Vitals. Specifically, target a Largest Contentful Paint (LCP) under 2.5 seconds, a Cumulative Layout Shift (CLS) below 0.1, and a First Input Delay (FID) under 100 milliseconds. These metrics directly impact user experience and search rankings. Implement server-side rendering where possible, optimize image sizes using next-gen formats like WebP, and defer non-critical JavaScript to improve these scores.

2. Optimize Product Pages for Search Intent and Conversion

Product page optimization is the foundation of e-commerce SEO. Each product page should be a standalone sales funnel, designed to capture specific search intent. Start by researching keywords that align with each product. Don’t just target broad terms. Think long-tail phrases consumers use when they’re ready to buy. For instance, instead of “running shoes,” target “men’s waterproof trail running shoes size 10 for winter.”

Your product title ( tag) should include the primary keyword, brand name, and possibly a key attribute. The H1 tag on the page should closely mirror the title but can be slightly more descriptive. Craft unique, detailed product descriptions (at least 300 words) that answer potential customer questions, highlight benefits, and include relevant keywords naturally. Resist the urge to copy manufacturer descriptions. Search engines penalize duplicate content. Incorporate high-quality images and video, ensuring they are optimized for web (compressed, with descriptive alt text). For a retailer selling custom jewelry, alt text might be “sterling silver personalized initial necklace with sapphire pendant,” not just “necklace.”</p> <div class="common-mistakes"> <h3>Common Mistake: Neglecting User-Generated Content</h3> <p>Ignoring product reviews and Q&A sections is a significant oversight. User-generated content provides fresh, keyword-rich text that search engines love. It also builds trust and provides valuable social proof. Actively encourage customers to leave reviews and respond to questions directly on the product page. This content often contains natural language keywords that your internal team might miss.</p> </div> <h2 id="section-4">3. Implement Structured Data Markup</h2> <p>Structured data, specifically <a href="https://schema.org/Product" target="_blank" rel="noopener">Schema.org markup for products</a>, transforms your product pages into rich snippets in search results. This directly enhances <strong>online visibility</strong> by making your listings stand out with star ratings, price, availability, and sometimes even shipping information. We typically implement this using JSON-LD in the section of each product page.</p> <p>Key properties to include are <code>Product</code>, <code>Offer</code>, and <code>AggregateRating</code>. For a product, specify <code>name</code>, <code>description</code>, <code>image</code>, <code>sku</code>, and <code>brand</code>. Within <code>Offer</code>, detail <code>price</code>, <code>priceCurrency</code>, <code>availability</code> (e.g., <code>InStock</code>, <code>OutOfStock</code>), and <code>url</code>. If you have reviews, include <code>ratingValue</code> and <code>reviewCount</code> under <code>AggregateRating</code>. Use <a href="https://search.google.com/test/rich-results" target="_blank" rel="noopener">Google’s Rich Results Test</a> to validate your markup. Incorrect implementation can lead to warnings or your rich snippets not appearing at all. A recent client saw a 15% increase in click-through rates (CTR) for product pages after correctly implementing product structured data, primarily because their listings became far more visually appealing in the SERPs.</p> <h2 id="section-5">4. Develop a Strong Internal Linking Strategy</h2> <p>An effective internal linking structure is like a well-designed road network for both users and search engine crawlers. It helps distribute “link equity” throughout your site, signals the importance of certain pages, and improves user navigation. Map out your site’s hierarchy, ensuring your most important categories and product pages receive links from relevant, high-authority pages.</p> <p>Use descriptive anchor text that includes keywords. For example, instead of “click here,” use “explore our range of organic cotton bedding.” Link from blog posts to related products, from category pages to subcategories and top-selling products, and from product pages to complementary items or accessories. A “customers also bought” or “related products” section is not just for conversion. It’s a powerful internal linking opportunity. Avoid orphaned pages (pages with no internal links pointing to them) as they are harder for search engines to discover and crawl. We often use a tool like Semrush Site Audit to visualize internal link distribution and identify pages with low internal link counts.</p> <h2 id="section-6">5. Prioritize Mobile-First Indexing and Performance</h2> <p>Since 2019, mobile-first indexing has been the default for all new websites, and it’s increasingly critical for established sites. This means search engines primarily use the mobile version of your site for indexing and ranking. If your mobile experience is subpar, your rankings will suffer. Ensure your site is fully responsive, meaning it adapts smoothly to any screen size.</p> <p>Beyond responsiveness, focus on mobile performance. Test your site’s speed on mobile using <a href="https://pagespeed.web.dev/" target="_blank" rel="noopener">PageSpeed Insights</a>. Optimize images for mobile by serving appropriately sized versions, enable browser caching, and minify CSS and JavaScript files. Reduce server response times. A significant portion of e-commerce transactions now occurs on mobile devices. A slow or clunky mobile experience leads to high bounce rates and lost sales, regardless of how well your desktop site performs. Over 70% of e-commerce traffic originates from smartphones, according to a recent <a href="https://www.statista.com/statistics/1269829/mobile-commerce-share-global-retail-e-commerce/" target="_blank" rel="noopener">Statista report on mobile commerce share</a>, making this a critical area for investment.</p> <aside class="related-callout"><span class="related-callout-label">Related Reading</span><a href="https://growthleadersnews.com/scale-ups-ai-mini-stores-for-2026-growth/">Scale-Ups: AI Mini Stores for 2026 Growth</a></p> <p class="related-callout-excerpt">Explore how AI mini stores can drive significant growth for scale-ups by 2026, offering new avenues for e-commerce expansion.</p> </aside> <h2 id="section-7">6. Implement a Content Strategy Focused on Product Categories and Guides</h2> <p>Beyond individual product pages, a strong content strategy for your broader product categories and related informational guides significantly boosts <strong>online visibility</strong>. Think about the entire customer journey, not just the “buy now” phase. Create detailed category pages that aren’t just a list of products, but offer rich, keyword-optimized text explaining what the category entails, who it’s for, and what differentiates your offerings. These pages should be seen as landing pages in themselves, capable of ranking for broader, mid-funnel keywords.</p> <p>Plus, develop evergreen content like buying guides, how-to articles, and comparison charts that address common customer questions and problems. For a sporting goods retailer, this might be “How to Choose the Right Running Shoe” or “Guide to Winter Cycling Gear.” These articles attract users earlier in their research phase, establish your brand as an authority, and provide excellent opportunities for internal linking to relevant product pages. We often use tools like <a href="https://answerthepublic.com/" target="_blank" rel="noopener">AnswerThePublic</a> or the “People also ask” section of Google search results to uncover these informational queries.</p> <div class="pro-tips"> <h3>Pro Tip: Use Category Page Filtering</h3> <p>Ensure your category pages handle filtering and sorting parameters correctly. If different filter combinations create new URLs, make sure these are either canonicalized back to the main category page or, if they represent distinct user intent, are indexable. Faceted navigation can create massive amounts of duplicate content if not managed with careful use of canonical tags and robots.txt directives. The goal is to allow users to refine their search without diluting your SEO efforts for the core category page.</p> </div> <h2 id="section-8">7. Monitor and Adapt Using Analytics and Search Console</h2> <p>SEO is not a “set it and forget it” endeavor. Continuous monitoring and adaptation are paramount. Regularly analyze your performance data in <a href="https://analytics.google.com/analytics/web/" target="_blank" rel="noopener">Google Analytics 4 (GA4)</a> and Google Search Console. In GA4, focus on conversion rates by traffic source, user behavior flows, and engagement metrics for your key landing pages. Identify which product categories or pages are underperforming and investigate why.</p> <p>Search Console is invaluable for understanding how search engines see your site. Monitor your “Performance” report for keyword rankings, impressions, and CTR. Look for “Coverage” errors that indicate indexing issues. The “Core Web Vitals” report directly shows your site’s performance against Google’s key metrics. Plus, use the “Enhancements” section to check the health of your structured data. If you see a sudden drop in rankings for a specific product, check for new competitors, technical errors, or algorithm updates. Being proactive with data analysis allows for rapid adjustments to your strategy.</p> <div class="common-mistakes"> <h3>Common Mistake: Ignoring Search Query Data</h3> <p>Many retailers fail to fully use the “Search results” report in Google Search Console. This report shows the actual queries people are using to find your site. Analyze these queries for unexpected keywords that are driving traffic, identify new long-tail opportunities, and spot instances of keyword cannibalization where multiple pages are competing for the same terms. This data is a goldmine for refining your content strategy and identifying gaps.</p> </div> <p>Mastering e-commerce SEO means building a resilient online presence that adapts to algorithm changes and user behavior. By systematically implementing these advanced tactics, online retailers can significantly enhance their <strong>online visibility</strong>, attract more qualified traffic, and in the end convert more browsers into buyers. For instance, understanding <a href="https://growthleadersnews.com/ai-content-personalization-2026-imperatives/">AI content personalization imperatives</a> can further refine how product descriptions and category pages are tailored to individual users, boosting engagement and conversion. Also, avoiding <a href="https://growthleadersnews.com/marketing-ai-skills-gap-2026-crisis-for-leaders/">the marketing AI skills gap</a> is important for teams to effectively use advanced SEO tools and strategies. It’s about creating a search-friendly experience that also delights the customer, and for those looking to expand, considering <a href="https://growthleadersnews.com/emerging-markets-your-2026-global-expansion-playbook/">emerging markets for global expansion</a> can open new avenues for growth.</p> <div class="faq-section"> <div class="faq-item"> <h3 class="faq-question">What is the most critical factor for e-commerce SEO in 2026?</h3> <div class="faq-answer"> <p>The most critical factor is a combination of technical excellence (especially Core Web Vitals and mobile performance) and deeply understanding user search intent for every product and category. Without a solid technical foundation, even the best content struggles to rank.</p> </div> </div> <div class="faq-item"> <h3 class="faq-question">How often should I update product descriptions for SEO?</h3> <div class="faq-answer"> <p>Product descriptions should be updated whenever there are significant product changes, new features, or when you identify new relevant keywords through search console data. A complete review every 6-12 months is a good general practice, even for static products.</p> </div> </div> <div class="faq-item"> <h3 class="faq-question">Can too much internal linking be harmful?</h3> <div class="faq-answer"> <p>While internal linking is beneficial, excessive or irrelevant internal links can dilute link equity and make pages appear spammy. Focus on contextual, relevant links that genuinely help users navigate and provide value. Quality over quantity always applies.</p> </div> </div> <div class="faq-item"> <h3 class="faq-question">Is it necessary to use structured data for every product?</h3> <div class="faq-answer"> <p>Yes, implementing structured data for every product page is highly recommended. It enhances your appearance in search results, increasing click-through rates and making your offerings more appealing to potential customers. It’s a clear signal to search engines about the content on your page.</p> </div> </div> <div class="faq-item"> <h3 class="faq-question">What’s the immediate impact of improving Core Web Vitals?</h3> <div class="faq-answer"> <p>Improving Core Web Vitals directly leads to a better user experience, which search engines reward. You can expect to see lower bounce rates, higher engagement, and potentially improved rankings over time, especially for competitive keywords. Faster sites simply perform better across the board.</p> </div> </div> </div> </div> <div class="share-buttons"> <span class="share-label">Share:</span> <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F" class="share-btn facebook" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"> <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18 2h-3a5 5 0 00-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 011-1h3z"/></svg> <span>Facebook</span> </a> <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F&text=E-commerce+SEO%3A+Dominate+2026+Search+Results" class="share-btn twitter" target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"> <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg> <span>Twitter</span> </a> <a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F&media=https%3A%2F%2Fgrowthleadersnews.com%2Fwp-content%2Fuploads%2Fsites%2F24%2F2026%2F08%2Fb2b-seo-2026-content-pillars-for-page-1-wins-featured.webp&description=E-commerce+SEO%3A+Dominate+2026+Search+Results" class="share-btn pinterest" target="_blank" rel="noopener noreferrer" aria-label="Share on Pinterest"> <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.373 0 0 5.372 0 12c0 5.084 3.163 9.426 7.627 11.174-.105-.949-.2-2.405.042-3.441.218-.937 1.407-5.965 1.407-5.965s-.359-.719-.359-1.782c0-1.668.967-2.914 2.171-2.914 1.023 0 1.518.769 1.518 1.69 0 1.029-.655 2.568-.994 3.995-.283 1.194.599 2.169 1.777 2.169 2.133 0 3.772-2.249 3.772-5.495 0-2.873-2.064-4.882-5.012-4.882-3.414 0-5.418 2.561-5.418 5.207 0 1.031.397 2.138.893 2.738a.36.36 0 01.083.345l-.333 1.36c-.053.22-.174.267-.402.161-1.499-.698-2.436-2.889-2.436-4.649 0-3.785 2.75-7.262 7.929-7.262 4.163 0 7.398 2.967 7.398 6.931 0 4.136-2.607 7.464-6.227 7.464-1.216 0-2.359-.632-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12 24c6.627 0 12-5.373 12-12 0-6.628-5.373-12-12-12z"/></svg> <span>Pinterest</span> </a> <a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F&title=E-commerce+SEO%3A+Dominate+2026+Search+Results" class="share-btn linkedin" target="_blank" rel="noopener noreferrer" aria-label="Share on LinkedIn"> <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M16 8a6 6 0 016 6v7h-4v-7a2 2 0 00-2-2 2 2 0 00-2 2v7h-4v-7a6 6 0 016-6zM2 9h4v12H2zM4 6a2 2 0 100-4 2 2 0 000 4z"/></svg> <span>LinkedIn</span> </a> <button class="share-btn copy-link" onclick="navigator.clipboard.writeText('https://growthleadersnews.com/e-commerce-seo-dominate-2026-search-results/').then(function(){this.querySelector('span').textContent='Copied!'}.bind(this))"> <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71"/><path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/><path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg> <span>Copy Link</span> </button> </div> <div class="article-feedback" id="article-feedback"> <span class="feedback-question">Was this article helpful?</span> <button class="feedback-btn feedback-yes" data-vote="yes" aria-label="Yes"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 9V5a3 3 0 00-3-3l-4 9v11h11.28a2 2 0 002-1.7l1.38-9a2 2 0 00-2-2.3H14z"/><path d="M7 22H4a2 2 0 01-2-2v-7a2 2 0 012-2h3"/></svg> Yes </button> <button class="feedback-btn feedback-no" data-vote="no" aria-label="No"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10 15v4a3 3 0 003 3l4-9V2H5.72a2 2 0 00-2 1.7l-1.38 9a2 2 0 002 2.3H10z"/><path d="M17 2h2.67A2.31 2.31 0 0122 4v7a2.31 2.31 0 01-2.33 2H17"/></svg> No </button> </div> <script> (function(){ var fb = document.getElementById('article-feedback'); if(!fb) return; fb.querySelectorAll('.feedback-btn').forEach(function(btn){ btn.addEventListener('click', function(){ var vote = this.dataset.vote; fetch('/wp-json/satellite/v1/feedback', { method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({post_id:16281,vote:vote}) }); fb.innerHTML = '<span class="feedback-thanks">Thanks for your feedback!</span>'; }); }); })(); </script> <div class="author-bio"> <div class="author-bio-avatar"> <img fetchpriority="low" loading="lazy" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png 2x' class='avatar avatar-72 photo' height='72' width='72' decoding='async'/> </div> <div class="author-bio-info"> <h4 class="author-bio-name"> <a href="https://growthleadersnews.com/author/growthleavachen/"> Arthur Greene </a> </h4> <span class="author-bio-title">Senior Director of Marketing Innovation</span> <span class="author-bio-credentials">Certified Marketing Management Professional (CMMP)</span> <p class="author-bio-description">Arthur Greene is a seasoned Marketing Strategist with over a decade of experience driving growth for both Fortune 500 companies and innovative startups. She currently serves as the Senior Director of Marketing Innovation at Stellaris Group, where she leads a team focused on developing cutting-edge marketing solutions. Prior to Stellaris, Arthur spent several years at OmniCorp Solutions, spearheading their digital transformation initiatives. Her expertise lies in leveraging data-driven insights to create impactful campaigns that resonate with target audiences. Notably, Arthur led the team that increased Stellaris Group's market share by 15% in a single fiscal year.</p> <div class="author-bio-links"> <a href="https://www.ama.org" target="_blank" rel="noopener noreferrer" class="author-link-badge"> Credentials </a> <span class="author-experience">12+ years experience</span> </div> </div> </div> </div> <aside class="single-post-sidebar"> <div class="sidebar-sticky"> <div class="sidebar-share"> <span class="sidebar-share-label">Share</span> <div class="sidebar-share-icons"> <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F" target="_blank" rel="noopener noreferrer" class="sidebar-share-icon facebook" aria-label="Facebook"> <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M18 2h-3a5 5 0 00-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 011-1h3z"/></svg> </a> <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F&text=E-commerce+SEO%3A+Dominate+2026+Search+Results" target="_blank" rel="noopener noreferrer" class="sidebar-share-icon twitter" aria-label="Twitter"> <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg> </a> <a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F&description=E-commerce+SEO%3A+Dominate+2026+Search+Results" target="_blank" rel="noopener noreferrer" class="sidebar-share-icon pinterest" aria-label="Pinterest"> <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.373 0 0 5.372 0 12c0 5.084 3.163 9.426 7.627 11.174-.105-.949-.2-2.405.042-3.441.218-.937 1.407-5.965 1.407-5.965s-.359-.719-.359-1.782c0-1.668.967-2.914 2.171-2.914 1.023 0 1.518.769 1.518 1.69 0 1.029-.655 2.568-.994 3.995-.283 1.194.599 2.169 1.777 2.169 2.133 0 3.772-2.249 3.772-5.495 0-2.873-2.064-4.882-5.012-4.882-3.414 0-5.418 2.561-5.418 5.207 0 1.031.397 2.138.893 2.738a.36.36 0 01.083.345l-.333 1.36c-.053.22-.174.267-.402.161-1.499-.698-2.436-2.889-2.436-4.649 0-3.785 2.75-7.262 7.929-7.262 4.163 0 7.398 2.967 7.398 6.931 0 4.136-2.607 7.464-6.227 7.464-1.216 0-2.359-.632-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12 24c6.627 0 12-5.373 12-12 0-6.628-5.373-12-12-12z"/></svg> </a> <a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fgrowthleadersnews.com%2Fe-commerce-seo-dominate-2026-search-results%2F&title=E-commerce+SEO%3A+Dominate+2026+Search+Results" target="_blank" rel="noopener noreferrer" class="sidebar-share-icon linkedin" aria-label="LinkedIn"> <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M16 8a6 6 0 016 6v7h-4v-7a2 2 0 00-2-2 2 2 0 00-2 2v7h-4v-7a6 6 0 016-6zM2 9h4v12H2zM4 6a2 2 0 100-4 2 2 0 000 4z"/></svg> </a> </div> </div> <div class="sidebar-top-posts"> <h3 class="sidebar-section-title">Top Posts</h3> <a href="https://growthleadersnews.com/analytical-marketing-roi-driven-case-studies-in-2026/" class="sidebar-post-card"> <div class="sidebar-post-thumb"> <img width="300" height="200" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured-300x200.webp?v=1773934633" class="attachment-satellite-thumb size-satellite-thumb wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured-300x200.webp?v=1773934633 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured-600x400.webp?v=1773934633 600w" sizes="auto, (max-width: 300px) 100vw, 300px" /> </div> <div class="sidebar-post-info"> <h4 class="sidebar-post-title">Analytical Marketing: ROI-Driven Case Studies in 2026</h4> <div class="sidebar-post-meta"> <time datetime="2026-03-19T15:37:13+00:00">19/03/2026</time> <span class="sidebar-post-views">435 Views</span> </div> </div> </a> <a href="https://growthleadersnews.com/growth-leader-2026s-top-marketing-strategies/" class="sidebar-post-card"> <div class="sidebar-post-thumb"> <img width="300" height="200" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured-300x200.webp?v=1774013854" class="attachment-satellite-thumb size-satellite-thumb wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured-300x200.webp?v=1774013854 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured-600x400.webp?v=1774013854 600w" sizes="auto, (max-width: 300px) 100vw, 300px" /> </div> <div class="sidebar-post-info"> <h4 class="sidebar-post-title">Growth Leader: 2026’s Top Marketing Strategies</h4> <div class="sidebar-post-meta"> <time datetime="2026-03-20T13:37:34+00:00">20/03/2026</time> <span class="sidebar-post-views">415 Views</span> </div> </div> </a> <a href="https://growthleadersnews.com/marketing-directors-your-2026-guide-to-success/" class="sidebar-post-card"> <div class="sidebar-post-thumb"> <img width="300" height="200" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/marketing-directors-your-2026-guide-to-success-featured-300x200.webp?v=1773910465" class="attachment-satellite-thumb size-satellite-thumb wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/marketing-directors-your-2026-guide-to-success-featured-300x200.webp?v=1773910465 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/marketing-directors-your-2026-guide-to-success-featured-600x400.webp?v=1773910465 600w" sizes="auto, (max-width: 300px) 100vw, 300px" /> </div> <div class="sidebar-post-info"> <h4 class="sidebar-post-title">Marketing Directors: Your 2026 Guide to Success</h4> <div class="sidebar-post-meta"> <time datetime="2026-03-19T08:54:25+00:00">19/03/2026</time> <span class="sidebar-post-views">392 Views</span> </div> </div> </a> </div> </div> </aside> </div> <nav class="post-navigation"> <a href="https://growthleadersnews.com/airport-infrastructure-2026-vision-for-stakeholder/" class="post-nav-link prev"> <div class="post-nav-label">« Previous</div> <div class="post-nav-title">Airport Infrastructure: 2026 Vision for Stakeholder</div> </a> <a href="https://growthleadersnews.com/ai-marketing-27-content-velocity-boost-in-2026/" class="post-nav-link next"> <div class="post-nav-label">Next »</div> <div class="post-nav-title">AI Marketing: 27% Content Velocity Boost in 2026</div> </a> </nav> </article> <section class="related-posts"> <div class="section-header"> <h2 class="section-title">Related Articles</h2> <div class="carousel-nav"> <button class="carousel-btn carousel-prev" aria-label="Previous">‹</button> <button class="carousel-btn carousel-next" aria-label="Next">›</button> </div> </div> <div class="related-carousel" id="related-carousel"> <div class="carousel-track"> <article class="article-card"> <a href="https://growthleadersnews.com/ai-ad-targeting-privacy-vs-precision-in-2026/" class="article-card-image" aria-label="AI Ad Targeting: Privacy vs. Precision in 2026"> <img width="768" height="439" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/ai-ad-targeting-privacy-vs-precision-in-2026-featured-768x439.webp?v=1790915307" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/ai-ad-targeting-privacy-vs-precision-in-2026-featured-768x439.webp 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/ai-ad-targeting-privacy-vs-precision-in-2026-featured-300x171.webp 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/ai-ad-targeting-privacy-vs-precision-in-2026-featured-1024x585.webp 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/ai-ad-targeting-privacy-vs-precision-in-2026-featured.webp 1344w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/digital-marketing/" class="article-card-category" style="color:#9a3412"> Digital Marketing </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/ai-ad-targeting-privacy-vs-precision-in-2026/">AI Ad Targeting: Privacy vs. Precision in 2026</a> </h3> <p class="article-card-excerpt">Balance AI targeting with privacy. Learn 1st-party data tactics & P.E.T.s for 2026 compliance. Drive precision without compromising user trust.</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Arthur Greene</span> <span class="dot">·</span> <time datetime="2026-10-02T02:31:28+00:00">02/10/2026</time> <span class="dot">·</span> <span>8 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://growthleadersnews.com/iab-ad-spend-retail-media-dominates-2026/" class="article-card-image" aria-label="IAB Ad Spend: Retail Media Dominates 2026"> <img width="768" height="439" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/iab-ad-spend-retail-media-dominates-2026-featured-768x439.webp?v=1790902843" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/iab-ad-spend-retail-media-dominates-2026-featured-768x439.webp 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/iab-ad-spend-retail-media-dominates-2026-featured-300x171.webp 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/iab-ad-spend-retail-media-dominates-2026-featured-1024x585.webp 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/iab-ad-spend-retail-media-dominates-2026-featured.webp 1344w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/digital-marketing/" class="article-card-category" style="color:#9a3412"> Digital Marketing </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/iab-ad-spend-retail-media-dominates-2026/">IAB Ad Spend: Retail Media Dominates 2026</a> </h3> <p class="article-card-excerpt">2026 ad spend forecast: Retail media and CTV grow. Allocate 25-30% of your budget to these channels. Measure ROI with advanced attribution models.</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Arthur Greene</span> <span class="dot">·</span> <time datetime="2026-10-01T13:36:04+00:00">01/10/2026</time> <span class="dot">·</span> <span>7 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://growthleadersnews.com/analytical-marketing-roi-driven-case-studies-in-2026/" class="article-card-image" aria-label="Analytical Marketing: ROI-Driven Case Studies in 2026"> <img width="768" height="419" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured-768x419.webp?v=1773934633" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured-768x419.webp?v=1773934633 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured-300x164.webp?v=1773934633 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured-1024x559.webp?v=1773934633 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/analytical-marketing-roi-driven-case-studies-in-2026-featured.webp?v=1773934633 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/content-strategy/" class="article-card-category" style="color:#be185d"> Content Strategy </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/analytical-marketing-roi-driven-case-studies-in-2026/">Analytical Marketing: ROI-Driven Case Studies in 2026</a> </h3> <p class="article-card-excerpt">Listen to this article · 8 min listen1.0xAudio playback not supported in this browser.Leveraging Data for Marketing ROI: Analytical Case Studies In today’s competitive business environment, simply…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlejohnsmith-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlejohnsmith-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Alyssa Williams</span> <span class="dot">·</span> <time datetime="2026-03-19T15:37:13+00:00">19/03/2026</time> <span class="dot">·</span> <span>7 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://growthleadersnews.com/growth-leader-2026s-top-marketing-strategies/" class="article-card-image" aria-label="Growth Leader: 2026’s Top Marketing Strategies"> <img width="768" height="419" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured-768x419.webp?v=1774013853" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured-768x419.webp?v=1774013853 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured-300x164.webp?v=1774013853 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured-1024x559.webp?v=1774013853 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growth-leader-2026-s-top-marketing-strategies-featured.webp?v=1774013853 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/marketing-technology/" class="article-card-category" style="color:#334155"> Marketing Technology </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/growth-leader-2026s-top-marketing-strategies/">Growth Leader: 2026’s Top Marketing Strategies</a> </h3> <p class="article-card-excerpt">Listen to this article · 9 min listen1.0xAudio playback not supported in this browser.Are you an ambitious professional ready to transcend your current role and become a…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlejohnsmith-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlejohnsmith-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Alyssa Williams</span> <span class="dot">·</span> <time datetime="2026-03-20T13:37:34+00:00">20/03/2026</time> <span class="dot">·</span> <span>7 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://growthleadersnews.com/halloween-roi-15-conversions-in-2026/" class="article-card-image" aria-label="Halloween ROI: 15% Conversions in 2026"> <img width="768" height="439" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/08/content-roi-300k-revenue-from-75k-in-2026-featured-768x439.webp?v=1787992035" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/08/content-roi-300k-revenue-from-75k-in-2026-featured-768x439.webp 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/08/content-roi-300k-revenue-from-75k-in-2026-featured-300x171.webp 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/08/content-roi-300k-revenue-from-75k-in-2026-featured-1024x585.webp 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/08/content-roi-300k-revenue-from-75k-in-2026-featured.webp 1344w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/campaign-insights/" class="article-card-category" style="color:#b13a1d"> Campaign Insights </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/halloween-roi-15-conversions-in-2026/">Halloween ROI: 15% Conversions in 2026</a> </h3> <p class="article-card-excerpt">Boost Halloween ROI. Learn how interactive campaigns drive 15%+ conversions and 3x social engagement. Get tactics for Q4; see a 2025 AR case study.</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlehenryowen-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlehenryowen-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Ashlee Washington</span> <span class="dot">·</span> <time datetime="2026-10-02T06:11:28+00:00">02/10/2026</time> <span class="dot">·</span> <span>8 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://growthleadersnews.com/atlanta-real-estate-predictive-ai-wins-in-2026/" class="article-card-image" aria-label="Atlanta Real Estate: Predictive AI Wins in 2026"> <img width="768" height="439" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/atlanta-real-estate-predictive-ai-wins-in-2026-featured-768x439.webp?v=1790923168" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/atlanta-real-estate-predictive-ai-wins-in-2026-featured-768x439.webp 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/atlanta-real-estate-predictive-ai-wins-in-2026-featured-300x171.webp 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/atlanta-real-estate-predictive-ai-wins-in-2026-featured-1024x585.webp 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/10/atlanta-real-estate-predictive-ai-wins-in-2026-featured.webp 1344w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/marketing-technology/" class="article-card-category" style="color:#334155"> Marketing Technology </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/atlanta-real-estate-predictive-ai-wins-in-2026/">Atlanta Real Estate: Predictive AI Wins in 2026</a> </h3> <p class="article-card-excerpt">Boost Q1 sales: See how Sterling Properties used predictive AI to forecast Atlanta home sales 12 months out, identifying hot zones.</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlegracenguyen-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlegracenguyen-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Ashlee Sparks</span> <span class="dot">·</span> <time datetime="2026-10-02T05:26:29+00:00">02/10/2026</time> <span class="dot">·</span> <span>8 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://growthleadersnews.com/high-growth-leadership-spotting-tomorrows-talent/" class="article-card-image" aria-label="High-Growth Leadership: Spotting Tomorrow’s Talent"> <img width="768" height="419" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/04/high-growth-leadership-spotting-tomorrow-s-talent-featured-768x419.webp?v=1775494184" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/04/high-growth-leadership-spotting-tomorrow-s-talent-featured-768x419.webp?v=1775494184 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/04/high-growth-leadership-spotting-tomorrow-s-talent-featured-300x164.webp?v=1775494184 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/04/high-growth-leadership-spotting-tomorrow-s-talent-featured-1024x559.webp?v=1775494184 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/04/high-growth-leadership-spotting-tomorrow-s-talent-featured.webp?v=1775494184 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/customer-experience/" class="article-card-category" style="color:#4d7c0f"> Customer Experience </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/high-growth-leadership-spotting-tomorrows-talent/">High-Growth Leadership: Spotting Tomorrow’s Talent</a> </h3> <p class="article-card-excerpt">Listen to this article · 8 min listen1.0xAudio playback not supported in this browser.Why Invest in Aspiring Leaders at High-Growth Companies? High-growth companies are exciting places to…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlejohnsmith-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthlejohnsmith-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Alyssa Williams</span> <span class="dot">·</span> <time datetime="2026-04-06T07:09:57+00:00">06/04/2026</time> <span class="dot">·</span> <span>7 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://growthleadersnews.com/petal-and-stem-atlanta-growth-hacks-for-2026/" class="article-card-image" aria-label="Petal & Stem: Atlanta Growth Hacks for 2026"> <img width="768" height="419" src="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/05/ga4-in-2026-mastering-data-for-marketing-scale-featured-768x419.webp?v=1778604278" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://growthleadersnews.com/wp-content/uploads/sites/24/2026/05/ga4-in-2026-mastering-data-for-marketing-scale-featured-768x419.webp 768w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/05/ga4-in-2026-mastering-data-for-marketing-scale-featured-300x164.webp 300w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/05/ga4-in-2026-mastering-data-for-marketing-scale-featured-1024x559.webp 1024w, https://growthleadersnews.com/wp-content/uploads/sites/24/2026/05/ga4-in-2026-mastering-data-for-marketing-scale-featured.webp 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://growthleadersnews.com/category/digital-marketing/" class="article-card-category" style="color:#9a3412"> Digital Marketing </a> <h3 class="article-card-title"> <a href="https://growthleadersnews.com/petal-and-stem-atlanta-growth-hacks-for-2026/">Petal & Stem: Atlanta Growth Hacks for 2026</a> </h3> <p class="article-card-excerpt">Listen to this article · 9 min listen1.0xAudio playback not supported in this browser.Sarah adjusted her spectacles, the glow of her laptop screen reflecting in them. Her…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png' srcset='https://growthleadersnews.com/wp-content/uploads/sites/24/2026/03/growthleavachen-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Arthur Greene</span> <span class="dot">·</span> <time datetime="2026-06-29T19:19:11+00:00">29/06/2026</time> <span class="dot">·</span> <span>7 min read</span> </div> </div> </article> </div> </div> </section> <script> (function(){ var track = document.querySelector('.carousel-track'); if(!track) return; var prev = document.querySelector('.carousel-prev'); var next = document.querySelector('.carousel-next'); var cardW = track.querySelector('.article-card'); if(!cardW) return; var scrollAmt = cardW.offsetWidth + 24; if(prev) prev.addEventListener('click', function(){ track.scrollBy({left:-scrollAmt,behavior:'smooth'}); }); if(next) next.addEventListener('click', function(){ track.scrollBy({left:scrollAmt,behavior:'smooth'}); }); })(); </script> </main> </div> <div class="read-next-bar" id="read-next-bar"> <div class="read-next-inner"> <span class="read-next-label">Read Next</span> <a href="https://growthleadersnews.com/premium-lounges-iberia-s-2026-growth-strategy/" class="read-next-link"> Premium Lounges: Iberia’s 2026 Growth Strategy </a> <a href="https://growthleadersnews.com/premium-lounges-iberia-s-2026-growth-strategy/" class="read-next-cta" style="background:#9a3412"> → </a> </div> </div> <script> (function(){ var bar = document.getElementById('read-next-bar'); if(!bar) return; var shown = false; window.addEventListener('scroll', function(){ var doc = document.documentElement; var pct = (doc.scrollTop / (doc.scrollHeight - doc.clientHeight)) * 100; if (pct > 65 && !shown) { bar.classList.add('visible'); shown = true; } }, {passive:true}); bar.addEventListener('click', function(e){ if(e.target.classList.contains('read-next-close')) { bar.classList.remove('visible'); } }); })(); </script> </div><!-- .container --> <footer class="site-footer" role="contentinfo"> <div class="footer-main"> <div class="footer-col footer-about"> <div class="widget"> <h3 class="widget-title">Growth Leaders News</h3> <p>Expert insights, guides, and stories about marketing</p> <form class="newsletter-form satellite-newsletter-form" data-nl-source="footer"> <input type="email" name="email" required placeholder="Enter your email address" aria-label="Enter your email address" /> <button type="submit">Subscribe</button> </form> </div> </div> <div class="footer-col"> <div class="widget"> <h3 class="widget-title">Categories</h3> <ul> <li class="cat-item cat-item-24"><a href="https://growthleadersnews.com/category/campaign-insights/">Campaign Insights</a> </li> <li class="cat-item cat-item-19"><a href="https://growthleadersnews.com/category/content-strategy/">Content Strategy</a> </li> <li class="cat-item cat-item-21"><a href="https://growthleadersnews.com/category/customer-experience/">Customer Experience</a> </li> <li class="cat-item cat-item-18"><a href="https://growthleadersnews.com/category/digital-marketing/">Digital Marketing</a> </li> <li class="cat-item cat-item-25"><a href="https://growthleadersnews.com/category/expert-opinions/">Expert Opinions</a> </li> <li class="cat-item cat-item-20"><a href="https://growthleadersnews.com/category/marketing-analytics/">Marketing Analytics</a> </li> <li class="cat-item cat-item-23"><a href="https://growthleadersnews.com/category/marketing-technology/">Marketing Technology</a> </li> <li class="cat-item cat-item-22"><a href="https://growthleadersnews.com/category/social-media/">Social Media</a> </li> </ul> </div> </div> <div class="footer-col"> <div class="widget"> <h3 class="widget-title">Quick Links</h3> <ul> <li><a href="https://growthleadersnews.com/">Home</a></li> <li><a href="https://growthleadersnews.com/editorial-standards/">Editorial Standards</a></li> <li><a href="https://growthleadersnews.com/about/">About</a></li> <li><a href="https://growthleadersnews.com/contact/">Contact</a></li> <li><a href="https://growthleadersnews.com/privacy-policy/">Privacy Policy</a></li> <li><a href="https://growthleadersnews.com/terms-of-service/">Terms of Service</a></li> </ul> </div> </div> <div class="footer-col footer-col-authors"> <div class="widget"> <h3 class="widget-title">Our Authors</h3> <ul class="footer-authors-list" style="columns: 2; -webkit-columns: 2; -moz-columns: 2; column-gap: 1.5rem; padding-left: 0; list-style: none; margin: 0;"> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlegracenguyen/">Ashlee Sparks</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthleserenavaldez/">Diana Tapia</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthledevinchavez/">Devin Chavez</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlekianhawkins/">Kian Hawkins</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthleemilylee/">Arthur Schmidt</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlefrankmiller/">Ashlee Coffey</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlerohanpatel/">Diana Perez</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlejanedoe/">Alicia Romero</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlejaviermontoya/">Derrick Gonzalez</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlekeishadubois/">Desiree Sanchez</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthleniachen/">Derrick Lopez</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlekaikimura/">Diane Gonzales</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlejaviernguyen/">Dominique Blanchard</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlejohnsmith/">Alyssa Williams</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlemarcusokoro/">Devin Hayden</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlenikhilpatel/">Dillon Ramos</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlekeanuadebayo/">Diana Marshall</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlelenamwangi/">Diane Miller</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlebendavis/">Arthur Haynes</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlechloegarcia/">Arthur Ramirez</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlecassianzhou/">Diane Watson</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthledevonokoro/">Diamond Watts</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlerorychung/">Dillon Weaver</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthleavachen/">Arthur Greene</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthleanyasharma/">Devin Clark</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlejianli/">Desiree Diaz</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlemayavaldez/">Diane Houston</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlejamilaokonkwo/">Diane Adams</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthleseraphinanguyen/">Diana Foster</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://growthleadersnews.com/author/growthlesoniaramirez/">Desiree Stafford</a></li> </ul> </div> </div> </div> <div class="footer-bottom"> <div class="footer-bottom-inner"> <div class="footer-copyright"> © 2026 Growth Leaders News. All rights reserved. </div> <nav class="footer-nav" role="navigation"> <a href="https://growthleadersnews.com/unsubscribe/">Unsubscribe</a> </nav> </div> </div> </footer> <script id="sat-tts-script"> (function(){ if (!('speechSynthesis' in window) || !('SpeechSynthesisUtterance' in window)) { document.querySelectorAll('.sat-tts-player').forEach(function(el){ el.setAttribute('data-state', 'unsupported'); var t = el.querySelector('.sat-tts-title-text'); var i18n = el.querySelector('.sat-tts-i18n'); if (t && i18n) t.textContent = i18n.dataset.unsupported; }); return; } var player = document.querySelector('.sat-tts-player[data-sat-tts]'); if (!player) return; var contentRoot = document.querySelector('.post-content') || document.querySelector('article .single-post-main') || document.querySelector('article'); if (!contentRoot) return; var toggleBtn = player.querySelector('.sat-tts-toggle'); var rateBtn = player.querySelector('.sat-tts-rate'); var titleText = player.querySelector('.sat-tts-title-text'); var progressEl = player.querySelector('.sat-tts-progress-fill'); var i18n = player.querySelector('.sat-tts-i18n'); var STORAGE_KEY = 'sat_tts_v1_' + (location.pathname || '/'); var RATE_CYCLE = [1, 1.25, 1.5, 2, 0.85]; // ── Build chunks ───────────────────────────────────────────── // Strip HTML to a clean, sequential text array. We skip elements // that read awkwardly aloud (figures, embedded video/audio, the // related-callout sidebars, FAQ schema-heavy sections, code). function buildChunks(root) { var clone = root.cloneNode(true); // Remove things we never want spoken. clone.querySelectorAll( 'script,style,figure,iframe,video,audio,svg,noscript,' + 'aside,.related-callout,.sidebar-share,.sat-tts-player,' + '.article-feedback,.author-bio,.post-tags,.read-next-bar,' + '.post-navigation,.related-posts,form,nav,.toc-container' ).forEach(function(n){ n.parentNode && n.parentNode.removeChild(n); }); var blockSel = 'h1,h2,h3,h4,h5,h6,p,li,blockquote,td,th,dt,dd'; var blocks = clone.querySelectorAll(blockSel); var chunks = []; blocks.forEach(function(b){ var t = (b.textContent || '').replace(/\s+/g, ' ').trim(); if (!t) return; // Long paragraphs: break on sentence boundaries so Chrome // doesn't silently drop after ~15s of a single utterance. if (t.length > 220) { var sentences = t.match(/[^.!?]+[.!?]+(?:\s|$)|[^.!?]+$/g) || [t]; var buf = ''; sentences.forEach(function(s){ s = s.trim(); if (!s) return; if ((buf + ' ' + s).trim().length > 220 && buf) { chunks.push(buf.trim()); buf = s; } else { buf = (buf ? buf + ' ' : '') + s; } }); if (buf.trim()) chunks.push(buf.trim()); } else { chunks.push(t); } }); return chunks; } var chunks = buildChunks(contentRoot); if (chunks.length === 0) return; var totalChars = chunks.reduce(function(a,c){ return a + c.length; }, 0); // ── State machine ─────────────────────────────────────────── var state = { playing: false, paused: false, chunkIndex: 0, charsSpoken: 0, rate: 1, voice: null, currentUtter: null, }; try { var saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || 'null'); if (saved && typeof saved.chunkIndex === 'number' && saved.chunkIndex < chunks.length) { state.chunkIndex = saved.chunkIndex; state.charsSpoken = saved.charsSpoken || 0; state.rate = saved.rate || 1; } } catch (e) {} applyRate(state.rate); updateProgress(); // ── Voice selection ───────────────────────────────────────── // speechSynthesis populates voices async on most browsers. The // picker: // 1. filters by html lang prefix (en/es/...) // 2. drops novelty/character voices (Apple ships ~30 of them // and they sort BEFORE the natural ones on macOS, which is // why an unguarded pool[0] fallback ends up reading // Spanish articles in Eddy/Flo/Reed instead of Mónica) // 3. ranks survivors by an explicit per-language preference // list of high-quality voices, with a fallback that prefers // `localService` (built-in premium) over remote voices. var NOVELTY_NAME_RE = /^(Albert|Bad News|Bahh|Bells|Boing|Bubbles|Cellos|Deranged|Good News|Hysterical|Pipe Organ|Trinoids|Whisper|Wobble|Zarvox|Eddy|Flo|Grandma|Grandpa|Jester|Junior|Kathy|Organ|Princess|Ralph|Reed|Rocko|Sandy|Shelley|Superstar|Vicki|Victoria|Bahh|Boing|Cellos)\b/i; var PREFERRED_BY_LANG = { es: [ // macOS / iOS premium Spanish voices (best quality) /^M[oó]nica/i, // es-ES, very natural /^Paulina/i, // es-MX, very natural /^Jorge\b/i, // es-ES /^Diego\b/i, // es-AR /^Juan\b/i, // Microsoft Edge / Windows neural Spanish voices /Microsoft.*\b(Elvira|Dalia|Alvaro|Jorge|Helena|Sabina)\b.*Online/i, /Microsoft.*\b(Elvira|Dalia|Alvaro)\b/i, // Google Spanish (Chrome desktop, Android) /^Google\s+espa[ñn]ol(?:\s+de\s+(?:M[eé]xico|Estados Unidos))?$/i, /^Google\s+espa[ñn]ol/i, ], en: [ /^Google\s.*(US|UK|English)/i, /^Microsoft.*(Aria|Jenny|Guy|Ryan|Davis)\b.*Online/i, /^Microsoft.*(Aria|Jenny|Guy|Ryan|Davis)\b/i, /^Samantha$/i, /^Alex$/i, /English/i, ], }; function scoreVoice(v, preferredList) { for (var i = 0; i < preferredList.length; i++) { if (preferredList[i].test(v.name)) { // Earlier list entries score higher. localService gets a // small bump so a built-in voice wins over a remote one // when both match the same pattern. return 1000 - i * 10 + (v.localService ? 1 : 0); } } // No name match — still prefer non-novelty + localService. return (v.localService ? 1 : 0); } function pickVoice() { var voices = speechSynthesis.getVoices() || []; if (voices.length === 0) return null; var lang = (document.documentElement.lang || 'en').toLowerCase().split('-')[0]; var pool = voices.filter(function(v){ return (v.lang || '').toLowerCase().indexOf(lang) === 0; }); if (pool.length === 0) pool = voices; // Strip novelty voices unless that leaves us with nothing. var filtered = pool.filter(function(v){ return !NOVELTY_NAME_RE.test(v.name); }); if (filtered.length > 0) pool = filtered; var preferredList = PREFERRED_BY_LANG[lang] || PREFERRED_BY_LANG.en; var best = null, bestScore = -Infinity; pool.forEach(function(v){ var s = scoreVoice(v, preferredList); if (s > bestScore) { bestScore = s; best = v; } }); return best || pool[0]; } if (typeof speechSynthesis.addEventListener === 'function') { speechSynthesis.addEventListener('voiceschanged', function(){ state.voice = pickVoice(); }); } state.voice = pickVoice(); // ── Utterance queue ───────────────────────────────────────── function speakNext() { if (state.chunkIndex >= chunks.length) { stopAll(true); return; } var u = new SpeechSynthesisUtterance(chunks[state.chunkIndex]); u.rate = state.rate; u.pitch = 1; u.volume = 1; // Setting `lang` explicitly is what triggers the Spanish // synthesis backend on Chrome/Edge (which shipped neural // Spanish voices that aren't always exposed via getVoices // until referenced). When `voice` is set we prefer the // voice's own lang to avoid a mismatch. if (state.voice) { u.voice = state.voice; if (state.voice.lang) u.lang = state.voice.lang; } else { u.lang = (document.documentElement.lang || 'en'); } u.onend = function() { if (!state.playing) return; state.charsSpoken += chunks[state.chunkIndex].length; state.chunkIndex += 1; persist(); updateProgress(); if (state.chunkIndex < chunks.length) { speakNext(); } else { stopAll(true); } }; u.onerror = function(ev) { if (ev && ev.error === 'interrupted') return; state.playing = false; state.paused = false; state.currentUtter = null; renderState(); }; u.onboundary = function(ev) { if (ev && typeof ev.charIndex === 'number') { var partial = state.charsSpoken + Math.min(ev.charIndex, chunks[state.chunkIndex].length); var pct = Math.min(100, (partial / totalChars) * 100); progressEl.style.width = pct + '%'; } }; state.currentUtter = u; speechSynthesis.speak(u); } function play() { if (state.paused) { speechSynthesis.resume(); state.paused = false; state.playing = true; renderState(); return; } // Some browsers leave the queue stuck after a previous error; // cancel before starting fresh. try { speechSynthesis.cancel(); } catch (e) {} state.playing = true; state.paused = false; renderState(); speakNext(); } function pause() { if (!state.playing) return; try { speechSynthesis.pause(); } catch (e) {} state.paused = true; state.playing = false; persist(); renderState(); } function stopAll(reset) { try { speechSynthesis.cancel(); } catch (e) {} state.playing = false; state.paused = false; state.currentUtter = null; if (reset) { state.chunkIndex = 0; state.charsSpoken = 0; progressEl.style.width = '0%'; try { localStorage.removeItem(STORAGE_KEY); } catch (e) {} } renderState(); } // ── Rate cycle ───────────────────────────────────────────── function applyRate(r) { state.rate = r; rateBtn.textContent = r.toFixed(2).replace(/\.?0+$/, '') + 'x'; persist(); } rateBtn.addEventListener('click', function(){ var i = RATE_CYCLE.indexOf(state.rate); var next = RATE_CYCLE[(i + 1) % RATE_CYCLE.length]; applyRate(next); // If currently playing, restart the current chunk at the // new rate (Web Speech doesn't let you change rate mid-utter). if (state.playing && state.currentUtter) { stopAll(false); state.playing = true; renderState(); speakNext(); } }); toggleBtn.addEventListener('click', function(){ if (state.playing) { pause(); } else { play(); } }); // ── Chrome 15-second cutoff workaround ───────────────────── // Chrome stops Web Speech after ~15s of continuous output. We // ping pause+resume every 10s while playing to keep the queue // alive. Harmless on browsers that don't need it. setInterval(function(){ if (state.playing && !state.paused) { try { speechSynthesis.pause(); speechSynthesis.resume(); } catch (e) {} } }, 10000); // ── Persistence + UI ─────────────────────────────────────── function persist() { try { localStorage.setItem(STORAGE_KEY, JSON.stringify({ chunkIndex: state.chunkIndex, charsSpoken: state.charsSpoken, rate: state.rate, })); } catch (e) {} } function updateProgress() { var pct = totalChars ? Math.min(100, (state.charsSpoken / totalChars) * 100) : 0; progressEl.style.width = pct + '%'; } function renderState() { if (!i18n) return; if (state.playing) { player.setAttribute('data-state', 'playing'); titleText.textContent = i18n.dataset.playing; toggleBtn.setAttribute('aria-label', 'Pause'); } else if (state.paused) { player.setAttribute('data-state', 'paused'); titleText.textContent = i18n.dataset.paused; toggleBtn.setAttribute('aria-label', 'Resume'); } else { player.removeAttribute('data-state'); titleText.textContent = i18n.dataset.listen; toggleBtn.setAttribute('aria-label', 'Play'); } } // ── GA4 listen events ───────────────────────────────────── // Fire a small custom event the first time a visitor presses // play, so we can answer "does the listen button move // engagement?" from the analytics dashboard. var firedFirstPlay = false; toggleBtn.addEventListener('click', function(){ if (firedFirstPlay) return; if (typeof window.gtag === 'function') { try { window.gtag('event', 'tts_listen_play', { event_category: 'engagement', event_label: location.pathname, value: 1, }); } catch (e) {} } firedFirstPlay = true; }); // Stop speech when the visitor leaves the page so it doesn't // continue narrating in the background after navigation. window.addEventListener('beforeunload', function(){ try { speechSynthesis.cancel(); } catch (e) {} }); })(); </script> <script> (function(){ var SUB="https:\/\/growthleadersnews.com\/wp-json\/satellite\/v1\/newsletter"; var UNSUB="https:\/\/growthleadersnews.com\/wp-json\/satellite\/v1\/newsletter\/unsubscribe"; var PAGE="https:\/\/growthleadersnews.com\/unsubscribe\/"; var LANG=(document.documentElement.lang||'en').slice(0,2); var SEL=[ 'form.satellite-newsletter-form', 'form.newsletter-form', 'form.t1-newsletter-form','form.t1-footer-subscribe', 'form.t4-footer-subscribe','form.t4-sub-form', 'form.t5-footer-subscribe','form.t5-sub-form', 'form.t6-footer-subscribe','form.t6-sub-form', 'form.t7-news-form','form.t7-stayup-form','form.t7-sub-form', 'form.t8-sub-form','form.t8-footer-subscribe', 'form.t9-sub-form','form.t9-footer-subscribe', '.benqu-newsletter form' ].join(','); function msg(status, mode){ var es=LANG==='es'; if(mode==='unsubscribe') return es?"Te has dado de baja.":"You have been unsubscribed."; if(status==='already_subscribed') return es?"Ya est\u00e1s suscrito.":"You are already subscribed."; return es?"Te has suscrito.":"You are subscribed."; } function sourceOf(form){ return form.getAttribute('data-nl-source') || (form.classList.contains('t1-newsletter-form')||form.classList.contains('t7-news-form')||form.classList.contains('newsletter-form')?'homepage': (form.closest('.t4-widget--subscribe,.t5-widget--subscribe,.t6-widget--subscribe,.t7-widget--subscribe,.t8-widget--subscribe,.t9-widget--subscribe')?'sidebar':'footer')); } function bind(form){ if(form.getAttribute('data-sat-nl')==='1') return; form.setAttribute('data-sat-nl','1'); ['data-t1-cta-trigger','data-t4-cta-trigger','data-t5-cta-trigger','data-t6-cta-trigger','data-t7-cta-trigger','data-t8-cta-trigger','data-t9-cta-trigger','data-benqu-cta-trigger'].forEach(function(a){ form.removeAttribute(a); }); if(form.getAttribute('data-nl-mode')!=='unsubscribe'){ var next=form.nextElementSibling; if(!next || !next.classList || !next.classList.contains('satellite-nl-unsub')){ var p=document.createElement('p'); p.className='satellite-nl-unsub'; p.innerHTML='<a href="'+PAGE+'">Unsubscribe</a>'; form.insertAdjacentElement('afterend', p); } } form.addEventListener('submit', function(e){ e.preventDefault(); e.stopImmediatePropagation(); var input=form.querySelector('input[type="email"]'); var btn=form.querySelector('button[type="submit"],button:not([type]),input[type="submit"]'); if(!input||!input.value) return; var mode=form.getAttribute('data-nl-mode')==='unsubscribe'?'unsubscribe':'subscribe'; var endpoint=mode==='unsubscribe'?UNSUB:SUB; var orig=btn?btn.textContent:''; if(btn){btn.disabled=true;btn.textContent='...';} fetch(endpoint,{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({email:input.value,source:sourceOf(form)}) }).then(function(r){return r.json();}).then(function(data){ if(data && data.success){ var note=document.createElement('p'); note.style.cssText='font-weight:600;padding:12px 0;margin:0;'; note.textContent=msg(data.status,mode); form.innerHTML=''; form.appendChild(note); }else{ if(btn){btn.textContent=(data&&data.message)||'Error';btn.disabled=false;} } }).catch(function(){ if(btn){btn.textContent='Error';setTimeout(function(){btn.textContent=orig;btn.disabled=false;},2000);} }); }, true); } function scan(){ document.querySelectorAll(SEL).forEach(bind); } scan(); if(window.MutationObserver){ new MutationObserver(scan).observe(document.body,{childList:true,subtree:true}); } })(); </script> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/sites/24/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/satellite-theme/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script id="satellite-main-js-extra"> var satelliteAjax = {"ajaxurl":"https://growthleadersnews.com/wp-admin/admin-ajax.php","nonce":"bbda9b0adc"}; //# sourceURL=satellite-main-js-extra </script> <script src="https://growthleadersnews.com/wp-content/themes/satellite-theme/assets/js/main.js?ver=4.10.1" id="satellite-main-js"></script> <script> (function(){ var DOMAIN="growthleadersnews.com"; var EVENT="https:\/\/growthleadersnews.com\/wp-json\/satellite\/v1\/lead-event"; var NONCE="451eea5b5c"; var HOSTS={ 'moburst.com':'Moburst', 'www.moburst.com':'Moburst', 'waxcenter.com':'European Wax Center', 'www.waxcenter.com':'European Wax Center', 'locations.waxcenter.com':'European Wax Center', 'helloheart.com':'Hello Heart', 'www.helloheart.com':'Hello Heart', 'baderlaw.com':'Bader Law', 'www.baderlaw.com':'Bader Law' }; function brandFor(host){ host=(host||'').toLowerCase(); if(HOSTS[host]) return HOSTS[host]; var parts=host.split('.'); while(parts.length>2){ parts.shift(); var cand=parts.join('.'); if(HOSTS[cand]) return HOSTS[cand]; } return ''; } function vid(){ try{ var k='sat_vid',v=localStorage.getItem(k); if(!v){v=(crypto&&crypto.randomUUID)?crypto.randomUUID():String(Date.now())+Math.random().toString(16).slice(2);localStorage.setItem(k,v);} return v; }catch(e){return 'anon';} } function track(href,brand,host){ var path=''; try{path=new URL(href,location.href).pathname||'';}catch(e){} var payload={ domain:DOMAIN, event_type:'brand_link_click', visitor_id:vid(), page_url:location.href, metadata_json:JSON.stringify({brand:brand,host:host,href:href,path:path}) }; try{ if(navigator.sendBeacon){ navigator.sendBeacon(EVENT,new Blob([JSON.stringify(payload)],{type:'application/json'})); }else{ fetch(EVENT,{method:'POST',keepalive:true,headers:{'Content-Type':'application/json','X-WP-Nonce':NONCE},body:JSON.stringify(payload)}).catch(function(){}); } }catch(e){} try{ if(typeof gtag==='function'){ gtag('event','brand_link_click',{brand:brand,host:host,link_url:href,event_category:'brand_mention'}); } }catch(e){} } document.addEventListener('click',function(ev){ var a=ev.target&&ev.target.closest?ev.target.closest('a[href]'):null; if(!a) return; var href=a.getAttribute('href')||''; if(!href||href.charAt(0)==='#'||href.indexOf('mailto:')===0||href.indexOf('tel:')===0) return; var host=''; try{host=new URL(href,location.href).hostname;}catch(e){return;} var brand=brandFor(host); if(!brand) return; if(a.getAttribute('data-sat-brand-tracked')==='1') return; a.setAttribute('data-sat-brand-tracked','1'); track(a.href||href,brand,host); },true); })(); </script> <link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=DM+Mono:wght@400;500&display=swap" onload="this.onload=null;this.rel='stylesheet'"> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=DM+Mono:wght@400;500&display=swap"></noscript> <style id="aeo-popup-styles"> #aeo-popup-root { --accent: #E8471A; --accent-dim: #C93C12; --accent-mid: #F07040; --accent-soft: #F9A07A; --card-bg: linear-gradient(105deg, #ffffff 0%, #fff4f0 40%, #ffeee7 70%, #ffffff 100%); --card-fade: #fff8f5; --bar-bg: linear-gradient(105deg, #ffffff 0%, #fff4f0 40%, #ffeee7 70%, #ffffff 100%); --cta-grad: linear-gradient(90deg, #E8471A 0%, #F07040 50%, #E8471A 100%); --cta-text: #ffffff; --shadow-rgb: 232,71,26; --ink: #111111; --ink-soft: #555555; --ink-faint: #999999; --border: #E2E4DC; --banner-h: 88px; /* "Google Sans" is in the stack as the brand fallback for installs that have it locally (e.g. internal Google environments); Inter is the loaded webfont and the de-facto free substitute. */ --font-display: 'Inter', 'Google Sans', system-ui, sans-serif; --font-body: 'Inter', 'Google Sans', system-ui, sans-serif; --font-mono: 'DM Mono', ui-monospace, Menlo, monospace; } #aeo-popup-root, #aeo-popup-root * { box-sizing: border-box; } @keyframes aeoPulse { 0%,100% { opacity:1; transform:scale(1); } 50% { opacity:.4; transform:scale(.7); } } @keyframes aeoCtaShimmer { 0% { background-position:0% 0%; } 50% { background-position:100% 0%; } 100% { background-position:0% 0%; } } @keyframes aeoBannerBreathe{ 0% { background-position:0% 50%; } 50% { background-position:100% 50%; } 100% { background-position:0% 50%; } } @keyframes aeoCardSlideUp { to { transform: translateY(0); opacity: 1; } } @keyframes aeoCardSlideDown{ to { transform: translateY(calc(100% + 32px)); opacity: 0; } } @keyframes aeoBarSlideUp { to { transform: translateY(0); opacity: 1; } } @keyframes aeoScTicker { 0% { transform: translateX(0); } 100% { transform: translateX(-33.3333%); } } /* ── STICKY CARD (bottom-left, initial state) ────────────────────── Default state is hidden -- JS adds .aeo-iframe-ready on the root once the modal iframe has finished loading in the background (or after a safety timeout), so the slide-up coincides with the funnel being click-ready. */ #aeo-popup-root .sticky-card { position: fixed; bottom: 24px; left: 24px; z-index: 9990; width: 340px; border-radius: 16px; overflow: hidden; border: 1px solid var(--border); box-shadow: 0 8px 40px rgba(var(--shadow-rgb),0.15), 0 2px 8px rgba(0,0,0,0.07); background: var(--card-bg); background-size: 300% 300%; transform: translateY(calc(100% + 32px)); opacity: 0; } #aeo-popup-root.aeo-iframe-ready .sticky-card { animation: aeoCardSlideUp 0.6s cubic-bezier(0.22,1,0.36,1) forwards, aeoBannerBreathe 5s ease-in-out 0.6s infinite; } #aeo-popup-root.aeo-skip-card .sticky-card { display: none; } #aeo-popup-root.aeo-lead-done .sticky-card, #aeo-popup-root.aeo-lead-done .sticky-banner { display: none; } #aeo-popup-root .sticky-card.hiding { animation: aeoCardSlideDown 0.4s cubic-bezier(0.4,0,1,1) forwards !important; } /* ── Border Beam ─────────────────────────────────────── A bright accent-coloured "comet" travels around the card perimeter. Implemented as a single ::before pseudo-element: 1. conic-gradient paints the comet (transparent for ~75% of the circle, then a soft -> bright -> soft fade across the last ~100°), 2. mask-composite:exclude cuts the inside out so only a 2px ring remains -- the comet appears to glide along the border, 3. @property animates the gradient's `from` angle so the rotation is on the gradient itself, not via transform (no sub-pixel shimmer, no GPU compositing cost, and the corners stay sharp). Browsers without @property (older Firefox <128, older Safari <16.4) render the gradient statically -- graceful degradation. */ @property --aeo-beam-angle { syntax: '<angle>'; initial-value: 0deg; inherits: false; } #aeo-popup-root .sticky-card::before { content: ''; position: absolute; inset: 0; border-radius: inherit; padding: 2px; background: conic-gradient( from var(--aeo-beam-angle), transparent 0deg, transparent 250deg, var(--accent-soft) 305deg, var(--accent) 340deg, var(--accent-soft) 360deg ); -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; z-index: 1; opacity: 0; transition: opacity .4s ease; } #aeo-popup-root.aeo-iframe-ready .sticky-card::before { opacity: 1; animation: aeoBeamRotate 5s linear infinite; } @keyframes aeoBeamRotate { to { --aeo-beam-angle: 360deg; } } #aeo-popup-root .sc-inner { padding: 18px 18px 20px; } #aeo-popup-root .sc-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; } #aeo-popup-root .sc-label { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent-dim); display: flex; align-items: center; gap: 6px; } #aeo-popup-root .sc-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); animation: aeoPulse 2s ease-in-out infinite; flex-shrink: 0; } #aeo-popup-root .sc-close { width: 26px; height: 26px; border-radius: 50%; border: 1px solid var(--border); background: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--ink-faint); font-size: 16px; line-height: 1; transition: border-color .2s, color .2s, background .2s; flex-shrink: 0; padding: 0; } #aeo-popup-root .sc-close:hover { border-color: var(--ink); color: var(--ink); background: #F5F6F2; } #aeo-popup-root .sc-headline { font-family: var(--font-display); font-size: 19px; font-weight: 800; color: var(--ink); letter-spacing: -0.4px; line-height: 1.25; margin: 0 0 8px; } #aeo-popup-root .sc-sub { font-size: 13px; color: var(--ink-faint); line-height: 1.5; margin: 0 0 12px; font-family: var(--font-body); } #aeo-popup-root .sc-ticker-wrap { position: relative; overflow: hidden; margin-bottom: 14px; height: 28px; } #aeo-popup-root .sc-ticker-wrap::before, #aeo-popup-root .sc-ticker-wrap::after { content: ''; position: absolute; inset-block: 0; width: 20px; z-index: 2; pointer-events: none; } #aeo-popup-root .sc-ticker-wrap::before { left: 0; background: linear-gradient(to right, var(--card-fade), transparent); } #aeo-popup-root .sc-ticker-wrap::after { right: 0; background: linear-gradient(to left, var(--card-fade), transparent); } #aeo-popup-root .sc-ticker { /* Marquee math (do not change without revisiting both this rule AND the aeoScTicker keyframe + the JS that builds the chip list): - Each chip is 28px wide with an 8px trailing margin = 36px slot. - We render 3 copies of the 6-engine ticker = 18 chips = 648px. - One copy width = 6 * 36 = 216px = exactly 1/3 of the total. - The keyframe translates -33.3333% (= -216px), so the moment the first copy finishes scrolling out, the second copy is already occupying its exact original position. Seamless loop. We use margin-right on the chip (not flex gap) on purpose: flex gap only sits *between* siblings, which is one short for the cycle to line up with translateX. margin-right counts on every chip, so the total width is N*(chip+gap) and -1/N translation hits the boundary cleanly. Three copies is also what keeps the right edge of the card from ever going empty mid-scroll -- a single copy (216px) is narrower than the visible card content area, so doubled content would leave a gap on the right at the end of every cycle. */ display: flex; width: max-content; animation: aeoScTicker 18s linear infinite; align-items: center; height: 100%; } #aeo-popup-root .sc-logo-chip { width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0; margin-right: 8px; display: flex; align-items: center; justify-content: center; overflow: hidden; /* Faint inset border. On dark/coloured chips it's invisible; on the white Copilot chip it's what keeps the icon from floating against the light card background. */ box-shadow: inset 0 0 0 1px rgba(0,0,0,0.06); } #aeo-popup-root .sc-logo-chip img { width: 18px; height: 18px; object-fit: contain; display: block; filter: drop-shadow(0 1px 1px rgba(0,0,0,0.15)); } /* Copilot-specific override: Microsoft's multicolor ribbon mark has finer detail than any of the other engines' marks (which are single- colour silhouettes), and its lighter gradient tips (cyan, yellow, pink) wash out at small sizes on a white chip. Bumping the image to nearly fill the 28px chip restores legibility. We target by [title] so future engine additions don't accidentally pick this up. */ #aeo-popup-root .sc-logo-chip[title="Copilot"] img { width: 24px; height: 24px; /* No drop-shadow on the Copilot icon -- the soft glow muddies the gradient ribbon. */ filter: none; } #aeo-popup-root .sc-cta { display: flex; align-items: center; justify-content: center; gap: 6px; width: 100%; font-family: var(--font-body); font-size: 14px; font-weight: 600; color: var(--cta-text); background: var(--cta-grad); background-size: 200% 100%; border: none; border-radius: 100px; padding: 11px 20px; cursor: pointer; text-decoration: none; animation: aeoCtaShimmer 3s ease-in-out 2.4s infinite; transition: transform .15s, box-shadow .2s; } #aeo-popup-root .sc-cta:hover { transform: scale(1.02); box-shadow: 0 4px 20px rgba(var(--shadow-rgb),0.4); animation-play-state: paused; } #aeo-popup-root .sc-cta .arrow { font-size: 15px; transition: transform .2s; } #aeo-popup-root .sc-cta:hover .arrow { transform: translateX(3px); } /* ── STICKY BAR (after card dismissed) ──────────────────────────── */ #aeo-popup-root .sticky-banner { position: fixed; bottom: 0; left: 0; right: 0; z-index: 9990; transform: translateY(100%); opacity: 0; pointer-events: none; background: var(--bar-bg); background-size: 300% 300%; border-top: 1px solid var(--border); box-shadow: 0 -4px 32px rgba(var(--shadow-rgb),0.08), 0 -1px 0 rgba(var(--shadow-rgb),0.15); } #aeo-popup-root .sticky-banner.visible { pointer-events: all; animation: aeoBarSlideUp 0.5s cubic-bezier(0.22,1,0.36,1) forwards, aeoBannerBreathe 5s ease-in-out 0.5s infinite; } #aeo-popup-root .sticky-banner::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, var(--accent) 0%, var(--accent-soft) 60%, transparent 100%); } #aeo-popup-root .banner-inner { max-width: 1240px; margin: 0 auto; padding: 0 32px; height: var(--banner-h); display: flex; align-items: center; gap: 24px; } #aeo-popup-root .banner-label { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent-dim); white-space: nowrap; flex-shrink: 0; display: flex; align-items: center; gap: 6px; } #aeo-popup-root .banner-label::before { content: ''; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); animation: aeoPulse 2s ease-in-out infinite; } #aeo-popup-root .banner-divider-v { width: 1px; height: 32px; background: var(--border); flex-shrink: 0; } #aeo-popup-root .banner-headline { font-family: var(--font-display); font-size: 15px; font-weight: 800; color: var(--ink); letter-spacing: -0.3px; flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin: 0; } #aeo-popup-root .banner-sub { font-size: 13px; color: var(--ink-faint); flex-shrink: 0; white-space: nowrap; font-family: var(--font-body); } #aeo-popup-root .banner-cta { display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-body); font-size: 14px; font-weight: 600; color: var(--cta-text); background: var(--cta-grad); background-size: 200% 100%; border: none; border-radius: 100px; padding: 11px 28px; cursor: pointer; text-decoration: none; white-space: nowrap; flex-shrink: 0; animation: aeoCtaShimmer 3s ease-in-out 0.5s infinite; transition: transform .15s, box-shadow .2s; } #aeo-popup-root .banner-cta:hover { transform: scale(1.03); box-shadow: 0 4px 20px rgba(var(--shadow-rgb),0.4); animation-play-state: paused; } #aeo-popup-root .banner-cta .arrow { font-size: 16px; line-height: 1; transition: transform .2s; } #aeo-popup-root .banner-cta:hover .arrow { transform: translateX(3px); } /* ── IFRAME MODAL (full-screen takeover) ────────────────────────── */ /* Matches the Verdict V2 full-page lead capture pattern: edge-to-edge shell, no card chrome, just a translucent floating top bar with "Back to article" and a close pill. The AEO funnel's own branding inside the iframe carries the visual weight. */ #aeo-popup-root .aeo-modal { position: fixed; inset: 0; z-index: 10000; background: #ffffff; display: flex; flex-direction: column; opacity: 0; pointer-events: none; transition: opacity .25s ease; } #aeo-popup-root .aeo-modal.open { opacity: 1; pointer-events: all; } #aeo-popup-root .aeo-modal-backdrop { display: none; } #aeo-popup-root .aeo-modal-shell { position: relative; z-index: 1; display: flex; flex-direction: column; width: 100%; height: 100%; background: #ffffff; } #aeo-popup-root .aeo-modal-bar { position: relative; z-index: 3; display: flex; align-items: center; justify-content: space-between; padding: 12px 20px; background: #ffffff; border-bottom: 1px solid rgba(0,0,0,0.06); flex-shrink: 0; } #aeo-popup-root .aeo-modal-back { display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-body); font-size: 13px; font-weight: 500; color: var(--ink-soft); background: transparent; border: none; cursor: pointer; padding: 6px 8px; border-radius: 8px; transition: background .15s, color .15s; } #aeo-popup-root .aeo-modal-back:hover { background: #F0F1EC; color: var(--ink); } #aeo-popup-root .aeo-modal-iframe-wrap { position: relative; flex: 1; background: #ffffff; overflow: hidden; } #aeo-popup-root .aeo-modal-iframe { width: 100%; height: 100%; border: 0; display: block; background: #ffffff; } #aeo-popup-root .aeo-modal-loading { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-faint); background: #ffffff; transition: opacity .3s ease; z-index: 1; pointer-events: none; } #aeo-popup-root .aeo-modal-iframe-wrap.loaded .aeo-modal-loading { opacity: 0; } #aeo-popup-root .aeo-modal-loading .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); animation: aeoPulse 1.2s ease-in-out infinite; margin-right: 8px; } /* lock background scroll when modal is open */ body.aeo-modal-open { overflow: hidden; } /* Bar collapses to headline + CTA on narrower viewports, but the card keeps its 340px bottom-left footprint all the way down to phone widths. Real phones (≤480px) get the full-width card so the CTA stays tappable. */ @media (max-width: 900px) { #aeo-popup-root .banner-inner { padding: 0 16px; gap: 12px; } #aeo-popup-root .banner-label, #aeo-popup-root .banner-divider-v, #aeo-popup-root .banner-sub { display: none; } #aeo-popup-root .banner-headline { font-size: 13px; } #aeo-popup-root .banner-cta { font-size: 13px; padding: 9px 18px; } } @media (max-width: 480px) { #aeo-popup-root .sticky-card { left: 12px; bottom: 12px; width: calc(100vw - 24px); } } @media (prefers-reduced-motion: reduce) { #aeo-popup-root .sticky-card, #aeo-popup-root .sticky-banner.visible, #aeo-popup-root .sc-cta, #aeo-popup-root .banner-cta { animation: none !important; } #aeo-popup-root.aeo-iframe-ready .sticky-card { transform: none; opacity: 1; } } </style> <div id="aeo-popup-root" data-variant="small-report" data-domain="growthleadersnews.com"> <div class="sticky-card" id="aeoStickyCard" role="complementary" aria-label="AI Visibility Radar — Free AEO Report"> <div class="sc-inner"> <div class="sc-header"> <span class="sc-label"><span class="sc-dot"></span>AI VISIBILITY RADAR</span> <button type="button" class="sc-close" id="aeoCardClose" aria-label="Dismiss">×</button> </div> <p class="sc-headline">Are AI engines recommending your brand?</p> <p class="sc-sub">Check your score on 5 AI engines — instantly.</p> <div class="sc-ticker-wrap"><div class="sc-ticker" id="aeoScTicker"></div></div> <a href="#" class="sc-cta" id="aeoCardCta"> Check for Free <span class="arrow">→</span> </a> </div> </div> <div class="sticky-banner" id="aeoStickyBanner" role="complementary" aria-label="AI Visibility Radar — Free AEO Report"> <div class="banner-inner"> <span class="banner-label">AI VISIBILITY RADAR</span> <div class="banner-divider-v"></div> <p class="banner-headline">Are AI engines recommending your brand?</p> <span class="banner-sub">Check your score on 5 AI engines — instantly.</span> <a href="#" class="banner-cta" id="aeoBarCta"> Check for Free <span class="arrow">→</span> </a> </div> </div> <div class="aeo-modal" id="aeoModal" role="dialog" aria-modal="true" aria-label="AI Visibility Radar — Free AEO Report" aria-hidden="true"> <div class="aeo-modal-backdrop" data-aeo-close></div> <div class="aeo-modal-shell"> <header class="aeo-modal-bar"> <button type="button" class="aeo-modal-back" data-aeo-close> <span aria-hidden="true">←</span> Back to article </button> </header> <div class="aeo-modal-iframe-wrap" id="aeoModalIframeWrap"> <div class="aeo-modal-loading"><span class="dot"></span>Loading report…</div> <iframe id="aeoModalIframe" class="aeo-modal-iframe" title="AI Visibility Radar — Free AEO Report" referrerpolicy="no-referrer-when-downgrade" allow="clipboard-write" src="https://aeo.prod-mobtools.com/aeo/small-report?embed=1&utm_source=growthleadersnews.com&utm_medium=satellite&utm_campaign=aeo-popup&utm_content=small-report"></iframe> </div> </div> </div> </div> <script id="aeo-popup-script"> (function () { var root = document.getElementById('aeo-popup-root'); if (!root) return; var card = document.getElementById('aeoStickyCard'); var bar = document.getElementById('aeoStickyBanner'); var modal = document.getElementById('aeoModal'); var iframe = document.getElementById('aeoModalIframe'); var wrap = document.getElementById('aeoModalIframeWrap'); var closeBtn = document.getElementById('aeoCardClose'); var cardCta = document.getElementById('aeoCardCta'); var barCta = document.getElementById('aeoBarCta'); var ticker = document.getElementById('aeoScTicker'); /* ---------- analytics -------------------------------- Posts to the existing /wp-json/satellite/v1/lead-event proxy, which forwards to the backend's POST /api/leads/event. Events here are prefixed with "aeo_" so the lawyer funnel chart on the same dashboard never picks them up. ----------------------------------------------------- */ var AEO_DOMAIN = "growthleadersnews.com"; var AEO_VARIANT = "small-report"; var AEO_NICHE = "marketing"; var AEO_EVENT_URL = "https:\/\/growthleadersnews.com\/wp-json\/satellite\/v1\/lead-event"; var AEO_EVENT_NONCE = "451eea5b5c"; /* localStorage visitor_id so unique-clicker counts on the dashboard are stable across sessions on the same browser. UUIDv4-ish via random bytes; no PII, just a stable handle for COUNT(DISTINCT) on the backend. */ function aeoGetVisitorId() { try { var KEY = 'aeo_vid'; var existing = localStorage.getItem(KEY); if (existing) return existing; var b = (crypto && crypto.getRandomValues) ? crypto.getRandomValues(new Uint8Array(16)) : (function () { var arr = []; for (var i=0;i<16;i++) arr.push(Math.floor(Math.random()*256)); return arr; })(); b[6] = (b[6] & 0x0f) | 0x40; // version 4 b[8] = (b[8] & 0x3f) | 0x80; // variant var hex = Array.prototype.map.call(b, function (x) { return ('0' + x.toString(16)).slice(-2); }).join(''); var id = hex.slice(0,8)+'-'+hex.slice(8,12)+'-'+hex.slice(12,16)+'-'+hex.slice(16,20)+'-'+hex.slice(20,32); localStorage.setItem(KEY, id); return id; } catch (e) { return ''; // private mode / disabled storage -- silently drop } } var AEO_VISITOR_ID = aeoGetVisitorId(); function aeoTrack(eventType, extraMeta) { try { var meta = { variant: AEO_VARIANT, niche: AEO_NICHE }; if (extraMeta) for (var k in extraMeta) if (Object.prototype.hasOwnProperty.call(extraMeta, k)) meta[k] = extraMeta[k]; var payload = { domain: AEO_DOMAIN, event_type: eventType, visitor_id: AEO_VISITOR_ID, page_url: location.href, metadata_json: JSON.stringify(meta) }; var body = JSON.stringify(payload); if (navigator.sendBeacon) { navigator.sendBeacon( AEO_EVENT_URL + '?_wpnonce=' + encodeURIComponent(AEO_EVENT_NONCE), new Blob([body], { type: 'application/json' }) ); } else { fetch(AEO_EVENT_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': AEO_EVENT_NONCE }, body: body, keepalive: true }); } } catch (e) { /* analytics must never break the popup */ } } /* ---------- cookies ---------- */ function readCookie(name) { var m = document.cookie.match('(?:^|;)\\s*' + name + '=([^;]*)'); return m ? decodeURIComponent(m[1]) : ''; } function writeCookie(name, value, days) { var d = new Date(); d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000); document.cookie = name + '=' + encodeURIComponent(value) + '; expires=' + d.toUTCString() + '; path=/; SameSite=Lax'; } /* Cookie names are versioned. An earlier iteration of this script set aeo_lead_done from a 15s dwell-time heuristic (since removed); any tester who left the modal open during that period now carries a 30-day cookie that silently hides the popup forever. Bumping the name to _v2 retires that stale state without forcing anyone to clear browser cookies. */ var CARD_DISMISSED = 'aeo_card_dismissed_v2'; var LEAD_DONE = 'aeo_lead_done_v2'; if (readCookie(LEAD_DONE) === '1') { root.classList.add('aeo-lead-done'); return; } /* ---------- reveal the card (or bar) ---------- The iframe is preloading in the background regardless of card state, so we don't gate reveal on it -- we just slide the card up on a quick fixed timer so the popup is visible reliably on every refresh, even when the cross-origin iframe's load event is slow or never fires. By the time the user finishes reading the article and clicks the CTA, the iframe is virtually always fully loaded, so clicks still open the modal instantly. */ var revealed = false; var dismissedBefore = readCookie(CARD_DISMISSED) === '1'; if (dismissedBefore) root.classList.add('aeo-skip-card'); function reveal() { if (revealed) return; revealed = true; if (dismissedBefore) { if (bar) bar.classList.add('visible'); aeoTrack('aeo_bar_impression', { source: 'bar' }); } else { root.classList.add('aeo-iframe-ready'); aeoTrack('aeo_impression', { source: 'card' }); } } /* 600ms is long enough to feel intentional (not jarring on first paint), short enough that it always wins against a slow cross-origin iframe. */ setTimeout(reveal, 600); /* ---------- ticker ---------- Three full copies of the chip list, not two. The aeoScTicker keyframe translates by exactly one copy's width (-33.3333%) so the second copy slides into the first's position seamlessly; the third copy is there to keep the right edge of the card filled while the second is doing the heavy lifting -- one copy alone (216px) is narrower than the visible card content area, so a doubled ticker leaves a visible gap at the right edge near the end of every animation cycle. */ var TOOLS = [{"name":"Gemini","bg":"#1A73E8","logo":"https:\/\/growthleadersnews.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/gemini.svg"},{"name":"Grok","bg":"#111111","logo":"https:\/\/growthleadersnews.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/grok.svg"},{"name":"Perplexity","bg":"#1FB8CD","logo":"https:\/\/growthleadersnews.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/perplexity.svg"},{"name":"ChatGPT","bg":"#10A37F","logo":"https:\/\/growthleadersnews.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/chatgpt.svg"},{"name":"Copilot","bg":"#FFFFFF","logo":"https:\/\/growthleadersnews.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/copilot.svg"},{"name":"Claude","bg":"#D97757","logo":"https:\/\/growthleadersnews.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/claude.svg"}]; if (ticker) { var tripled = TOOLS.concat(TOOLS).concat(TOOLS); ticker.innerHTML = tripled.map(function (t) { return '<div class="sc-logo-chip" title="' + t.name + '" style="background:' + t.bg + ';">' + '<img src="' + t.logo + '" alt="' + t.name + '" loading="lazy" width="18" height="18">' + '</div>'; }).join(''); } /* ---------- card -> bar dismissal ---------- The slide-down animation is 0.4s. We use a matched setTimeout instead of animationend because Chrome occasionally swallows the event when another animation (the breathing background) is in flight on the same element. */ if (closeBtn) { closeBtn.addEventListener('click', function () { writeCookie(CARD_DISMISSED, '1', 30); aeoTrack('aeo_card_dismiss', { source: 'card' }); card.classList.add('hiding'); setTimeout(function () { card.style.display = 'none'; if (bar) bar.classList.add('visible'); }, 420); }); } /* ---------- modal open / close ---------- */ if (iframe && wrap) { if (iframe.complete) wrap.classList.add('loaded'); else iframe.addEventListener('load', function () { wrap.classList.add('loaded'); }, { once: true }); } function swapCardToBar() { if (!card || card.style.display === 'none' || card.classList.contains('hiding')) return; card.classList.add('hiding'); setTimeout(function () { card.style.display = 'none'; if (bar) bar.classList.add('visible'); }, 420); } function openModal(e) { if (e) e.preventDefault(); if (!modal) return; modal.setAttribute('aria-hidden', 'false'); requestAnimationFrame(function () { modal.classList.add('open'); }); document.body.classList.add('aeo-modal-open'); } function closeModal() { if (!modal || !modal.classList.contains('open')) return; modal.classList.remove('open'); document.body.classList.remove('aeo-modal-open'); setTimeout(function () { modal.setAttribute('aria-hidden', 'true'); }, 320); aeoTrack('aeo_modal_close'); /* If the card was still showing behind the modal, collapse it to the bar so the user has an obvious re-entry point. No cookie is set here -- only the explicit X on the card persists dismissal across page loads. */ swapCardToBar(); } if (cardCta) cardCta.addEventListener('click', function (e) { aeoTrack('aeo_cta_click', { source: 'card' }); openModal(e); }); if (barCta) barCta.addEventListener('click', function (e) { aeoTrack('aeo_cta_click', { source: 'bar' }); openModal(e); }); /* Generic trigger: any element with [data-aeo-open] opens the same modal. The in-article banner (aeo-inline-banner.php) uses this so it doesn't have to duplicate the modal HTML/JS -- it just renders a CTA with data-aeo-open + data-aeo-source="inline" and rides on the popup infrastructure that's already in the footer. Source is read from data-aeo-source so we can split CTR by surface in the analytics dashboard (card / bar / inline / future surfaces). */ document.querySelectorAll('[data-aeo-open]').forEach(function (el) { el.addEventListener('click', function (e) { var source = el.getAttribute('data-aeo-source') || 'external'; aeoTrack('aeo_cta_click', { source: source }); openModal(e); }); }); if (modal) { modal.querySelectorAll('[data-aeo-close]').forEach(function (el) { el.addEventListener('click', closeModal); }); } document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && modal && modal.classList.contains('open')) closeModal(); }); /* ---------- future postMessage handshake (stub) ---------- Listens for a "lead-complete" event from the iframe so we can flip the LEAD_DONE cookie immediately on real submission (not on dwell time). Wire this up on the AEO side and remove the dwell-time fallback above. */ window.addEventListener('message', function (e) { if (!e || !e.origin || e.origin.indexOf('aeo.prod-mobtools.com') === -1) return; var data = e.data || {}; if (data && data.type === 'aeo:lead-complete') { writeCookie(LEAD_DONE, '1', 30); root.classList.add('aeo-lead-done'); closeModal(); } }); })(); </script> <script id="satellite-cta-fallback">(function(){ function ready(fn){ if(document.readyState!=='loading'){fn();} else {document.addEventListener('DOMContentLoaded',fn);} } ready(function(){ document.querySelectorAll('[class*="-sticky-cta"]').forEach(function(el){ var b = el.querySelector('[class*="-sticky-cta-btn"]'); if (b && /subscribe/i.test(b.textContent)) { el.remove(); } }); }); document.addEventListener('satellite:open-lead-popup', function(){ var has = (window.LawyerLeadFormV2&&window.LawyerLeadFormV2.open)||(window.AeoLeadPopup&&window.AeoLeadPopup.open)||(window.ExitIntentPopup&&window.ExitIntentPopup.open); if (!has) { window.location.href = 'https://growthleadersnews.com/contact/'; } }); })();</script> <script> (function(){ var bar = document.getElementById('reading-progress'); if(!bar) return; var article = document.querySelector('.post-content'); if(!article) return; var milestones = {25:false,50:false,75:false,100:false}; var startTime = Date.now(); function sendGA4(name, params) { if (window.gtag) window.gtag('event', name, params); } window.addEventListener('scroll', function(){ var rect = article.getBoundingClientRect(); var total = article.offsetHeight - window.innerHeight; var progress = Math.min(100, Math.max(0, (-rect.top / total) * 100)); bar.style.width = progress + '%'; var pct = Math.floor(progress); [25,50,75,100].forEach(function(m){ if (pct >= m && !milestones[m]) { milestones[m] = true; sendGA4('scroll_depth', {percent: m, reading_seconds: Math.round((Date.now()-startTime)/1000)}); } }); }, {passive:true}); function sendReadingTime() { var seconds = Math.round((Date.now()-startTime)/1000); if (seconds > 3) sendGA4('reading_time', {seconds: seconds, scroll_reached: Math.max.apply(null, Object.keys(milestones).filter(function(k){return milestones[k];})) || 0}); } document.addEventListener('visibilitychange', function(){ if(document.visibilityState==='hidden') sendReadingTime(); }); window.addEventListener('beforeunload', sendReadingTime); })(); </script> <script> (function(){ var toc = document.querySelector('.toc-container'); if(!toc) return; var title = toc.querySelector('.toc-title'); if(window.innerWidth <= 768) { toc.classList.add('toc-collapsed'); title.addEventListener('click', function(){ toc.classList.toggle('toc-collapsed'); }); } var links = toc.querySelectorAll('.toc-list a'); var sections = []; links.forEach(function(a){ var id = a.getAttribute('href'); if(id) { var el = document.querySelector(id); if(el) sections.push({el:el,link:a}); } }); if(!sections.length) return; var raf; window.addEventListener('scroll', function(){ if(raf) return; raf = requestAnimationFrame(function(){ raf = null; var scrollY = window.scrollY + 120; var active = sections[0]; for(var i=0;i<sections.length;i++){ if(sections[i].el.offsetTop <= scrollY) active = sections[i]; } links.forEach(function(l){ l.classList.remove('toc-active'); }); if(active) active.link.classList.add('toc-active'); }); }, {passive:true}); })(); </script> </body> </html>