Guide

Finding under-linked pillar pages automatically

Learn how to set up automated pipelines to catch under-linked pillar pages using Python, Screaming Frog, and GSC before organic revenue drops.

Finding under-linked pillar pages automatically — OptiLink
Key takeaways
  • Manual internal link audits fail because content production always outpaces human spreadsheets.
  • A pillar page needs both a high raw internal link count and high contextual relevance from supporting cluster nodes.
  • You can build an automated detection pipeline using Screaming Frog CLI, Google Search Console API, and simple Python scripts.
  • PageRank modeling without traffic and conversion data leads to optimizing pages that bring zero business value.
Quick answer

There is no universal number, but a pillar page should typically have more internal links than any supporting subpage in its cluster. The exact count depends on your total site size, but a reliable rule of thumb is that a pillar should sit at a shallower click depth (usually 1 to 2 clicks from the homepage) and possess significantly higher relative PageRank than its supporting articles. If supporting nodes have 20 internal links while the pillar only has 5, the architecture is inverted and needs immediate rebalancing.

How many internal links should a pillar page have?

OptiLink · Key takeaways1
Manual internal link audits fail because…
2
A pillar page needs both a…
3
You can build an automated detection…

Most internal link strategies break because site architectures expand faster than human memory can track them.

When I took over a messy publishing setup with over fifty thousand URLs, the client had dozens of high-value resource hubs sitting buried five clicks deep with fewer than three internal links pointing to them. The editorial team was pumping out twenty fresh articles a week, but nobody was back-linking to the core conversion hubs. We tried running manual monthly spreadsheets, but by the time we finished analyzing the data, the content team had already shifted priorities. Finding under-linked pillar pages automatically became the only way we could prevent our key landing pages from silently sliding down the search results.


Why manual internal link audits fail at scale

If your site has more than a few hundred pages, manual link audits are a waste of time. You open Screaming Frog, export the internal outlinks and inlinks to a CSV, run a VLOOKUP against your list of key target pages, and spend hours sorting columns. By the time you hand that spreadsheet off to a content manager, three new blog posts have gone live without a single link to your primary hub, two old articles have been deleted without redirects, and a site update wiped out your sidebar navigation.

Manual audits give you a static snapshot of a dynamic system. They capture a single point in time, ignoring how content teams actually work. Editorial pipelines operate on deadlines; writers do not naturally browse site maps to find where to add contextual links.

The fundamental problem is scale. As your publishing volume increases, the total number of internal linking paths grows exponentially. A human auditor can check if a primary landing page has links, but they cannot easily evaluate whether the right supporting pages are pointing to it, or if the relative distribution of link equity across the entire cluster is balanced.

When you rely on manual checks, you only fix broken architecture reactively—usually after you notice impressions dropping in Google Search Console. Automation flips this dynamic by transforming internal link hygiene into a continuous background check.


A young woman in a casual setting using a laptop and sipping a drink outdoors
Photo by Gustavo Fring on Pexels

Defining the technical metrics of an under-linked pillar

Before building an automated detection system, you must mathematically define what an “under-linked” pillar page actually looks like. Simply counting total inlinks is not enough. A page with fifty footer links from low-value utility pages is still functionally under-linked compared to a page with five contextual body links from your highest-traffic blog posts.

To flag these pages programmatically, you need to track four core technical metrics across every URL on your site:

Metric Target Value for Pillars What It Measures Automation Trigger Threshold
Crawl Depth 1 to 2 clicks from root Number of clicks required to reach the URL from the homepage. Depth ≥ 4 clicks
Inlink Ratio Top 5% of total site URLs Ratio of internal inlinks on the target page vs. average page inlinks. Pillar inlinks < Cluster avg inlinks
Relative PageRank > 0.05 (internal log scale) Internal equity score computed purely from internal link topology. Equity score drops below 80th percentile
Contextual Body Inlinks ≥ 10 unique body links Inlinks located strictly inside <main> or <article> HTML tags. In-content links < 5 unique sources

A pillar page should never sit at a deeper crawl depth than the content created to support it. If your primary guide on “Cloud Migration” sits at a depth of four clicks, but a supporting article published yesterday sits at depth two because it appeared on the homepage blog roll, your site architecture is feeding equity to the satellite page while starving the authority hub.

