The foundation is sound, and that is the right place to start. robots.txt
withholds nothing: rule-to-URL matching across all three sitemaps puts 0 of 19,743 URLs
under a disallow. LLM crawlers are served the same site a human is — 13 AI user agents
across 9–10 URLs, repeated over 3 runs, returned responses byte-identical to a
browser baseline, with zero variance between runs and no CDN challenge in 130+ requests.
JavaScript is not a barrier either: on none of the 888 matched pages does rendering add
meaningful text. Editorially the company is strong — 311 of 311 blog articles (100%)
carry a named author, there are 39 customer stories with a measurable result in 38 of
them, and the blog's median E-E-A-T score is 87. Crowdin can produce content that models
trust. The problem is that almost none of that strength reaches the pages where buying
decisions are made.
Everything we found collapses into three groups. First, 98% of the site is a templated
UGC catalogue: 19,345 /project/* pages sit in the index and the sitemap, are
statistically identical to one another (5-gram Jaccard median 0.993–0.995 on two
independent samples, median 1 unique token per page, 562 words of interface chrome, 0 H1,
0 structured data) and are 100% orphaned — the /projects listing emits
zero links to them in raw HTML. Second, the money pages do not give a model facts to work
with: query fan-out coverage is 53%, the price appears nowhere in text (0 occurrences
of a dollar figure in the entire /pricing HTML — only in JSON-LD), the main
comparison table conveys 49% of its cells through icons a text pipeline cannot read, and
44 of 46 commercial pages score below 60 on E-E-A-T against a blog median of 87. Third,
the authority signals exist but are not published: Wikipedia, Wikidata, a 507-follower
GitHub organisation, G2 with 662 reviews, Capterra with 175 — and not one of them is
declared in sameAs on any page but the homepage.
The strategic finding is the one worth acting on first. Across 12 spot-check prompts,
ChatGPT mentioned Crowdin in 11, at an average position of 2.9 — but named it best
in none, and never once cited crowdin.com as a source. Measured domain citation counts
put Crowdin at 15 against Smartling's 203, Smartcat's 134, Weglot's 117, Phrase's 107 and
Lokalise's 58 — ninth of ten — while Crowdin's own AI search volume, 643, is
higher than Lokalise's 441. Demand for the brand exists; the material a model would
quote does not. The model is not distorting the site. It is summarising it accurately:
asked to characterise Crowdin it reliably returns "open source, community, developer-heavy",
which is exactly what the pages say — the homepage H2 reads "Built by developers, for
developers", /pricing carries a "Crowdin for Open Source" section, and the phrases
"for product teams" and "for SaaS companies" appear on none of the ten money pages.
That symmetry is what makes this tractable. Because the gap is in what the pages state rather than in whether machines can reach them, most of the highest-impact work is publishing and templating, not rebuilding: one directive change retires 19,345 thin URLs, one Astro partial edit adds grounded entity data to 358 pages, one pull request puts Crowdin into a 408-star awesome-list it is currently absent from, and one component already working correctly on a neighbouring page fixes the comparison table. Ten of the 73 checks are Blocked rather than passed, across six areas — CTR gap and pages-decay, LLM traffic share and ARPU, quantitative share of voice, Perplexity and Claude coverage, Reddit placements and contractor pitch targets. Those are marked as not measured, never as zero, and Appendix B lists exactly what to send us to close each one.
| Section | Score | Weight | Comment |
|---|---|---|---|
| AI crawler access | 86 | ×2 | 7 PASS; one High (forum throttles LLM bots), one Medium (no price in text) |
| AI answer readiness | 46 | ×2 | fan-out 53%, extractability 65.1, 44 of 46 money pages E-E-A-T below 60 |
| Semantics & content | 62 | ×1.5 | 297-keyword gap; 89 keywords sit on pages that already exist |
| Technical | 42 | ×1.5 | 3 Critical, 3 High, 4 Medium (crawler's own health score) |
| Visibility in models | 30 | ×1 | 15 citations vs Smartling 203; absent from the category brand dataset |
| E-E-A-T | 64 | ×1 | authorship 100%, but no external profiles in sameAs |
| Structured data | 52 | ×1 | zero syntax errors, two policy risks |
| External placements | 58 | ×1 | 2,026-donor gap; awesome-i18n absent; Trustpilot 3.8/18 |
robots.txt disallows 0 of 19,743 URLs, LLM bots receive
byte-identical responses to a browser, and JavaScript hides nothing. Crowdin's problem is
content and publishing, not access, which is a substantially better position to start from and
the reason the roadmap is mostly editorial rather than infrastructural.
| # | Check | Status | Comment / action |
|---|---|---|---|
| AI access | |||
| 1 | robots.txt coverage |
PASS | 0 of 19,743 sitemap URLs under any disallow; verified by rule-to-URL matching, not by reading the rules |
| 2 | Rules for named AI bots | PASS | No Disallow: / for GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot,
PerplexityBot, Google-Extended, CCBot on any host |
| 3 | Live bot check (UA discrimination) | PASS | 13 UAs × 9–10 URLs × 3 runs — byte-identical to browser baseline; 63/63 stability measurements identical |
| 4 | CDN / WAF blocking | PASS* | No Cloudflare/Akamai signals in 130+ requests; assessed from headers only — not confirmed by the client |
| 5 | Forum bot rate limit | FIXhigh | community.crowdin.com returns 429 to GPTBot and ClaudeBot
(gptbot_crawler_rate_limit); ceiling ~1 request / 30 s. One Discourse setting |
| 6 | Common Crawl presence | PASS | apex 1,225 records, blog 131, docs 426, forum 73 (CC-MAIN-2026-30);
Wikipedia control 72,852 |
| 7 | Content without JavaScript | PASS | 0 of 888 pages gain >20% text from rendering, across 5 platforms (Astro, Next.js, Starlight, Discourse, legacy app) |
| 8 | Dead legacy in robots.txt |
FIXlow | 6 of 10 rules point to URLs that return 404 — harmless today, a trap at the next URL refactor |
| 9 | Price legible to a text reader | FIXmedium | 0 dollar figures in the entire /pricing HTML, raw or rendered —
price exists only in JSON-LD |
| Technical | |||
| 10 | Response codes (sitemap URLs) | PASS | 898 crawled URLs, 100% return 200; zero 4xx/5xx among sitemap pages |
| 11 | Custom 404 | PASS | True 404 code with a branded page — not a soft-404 |
| 12 | HTTPS, host canonicalisation, HSTS | PASS | http→https and www→non-www 301; HSTS
max-age=31536000; includeSubdomains |
| 13 | Duplicate titles | PASS | 0 of 898 — every title unique |
| 14 | Duplicate and multiple H1 | PASS | 0 duplicate H1 and 0 pages with two H1s |
| 15 | Canonical correctness | PASS | 0 canonical conflicts, 0 missing on core — no canonical pointing at a redirect or 404 |
| 16 | Core Web Vitals — mobile | FIXcritical | Origin field LCP 6,815 ms, INP 430 ms, 50.1% of views LCP-poor.
Homepage 2,305 ms and /pricing 1,290 ms are green |
| 17 | Core Web Vitals — desktop | FIXhigh | LCP 4,288 ms, CLS 0.16; TTFB 0.11–0.42 s, so the cause is client-side JavaScript, not the server |
| 18 | noindex inside the sitemap |
FIXhigh | 13 URLs (7 core/blog + 6 project); 4 are money pages, worst
/solutions/software-localization |
| 19 | Broken internal links | FIXhigh | 29 broken targets: 28 on the retired store.crowdin.com, 1 slug typo
crowdinn on /customers |
| 20 | Internal links to redirects | FIXmedium | 162 internal links land on a redirect; 43 chains of 2–4 hops, no loops |
| 21 | Sitemap hygiene | FIXmedium | 249 URLs canonicalise away because of uppercase slugs; lastmod missing on
48 of 49 core; 2 duplicate <loc> |
| 22 | Orphan pages | FIXcritical | All 19,345 /project/* reachable only via sitemap, plus 3 orphan money
pages |
| International configuration | |||
| 23 | Language subdomains indexable | FIXcritical | 18 locales return 200 with noindex, nofollow — 18 language versions
do not exist for search or for models |
| 24 | hreflang validity | FIXhigh | 48 core pages publish 22 alternates including invalid br,
xh, zu, while pt-BR is missing |
| 25 | hreflang coverage of the blog | FIXhigh | 349 blog URLs carry no hreflang at all — the whole editorial section sits outside the international config |
| 26 | Locale sitemaps | FIXmedium | Every locale map returns main-domain URLs; xh/zu serve
HTML with code 200 where XML is expected |
| 27 | Regional meta differentiation | Blocked | Not assessable while all 18 locales are noindex; re-run after check 23 is
resolved |
| AI answer readiness | |||
| 28 | Query fan-out coverage | FIXhigh | 53% (49 yes / 30 partial / 41 no of 120). Self-hosted 0 of 5, comparisons 1 yes / 9 no, pricing 9 no, security 5 no |
| 29 | Content extractability | FIXhigh | 65.1 of 100 on content present inside structures, against 88.9 for structures existing at all |
| 30 | Templated thin pages | FIXcritical | 19,361 of 19,743 (98.1%) — 19,345 UGC plus 16 core; Jaccard median 0.993, 1 unique token |
| 31 | Near duplicates | PASS* | 0 across all 398 core and blog pages; the 98.0% duplication is entirely the
/project/* template |
| 32 | Machine-readable comparison tables | FIXhigh | /alternatives/lokalise-alternative: 83 of 168 cells (49%) carry meaning
only in an aria-hidden SVG |
| 33 | E-E-A-T on money pages | FIXhigh | 44 of 46 below 60 (commercial median 48) against a blog median of 87 — two templates |
| 34 | Author bylines | PASS | 311 of 311 articles (100%) have a named author, verified visible on a random sample of 40 |
| 35 | Author pages | FIXhigh | 0 pages for 42 authors; /blog/author/* returns 404. 7 pages would cover
274 of 311 articles |
| 36 | Person schema completeness |
FIXhigh | 0 of 312 nodes carry @id, url, jobTitle or
worksFor; job titles sit in prose |
| 37 | Author identity correctness | FIXhigh | Ronak Ganatra's sameAs points at Akanksha Babbar's LinkedIn — a false
identity claim, not a broken link |
| 38 | Freshness signals | FIXmedium | 0 of 10 top pages have a determinable date; 46 updates are invisible to
machines; dateModified on 52 of 311 |
| 39 | Keyword cannibalisation | FIXmedium | 13 clusters / 46 pages; 7 commercial-vs-informational. translation
software pulls six /solutions/* pages onto one term |
| 40 | Semantic cannibalisation | PASS* | 5 pairs above 0.85 cosine, but literal overlap is only 0.095–0.146 — differentiate, do not redirect |
| 41 | Missed internal linking | FIXmedium | 4 unlinked pairs in the 0.75–0.85 band (of 10 in band), plus 5 money pages with zero editorial inlinks |
| 42 | Unsubstituted template variables | FIXhigh | {count} visible on 12 pages including the homepage, plus 3 meta
descriptions and 6 JSON-LD nodes |
| 43 | Placeholder copy in production | FIXmedium | A live H2 on /features/in-context-translations reads "Highlight the specific
"Web" pain points here". Scope: 1 page of 898 |
| 44 | Internally consistent facts | FIXmedium | Language count stated as 700+ / 300+ / 100+ on different pages; a competitor price is 4 months stale |
| 45 | CTR against impressions | Blocked | No Search Console access — a central check of this section by our methodology.
Request Full or Restricted for [email protected] |
| 46 | Pages-decay | Blocked | Same cause. Needs two non-overlapping GSC windows; not inferable from any other source |
| Structured data | |||
| 47 | JSON-LD syntax validity | PASS | 0 parse errors across 898 pages; no competing microdata or RDFa vocabularies |
| 48 | Fabricated review markup | PASS | aggregateRating and Review appear nowhere — Crowdin
marks up no rating it does not own. Keep it that way |
| 49 | FAQ markup matches visible text | FIXcritical | 2 pages carry a fully hidden FAQPage (7 and 4 questions, 0 visible);
4 more have single-question gaps |
| 50 | Entity grounding (sameAs) |
FIXhigh | 358 of 359 pages carry an Organization stub with no
sameAs; the full node exists on the homepage only |
| 51 | Graph consistency | FIXcritical | #organization declared twice with different fields on 311 articles —
two generators in one theme |
| 52 | Dangling @id references |
FIXhigh | 43 of 48 core pages point about/mainEntity at a
#webapplication node that is not on the page |
| 53 | Placeholders in markup | FIXhigh | 6 pages ship {count}, {name} or {user_name}
inside JSON-LD and the meta description |
| 54 | Markup coverage of the corpus | FIXhigh | 359 pages have JSON-LD — 1.8% of the 19,743-URL site, because 98% is
/project/* with none |
| Visibility in models | |||
| 55 | Brand mentions in answers | PASS* | Mentioned in 11 of 12 prompts at average position 2.9 — a description of 12 answers, not a visibility rate |
| 56 | Domain cited as a source | FIXcritical | 0 of 12 answers cited crowdin.com. Measured citations: 15 vs Smartling 203 — 9th of 10 |
| 57 | Presence in the category dataset | FIXhigh | Absent from the 42-brand localization entity set while competitors are present — verified by querying those competitors |
| 58 | Positioning the model repeats | FIXhigh | "Open source / community / developer-heavy"; "best overall" goes to Phrase. An accurate reading of the current copy |
| 59 | Bot crawl activity (proxy signals) | PASS | Common Crawl 1,225 apex records in July 2026 plus byte-identical live bot responses — crawling is happening |
| 60 | Quantitative share of voice | Blocked | Requires Ahrefs Brand Radar, outside this run. We do not substitute another method — a spot-check percentage would overstate it |
| 61 | LLM traffic share and ARPU | Blocked | No GA4 access. Six metrics unavailable: LLM traffic share, share of organic, engagement, bounce, ARPU, top landing pages |
| 62 | Perplexity and Claude coverage | Blocked | LLM Mentions covers ChatGPT and Google AI Overview only; Perplexity spot-checks hit a Cloudflare rate limit on our IP |
| 63 | Crawl activity from server logs | Blocked | Optional check — no logs provided. Proxy signals covered it; 30–90 days of logs would make it exact |
| Semantics & links | |||
| 64 | Semantic coverage gap | FIXhigh | 297 keywords / 126,880 searches a month held by competitors; 89 of them belong to pages Crowdin already publishes |
| 65 | Intent validity of the gap | PASS | A bid test removed 88,500 searches/mo (41%) of the apparent gap as non-buyer intent before any of it reached this report |
| 66 | Alternatives hub coverage | FIXhigh | 2 pages against 13 competitors; competitor brand demand 13,510/mo at bids to $49 |
| 67 | Referring-domain gap | FIXhigh | 2,026 donors link to 2+ competitors and none to Crowdin; 1,074 editorial, 249 with rank ≥ 60 |
| 68 | Community and directory presence | FIXhigh | awesome-i18n (408★) omits Crowdin entirely while listing POEditor and
naming SimpleLocalize 6 times |
| 69 | Review-profile consistency | FIXhigh | Trustpilot 3.8 on 18 reviews against G2 4.4/662 and Capterra 4.7/175 — the spread reads as uneven quality |
| 70 | Donor inventory quality | PASS | 890 domains excluded with a stated reason each; 24 footprint domains isolated by two signals, not spam score alone |
| 71 | Reddit and community mentions | Blocked | 403 from our environment on all 15 subreddits — this is "not measured", not "no mentions". Needs Reddit API access |
| 72 | Pitch Targets | Blocked | Not computable without the contractor link inventory. 645 link-gap domains supplied instead — not equivalent |
| 73 | Actual impressions of the long tail | Blocked | No Search Console — the only source showing queries with impressions but no ranking position |
This is the part of the audit that decides whether anything else matters, and it comes back clean. Nothing on crowdin.com is withheld from AI crawlers: they are served the same bytes a browser receives, and JavaScript hides no content from them. One subdomain throttles them, and one class of information — the price — is missing from the text layer everywhere.
We did not assess robots.txt by reading it. We matched every rule against every
URL in all three sitemaps using Google's matching semantics, because a rule that looks alarming
often applies to nothing. That is exactly what happened here. Our own opening hypothesis —
that Disallow: /blog/post/* was hiding the blog — was wrong, and we
disproved it before it reached this report: articles live at /blog/<slug>, and
0 of 349 blog URLs match that prefix.
| Sitemap | URLs | Under a disallow |
|---|---|---|
sitemap-core.xml | 49 | 0 |
blog/sitemap.xml | 349 | 0 |
sitemap-community0.xml | 19,345 | 0 |
| Total | 19,743 | 0 (0.00%) |
There is no per-bot section anywhere on any host for GPTBot, OAI-SearchBot, ChatGPT-User,
ClaudeBot, Claude-SearchBot, Claude-User, PerplexityBot, Google-Extended or CCBot — all of
them fall under User-agent: *, and * blocks no public content.
What we did find is decay. Of the 10 rules under User-agent: *, 6 point at URLs
that now return 404: /app, /backend, /download,
/translate, /case-studies/* and /blog/post/*. The
remaining four (/join, /login, /settings, and a JS asset
path) are legitimate. Today the dead rules cost nothing. They matter for two reasons: they
already caused one analytical error in this audit, and at the next URL refactor a stale prefix
can silently start matching live pages.
One rule is malformed rather than dead: the token User-agent: http://Mail.RU is
not a valid user-agent string, so that block applies to no crawler at all. If blocking Mail.RU
is intended, the token must be Mail.RU.
A robots.txt audit alone proves nothing — blocking usually happens at the CDN or WAF, below the file. So we requested the site as the bots themselves, comparing both status code and response size in bytes against a browser baseline. 13 AI user agents across 9–10 URLs, then a stability series of 3 runs × 7 UAs: all 63 measurements returned identical byte counts, with zero variance.
| URL | Code | Bytes | Bot vs browser |
|---|---|---|---|
crowdin.com/ | 200 | 893,486 | identical for all 13 UAs |
/pricing | 200 | 137,749 | identical, stable across 3 runs |
/features/ai-translation | 200 | 472,441 | identical |
/blog/localization-strategy | 200 | 134,967 | identical |
/project/binance | 200 | 15,815 | identical |
support.crowdin.com/ | 200 | 41,482 | identical |
community.crowdin.com/ | 429 | 66–69 | blocked for GPTBot and ClaudeBot |
cf-ray
challenge header, a 200 with a much smaller body (a stub page), or a 429 rate limit. All four are
observable in this method, and one of them did fire — the 429 on the forum. The check
is therefore not "always green".server: nginx on the apex, Vercel on support and store,
no cf-ray anywhere). This is our assessment from response headers, not
confirmation from Crowdin. A WAF can hold rules scoped by geography or ASN that our exit
point never triggered. Please confirm what sits in front of the origin.Common Crawl is a training and retrieval corpus for many models, so presence there is a
direct proxy for whether content has been collected. We queried the latest index,
CC-MAIN-2026-30 (July 2026), via curl.
| Target | Records | Detail |
|---|---|---|
crowdin.com/* | 1,225 | 1,118 × 200 (91%); crawled 10–22 July 2026 |
crowdin.com/blog/* | 131 | 105 successful captures — independent proof the blog is not blocked |
support.crowdin.com/* | 426 | 418 × 200 (98%) — documentation is collected best of all |
store.crowdin.com/* | 324 | 314 × 200 |
community.crowdin.com/* | 73 | single day only — corroborates the 429 throttle below |
control: en.wikipedia.org/* | 72,852 | confirms the query itself returns large result sets |
urllib fails with CERTIFICATE_VERIFY_FAILED against
the Common Crawl API. Had we accepted that, every target above would have read zero records
— indistinguishable from "the site is not in the index". We switched transport to
curl. A tool failure recorded as a zero is the most damaging error available to an
audit, which is why the Wikipedia control row exists.crowdin.com is not one system. We identified five stacks and checked each for whether content survives without JavaScript, since many AI crawlers do not execute it.
| Section | Platform | Readable without JS |
|---|---|---|
crowdin.com/, /features/*, /blog/* | Astro 7.0.6 (static) | Yes — homepage 2,256 words and 13 H2 in raw HTML |
/pricing | Astro 7.0.6 | Yes (974 words) — but no price figures |
/project/* | legacy Crowdin app | Yes — 12 of 12 in a random sample |
support.crowdin.com | Astro 7.1.6 / Starlight | Yes — 459–9,708 words (n=8) |
store.crowdin.com | Next.js on Vercel | Yes, server-rendered (n=5) |
community.crowdin.com | Discourse | Yes — identical 3,381 characters to bot and browser |
A raw-versus-rendered comparison first suggested a problem: the homepage went from 2,256 words
to 3,999 after rendering, /pricing from 974 to 3,799. We checked what the extra text
actually was, and it is the cookie-consent banner expanding into roughly 2,000 words of cookie
tables. No substantive content block exists in the rendered DOM and is missing from raw
HTML. The ratio was a false signal; we report the verified conclusion.
robots.txt disallows 0 of 19,743 sitemap URLs; no host carries a rule naming any LLM bot.community.crowdin.com returns 429 to GPTBot, ClaudeBot and Claude-SearchBot with discourse-rate-limit-error-code: gptbot_crawler_rate_limit. A browser UA made 6 consecutive requests with no pause and got 6 × 200, so this is bot-specific, not general load shedding. Observed ceiling is roughly one request per 30 seconds. Corroborated independently: 73 Common Crawl records against 426 for the documentation site. This is Discourse's built-in limiter, not a CDN or WAF./pricing body returns an empty set, and over the entire HTML returns 0. This is not content behind JavaScript; the figures are not present as text at all.robots.txt point at 404s, plus one malformed User-agent: http://Mail.RU token that applies to nothing.1. Stop throttling AI bots on the forum (client, one setting). In Discourse,
remove the LLM user agents from slow_down_crawler_user_agents and review
slow_down_crawler_rate / crawler_rate_limit_*. Target at least one
request per second for GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot and
CCBot. The forum is user-generated answer content — precisely the material models quote.
2. Publish the price as text (client, Sprint 2). Server-render the plan tiers so the figures exist in HTML. Detail and the necessary caveat are in section 4.
3. Delete the six dead robots.txt rules and fix the Mail.RU token
(client, minutes). Hygiene, not a visibility gain — do it because a stale prefix becomes
dangerous the moment URLs change.
4. Confirm what CDN or WAF fronts the origin (client, one answer). Our finding is header-based; a geo- or ASN-scoped rule would be invisible to us.
▧ Full crawl, all checked URLs · 898 rowsThe technical fundamentals are in better shape than the score suggests. Response codes, canonicals, HTTPS, HSTS, title uniqueness and the 404 handler are all clean — 898 crawled URLs return 200, and not one page has a duplicate title or a second H1. The crawler's health score of 42 is driven by three things instead: page speed on the application, an indexation structure that publishes 19,345 near-identical URLs, and an international setup where 18 language versions are switched off.
Worth stating plainly, because these are the checks that are expensive to fix later and are
already right: every one of the 898 sitemap URLs returns 200, with no 4xx or 5xx among
them. /this-page-does-not-exist returns a real 404 with a branded page rather
than a soft-404. http redirects to https and www to
non-www, both 301, with HSTS at max-age=31536000; includeSubdomains.
There are 0 canonical conflicts across all 898 pages and 0 missing canonicals on
core. All 898 titles are unique, there are 0 duplicate H1s and 0 pages
carrying two H1s. Near-duplicate content across the 398 core and blog pages is 0.
Field data from real Chrome users (CrUX, 28 days to 15 Aug 2026) puts the origin outside threshold on three of four metrics on mobile: LCP 6,815 ms, INP 430 ms, FCP 6,718 ms, with 50.1% of views LCP-poor. Desktop is also failing: LCP 4,288 ms and CLS 0.16.
The aggregate hides where the damage is, which is why we broke it out by URL. Only five URLs have enough traffic for their own CrUX record, and the split is decisive.
| URL | Field LCP | Verdict |
|---|---|---|
/ homepage | 2,305 ms | green — within threshold |
/pricing | 1,290 ms | green — the fastest page measured |
/settings | 5,986 ms | poor for 48% of views |
/project/* | up to 8,021 ms | poor — 98% of the site by URL count |
/profile | 8,804 ms | poor for 64% of views — the worst measured |
So the marketing pages that matter for AI visibility are fine, and the origin-level failure is
produced by the logged-in application. Two facts identify the cause precisely. Server response
time across all 898 pages is 0.11–0.42 s, so the backend is fast. And lab testing of
/project/ankidroid finds 1,920 KiB of unused JavaScript on a page whose entire
text content is 562 words, with 7.2 s of main-thread work. The problem is client-side
JavaScript weight, not infrastructure.
Crowdin publishes 21 language subdomains. We checked 20 of them on /pricing.
18 return HTTP 200 together with noindex, nofollow. At the same time
48 core pages publish 22 hreflang alternates pointing at those very URLs
— the site tells search engines and models that translated versions exist, then forbids
every one of them from being indexed. Localization spend is not converting into visibility.
Two of the 21 are not language versions at all. xh.crowdin.com and
zu.crowdin.com return 26,346 bytes of identical HTML titled
"Crowdin Enterprise" — a single-page app for a different product, with no
hreflang, no canonical and no meta robots. Their /sitemap.xml returns
an HTML document with status 200 instead of XML, so a crawler asking for the sitemap gets
an app page and is never told anything went wrong. Separately, every locale's sitemap returns the
main-domain URL set, so even if noindex were lifted tomorrow the locale
sitemaps would cover nothing.
13 URLs sit in the sitemap carrying noindex — 7 core and blog pages
plus 6 closed projects. The site simultaneously requests indexing and forbids it. We confirmed
each with a browser user agent, so this is served to everyone and is not a crawler artifact.
Four are money pages.
| URL | Directive | Why it matters |
|---|---|---|
/solutions/software-localization | noindex, follow | Targets localization platform — 140/mo at a $39.06 top-of-page bid, the most expensive term in the niche |
/features/quality-assurance | noindex, follow | Best-positioned page for app translation (2,900/mo) — see cannibalisation in section 4 |
/features/workload-management | noindex, follow | Feature page, 0 editorial inlinks |
/learn | noindex (no follow) | Educational hub, E-E-A-T 62 — second-best commercial page on the site |
29 internal link targets return 404. The cause is a single retired system: 28 of 29
point at store.crowdin.com app pages linked from "What's new at Crowdin" posts
published between 2020 and 2026, where the apps were renamed or removed and the links never
updated. The 29th is a slug typo — crowdinn with a double n — and it sits
on the money page /customers. Note that the crawler's own inlink export reported
zero broken links; that was a list-mode artifact, so we extracted 3,154 link targets from raw HTML
and checked the 1,314 Crowdin-domain ones directly.
Beyond outright breaks, 162 internal links land on a redirect rather than the final URL,
and 43 chains run 2 to 4 hops (no loops). Common cases:
/ai-localization → /features/ai-translation,
/alternatives → /, and legacy dated blog URLs such as
blog.crowdin.com/2021/08/25/translation-memory/ taking three hops.
| Template | Pages | hreflang state |
|---|---|---|
| core | 48 | 22 codes — includes invalid br, xh, zu; pt-BR missing |
/project/* | 500 | 20 codes — correct pt-BR; no br/xh/zu |
| blog | 349 | no hreflang at all |
Two things stand out. br is the code for Breton, not Brazil; given the URL
br.crowdin.com the intent was Brazilian Portuguese, whose correct code is
pt-BR — and the /project/* template already uses it correctly.
So the marketing pages advertise a Breton edition that does not exist while never declaring the
Brazilian one. That the two templates disagree is itself the diagnostic: hreflang changes are
shipping out of sync, and the core template is running an older version. Meanwhile the entire
blog — the section that normally earns both search and LLM traffic — sits outside the
international configuration completely.
249 URLs in sitemap-community0.xml canonicalise to a different address
purely because their slugs contain capital letters (/project/My_F-droid,
/project/Nyachi). No lowercase twin appears in the sitemap, so the file
systematically submits the non-canonical variant. Also: lastmod is absent on
48 of 49 core URLs, and there are 2 duplicate <loc> entries.
/pricing (1,290 ms) are green — /profile (8,804 ms), /settings and /project/* drag the origin down. TTFB is 0.11–0.42 s, so the cause is client JavaScript: 1,920 KiB unused on a 562-word page.noindex, nofollow while 48 core pages publish 22 hreflang alternates pointing at them. xh and zu are a different product's SPA, and their sitemap returns HTML with status 200.noindex, four of them money pages. The worst is /solutions/software-localization, targeting the niche's most expensive term at a $39.06 bid.store.crowdin.com from "What's new" posts, 1 a crowdinn typo on /customers.br/xh/zu and omits pt-BR, which the /project/* template gets right.lastmod missing on 48 of 49 core URLs.1. Lift the four money pages out of noindex (client, one commit).
Highest value per minute in this section: these pages exist, are written, and are currently
invisible.
2. Decide on the 18 locales (client, decision first). Either publish them — remove
noindex, generate real localized sitemaps — or retire them and strip the 22
hreflang alternates from the core template. The current state is the only option
with no upside. Separately, remove xh and zu from
hreflang: they are a different product.
3. Split the speed problem from the marketing site (client, Sprint 2). The fix is
JavaScript weight on /profile, /settings and /project/*
— or moving the app to its own origin so its metrics stop being attributed to crowdin.com.
Do not optimise the homepage or /pricing; they already pass.
4. Fix 29 broken links and 162 redirect links (agency, mechanical). One find-and-replace
retires most of the store.crowdin.com references.
5. Add hreflang to the blog and correct the codes on core (client). Replace
br with pt-BR, reusing the /project/* template that is
already correct.
This is the core of the audit. Models can reach every page on crowdin.com; the question this section answers is what they find when they get there. The short version: the blog gives them a great deal, and the pages that sell give them very little. Two numbers frame everything below — a model asking the twelve follow-up questions a buyer asks finds answers to 53% of them, and 44 of 46 commercial pages score below 60 on E-E-A-T against a blog median of 87.
The /project/* catalogue is 19,345 URLs, 98.0% of the site, and it is
indexable, in the sitemap, and statistically a single document. We measured sameness three
independent ways and all three agree:
| Measurement | Result | Method |
|---|---|---|
| 5-gram Jaccard similarity | median 0.993–0.995 | Two independent samples; 400/400 and 780/780 pairs above 0.98 |
| Unique tokens per page | median 1 | Range 0–4 — the project name, and nothing else |
| Crawler near-duplicate score | 100 on 500 of 500 | Screaming Frog at a 90% threshold |
| Word count | 562 on every page | Zero spread — identical interface text, not content |
| H1 and structured data | 0 and 0 | No heading, no markup, on all 500 sampled |
Note the trap in that table: 562 words clears any sane thin-content threshold, so a word-count test would clear these pages. They are thin by substance, not by length.
They are also unreachable except by sitemap. The /projects listing emits
zero links to any project page in raw HTML — the list is built client-side, and
?page=1 and ?page=2 return byte-identical HTML at 173,953 bytes.
The crawler appears to show 6,490 inlinks to these pages, but every one is a self-link from
the page's own hreflang and in-app navigation: cross-page links are 0, and no core or blog
page links to a single project. All 19,345 are true orphans.
noindex, follow on that template
and removing sitemap-community0.xml from the sitemap index retires the entire class in
a single change — and follow preserves whatever link value the pages pass. This
is not a recommendation to delete anything: the projects stay live and usable for their users;
they simply stop being submitted as indexable marketing pages.Crowdin's pricing is published only inside JSON-LD markup. We verified this from the primary source rather than a crawler report:
| Where we looked | Dollar figures found |
|---|---|
Visible text on /pricing | 0 |
The entire /pricing HTML, scripts and attributes included | 0 |
| Rendered DOM after network idle | 0 |
JSON-LD Offer nodes | 0 / 50 / 150 / 450 USD |
The "Compare Plans" table is empty in the markup: all 42 of its cells contain no text,
each holding a loading skeleton instead — the page carries 69
animate-pulse placeholders and 23 hydration islands. Crucially this is not fixable by
rendering: the crawler ran with JavaScript enabled and still recorded no prices, because the table
hydrates from data that never arrives inside the render window. The plan names "Pro" and "Team+"
likewise appear only inside the markup; visible text has only "Free plan" and "Enterprise".
{"success":false,"acl_error":true} without authentication, and the JavaScript bundle
contains an OldPricingNotice component that checks whether a plan is on new pricing
— direct evidence that tiers have changed at some point. The verified finding is narrower
and still serious: there is no source for the price in the text layer. Confirming the
figures themselves needs the current price list from Crowdin, so that item is
Blocked./alternatives/* tables.Structured data must describe what a visitor sees. On two pages it does not:
| URL | Questions in markup | Questions visible | Severity |
|---|---|---|---|
/solutions/game-localization | 7 | 0 | Critical — policy risk |
/alternatives/lokalise-alternative | 4 | 0 | Critical — policy risk |
/blog/ai-localization | 8 | 7 | Medium — single gap |
/blog/meet-crowdin-copilot | 7 | 6 | Medium — single gap |
/blog/mt-post-editing | 4 | 3 | Medium — single gap |
/blog/multilingual-marketing | 8 | 7 | Medium — single gap |
On the first two, the words "FAQ" and "Frequently" do not appear on the page at all — we checked the live response, 434 KB and 220 KB respectively. Corpus-wide this is 15 of 285 questions (5.3%) not visible, and 11 of those 15 fall on those two pages. The remaining four are single omissions on blog articles and are ordinary content debt.
Worth knowing before prioritising: across all 898 pages Google generates no FAQ rich result whatsoever for this site. So the hidden markup carries policy risk with zero search upside; its only remaining value is LLM extraction, which is exactly why the questions belong in the visible text.
When a model is asked to recommend a localization platform it does not read one page; it decomposes the request into follow-up questions and looks for each. We ran the twelve questions a real buyer asks against each of the top ten money pages — 120 checks — and graded each by reading the page.
| Question type | Yes | Partial | No | Reading |
|---|---|---|---|---|
| HOW — how do I actually do it | 14 | 1 | 4 | Strongest area — mechanics are well covered |
| INT — integrations and stack fit | 8 | 2 | 1 | Strong |
| DEF — what the product is | 7 | 3 | 0 | Strong |
| PRF — proof and numbers | 4 | 2 | 3 | Adequate |
| LIM — limits and constraints | 3 | 7 | 3 | Weak — mostly vague |
| ICP — who it is for | 2 | 3 | 2 | Weak |
| PRC — pricing | 7 | 2 | 9 | Failing |
| SEC — security and compliance | 2 | 2 | 5 | Failing |
| CMP — comparison with alternatives | 1 | 6 | 9 | Failing |
| SELF — self-hosted and on-premise | 0 | 0 | 5 | Total absence |
Read the pattern rather than the total. Crowdin covers how the product works and answers poorly on why to choose it — price, security, comparison and fit. Those are the selection criteria, which is precisely why the model names Crowdin in 11 of 12 answers and recommends it in none. SELF at 0 of 5 reproduces the one prompt where Crowdin was absent entirely: asked for a self-hosted Lokalise alternative, the model returned Tolgee, Weblate, Traduora and Pontoon. The words "self-hosted", "on-premise" and "private cloud" appear on none of the ten money pages, even though Crowdin Enterprise offers it.
/, "how much does it cost" matched
inside a customer testimonial reading "Super optimal pricing"; on
/solutions/software-localization it matched the "Start Free Trial" button; on
/features, "who is it for" matched a "Try Crowdin Enterprise instead" button.
After manually reviewing all 120 evidence strings, coverage fell to 53%. We report 53%; the
per-row reason is in the fan-out tab./alternatives/lokalise-alternative is one of the two most important pages for AI
visibility, because "X vs Y" and "X alternatives" are exactly the queries models fire when asked
to recommend a tool. Its comparison tables have 168 cells, of which 83 (49%) contain no text at
all — the value is carried by an inline SVG marked aria-hidden="true", with
no label and no title: 55 checkmarks and 28 crosses, plus 97 aria-hidden attributes
on the page. Extracted as text, a feature row reads:
| Continuous AI fine-tuning | | |
Two whole tables — "Similarities Between Lokalise and Crowdin" and "Crowdin Enterprise Unique Features", 15 rows each — contain not one value in text form. A model reading this page cannot tell who wins any comparison.
The fix is already written. The neighbouring /alternatives/phrase-alternative uses
the same component and renders 40 of 43 cells as text — only 3 are icon-only, and it
carries 18 aria-hidden attributes against 97. It spells values out in words
("Available on all plans at no extra cost from us") instead of drawing a checkmark. So this is one
component change, reusing a pattern that already works on the adjacent page.
Across the whole corpus, E-E-A-T scoring splits cleanly by template:
44 of 46 commercial pages score below 60, with a median of 48, against a blog median of
87. Only two clear 60: the homepage at 88 and /learn at 62. The signal string
attached to nearly every failing page is identical — no author; external links 0; no
dates — and the pages sharing it are the /features/* and
/solutions/* templates. The same repeated cause means the same single fix: adding an
author or reviewer, a visible date and outbound references to the two templates raises all
44.
What makes the gap notable is that Crowdin clearly knows how to do this. The blog carries a named author on 100% of 311 articles. The capability exists; it just stops at the templates that sell.
Three commercial pages are orphans: exactly one file in the entire 898-page crawl links to
each of them, and that file is the page itself. Not the homepage, not
/features, not /solutions, not any article.
| URL | Priority | Target keyword | Volume | Bid |
|---|---|---|---|---|
/alternatives/lokalise-alternative | 69 | lokalise | 1,000/mo | $19.64 |
/alternatives/phrase-alternative | 59 | phrase alternative | 260/mo | $18.46 |
/features/figma-plugin | 59 | figma translation | — | — |
Two of the three are the alternatives pages — the highest-value comparison content
Crowdin owns, and the exact page type models look for. A further two money pages
(/features/workload-management and /solutions) have inlinks from
navigation only and zero editorial links.
{count} appears in the visible body text of 12 pages, including the
homepage, where a visitor and a model both read:
You have content in {count}+ disconnected tools (GitHub, Figma, CMS)
The full list: /, /features/quality-assurance,
/features/translators-workbench, /learn/continuous-localization-ebook,
/learn/mobile-app-localization-ebook, /product/agency-partners,
/solutions/customer-support-translation,
/solutions/e-commerce-translation, /solutions/game-localization,
/solutions/software-localization, /solutions/website-translation and
/webinar/mobile-app-localization. It also leaks into 3 meta descriptions and
6 JSON-LD nodes (where {name} and {user_name} also appear)
— three layers of the same unsubstituted variable.
The damage is specific. Every one of these slots is where a number belongs: "100+ file formats", "40+ MT engines", "700+ integrations". A model extracting facts gets a broken token exactly where the quantified claim should be — the sales argument is lost precisely where it was meant to land.
{count},
{name} and {locale} as ICU MessageFormat and i18next syntax inside
code examples — correct, on-topic content. We stripped <pre> and
<code> blocks before counting and excluded pages such as
/blog/react-i18n and /blog/flutter-localization-guide. The figure of 12
is text outside code samples only.One related item, separate because it is genuinely isolated: a live H2 on the money page
/features/in-context-translations reads "Highlight the specific "Web"
pain points here" — a copywriter's instruction shipped to production. We checked scope
across all 898 pages: this phrase appears on 1 page, and Lorem ipsum,
TODO and FIXME appear on 0. A single incident, not a release
process problem.
Organization markup is present on 359 pages and, to Crowdin's credit, all of them
use one stable identifier — crowdin.com/#organization, with no competing
variants. But sameAs exists on exactly one page: the homepage. The other
358 carry a stub of name, URL and logo with no sameAs, no
contactPoint, no address and no founding date. Measured against the full site, the
company's verifiable identity is published on 1 URL in 19,743.
The cause is mechanical and therefore cheap: only 4 unique payloads exist across the entire site, byte-identical within each template, and the same stub appears on the locale subdomains too. The defect is in a shared Astro partial, not in individual pages — one edit closes all 358.
Two further graph defects compound it. Critical: on 311 articles
#organization is declared twice with different fields — one node
carrying description, the other legalName — because two markup
generators in the theme both emit it; #website is duplicated the same way. A consumer
consolidating that graph gets a non-deterministic result. High: on 43 of 48 core
pages, about and mainEntity point at a #webapplication node
that is not present on those pages — a dangling reference.
Authorship is Crowdin's strongest E-E-A-T asset and its most under-published. 311 of 311
articles (100%) have a named author, confirmed visible on the page in a random sample of 40.
There are 42 authors. There are 0 author pages: /blog/author/* returns
404, and no such URL appears anywhere in the crawl.
The markup is equally incomplete. Across 312 Person nodes, the fill rate
for @id, url, jobTitle, worksFor,
image and knowsAbout is 0%. Job titles exist — as prose
inside the bio ("currently leads a marketing team at Crowdin") rather than as a field a machine can
read. So the author is a name, not an addressable entity.
Coverage is cheap to fix: 7 author pages would cover 274 of 311 articles (88%) — Diana Voroniak (108 articles), Yuliia Makarenko (70), Iryna Namaka (39), Khrystyna Humenna (25), Julia Herasymchuk (15), Yana Feshchuk (7), Andrii Bodnar (2).
One item needs correcting before any other authorship work, because it is not a broken link but
a false statement about a person: on
/blog/translation-quality-without-speaking-language the author Ronak Ganatra's
sameAs points at linkedin.com/in/akanksha-babbar-14583420/ — a
different person, who writes a different article on the same site. The markup asserts that two
people are one.
Freshness is a ranking and citation factor for models, and Crowdin is losing credit for work it
has actually done. 98 articles display "Last updated: <date>" to readers. Only 52
also carry dateModified in markup. For the other 46, the sitemap reports the
original publication date. The clearest example:
| URL | Date shown to readers | Date sent to machines |
|---|---|---|
/blog/crowdin-for-figma-design-and-prototype-for-multiple-markets | 2025-06-10 | 2020-02-03 |
/blog/data-driven-approach-to-translation-quality-evaluation | 2026-06-29 | 2020-12-10 |
A five-year-old timestamp on freshly updated content is worse than no timestamp. Separately,
0 of the 10 top money pages have a determinable date by any source, and
lastmod is missing from 48 of 49 core sitemap URLs. Two smaller markup defects
sit alongside: unrendered markdown leaked into 293 Person.description fields,
and 6 pages ship placeholder tokens inside JSON-LD.
Last-Modified header. It is populated on 397
pages, but holds only 8 distinct values, all within a 31-second window matching the moment of our
crawl — it reports CDN cache time, not content age. Had we trusted it, 397 pages would
have been scored "fresh" and this entire finding would have disappeared. We also checked for
the opposite failure, mass date re-stamping, and found none: sitemap dates hold 293 distinct values
across 312 pages.lastmod, but only 126 when the freshest available
signal is used. The 17-article gap is the invisible-updates finding above.13 keyword clusters spanning 46 pages compete internally, and 7 of those pit a commercial page against an informational one. Two matter commercially:
| Keyword | Volume | Pages | The problem |
|---|---|---|---|
app translation | 2,900/mo | 2 | The best-positioned page, /features/quality-assurance, is under noindex — only a blog article with priority 39 actually competes |
translation software | 1,000/mo | 7 | Six /solutions/* money pages target one generic term at near-identical priority instead of their own verticals |
The second is really a differentiation problem. The /solutions/* pages share a
template, so the generic category term surfaces on all of them rather than "ecommerce translation
software" or "game localization services".
We also found 5 page pairs above 0.85 semantic similarity — and this is a case where the obvious action is the wrong one. Literal text overlap on those pairs is only 0.095–0.146: they discuss genuinely different subjects (CakePHP versus Django localization; academic versus open-source programmes) in near-identical phrasing. Do not merge them with redirects or canonicals. They need differentiated copy. Merging would delete real content.
Finally, facts contradict each other across pages, and any of these could end up quoted:
| Claim | Where | Conflict |
|---|---|---|
| Number of languages | /solutions/mobile-app-localization-services says 700+; /features/ai-translation says 100+ in the body and 300+ in its own title | Three incompatible figures; 700+ is almost certainly the integration count leaking into the languages field |
| Number of integrations | /alternatives/lokalise-alternative: "Integrations | 2 | 2" two rows above "Apps Marketplace | 700+ | 50+" | The same table contradicts itself |
| Competitor price | /alternatives/phrase-alternative stamped "as of April 2026", quoting $150 against $1,045/mo | Four months stale on a page making specific competitor price claims — a reputational and legal exposure, not just an SEO issue |
Two of our checks scored the same ten pages on the same 0–100 scale and disagreed: 88.9 and 65.1. Rather than average them or pick the friendlier one, we reread the pages. Both are correct, and they measure different things.
| Score | What it measures | Use it for |
|---|---|---|
| 88.9 | Whether extractable structures exist — headings, lists, tables, FAQ markup | Potential of the current structure |
| 65.1 | Whether those structures contain facts — cell values, numbers, real answers | Prioritising work |
/pricing shows why the gap exists. On structural signals it scores 90: one
table, six H2s, nine marked-up questions. Read it and all 42 table cells are empty, behind
69 loading skeletons, with the prices only in JSON-LD and the FAQ questions absent from the text.
The container is there; the content is not. The same pattern hits
/alternatives/lokalise-alternative (92 structural, 54 on content). We use
65.1 throughout this report and treat 88.9 as the ceiling the existing structure would reach
once filled.
[email protected] in Search Console
under Settings → Users and permissions, with Full or Restricted access. Money pages ranked by
actual revenue are likewise unavailable without GA4; we ranked by advertiser bid instead, which is
a proxy./project/* pages (98% of the site) are one document. Jaccard median 0.993–0.995, median 1 unique token, 562 identical words, 0 H1, 0 markup, and 100% orphaned. One template directive plus one sitemap removal retires the class./pricing HTML; 42 comparison cells empty behind 69 loading skeletons; the figures live only in JSON-LD, and their accuracy is unconfirmed because the source endpoint is behind authentication./solutions/game-localization (7 of 7 absent) and /alternatives/lokalise-alternative (4 of 4), plus 4 single-question gaps on blog articles. Policy risk with no search upside — Google generates no FAQ rich result here at all.#organization is declared twice with conflicting fields on 311 articles, from two competing generators in one theme.aria-hidden icon. The neighbouring page renders the same component as text — one component fix.{count} is printed on 12 pages including the homepage, plus 3 meta descriptions and 6 JSON-LD nodes, in exactly the slots where a number belongs.Organization stub with no sameAs; the defect is one shared Astro partial.Person nodes carry @id, url, jobTitle or worksFor; one author's profile link names the wrong person.dateModified on 52 of 311 articles.Do these first, because each is one change covering thousands of URLs.
1. noindex, follow on the /project/* template and remove
sitemap-community0.xml (client, one deploy). Retires 19,345 thin orphans. The
projects stay live for their users.
2. Add sameAs to the shared Astro Organization partial (client,
7 lines). Wikipedia, Wikidata, GitHub, G2, Capterra, Trustpilot and Product Hunt — 358
pages grounded in one edit. Cheapest high-impact change in this report.
3. Remove the second #organization generator (client, one edit). Fixes 311
articles.
4. Substitute {count} everywhere (client). 12 pages, 3 meta descriptions,
6 JSON-LD nodes. Start with the homepage.
5. Put text in the comparison table cells (client). Reuse the component already working
on /alternatives/phrase-alternative.
6. Either delete the hidden FAQPage markup from the two pages, or publish the
questions as visible text (client). Publishing is better — those are fan-out answers.
Do not leave markup describing invisible content.
7. Correct Ronak Ganatra's sameAs and remove the placeholder H2 from
/features/in-context-translations (client, minutes).
8. Then the template work (Sprint 2): author, reviewer, dates and outbound sources on the
/features/* and /solutions/* templates (44 pages); 7 author pages
covering 274 articles; dateModified plus surfacing "Last updated" into the sitemap
(46 articles); server-render the price as text; reconcile the language and integration counts and
refresh the competitor pricing table.
Crowdin is present in AI answers and almost never the recommendation. That combination — high mention rate, zero citations, never ranked first — is the most useful diagnostic in this report, because it tells us the problem is not awareness but the material available to quote.
How often each vendor's domain is actually cited as a source in ChatGPT answers, measured on the LLM Mentions dataset for the US in English:
Set that against brand demand and the picture sharpens. Crowdin's AI search volume is 643 — higher than Lokalise's 441 and Transifex's 259. Lokalise earns 58 citations on 441 of demand; Crowdin earns 15 on 643. People are asking about Crowdin more than about Lokalise, and the models are citing it four times less. Demand is not the constraint.
A second, independent signal points the same way. Asked for the brands associated with "translation management", the dataset returns 42 brands — Phrase, DeepL, Trados, memoQ, Wordfast, OmegaT, Transifex, Localizely, Smartcat, Lokalise, TransPerfect and others. Crowdin is absent entirely. We treat that as a fact rather than a glitch for a specific reason: the query returned 42 results and Crowdin's own competitors are among them, so the dataset is neither empty nor broken. Had it failed, the competitors would be missing too.
We ran twelve prompts through ChatGPT in clean sessions, fixed in advance and shuffled in order, covering three types: keyword-mapped, community-style and buyer-scenario. All results are reported, including the misses.
| Prompt | Crowdin | Position | Vendors in order of mention |
|---|---|---|---|
| best localization management platform | Yes | 4 | Lokalise, Phrase, Smartling, Crowdin, Locize, i18next |
| crowdin vs lokalise | Yes | 1 | Crowdin, Lokalise — the only first place, on its own brand |
| software localization tools for developers | Yes | 3 | Lokalise, Phrase, Crowdin, Transifex |
| best translation management system 2026 | Yes | 4 | Phrase, Smartling, Lokalise, Crowdin, memoQ, Trados, Smartcat |
| continuous localization platform with github integration | Yes | 2 | Lokalise, Crowdin, Phrase, Weblate |
| what do you use to manage translations in your app | Yes | 2 | i18next, Crowdin, Lokalise, Phrase |
| is there a good self-hosted alternative to lokalise | No | — | Lokalise, Tolgee, Weblate, Traduora, Pontoon |
| how do you handle i18n strings with a remote translator team | Yes | 3 | Phrase, Lokalise, Crowdin |
| how do we localize our React app with a team of translators | Yes | 3 | i18next, Lokalise, Crowdin, Phrase |
| TMS for a game studio with 12 languages | Yes | 3 | Phrase, Lokalise, Crowdin, memoQ, Smartling |
| mobile app startup adding 5 languages, what workflow | Yes | 4 | Localize, Phrase, Lokalise, Crowdin |
| platform supporting Figma and CI/CD for a SaaS product | Yes | 3 | Phrase, Lokalise, Crowdin, Locize, i18next |
Crowdin appears in 11 of 12 at an average position of 2.9, and takes first place only in the branded "crowdin vs lokalise". For comparison, Lokalise appears in 12 of 12 and Phrase in 10. And in none of the twelve answers was crowdin.com cited as a source — the mentions come from model memory, with no link back to the site. Crowdin is known and not quoted.
The one complete absence is the most instructive. Asked for a self-hosted Lokalise alternative, the model named Tolgee, Weblate, Traduora and Pontoon — Crowdin Enterprise offers self-hosting, and the model does not know it, because as section 4 showed the phrases "self-hosted", "on-premise" and "private cloud" appear on none of the ten money pages.
Across the twelve answers the model consistently frames Crowdin as "open source, community, developer-heavy". Verbatim from one answer: "Choose Crowdin if your content lives in GitHub, GitLab, or similar development workflows, or if you rely on community translation", with the table row reading "Software + open-source/community". "Best overall" goes to Phrase; "best developer-first" to Lokalise. In the SaaS scenario Crowdin gets "Good for larger translation programs" while Phrase gets "Excellent" and the "best overall" verdict — a difference of adjectives that decides the shortlist.
This is not a distortion to be corrected with PR. It is an accurate paraphrase of the pages.
/solutions/software-localization carries the H2 "Built by developers, for
developers"; /pricing has a dedicated "Crowdin for Open Source" section;
/product/for-open-source and /product/for-academic exist as standalone
pages. The phrases "for product teams" and "for SaaS companies" appear on none of
the ten money pages. The model is reading the site correctly and reporting what it says. That
means the label is fixable only by changing the copy — and, encouragingly, that the copy is
the whole of what needs changing.
One bright spot to build on: where Crowdin is cited, the blog does the work. Of the 15
prompts in which a Crowdin URL was cited at all, four cite a real page — three of them blog
articles ("is crowdin a cat tool?" cites /blog/cat-tools; "what are the three types of
localization?" cites /blog/software-localization). The fourth is
/project/minecraft, a lucky win on someone else's brand out of 19,345 UGC pages. The
editorial content earns citations; the commercial pages do not.
?utm_source=chatgpt.com to the URLs it cites, so those clicks land and are separable
in GA4 as a chatgpt.com referral. The volume is not measured, and is not
reported as zero. Grant Viewer access to [email protected] and send the numeric
Property ID; that single action clears all six.1. Publish self-hosted and on-premise content (client, Sprint 3). There is almost no search volume for it — this is a purely AI-visibility play, aimed at a query Crowdin currently loses to four open-source projects while offering the capability.
2. Reposition the money pages (client, Sprint 3). The model repeats what the pages say. Add explicit product-team and SaaS framing alongside the open-source story rather than replacing it; the open-source association is an asset, but it is currently the only one.
3. Fill the comparison and pricing gaps from section 4 (client, Sprint 1–2). These are the fan-out categories that decide recommendations, and they are the same fixes already listed — table cells, prices as text, security and limits content.
4. Send GA4 and Brand Radar access (client, one action each). Without them, channel performance and true share of voice stay unmeasured; we will not estimate either.
The single most important thing to understand about this category is that it is low-volume and high-bid. Planning content by search volume in localization software leads systematically to the wrong pages, and we can show exactly how far wrong.
Advertisers do not pay for clicks that do not convert. That makes the top-of-page bid an independent check on intent, and one that volume alone cannot give. The contrast is stark:
| Keyword | Volume/mo | Top-of-page bid | What it actually is |
|---|---|---|---|
localization management platform | 70 | $6.38–25.51 | The exact category term — real B2B demand |
localization platform | 140 | $11.29–39.06 | Real B2B demand |
phrase tms | 110 | up to $738.59 | Highest-value term found in the niche |
smartling | 2,400 | $3.41–49.09 | Competitor brand — commercially valuable |
multilingual user interface | 33,100 | $0.25–1.10 | Windows MUI language packs — not a buyer |
glossaries | 27,100 | $0.13–0.92 | Dictionary lookups |
ai powered translation service | 14,800 | $0.00 | No advertiser demand at all |
Applying that as a rule — volume above 5,000 with a top-of-page bid under $2 is presumed
not to be a buyer — removed 88,500 searches a month, 41% of what first looked like the
gap. Our own initial analysis had multilingual user interface as the single
biggest unclaimed opportunity on the site. It is Windows language packs. We withdrew it, and the
control confirms the withdrawal: seeding the keyword tool with that term returns exactly two
keywords, itself and "windows multilingual user interface" — it has no semantic neighbourhood
in this category because it does not belong to it.
The same discipline killed a second false opportunity.
types of computer-assisted translation showed 90,500 searches a month. Its bid
is $0.02–0.07, and /blog/cat-tools already ranks eighth for it. Had we
skipped the subtraction step, this report would have recommended building a page Crowdin already
has, for a query with no commercial value, as priority one.
The honest consequence of all this filtering: our gap figure came down from 361 keywords / 234,320 searches to 297 keywords / 126,880 — roughly halved. The smaller number is the one worth acting on.
▧ Full keyword gap pool with bids and competitor positions · 411 rowsThis is the cheapest work in the report and it is not content creation. 89 keywords worth 25,720 searches a month belong to articles Crowdin has already published, and competitors outrank them. The pattern is consistent: Crowdin has the article, someone else has the position.
| Existing page | Keywords it should own | Who outranks it |
|---|---|---|
/blog/subtitle-translation | subtitle translator (1,600), subtitle meaning (1,000), example subtitle (720) — 21 keywords total | smartcat p7, lokalise p6–18 |
/blog/wpml-crowdin-integration-for-wordpress-localization | translate wordpress plugin (390, bid $14.92), wordpress translation plugin (390), wordpress multilingual plugin (210) — 12 keywords | lokalise p1–5, weglot p7–13 |
/blog/android-app-localization-tutorial | date format android (720) and 12 keywords total | phrase p13, lokalise p20 |
/blog/react-i18n | react-intl (480), react localization (170), react-native-localize (110) — 9 keywords | lokalise p6–10, phrase p4–8 |
/blog/flutter-localization-guide | flutter localization (320), flutter translate (210), flutter translation (210) | phrase p3–9, lokalise p4–13 |
/blog/angular-localization-and-i18n | angular languages (210), angular localization (110) | phrase p4–10, lokalise p6–16 |
Note this survived our own filtering: it was 112 keywords in the first pass and is 58% smaller now — and it is still priority one, because strengthening a published URL costs a fraction of launching a new one.
▧ All 89 keywords mapped to existing pages · 89 rowsCrowdin publishes two comparison pages, for Lokalise and Phrase. There are 13 direct competitors. Missing: Smartling, Transifex, Smartcat, POEditor, Weglot, Centus, OneSky, memoQ, Trados, XTM and Memsource.
The case for building them is not volume — phrase alternatives is
260 searches a month. It rests on two things. First, competitor brand queries where Crowdin has no
presence total 13,510 searches a month at bids reaching $49
(weglot 3,600, smartling 2,400 at $49.09, lokalise 1,000 at
$19.64, transifex 390 at $22.16). Second, and more important here: "X alternatives"
and "X vs Y" are precisely the fan-out queries a model issues when asked to recommend a TMS. This
is the page type that gets read by machines at decision time. The two pages that exist are
currently orphans (section 4), which should be fixed before more are built.
18 keywords validated by two or more competitors, difficulty 2–20, 3,630 searches a
month. This has the highest competitor validation of anything in the set at the lowest
difficulty, which makes it the most reliable demand signal we have: react-intl (480,
KD 3), flutter localization (320, KD 4), flutter translate (210),
angular languages (210), translate wordpress plugin (390, bid $14.92).
It overlaps heavily with priority 1, which is a point in its favour — the same work serves
both.
Two smaller terms deserve explicit mention because volume-based planning would discard them:
lqa at 1,300 a month, KD 5, bid $22.16 and mtpe at 260 a month,
KD 0, bid $8–12. Both are validated by Lokalise and Smartling, both are unmistakably ICP
vocabulary, and both are ideally shaped for LLM citation — a defined process term with a
precise answer. They are top-three by commercial value despite tiny volume.
| # | Cluster | Keywords | Volume/mo | Median KD | Max bid | LLM intent |
|---|---|---|---|---|---|---|
| 1 | VS: head-to-head comparisons | 22 | 19,790 | 8 | $15.55 | yes |
| 2 | EDU: concepts & guides | 11 | 16,010 | 18 | $14.19 | yes |
| 3 | NAV: competitor brand queries | 12 | 13,510 | 28 | $738.59 | no |
| 4 | VERT: video & subtitles | 19 | 12,780 | 16 | $14.76 | no |
| 5 | DEV: framework & integration how-to | 62 | 11,090 | 16 | $27.80 | yes |
| 6 | DEV: locale & encoding | 31 | 11,080 | 26 | $93.68 | no |
| 7 | TMS: category & CAT tooling | 19 | 8,550 | 0 | $738.59 | no |
| 8 | BEST: listicles & reviews | 15 | 4,450 | 35 | $23.95 | yes |
| 9 | QA: quality & process (lqa) | 2 | 1,470 | 5 | $22.16 | no |
| 10 | AI-MT: machine translation (mtpe) | 7 | 1,620 | 23 | $12.11 | no |
localization management platform is 70 searches a month; localization platform is 140 at bids to $39.06; phrase tms is 110 at up to $738. Volume-led planning misreads this market.lqa (1,300, $22.16) and mtpe (260, $12) as high-value small-volume ICP terms.1. Strengthen the 89 keywords on existing pages first (agency + client, Sprint 2). No new URLs. Highest return per hour in this section.
2. Build the alternatives hub — 11 pages (agency, Sprint 3). Justified by fan-out behaviour and bid value, not volume. Fix the two existing orphans first.
3. Ship the framework cluster and the lqa / mtpe process pages
(agency, Sprint 3). Lowest difficulty, strongest competitor validation, ideal citation shape.
4. Do not plan by volume in this category, and do not chase the "best X" listicles for their
volume — best localization software is 20 searches a month. Build those for
AI visibility only.
5. Send Search Console access. It is the only way to see the long tail of queries already earning impressions.
▧ Content plan, 15 pages prioritised · 15 rowsIn this category models mostly cite intermediaries — Wikipedia, Reddit, roundups, developer media — rather than vendor sites. That makes external placement unusually important here, and it is where the single best effort-to-effect action in the whole report sits: one pull request.
We took eight direct competitors and pulled every domain linking to two or more of them but not to Crowdin. The pool was exhausted — all 2,247 available rows — giving 2,026 unique donors, of which 4 link to all eight competitors and 26 to six. After filtering, 1,074 are editorial, 689 have authority rank 40 or above, and 249 rank 60 or above.
Only a minority can be bought. Probing the 689 editorial donors for guest-post and contributor pages found buyability signals on 44 of them — 6.4% (a random sample of 80 predicted around 7.5%, consistent with the full sweep). The conclusion matters for budgeting: this niche monetises through editorial reviews and analyst coverage, so most of the gap closes by pitching, not purchasing.
| Domain | Rank | Competitors | Why it is worth a pitch |
|---|---|---|---|
nimdzi.com | 46 | 6 | The localization industry's analyst firm — highest topical weight of any target here; participate in their research |
techcrunch.com | 84 | 5 | Product and funding news — needs a PR hook |
sitepoint.com | 73 | 4 | Developer media that models cite — technical i18n article |
tutsplus.com | 83 | 4 | Developer tutorials — technical guide |
translatepress.com | 77 | 6 | WordPress plugin integration and co-marketing |
pitchbook.com | 75 | 7 | Vendor profile application |
entrepreneur.com | 80 | 5 | Authored column on localization |
github.com/oh-jon-paul/awesome-i18n — 408 stars, last updated 24 July
2026 — does not mention Crowdin at all. It is the largest and only actively maintained
awesome-list in the category (the runner-up has 192 stars). It already has an open section,
"Apps and extensions for translation management", which lists POEditor, and
SimpleLocalize appears 6 times across the file. Crowdin appears zero times. The entry
format is a single line, and 4 of the last 5 pull requests were merged.
Awesome-lists are heavily represented in model training and retrieval data, which is why a one-line addition to a 408-star list is the best effort-to-effect ratio in this report. We surveyed all five relevant lists so the picture is complete:
| List | Stars / freshness | Crowdin | Action |
|---|---|---|---|
oh-jon-paul/awesome-i18n | 408★, Jul 2026 | absent | P1 — submit a PR |
mbiesiad/awesome-translations | 192★, Jan 2026 | present | Keep the entry current |
maidis/awesome-machine-translation | 203★, 2024 | absent | Skip — MT research, wrong fit |
mrhota/awesome-i18n | 19★, 2024 | absent | P3 — no TMS section exists yet |
aesmi/awesome-i18n | 1★, stale 2021 | present | Skip |
Crowdin's review presence is strong in two places and weak in the one that is structurally built to answer brand queries:
| Platform | Reviews | Rating | Assessment |
|---|---|---|---|
| g2.com | 662 | 4.4 | Strong. The lever is review volume and category placement, not a link |
| capterra.com | 177 | 4.7 | Highest rating, 3.7× fewer reviews than G2 — grow it |
| trustpilot.com | 18 | 3.8 | The problem — a small, low-rated sample |
| producthunt.com | 1 | 5.0 | Dormant since 2016 |
Two reasons this matters more than the numbers suggest. Trustpilot is structured precisely for
"<brand> reviews" queries — the URL is /review/crowdin.com and the page
title is "Crowdin Reviews" — so it surfaces on exactly the query a buyer runs before
deciding, whereas G2 competes against hundreds of its own comparison pages. And for a model, a
small low-rated sample is more dangerous than a large one: 3.8 gets weighted alongside 4.4,
and the 3.8–4.7 spread across platforms reads as uneven quality rather than as a sampling
artifact.
890 domains are excluded, each with a stated reason: 578 for spam score at or above 30, 540 for authority below 20, 111 on risky TLDs, 106 on free subdomain hosts, 44 with spam terms in the hostname, and 34 as non-editorial noise (job boards, URL shorteners, CDNs).
Spam score alone was not enough, and here is the case that proves it. 24 domains link to five
or more competitors at once while ranking below 40 — the signature of a link network or a
scraper rather than editorial interest. Several would have passed a spam-score filter comfortably:
stackreaction.com (rank 34, all 8 competitors, spam 18),
changelogwp.com (rank 35, 7 competitors, spam 9), hubbry.com (rank 34, 7
competitors, spam 24). Linking to every competitor in the category is what exposes them, so we
required two signals rather than one.
A second exclusion group is the opposite trap — very high authority, useless as targets:
14 Glassdoor locales at rank 85–90, indeed.com (91),
tinyurl.com (90), aliyuncs.com (86, a CDN linking to all 8), and site
builders like Wix and Squarespace at 89–91. Sorting purely by authority puts these at the top
of the list.
reddit.com and
old.reddit.com, and our search tooling does not index Reddit. This is an environment
restriction on our side. Recording it as zero would be a serious error, because Reddit is one of the
most-cited sources in AI answers — a false "nobody discusses Crowdin" would misdirect the
whole placement priority. Needs Reddit API access to close.awesome-i18n (408★, updated last month) omits Crowdin entirely while listing POEditor and naming SimpleLocalize 6 times. One line, and 4 of the last 5 PRs were merged. Best effort-to-effect action in this report.nimdzi.com is the highest-value target: the localization industry's own analyst, already linking to 6 competitors.1. Submit the awesome-i18n pull request this week (agency, one hour).
Single line in an existing section of a 408-star list.
2. Run a Trustpilot review drive (client, Sprint 3). Moving 18 reviews to a few hundred
changes both the rating and its weight. Ask satisfied enterprise customers directly.
Do not transfer G2 or Capterra scores into your own aggregateRating markup
— that is a policy violation. Section 4 covers the correct approach.
3. Pitch nimdzi.com, sitepoint.com and techcrunch.com (agency, Sprint 3). Nimdzi first: analyst coverage in this category carries more citation weight than any single link.
4. Buy selectively (agency). Start with 10 domains at rank 50+ linking to 3+ competitors, manually vetted before payment. Never buy from the 890-domain exclusion list or the 24 footprint domains.
5. Send the contractor inventory (agency, one file). Converts 645 unclassified domains into real Pitch Targets at no API cost.
▧ Exclusion list — check before any purchase · 890 rowsOrdered by effect against effort, not by section. Sprint 1 is deliberately front-loaded with single changes that each cover hundreds or thousands of URLs — a template edit, a directive, one pull request. Every item names the systems it touches, the expected effect, and who does it.
noindex, follow on the /project/* template and remove sitemap-community0.xml from the sitemap indexnoindex from the four money pagessameAs to the shared Astro Organization partial#organization generator from the blog templategithub.com/oh-jon-paul/awesome-i18n{count} variableFAQPage markup, or publish the questions as visible textPerson.sameAs/features/in-context-translationscommunity.crowdin.comrobots.txt rules and fix the malformed Mail.RU tokennoindex locale subdomainsdateModified and surface "Last updated" into the sitemap/profile, /settings and /project/*, or move the app to its own originhreflang to the blog and correct the codes on core/solutions/* pages competing for translation softwarelqa and mtpe pagesaggregateRating markup. There are no visible on-site reviews with
scores, and transferring G2 or Capterra ratings into your own markup is a policy violation. Crowdin
currently marks up no rating it does not own — that is the correct state, and worth
protecting. Where 5 pages with software-application markup need either offers or a
rating, satisfy it with offers.author.url before the author pages exist. A link to a 404 is
worse than an absent field. Build the 7 pages first, then reference them.multilingual user interface at 33,100 a month is Windows
language packs; types of computer-assisted translation at 90,500 is a query Crowdin
already ranks eighth for at a $0.02 bid.Crawl. Screaming Frog 24.3 on a dedicated server, list mode with JavaScript rendering
enabled, 898 URLs: all 49 core pages, all 349 blog URLs, and a random sample of 500 from
the 19,345 /project/* pages — 2.6%, drawn with random.seed(20260817)
for reproducibility. Proportions from that sample are representative; absolute figures for the
UGC section are extrapolations and are labelled as such. We sampled randomly rather than taking the
first or most prominent URLs, because prominent pages are systematically biased — they are
where fixes get applied first, so testing a rule there reports "works" when the site-wide answer is
different.
Site size is measured from the sitemap, not the crawl. The site is 19,743 URLs (19,345 UGC + 349 blog + 49 core), not 898. Page counts derived from a crawl or from pagination are false derivatives: crawl scope is a decision we made, not a property of the site.
Search volume and bids come from Google Ads Keyword Planner — the primary source, exact rather than modelled, and free. Third-party volume estimates were used for nothing in the final figures. Keyword difficulty is on the DataForSEO scale and is not comparable with Ahrefs figures in earlier reports.
Page speed verdicts come from CrUX field data (real Chrome users, 28 days to 15 Aug 2026). PageSpeed Insights lab data is used only to identify causes. Where the two diverge by a factor of several, that is normal and the field data governs. Per-URL field data exists for only 5 URLs because CrUX withholds low-traffic records — a property of the source, not a measurement failure.
The HTTP Last-Modified header was deliberately excluded. It is populated on
397 pages but holds just 8 distinct values, all inside a 31-second window matching our crawl time
— it reports CDN cache age. Using it would have marked 397 pages as fresh and erased
the freshness findings entirely.
Embeddings are TF-IDF with LSA over 200 components (explained variance 0.634), not neural embeddings — no external API was involved. Cosine similarity was computed over 79,003 page pairs across the 398 core and blog pages; only 8 exceeded 0.85. The UGC class was handled as a class rather than as 124,750 pairs. Boilerplate above 30% document frequency was stripped, and 75 release-note articles plus 23 pagination pages were excluded as template repetition — without that filter, one keyword alone would have produced a false 22-page cannibalisation cluster.
Ahrefs was not used in this run by agreement, so there is no Brand Radar share of voice, no Ahrefs difficulty or content gap, and no cross-check of index completeness. Backlink data comes from DataForSEO, whose index trails Ahrefs by 5–29% on live domains — so every absolute link figure in section 7 is a lower bound. Total third-party data spend for the audit was $2.58.
Corrections we made to our own work, disclosed because they changed conclusions. Our
opening hypothesis that robots.txt was blocking the blog was disproved at the primary
source and never reached this report. An automated fan-out pass scoring 66% was discarded for 53%
after we read all 120 evidence strings. A 90,500-a-month "gap" was withdrawn once we checked that
/blog/cat-tools already ranks eighth for it. A 33,100-a-month "opportunity" was
withdrawn on bid evidence. Two extractability scores that disagreed were reconciled by rereading the
pages rather than averaged. And a Wikipedia "gap" was rejected after reading the article in full. In
each case the derived signal was wrong and the primary source corrected it.
Eight checks were not performed. None of them is reported as a zero result.
| What we need | From whom | What it unblocks |
|---|---|---|
GA4 Viewer access for [email protected] plus the numeric Property ID | client | Six metrics at once: LLM traffic share, share of organic, engagement rate, bounce rate, ARPU, and top LLM landing pages. ARPU additionally needs e-commerce or conversion events configured |
| Search Console access (Full or Restricted) on the same email | client | CTR gap and pages-decay — two central checks of section 4 — plus the long tail of queries earning impressions without a ranking position |
| Ahrefs Brand Radar | agency tooling | Quantitative share of voice. We will not substitute another tool and publish the result under that name |
| Reddit API access | agency tooling | Community mentions across 15 subreddits. Currently 403 from our environment — not "no mentions" |
| Contractor link inventory (one file) | agency | Converts 645 link-gap domains into true Pitch Targets. Pure subtraction — no new data spend |
| Server or CDN logs, 30–90 days | client | Exact LLM bot crawl activity. Optional — proxy signals already cover this section |
| Current price list, or access to the pricing endpoint | client | Confirms whether the marked-up 0/50/150/450 tiers are correct before they are published as text |
| ICP description and the author list | client | Sharpens case-study gap analysis and the author-page build |
| ISO 27001 certificate number and issuing body | client | Lets the held certification be published as verifiable markup |
| Confirmation of the founding year | client | Markup says 2008; /about, Wikipedia, Wikidata and Crunchbase all say 2009. Four sources to one, including your own site — we recommend 2009 but will not change it without confirmation |
This report is a thin layer over the data. Every finding is traceable to a row in the client spreadsheet, and the tabs below are linked individually from the sections above.
| Tab | Rows | Contents |
|---|---|---|
fixes | 77 | Prioritised fix list across all sections |
insights | 614 | Every finding with severity and a ready action |
pages | 898 | Full crawl with per-page scores |
schema-errors | 1,599 | Structured-data defects by page and field |
keyword-gaps | 411 | Keyword gap pool with bids and competitor positions |
do-not-replicate | 890 | Excluded donor domains, with a reason each |
link-gap-outreach | 645 | Outreach targets linking to competitors |
fanout | 120 | Every sub-question check with its evidence string |
existing-pages-gap | 89 | Keywords mapped to pages that already exist |
inventory-buylist | 44 | Donors with a paid placement route |
authors | 42 | All authors with article counts |
cannibalization | 40 | Keyword and semantic overlap clusters |
case-studies | 39 | Case studies with ICP segment and quality flags |
clusters | 17 | Keyword clusters with volume, difficulty and bid |
profiles | 17 | Review and directory profiles |
authority-placements | 15 | Platforms assessed for placement |
page-plan | 15 | Proposed pages with targets and priority |
noindex-in-sitemap | 13 | URLs submitted for indexing while forbidding it |
top10 | 10 | Money pages with all three audit levels scored |
interlinking | 7 | Orphan money pages and missed link opportunities |
▧ Open the full audit spreadsheet