# Form Labels and Helper Text > Form labels and helper text — label clarity, placeholder anti-patterns, required-field indication, and writing forms that users complete without confusion ## When to Use - Writing form field labels and their associated descriptions - Adding helper text, hints, or format examples below input fields - Deciding what to put in placeholder text versus labels versus helper text - Indicating required versus optional fields across a form - Writing fieldset legends and form section headers - Designing multi-step form field disclosure sequences - NOT for: form validation error messages (see ux-error-messages) - NOT for: form layout, field ordering, and visual design decisions (see design-form-ux) - NOT for: form CTA buttons and submit labels (see ux-button-cta-copy) ## Instructions 1. **Labels must be visible at all times — never rely on placeholder text as the only label.** Placeholders disappear on focus, leaving users without context about what a field requires — especially during editing or review. This is both a UX failure and an accessibility failure. Screen readers may not reliably read placeholder text as field labels. WCAG 1.3.1 requires that label information be programmatically determinable, which placeholder-as-label violates. Stripe, GitHub, and Shopify all use visible above-field labels alongside placeholder text. When a user is copying a 16-digit card number from their wallet and needs to glance away from the screen, the label must still be visible when they return. 2. **Use the shortest unambiguous label.** "Email" not "Email address" if context is clear. "Full name" not "Please enter your first and last name in this field." "Company" not "Company or organization name." The label is a scannable identifier, not an explanation. Stripe's payment form: "Card number" — two words. Every additional word is a tax on the user's attention. If the short form is ambiguous (would "Name" mean first name or full name?), use the minimum additional words needed to disambiguate ("Full name," not "Please enter your complete legal name as it appears on your ID"). Ambiguity is resolved by adding the one word that clarifies — not by adding an explanation. 3. **Place helper text below the field, not above.** Helper text above competes visually with the label and disrupts the reading flow from label to input. Below the field, helper text acts as post-input support — visible when the user is filling in the field, out of the way during scanning. GitHub places "This will be the name of your repository" directly below the repository name input. Stripe places card format hints below the card number input. The exception: pre-conditions that prevent even attempting to fill a field ("You can only do this once a month") should appear above or as a warning before the field, because the user should know before they attempt to type. 4. **Use placeholders only for format examples, never for instructions.** The correct use of placeholder text is demonstrating the expected format. Good placeholders: "jane@example.com" (email format), "MM / YY" (card expiry format), "+1 (555) 123-4567" (phone format), "ACME-2024" (reference format). Bad placeholders: "Enter your email address" (instruction that disappears), "Your company website" (label restatement), "e.g., Marketing Manager" (example that belongs in helper text). The placeholder should show the user what their actual data should look like — not tell them what to do. If removing the placeholder would confuse the user, the label is doing insufficient work. 5. **Mark the minority, not the majority.** If most fields in a form are required, mark only the optional ones with "(optional)" in the label. If most fields are optional, mark only the required ones with an asterisk (_) and explain the convention once ("_ Required"). Never mark both required and optional — pick the convention that produces fewer marks. Marking everything creates noise; marking only exceptions creates signal. Stripe's payment form marks nothing — all fields are required and self-evidently so. GitHub's profile form marks optional fields only, since most fields are optional. The rule: the mark should appear on the minority of fields, whichever type that is. 6. **Group related fields with clear section headers.** A form with more than 6-8 fields should be organized into named sections. "Billing information," "Shipping address," "Payment method" are sections in a checkout form — not a flat list of 15 fields. Section headers function as fieldset legends: they provide context for the group of fields that follows. Shopify's checkout separates contact, shipping, and payment into clearly headed sections, each with its own visual container. Section headers also enable the user to jump to a specific section without reading every field, which is especially important on mobile where scrolling is required. 7. **Show constraints before the user encounters them.** Helper text that reveals constraints after an error is too late. "Must be at least 8 characters, include one number and one uppercase letter" should appear below the password field before the user has typed anything. This preemptive disclosure prevents errors before they happen — the most efficient form of error prevention. Stripe shows card number format hints before the user enters any digits. GitHub shows username constraints (alphanumeric, hyphens allowed, 1-39 characters) in helper text before submission. The only exception: constraints that depend on the user's input value itself (e.g., "That username is taken") cannot be preemptively shown. 8. **Adapt labels to locale and context when the field meaning changes.** Shopify dynamically changes "ZIP code" to "Postcode" for UK addresses and "Postal code" for Canadian addresses — because the underlying concept and format differ by country. When the same field collects different information depending on context (country, plan type, user role), the label must reflect the specific variant. Generic labels like "Postal identifier" that try to cover all cases end up serving none of them well. Context-adaptive labels are a form of microcopy precision: the label is correct for the specific user filling it out, not correct in the abstract. ## Details ### Label vs Placeholder vs Helper Text Three distinct text elements serve three distinct purposes in forms. Each must add distinct value — if two elements say the same thing, one of them should be removed or rewritten. | Element | Purpose | Persistent? | Example | | ----------- | ------------------------------- | ----------- | -------------------------------------------- | | Label | Names the field | Always | "Email address" | | Placeholder | Shows expected format | Until typed | "jane@example.com" | | Helper text | Adds context, constraints, tips | Always | "Use the email associated with your account" | A common mistake is using all three to say the same thing: - Label: "Name" - Placeholder: "Enter your name" - Helper text: "Type your name here" Each should add distinct value: - Label: "Full name" (disambiguates — full, not first) - Placeholder: "Jane Smith" (shows the expected format) - Helper text: "As it appears on your government ID" (adds context not available from the label) ### Required and Optional Field Indication Patterns **When most fields are required:** Mark only optional fields with "(optional)" in the label, immediately following the label text. "Middle name (optional)." Do not use asterisks for required fields when only 1-2 fields are optional — the mark on the exception is clearer than marks on the rule. **When most fields are optional:** Mark only required fields with an asterisk (_) and include a legend once at the top of the form: "_ Required." Do not mark optional fields at all — their unmarked state is the convention. **Mixed forms with no clear majority:** Use "(optional)" on optional fields and asterisks on required fields with a legend. This is the most explicit approach and works when the balance is roughly 50/50. **Never:** Use both asterisks and "(optional)" in the same form — users must infer the convention from the pattern, and using both creates ambiguity about which convention takes precedence. ### Accessibility Requirements for Form Labels Labels must be programmatically associated with their inputs or they are invisible to assistive technologies: - Use `