Content

Currency

Money is the product. Every number that represents money in Flatpay reads the same way — same separators, same sign rule, same colour, same OpenType features.

Documentedby Derek Fidler

Principles

  • European format is the default.Period for thousands, comma for decimals — “1.234,56”. Seven of our eight markets read this convention natively. The US locale flips at render time.
  • Three families, three roles. Inter Tight with tabular figures sets currency in product UI by default. Founders Grotesk X Condensed is reserved for the hero metric — the single largest number on a page. Martian Mono is for printed surfaces only — receipts, exported reports, PDF statements.
  • Tabular numerals everywhere. Money columns must align; tabular figures + slashed zero are wired into every currency token, regardless of family. Numbers update without column shimmer.
  • Negatives are orange, not red. Outgoing money is normal product motion — payouts, fees, payments. Red is reserved for errors and destructive states. Orange reads as outgoing without sounding alarms.
  • Symbol position is contextual. Currency symbol leads on hero displays, follows in tables. Either way, always with a space.

Anatomy of a number

Every part of the formatted string is named so we can talk about it.

10.095,00

Symbol

€ — separated from the number by a regular space. Never glued to it.

Thousands

Period (.) every three digits, starting from the decimal.

Decimal

Comma (,). Always two digits, even when the value is whole.

Cents

Always shown — "10,00", never "10". Consistency over visual brevity.

Type

Three families, three jobs. The font choice does as much hierarchical work as the size — pick the family that fits the surface, then size inside it.

Default · Product UI

Inter Tight, tabular

font-sans

€ 10.095,00

The default for almost every currency in the product — list rows, table cells, summary boxes, banners, status pills, transaction descriptions, settlement totals. Always with tabular-nums and slashed-zero so columns stack and the digit shapes stay unmistakable.

Hero metric · Display

Founders Grotesk X Condensed, all caps

font-display

€ 10.095,00

Reserved for the single largest number on a page — the available balance, the end-of-day total, a payout headline. One per surface, never twice. Always set in Bold (700) and uppercase; the symbol gets the same treatment as the digits so the whole metric reads as one display block.

Printed · Receipts & reports

Martian Mono

font-mono

€ 10.095,00

For surfaces that exist as printed objects — kitchen receipts, card-terminal slips, exported PDFs, end-of-day statements customers file in a folder. The mono character gives the surface a printed voice; it isn’t a column-alignment trick (Inter Tight already aligns). Don’t reach for it just because something is tabular.

One rule, three lines

Hero metric → Founders. Everything else in the live UI → Inter Tight. Anything meant to read as a printed object → Martian Mono. If a surface doesn’t fit one of those three sentences, default to Inter Tight.

Format

  • Always two decimals.“10,00”, not “10”. Skipping the decimals on round numbers asks the reader to re-parse the line every time.
  • No abbreviation.Don't write “1,2k” or “1M” for money. The exact number — “1.245”, “1.000.000” — is the truth the user came for.
  • Use the slashed zero. The Inter Tight and Martian Mono variable fonts ship with slashed-zero available; every metric and tabular cell turns it on.
  • Right-align in tables. The decimal stacks. The eye reads the magnitude first, then the cents.

Symbol position

Two contexts, two positions. The symbol is part of the visual, not part of the number — that's why it gets its own space.

Hero metric

€ 10.095,00

Prefix on display-sized metrics — the balance, an end-of-day total, the single number a page is built around. The symbol leads because the eye lands on the symbol first.

Inline / table

1.075,25 €

Suffix in dense rows, table cells, and inline copy. The number leads because the rows are read by magnitude; the symbol identifies the currency once the eye has scanned.

Sign and color

Three states. The minus sign sits before the number; never after, never as parentheses.

Positive

€ 1.234,56

Refunds received, payouts in, credits, positive deltas. text.numeric.positive.

Negative

€ -200,00

Payments out, fees, transfers sent. Orange — not red. text.numeric.negative.

Neutral

€ 1.234,56

Totals, balances at rest, table cells with no directional meaning. text.numeric.primary.

The minus sign sits between the symbol and the number on prefixed values (“€ -200,00”), and before the number on suffixed values (“-200,00 €”). Never use parentheses. They're an accountancy convention that doesn't belong in product UI.