Furthermore, you need to differentiate between structural links (header, footer, sidebar) and contextual links. Search engines weigh links inside the main body text far heavier than boilerplate navigation. If your automated detection logic only counts raw HTML inlinks, a sitewide footer link will mask the fact that your page has zero editorial support from topically relevant content.


Building an automated detection pipeline with Python and Screaming Frog

You can automate under-linked pillar detection without spending thousands on custom enterprise software. By pairing Screaming Frog’s Command Line Interface (CLI) with Python and the Google Search Console API, you can build a daily or weekly pipeline that flags architectural issues automatically.

Here is the exact step-by-step workflow to configure an automated crawling and alerting pipeline:

  1. Configure Screaming Frog for Headless Execution: Set up a .seospiderconfig file that forces Screaming Frog to store crawl data, extract in-content body links separately from navigation, and connect to your Google Search Console API account.
  2. Set Up a Scheduled Cron Job: Run the Screaming Frog CLI in headless mode on a cloud server or local machine at a low-traffic time (e.g., Sunday at midnight).
  3. Export Key CSV Reports Programmatically: Force the CLI to output the all_inlinks.csv, internal_html.csv, and crawl_path.csv files to a specific directory.
  4. Run a Python Script for Data Merging: Write a Python script using pandas to read the exported CSVs and cross-reference them against a master mapping file of your designated pillar URLs.
  5. Calculate Contextual Inlinks and Crawl Depth: Filter the inlink data to isolate links originating within body text containers, discarding navigation, header, and footer blocks.
  6. Flag Violations Against Thresholds: Instruct the script to flag any master pillar URL where total contextual inlinks fall below your baseline target or where crawl depth exceeds three clicks.
  7. Dispatch Automated Alerts: Send a structured payload containing the under-linked URLs directly to a Slack channel or Jira queue for your content team to action.

Young woman in a floral print dress working on a laptop in a modern café setting
Photo by cottonbro studio on Pexels

Step-by-step tutorial: Finding under-linked pillar pages automatically

Here is a practical Python script to process your crawl data and automatically flag under-linked pillar pages.

Step 1: Prepare your data inputs

Create a file named pillars.csv containing your key target pages. It should look like this:

url,target_cluster
https://example.com/cloud-migration/,cloud
https://example.com/data-security/,security

Export your full internal inlinks from Screaming Frog as all_inlinks.csv. Ensure you have columns for Destination, Source, Link Position, and Type.

Step 2: Execute the Python analysis script

Save and run the following script in the same directory as your CSV files:

import pandas as pd

# Load master list of defined pillar URLs
pillars_df = pd.read_csv('pillars.csv')

# Load raw inlink export from Screaming Frog
inlinks_df = pd.read_csv('all_inlinks.csv')

# Step 1: Filter out non-HTML or non-hyperlink records
valid_links = inlinks_df[
    (inlinks_df['Type'] == 'Hyperlink') & 
    (inlinks_df['Status Code'] == 200)
]

# Step 2: Isolate contextual links (ignoring Nav, Header, Footer)
# Screaming Frog categorizes link positions as 'Content', 'Header', 'Footer', etc.
contextual_links = valid_links[valid_links['Link Position'] == 'Content']

# Step 3: Count unique contextual source pages per destination URL
inlink_counts = contextual_links.groupby('Destination')['Source'].nunique().reset_index()
inlink_counts.columns = ['url', 'contextual_inlinks']

# Step 4: Merge results back into our master pillar dataset
results = pd.merge(pillars_df, inlink_counts, on='url', how='left').fillna(0)

# Step 5: Flag pillars falling below threshold (e.g., fewer than 10 contextual inlinks)
MIN_INLINKS_THRESHOLD = 10
under_linked_pillars = results[results['contextual_inlinks'] < MIN_INLINKS_THRESHOLD]

print("--- UNDER-LINKED PILLAR REPORT ---")
if under_linked_pillars.empty:
    print("All pillar pages meet minimum internal link thresholds.")
else:
    for _, row in under_linked_pillars.iterrows():
        print(f"ALERT: Pillar '{row['url']}' has only {int(row['contextual_inlinks'])} contextual inlinks.")

