Topical authority for portfolios: how I'm ranking in 30+ countries
A practical implementation of Koray Tugberk Gubur's framework on a freelancer portfolio site. The exact internal-linking structure, schema, and content depth that's working.
I rebuilt my portfolio in 2025 with one obsession: topical authority. Not backlinks. Not keyword stuffing. Topical authority β the Koray Tugberk Gubur framework that has been quietly winning in competitive niches for 4 years.
This post is the implementation. If you are a developer-freelancer trying to rank for "hire X developer in Y country", read on.
The Koray framework, simplified
Koray's idea (heavily simplified): Google ranks websites that demonstrate complete coverage of a topic through an expert source. You become the topical authority for "full-stack development from Pakistan" by:
- Source context β one expert, one author, one voice across all pages.
- Macro-context β central entity (full-stack dev) defined and reinforced.
- Micro-context β every sub-entity (Next.js, Laravel, etc.) covered exhaustively.
- Internal linking β every page links UP, ACROSS and DOWN.
- Historical data β same author, lots of pages, consistent over time.
How I implemented it on this site
1. Single author, source-context everywhere
Every page on this site has a Person JSON-LD pointing to me. Same @id, same name, same image. Google sees one expert behind 1,200 pages.
2. The topical map
Full-Stack Dev (root)
βββ CMS Development
β βββ WordPress
β βββ Shopify
β βββ Webflow
β βββ ...
βββ Custom Websites
β βββ Next.js
β βββ Laravel
β βββ ...
βββ Mobile Apps
βββ SaaS
βββ Website Clones
βββ ...
Each LEAF links to:
- β Parent category
- β 4 siblings
- β 4 country pages
Each COUNTRY page links to:
- β All 8 service categories
- β Region siblings
This is encoded in data/topicalMap.ts and rendered by a <RelatedLinks> component on every page. No manual link maintenance.
3. Programmatic country pages
195 country pages from one template. Each one has:
- Unique title with the country name
- Unique description with capital + currency + local rate
- Country-specific FAQ (built from a function, not copy-paste)
- Hreflang alternates
- LocalBusiness JSON-LD scoped to the country
The trick: each page is genuinely different. Local rate. Local capital. Time-zone overlap math. The template is one file, the data drives the uniqueness.
4. Schema everywhere
Organization+Personon every pageBreadcrumbListon deep pagesServiceon service leafsFAQPageon FAQsBlogPostingon articlesLocalBusinesson country pagesAggregateRatingon the home
Validation via Google's Rich Results test before every deploy.
5. Sitemap chunking
sitemap-index.xml β sitemap-services.xml, sitemap-locations.xml, sitemap-blog.xml. Each child is under 5,000 URLs. Google indexes them in days, not weeks.
What's actually working (60 days in)
- Indexed pages: 240+ of 250 (β96%)
- Ranking keywords: 870 in top 100, 110 in top 10
- Country pages with traffic: 23 (mostly tier-1)
- Direct contacts: 14 (vs 2 in the previous quarter)
What's NOT working
- Tier-3 country pages are getting impressions but no clicks. Lesson: titles need more local hooks. I am rewriting them.
- Generic "Next.js developer" type queries β I rank but on page 2-3. The competitive moat is still high. More content + a backlink push needed.
If you want to copy this
Three things to start with, even if you skip the rest:
- One author, one Person schema, every page. Source context first.
- A topical map file that drives a
RelatedLinkscomponent. Mechanical interlinking beats manual. - Programmatic pages from real data. 195 unique pages > 5 generic ones.
The full implementation is open-source-ish β the code is here and the structure of this site is the demo. Want help planning your own topical map? Drop me a message.
Author
Usama
I have spent the last 6+ years shipping production websites and apps from Pakistan for clients across 30+ countries. I work daily on Fiverr and Upwork, and partner directly with founders, agencies and local businesses on long-term builds.
More about Usama