On-Page SEO: 2026’s 75% Sales Boost Secret

Listen to this article · 13 min listen

The digital marketing sphere is a battlefield, and in 2026, the trenches are deeper than ever. Understanding on-page SEO isn’t just an advantage anymore; it’s the difference between digital visibility and utter obscurity. But with algorithms constantly shifting and user expectations skyrocketing, can a few tweaks on your website truly make a measurable impact on your marketing goals?

Key Takeaways

  • Conduct thorough keyword research using advanced tools like Semrush to identify at least 10 high-intent, low-competition terms for each target page.
  • Craft compelling, unique meta titles under 60 characters and meta descriptions under 160 characters for every page, incorporating primary and secondary keywords.
  • Structure content with clear H1, H2, and H3 headings, ensuring the H1 is unique, keyword-rich, and directly reflects the page’s core topic.
  • Implement internal linking strategically, using descriptive anchor text to connect related content and distribute link equity across your site.
  • Optimize all images for web performance by compressing them to under 100KB and adding descriptive alt text that includes relevant keywords.

I’ve seen countless businesses – from mom-and-pop shops in Atlanta’s Grant Park neighborhood to national e-commerce giants – struggle to grasp that the shiny, new off-page tactics mean nothing if your foundation is crumbling. I remember a client last year, a boutique specializing in handmade jewelry out of Ponce City Market. They were pouring money into social media ads, getting decent clicks, but their conversions were abysmal. A quick audit revealed their product pages were practically invisible to search engines. No proper titles, no descriptions, images that took ages to load. We revamped their on-page SEO, and within three months, their organic traffic soared by 120%, directly translating into a 75% increase in online sales. That’s not magic; that’s just good, fundamental marketing.

1. Master Advanced Keyword Research and Intent Mapping

Before you write a single word, you need to know exactly what your audience is searching for and, more importantly, why. Gone are the days of stuffing keywords. Today, it’s about understanding search intent. I always start with a combination of Semrush and Ahrefs.

Here’s my process:

  • Identify Seed Keywords: Brainstorm broad terms related to your topic. For our Ponce City Market jeweler, this might be “handmade sterling silver earrings” or “custom engagement rings Atlanta.”
  • Expand Your List: Plug these into Semrush’s Keyword Magic Tool. Navigate to the “Keyword Magic Tool” tab. Set your target region (e.g., “United States” or even “Georgia”). Enter your seed keyword.
  • Filter for Intent and Difficulty: This is where the magic happens. I filter for keywords with a “Keyword Difficulty” score under 70 (or even lower if it’s a newer site) and analyze the “Intent” column. Are people looking for information (informational), trying to buy (transactional), or looking for a specific website (navigational)? I prioritize transactional and commercial intent keywords for product and service pages.
  • Look for Long-Tail Opportunities: These are gold. They often have lower competition and higher conversion rates. For instance, “sustainable handmade jewelry Atlanta” is far more specific and intent-driven than just “jewelry.”
  • Map Keywords to Pages: Don’t just make a list. Create a spreadsheet where each target page has a primary keyword, 2-3 secondary keywords, and a list of related long-tail variations. This ensures every page serves a specific purpose and targets a distinct search query.

Pro Tip: Don’t forget voice search. Tools like Semrush’s “Keyword Manager” can help identify conversational queries. People ask questions, not just keywords, when using voice assistants. “Where can I buy custom engagement rings in Midtown Atlanta?” is a perfect example of a voice search query.

Common Mistake: Targeting keywords that are too broad or too competitive for your current domain authority. You’re not going to outrank Amazon for “jewelry” overnight. Focus on niche, specific terms where you can genuinely compete.

2. Craft Irresistible Meta Titles and Descriptions