Step 3: Review output and automate routing

When executed, this script isolates high-value editorial links, ignores boilerplate site framing, compares performance against your business rules, and outputs exact violations. You can easily extend this script to send an email via SMTP or trigger a webhook in your project management software.


Evaluating internal PageRank vs. Search Console performance

A page with fifty internal links might still be functionally under-linked if those links pass zero actual authority. Internal PageRank algorithms assign equity dynamically based on the total distribution of links across the entire domain. If your pillar page receives links exclusively from deep, low-authority URLs that themselves have no inlinks, the absolute link count is misleading.

To build an accurate automated detector, merge internal crawl data with Google Search Console performance data using the GSC API.

Look for these key divergence patterns:

  1. High Query Impressions + Low Average Position + Deep Crawl Depth: This combination indicates Google understands the page is relevant for a given search cluster, but your internal site structure is failing to signal its relative importance. Elevating this page’s position in the site tree usually brings an immediate ranking lift.
  2. High Internal PageRank + Low Search Impressions: This indicates a site architecture error where internal link equity is concentrated on a page that carries no search demand or business utility (such as an old terms of service page, a thin tag archive, or an outdated announcement).
  3. Unbalanced Cluster Inlinks: This happens when supporting cluster articles have higher internal PageRank scores than the parent pillar page itself.

Worked example: Rebalancing a broken SaaS content hub

Let us analyze a practical scenario based on a typical SaaS publishing structure.

A medium-sized B2B SaaS platform maintains a central resource pillar titled “The Ultimate Guide to Endpoint Security.” Surrounding this hub are thirty supporting blog posts focusing on narrow, long-tail subtopics (e.g., “What is zero-trust architecture,” “Patch management best practices,” “SIEM integration steps”).

During a routine automated architecture check, the pipeline flagged the following data across the cluster:

URL Type Total URLs Avg Crawl Depth Avg Contextual Body Links Avg GSC Position
Pillar Hub Page 1 4 clicks 3 links 18.4
Supporting Subpages 30 2 clicks 14 links 8.2

What went wrong

The site published new blog posts directly to the root /blog/ directory, surfacing them instantly on the homepage blog listing. This design gave fresh subpages a shallow crawl depth of two clicks.

However, writers routinely omitted links back to the core pillar page. The pillar page itself was not listed on the homepage, had fallen off the primary blog pagination lists, and depended on an old sidebar link that was wiped during a site redesign.

As a result, the supporting satellite pages had far higher relative internal authority than the pillar page they were meant to feed. Google ranked individual blog posts on page one for narrow queries, but the high-volume primary hub page stagnated on page two for main head terms.

The programmatic fix

  1. Category Navigation Update: The engineering team updated the site header to include a direct link to the primary pillar hub, immediately pulling its crawl depth from four clicks down to one.
  2. Automated Link Insertion Script: A simple script scanned the HTML body of all thirty supporting blog posts for primary keyword variants (e.g., “endpoint security”, “endpoint protection”).
  3. Contextual Backlinking: The script automatically inserted contextual body links pointing back to the core pillar URL across every supporting article lacking one.
  4. Automated Regression Tracking: The team set up a weekly script to ensure that any newly published article tagged under the “Endpoint Security” category automatically contains a link back to the primary hub before hitting production.

Within four weeks of restoring proper link hierarchy, the pillar page jumped from position 18.4 to position 4.1 for its primary head term without acquiring a single new external backlink.

If you run into issues where search engines skip crawling updated links on deep pages, review our practical playbook on fixing crawl delays on fresh product pages.


7-step implementation checklist for automated link balancing

Use this checklist to set up a resilient monitoring system that catches internal link decay before it hurts search rankings.

  • [ ] 1. Define and maintain a central master list of pillar URLs: Create a canonical database, CSV, or CMS tag that explicitly flags core hub pages versus supporting satellite posts.
  • [ ] 2. Establish baseline linking thresholds: Define minimum accepted limits for each pillar type (e.g., Minimum 10 contextual body links, Maximum crawl depth of 2 clicks).
  • [ ] 3. Configure headless crawling tools: Set up Screaming Frog, Sitebulb, or a custom Python crawler to run automatically via cron jobs or CI/CD pipelines.
  • [ ] 4. Isolate contextual body links: Ensure your analysis logic strips out header, footer, and sidebar elements so you measure true editorial support.
  • [ ] 5. Integrate Google Search Console API metrics: Merge impression, click, and position data with crawl topology to prioritize high-value targets.
  • [ ] 6. Build custom alert rules for architecture decay: Set up automated Slack messages, emails, or developer tickets when a pillar page drops below your set thresholds.
  • [ ] 7. Create an editorial workflow for remediation: Provide content managers with pre-vetted contextually relevant supporting articles that can host new links immediately.

