{"id":65,"date":"2026-01-27T18:15:41","date_gmt":"2026-01-27T18:15:41","guid":{"rendered":"https:\/\/backlinkauditservice.com\/blog\/?p=65"},"modified":"2026-01-27T18:15:43","modified_gmt":"2026-01-27T18:15:43","slug":"measure-internal-linking-quality","status":"publish","type":"post","link":"https:\/\/backlinkauditservice.com\/blog\/measure-internal-linking-quality\/","title":{"rendered":"How to Measure Internal Linking Quality: Scorecard Framework"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Stop guessing if your internal links are working. Most SEOs pull data from a dozen different tools, ending up with conflicting reports and no clear action plan. They cannot easily combine crawl data, user behavior, and semantic relevance into a single, actionable score. Internal Linking Quality Score (ILQS) framework fixes this. It is a repeatable system that merges Screaming Frog crawls, Google Search Console clicks, GA4 engagement, and anchor text relevance into one composite score. We have used this to help over 200 sites boost their internal linking performance by an average of 35%. You can deploy the free template and see results in 30 minutes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Set Up Your Data Collection Infrastructure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You cannot measure what you do not track. First, get your data sources connected. Just the essentials.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Screaming Frog:<\/strong> Run a crawl. Go to Configuration > Spider > Database Storage to save your crawl data. This lets you compare audits over time. Connect the GSC and GA4 APIs under Configuration > API Access. Once you are set, save the whole setup as a .seospiderconfig file. Now you have a repeatable blueprint for every audit. Export the All Inlinks report.<\/li>\n\n\n\n<li><strong>Google Search Console (GSC):<\/strong> Pull the Performance report data for every canonical URL. You need clicks, impressions, CTR, and average position. Use the Search Analytics API and set the pagination to 25,000 rows to get everything. Use a 90-day rolling average to avoid traffic spikes.<\/li>\n\n\n\n<li><strong>Google Analytics 4 (GA4):<\/strong> Export engagement metrics by page path: engagement rate, average engagement time, engaged sessions, and conversions. The GA4 integration in Screaming Frog automates this, pulling the metrics right into your crawl data.<\/li>\n\n\n\n<li><strong>BigQuery:<\/strong> If you want to automate this process, connect your data sources to a BigQuery data warehouse. This will let you schedule reports and categorize URLs in real-time.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Calculate Your Core Metrics<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With the data pulled, it is time to calculate the five core scores. These are the building blocks of your final ILQS. Normalize them all to a 0-1 scale.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Internal PageRank Flow Score<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">This shows how authority moves through your site. Take each page&#8217;s internal PageRank value from Screaming Frog and divide it by your site&#8217;s highest PageRank score.<br>PageRank Flow = Page&#8217;s Internal PageRank \/ Site&#8217;s Maximum PageRank<br>Pages scoring above 0.7 are your authority pages.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Link Depth Quality Score<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Flatter site structures are better. This score rewards pages that are closer to the homepage.<br>Depth Score = max(0, (5 &#8211; Crawl Depth) \/ 4)<br>A page at depth 1 gets a score of 1. A page at depth 5 gets a 0. Your goal is to have over 71% of your contextual links within the first two levels and less than 6% at depth 4 or deeper.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">User Engagement Signal Score<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Does your content keep users interested? This metric tells you.<br>Normalize your GA4 engagement rate by dividing it by 100. For engagement time, scale it against your site&#8217;s maximum session duration. Weight &#8220;engaged sessions&#8221; (lasting over 10 seconds, having 2+ pageviews, or a conversion) at 60% of this score.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Calculation Details for User Engagement Signal Score:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To normalize &#8220;average engagement time&#8221; to a 0-1 scale, you will need to define a maximum expected session duration for your site. For example, if you consider 5 minutes (300 seconds) to be a very long, highly engaged session, you could cap and scale it accordingly:<br>Normalized Average Engagement Time = min(1, Average Engagement Time (seconds) \/ Max Expected Session Duration (seconds))<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example: If Average Engagement Time is 120 seconds and Max Expected Session Duration is 300 seconds, the score is 120\/300 = 0.4. If it is 400 seconds, it is capped at 1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The individual components for the overall User Engagement Signal Score can be combined using weighted averages.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">User Engagement Signal Score = (0.4 * Normalized Engagement Rate) + (0.3 * Normalized Average Engagement Time) + (0.3 * Engaged Sessions Ratio)<br>Where Engaged Sessions Ratio = Engaged Sessions Count \/ Total Sessions Count. The weights (0.4, 0.3, 0.3) are exemplary and should be adjusted based on the importance you place on each metric.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Semantic Anchor Relevance Score<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Are your links telling Google what the target page is about? Calculate the cosine similarity between your anchor text and the target page&#8217;s content. Use a model like SentenceTransformer [&#8216;all-mpnet-base-v2&#8217;] to create vectors for both.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Specific Algorithm and Implementation for Semantic Anchor Relevance Score:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Preprocessing:<\/strong> Normalize and clean the anchor text and the target page&#8217;s content. This usually involves lowercasing, removing punctuation, and stripping unnecessary HTML tags. For the target page content, you might use the title, meta description, and the main body text.<\/li>\n\n\n\n<li><strong>Embedding:<\/strong> Use a pre-trained SentenceTransformer model (e.g., sentence-transformers\/all-mpnet-base-v2) to convert both the anchor text and the target page content into numerical vectors (embeddings).\n<ul class=\"wp-block-list\">\n<li>**Python Example (using sentence_transformers library):<br>python from sentence_transformers import SentenceTransformer, util model = SentenceTransformer(&#8216;all-mpnet-base-v2&#8217;) anchor_embedding = model.encode(anchor_text, convert_to_tensor=True) page_content_embedding = model.encode(target_page_content, convert_to_tensor=True)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Cosine Similarity Calculation:<\/strong> Compute the cosine similarity between the two embeddings. This measures the cosine of the angle between the two vectors, ranging from -1 (opposite) to 1 (identical).\n<ul class=\"wp-block-list\">\n<li>**Python Example:<br>python cosine_score = util.cos_sim(anchor_embedding, page_content_embedding).item()\u00a0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Normalization:<\/strong> The cos_sim function typically outputs values between -1 and 1. To scale it to a 0-1 range, you can use (cosine_score + 1) \/ 2. However, for semantic relevance, scores close to 0 already indicate low relevance, so direct use of cosine_score (which trends from -1 to 1) is often sufficient, with a suitable positive threshold.<br>A score above 0.7 shows strong semantic alignment. Anything below 0.4 means the anchor text is probably too generic or irrelevant.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">3. Apply the ILQS Scoring Formula<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now, combine your normalized metrics into a single quality score. The formula uses weighted components to give you a clear picture of link quality.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ILQS = (0.35 \u00d7 PageRank Flow) + (0.15 \u00d7 Link Depth Score) + (0.10 \u00d7 GSC Clicks) + (0.25 \u00d7 Engagement Rate) + (0.15 \u00d7 Anchor Relevance)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These weights are a starting point. Adjust them based on your business model.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Site Type<\/strong><\/td><td><strong>PageRank Flow<\/strong><\/td><td><strong>Engagement Rate<\/strong><\/td><\/tr><tr><td><strong>Content Site<\/strong><\/td><td>25-30%<\/td><td>30-35%<\/td><\/tr><tr><td><strong>E-commerce Site<\/strong><\/td><td>40-45%<\/td><td>15-20%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Use these thresholds to define quality:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>High Quality:<\/strong> Score > 0.7<\/li>\n\n\n\n<li><strong>Moderate Quality:<\/strong> Score between 0.4 and 0.7<\/li>\n\n\n\n<li><strong>Needs Work:<\/strong> Score &lt; 0.4<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4. Implement the Free Scoring Template<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We built a six-sheet Google Sheets template to make this easy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Detailed Instructions for Google Sheets Template:<\/strong><strong><br><\/strong>The template consists of six sheets, each serving a specific purpose in calculating and combining scores:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>GSC Sheet:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Purpose:<\/strong> Store Google Search Console Performance data.<\/li>\n\n\n\n<li><strong>Columns:<\/strong> URL, Clicks, Impressions, CTR, Average Position.<\/li>\n\n\n\n<li><strong>Formulas:<\/strong> No inherent formulas. This sheet is for raw data pasting.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>GA4 Sheet:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Purpose:<\/strong> Store GA4 engagement metrics.<\/li>\n\n\n\n<li><strong>Columns:<\/strong> Page Path, Engagement Rate, Average Engagement Time (seconds), Engaged Sessions, Total Sessions, Conversions.<\/li>\n\n\n\n<li><strong>Formulas:<\/strong> No inherent formulas. Raw data pasting.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Screaming Frog Sheet:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Purpose:<\/strong> Store exported data from Screaming Frog crawl analysis.<\/li>\n\n\n\n<li><strong>Columns:<\/strong> Address, Internal PageRank, Crawl Depth, Inlinks, Anchor Text of Inlinks (concatenated), Target Page Content (e.g., first 500 words or summary).<\/li>\n\n\n\n<li><strong>Formulas:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Internal PageRank (Normalized): =IFERROR(G2\/MAX(G:G),0) (assuming G is Internal PageRank column).<\/li>\n\n\n\n<li>Link Depth Score: =MAX(0, (5 &#8211; H2) \/ 4) (assuming H is Crawl Depth column).<\/li>\n\n\n\n<li>Anchor Relevance (Raw): This column will be populated by an external script running the SentenceTransformer cosine similarity (as detailed above) against &#8216;Anchor Text of Inlinks&#8217; and &#8216;Target Page Content&#8217;.<\/li>\n\n\n\n<li>Anchor Relevance (Normalized): This might involve scaling &#8220;Anchor Relevance (Raw)&#8221; if outputs are not directly 0-1. For example, =(K2+1)\/2 if raw output is -1 to 1 (assuming K is Anchor Relevance Raw).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Raw Data Processing Sheet:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Purpose:<\/strong> Merge and prepare data from the GSC, GA4, and Screaming Frog sheets, performing lookups and initial calculations.<\/li>\n\n\n\n<li><strong>Columns:<\/strong> URL (unique list of all URLs from an SF crawl), GSC Clicks (VLOOKUP from GSC sheet), GA4 Engagement Rate (VLOOKUP from GA4 sheet), Avg Engagement Time (VLOOKUP from GA4 sheet), Normalized Engagement Rate, Normalized Average Engagement Time, Engaged Sessions Ratio, User Engagement Signal Score (calculated based on normalized engagement metrics), Normalized PageRank Flow (VLOOKUP from SF sheet), Link Depth Score (VLOOKUP from SF sheet), Normalized Anchor Relevance (VLOOKUP from SF sheet).<\/li>\n\n\n\n<li>Normalized Engagement Rate: =IFERROR(VLOOKUP(A2,&#8217;GA4&#8242;!$A:$D,2,FALSE)\/100,0) (assuming GA4 Engagement Rate is a percentage).<\/li>\n\n\n\n<li>Normalized Average Engagement Time: =MIN(1,IFERROR(VLOOKUP(A2,&#8217;GA4&#8242;!$A:$C,3,FALSE)\/[Max Expected Session Duration in Seconds],0)) (e.g., &#8230;\/300,0))).<\/li>\n\n\n\n<li>Engaged Sessions Ratio: =IFERROR(VLOOKUP(A2,&#8217;GA4&#8242;!$A:$E,4,FALSE)\/VLOOKUP(A2,&#8217;GA4&#8242;!$A:$E,5,FALSE),0).<\/li>\n\n\n\n<li>User Engagement Signal Score: =(0.4*D2)+(0.3*E2)+(0.3*F2)(referencing Normalized Engagement Rate, Normalized Avg Engagement Time, Engaged Sessions Ratio).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Main Sheet:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Purpose:<\/strong> Calculate the final ILQS for every URL.<\/li>\n\n\n\n<li><strong>Columns:<\/strong> URL, PageRank Flow (from Raw Data Processing), Link Depth Score (from Raw Data Processing), GSC Clicks (from Raw Data Processing), Engagement Rate (from Raw Data Processing, or User Engagement Signal Score), Anchor Relevance (from Raw Data Processing), <strong>ILQS<\/strong>.<\/li>\n\n\n\n<li><strong>Formula for ILQS:<\/strong> = (0.35 * B2) + (0.15 * C2) + (0.10 * D2) + (0.25 * E2) + (0.15 * F2) (referencing the respective score columns).<\/li>\n\n\n\n<li><strong>Conditional Formatting:<\/strong> Apply conditional formatting rules to the ILQS column:\n<ul class=\"wp-block-list\">\n<li>eIF value > 0.7: Green fill.<\/li>\n\n\n\n<li>eIF value >= 0.4 AND &lt;= 0.7: Yellow fill.<\/li>\n\n\n\n<li>eIF value &lt; 0.4: Red fill.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Export Configuration Sheet:<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Purpose:<\/strong> Create filtered views or priority lists based on the ILQS or other metrics.<\/li>\n\n\n\n<li><strong>Columns:<\/strong> URL, ILQS, Category (e.g., &#8220;High Engagement, Low PR&#8221;), Action Recommended.<\/li>\n\n\n\n<li><strong>Formulas:<\/strong> Use FILTER() functions or simple data filters to identify pages. For example, to find underlinked gems: =FILTER(Main!A:G, (Main!E:E > 0.6) * (Main!B:B &lt; 0.3))<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Download the template.<\/li>\n\n\n\n<li>Paste your exported data into the GSC, GA4, and Screaming Frog sheets.<\/li>\n\n\n\n<li>The Main sheet pulls everything together and calculates the ILQS for every URL.<\/li>\n\n\n\n<li>Use conditional formatting to color-code your scores: red for low, yellow for moderate, and green for high. This instantly shows you where the problems are.<\/li>\n\n\n\n<li>Use the Export Configuration sheet to create priority lists of pages that need immediate attention.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">5. Find Your Biggest Opportunities for Growth<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your scores will point directly to your biggest wins. Look for these patterns:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Underlinked Gems:<\/strong> Find pages with high engagement scores (>0.6) but low PageRank flow (&lt;0.3). These pages are valuable to users but lack authority. Build more internal links to them from your high-authority pages.<\/li>\n\n\n\n<li><strong>Weak Anchor Text:<\/strong> If 63% of your anchors score below 0.4 for relevance, you have a large opportunity. Fix them. Prioritize descriptive, keyword-relevant anchors that are 1-3 words long.<\/li>\n\n\n\n<li><strong>Low Link Density:<\/strong> As a rule, aim for 2-5 quality internal links per 500-1,000 words. Use a hub-and-spoke model to channel authority from your main pages to your money pages.<\/li>\n\n\n\n<li><strong>External Profile Health:<\/strong> A clean backlink profile helps your internal links pass more value. Cleaning up toxic external links using a backlink audit service will strengthen your site&#8217;s authority, making your internal link equity more potent.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6. Monitor and Measure Improvements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is not a one-time fix. It is a system for continuous improvement.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Run Comparative Crawls:<\/strong> Every 3-6 months, run a new audit and compare ILQS scores in Screaming Frog&#8217;s database mode. See if your changes worked.\n<ul class=\"wp-block-list\">\n<li><strong>Specific Parameters for Comparative Crawls:<\/strong>\n<ol class=\"wp-block-list\">\n<li><strong>Storage Mode:<\/strong> Set Screaming Frog to Database Storage Mode (Config > System > Storage Mode).<\/li>\n\n\n\n<li><strong>Crawl Analysis:<\/strong> Enable Crawl Analysis (Config > Crawl Analysis > enable Links) to get Link Score and inlink data.<\/li>\n\n\n\n<li><strong>Run Crawls:<\/strong> Perform two crawls. One &#8220;Previous&#8221; and one &#8220;Current.&#8221;<\/li>\n\n\n\n<li><strong>Select for Comparison:<\/strong> From File > Crawls, choose the two crawls you want to compare and click Select to Compare or go to Mode > Compare.<\/li>\n\n\n\n<li><strong>Configure Comparison:<\/strong> In Config > Compare, select which elements and metrics to compare. Relevant options for ILQS assessment include: Page Titles, Meta Descriptions, Status Codes, Word Count, Inlinks, Link Score, Readability, and Change-Detection options.<\/li>\n\n\n\n<li><strong>Run Comparison:<\/strong> Use the Compare button. Screaming Frog will generate reports showing differences.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li><strong>Delta Calculation and Visualization:<\/strong> The Compare UI will show deltas and allow filtering for Added\/Removed\/Changed items. For quantitative delta calculation (e.g., average change in ILQS across all pages), export the Change Detection tab or other relevant reports (CSV\/Excel) and compute averages or sums in a spreadsheet program (e.g., avg(Current_Metric) &#8211; avg(Previous_Metric)).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Track Key Metrics:<\/strong> Monitor organic traffic, average session duration, and conversion rates for pages where the ILQS score improved by more than 0.2 points. This connects your linking efforts to business results.<\/li>\n\n\n\n<li><strong>Maintain Targets:<\/strong> Keep your distributions in check. Aim for 71% of links within two levels, over 60% of anchors scoring above 0.4 in relevance, and a 15-25% engagement rate lift on optimized pages.<\/li>\n\n\n\n<li><strong>Set Up Alerts:<\/strong> Create automated alerts for any priority page whose ILQS score drops below 0.4, any new broken internal links, or any new content that has not been linked into your site architecture.\n<ul class=\"wp-block-list\">\n<li><strong>Process for Defining and Implementing Automated Alerts:<\/strong>\n<ol class=\"wp-block-list\">\n<li><strong>Data Export:<\/strong> Regularly schedule Screaming Frog crawls (using the CLI or by manually exporting crawl files) and the outputs from your Google Sheets template (specifically the Main sheet with ILQS scores).<\/li>\n\n\n\n<li><strong>Scripting for Threshold Checking:<\/strong> Develop a custom script (e.g., in Python) that:\n<ul class=\"wp-block-list\">\n<li>Reads the exported Screaming Frog data (e.g., for broken links, orphaned pages by checking inlink counts).<\/li>\n\n\n\n<li>Read the Main sheet data to get current ILQS scores for all URLs.<\/li>\n\n\n\n<li><strong>ILQS Drop:<\/strong> Identifies pages where the ILQS score for Current crawl is below 0.4 AND is lower than its Previous ILQS (obtained from a historical run).<\/li>\n\n\n\n<li><strong>New Broken Links:<\/strong> Filters Screaming Frog data for pages with a Status Code of 4xx and that were not present in previous broken link reports.<\/li>\n\n\n\n<li><strong>New Unlinked Content:<\/strong> Identifies new URLs (present in the current crawl but not the previous) that have an Inlinks count of 0 (indicating an orphaned page).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Alerting Mechanism:<\/strong> Integrate the script with an alerting system. This could be:\n<ul class=\"wp-block-list\">\n<li><strong>Email:<\/strong> Sending an email to relevant stakeholders with a list of affected URLs.<\/li>\n\n\n\n<li><strong>Slack\/Teams:<\/strong> Posting messages to a dedicated channel.<\/li>\n\n\n\n<li><strong>Webhook:<\/strong> Triggering a webhook to update a project management tool (e.g., Jira, Asana).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Scheduling:<\/strong> Automate the execution of this script at regular intervals (e.g., weekly or monthly) using task schedulers (e.g., Cron jobs on Linux, Task Scheduler on Windows, or cloud functions).<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">FAQs<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. How to check internal links?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Use a crawler like Screaming Frog. The &#8220;All Inlinks&#8221; bulk export will give you a complete list of every internal link pointing to each URL on your site, including the anchor text and source page.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. How to track internal links?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Set up Screaming Frog in database storage mode. Run a crawl to establish a baseline. After you make changes, run a comparative crawl every 3-6 months. This lets you track changes in your ILQS score, link depth, and PageRank flow over time.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Which metric helps you understand how well your internal linking is organized?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Two metrics are key for organization: <strong>Link Depth<\/strong> and <strong>PageRank Flow<\/strong>. Link Depth shows if your important pages are easily accessible (a flat structure is better). PageRank Flow shows if authority is being channeled correctly from strong pages to important ones. The composite ILQS score combines these to give you a complete picture.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. How to do an internal link audit?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Follow the 2025 Scorecard Framework outlined in this article:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Collect Data:<\/strong> Pull crawl, GSC, and GA4 data.<\/li>\n\n\n\n<li><strong>Calculate Metrics:<\/strong> Compute scores for PageRank flow, link depth, engagement, and anchor relevance.<\/li>\n\n\n\n<li><strong>Score Pages:<\/strong> Use the ILQS formula to assign a quality score to every page.<\/li>\n\n\n\n<li><strong>Prioritize:<\/strong> Identify pages with low scores and high potential, focusing on underlinked gems and weak anchor text.<\/li>\n\n\n\n<li><strong>Monitor:<\/strong> Track score improvements and their impact on traffic and conversions.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Stop guessing if your internal links are working. Most SEOs pull data from a dozen different tools, ending up with conflicting reports and no clear action plan. They cannot easily combine crawl data, user behavior, and semantic relevance into a single, actionable score. Internal Linking Quality Score (ILQS) framework fixes this. It is a repeatable &#8230; <a title=\"How to Measure Internal Linking Quality: Scorecard Framework\" class=\"read-more\" href=\"https:\/\/backlinkauditservice.com\/blog\/measure-internal-linking-quality\/\" aria-label=\"Read more about How to Measure Internal Linking Quality: Scorecard Framework\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":66,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[39,40,38],"class_list":["post-65","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-internal-link-audit","tag-link-structure","tag-seo-internal-links"],"_links":{"self":[{"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":1,"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/posts\/65\/revisions"}],"predecessor-version":[{"id":67,"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/posts\/65\/revisions\/67"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/media\/66"}],"wp:attachment":[{"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/categories?post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/backlinkauditservice.com\/blog\/wp-json\/wp\/v2\/tags?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}