On-page SEO is the set of optimisations you make directly to a page's content and HTML to help search engines understand what it is about and rank it for relevant queries. Unlike off-page factors like backlinks β€” which depend on what other websites do β€” on-page SEO is entirely within your control. Getting it right on every blog post is one of the most reliable ways to improve rankings.

This guide covers every on-page element in the order you should address them, from keyword research through to publication.

Step 1 β€” Target One Primary Keyword

Every blog post should target one specific primary keyword or phrase. This is the term you most want the post to rank for, and it should reflect the core topic of the article. Choose a keyword with realistic ranking potential β€” as we covered in our guide to long-tail keywords, specific phrases with lower competition give newer sites a much better chance of ranking than broad, highly competitive terms.

Use our keyword density checker after writing to verify your target keyword appears naturally throughout the content without over-optimisation.

HTML Document AreaOptimal Density & OccurrenceSearch Intent ValueTechnical Rule
<title> Tag1x (Primary keyword near front)Maximum relevance weightingKeep strictly under 60 characters
<h1> Main Header1x per URL (Exact or close variant)High structural signalMust reflect primary user query intent
First 100 Words1x natural placementHigh early-indexing weightDirectly answers extractable user question
Subheadings <h2> / <h3>2–3x semantic synonymsTopical entity expansionAvoid exact duplicate repetitions
Body Text Density1.0% – 2.2% natural distributionTopical coverage signalStop when text sounds forced or unnatural

Step 2 β€” Optimise Your Title Tag

Your title tag is the most important on-page SEO element. It should contain your primary keyword, ideally near the beginning, and be between 50–60 characters to avoid truncation in search results. As we covered in our guide to optimising title tags, write it for humans first β€” a compelling title that makes searchers want to click is more valuable than a technically perfect but boring one.

Step 3 β€” Write a Compelling Meta Description

Your meta description should summarise what the post delivers in 150–160 characters, include the primary keyword naturally, and include a subtle call to action. While it is not a direct ranking factor, it significantly impacts click-through rates from search results. Review our guide to meta descriptions for the full best practice framework.

Step 4 β€” Use a Clear H1 and H2 Structure

Your H1 should match or closely echo your title tag and contain your primary keyword. Your H2 subheadings should cover the main sections of the article and naturally incorporate secondary keywords and related phrases. As we covered in our guide to heading tag optimisation, never use headings purely for visual styling β€” they carry genuine semantic weight.

Step 5 β€” Write Comprehensive, Original Content

Length matters less than completeness. Cover the topic thoroughly enough that a reader does not need to visit another page to get their question answered. Include relevant examples, specific data where possible, and practical actionable advice. Generic content that could have been written about any site earns no backlinks and ranks poorly long-term.

Step 6 β€” Optimise Your URL Slug

Your URL should be short, descriptive, lowercase, hyphenated, and contain your primary keyword. Remove stop words (the, a, and, of) to keep it concise. As we covered in our guide to SEO-friendly URLs, a clean URL is a small but consistent ranking signal and improves click-through rates in search results.

Step 7 β€” Add Internal Links

Link naturally to 2–4 related articles on your site within the body content. Choose anchor text that describes the destination page's topic accurately. Internal links help Google discover and understand related content, distribute link equity, and keep readers engaged on your site longer.

Step 8 β€” Optimise Images

Every image should have a descriptive alt text containing relevant keywords where appropriate. File names should be descriptive rather than generic (seo-audit-checklist.jpg not image001.jpg). Compress images before uploading to keep page load times fast β€” slow pages hurt rankings as we covered in our guide to Core Web Vitals.

Step 9 β€” Add Schema Markup

Add Article schema to every blog post. This tells Google explicitly that the content is an article, who wrote it, when it was published, and what the featured image is. As we covered in our guide to schema markup, Article schema improves Google's understanding of your content and can improve rich result eligibility.

