← Back to Blog
Development by Featured

Fonts in Odoo, Part 3: The Apps Store Sells Legibility, Not Style

Fonts in Odoo, Part 3: The Apps Store Sells Legibility, Not Style

Every font module on the Odoo Apps Store, 117 of them, measured. Nine in ten downloads go to modules that exist so text renders at all, not so it looks good. Here is what the market sells, what core gives you free, and the one script nobody has covered.

Part 2 ended with OCA offering three font modules and none of them running on Odoo 19. The Apps Store has the opposite problem. There is plenty for sale, 58 listings target 19.0 alone, and for most you cannot read a line of the source before you pay.

So this article measures it instead, mapping every font module on the store: what sells, which layer each one touches, and where the money goes. The starting assumption turned out to be wrong, and the numbers say so plainly.

Numbers below come from a scrape of apps.odoo.com on 31 July 2026, 10 keywords and 117 font-specific modules after filtering. Prices are as the store displayed them at that moment, and the store localises currency, so yours may read differently. Counts move too. Treat all of it as the market’s shape rather than a price list.

How we counted

We searched the store with a scraper we wrote for the job, a small Typer CLI that caches results in SQLite so the analysis is re-runnable. Ten keywords (font, fonts, custom font, google font, font family, font size, report font, web font, typography and arabic font) returned 168 listings. We then dropped 51 of them after reading every description. Thirty-six mention fonts only in passing: POS receipt designers, backend themes, and in one case a Peruvian payroll pack. The other fifteen are icon-font modules, which ship as font files but solve a different problem and have an article of their own. That leaves 117 font-specific modules.

One honest limitation, and it is the whole difference between this article and part 2. Two thirds of these listings are paid, and a paid module is a closed archive you buy before you read. In part 2 we could open every OCA module and quote the bundle it hooks. For the 80 paid listings here we cannot, so every claim about what one does is the vendor’s, taken from its listing.

What the numbers actually say

The obvious framing is part 1’s three layers, each ranked by popularity. The data refused it:

Module Price Odoo Downloads
Chinese TrueType fonts (Elico Corp) FREE 7.0 11,036
Nati arabic font FREE 19.0 3,235
SAR Symbol Font FREE 18.0 2,016
Fix Google Fonts (Bytist GmbH) FREE 16.0 695
Replace Google Fonts (HAV Media GmbH) FREE 15.0 278

Not one is about branding. The top three exist so characters appear on screen instead of as boxes, question marks or nothing at all. The other two exist so a German court does not take an interest in where your website fetches its fonts from, which is a section of its own further down.

One thing to get straight first. The store publishes downloads for free listings and purchases for paid ones, never both: all 37 free modules here carry downloads, all 80 paid ones carry purchases or nothing. The two are not comparable and cannot be added, so everything below says which it is.

Counted across the free listings, script and glyph coverage takes 17,939 of 19,660 downloads, or 91%. Modules that exist to make an Odoo instance look like the client’s brand are a rounding error in comparison.

In a Latin alphabet, fonts feel like styling, the thing you tune once the features are done. For most people installing these modules, a font is the difference between a readable invoice and an unusable one.

The market’s shape by layer, using part 1’s map plus two surfaces it did not cover:

Layer Modules Downloads (free) Purchases (paid) Paid price range
Scripts and glyphs 40 17,939 1 $5.69 to $597.01
Website 30 1,287 82 $5.69 to $150.00
PDF reports 29 406 143 $1.47 to $750.00
Backend UI 10 n/a 38 $0.97 to $23.46
Point of Sale 6 22 14 $12.53 to $17.08

Two of the 117 resist those buckets, a template designer and an icon-colour widget, and are left out. Backend UI has no download figure because it has no free listing at all.

Side by side, the split is clean. Free demand goes to scripts, 17,939 downloads. Paid demand goes to reports, 143 of the 278 purchases recorded across the set, against exactly one purchase spread over all 21 paid script modules. People download a font so text renders, and pay for a module so a report looks the way they want.

Scripts and glyphs

Chinese, and how old this problem is

The most downloaded font module in Odoo’s history is l10n_cn_fonts by Elico Corp, at 11,036 downloads. It targets Odoo 7. Its description says it “replaces the standard PDF Type1 fonts with TrueType fonts that have unicode characters for simplified Chinese”, shipping DroidSansFallback.ttf.

