Ten pages rank on the first page of Google for “international seo audit.” Before writing a line of this, I mapped all ten passage by passage to see what they cover. Not one of them answers whether Germany belongs on a subdirectory or a subdomain. None shows how to check indexation for a single locale. Compliance doesn’t come up once.
So this guide has two jobs: cover what an international audit actually checks, and go where those ten pages stop. The second half is the reason it’s worth your time.
I’m Roman Makuev, Founder & Search Architect at Neon. I’ve spent enough years auditing sites across markets that the same failures now have faces, and at some point I stopped diagnosing them by hand and built the tool I use to measure them — seo-algorithm.com. Everything below is how I actually run this, not a checklist assembled from other people’s checklists.
What an international audit checks that a normal one doesn’t
A regular SEO audit asks what’s wrong with a site. An international audit asks something harder: does Google understand which page belongs to which user, in which country, in which language? The object under review changes. You’re no longer checking a website — you’re checking the intersection of Website × Country × Language × Intent, and most of the failures hide in the gaps between those four, where a single-market audit never looks.
One distinction decides how you read everything after this, so settle it first: are you multilingual, multiregional, or both? A Swiss site in German, French and Italian, all serving one country, is multilingual. A German-language site serving Germany, Austria and Switzerland is multiregional — same language, three markets, three different SERPs. Plenty of sites are both at once, and that’s the point where hreflang stops being a tag you add and becomes an architecture you maintain.
Underneath every check sits one question the ranking pages never answer directly: what actually tells Google which country and language a page is for? Five signals, unequal in weight — the URL (a ccTLD like example.de states a country by itself; a subdirectory states nothing until something else does), hreflang (built for the job — names language and region and ties the set together), Search Console’s international targeting (the one people forget, quietly pointing a folder at a country or at nothing), the language of the content itself, and server or CDN geography (which nudges rather than declares). When they agree, targeting is clean. Most international failures are two of them disagreeing.
Start with the market, not the site
Here’s the most expensive failure in international SEO, and it happens before a single page exists: translating a site into a language whose market never asked for it. Validating demand costs a week. Translating, localizing and then maintaining a dead locale costs years. So I start the audit away from the site entirely.
For each country on the table, I trace one chain: what people actually search, with what intent, on which SERP, against which local competitors, and where the gap sits that you could realistically own. Break the chain anywhere and that market drops to the back of the queue. A German SERP packed with entrenched local brands carrying local link profiles is a completely different investment case from a Dutch SERP where half the page is thin translations nobody localized. Same ambition, two different fights.
The question everyone asks here is how many markets at once, and the honest answer is fewer than you’d like. For most teams the ceiling is one new market per cycle, two when the language is shared. Every locale you open is permanent: its own keyword research, its own content to keep at parity, its own link profile to build from nothing. Ten half-maintained locales lose to three real ones — and I see the wreck of ignoring this constantly, a hreflang cluster proudly referencing eight languages, six of which nobody has touched since launch day.
Before committing to a market, I take its raw keyword export and cluster it to see how many pages of real demand it actually holds. Sometimes a whole “market” turns out to be four pages of genuine content. That’s an answer too, and it’s a lot cheaper to hear now than after the translation invoice.
URL architecture: the question the top ten won’t answer
Every ranking guide lists the options — example.de, example.com/de/, de.example.com, plus locale variants like /de-de/ and /en-gb/ — and then stops, as if listing them were the same as deciding. The options aren’t the decision. Here’s the decision, in the order the trade-offs actually bite.
A ccTLD (example.de) buys you the cleanest country signal and charges the highest rent for it, and the rent is the part nobody costs out loud. Each country domain is a separate site in Google’s eyes, starting from nothing and earning its own links, so the real question isn’t “is a ccTLD good for Germany” — it obviously is — but “can you fund a from-scratch link profile for every market you’re about to spin one up in.” I’ve watched a company launch example.de, example.fr and example.it in a single quarter and sit invisible across all three for a year: they’d taken one domain’s authority and divided it into three newborns, then fed none of them. So I only sign off on a ccTLD when the market is a decade-long commitment, when a local legal entity forces it, or when the business can genuinely resource link-building per country.
A subdirectory (example.com/de/) consolidates authority: every link to any locale strengthens all of them, geo-targeting comes from Search Console and hreflang rather than the domain, and you keep one CMS, one crawl budget, one migration when things change. For most companies expanding past their first market, this is the default, and the burden of proof sits on anyone arguing against it.
Because a subdirectory carries no geo-signal in the URL itself, one check on it gets skipped constantly: what Search Console actually believes each locale targets. Legacy properties still carry the old international targeting setting; a folder can be silently pointed at the wrong country, or at nothing, while everyone assumes hreflang is handling it. So on a subdirectory or subdomain build I verify the targeting per property, confirm each locale’s pages are gathered under a property that can be inspected at all, and read the country and language performance breakdowns to see which market Google is actually serving each folder to — which is not always the one on the label.
A subdomain (de.example.com) is the option I flag more often than any other, because it’s almost always chosen by accident rather than decision. Google treats subdomains as separable from the root, so authority consolidates worse than a subdirectory while the geo-signal stays weaker than a ccTLD — it collects the downside of each and the upside of neither. The tell, when I audit one, is that nobody can explain why it exists: the honest reasons are all organizational, not search — separate infrastructure per country, separate teams, an acquisition you haven’t merged yet. If one of those is true, fine, live with it. If none is, someone picked the worst structure for a reason that turned out to be “the dev set it up that way.” There’s no search case for starting on a subdomain.
Default to a subdirectory, and only move to a subdomain when you can name the specific piece of infrastructure that makes a subdirectory impossible — a separate platform you can’t route under one domain, a CDN or CMS boundary that won’t bend, a team that owns its own stack. If you can’t name it in one sentence, you don’t have that constraint, and you’re on a subdirectory. The “it depends on your needs” that ten ranking pages hand you fails exactly here: it never tells you which need decides.
One failure mode I flag every single time it appears: mixed structures. A ccTLD for Germany, a subdirectory for France, a legacy subdomain for Japan — each choice was locally sensible the day someone made it, and together they split your authority three ways, triple the maintenance, and make every future decision harder than it needed to be. Here, consistency beats optimality.
Hreflang: audit the cluster, not the tag
What is hreflang? An annotation that tells search engines which language and region a page variant is for, so a searcher in Austria gets /de-at/ instead of /de-de/. That’s the tag. What Google actually evaluates is the cluster — the complete set of alternate URLs that all have to agree with each other — and one broken member drags down the whole set. Which is exactly why hreflang audits that check tags in isolation miss the real problems.
Codes first, because they’re the most common break. Language must be ISO 639-1, region ISO 3166-1, combined in that order: en-GB is valid, en-UK is not — and en-UK shows up in production constantly, because UK simply feels right to whoever typed it. Then the structure: every page references itself, every reference is reciprocated (Google discards one-way annotations without telling you), and an x-default catches everyone who matches nothing. Then the targets: each alternate URL returns 200, never a redirect, never a 404, never a soft error page dressed as a 200.
The subtle killers live at the intersection with canonicals, and this is where most audits quietly pass a site that’s actually broken. Hreflang pointing at a non-canonical URL. A canonical pointing across markets, telling Google the German page is a copy of the English one, while hreflang insists it’s an alternate. When those two signals contradict each other, Google resolves the conflict for you, and it resolves it by ignoring your hreflang. So I check that triangle — hreflang, canonical, indexability — as a single unit, because a clean result on any one leg on its own tells you nothing.
Then the incomplete clusters. Fourteen pages exist in English, nine in German, and the hreflang set references all fourteen pairs regardless. Those five phantom members don’t just sit there harmlessly — they poison the annotations of the nine real ones.
Indexation by locale, not site-wide
A site reports 94% of pages indexed and everyone nods and moves on. Break that number down by market and it reads: US 99%, Germany 61%, Japan 12%. The site-wide average was hiding a dead locale in plain sight. So I never trust the aggregate — I slice indexation by market: submitted versus indexed, the exclusion reasons, and whether the excluded pages cluster in one language. That clustering is the whole diagnosis. Random gaps across locales point to crawl budget; an entire locale missing points to a structural block.
Cross-country duplicates are the usual structural block. Google finds the /en-us/ and /en-gb/ pages nearly identical, picks one as canonical, and silently drops the other. The fix isn’t padding out unique content for its own sake — it’s either genuine localization (different terms, prices, currency, examples) or an honest hreflang cluster telling Google the overlap is intentional.
Two self-inflicted wounds come up often enough to earn their own checks. Redirecting users by IP to “their” version also redirects Googlebot, which crawls mostly from US addresses — so it never sees your other locales at all. And geo-blocking, where the German site only answers to German IPs, does the same thing more bluntly. Both look like UX decisions in a meeting. Both are indexation decisions in production.
Localization: translation is the cheap half
There’s a ladder, and each rung costs more than the last: machine translation, human translation, localization, local search behavior. Most international sites stop at rung two and then wonder why the competitors sitting on rung four outrank them.
Same language doesn’t mean same market — that’s the trap. A US travel site expanding to the UK translates nothing, and still “vacation rentals” has to become “holiday lettings” or the pages target demand that doesn’t exist there. Currency, date formats, units, the legal wording in commercial claims, which trust signals actually convince a local buyer: all of it is market work no translator was ever briefed to do. URL slugs and metadata get skipped even by teams that localize their body copy — /en/seo-services/ ends up with a German page behind an English slug, an English title tag, sometimes an English meta description showing in the German SERP. Those are ranking surfaces. They localize or they leak.
And here’s the check almost nobody runs, which is where my own tooling earns its keep: a page can be genuinely original against the US top ten and add nothing whatsoever against the German one, because the German competitors already cover its every point. This is measurable, so I measure it — an information gain run scores the localized page against the corpus of the target market’s SERP, not the home market’s. The number that comes back is how much the page adds where it actually has to compete, which is the only place the number matters.
Keyword research per market, not a translated list
A translated keyword list fails along a predictable chain: English keyword → translation → native search term → local SERP → actual intent, and every arrow is a place to lose the market. Sometimes the dictionary gets lucky — “car insurance” into German is “Autoversicherung,” which happens to be what people search. Often it doesn’t: “attorney” into German legal-services demand lands nowhere near the terms that carry the volume, which split by legal specialty in ways the US market simply doesn’t.
So research starts from native terms, never from your existing list run through translation. Autocomplete in the target language, the terms local competitors actually rank for, volumes pulled with the country switched — because the same string carries different demand in different countries, and a US search volume tells you nothing about Spain.
Then read the SERP itself, because it’s Google telling you for free what it believes the intent is. One phrase, three countries, three different result pages: the US shows guides and an AI Overview, Germany shows service providers and a map pack, France leads with two marketplaces. Ignore that and you optimize a page type the market’s SERP doesn’t even rank.
Performance has a geography
A single Core Web Vitals score is an average, and averages hide exactly the markets you’re failing. A site served from Frankfurt posts a green LCP overall while Tokyo waits six seconds for the same page — and the Japanese locale’s rankings reflect Tokyo, not the flattering global number. So I read performance per region: real-user metrics split by country where the data exists, synthetic tests from in-market locations where it doesn’t.
The findings are usually unglamorous. No CDN edge near the market. Images shipped at full weight across an ocean. A JavaScript-only locale switcher that renders fine for a human and leaves the crawler stuck on the default language. Server geography whispers into geo-signals too — it won’t override hreflang, but a “German” site served from Ohio with no European presence is both slower for its real users and less coherent to a crawler. Fix the delivery and both problems close together.
Authority doesn’t cross borders by default
Here’s the question that quietly decides rankings in a new market: does this site have authority in that market, or just authority in general? Domain-level metrics happily say yes; the country breakdown says otherwise. A profile of five thousand referring domains that’s 92% American is a strong US site and a weak German one — and German rankings are contested by the sites German publications link to, not by your domain rating. Authority localizes the same way content does, and funding translation while skipping the local links is buying half a market entry and expecting a whole one.
So I break the backlink profile down by the country of the referring domain and set it against the competitors that actually rank in that market. The country distribution usually settles the argument at a glance. From there it’s ordinary link work, just aimed locally: local publications, industry directories, partners and PR inside the target market.
Small section, constant finding. The selector should be real links, crawlable, one per locale. Auto-detection can suggest but never force, because a forced redirect traps users and crawlers alike on a single version. A flag is a country, not a language, so a flag-only selector tells a Spanish speaker in the US nothing useful. And the cross-market internal links people forget entirely, like the German article linking back to its English original, pass signals your hreflang alone doesn’t.
Compliance: the section no ranking page has
None of the ten pages I mapped touches this, so treat it as a differentiator by omission. This isn’t legal advice — it’s audit checkpoints, the places where a compliance decision quietly becomes a search decision. Cookie consent behaves differently per jurisdiction, and a consent wall misconfigured for the EU can stop content rendering for crawlers entirely. Commercial claims carry legal wording that varies by market — pricing-display rules in Germany, financial-product language in the UK, health claims almost everywhere. And some content legally can’t ship to some markets, where the geo-restriction mechanics you pick (block, redirect, serve a variant) each land differently on indexation. My job in the audit isn’t to interpret the regulations. It’s to make sure the site’s compliance plumbing isn’t strangling its own search presence, which happens far more often than either the lawyers or the SEOs expect.
Measure market by market
“Organic traffic grew 20%” is a sentence built to hide everything worth knowing. Decompose the same quarter — US +32%, UK +11%, Germany −18%, France +4%, Japan −41% — and suddenly there are real questions. Germany dropped after which change? Did Japan break, or did it never work in the first place? Aggregates report; breakdowns diagnose. So every metric, from impressions and position to CTR and conversions, gets carried down to the locale level, and Search Console gets read filtered by country rather than as one blurred total.
Two things I build into the routine on top of that. Positions get tracked per locale, because a keyword’s “position” is a genuinely different number in every country. And I watch which markets already surface the site inside AI answers, since AI Overviews roll out unevenly by country and language — your AI visibility is market-specific too, and it’s a breakdown no traditional report includes yet.
The pattern behind all of it
Look back at the checks. Market demand, URL architecture, hreflang clusters, indexation, localization, keywords, performance, authority, compliance, measurement — ten places to look, and underneath them I keep finding the same single fault. Almost none of these failures live inside a page. They live in the seams between markets: the canonical that contradicts the hreflang, the locale that fell out of the index while the average looked fine, the page that was original at home and redundant abroad, the authority that never crossed the border. A normal audit walks the rooms and reports each one clean. The building is still miswired between floors.
That’s the whole reason to run the international version differently, and to run it market by market instead of site-wide. The ten pages ranking for this term today already drew you the map — the architecture question they won’t answer, the locale-level checks they never run. Those aren’t gaps in this article. They’re the items that end up at the top of the deliverable, and reading the SERP that carefully is itself the first move of the audit. If you want the single-market foundation this builds on, that’s our SEO audit.