Common edge cases that confuse automated detectors

When you automate link monitoring, edge cases in site code can trigger false alerts or hide critical gaps.

JavaScript-rendered links

If your site uses a modern front-end framework (React, Vue, Next.js), links loaded via client-side JavaScript might not appear in a standard raw HTML crawl. If your automated script reads raw HTML without executing JavaScript, it will mark pages as under-linked when they are fully connected in the rendered DOM. Always ensure your automated headless crawler uses a headless browser rendering engine (like Chrome Headless) when fetching pages.

Canonicalized and redirected link chains

A pillar page might show dozens of incoming links in raw crawl exports, but if those links point to an old HTTP, non-WWW, or trailing-slash version of the URL that passes through a 301 redirect, link equity decays. Your script must resolve full redirect paths and count only direct, 200-OK internal links to the canonical destination URL.

Paginated blog archives

As fresh content pushes older articles deeper into blog pagination (e.g., /blog/page/12/), incoming contextual links to your pillar pages get pushed further away from the homepage. A pillar page that had twenty internal links at depth two fast-forwards six months and suddenly sits at depth five because those linking posts sank into archive pagination. Automated monitoring catches this natural decay before it hurts your organic traffic.

If your content inventory includes older resource hubs or institutional assets, check out our guide on how to find broken links on university pages and our guide to fix broken links on resource pages.

Additionally, if your automated setup reveals missing or orphan pages across your environment, follow our complete walk-through on how to audit orphan pages using Google Search Console.


Advanced setup: Continuous integration (CI/CD) checks for SEO

The ultimate end-state for automated link management is moving detection from post-publication audits to pre-publication validation inside your deployment pipeline or CMS workflow.

When a content creator submits a new draft in a headless CMS or git repository, an automated script runs an extraction pass on the text:

  1. The script identifies the primary topic or assigned category tag of the post.
  2. It cross-references this category against your database of master pillar URLs.
  3. It checks whether the draft body contains at least one hyperlink pointing to the designated hub page.
  4. If no link exists, the build pipeline throws a soft warning or blocks publication until a contextual link is inserted.

Shifting internal link management to the draft stage prevents link equity gaps before they ever reach live production servers.


Manual internal link management fails the moment your site expands beyond a single content creator’s mental map. By formalizing what an under-linked page means in code, running scheduled crawls, and matching internal link graphs against Search Console metrics, you build a system that protects your site architecture automatically. Stop exporting static CSV files by hand and build an automated pipeline that finds equity leaks before they cost you revenue.

OptiLink provides continuous, automated monitoring for internal link decay, helping growth teams spot under-linked pillar pages and fix site architecture issues without manual spreadsheets.

Frequently asked questions

How many internal links should a pillar page have?

There is no universal number, but a pillar page should typically have more internal links than any supporting subpage in its cluster. The exact count depends on your total site size, but a reliable rule of thumb is that a pillar should sit at a shallower click depth (usually 1 to 2 clicks from the homepage) and possess significantly higher relative PageRank than its supporting articles. If supporting nodes have 20 internal links while the pillar only has 5, the architecture is inverted and needs immediate rebalancing.

What is the difference between automated internal link checks and manual audits?

Manual audits rely on static CSV exports from tools like Screaming Frog or Ahrefs, which become outdated the moment a content team publishes new posts. Automated checks run on scheduled scripts or via CI/CD pipelines, pulling live crawl data and Search Console metrics to flag orphaned or under-linked pillar pages immediately. Automation catches linking decay in real time, whereas manual audits usually happen reactively after rankings have already dropped.

Can I rely entirely on Google Search Console to find under-linked pages?

