Three brands sharing a design system, three different voices. Voice is the consistent character of each brand — it doesn't change. Tone is how voice adapts to the user's situation: a celebration sounds different from a margin-call warning. This page documents both, with a microcopy library you can copy verbatim.
| Slot | Perpetuals | Barriers | UpsideOnly |
|---|---|---|---|
| auth.signin.title | Welcome back | Sign in | Welcome back |
| auth.signin.cta | Sign in | Sign in | Sign in |
| auth.signup.title | Create your account | Open an account | Join UpsideOnly |
| auth.signup.cta | Create account | Create account | Get started |
| auth.forgot.cta | Send reset link | Send reset link | Send me a link |
| auth.2fa.subtitle | We sent a 6-digit code to ····7421 | Enter your authenticator code | We texted a 6-digit code to (***) ***-7421 |
| order.submit.cta | Place order | Place order | Place trade |
| order.cancel.title | Cancel limit order? | Cancel limit order? | Cancel limit order? |
| order.cancel.body | Your pending order will be cancelled. You can place a new order at any time. | Pending order will be cancelled. Reserved margin returned. | Reserved margin returns to your virtual balance immediately. |
| order.cancel.cta | Cancel order | Cancel order | Cancel order |
| position.close.title | Close position? | Close position? | Close position? |
| position.close.cta | Close at market | Close at market | Close at market |
| deposit.success.title | Payment complete | Deposit confirmed | Payment complete |
| deposit.success.body | $250.00 has been added to your account. | $250.00 deposit · ID: DEP-2026-… | $250 added — that's $25,000 of virtual balance to play with. |
| withdrawal.success.title | Withdrawal submitted | Withdrawal queued | Withdrawal submitted |
| withdrawal.success.body | $5,000.00 should arrive in your Chase account in 3–5 business days. | $5,000.00 · ETA 3–5 business days · Bank ····4821 | $5,000 on the way — should land in your Chase account in 3–5 business days. |
| error.500.title | Something went wrong on our end | Service error | Something went wrong on our end |
| error.500.body | We're already looking into it. Try again in a moment. | Reference: ERR-… · Status: status.barriers.com | We're already on it. Try again in a moment. |
| error.404.title | We can't find that page | Page not found | We can't find that page |
| error.network.title | Connection problem | Network unreachable | You're offline |
| error.network.cta | Retry | Retry | Retry |
| empty.positions.title | No open positions | No open positions | No open positions yet |
| empty.positions.cta | Place a trade | New trade | Place your first trade |
| empty.notifications.title | No new notifications | Inbox empty | You're all caught up |
| session.timeout.title | Your session is about to expire | Session timeout | Still there? |
| session.timeout.cta | Stay signed in | Extend session | Stay signed in |
| celebration.streak.title | 5-trade streak | Streak: 5 winning trades | 5-trade streak! |
| celebration.tier.title | You've moved up to Gold | Tier promoted: Gold (2.4×) | Welcome to Gold |
| kyc.required.title | Verify your identity | Identity verification required | Quick verification — 90 seconds |
| kyc.success.title | Identity verified | Verification complete | You're verified |
| kyc.review.title | Your verification is under review | Manual review pending | We need a little more time |
| Type | Format | Example | Notes |
|---|---|---|---|
| USD | $X,XXX.XX |
$67,240.00 | Always show 2 decimals, even for round amounts. Comma thousands separator. |
| BTC / ETH | X.XXXXXXXX BTC |
0.50000000 BTC | Up to 8 decimals. Trim trailing zeros only when display is tight (mobile). |
| Big numbers | Compact | $48k · $1.2M · $84B | Use compact form when >$10k. Lower-case k, capital M/B. |
| PnL / change | Signed + colored | +$37.28 · −$17.84 | Always signed (+/−). Always color-coded. Use minus glyph (−), not hyphen (-). |
| Percentage | Signed | +5.62% | Two decimals. No space before %. |
| Date | Mon dd, yyyy · h:mm AM/PM ET | Apr 23, 4:02 PM ET | Drop year if same as current year. Always include timezone for trade timestamps. |
| Relative time | Plain English | Just now · 2 minutes ago · Yesterday at 3:14 PM · Apr 12 | Use relative under 24 hours, calendar after. |
| Duration | Compact | 2.3 hrs · 42 min · 14h 22m | Round to 1 decimal for hrs, integer for min. |
| Account masking | 4-dot prefix | Chase ····4821 · ···· ··· 7421 | Use middle dot (·), not asterisk (*). 4 dots, then last 4 digits. |
| Reference codes | PREFIX-YYYY-MM-DD-XXXX |
WD-2026-04-24-8X9K | Always uppercase. Mono font in UI. |
Buttons commit users to action. Use the verb that matches the action. "Place trade", not "Trade". "Send reset link", not "Reset".
"Cancel limit order?", not "Are you sure?". The user already knows we're asking — say what we're asking about.
Buttons, headings, labels — all sentence case. Title Case is reserved for proper nouns (UpsideOnly, BTC/USD). The only exception is the type system's small-caps section labels (FOUNDATIONS, COMPONENTS) which are explicitly stylized.
Default: no exclamation marks. They feel insincere or marketing-y in a trading app. One exception: UpsideOnly celebration moments — "10-trade streak!" — where the exclamation is the point. Cap at one per message.
Emojis are inconsistent across platforms, undermine trust in financial software, and break for screen readers. Use icons (see Iconography) for visual signaling. Exception: marketing copy, social posts, internal Slack — fine.
"That email format isn't right" beats "You entered an invalid email." Even when it IS the user's input, frame it as a system observation, not a user mistake.
If the UI shows $67,240.00, the underlying number must be precise to the cent. If the actual number is fuzzy (estimates, projections), use ranges or qualifiers ("about $67k", "estimated $67,240"). Don't fake precision.
"Confirming with your bank — usually 3–5 seconds", not "Loading...". Tell users what's actually being done and roughly how long.
Show Ref: ERR-2026-… at the bottom of error states for users who need to contact support. Never lead with the code.
Don't concatenate strings. Use full sentences as i18n keys. Don't assume word order. Don't put HTML inside translatable strings (use placeholders). All copy here uses key-based identifiers (order.cancel.title) so translations stay clean.