Type1 and RML place it in the pre-QWeb era: obsolete for roughly a decade, still top of the all-time chart. Nothing has replaced it at that scale, the clearest evidence that script coverage is a permanent under-served need rather than a passing gap.

Arabic, free against paid

Arabic is the most commercially contested script on the store. On the free side, nati_arabic_font has 3,235 downloads and, unusually here, already targets 19.0.

On the paid side, STRIDE Business Solutions lists ten separate SKUs between $45.56 and $68.33, one font family per listing: Amiri, Almarai, Beiruti, Cairo, IBM Plex, Noto Kufi, Noto Sans, Readex Pro, Tajawal and Zain. Three families from that catalogue costs more than $200.

One of those names should stop you. Odoo core already bundles Tajawal: it sits in res.company.font as a selectable option and the files ship in web/static/fonts/google/Tajawal, as part 2 covered. STRIDE’s Tajawal listing costs $68.33.

To be fair to the vendor, these are not the same thing. Core exposes Tajawal only through the Document Layout picker, which reaches PDF reports; the paid listing advertises “Web & PDF”, so it covers surfaces the picker does not. The lesson is not that the module is worthless, it is that you need to know which surface you are missing before you spend, because part of what is on sale is already installed.

A currency symbol is a font dependency

The most interesting cluster in the dataset is a group of free Saudi font modules on 18.0, led by SAR Symbol Font at 2,016 downloads, with siblings named Alwatad, Almasmak, Alawwal, Year of Camel and Year of Hand Craft. An Oman equivalent exists too.

They exist because Saudi Arabia introduced a new Riyal currency symbol, and a new symbol is a new glyph. Until fonts carry it the symbol cannot render, so every invoice, receipt and screen showing an amount is affected at once. The Saudi Font listing states it “works in PDF reports”, is “compatible with Point of Sale interface” and “shows in invoices and all system views”.

Read against part 1’s layer map, that is a module deliberately spanning every layer, because the requirement is not stylistic and does not respect those boundaries. A currency regulator changed a glyph and every rendering surface in the ERP had to follow. It is the series’ strongest illustration of part 1’s point that fonts are not cosmetic.

Thai, where OCA and the store overlap

Thai is the one script with real coverage on both sides. The store carries Font Noto Sans Thai and Sarabun (free, 19.0, 224 downloads), Thai Google Fonts (free, 148), a paid Thai Report Fonts at $8.89, and OCA’s own l10n_th_fonts listed at 164 downloads.

That OCA module is worth revisiting, because part 2 nearly missed it. Searching OCA repository names for “font” never surfaces it: it lives in OCA/l10n-thailand, filed under a country rather than a feature. The store search found it immediately. Hunting for an OCA module and coming up empty, search the store too: it indexes by what a module does, GitHub by where someone filed it.

The gap: Vietnamese

Searching the dataset for Vietnamese coverage returns zero modules. Not free, not paid, not on any version.

This is not a script without a problem. Vietnamese uses stacked diacritics that many fonts carry incompletely, and it fails exactly the way part 1 warned about: the renderer substitutes silently, so text looks correct to whoever built the report and reaches the customer with marks missing or mangled. Part 2 found the same hazard inside OCA, where account_financial_report hardcodes font-family: Helvetica, Arial for its own layouts.

Nobody has packaged the fix. OCA’s Thai module is a working template: ship the TTFs, declare them, inject the stylesheet into the report bundle.

# __manifest__.py
"assets": {
    "web.report_assets_common": [
        "l10n_vn_fonts/static/src/scss/fonts_style.scss",
    ],
},
// static/src/scss/fonts_style.scss
@font-face {
    font-family: "Be Vietnam Pro";
    src: url("../../fonts/BeVietnamPro-Regular.ttf") format("truetype");
}

That is the whole mechanism, the same twenty lines part 1 published. For a Vietnamese instance printing invoices it is the difference between correct and quietly wrong, and it is an open contribution waiting for someone to make.

Google Fonts, GDPR, and self hosting

A cluster of free modules exists to stop Odoo fetching fonts from Google:

Module Vendor Odoo Downloads
Fix Google Fonts Bytist GmbH 16.0 695
Replace Google Fonts HAV Media GmbH 15.0 278
Local google fonts Miguel Martinez Lopez 18.0 113

Two of the three vendors are German, which is not a coincidence. German courts have treated embedding Google Fonts as transmitting visitor IP addresses to a third party without consent, and the resulting warning letters made self hosting a compliance requirement rather than a performance tweak.