No, relying solely on Search Console is a mistake because its internal link report is notoriously sampled, delayed, and lacks context regarding anchor text placement. GSC shows aggregate counts, but it will not tell you if a link lives in a site-wide footer or inside the body content of a topically relevant article. You should combine GSC data with custom Python scripts or specialized crawling tools to evaluate both link quantity and contextual quality.

Why do pillar pages lose internal links over time?

Pillar pages lose relative link equity primarily due to content drift, site redesigns, and decentralized publishing workflows. When freelance writers or editorial teams publish new blog posts, they often link to recent articles rather than core architecture pages. Over months, hundreds of new supporting pages get published without back-linking to the central hub, diluting the pillar's relative importance within the site's internal link graph.

Should I use automated plugins to insert internal links automatically?

Automated plugins that blindly insert exact-match keywords across your site often do more harm than good. They tend to create unnatural, sitewide footers or mid-paragraph links that ignore semantic relevance and user experience. A far better approach is using automation to detect link opportunities and flag them for human review, or programmatically injecting contextual links into draft stages before publication.

How do I know if an under-linked page is actually hurting my SEO?

An under-linked page is actively hurting your performance if it exhibits high impressions in Search Console but low average position, high click depth, or declining relative PageRank. If Google indexes the page and ranks it on page two or three for primary terms, but your internal crawl reveals it has fewer internal links than its own child pages, adding targeted internal links almost always yields an immediate ranking lift.

Frequently asked questions

What is the ideal anchor text ratio for a new site?

A safe starting ratio is 50% branded, 30% naked URLs, 15% partial-match, and 5% exact-match, but adjust based on your niche competitiveness.

Can I use exact-match anchor text after a penalty?

Yes, but only after you’ve disavowed toxic links and rebuilt the profile with 80%+ branded anchors for 3–6 months to restore trust.

How many variations of anchor text should I use per linking domain?

Limit to 2–3 variations per domain to avoid looking manipulative; rotate them across your outreach campaigns.

Is it okay to ask for a specific anchor text in outreach?

You can suggest it, but most editors will ignore the request or rewrite it; focus on providing value so they naturally use your brand or URL.

Frequently asked questions

What is the best anchor text for SEO?

The best anchor text describes the linked page's content clearly and naturally, using relevant keywords without stuffing.

How many types of anchor text are there?

There are six primary types: exact match, partial match, branded, naked URL, image alt, and generic.

What is the best practice for anchor text?

Use varied, contextually relevant anchors that accurately reflect the destination content while avoiding repetitive patterns.

Why is anchor text important in SEO?

It helps search engines understand the topic and relevance of linked pages, boosting topical authority when done correctly.

Frequently asked questions

What is the ideal anchor text ratio for SEO?

Most teams find a 3:1 ratio of partial-match to branded anchors works without triggering filters, but the real answer depends on your niche and existing profile.

Can I use exact-match anchor text after a penalty?

Yes, but only sparingly and usually after rebuilding trust with a heavy branded and partial-match base first.

How many different anchors should I use per page?

There is no magic number, but aiming for at least 5–7 unique variations per target page keeps the profile looking organic.

Is it safe to use naked URLs as anchors?

Absolutely; they are the safest anchor type and often look natural in editorial content, especially for homepages and high-authority references.

Should I nofollow all keyword-rich anchors?

No, a natural mix includes some follow links, but keep the ratio low—around 10–15%—to avoid over-optimization signals.

Frequently asked questions

How do I check my anchor text distribution?

Open Google Search Console, go to Links to your site, and click the 'Anchor text' report. It shows your top anchors and their share of the profile, though it caps at 1,000 links.

What is a healthy anchor text distribution?

Most sites we audit fall into a 50-70% branded/natural mix with exact match anchors under 10%. If your exact match ratio creeps past 15%, it’s a red flag for over-optimization.

Can too much exact match anchor text hurt rankings?

Yes. Google’s Penguin and manual spam filters flag profiles where exact match anchors exceed 15-20%. The safest approach is to keep them under 10% and rely on brand, URL, and related variations for the bulk of your links.

How often should I audit anchor text?

We recommend a light audit after every major link insertion campaign and a full deep-dive quarterly. If you’ve just recovered from a penalty, check monthly until the profile stabilizes.