Technical Diagnostic Checklist: On-Page Keyword Strategy
  • ✓
    Target Exact Intent in Titles: Align your `` tag and primary `<h1>` with the explicit problem the searcher is attempting to solve.</div></li><li><span class="checklist-icon">✓</span><div><strong>Check Natural Keyword Density:</strong> Run <a href="/keyword-density">Keyword Density Checker</a> to confirm keyword density remains under 2.5% without keyword stuffing.</div></li><li><span class="checklist-icon">✓</span><div><strong>Answer the Query in the First 100 Words:</strong> Provide an authoritative, direct 40-word extractable answer right below the introductory heading.</div></li><li><span class="checklist-icon">✓</span><div><strong>Incorporate Semantic LSI Entities:</strong> Expand subheadings to cover closely related topical entities, questions, and technical comparisons.</div></li></ul></div> <h2>Strategic Action Plan: Mastering On-Page Keyword Strategy</h2> <p>On-page SEO is a checklist you run through before every post goes live: primary keyword, title tag, meta description, H1 and H2 structure, comprehensive content, clean URL, internal links, optimised images, and schema markup. Each element is a small signal β€” together they tell a clear, consistent story about what your page is about and why it deserves to rank.</p> <p><em>Missed the previous article? Read: <a href="/blog/what-is-pagerank-seo">What Is PageRank and How Does It Work?</a></em></p> <div class="related-guides"><h3 class="related-guides-title"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"></path><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"></path></svg>Related Technical SEO Guides</h3><ul class="related-guides-list"><li><a href="/blog/keyword-density-how-much-is-too-much">Keyword Density β€” How Much Is Too Much?</a><span class="related-guides-desc">Keyword density is widely misunderstood. Learn what it actually means for SEO in 2025, what the right balance looks like, and how to check your own content.</span></li><li><a href="/blog/how-to-optimise-your-title-tags-for-seo">How to Optimise Your Title Tags for SEO</a><span class="related-guides-desc">Learn how to optimise your title tags for SEO with best practices to improve rankings and user engagement.</span></li><li><a href="/blog/meta-descriptions-seo">Meta Descriptions: Do They Still Matter for SEO?</a><span class="related-guides-desc">Meta descriptions do not directly affect rankings but they dramatically impact click-through rates. Learn how to write them effectively for maximum SEO benefit.</span></li></ul></div> </div> <!-- In-Article SEO Audit Callout --> <div class="article-audit-card"> <div class="article-audit-badge">πŸ’Ό Agency SEO Solution</div> <h3 class="article-audit-title">Need a Comprehensive Technical SEO Audit for Your Domain?</h3> <p class="article-audit-desc">Our team analyzes crawl depth, link equity leaks, Core Web Vitals bottlenecks, and manual indexation blockers to help you scale organic revenue.</p> <a href="/contact?service=audit" class="article-audit-btn"> <span>Request Technical Audit</span> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg> </a> </div> <!-- Prev / Next --> <div class="article-nav"> <a href="/blog/what-is-pagerank-seo" class="nav-card prev"> <div class="nav-label">← Previous</div> <div class="nav-title">What Is PageRank and How Does It Work in 2025?</div> </a> <a href="/blog/content-siloing-seo" class="nav-card next"> <div class="nav-label">Next β†’</div> <div class="nav-title">What Is Content Siloing and How Does It Strengthen Your SEO?</div> </a> </div> </article> <!-- SIDEBAR --> <aside> <div class="sidebar-card"> <div class="sidebar-title">πŸ› οΈ Free SEO Tools</div> <a href="/scan" class="sidebar-tool">πŸ”— Broken Link Checker</a> <a href="/internal-links" class="sidebar-tool">πŸ•ΈοΈ Internal Links</a> <a href="/page-speed" class="sidebar-tool">⚑ Page Speed</a> <a href="/ssl-checker" class="sidebar-tool">πŸ”’ SSL Checker</a> <a href="/keyword-density" class="sidebar-tool">🎯 KW Density</a> <a href="/anchor-analyser" class="sidebar-tool">πŸ“Š Anchor Analyser</a> <a href="/wayback" class="sidebar-tool">πŸ•°οΈ Wayback Extractor</a> </div> <div class="sidebar-card"> <div class="sidebar-title">πŸ“° Recent Articles</div> <a href="/blog/build-backlinks-infographics-seo" class="recent-item"> <div class="recent-title">How to Build Backlinks with Infographics</div> </a> <a href="/blog/seo-kpis-measure-report-results" class="recent-item"> <div class="recent-title">SEO KPIs β€” What to Measure and How to Report Results</div> </a> <a href="/blog/screaming-frog-seo-audit-guide" class="recent-item"> <div class="recent-title">How to Use Screaming Frog for SEO Audits β€” Complete Guide</div> </a> <a href="/blog/seo-for-nonprofits-charities" class="recent-item"> <div class="recent-title">SEO for Nonprofits β€” How Charities Can Win on Google</div> </a> <a href="/blog/international-seo-hreflang-implementation" class="recent-item"> <div class="recent-title">How to Do International SEO with hreflang Tags</div> </a> </div> </aside> </div> <footer class="site-footer"> <div class="site-footer-inner"> <div class="footer-grid"> <!-- Col 1: Brand --> <div class="footer-brand"> <a href="/" class="f-logo"> <span class="nav-brand-dot"></span>SEOLinkScan </a> <p>Enterprise-grade, 100% free webmaster & SEO diagnostics. Scan for broken links, analyze anchors, audit site speed, inspect SSL certificates, and extract archived web snapshots.</p> <div style="margin-top: 14px; display: flex; gap: 8px; flex-wrap: wrap;"> <span class="badge-pill badge-brand">⚑ 100% Free</span> <span class="badge-pill badge-success">βœ“ No Signup Required</span> </div> </div> <!-- Col 2: Audit Tools --> <div class="footer-col"> <h4>Audit & Speed</h4> <ul> <li><a href="/scan">Broken Link Checker</a></li> <li><a href="/internal-links">Internal Links Audit</a></li> <li><a href="/page-speed">Page Speed & Vitals</a></li> <li><a href="/ssl-checker">SSL Certificate Test</a></li> <li><a href="/theme-detector">Theme & CMS Detector</a></li> </ul> </div> <!-- Col 3: SEO Analysis & Archive --> <div class="footer-col"> <h4>SEO & Utilities</h4> <ul> <li><a href="/anchor-analyser">Anchor Text Analyser</a></li> <li><a href="/keyword-density">Keyword Density Tool</a></li> <li><a href="/wayback">Wayback URL Extractor</a></li> <li><a href="/wayback-screenshots">Wayback Screenshots</a></li> <li><a href="/password-generator">Password Generator</a></li> </ul> </div> <!-- Col 4: Resources & Legal --> <div class="footer-col"> <h4>Company & Legal</h4> <ul> <li><a href="/blog/">SEO Blog & Guides</a></li> <li><a href="/about">About Us</a></li> <li><a href="/contact">Contact Support</a></li> <li><a href="/privacy-policy">Privacy Policy</a></li> <li><a href="/terms">Terms of Service</a></li> <li><a href="/cookie-policy">Cookie Policy</a></li> </ul> </div> </div> <!-- Bottom copyright --> <div class="footer-bottom"> <div> © 2026 <strong>SEOLinkScan</strong>. All rights reserved. </div> <div> Designed for Webmasters, Marketers & SEO Agencies. </div> </div> </div> </footer> // right before </body> on scan.php, index.php, blog-home.php, article.php, etc.) ?> <div id="cookie-consent-banner" style=" position:fixed;left:0;right:0;bottom:0;z-index:9999; background:#0f0e0b;color:#fff;padding:18px 24px; display:none;align-items:center;justify-content:space-between;gap:20px; font-family:'DM Sans',sans-serif;font-size:14px;box-shadow:0 -4px 20px rgba(0,0,0,.15); flex-wrap:wrap;"> <div style="flex:1;min-width:240px;color:#d8d6cf;line-height:1.6;"> We use cookies to run this site (essential), remember your scan preferences, and understand site usage. See our <a href="/cookie-policy" style="color:#f0a500;text-decoration:underline;">Cookie Policy</a>. </div> <div style="display:flex;gap:10px;flex-shrink:0;"> <button id="cc-reject" style="background:transparent;border:1px solid #4a473f;color:#d8d6cf;border-radius:8px;padding:9px 16px;font-size:13px;cursor:pointer;"> Essential only </button> <button id="cc-accept" style="background:#e8642c;border:none;color:#fff;border-radius:8px;padding:9px 16px;font-size:13px;font-weight:600;cursor:pointer;"> Accept all </button> </div> </div> <script> (function () { var COOKIE_NAME = 'slc_consent'; var banner = document.getElementById('cookie-consent-banner'); if (!banner) return; function getCookie(name) { var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)')); return match ? match[2] : null; } function setCookie(name, value, days) { var d = new Date(); d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000); document.cookie = name + '=' + value + ';expires=' + d.toUTCString() + ';path=/;SameSite=Lax'; } function applyConsent(level) { // level: 'all' or 'essential' if (level === 'all') { // Enable analytics/AdSense personalization here if you gate those, e.g.: // loadGoogleAnalytics(); } // Essential cookies (PHPSESSID, CSRF) always load regardless β€” don't gate those. } var existing = getCookie(COOKIE_NAME); if (!existing) { banner.style.display = 'flex'; } else { applyConsent(existing); } document.getElementById('cc-accept').addEventListener('click', function () { setCookie(COOKIE_NAME, 'all', 180); applyConsent('all'); banner.style.display = 'none'; }); document.getElementById('cc-reject').addEventListener('click', function () { setCookie(COOKIE_NAME, 'essential', 180); applyConsent('essential'); banner.style.display = 'none'; }); // Lets the "Manage Cookie Preferences" button on cookie-policy.php reopen this banner window.reopenCookieBanner = function () { banner.style.display = 'flex'; }; })(); </script> </body> </html>