Hreflang and canonical: using the two tags together
What each tag declares
The two declarations do different jobs, and neither can do the other's.
Hreflang is an offer of choice
It tells an engine that the page in front of it belongs to a set, and that a reader in another language or region has a better member waiting. It says nothing about which address is authoritative. It assumes every member stands on its own.
Canonical is a claim of identity
It names the address that should stand for this content when more than one address carries it. It says nothing about languages: a canonical never suggests that a reader in French would be better served somewhere else.
Because the questions differ, using both is not a compromise between rivals. An international site of any size usually needs both, and the pages that carry one almost always turn out to carry the other.
The two lines, side by side
In the head of a French member of a set, the pair looks like this:
<link rel="canonical" href="https://example.com/fr/pricing/"> <link rel="alternate" hreflang="fr" href="https://example.com/fr/pricing/"> <link rel="alternate" hreflang="de" href="https://example.com/de/pricing/"> <link rel="alternate" hreflang="x-default" href="https://example.com/pricing/">
Three details carry the weight. The rel="canonical" names this page's own address, not a parent or a variant. The rel="alternate" entry for fr repeats that same address, so the set and the canonical agree about where the French version lives. And the language codes are ISO 639-1 values, the same vocabulary the whole set uses; the codes themselves are covered on the hreflang overview, not here.
The fallback line is ordinary in this arrangement: x-default points at whichever address you chose for everybody the set does not describe, and that address obeys the same rule as any member.
The one rule that keeps them compatible
Point hreflang at canonical addresses, and at nothing else.
An hreflang entry is an invitation to fetch a page. If the fetched page then declares a different address as canonical, the invitation was written to the wrong door: an engine has been offered an address as an alternate and told on arrival that the real page lives elsewhere. Each declaration is legible on its own. Together they describe a set that does not quite exist.
The working form of the rule is short. Every address in the set is its own canonical, every member lists the set, and no member's canonical looks sideways. A page whose canonical points elsewhere is not a member at all; the address its canonical names is the candidate to list in its place.
How the combination breaks
The typical sequence starts with ordinary duplication. A parameterised address acquires a canonical to its clean twin, which is the right move on its own. The hreflang set, written months earlier, still lists the parameterised form. Nothing errors, nothing warns, and every page still looks correct when read alone.
What the set now offers is an address whose own head disowns it. An engine holding both signals has to discount one of them, and which one it discounts is its decision, made per engine and revisable without notice. A set consistent under the rule never puts the question.
The shape should be familiar from hreflang errors: a declaration that one side makes and the other side fails to honour. There the failing side is a missing return entry; here it is a canonical looking away. The set degrades the same way in both cases, quietly and as a whole.
Checking the pair
The pass is the one described under hreflang errors, with one extra reading per page.
Fetch each address the set declares and confirm it answers directly. Confirm the fetched page names the set in return. Then read its canonical and confirm it names itself. A member that fails the last reading is the place to start, because that failure is invisible to any report that reads tags one page at a time: the alternate looks valid on the page that declares it, and the contradiction sits on the page it points to.
The same reading catches the reverse arrangement, a canonical that points at a page carrying no hreflang at all. Whether that is a fault depends on what you meant, which is why it is worth seeing on a list instead of assuming.
Where this page stops
Choosing a canonical, collapsing duplicate addresses, and how canonical interacts with redirects are a subject of their own, and the depth of that subject lives with BotBridge. This page needs a single fact from it: whatever address you canonise is the address your hreflang set must name. Hold that, and the two tags have nothing left to disagree about.
FAQ
Can I use hreflang and rel canonical together?
Yes, and on a site with language versions you almost always should: they answer different questions and neither replaces the other. The one requirement is agreement, meaning the set lists canonical addresses and every member's canonical names itself. Kept to that, the combination is ordinary and unremarkable.
Does canonical override hreflang when they disagree?
Predicting the outcome is the wrong ambition. An engine holding two contradicting signals discounts one of them by its own rules, and those rules change without notice. What you control is whether the signals contradict at all, and a set that follows the rule on this page leaves nothing to override.
Should every page in an hreflang set be self-canonical?
As a working rule, yes. A member whose canonical points elsewhere is telling engines that the listed address is not the real page, which unpicks the invitation the set just made. If some address should not be self-canonical, that is usually the sign it should not be in the set; list the address it canonises instead.
Does the x-default address need its own canonical too?
It is a member like any other: it lists the set, the set lists it, and its canonical names itself. Nothing about the fallback role changes the rule. A default whose canonical looks elsewhere disowns the offer exactly the way any ordinary member would, and it breaks for the widest audience of all.
Can I point hreflang at a page whose canonical looks elsewhere?
You can, in the sense that nothing will stop you, and it is the exact mistake this page exists to name. The alternate you offered is disowned by its own head on arrival. Fix either side, but fix one: name the canonical address in the set, or make the listed address self-canonical.
Hreflang, claim by claim
A language set is a set of claims, and this section reads each one, faults included. The platform these pages describe is Bridge CDN, where an account is created.