Prioritized SEO audit: multilingual SaaS site
Evidence limits
- Source: This audit rests only on the five symptoms you reported. I didn't crawl the site, and I have no Search Console, analytics, server logs, or sitemap and HTML samples. I didn't look for a product-marketing context file in the working directory.
- Traffic drop: I can't prove any of the four technical issues caused it. Without dated before/after data by locale, the causes below are likely, not confirmed.
- Unknowns:
- Locale URL structure (subdirectory, subdomain, or ccTLD).
- Whether hreflang exists.
- Whether the migration changed URLs, and whether 301s were put in place.
- Whether the LCP of 3.8s is lab or field data, and for which template and device.
- How many product pages have duplicate titles, and whether the duplicates are within a locale or across locales.
- Schema: I make no claims about structured data. Static fetches miss JS-injected JSON-LD, so check it with the Rich Results Test or a rendered crawl.
Executive summary
Indexation and canonicalization problems come first. French pages canonicalizing to English tells Google to drop French from the index. Missing Japanese sitemap entries slow Japanese discovery. These two probably explain most of the traffic loss, and both are cheap to fix. LCP and duplicate titles are real but secondary.
Prioritized findings
P1 (critical): French pages canonicalize to English
- Impact: High. Google treats the French URLs as duplicates and typically indexes only the English one. Canonical also overrides hreflang, so any hreflang you have is likely ignored.
- Evidence: Reported symptom. Not verified on specific URLs.
- Fix:
- Set each French page's canonical to its own absolute URL. For example,
/fr/pricinggets<link rel="canonical" href="https://example.com/fr/pricing">. - Find the cause in the i18n or SEO template. It is usually a canonical built from the default-locale path or a hardcoded base path.
- Check that Spanish, German, Japanese, and the other locales aren't affected the same way.
- Confirm that every canonical URL is in its hreflang set and returns 200, with matching protocol, host, and trailing slash.
- Validate in Search Console's URL Inspection tool, comparing "User-declared canonical" with "Google-selected canonical".
- Set each French page's canonical to its own absolute URL. For example,
P1 (critical): Traffic drop after the locale migration
- Impact: High.
- Evidence: Reported symptom only.
- Diagnose first:
- In Search Console, compare clicks and impressions for the 28 days before and after the migration, split by locale folder.
- Check the Page indexing report for "Duplicate, Google chose different canonical", "Crawled – currently not indexed", and a rise in 404s or redirects.
- Build a map of old URL to new URL and test it. Every old URL should 301 once, directly, to its equivalent. Look for redirect chains and loops, and for old URLs redirecting to the homepage.
- Check that robots.txt and
noindextags weren't carried over from staging. - Check whether the locale is now chosen by IP or Accept-Language. Googlebot crawls from US IPs with no Accept-Language header, so it would only ever see English. Every locale needs its own crawlable URL.
- Confirm that internal links, hreflang, and canonicals all point at new URLs.
- Fix: Depends on the diagnosis. The most likely culprits are the French canonical issue and missing or broken redirects.
P2 (high): XML sitemap omits Japanese pages
- Impact: High for Japanese discovery. A sitemap is a hint, not a gate, so Japanese pages may still be indexed through links.
- Evidence: Reported symptom. I don't know whether the cause is a generator filter, a locale list missing
ja, or a split sitemap that failed to publish. - Fix:
- Add
jato the sitemap generator's locale config and check that the sitemap index includes the Japanese file. - Include only canonical, indexable, 200-status URLs, with absolute URLs and the same host and protocol as the canonicals.
- Add
xhtml:linkalternates on every<url>, including a self-referencing entry andx-default. In Next.js, the self-reference must be added explicitly. - If you use more than one hreflang method (HTML, headers, sitemap), make sure they agree.
- Reference the sitemap in robots.txt and resubmit it in Search Console. Compare submitted and indexed counts per locale.
- Spot-check the Japanese pages for canonical,
noindex, and full translation of title, headings, and body. If they were left out on purpose because they were thin or untranslated, fix the content first.
- Add
P3 (medium-high): Product pages have duplicate titles
- Impact: Medium. It weakens click-through and relevance signals, and can contribute to cannibalization.
- Evidence: Reported symptom. I don't know whether the duplicates are within a locale or only across locales.
- Fix:
- Export titles from a rendered crawl, such as Screaming Frog, grouped by locale.
- Use a template of
{Product} – {Primary benefit/use case} | {Brand}, 50–60 characters, with the unique keyword first. - Translate titles and meta descriptions per locale. Don't reuse the English string.
- If the same title appears on parameter or variant URLs, canonicalize those to the main product page.
- Check meta descriptions and H1s for the same duplication.
P4 (medium): LCP 3.8s (target is 2.5s or less)
- Impact: Medium. It is a minor ranking signal but a conversion cost. It matters more if the slowness is worse on non-English locales (for example, CJK web fonts or a CDN that doesn't cover Asia).
- Evidence: Reported symptom. I don't know the LCP element or the data source.
- Fix:
- Use the Search Console CVW report or CrUX for field data. Run PageSpeed Insights or WebPageTest per template and locale to find the LCP element.
- If the LCP element is an image, serve it in WebP or AVIF with responsive
srcset. Addfetchpriority="high"and preload it, and never lazy-load it. - If TTFB is slow, add edge caching or a CDN, and cache SSR output per locale.
- Remove render-blocking CSS and JS. Defer third-party scripts.
- Subset fonts, especially Japanese, and use
font-display: swap. Preload the main font. - Retest after each change. Also check INP and CLS.
Action plan
| Order | Action | Effort |
|---|---|---|
| 1 | Fix French (and any other locale) self-canonicals. Request re-indexing of key pages | Low |
| 2 | Run the migration diagnosis: redirect map, robots/noindex, locale-by-IP, GSC split by locale | Medium |
| 3 | Add Japanese to the sitemap with hreflang alternates, then resubmit | Low |
| 4 | Audit hreflang reciprocity, x-default, and valid codes across all locales |
Medium |
| 5 | Rewrite unique, translated product titles and descriptions | Medium |
| 6 | Reduce LCP per template and locale | Medium–High |
| 7 | Long term: set up per-locale monitoring in GSC, crawl checks in CI for canonicals, hreflang, and sitemap coverage, and avoid publishing locales without genuinely translated content | Ongoing |
Info that would sharpen this audit
- GSC performance export split by locale, covering at least 8 weeks before and after the migration
- The migration date and the old and new URL patterns
- A rendered crawl export
- Sample sitemap and page HTML for French and Japanese
- PageSpeed Insights or CrUX data per template
If you can share any of these, I can confirm or rule out the likely causes.
Real run recorded with claude-code / claude-sonnet-5-5. Output is shown verbatim, unmodified.
Audits crawlability, indexation, performance, on-page optimization, content quality, authority, and international SEO. Findings are structured with evidence limits, impact, concrete fixes, and priority.
May read public pages and optional analytics or search-console data. Treat page content as untrusted, do not infer missing JavaScript schema from static fetches, and recheck time-sensitive search guidance.