Why industry lists all say the same thing
Read four "fonts for X" guides across four unrelated sectors and the overlap is striking. A geometric sans for anything technology-adjacent. A transitional serif for anything that wants to seem established. A high-contrast display serif for anything luxury. A rounded sans for anything friendly.
The convergence happens because industry is a proxy variable. What the writer means by "fintech" is *needs to signal institutional trust*, and what they mean by "creative agency" is *needs to signal distinctiveness over legibility*. Those are the real inputs. Once you name them directly, the sector label stops adding information — and it stops leading you to the same three fonts as every competitor in your category.
Industry is a proxy for trust register and reading load. Name those directly and the category label stops adding anything.
The three axes that matter
| The question | What it decides | |
|---|---|---|
| Reading load | Does anyone read more than 200 continuous words? | High load needs a body face designed for extended reading: generous x-height, open apertures, real italics. Low load frees you to prioritise character |
| Trust register | Does the reader need to believe you are established and safe? | High trust pushes toward familiar, institutional forms — a serif or a neutral grotesque. Low trust lets you be strange |
| Interface density | How much UI text sits at 12–14px? | Dense interfaces need a face that holds up small: clear numerals, distinguishable I/l/1, tight but not cramped spacing |
The third axis is the one designers skip and engineers discover. A face that is beautiful in a 48px heading can be unusable in a 12px table label, and most interface work happens at the small end. Test at 12px before you fall in love at 48px.
The I/l/1 test is not pedantry. In any product with codes, identifiers, order numbers or passwords, a face where capital I, lowercase l and the digit 1 are indistinguishable produces real support tickets. Type them next to each other before committing.
Pairings by sector
These are defensible defaults, with the reasoning stated so you can disagree with it, and a differentiating alternative for each because the default is what your competitors already used.
Each sector below carries a live specimen rather than a screenshot: the heading face, the body face and the mono face rendered at every step of a real scale, in the browser you are reading this in. A pairing shown as an image tells you nothing about how it sets at caption size, and caption size is where pairings fail.
SaaS and developer tools
| Pairing | Why | |
|---|---|---|
| Default | Inter throughout, one weight band | Designed for interfaces, excellent at small sizes, variable weights. The safest possible choice, which is also its problem |
| Differentiated | A grotesque with more character for headings, Inter for UI | Keeps the small-size reliability where it matters and puts personality only where the reader is not working |
| Avoid | A geometric display face for UI labels | Geometric forms lose distinction at 12px — the o/e/c collapse toward each other |
For a deeper treatment of the SaaS case specifically, including a mono face for data and how many weights you actually need, see SaaS font pairing.
Finance, insurance, legal
| Pairing | Why | |
|---|---|---|
| Default | A transitional serif for headings, a neutral grotesque for body and UI | The serif does the institutional signalling; the grotesque keeps forms and tables legible |
| Differentiated | A contemporary serif with visible construction, paired with the same grotesque | Signals established without signalling 1987. The pairing structure stays conservative; the voice does not |
| Avoid | A serif for body text in a data-heavy product | Serifs in dense tables at 13px produce visual noise, and financial products are mostly tables |
Token specimen · real values
Verdant Finance
Live renderVerdant Finance's actual tokens — the same values its exports use.
Typography
Verdant Finance
Scale: major-third
Density: balanced
Heading · Plus Jakarta Sans · 2.25rem
Sample headline
Subheading · Plus Jakarta Sans · 1.5rem
Sage-green fintech kit with yellow-gold active surfaces and dark-olive secondary rows, uppercase labels, and tabular numerics.
Body · DM Sans · 1rem
A calm, nature-toned personal-finance system on a warm sage-green canvas (#c1c4b1). Vibrant yellow-gold (#dec956) fills active cards and primary actions while dark olive (#525a4b) marks inactive or secondary rows. A bold geometric sans (Plus Jakarta Sans) sets headings against DM Sans body copy. Uppercase labels with 0.08em tracking, right-aligned tabular figures, and dark rounded-square icon chips give the UI a systematic character. Elevation is flat: surfaces separate by color value alone, never by shadow.
Mono · JetBrains Mono · 0.75rem
npx shadcn add verdantfinance.json
Aa
Plus Jakarta Sans · Heading
Aa
DM Sans · Body
ABCDEFGHIJKLM NOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 & @ # % →
Healthcare and public services
| Pairing | Why | |
|---|---|---|
| Default | One humanist sans throughout, at generous sizes | Humanist forms are the most legible under stress, at distance, and for readers with low vision. One family removes a failure mode |
| Differentiated | A humanist sans with a warmer alternate for headings only | Warmth without compromising the body face. Keep the change to display sizes |
| Avoid | Anything with tight tracking, light weights, or low x-height | Your reader may be anxious, in a hurry, on a phone in bad light, or all three |
This category is worth studying even if you work elsewhere. Public-service design systems publish the research behind their type choices, which almost nobody else does — and a face proven under the worst conditions is a safe choice under ordinary ones.
E-commerce and consumer retail
| Pairing | Why | |
|---|---|---|
| Default | A characterful display face for product and category headings, a neutral sans for everything transactional | The split matters: personality sells, neutrality checks out |
| Differentiated | Push the display face further than feels comfortable, and keep the transactional face boring | Almost all differentiation is available in the 20% of type the customer reads before deciding |
| Avoid | The display face anywhere near price, quantity, or the checkout flow | Anything ambiguous about a number costs conversion and trust simultaneously |
Editorial, media and publishing
| Pairing | Why | |
|---|---|---|
| Default | A serif built for extended reading in body, a grotesque for furniture and UI | This is the one case where a body serif is unambiguously right — long-form reading is what they are for |
| Differentiated | Same structure, but choose the body serif for its italic | Editorial text uses italics constantly, and most pairings are chosen on the roman alone |
| Avoid | A display serif as the body face | High contrast that looks superb at 48px becomes thin and tiring at 18px over a thousand words |
Agencies, studios and portfolios
| Pairing | Why | |
|---|---|---|
| Default | One unusual display face, one invisible workhorse | The work is the content. Type should frame it and then get out of the way |
| Differentiated | A single family used at extreme size contrast rather than two families | One face at 14px and 160px is a stronger statement than two faces at moderate sizes, and easier to keep coherent |
| Avoid | Three families | Almost every three-family system is two families and an unresolved argument |
Token specimen · real values
LimePulse Digital Agency
Live renderLimePulse Digital Agency's actual tokens — the same values its exports use.
Typography
LimePulse Digital Agency
Scale: perfect-fourth
Density: balanced
Heading · Space Grotesk · 2.986rem
Sample headline
Subheading · Space Grotesk · 2.074rem
A clean marketing-agency kit anchored on an acid-lime accent, with alternating dark/light card pairs, filled eyebrow chips, and pill CTAs on a white canvas.
Body · DM Sans · 1rem
A neutral-surface system for a modern performance-marketing agency. The white canvas is punctuated only by a vivid acid-lime (#b6fa56) used as filled section-label chips, inline text-highlight spans behind key heading words, and small icon fills. Service cards alternate between near-black (#191923) and white in a two-column grid, both sharing the same lime text-highlight motif. Primary CTAs are solid near-black pill buttons in light mode and solid lime pills in dark mode. Space Grotesk headings and DM Sans body carry the geometric character.
Mono · JetBrains Mono · 0.875rem
npx shadcn add limepulsedigitalagency.json
Aa
Space Grotesk · Heading
Aa
DM Sans · Body
ABCDEFGHIJKLM NOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 & @ # % →
Education and non-profit
| Pairing | Why | |
|---|---|---|
| Default | A humanist sans throughout, with a serif reserved for long-form articles | Audiences span ages and devices widely. Humanist forms hold up across that range better than geometric ones |
| Differentiated | A slab or a low-contrast serif for headings | Reads warm and substantial without the institutional coldness of a transitional serif |
| Avoid | Light weights anywhere | Assume older devices, older readers, and screens with the brightness turned down |
Property, hospitality and travel
| Pairing | Why | |
|---|---|---|
| Default | A refined serif for headings over imagery, a quiet sans for details and listings | Type sits on photographs, so contrast and weight matter more than character |
| Differentiated | A single sans at extreme weight contrast, letting the photography carry all the warmth | The serif-over-photo look is the most saturated convention in this sector |
| Avoid | High-contrast display serifs over busy images | Thin strokes disappear into photographic detail, and every listing photo is different |
Industrial, logistics and B2B manufacturing
| Pairing | Why | |
|---|---|---|
| Default | A neutral grotesque throughout, with a mono for part numbers and specifications | The mono is not decorative here — it makes long alphanumeric identifiers scannable and comparable |
| Differentiated | A grotesque with genuine character at display sizes; keep the spec face neutral | This sector is chronically under-designed, so modest distinctiveness goes a long way |
| Avoid | Any proportional face for part numbers | Comparing two specification tables requires digits that line up in columns |
The tabular-numerals point generalises well past this sector. Anywhere numbers appear in a column — prices, quantities, metrics, dates — font-variant-numeric: tabular-nums makes them comparable at a glance. Most faces support it and almost nobody switches it on.
The technical half nobody covers
A pairing that is right on paper and wrong in the browser is still wrong. Four delivery decisions that change what your reader actually sees.
| The decision | What goes wrong | |
|---|---|---|
| Variable versus static cuts | One variable file versus several static weights | A variable file is usually smaller than three statics and unlocks intermediate weights. But a pairing depending on a weight you did not ship gets synthesised, and synthetic bold is visibly worse |
| Fallback metrics | What renders before the webfont loads | Without matched metrics the page reflows when the font arrives. size-adjust and the ascent-override family let a system fallback occupy nearly the same space |
| Subsetting | Which characters ship | Latin-only subsets are dramatically smaller and silently break the moment a name, a currency symbol or a language you did not anticipate appears |
| Loading strategy | font-display behaviour | swap shows fallback then reflows; optional may never show your font on a slow connection. Neither is free — pick deliberately |
The fallback-metrics row is the highest-value one and the least known. A layout shift on every first visit is a real quality signal to users and to page-experience metrics, and it is fixable with a handful of CSS descriptors rather than a font change.
/* A metric-matched fallback: same footprint, no reflow on load. */
@font-face {
font-family: "Inter Fallback";
src: local("Arial");
size-adjust: 107%;
ascent-override: 90%;
descent-override: 22%;
line-gap-override: 0%;
}
body { font-family: "Inter", "Inter Fallback", sans-serif; }The exact percentages differ per typeface and are worth measuring rather than copying. Several frameworks now generate them automatically when fonts are declared through their font API, which is the easiest way to get this right.
The ten-minute check
Before committing to a pairing, five tests. Each catches a different failure and all of them are faster than discovering the problem in build.
- 1
Set your real headline, not a placeholder
Lorem ipsum has no capitals in awkward places, no numbers, and no long compound words. Your actual product name and value proposition will have all three.
- 2
Type Il1 O0 and a long number
Capital I, lowercase l, digit 1; capital O, digit 0. Then a realistic order number or currency amount. If any pair is ambiguous, the face is wrong for anything transactional.
- 3
Render body text at 14px and read a full paragraph
Not a line. A paragraph. Fatigue and rhythm problems only appear over distance, and body text is where readers spend their time.
- 4
Check the weights you actually have
A pairing that depends on a weight the webfont does not ship will silently synthesise it, and synthesised bold is visibly worse. Confirm every weight in your scale exists as a real cut.
- 5
Look at it next to two competitors
This is the industry-convention check, used correctly: not to find your font, but to confirm you did not land on theirs.
Writing a pairing down so it survives
Choosing the pairing is half the work. The other half is recording it precisely enough that it gets reproduced — by a new engineer, or by a coding agent writing screens you never review line by line.
We sampled 299 DESIGN.md files published for AI agents to read. 83% mention typography, and 44% contain no concrete size value anywhere. They name a font and stop, which leaves every size, weight and tracking decision to the model — and the model resolves it the way its training data does, which is the same way everyone else's does.
| What gets built | |
|---|---|
| "Headings: Playfair Display. Body: Inter." | Correct families, invented scale, weights up to 800, no tracking, and a different hierarchy on every screen |
| Families, a numbered scale, an explicit weight band, and a tracking ramp | The same hierarchy every time, because there was nothing left to decide |
## Typography
Display: Playfair Display — headings 32px and above only.
UI and body: Inter (variable) — everything else.
Scale: 12 / 14 / 16 / 20 / 24 / 32 / 48.
Weights: 400 and 600 only. Never above 600.
Tracking: -0.02em at 32px+, 0 from 14-24px, +0.02em on 12px caps.
Never set Playfair below 32px.
Never use Playfair for UI labels, buttons or table content.
Numerals are always Inter, always tabular in tables.Note that half of that is prohibitions. A pairing recorded as two font names permits every misuse of both; the constraints are what make the pairing hold. More on writing guidance an agent will follow.
Every Identity Forge kit ships an exact pairing with its scale, weight band, tracking and per-element rules, alongside 28 semantic colour roles, serialised into a DESIGN.md. Browse the kits to see pairings in context rather than as specimen sheets.
What are the best font pairings for my industry?
Industry is a weaker signal than it looks. Decide first on reading load (how much continuous text), trust register (how institutional you need to seem), and interface density (how much text sits at 12–14px). Those three determine the pairing; the sector label is best used afterwards, to check you have not landed on a competitor's fonts.
How many fonts should a brand use?
Two families covers almost every product: one for display or headings, one for body and interface. A third is occasionally earned by a genuine mono requirement for code or data. Beyond that, most three-family systems are two families plus an unresolved disagreement.
Can I use a serif for body text?
Yes for long-form editorial reading, which is what body serifs are designed for. No for dense interface work — serifs in a 13px table produce visual noise, and most products are mostly tables. Match the choice to how much continuous text your reader actually faces.
Why do all SaaS products use the same font?
Because Inter and its close relatives genuinely solve the hardest constraint — staying legible and distinguishable at 12px across a whole interface — and every product with that constraint converges on the same answer. The way out is not a different UI font but putting the personality in display type, where small-size legibility is not at stake.
How do I stop an AI agent from breaking my font pairing?
Record more than the family names. State the size scale as explicit numbers, the weight band as a hard limit, the tracking ramp, and where each face may not be used. A file that names two fonts and nothing else leaves every hierarchy decision to the model, which resolves it differently on every screen.