Part 1 noted that Odoo downloads a selected Google Font into an ir.attachment and serves it locally, so a stock website is already in reasonable shape. These modules exist for the edges that behaviour misses, and their download counts suggest the edges are real. For an EU client, check it regardless of whether you install anything: the failure mode is legal rather than visual.

The layer map, store edition

With scripts covered, here is the rest of part 1’s map.

Backend UI font. The layer where OCA offers nothing and core offers no setting at all, and the store fills it for pocket change: Fonts Utils at $0.97 on 19.0, Ubuntu Font for Odoo at $1.06, Custom Font Family at $8.54, and Backend fonts at $20.99. All ten are paid, which is why the layer shows only 38 purchases. Set against part 1’s roughly twenty lines of SCSS, a dollar is a fair price for not writing them, provided the module survives your next upgrade.

PDF reports. The largest paid category and the widest spread, $1.47 to $750. Keypress IT Services sells report font size and report font style as separate $19.93 modules; Zyrado offers Qweb Reports Custom Font at $17.28. Before buying, re-read part 2: core’s Document Layout picks from eight bundled families free, and OCA’s web_font_size_report_layout handles size on 16.0 and 17.0.

Website. Thirty modules, mostly Google Fonts managers and upload interfaces. Geminate Consultancy Services sells a Website Font Manager at $56.93 and a Web Font Manager at $45.54. This is where OCA’s website_local_font stalled at 17.0, so on 18.0 and 19.0 the store fills a real gap rather than duplicating one.

Point of Sale. A small layer part 1 never mapped, worth a mention because POS is its own rendering surface: a touchscreen and a receipt printer, neither behaving like the backend or a PDF. Six modules, mostly font-size adjustments between $12.53 and $17.08, plus a free POS Font Size Accessibility module on 19.0.

Reading a listing before you buy

With no source to read, the listing is your only evidence. Five checks, in order:

  1. Check core first. The Tajawal case above is the whole argument: a $68.33 listing for a font family Odoo already ships. Part 2’s Document Layout picker covers eight families free.
  2. Check OCA second. Free, source-readable, sometimes the same module. website_local_font and web_font_size_report_layout are both on the store, a reminder that OCA ships through it as well as through GitHub.
  3. Does the listing name the mechanism? The good ones do. The Saudi Font listing states which surfaces it affects; STRIDE’s says “Web & PDF”. Listings that promise a font without naming the bundle are the ones that surprise you on upgrade.
  4. Check the version. 58 of 117 modules target 19.0, so unlike OCA you will probably find something current. Confirm rather than assume, because plenty sit on 13.0 to 16.0.
  5. Read the vendor’s catalogue, not just the module. The longest listing title in this dataset runs 217 characters, a chain of keyword variations separated by pipes. One vendor sells ten near-identical SKUs at $68.33, one font family each, where a single bundle would serve. Calcobase appears under two spellings of its own name, splitting its listings across both. Store categories are inconsistent enough that Report and Reporting, Point of Sale and point of sales all coexist. None of this proves a module is bad, but it tells you how much care the seller takes, which is the closest thing to a code review you get here.

The takeaway

  • Fonts on the store are mostly a legibility problem. Scripts alone take 91% of all downloads, and paid uptake is small in absolute terms: 278 purchases across every paid listing, of which scripts account for one.
  • Scripts: strong coverage for Chinese, Arabic and Thai. Currency glyphs like the new Saudi Riyal are font problems too, cutting across every layer at once.
  • Vietnamese has nothing. The l10n_th_fonts pattern is the template, about twenty lines.
  • Backend UI: the layer core and OCA both ignore, filled by paid modules starting under a dollar.
  • Reports: the busiest paid category, and the one where core most often already has your answer.
  • Website: a real gap on 18.0 and 19.0 since website_local_font stalled, plus a GDPR-driven cluster of self hosting modules.

Three articles, one order of operations. Check what core already does, because it does more than most people expect. Check OCA next, because it is free and you can read it. Buy from the store when it fills a genuine gap, and read the listing like the contract it is. Write it yourself when none of that fits, which after part 1 you already know how to do.

The map from part 1 is what to keep. Backend, reports, website, and now POS, each with its own bundle, each needing the font declared where that surface can see it. Every module here is a packaged answer to that same question.

Ready to get the most out of Odoo?

Whether you are starting a new implementation, upgrading from an older version, or optimizing your current setup — our Odoo-first team is here to help.