Font Converter

Font Subsetting vs Full Fonts: Complete Optimization Guide

Understanding font subsetting, performance benefits, implementation strategies, tradeoffs, and how to choose between subset and full fonts for optimal web performance

TL;DR

In Simple Terms

Subsetted fonts contain only needed characters (50-90% smaller). Full fonts include all glyphs for maximum flexibility.Use subsetting for: Landing pages, marketing sites, controlled content. Use full fonts for: User-generated content, multilingual sites, CMS platforms.Tools: Glyphhanger (automatic), pyftsubset (manual control), Font Squirrel (web GUI). Always keep original full font files.

Share this page to:

Font subsetting is the process of creating a smaller font file that contains only a specific subset of characters from the original complete font. Instead of including all 1,000+ glyphs covering dozens of languages and special characters, a subset font might contain only the 200-300 characters actually used on your website. This optimization technique can reduce font file sizes by 50-90%, dramatically improving page load performance without any visual difference for your users.

The decision between using subset fonts versus full fonts involves balancing performance against flexibility. Subset fonts load faster and use less bandwidth, which improves Core Web Vitals, reduces server costs, and enhances user experience—especially on mobile connections. However, subset fonts sacrifice flexibility: if you later need characters not included in the subset (accented letters, special symbols, additional languages), those characters won't display correctly, appearing as missing glyph boxes.

Modern web performance best practices strongly favor aggressive font subsetting for production websites. With proper planning and the right tools, you can achieve 70-90% file size reductions while maintaining full functionality for your content. This guide explores every aspect of font subsetting—from basic concepts to advanced implementation strategies—helping you make informed decisions about font optimization for your specific needs.

What is Font Subsetting?

The Concept Explained

A typical professional font contains thousands of glyphs to support multiple languages, special characters, ligatures, and alternates. Most websites use only a tiny fraction of these characters.

Full Font Example (Roboto):

  • • Total glyphs: 1,294 characters
  • • Basic Latin: A-Z, a-z, 0-9, punctuation
  • • Latin Extended: À, É, Ñ, Ø, etc.
  • • Cyrillic: А, Б, В, Г, Д, etc.
  • • Greek: Α, Β, Γ, Δ, etc.
  • • Vietnamese: Ạ, Ả, Ã, etc.
  • • Symbols: €, ™, ©, arrows, math
  • TTF file size: 168 KB
  • WOFF2 file size: 53 KB

