TL;DR
Internal linking distributes PageRank-like signals, helps Google discover new URLs, and guides users from education (blog) to the offer (money page). Model: service hub → specialization spokes + supporting articles with descriptive anchors. Avoid orphan pages, generic “click here”, footer-link overload, and cannibalization. In Next.js: links in markdown + CTA components + breadcrumbs; a sitemap complements but does not replace HTML links. Host on DevStudioIT Cloud; URL relationship maps can live in Postgres (Branchly). Below: hub architecture, anchor rules, audit, and publish workflow.
Who this is for
- Companies with a blog and service catalogue on one domain
- SEO / content managers planning topic clusters
- Next.js developers building navigation and MDX/markdown
- Teams after migrations where many URLs sit at depth > 4 with no inbound links
Keywords (SEO)
internal linking SEO, blog service page linking, hub pages SEO 2026, anchor text best practices, orphan pages crawl, Next.js crawl paths
Why internal links matter (business + SEO)
| Benefit | Effect |
|---|---|
| URL discovery | crawler finds new posts without relying only on the sitemap |
| Topical context | Google ties blog to money page in one cluster |
| UX / conversion | readers move from “how” to “buy” |
| Authority flow | strong pages (home, hub) reinforce spokes |
| Fewer orphans | every important page has ≥1–3 content inlinks |
A sitemap says “I exist”. A content link says “I matter in this context”.
Architecture: hub → spoke → blog
/en/websites ← HUB (money)
├── /en/websites/for-law-firms ← spoke
├── /en/websites/for-healthcare ← spoke
└── Blog cluster (support):
├── long-tail-keywords-... → link to HUB + spoke
├── open-graph-twitter-cards-... → link to HUB (tech SEO)
└── b2b-leady-ze-strony-www-... → link to HUB + contact CTAHub = commercial H1, CTA, spoke list, and “from the blog”.
Spoke = narrow offer / industry.
Blog = informational coverage + links upward (and sideways between related posts).
Do not build a silo so rigid that users cannot move between services-silos are topical guidance, not a UX prison.
Anchor text, practical rules
| Anchor type | Example | When |
|---|---|---|
| Descriptive (preferred) | “B2B lead form on Next.js” | blog → service / article |
| Partial brand | “DevStudio.it website offer” | sparingly, naturally |
| Exact-match money | “company website” | rarely, not in every post |
| Generic | “click here”, “more” | avoid as the only signal |
| Raw URL | https://... |
OK in footer/docs, weak in prose |
3–8 contextual links in a 1100–1500 word article is usually enough. Excess looks spammy and dilutes focus.
UI CTA buttons can use a short label (“Request a quote”) while a nearby paragraph uses a natural descriptive link to the same money page-fine if you do not overdo it.
Crawl paths and depth
Goal: important money pages within 1–2 clicks of home / hub. Blog posts: from the blog index + hub “related” + other posts.
Home → Service hub → Spoke / Blog post → Form (#formularz-kontakt)
↘ Blog index → Post → Service hub| Symptom | Diagnosis | Fix |
|---|---|---|
| URL only in sitemap | orphan / weak crawl | add hub or related link |
| Depth 5+ in nav | poor IA | shorten path, hub shortcut |
| 40 footer links | thin equity split | footer: essentials; rest in body |
| Only tag pages connect posts | weak context | body links, not taxonomy alone |
Related posts and automation
Manual: 2–4 “Related” at article end (editors know intent).
Semi-auto: tags / cluster translationId / related_slugs table in Branchly.
Avoid “random 5 latest posts”-often zero topical overlap.
// helper, related from frontmatter or DB
export function getRelatedPosts(slug: string, locale: string, limit = 3) {
const map = getRelatedMap(); // JSON or Branchly
return (map[slug] ?? [])
.map((s) => getPost(locale, s))
.filter(Boolean)
.slice(0, limit);
}After deploy on DevStudioIT Cloud, crawl with Screaming Frog (or similar): hub inlinks and orphan candidates.
Workflow when publishing a new post
- Pick 1 primary money page the post must link to
- Add 1–2 links to related articles (horizontal)
- Update the hub “From the blog” / related if the post is strategic
- Breadcrumbs: Home → Blog → Title (aligned with JSON-LD)
- After publish: smoke-test crawl (blog index link exists)
What to avoid
- Linking every post to the homepage instead of the service hub
- Identical exact-match anchors across 20 articles
- JavaScript-only menus with no SSR links in HTML
- Internal
rel=nofollowwithout a reason - Cannibalization: two hubs aggressively targeting the same phrase without intent split
Quarterly audit (~90 minutes)
| Step | Tool | Outcome |
|---|---|---|
| 1. Crawl | Screaming Frog / Sitebulb | inlinks / outlinks list |
| 2. Orphans | sitemap ∩ zero content inlinks | list to link |
| 3. Hub health | manually check 3–5 money pages | “from the blog” + spokes present? |
| 4. Anchor diversity | export outlinks from top posts | too much exact-match? |
| 5. Internal CTR | GA4 path exploration | which blog CTAs work |
Store decisions in a sheet or a Branchly table (from_slug, to_slug, anchor, added_at)-after a redesign you will not remember which links were intentional.
FAQ
How many internal links per article?
Roughly 3–8 contextual links plus a CTA. Relevance beats count.
Are breadcrumbs enough for internal linking?
They help structure and UX but do not replace body links to money pages and related posts.
Language alternates (hreflang) vs internal links?
hreflang / alternates.languages is a language signal in metadata-not a substitute for in-locale content links.
How do we find orphan pages?
Crawl (Screaming Frog, Sitebulb) vs sitemap. Sitemap URL with no content inlinks = candidate to link or noindex if unused.
Want blog and offers wired for SEO?
- Contact us, hubs, link maps, and related posts for Next.js
- Long-tail keywords for service sites, map phrases to URLs
- Sitemap and RSS in Next.js, crawl discovery complement
About the author
We build fast websites, web/mobile apps, AI chatbots and hosting setups — with a focus on SEO and conversion.
Recommended links
From theory to production — Branchly, our hosting stack and shipped work.