In the product

Four real surfaces. The first three sit in the live product (hero + inline + table — Founders, Inter Tight, Inter Tight). The fourth is a printed receipt — the one place Martian Mono carries the number.

Balance

Overview of your currently available banking balance

Available balance

€ 10.095,00

Transfers

See all

Today

  • Bank account

    Transfer sent

    € -200,00

  • Settlement account

    Transfer received

    € 200,00

  • Vendor name

    Payment sent

    € -200,00

  • Customer name

    Payment received

    € 200,00

End-of-day reports

In-product list — Inter Tight, tabular

IDEnd dateNet sales
  • 2010 Feb 2026, 18:401.114,00 €
  • 1910 Feb 2026, 14:321.075,25 €
  • 1814 Feb 2026, 14:323.000,00 €
  • 1715 Feb 2026, 14:321.050,75 €

Mela Café

Vesterbrogade 24, 1620 København

10 Feb 2026 · 13:19 · #02
Alexandra

Döner menu9,50
2× Fries5,00
Mayonnaise0,75
Beer4,75
TOTAL20,00 €
VAT 25%4,00 €

Tak — see you again

Printed · Receipts & reports

Martian Mono carries the number.

Receipts, card-terminal slips, exported PDFs, end-of-day statements. The mono is a voice choice — the surface reads as a physical document, not a screen. Everything on the slip is set in Martian Mono, including the totals; we don’t mix families inside a printed object.

The same end-of-day total reads as Inter Tight in the in-product list above and as Martian Mono here — same number, different surface, different family.

Currencies and locales

Four currencies across eight markets. The rendering layer translates between them at request time.

MarketISOSymbolInline exampleDefault position
DenmarkDKKkr1.234,56 krSuffix
FinlandEUR1.234,56 €Suffix
GermanyEUR1.234,56 €Suffix
FranceEUR1 234,56 €Suffix
ItalyEUR1.234,56 €Suffix
United KingdomGBP££1,234.56Prefix
NetherlandsEUR€ 1.234,56Prefix
United StatesUSD$$1,234.56Prefix

Three exceptions worth memorising

France uses a non-breaking space as the thousands separator (1 234,56), not a period. UK and US swap separators entirely — comma for thousands, period for decimals — and prefix the symbol with no space (£1,234.56). Denmarkuses “kr” not “DKK” in customer-facing copy.

Voided and pending

Voided

€ 200,00

Refunded, cancelled, superseded. Strikethrough plus muted color. The dimming is more important than the line — strike alone reads as decoration.

Pending

€ 200,00

In-flight, awaiting clearance. Same color as a negative — it's outgoing — paired with a status pill or eyebrow that names the state.

In code

Format through Intl.NumberFormat with an explicit locale and the currency option. Never hand-roll the separator logic.

ts

// ✓ Locale + currency, two decimals always, sign locked
const fmt = new Intl.NumberFormat("da-DK", {
  style: "currency",
  currency: "DKK",
  minimumFractionDigits: 2,
  maximumFractionDigits: 2,
  signDisplay: "auto",
});
fmt.format(1234.56);   // "1.234,56 kr"
fmt.format(-200);      // "-200,00 kr"

// ✓ For hero metrics, format with the symbol, then trust CSS for the gap
const heroFmt = new Intl.NumberFormat("nl-NL", {
  style: "currency",
  currency: "EUR",
  currencyDisplay: "narrowSymbol",
});
heroFmt.format(10095);  // "€ 10.095,00"

// ✗ Don't hand-roll
return `€ ${value.toFixed(2).replace(".", ",")}`;

Page history

2 revisions
  1. Documented
    Derek Fidler@derekfidler

    Locked the three-family rule: Inter Tight tabular as the default, Founders Grotesk reserved for the hero metric, Martian Mono for printed receipts and reports. Added a Type section, a printed-receipt specimen, and fixed the Currencies table example which was set in mono.

  2. Documented
    Derek Fidler@derekfidler

    First documented version. Anatomy specimen, prefix/suffix rules, color tokens for sign, multi-currency table, and the Intl recipe.