Subset Font (Latin Basic Only):

  • • Total glyphs: 218 characters
  • • A-Z (uppercase)
  • • a-z (lowercase)
  • • 0-9 (numbers)
  • • Basic punctuation (. , ! ? ; :)
  • • Common symbols (@ # $ % & *)
  • • No extended characters
  • TTF file size: 45 KB (73% smaller)
  • WOFF2 file size: 14 KB (74% smaller)

How Subsetting Works

Font subsetting tools analyze the original font file and create a new font containing only specified characters:

  1. Character Selection: You specify which characters to include (via Unicode ranges or actual characters)
  2. Glyph Extraction: Tool extracts only the selected glyph outlines from the original font
  3. Table Optimization: Font tables (cmap, glyf, etc.) are rebuilt with only necessary data
  4. Feature Preservation: OpenType features (ligatures, kerning) maintained for included glyphs
  5. New Font File: Output is a complete, valid font file with dramatically reduced size

What Gets Removed During Subsetting

  • Unused Glyphs: Any characters not explicitly included are removed entirely (accented letters, foreign language characters, special symbols)
  • Ligatures for Missing Characters: If you remove "f" and "i" but keep other letters, the "fi" ligature is also removed
  • Kerning Pairs: Kerning data for removed character combinations is eliminated
  • Metadata: Often stripped to reduce size further (copyright notices, designer info, etc.)
  • Hinting Instructions: Sometimes simplified or removed if no longer needed

Important: Subsetting is Irreversible

Once you create a subset font, you cannot "add back" missing characters. You must:

  • • Keep the original full font file as your source
  • • Regenerate subsets when you need different character sets
  • • Never use subset fonts as the source for further subsetting
  • • Always subset from the complete original font

File Size and Performance Impact

Real-World File Size Comparison

Font VariantGlyphsWOFF2 SizeReduction
Full Font (All Languages)1,29453 KBBaseline
Latin Extended Subset64028 KB47% smaller
Basic Latin Subset21814 KB74% smaller
Custom Minimal (A-Z, a-z, 0-9)1289 KB83% smaller
Logo/Display (Specific Letters)30-504-6 KB88-92% smaller

Performance Impact: Real Website Example

Scenario: Blog using 4 font files (Regular, Italic, Bold, Bold Italic)

Full Fonts:

  • • Regular: 53 KB
  • • Italic: 51 KB
  • • Bold: 55 KB
  • • Bold Italic: 53 KB
  • Total: 212 KB
  • Load time (4G): ~1.4s

Latin Subset:

  • • Regular: 14 KB
  • • Italic: 13 KB
  • • Bold: 15 KB
  • • Bold Italic: 14 KB
  • Total: 56 KB
  • Load time (4G): ~0.4s

Performance Gains:

  • 156 KB saved (74% reduction)
  • 1 second faster font load on typical mobile
  • 15.6 MB saved per 100,000 visitors (bandwidth cost reduction)
  • Better Core Web Vitals: Improved LCP and FCP
  • Lower bounce rate: Faster pages keep users engaged

Network Speed Impact

Connection TypeFull (212 KB)Subset (56 KB)Time Saved
2G (250 Kbps)6.8s1.8s5.0s
3G (750 Kbps)2.3s0.6s1.7s
4G (1.5 Mbps)1.1s0.3s0.8s
4G LTE (5 Mbps)0.34s0.09s0.25s

The performance benefit is most dramatic on slower connections where many mobile users operate. Even on fast connections, the improvement is measurable and contributes to better user experience.

Subsetting Strategies

1. Language-Based Subsetting

The most common approach: include character ranges for languages your site uses.

Latin Basic (English-only sites):

Unicode Range: U+0000-00FF, U+0131, U+0152-0153

Includes: A-Z, a-z, 0-9, basic punctuation, common symbols

Best for: English-only blogs, US-focused businesses, apps with controlled content

Latin Extended (Western European):

Unicode Range: U+0000-00FF, U+0100-017F, U+0180-024F

Includes: Basic Latin + French, German, Spanish, Portuguese, Italian accents

Best for: European markets, user-generated content with Western European users

Multi-Language Subsets:

Create separate subset files for different language groups (Latin, Cyrillic, Greek) and load only what's needed

Best for: International sites serving distinct language regions

2. Content-Based Subsetting

Analyze your actual website content to include only characters you actually use.

How it Works:

  1. Scan all website content (HTML, CMS database, etc.)
  2. Extract every unique character actually used
  3. Create subset with exactly those characters
  4. Result: Minimal file size, perfect coverage

Tools for Content Analysis:

  • Glyphhanger: Scans live websites, generates optimal character lists
  • Custom scripts: Parse your CMS database or static site content
  • Manual analysis: Review content to identify needed characters

3. Use-Case-Specific Subsetting

Display/Heading Fonts:

If a font is only used for headings or logos, subset to include just those specific words. Can achieve 90%+ reduction.

Number-Only Fonts:

For pricing tables or data displays, subset to 0-9 and currency symbols only. Tiny file size.

Icon Fonts:

Include only the icons actually used on your site. Most icon fonts ship with 500+ icons; you probably use 20-30.

4. Progressive Enhancement Strategy

Load minimal subset initially, then load extended characters if needed:

/* Initial load: Basic Latin only */
@font-face {
  font-family: 'Roboto';
  src: url('/fonts/roboto-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF;
}

/* Load on-demand: Extended Latin */
@font-face {
  font-family: 'Roboto';
  src: url('/fonts/roboto-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-017F;
}

Browser only downloads extended subset if page contains those characters. Best of both worlds: small initial load, full coverage when needed.

Tradeoffs and Limitations

Limitations of Subset Fonts

1. Missing Characters Display as Boxes

If your subset doesn't include a character (e.g., café without "é"), it displays as ☐ or the fallback font renders it inconsistently.

Impact: Broken user-generated content, international names, copy-pasted text with special characters

2. Inflexibility for Dynamic Content

If content changes (new blog posts, user comments, multilingual expansion), you may need characters not in your subset.

Impact: Must regenerate and redeploy fonts, or accept missing characters

3. User-Generated Content Issues

Forums, comments, reviews—users paste content with all sorts of characters you didn't anticipate.

Impact: Emoji, special symbols, foreign characters may not display correctly

4. Maintenance Overhead

Each time you need different characters, you must regenerate subsets and update deployments.

Impact: More complex build process, testing required after changes

When Full Fonts Are Better

  • International user base: Sites serving global audiences with many languages need comprehensive character coverage
  • User-generated content platforms: Forums, social networks, review sites where users contribute diverse text
  • Content Management Systems: If content creators need flexibility to use any character, full fonts prevent issues
  • E-commerce with international products: Product names, descriptions from various countries require broad character support
  • Documentation and technical writing: Code examples, math symbols, special characters are common
  • Bandwidth is cheap: If serving primarily desktop users on fast connections, the performance gain may not justify complexity

Risk Mitigation Strategies

1. Conservative Subsetting

Include Latin Extended even if currently English-only. The extra 10-15 KB provides buffer for future international content without much performance cost.

2. Fallback Font Stack

Always specify comprehensive fallbacks: `font-family: 'YourFont', -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;` Missing characters fall back to system fonts.

3. Content Auditing

Regularly scan content for characters outside your subset. Alert editors or auto-expand subset as needed.

4. Unicode-Range Technique

Use multiple @font-face rules with unicode-range to load subsets on-demand. Browser requests only needed character ranges.

Tools and Implementation

Popular Subsetting Tools

1. Glyphhanger (Recommended)

Command-line tool that scans websites and generates optimal subsets.

# Install
npm install -g glyphhanger

# Scan website and subset font
glyphhanger https://yoursite.com --subset=font.ttf --formats=woff2

# Subset to specific characters
glyphhanger --whitelist="ABCDEFGabcdefg0123456789" --subset=font.ttf

Pros: Automated, accurate, supports multiple formats
Cons: Requires Node.js, command-line knowledge

2. pyftsubset (FontTools)

Python-based tool with extensive options and fine control.

# Install
pip install fonttools brotli

# Basic Latin subset
pyftsubset font.ttf \
  --output-file=font-subset.woff2 \
  --flavor=woff2 \
  --layout-features='*' \
  --unicodes="U+0000-00FF,U+0131,U+0152-0153"

Pros: Powerful, flexible, industry-standard
Cons: Steeper learning curve, Python required

3. Font Squirrel Webfont Generator

Online tool with GUI for subsetting, no installation needed.

URL: fontsquirrel.com/tools/webfont-generator

Pros: Easy to use, no technical skills needed
Cons: Manual process, uploads fonts to third party, limited control

4. subfont (Build Tool Plugin)

Automated subsetting integrated into build pipelines.

# Install
npm install --save-dev subfont

# Use in build
npx subfont ./dist -i

Pros: Fully automated, integrates with builds
Cons: Less control, may require configuration tweaking

Implementation Example

Complete Workflow:

  1. Analyze content: Use Glyphhanger to scan your site and identify used characters
  2. Generate subsets: Create Basic Latin, Latin Extended, and other language variants
  3. Implement unicode-range: Set up CSS with multiple @font-face declarations
  4. Test thoroughly: Check all pages for missing characters
  5. Monitor performance: Measure Core Web Vitals improvement
  6. Automate: Add subsetting to build process for future updates

When to Subset vs Use Full Fonts

Subset Fonts When:

  • ✓ Site content is controlled and predictable (corporate sites, portfolios, marketing pages)
  • ✓ Target audience uses specific language(s) you can define
  • ✓ Performance is critical (mobile-first, emerging markets, e-commerce)
  • ✓ Bandwidth costs matter (high-traffic sites, limited hosting budget)
  • ✓ You have development resources to maintain subsets
  • ✓ Content rarely changes or changes are controlled (static sites, managed CMS)
  • ✓ Loading speed directly impacts revenue (e-commerce, SaaS)

Use Full Fonts When:

  • ✓ International audience requiring many language scripts
  • ✓ User-generated content platform (forums, reviews, comments)
  • ✓ Content creators need complete flexibility
  • ✓ Technical resources for subsetting are unavailable
  • ✓ Bandwidth and performance not critical constraints
  • ✓ Need maximum compatibility and coverage
  • ✓ Development simplicity preferred over optimization

Decision Matrix

Site TypeRecommendation
Marketing landing pagesAggressive subsetting
Personal blog (English)Latin Basic subset
E-commerce siteLatin Extended subset
News/media siteConservative subset (Latin Ext)
International platformMultiple subsets or full fonts
Forum/social networkFull fonts
Documentation siteFull fonts (code, symbols)

Best Practices and Recommendations

Subsetting Best Practices

  1. Start conservative, optimize iteratively: Begin with Latin Extended, measure performance, then aggressively subset if traffic and content allow
  2. Always keep original fonts: Never subset from subsets. Keep full source fonts for regenerating subsets
  3. Use unicode-range for progressive loading: Define multiple character ranges, browser loads only what's needed
  4. Test across all content: Check every page type (blog posts, product pages, forms) for missing characters
  5. Monitor for issues: Set up alerts for missing character glyphs in production
  6. Document your subsets: Keep records of which Unicode ranges/characters are included for troubleshooting
  7. Automate the process: Integrate subsetting into build pipeline for consistency
  8. Version control font files: Track changes to subsets over time

Common Pitfalls to Avoid

❌ Over-aggressive subsetting

Removing too many characters to save 5-10 KB, then breaking user experience when encountering edge cases. Balance file size with coverage.

❌ Forgetting about user input

Subsetting for static content but forgetting form inputs, search queries, user profiles may have unpredictable characters.

❌ Not testing internationally

Works great for English speakers, but breaks for users with international names or keyboard layouts.

❌ Breaking OpenType features

Removing characters used in ligatures or contextual alternates can break advanced typography features. Use --layout-features='*' to preserve.

The Bottom Line: Subset for Performance, Full for Flexibility

Font subsetting offers dramatic performance improvements—50-90% file size reduction—making it essential for modern web performance optimization. For controlled content sites with defined language needs, aggressive subsetting delivers faster page loads, better Core Web Vitals, and reduced bandwidth costs with zero visual difference.

However, subsetting requires planning, testing, and maintenance. Sites with user-generated content, international audiences, or dynamic content requirements may benefit more from full fonts' flexibility. The optimal approach balances performance gains against coverage needs. Start with conservative subsets, measure impact, and optimize based on your specific content and audience.

Sarah Mitchell

Written & Verified by

Sarah Mitchell

Product Designer, Font Specialist

SUBSETTING vs FULL FAQs

Common questions answered about this font format comparison