SEO for bilingual sites: what actually moves the needle
A practical checklist for ranking a Moroccan or francophone website in both French and English. The boring stuff that 80% of sites get wrong.
Most bilingual sites we audit have the same five SEO problems. None of them are exciting. All of them are fixable in a week or two. Together they're usually the difference between page 1 and page 4.
If you run a Moroccan or francophone business with a French and English site, here's the list.
1. Use real hreflang, not heuristics
Google does not magically know that /en/about and /fr/about are the same page in two languages. You have to tell it.
Every page should declare its language alternates explicitly:
<link rel="alternate" hreflang="en" href="https://example.ma/en/about" />
<link rel="alternate" hreflang="fr" href="https://example.ma/fr/about" />
<link rel="alternate" hreflang="x-default" href="https://example.ma/en/about" />
Without this, Google will often serve the wrong version to the wrong user — and your French content will compete with your English content for the same query.
2. Translate the URL slug, not just the body
/services/web-design and /services/conception-web rank for very different things. If your French page sits at /services/web-design, you've handed Google an English URL signal for a French-intent query. You will lose to a competitor with a translated slug.
This is annoying to set up — especially in Next.js with App Router — but it's a one-time cost.
3. Write the meta description per language, by a human
Auto-translated meta descriptions are immediately obvious to a native reader, and Google demotes pages whose snippets users skip past. Pay a writer in each language to write 150 characters per page. It's a few hours of work and worth more than most "SEO retainers."
4. Server-render. Always.
If your site is a single-page app that hydrates content client-side, Google can crawl it — but social-media crawlers definitely can't, and many smaller engines struggle too. Use a framework that ships HTML on the first response. Next.js, Astro, and Remix all do this by default.
5. Internal links across languages
If your only link to the French version is the language toggle in the header, it has roughly zero crawl priority. Link to the French version of relevant pages from inside your English content where it makes sense ("Lire cette étude de cas en français →"). Google follows links. Cross-language internal links are how the two halves of your site teach each other authority.
What we don't bother with
- "Long-tail keyword stuffing" — write for the reader, the rest follows.
- Submitting to forty-five directory sites — most are spam, and Google knows.
- "AI-generated SEO content at scale" — this used to work. It now actively hurts you.
If you want us to look at your site and tell you which of these five you're getting wrong, send us the URL.