
How Many Fonts Should a Website Use?
- Sajjad
- Typography
- 01 Oct, 2026
Open the Network panel on a typical small-business website and filter by "Font." It's common to see a dozen requests: three families from Google Fonts, an icon font, a theme's bundled fallback, and a page builder that quietly loads its own copy of Roboto. Each one was added by someone with a reasonable goal, and together they make the site slower and visually incoherent. Nobody decided the site should use five typefaces. It just happened.
This article answers the question properly: how many font families a website should use, why the answer is usually one or two, how to count weights and files (which matter more for performance than families), and how to audit and trim an existing site down to a sensible font budget.
The Short Answer
For almost every website, use one or two font families, and treat a third as an exception that has to justify itself.
| Setup | Families | Typical use |
|---|---|---|
| One family | 1 | Product sites, documentation, dashboards, minimalist brands |
| Two families | 2 | Most marketing sites, blogs, e-commerce (display + text pairing) |
| Two plus monospace | 3 | Developer docs, technical blogs, SaaS sites with code samples |
| Three or more | 3+ | Editorial publications and brand campaigns with a strong art lead |
The monospace case is the most common legitimate third family. A code font serves a functional role that neither your body nor display face can fill, so it doesn't compete with them visually.
Families, Styles, Weights, and Files Are Different Things
"How many fonts" is ambiguous, and the ambiguity is where most of the confusion comes from. There are four different things you can count:
- Family: the typeface as a whole, such as Inter or Merriweather.
- Style: upright or italic.
- Weight: 100 to 900, such as Regular (400), Semibold (600), or Bold (700).
- File: the actual WOFF2 the browser downloads. A static family with four weights and matching italics is eight files. A variable font might deliver all of them in one or two files.
From a design point of view, the number of families is what matters. From a performance point of view, the number of files and their total bytes is what matters. A site using one family in nine static weights with italics loads 18 files, which is worse for performance than a site using two variable fonts in two files.
So the real rule has two parts:
- Design budget: one or two families.
- Performance budget: as few files as possible, ideally four or fewer on any given page, and under about 100–150 KB of font data for the initial view.
Why Fewer Fonts Usually Works Better
Visual Coherence
Every typeface has its own proportions, x-height, stroke contrast, and rhythm. When you add a family, you add a new set of visual rules for the reader to absorb. Two families can create a deliberate contrast, such as a serif headline over sans-serif body text. Three or more without a clear system read as indecision, and the hierarchy becomes muddy because the reader can't tell whether a change of font means a change of meaning.
You can usually get all the contrast you need from a single family by varying size, weight, case, and color. A strong type family with a full weight range gives you headings, body, captions, and buttons without ever switching typefaces. The guide on what a type family is and how many weights you need covers how to choose weights within a family.
Performance
Each font file is a network request that can block or delay text rendering. Fonts are typically discovered late, after the HTML and CSS are parsed, so they sit right on the critical path for Largest Contentful Paint when your hero is text. More files means:
- More bytes over slow connections.
- More chances for a late swap that causes layout shift.
- More competition for bandwidth with images and scripts.
A common real-world figure: a single Latin-subset WOFF2 weight of a text family is roughly 15–35 KB. Four weights of two families is easily 150 KB or more before you add italics.
Maintenance
Every family you add is another license to track, another set of fallback metrics to tune, and another thing to keep in sync between Figma, your CSS, and your CMS. Teams with three or four families almost always end up with inconsistent usage, because nobody remembers which one is for which role.
When One Family Is Enough
A single family is the right call when:
- The site is a product, app, dashboard, or documentation site where clarity trumps personality.
- You use a large, versatile family with a wide weight range and good italics (Inter, IBM Plex Sans, Source Sans 3, Roboto Flex, Geist).
- Your brand expression comes from color, illustration, or layout rather than letterforms.
- Performance is a top priority, such as a high-traffic content site on mobile.
A one-family system still has plenty of hierarchy:
:root {
--font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
}
body {
font-family: var(--font-sans);
font-size: 1.125rem;
font-weight: 400;
line-height: 1.6;
}
h1,
h2,
h3 {
font-weight: 700;
line-height: 1.15;
letter-spacing: -0.02em;
}
.eyebrow {
font-size: 0.8125rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.caption {
font-size: 0.875rem;
color: var(--color-text-muted);
}
That is four distinct text styles from one family and, if Inter is loaded as a variable font, one file.
You can even go to zero web fonts and use a system font stack. That is a perfectly respectable choice for apps and internal tools.
When Two Families Make Sense
Two families is the classic setup for marketing sites, blogs, and stores. The second family earns its place when it does something the first can't:
- A display face for headlines paired with a neutral text face for body copy.
- A serif for long-form reading paired with a sans-serif for UI, navigation, and captions.
- A brand typeface required by guidelines for headings, with a more economical text face for everything else.
The key is a clear division of labor. Each family should own specific roles, and those roles should never swap. If headings are Fraunces and body is Inter, then buttons, nav, labels, and captions are Inter too. The rules for picking a pair that works together are covered in how to pair fonts.
When a Third Family Is Justified
A third family should solve a specific functional problem:
- Code and technical content. A monospace font for code blocks, inline code, terminal output, and API keys.
- Non-Latin scripts. If your site serves Bengali, Arabic, or Japanese, you'll need a family that covers that script. This doesn't really count against your design budget, because it's the same role in a different writing system.
- Data-heavy interfaces. Occasionally a dedicated figure-friendly face for tables and dashboards, though most good UI families already have tabular figures.
Decorative or "accent" fonts for one-off promotional banners are the classic budget-buster. If you need one for a campaign, load it only on that page.
How to Audit the Fonts on Your Site
Before you set a budget, find out what you're actually loading.
In the Browser
- Open DevTools, go to the Network panel, reload, and filter by Font. Count the requests and note their sizes.
- In Chrome, inspect an element and scroll to the bottom of the Computed tab, where "Rendered Fonts" shows which font actually painted the text.
- In Firefox, the Fonts panel in the Inspector lists every font used on the page.
From the Command Line
You can list every font file a page requests with a headless browser, but a quick check of your CSS is often enough:
# Find every @font-face and font-family declaration in your built CSS
grep -rhoE "font-family:[^;]+" ./out ./.next/static 2>/dev/null | sort | uniq -c | sort -rn
# Find every font file shipped with the build
find ./public ./.next/static -type f \( -name "*.woff2" -o -name "*.woff" -o -name "*.ttf" \) -exec ls -lh {} \;
If you find families you didn't know you were using, look at plugins, page builders, embedded widgets, and icon libraries. Lighthouse will also flag render-blocking font CSS; see how to audit web font performance with Lighthouse for a full walkthrough.
How to Trim Down to a Font Budget
Once you know what's loading, cut it down in this order:
- Remove unused families. Search the codebase for each
font-familyvalue. If a family appears only in a stale component or a plugin you don't need, remove it. - Consolidate weights. Most designs need regular, a medium or semibold, and bold. Light (300) and black (900) are often used once and can be replaced.
- Drop faux variants. If you load italic only for a handful of emphasized words, consider whether the browser's synthesized oblique is acceptable, or keep only regular italic.
- Switch to variable fonts when you need three or more weights of a family. One variable WOFF2 is usually smaller than three static files.
- Subset to the character sets you actually use.
- Load secondary families on demand. A code font only needs to load on pages with code, which happens automatically if it's referenced only by
preandcodestyles and no element on the page uses it.
Here is what a lean two-family setup looks like with @font-face:
@font-face {
font-family: "Source Serif 4";
src: url("/fonts/source-serif-4-var.woff2") format("woff2");
font-weight: 400 700;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Inter";
src: url("/fonts/inter-var.woff2") format("woff2");
font-weight: 400 700;
font-style: normal;
font-display: swap;
}
body {
font-family: "Source Serif 4", Georgia, serif;
}
h1,
h2,
h3,
nav,
button,
.ui {
font-family: "Inter", ui-sans-serif, system-ui, sans-serif;
}
Two families, two files, a full weight range in each.
Font Budgets in Design Systems
If you work in a team, write the budget down. A short entry in your design system docs prevents the slow creep back to five families:
| Token | Family | Roles | Weights loaded |
|---|---|---|---|
--font-display | Fraunces | h1–h3, pull quotes | 600 (variable) |
--font-sans | Inter | Body, UI, nav, buttons, captions, h4–h6 | 400–700 (var) |
--font-mono | JetBrains Mono | Code blocks, inline code, keyboard input | 400 |
When someone wants to add a font, they have to replace a row or make the case for a new one. That one rule keeps sites coherent for years.
How Many Fonts FAQ
Not inherently, but the third family needs a clear functional role, such as monospace for code or a script that your main fonts don't support. Three families chosen for decoration usually weaken the hierarchy and add unnecessary load time.
For design purposes, weights of the same family count as one font. For performance, each static weight is a separate file the browser has to download, so six weights of one family can cost more than two variable families.
Yes. Many excellent product and documentation sites use a single versatile family and create hierarchy through size, weight, case, and color. A single variable font can cover every text style in one file.
Not directly, but more font files slow down rendering and can cause layout shift, which affects Core Web Vitals. Those metrics are part of Google's page experience signals, so a bloated font setup can have an indirect effect.
They count toward the performance budget because they are font files the browser must download. Most modern sites replace icon fonts with inline SVG icons, which removes that cost entirely.
Most sites need three: a regular weight for body text, a medium or semibold for UI and subheadings, and a bold for headings. Add italics only if your content uses emphasis regularly.
Conclusion
The honest answer to "how many fonts should a website use" is one or two families, with a monospace or script-specific family as the only routine exception. That limit isn't arbitrary. It keeps the visual hierarchy legible, keeps the font payload small, and keeps the system simple enough that a team can actually follow it.
Separate the design question from the performance question. Count families for coherence, and count files and kilobytes for speed. Audit what your site really loads, cut unused families and weights, move to variable fonts where you need a range, and write the budget into your design system so it stays lean.
Here are some useful references for going deeper on choosing and limiting web fonts:
- web.dev: Optimize web fonts — how font count and file size affect loading performance.
- MDN Web Docs: @font-face — reference for declaring families, weight ranges, and font-display.
- Google Fonts Knowledge: Pairing typefaces — guidance on when a second family adds value.
- Butterick's Practical Typography: Font recommendations — a practitioner's view on choosing and limiting typefaces.


