
How to Choose Fonts for an E-commerce Website?
- Sajjad
- Typography
- 01 Oct, 2026
A fashion store relaunches with a beautiful thin serif across the whole site. The homepage looks like a magazine cover. Then the support tickets start: shoppers can't tell whether a price says £18 or £16 on their phones, product titles in the category grid blur together at 14px, and the checkout form, also in the thin serif, looks so delicate that some customers say it "doesn't feel secure." Conversion on mobile drops. The font wasn't bad. It was chosen for the homepage hero and then applied to every job an online store has, most of which it was never designed to do.
This article walks through how to choose fonts for an e-commerce website by role: brand and campaign headlines, product titles, prices, navigation and filters, product descriptions, reviews, and checkout. You'll learn which font features matter for selling (especially numerals and currency symbols), how to keep fonts from slowing down product pages, and how to meet accessibility requirements without losing the brand.
Why E-commerce Typography Is Different
A content site mostly asks readers to read. A store asks them to scan, compare, decide, and type, often quickly and on a phone. Typography has to support all of that:
| Task | Typography requirement |
|---|---|
| Scanning a category grid | Compact, legible product titles at small sizes |
| Comparing products | Clear, aligned numbers and consistent price formatting |
| Understanding offers | Unambiguous sale prices, discounts, and badges |
| Reading details | Comfortable body text for descriptions, sizing, and policies |
| Trusting the store | Professional, stable, consistent type throughout checkout |
| Completing checkout | Readable form labels, inputs, errors, and order summaries |
That's why the general approach in choosing a font for your brand is only half the job here. The brand font sets the tone, but the commercial parts of the store need a font chosen for function.
Step 1: Separate Brand Type from Shopping Type
Most successful stores use a two-role system:
- Brand or display font: campaign banners, homepage hero headlines, collection titles, editorial content. This is where personality lives.
- Interface or text font: product titles, prices, navigation, filters, descriptions, buttons, forms, and checkout. This font is chosen for legibility and clear numbers.
Sometimes one family can do both, especially a versatile sans with a wide weight range. But if your brand font is a delicate serif, a script, or a condensed caps face, keep it out of the shopping flow.
A simple role map for a typical store:
| Element | Font role | Typical size (mobile) |
|---|---|---|
| Hero and campaign headlines | Brand | 32–48px |
| Collection and page titles | Brand | 24–32px |
| Product titles in grids | Interface | 14–16px |
| Product page title | Interface or brand | 22–28px |
| Prices | Interface | 16–20px |
| Navigation and filters | Interface | 14–16px |
| Descriptions and reviews | Interface | 16–18px |
| Buttons and badges | Interface | 14–16px |
| Checkout forms | Interface | 16px minimum |
Step 2: Pick an Interface Font with Excellent Numbers
Numbers are the most important characters in a store. Prices, sizes, quantities, ratings, delivery dates, order numbers, and discount codes all depend on them. When evaluating an interface font, check:
- Distinct digits. 1 and 7, 3 and 8, 5 and 6, and 0 and O must be easy to tell apart at small sizes. Fonts with open 3s, 6s, and 9s are clearer than tightly closed ones.
- Tabular figures. The font should support the
tnumfeature, so digits have equal widths. That keeps prices aligned in carts and order summaries and stops numbers from shifting when they change, such as in a quantity stepper or countdown. - Lining figures. Old-style figures, which rise and fall like lowercase letters, look elegant in text but make prices look uneven. Use lining figures for commerce.
- Slashed or dotted zero (optional). Helpful for order numbers and discount codes where 0 and O can be confused.
- Currency symbols. Confirm the font has every currency you sell in: $, £, €, ¥, ₹, ₺, ₩, ₽, and so on. If a symbol is missing, the browser falls back to a different font for that one character, and the price looks broken.
.price,
.cart-summary,
.order-table {
font-variant-numeric: lining-nums tabular-nums;
}
.order-number,
.discount-code {
font-variant-numeric: lining-nums tabular-nums slashed-zero;
}
Detailed numeral techniques are in tabular figures for numbers and tables.
Good interface candidates with strong figures include Inter, IBM Plex Sans, Source Sans 3, Public Sans, and DM Sans, all on Google Fonts. Commercial options like Söhne, Graphik, and GT America are popular with premium brands.
Step 3: Format and Style Prices Properly
Typography and data formatting go together. Use Intl.NumberFormat so prices follow the shopper's locale, including symbol position, separators, and spacing:
export function formatPrice(
amount: number,
currency: string,
locale: string = "en-GB",
): string {
return new Intl.NumberFormat(locale, {
style: "currency",
currency,
}).format(amount);
}
formatPrice(1299.5, "GBP"); // "£1,299.50"
formatPrice(1299.5, "EUR", "de-DE"); // "1.299,50 €"
formatPrice(1299.5, "INR", "en-IN"); // "₹1,299.50"
For sale prices, make the visual difference clear and the meaning accessible. Strikethrough alone isn't announced by most screen readers, so add hidden text:
<p class="price">
<del>
<span class="visually-hidden">Original price:</span>
£48.00
</del>
<ins>
<span class="visually-hidden">Sale price:</span>
£32.00
</ins>
</p>
.price {
display: flex;
gap: 0.5rem;
align-items: baseline;
font-variant-numeric: lining-nums tabular-nums;
}
.price del {
color: var(--color-text-muted);
font-size: 0.875em;
}
.price ins {
text-decoration: none;
font-weight: 700;
color: var(--color-sale);
}
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
}
Make sure both the muted original price and the sale color still meet WCAG 1.4.3: 4.5:1 for normal text and 3:1 for large text (24px, or about 18.66px bold). Muted grey prices often fail.
Step 4: Make Product Titles Scannable
In category grids, product titles are short, small, and dense. Choose a font that:
- Has a generous x-height, so 14–16px titles stay readable.
- Is slightly condensed or normal width, so longer titles don't wrap to four lines.
- Has a clear Medium or Semi Bold weight, so titles stand out from the brand name and price without looking heavy.
Use line clamping to keep grid cards even, but always expose the full title on the product page and in the link's accessible name:
.product-card__title {
font-size: 0.9375rem;
font-weight: 500;
line-height: 1.35;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
overflow: hidden;
}
Step 5: Keep Checkout Calm and Familiar
Checkout is where typography affects revenue most directly. Shoppers need to read labels, type accurately, spot errors, and trust what they see. Here, plain is good:
- Use the interface font or a system font stack. Familiar type feels stable. Many large retailers switch to a system font stack in checkout for speed and familiarity.
- Set inputs to at least 16px. iOS Safari zooms into any focused input with a smaller font size, which disorients shoppers.
- Make labels visible and legible. Don't rely on placeholder text, and don't use light weights for labels.
- Make errors readable. Error text needs the same contrast requirements as any other text, plus an icon or wording so meaning doesn't depend on color alone.
- Align the order summary with tabular figures so totals line up.
.checkout {
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue",
Arial, sans-serif;
}
.checkout input,
.checkout select,
.checkout textarea {
font: inherit;
font-size: max(1rem, 16px);
}
.checkout label {
font-weight: 500;
}
.checkout .error {
color: var(--color-error);
font-size: 0.875rem;
font-weight: 500;
}
font: inherit matters because form controls don't inherit font settings by default, and many sites accidentally ship checkout inputs in the browser's default font.
Step 6: Protect Page Speed
Product listing and product detail pages are where speed matters most for conversion, and fonts are a common hidden cost. Each extra family, weight, and style adds requests and bytes, and a late font swap can shift prices and buttons, damaging Core Web Vitals. The specific effects on LCP and CLS are explained in how web fonts affect Core Web Vitals.
Practical limits for a store:
- Two families at most: brand and interface. Use a system stack for checkout if possible.
- Three to five styles in total. For example, brand display Bold, interface Regular, Medium, and Bold.
- Variable fonts when you need three or more weights of one family.
- Subset to the languages and currencies you actually use, and serve WOFF2.
- Self-host rather than loading from third-party CDNs.
- Use
font-display: swapwith a metric-matched fallback, so prices and buttons render immediately and don't jump.
In Next.js, next/font handles self-hosting, preloading, and fallback metrics:
// app/fonts.ts
import { DM_Serif_Display, Inter } from "next/font/google";
export const brand = DM_Serif_Display({
subsets: ["latin"],
weight: "400",
display: "swap",
variable: "--font-dm-serif",
});
export const ui = Inter({
subsets: ["latin"],
display: "swap",
variable: "--font-ui",
});
With Tailwind CSS v4, expose both as theme tokens so components use the right role. Give the next/font variables different names from the theme tokens, otherwise a token like --font-brand: var(--font-brand) refers to itself and resolves to nothing:
@import "tailwindcss";
@theme inline {
--font-brand: var(--font-dm-serif), Georgia, serif;
--font-sans: var(--font-ui), system-ui, sans-serif;
}
Now font-brand is available for campaign headlines and font-sans, the default, covers the shopping interface.
Step 7: Plan for Multiple Markets
Stores often expand internationally faster than content sites. Before you commit to a font, check:
- Language coverage. Latin Extended for Central European and Vietnamese, plus Cyrillic, Greek, Arabic, or CJK if needed.
- Currency coverage. Every currency you might sell in, including ₹, ₺, ₦, and ₱.
- Text expansion. German and Finnish product titles can be 30 percent longer than English. Test grids with long titles.
- Right-to-left layouts. Arabic and Hebrew stores need fonts and layouts designed for RTL.
Choose a family with broad coverage, such as Noto Sans or IBM Plex with its companion families, or plan a per-locale font strategy with unicode-range so shoppers only download what their language needs.
Step 8: Test with Real Store Content
Before finalizing, build test pages with your real data:
- A category grid with your longest and shortest product titles.
- A product page with variants, sizes, a sale price, reviews, and a delivery estimate.
- A cart with five items and a discount.
- A checkout with validation errors shown.
- All of the above on a mid-range Android phone and a Windows laptop.
Then check the numbers: compare Lighthouse scores and real-user Core Web Vitals before and after the font change, and if you can, run an A/B test on conversion. The broader effects of type on behavior are covered in how typography affects UX and conversions.
E-commerce Fonts FAQ
There is no single best font, but stores do best with a clear, legible interface font with strong numbers, such as Inter, IBM Plex Sans, or Source Sans 3, paired with a brand font for headlines. The interface font should handle prices, titles, and forms.
Usually not a separate font, but they should use the right features. Set prices with lining and tabular figures so digits are even and align in columns, and make sure the font includes every currency symbol you display.
Use it for headlines, campaigns, and editorial sections, but not for product titles, prices, buttons, or checkout. Delicate or decorative fonts reduce legibility at small sizes and can make the buying process feel less trustworthy.
They can. Slow-loading fonts hurt page speed, layout shifts from font swaps move buttons and prices, and hard-to-read prices or forms create friction. Fast, legible, consistent typography removes those obstacles, which supports conversion.
iOS Safari zooms into focused form fields when their font size is below 16 pixels. Set inputs, selects, and textareas to at least 16 pixels and make sure they inherit your font so the form stays readable without unexpected zooming.
Two families is the practical limit: one for brand headlines and one for the shopping interface. Keep the total number of styles to around three to five, and consider a system font stack for checkout to maximize speed and familiarity.
Many modern themes offer good font pickers, but they often load several weights you never use. Check the network panel, limit weights in the theme settings, and prefer self-hosted or platform-hosted fonts over additional third-party font services.
Conclusion
Choosing fonts for an e-commerce website means designing for selling tasks, not just for looks. Separate the brand font, which gives campaigns and headlines their personality, from the interface font, which handles product titles, prices, navigation, and checkout. Choose the interface font for distinct digits, tabular and lining figures, complete currency coverage, and a useful range of weights.
Then protect the parts of the store that drive revenue: format prices with Intl.NumberFormat and accessible sale markup, keep checkout calm with familiar type and 16px inputs, limit families and styles so product pages stay fast, and plan for new markets before you need them. Test it all with real product data on real devices, and measure the results.
Here are some useful references for going deeper on e-commerce typography:
- MDN Web Docs: font-variant-numeric — tabular, lining, and slashed-zero figures.
- MDN Web Docs: Intl.NumberFormat — locale-aware price and currency formatting.
- web.dev: Best practices for fonts — loading fonts without hurting Core Web Vitals.
- W3C: Understanding WCAG 2.2 Success Criterion 1.4.3: Contrast (Minimum) — contrast requirements for prices, labels, and errors.
- Next.js Docs: Font Optimization — self-hosting and preloading fonts with
next/font.