Your meta title and description are your digital storefront window. They’re the first thing a potential visitor sees in the search results, and they dictate whether someone clicks or scrolls past.

  • Meta Title ( tag):</strong> This should be unique for every page, under 60 characters (to avoid truncation), and include your primary keyword as close to the beginning as possible. I also like to include a brand name at the end for recognition.</li> <li>Example for a product page: <strong>“Handmade Sterling Silver Earrings | Artisan Jewelry Atlanta”</strong></li> <li>To implement, if you’re on WordPress, I highly recommend <a href="https://yoast.com/" target="_blank" rel="noopener">Yoast SEO</a> or <a href="https://rankmath.com/" target="_blank" rel="noopener">Rank Math</a>. In the Yoast SEO box below your content editor, you’ll find “SEO title.” Type directly into this field. The snippet preview will show you how it looks.</li> <li><strong>Meta Description ():</strong> Think of this as a mini-advertisement. It needs to be compelling, under 160 characters, and explain what the user will find on the page. While not a direct ranking factor, a well-written description significantly improves your click-through rate (CTR), which <em>is</em> a ranking signal. Include your primary and secondary keywords naturally.</li> <li>Example: <strong>“Discover unique handmade sterling silver earrings crafted by local Atlanta artisans. Perfect for gifts or personal style. Shop now!”</strong></li> <li>In Yoast SEO, this is the “Meta description” field.</li> </ul> <p><strong>Pro Tip:</strong> Use action verbs in your meta descriptions (“Discover,” “Shop,” “Learn,” “Explore”). Also, consider adding relevant emojis (if appropriate for your brand) to stand out, though use them sparingly.</p> <p><strong>Common Mistake:</strong> Duplicating meta titles and descriptions across multiple pages. This confuses search engines and dilutes your content’s uniqueness. Every page should have its own distinct identity.</p> <h2 id="section-4">3. Optimize Your Page Headings for Clarity and Keywords</h2> <p>Headings (H1, H2, H3, etc.) aren’t just for making your content readable; they tell search engines what your page is about and how it’s structured.</p> <ul> <li><strong>H1 Tag:</strong> Every page should have only ONE H1 tag. This is your main heading, your page’s title. It should contain your primary keyword and accurately reflect the page’s content.</li> <li>Example: <strong><br /> <h1>The Ultimate Guide to Sustainable Handmade Jewelry in Atlanta</h1> <p></strong></li> <li>In most content editors (like WordPress’s Gutenberg), you select the “Heading” block and then choose “H1.”</li> <li><strong>H2 and H3 Tags:</strong> Use these to break up your content into logical sections and subsections. Incorporate secondary and long-tail keywords naturally within these headings. This helps both users and search engines understand the flow and depth of your content.</li> <li>Example H2: <strong><br /> <h2 id="section-5">Why Choose Ethically Sourced Silver?</h2> <p></strong></li> <li>Example H3: <strong><br /> <h3>Local Atlanta Artisans Shaping the Future of Jewelry</h3> <p></strong></li> </ul> <p><strong>Pro Tip:</strong> Think of your headings as an outline. If someone just read your H1, H2s, and H3s, would they understand the gist of your entire article? If not, refine them.</p> <p><strong>Common Mistake:</strong> Using headings purely for visual styling. Don’t make a paragraph an H2 just because you want bigger text. Use CSS for styling; use headings for structure. Also, avoid keyword stuffing in headings; it looks spammy and can lead to penalties.</p> <h2 id="section-6">4. Implement Strategic Internal Linking</h2> <p>Internal links are hyperlinks that point to other pages on the same website. They are incredibly powerful for several reasons: they help search engines discover and index your content, they pass “link equity” around your site, and they guide users through your website.</p> <ul> <li><strong>Contextual Links:</strong> Link naturally within your body content to other relevant pages. Use descriptive <strong>anchor text</strong> (the visible, clickable text of a hyperlink) that accurately describes the destination page. Avoid generic anchor text like “click here.”</li> <li>Example: “If you’re looking for unique handcrafted pendants, explore our collection of <a href="https://example.com/pendants" target="_blank" rel="noopener"><strong>artisan silver pendants</strong></a>.”</li> <li><strong>Hub and Spoke Model:</strong> I often advise clients to create “hub” pages that are comprehensive guides on a broad topic (e.g., “Guide to Custom Jewelry Design”) and link out to “spoke” pages that delve into specific sub-topics (e.g., “Choosing Your Gemstone,” “Understanding Metal Types”). The spoke pages then link back to the hub.</li> <li><strong>Audit Existing Links:</strong> Use tools like Ahrefs’ “Site Audit” feature or Semrush’s “Site Audit” to identify broken internal links or pages with too few internal links. A broken link is a dead end for both users and search engines.</li> </ul> <p><strong>Pro Tip:</strong> Don’t overdo it. A few well-placed, relevant internal links per page are far more effective than dozens of forced ones. Focus on user experience – would a user genuinely benefit from clicking this link to learn more?</p> <p><strong>Common Mistake:</strong> Using generic anchor text. “Learn more” or “read here” tells search engines nothing about the linked page. Be specific!</p> <h2 id="section-7">5. Optimize Images for Performance and Accessibility</h2> <p>Images make your content engaging, but if not optimized, they can drastically slow down your page load times, which is a major ranking factor. They also need to be accessible.</p> <ul> <li><strong>Compression:</strong> Always compress your images before uploading. I use <a href="https://tinypng.com/" target="_blank" rel="noopener">TinyPNG</a> (or TinyJPG) for individual images, or a WordPress plugin like <a href="https://imagify.io/" target="_blank" rel="noopener">Imagify</a> for bulk optimization. Aim for image file sizes under 100KB, especially for hero images.</li> <li><strong>File Naming:</strong> Use descriptive, keyword-rich file names. Instead of “IMG_001.jpg,” name it “handmade-sterling-silver-earrings-atlanta.jpg.”</li> <li><strong>Alt Text (<alt> attribute):</strong> This is perhaps the most overlooked <strong>on-page SEO</strong> element. Alt text describes the image for visually impaired users (via screen readers) and for search engines. It should be descriptive and incorporate relevant keywords naturally.</li> <li>Example: <strong><img decoding="async" src="handmade-sterling-silver-earrings-atlanta.jpg" alt="Handmade sterling silver earrings crafted by Atlanta artisan"></strong></li> <li>In WordPress, when you upload an image, there’s an “Alt Text” field in the Media Library. Fill it out every time.</li> <li><strong>Responsive Images:</strong> Ensure your images display correctly and load efficiently across all devices (desktop, tablet, mobile). Most modern content management systems handle this automatically, but always double-check.</li> </ul> <p><strong>Pro Tip:</strong> Don’t just stuff keywords into your alt text. Describe the image accurately first, then weave in a keyword naturally if it makes sense. The goal is to provide context.</p> <p><strong>Common Mistake:</strong> Uploading massive, unoptimized images directly from your camera. This is a page speed killer and makes your site inaccessible to many. I once audited a site for a local bakery in Decatur, Georgia, and their homepage hero image was 5MB! No wonder their bounce rate was through the roof. We compressed it to under 150KB, and their page load speed improved by nearly 4 seconds.</p> <aside class="related-callout"><span class="related-callout-label">Related Reading</span><a href="https://rankanddiscover.com/technical-seo-why-sarah-s-business-failed-in-2026/">Technical SEO: Why Sarah’s Business Failed in 2026</a></p> <p class="related-callout-excerpt">Learn how neglecting fundamental technical SEO, including image optimization, can lead to significant business failures.</p> </aside> <h2 id="section-8">6. Ensure Mobile-First Design and Speed Optimization</h2> <p>Google officially switched to mobile-first indexing years ago. If your site isn’t fast and flawless on mobile, you’re not just losing rankings; you’re losing potential customers.</p> <ul> <li><strong>Responsive Design:</strong> Your website MUST be responsive, meaning it adapts seamlessly to any screen size. Test your site using Google’s <a href="https://search.google.com/test/mobile-friendly" target="_blank" rel="noopener">Mobile-Friendly Test</a>.</li> <li><strong>Page Speed:</strong> This is non-negotiable. Use <a href="https://pagespeed.web.dev/" target="_blank" rel="noopener">Google PageSpeed Insights</a> to analyze your site’s performance. Focus on core web vitals: LCP (Largest Contentful Paint), FID (First Input Delay), and CLS (Cumulative Layout Shift). Aim for green scores across the board.</li> <li><strong>Caching:</strong> Implement a caching plugin (like <a href="https://wp-rocket.me/" target="_blank" rel="noopener">WP Rocket</a> for WordPress) to serve cached versions of your pages, significantly reducing load times.</li> <li><strong>Minify CSS and JavaScript:</strong> Tools within caching plugins or your web host can often do this. It removes unnecessary characters from your code, making files smaller and faster to load.</li> <li><strong>Choose a Fast Host:</strong> This is foundational. A cheap, slow host will always undermine your <strong>on-page SEO</strong> efforts. Invest in quality hosting.</li> </ul> <p><strong>Pro Tip:</strong> Regularly monitor your Core Web Vitals in <a href="https://search.google.com/search-console/" target="_blank" rel="noopener">Google Search Console</a>. It provides real-world user data, not just lab data, which is far more indicative of actual performance.</p> <p><strong>Common Mistake:</strong> Ignoring mobile performance because “most of our sales are on desktop.” Even if conversions happen on desktop, initial research and discovery often begin on mobile. A poor mobile experience sends users elsewhere.</p> <h2 id="section-9">7. Create High-Quality, User-Centric Content</h2> <p>All the technical tweaks in the world won’t save poor content. Your content must be valuable, comprehensive, and genuinely helpful to your audience.</p> <ul> <li><strong>Depth and Comprehensiveness:</strong> For informational queries, aim to cover a topic more thoroughly than your competitors. Don’t just skim the surface. According to a <a href="https://www.hubspot.com/marketing-statistics" target="_blank" rel="noopener">HubSpot study</a>, content that ranks highly tends to be longer and more in-depth.</li> <li><strong>Readability:</strong> Use short paragraphs, bullet points, and clear headings. Break up walls of text. Tools like Yoast SEO have a readability analysis that can help you improve this.</li> <li><strong>Originality:</strong> Don’t just regurgitate what everyone else is saying. Offer unique insights, case studies, or perspectives. My experience has taught me that search engines reward genuine originality.</li> <li><strong>Engagement:</strong> Include calls to action, questions, and opportunities for interaction. Great content keeps users on your page longer, signaling to search engines that your content is valuable.</li> <li><strong>Evolving Content:</strong> Content isn’t static. Review and update your existing content regularly (at least annually). Add new statistics, update outdated information, and expand on topics. This shows search engines your site is active and current.</li> </ul> <p><strong>Pro Tip:</strong> Think about the “People Also Ask” section in Google search results. These are direct questions users are posing, and if your content answers them clearly, you stand a better chance of appearing in those coveted featured snippets.</p> <p><strong>Common Mistake:</strong> Writing for search engines first, users second. This leads to robotic, unengaging content that ultimately fails to convert. Always prioritize the human reader.</p> <p>Ultimately, <a href="https://rankanddiscover.com/online-visibility-2026-seo-strategies-to-roar/">on-page SEO is about telling search engines</a> precisely what your content is about, why it’s valuable, and why it deserves to rank. It’s about laying a robust foundation for all your other marketing efforts. If you don’t nail the basics, you’re building on sand. You also need to ensure your <a href="https://rankanddiscover.com/content-strategy-stop-sabotaging-2026-roi/">content strategy isn’t sabotaging ROI</a>, especially when it comes to discoverability. Don’t let your efforts go to waste; master <a href="https://rankanddiscover.com/content-optimization-fix-your-2026-visibility-crisis/">content optimization to fix your visibility crisis</a>.</p> <div class="faq-section"> <div class="faq-item"> <h3 class="faq-question">How often should I audit my on-page SEO?</h3> <div class="faq-answer"> <p>I recommend a comprehensive on-page SEO audit at least quarterly. For dynamic sites with frequent content updates, a monthly check-in on key pages is even better. Tools like Semrush Site Audit can automate much of this process, flagging issues like broken links, duplicate content, and missing meta descriptions.</p> </div> </div> <div class="faq-item"> <h3 class="faq-question">Can I over-optimize my on-page SEO?</h3> <div class="faq-answer"> <p>Absolutely. This is often called “keyword stuffing” or “over-optimization.” If you unnaturally force keywords into your content, headings, or alt text, search engines can penalize your site. The goal is always natural language and a positive user experience, with keywords integrated thoughtfully, not aggressively.</p> </div> </div> <div the="faq-item"> <h3 class="faq-question">What’s the most important on-page SEO factor?</h3> <div class="faq-answer"> <p>If I had to pick just one, it would be <strong>content quality and relevance</strong>. All the technical optimizations are there to help search engines understand your content, but if the content itself isn’t valuable, comprehensive, and aligned with user intent, it simply won’t rank or convert. A great meta title might get a click, but great content keeps them on the page.</p> </div> </div> <div class="faq-item"> <h3 class="faq-question">Do internal links still matter as much as backlinks?</h3> <div class="faq-answer"> <p>While backlinks from authoritative external sites are incredibly powerful, internal links are entirely within your control and are often underestimated. They are crucial for distributing “link equity” (PageRank) across your site, helping search engines discover new content, and guiding users through your website. Think of them as a critical part of your site’s architecture.</p> </div> </div> <div class="faq-item"> <h3 class="faq-question">Should I use AI tools for on-page SEO writing?</h3> <div class="faq-answer"> <p>AI tools can be fantastic for ideation, outlining, and even drafting initial content. However, for truly high-quality, unique, and authoritative content that resonates with your audience and stands out in search results, human oversight and editing are indispensable. AI still struggles with genuine creativity, nuanced understanding of user intent, and integrating unique brand voice effectively. Use it as an assistant, not a replacement.</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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%2F&text=On-Page+SEO%3A+2026%26%238217%3Bs+75%25+Sales+Boost+Secret" 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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%2F&media=https%3A%2F%2Frankanddiscover.com%2Fwp-content%2Fuploads%2Fsites%2F30%2F2026%2F07%2Fon-page-seo-2026-s-75-sales-boost-secret-featured.webp&description=On-Page+SEO%3A+2026%26%238217%3Bs+75%25+Sales+Boost+Secret" 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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%2F&title=On-Page+SEO%3A+2026%26%238217%3Bs+75%25+Sales+Boost+Secret" 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://rankanddiscover.com/on-page-seo-2026-s-75-sales-boost-secret/').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:14207,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://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddjenniferobrien-headshot-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddjenniferobrien-headshot-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://rankanddiscover.com/author/rankanddjenniferobrien/"> Jennifer Obrien </a> </h4> <span class="author-bio-title">Principal Digital Marketing Strategist</span> <span class="author-bio-credentials">MBA, Digital Marketing; Google Ads Certified; Bing Ads Certified</span> <p class="author-bio-description">Jennifer Obrien is a Principal Digital Marketing Strategist with over 14 years of experience specializing in advanced SEO and SEM strategies. As a former Senior Director at OmniMetric Solutions, she led award-winning campaigns for Fortune 500 companies, consistently achieving significant ROI improvements. Her expertise lies in leveraging data analytics for predictive search optimization, and she is the author of the influential white paper, "The Algorithmic Shift: Adapting to Google's Evolving SERP." Currently, she consults for high-growth tech startups, designing scalable search marketing architectures</p> <div class="author-bio-links"> <a href="https://skillshop.withgoogle.com/" target="_blank" rel="noopener noreferrer" class="author-link-badge"> Credentials </a> <span class="author-experience">14+ 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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%2F&text=On-Page+SEO%3A+2026%26%238217%3Bs+75%25+Sales+Boost+Secret" 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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%2F&description=On-Page+SEO%3A+2026%26%238217%3Bs+75%25+Sales+Boost+Secret" 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%2Frankanddiscover.com%2Fon-page-seo-2026-s-75-sales-boost-secret%2F&title=On-Page+SEO%3A+2026%26%238217%3Bs+75%25+Sales+Boost+Secret" 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://rankanddiscover.com/ai-search-visibility-dominate-2026-with-brightedge/" class="sidebar-post-card"> <div class="sidebar-post-thumb"> <img width="300" height="200" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured-300x200.webp?v=1776203161" class="attachment-satellite-thumb size-satellite-thumb wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured-300x200.webp?v=1776203161 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured-600x400.webp?v=1776203161 600w" sizes="auto, (max-width: 300px) 100vw, 300px" /> </div> <div class="sidebar-post-info"> <h4 class="sidebar-post-title">AI Search Visibility: Dominate 2026 with BrightEdge</h4> <div class="sidebar-post-meta"> <time datetime="2026-04-13T20:24:23+00:00">13/04/2026</time> <span class="sidebar-post-views">211 Views</span> </div> </div> </a> <a href="https://rankanddiscover.com/aeo-marketing-data-automation-for-2026-success/" class="sidebar-post-card"> <div class="sidebar-post-thumb"> <img width="300" height="200" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured-300x200.webp?v=1773617301" class="attachment-satellite-thumb size-satellite-thumb wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured-300x200.webp?v=1773617301 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured-600x400.webp?v=1773617301 600w" sizes="auto, (max-width: 300px) 100vw, 300px" /> </div> <div class="sidebar-post-info"> <h4 class="sidebar-post-title">AEO Marketing: Data & Automation for 2026 Success</h4> <div class="sidebar-post-meta"> <time datetime="2026-03-15T23:28:21+00:00">15/03/2026</time> <span class="sidebar-post-views">194 Views</span> </div> </div> </a> <a href="https://rankanddiscover.com/keyword-strategy-in-2026-marketings-new-rules/" class="sidebar-post-card"> <div class="sidebar-post-thumb"> <img width="300" height="200" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/keyword-strategy-in-2026-marketing-s-new-rules-featured-300x200.webp?v=1773833559" class="attachment-satellite-thumb size-satellite-thumb wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/keyword-strategy-in-2026-marketing-s-new-rules-featured-300x200.webp?v=1773833559 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/keyword-strategy-in-2026-marketing-s-new-rules-featured-600x400.webp?v=1773833559 600w" sizes="auto, (max-width: 300px) 100vw, 300px" /> </div> <div class="sidebar-post-info"> <h4 class="sidebar-post-title">Keyword Strategy in 2026: Marketing’s New Rules</h4> <div class="sidebar-post-meta"> <time datetime="2026-03-18T11:32:39+00:00">18/03/2026</time> <span class="sidebar-post-views">179 Views</span> </div> </div> </a> </div> </div> </aside> </div> <nav class="post-navigation"> <a href="https://rankanddiscover.com/keyword-strategy-2026-s-intent-first-revolution/" class="post-nav-link prev"> <div class="post-nav-label">« Previous</div> <div class="post-nav-title">Keyword Strategy: 2026’s Intent-First Revolution</div> </a> <div></div> </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://rankanddiscover.com/keyword-strategy-2026-s-intent-first-revolution/" class="article-card-image" aria-label="Keyword Strategy: 2026’s Intent-First Revolution"> <img width="768" height="419" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/keyword-strategy-2026-s-intent-first-revolution-featured-768x419.webp?v=1785333907" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/keyword-strategy-2026-s-intent-first-revolution-featured-768x419.webp 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/keyword-strategy-2026-s-intent-first-revolution-featured-300x164.webp 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/keyword-strategy-2026-s-intent-first-revolution-featured-1024x559.webp 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/keyword-strategy-2026-s-intent-first-revolution-featured.webp 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/seo-sem/" class="article-card-category" style="color:#334155"> SEO & SEM </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/keyword-strategy-2026-s-intent-first-revolution/">Keyword Strategy: 2026’s Intent-First Revolution</a> </h3> <p class="article-card-excerpt">Listen to this article · 10 min listen1.0xAudio playback not supported in this browser.The future of keyword strategy is less about finding the perfect phrase and more…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddkeonvelasquez-headshot-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddkeonvelasquez-headshot-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Keon Velasquez</span> <span class="dot">·</span> <time datetime="2026-07-29T11:27:10+00:00">29/07/2026</time> <span class="dot">·</span> <span>8 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://rankanddiscover.com/dominate-search-rankings-your-2026-strategy/" class="article-card-image" aria-label="Dominate Search Rankings: Your 2026 Strategy"> <img width="768" height="419" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rank-higher-the-2026-marketing-pro-s-search-playbook-featured-768x419.webp?v=1775835116" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rank-higher-the-2026-marketing-pro-s-search-playbook-featured-768x419.webp?v=1775835116 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rank-higher-the-2026-marketing-pro-s-search-playbook-featured-300x164.webp?v=1775835116 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rank-higher-the-2026-marketing-pro-s-search-playbook-featured-1024x559.webp?v=1775835116 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rank-higher-the-2026-marketing-pro-s-search-playbook-featured.webp?v=1775835116 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/seo-sem/" class="article-card-category" style="color:#334155"> SEO & SEM </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/dominate-search-rankings-your-2026-strategy/">Dominate Search Rankings: Your 2026 Strategy</a> </h3> <p class="article-card-excerpt">Listen to this article · 12 min listen1.0xAudio playback not supported in this browser.Understanding and influencing search rankings is no longer just for SEO specialists; it’s a…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddlenaokoro-headshot-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddlenaokoro-headshot-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Debra Chavez</span> <span class="dot">·</span> <time datetime="2026-07-29T09:06:54+00:00">29/07/2026</time> <span class="dot">·</span> <span>9 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://rankanddiscover.com/ai-search-visibility-dominate-2026-with-brightedge/" class="article-card-image" aria-label="AI Search Visibility: Dominate 2026 with BrightEdge"> <img width="768" height="419" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured-768x419.webp?v=1776203161" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured-768x419.webp?v=1776203161 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured-300x164.webp?v=1776203161 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured-1024x559.webp?v=1776203161 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/ai-search-visibility-dominate-2026-with-brightedge-featured.webp?v=1776203161 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/marketing-analytics/" class="article-card-category" style="color:#0369a1"> Marketing Analytics </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/ai-search-visibility-dominate-2026-with-brightedge/">AI Search Visibility: Dominate 2026 with BrightEdge</a> </h3> <p class="article-card-excerpt">Listen to this article · 10 min listen1.0xAudio playback not supported in this browser.Are you struggling to make your mark in the crowded digital space? Mastering AI…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddjohnsmith-headshot-3-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddjohnsmith-headshot-3-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Amanda Davis</span> <span class="dot">·</span> <time datetime="2026-04-13T20:24:23+00:00">13/04/2026</time> <span class="dot">·</span> <span>8 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://rankanddiscover.com/aeo-marketing-data-automation-for-2026-success/" class="article-card-image" aria-label="AEO Marketing: Data & Automation for 2026 Success"> <img width="768" height="419" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured-768x419.webp?v=1773617301" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured-768x419.webp?v=1773617301 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured-300x164.webp?v=1773617301 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured-1024x559.webp?v=1773617301 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/aeo-marketing-data-automation-for-2026-success-featured.webp?v=1773617301 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/marketing-tech/" class="article-card-category" style="color:#b13a1d"> Marketing Tech </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/aeo-marketing-data-automation-for-2026-success/">AEO Marketing: Data & Automation for 2026 Success</a> </h3> <p class="article-card-excerpt">Listen to this article · 7 min listen1.0xAudio playback not supported in this browser.Are you ready to take your aeo strategies to the next level? In the…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankandddavidlee-headshot-1-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankandddavidlee-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Amanda Gill</span> <span class="dot">·</span> <time datetime="2026-03-15T23:28:21+00:00">15/03/2026</time> <span class="dot">·</span> <span>6 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://rankanddiscover.com/seo-and-marketing-your-2026-digital-asset-plan/" class="article-card-image" aria-label="SEO & Marketing: Your 2026 Digital Asset Plan"> <img width="768" height="419" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/content-optimization-your-2026-marketing-guide-featured-2-768x419.webp?v=1774085218" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/content-optimization-your-2026-marketing-guide-featured-2-768x419.webp?v=1774085218 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/content-optimization-your-2026-marketing-guide-featured-2-300x164.webp?v=1774085218 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/content-optimization-your-2026-marketing-guide-featured-2-1024x559.webp?v=1774085218 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/content-optimization-your-2026-marketing-guide-featured-2.webp?v=1774085218 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/seo-sem/" class="article-card-category" style="color:#334155"> SEO & SEM </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/seo-and-marketing-your-2026-digital-asset-plan/">SEO & Marketing: Your 2026 Digital Asset Plan</a> </h3> <p class="article-card-excerpt">Listen to this article · 11 min listen1.0xAudio playback not supported in this browser.Building a website focused on improving online visibility through SEO and marketing isn’t just…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddkaimatsumoto-headshot-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/rankanddkaimatsumoto-headshot-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Kai Matsumoto</span> <span class="dot">·</span> <time datetime="2026-07-29T08:18:35+00:00">29/07/2026</time> <span class="dot">·</span> <span>9 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://rankanddiscover.com/content-performance-4-truths-for-2026/" class="article-card-image" aria-label="Content Performance: 4 Truths for 2026"> <img width="768" height="419" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/content-performance-4-keys-for-2026-success-featured-768x419.webp?v=1783242542" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/content-performance-4-keys-for-2026-success-featured-768x419.webp 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/content-performance-4-keys-for-2026-success-featured-300x164.webp 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/content-performance-4-keys-for-2026-success-featured-1024x559.webp 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/07/content-performance-4-keys-for-2026-success-featured.webp 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/content-strategy/" class="article-card-category" style="color:#be185d"> Content Strategy </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/content-performance-4-truths-for-2026/">Content Performance: 4 Truths for 2026</a> </h3> <p class="article-card-excerpt">Listen to this article · 11 min listen1.0xAudio playback not supported in this browser.The future of content performance is riddled with more misinformation than a late-night infomercial.…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddmariagarcia-headshot-1-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddmariagarcia-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Amanda Erickson</span> <span class="dot">·</span> <time datetime="2026-07-29T07:50:41+00:00">29/07/2026</time> <span class="dot">·</span> <span>9 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://rankanddiscover.com/search-trends-power-up-your-marketing-strategy/" class="article-card-image" aria-label="Search Trends: Power Up Your Marketing Strategy"> <img width="768" height="384" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/search-trends-power-up-your-marketing-strategy-featured-768x384.webp?v=1773567919" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/search-trends-power-up-your-marketing-strategy-featured-768x384.webp?v=1773567919 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/search-trends-power-up-your-marketing-strategy-featured-300x150.webp?v=1773567919 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/search-trends-power-up-your-marketing-strategy-featured-1024x512.webp?v=1773567919 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/search-trends-power-up-your-marketing-strategy-featured.webp?v=1773567919 1200w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/content-strategy/" class="article-card-category" style="color:#be185d"> Content Strategy </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/search-trends-power-up-your-marketing-strategy/">Search Trends: Power Up Your Marketing Strategy</a> </h3> <p class="article-card-excerpt">Listen to this article · 10 min listen1.0xAudio playback not supported in this browser.Understanding the Power of Search Trends in Marketing In the dynamic world of marketing,…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddjanedoe-headshot-1-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddjanedoe-headshot-1-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Amanda Clarke</span> <span class="dot">·</span> <time datetime="2026-03-14T18:21:52+00:00">14/03/2026</time> <span class="dot">·</span> <span>8 min read</span> </div> </div> </article> <article class="article-card"> <a href="https://rankanddiscover.com/search-ranking-secrets-expert-advice-for-2026/" class="article-card-image" aria-label="Search Ranking Secrets: Expert Advice for 2026"> <img width="768" height="419" src="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/search-ranking-secrets-expert-advice-for-2026-featured-768x419.webp?v=1776179908" class="attachment-medium_large size-medium_large wp-post-image" alt="" loading="lazy" decoding="async" srcset="https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/search-ranking-secrets-expert-advice-for-2026-featured-768x419.webp?v=1776179908 768w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/search-ranking-secrets-expert-advice-for-2026-featured-300x164.webp?v=1776179908 300w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/search-ranking-secrets-expert-advice-for-2026-featured-1024x559.webp?v=1776179908 1024w, https://rankanddiscover.com/wp-content/uploads/sites/30/2026/04/search-ranking-secrets-expert-advice-for-2026-featured.webp?v=1776179908 1408w" sizes="auto, (max-width: 768px) 100vw, 768px" /> </a> <div class="article-card-body"> <a href="https://rankanddiscover.com/category/content-strategy/" class="article-card-category" style="color:#be185d"> Content Strategy </a> <h3 class="article-card-title"> <a href="https://rankanddiscover.com/search-ranking-secrets-expert-advice-for-2026/">Search Ranking Secrets: Expert Advice for 2026</a> </h3> <p class="article-card-excerpt">Listen to this article · 9 min listen1.0xAudio playback not supported in this browser. Demystifying Search Rankings: Expert Analysis and Insights for 2026 Are your website’s search…</p> <div class="article-card-meta"> <img fetchpriority="low" alt='' src='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddjohnsmith-headshot-3-150x150.png' srcset='https://rankanddiscover.com/wp-content/uploads/sites/30/2026/03/rankanddjohnsmith-headshot-3-150x150.png 2x' class='avatar avatar-22 photo' height='22' width='22' loading='lazy' decoding='async'/> <span class="author-name">Amanda Davis</span> <span class="dot">·</span> <time datetime="2026-04-14T10:55:46+00:00">14/04/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><!-- .container --> <footer class="site-footer" role="contentinfo"> <div class="footer-main"> <div class="footer-col footer-about"> <div class="widget"> <h3 class="widget-title">Rank & Discover</h3> <p>Expert insights, guides, and stories about marketing</p> </div> </div> <div class="footer-col"> <div class="widget"> <h3 class="widget-title">Categories</h3> <ul> <li class="cat-item cat-item-25"><a href="https://rankanddiscover.com/category/campaign-insights/">Campaign Insights</a> </li> <li class="cat-item cat-item-19"><a href="https://rankanddiscover.com/category/content-strategy/">Content Strategy</a> </li> <li class="cat-item cat-item-21"><a href="https://rankanddiscover.com/category/customer-experience/">Customer Experience</a> </li> <li class="cat-item cat-item-18"><a href="https://rankanddiscover.com/category/digital-marketing/">Digital Marketing</a> </li> <li class="cat-item cat-item-20"><a href="https://rankanddiscover.com/category/marketing-analytics/">Marketing Analytics</a> </li> <li class="cat-item cat-item-24"><a href="https://rankanddiscover.com/category/marketing-tech/">Marketing Tech</a> </li> <li class="cat-item cat-item-23"><a href="https://rankanddiscover.com/category/seo-sem/">SEO & SEM</a> </li> <li class="cat-item cat-item-22"><a href="https://rankanddiscover.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://rankanddiscover.com/">Home</a></li> <li><a href="https://rankanddiscover.com/editorial-standards/">Editorial Standards</a></li> <li><a href="https://rankanddiscover.com/about/">About</a></li> <li><a href="https://rankanddiscover.com/contact/">Contact</a></li> <li><a href="https://rankanddiscover.com/privacy-policy/">Privacy Policy</a></li> <li><a href="https://rankanddiscover.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://rankanddiscover.com/author/rankanddmarcuskim/">Debra Cook</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddkeishadubois/">Deanna Barry</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddjaviermontoya/">David Willis</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddkaimatsumoto/">Kai Matsumoto</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddniaokafor/">Dawn Moore</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddashleywilson/">Anne Merritt</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddjanedoe/">Amanda Clarke</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddseraphinacruz/">Seraphina Cruz</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddlenakimani/">Dawn Johnson</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddrorychung/">Deborah Lynch</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddsashanguyen/">Debra Clark</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddkeishamontgomery/">Debra Christian</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddmateochavez/">Debbie Cline</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddjenniferobrien/">Jennifer Obrien</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddmarcuschen/">Dawn Ross</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddmariagarcia/">Amanda Erickson</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankandddevinchandra/">Deborah Santos</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddjamaladeyemi/">Deanna Mitchell</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddjennifermurray/">Jennifer Murray</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddkeatonadetunji/">Keaton Adetunji</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddemilyjohnson/">Anne Reid</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddzarakhan/">Deanna Hicks</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddjohnsmith/">Amanda Davis</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddnaoiseoconnell/">Naoise OConnell</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddrenatachung/">Debbie Henderson</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddkevinbrown/">Anne Hart</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddanyasharma/">Dawn Coleman</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddrohanpatel/">Dean Morris</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankanddjamilaowusu/">Deborah Ferguson</a></li> <li style="break-inside: avoid; -webkit-column-break-inside: avoid; page-break-inside: avoid; padding: 2px 0;"><a href="https://rankanddiscover.com/author/rankandddavidlee/">Amanda Gill</a></li> </ul> </div> </div> </div> <div class="footer-bottom"> <div class="footer-bottom-inner"> <div class="footer-copyright"> © 2026 Rank & Discover. All rights reserved. </div> <nav class="footer-nav" role="navigation"> </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 type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/sites/30/*","/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://rankanddiscover.com/wp-admin/admin-ajax.php","nonce":"d22082fc1d"}; //# sourceURL=satellite-main-js-extra </script> <script src="https://rankanddiscover.com/wp-content/themes/satellite-theme/assets/js/main.js?ver=4.10.1" id="satellite-main-js"></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="rankanddiscover.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=rankanddiscover.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 = "rankanddiscover.com"; var AEO_VARIANT = "small-report"; var AEO_NICHE = "marketing"; var AEO_EVENT_URL = "https:\/\/rankanddiscover.com\/wp-json\/satellite\/v1\/lead-event"; var AEO_EVENT_NONCE = "cc5ada54f1"; /* 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:\/\/rankanddiscover.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/gemini.svg"},{"name":"Grok","bg":"#111111","logo":"https:\/\/rankanddiscover.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/grok.svg"},{"name":"Perplexity","bg":"#1FB8CD","logo":"https:\/\/rankanddiscover.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/perplexity.svg"},{"name":"ChatGPT","bg":"#10A37F","logo":"https:\/\/rankanddiscover.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/chatgpt.svg"},{"name":"Copilot","bg":"#FFFFFF","logo":"https:\/\/rankanddiscover.com\/wp-content\/mu-plugins\/aeo-assets\/logos\/copilot.svg"},{"name":"Claude","bg":"#D97757","logo":"https:\/\/rankanddiscover.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> (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>