Let contractors customize the language used throughout their experience. Inspired by Salesforce custom labels, HubSpot property customization, Monday.com column naming, and ServiceTitan custom fields. Adapts platform vocabulary to match each contractor's internal language.
TerminologyOverview screen. Categories with customization count badges. Terracotta-filled IconCircle (style B) for categories with custom labels.
useQuery(api.terminology.getCategories)
CategoryDetail component. Shows default vs custom labels with inline previews. Style B for customized, style D for default labels.
useQuery(api.terminology.getLabelsByCategory)
EditLabel modal/screen. Character limit, auto-plural, and 3 live context previews showing how the label appears in cards, nav, and buttons.
useMutation(api.terminology.updateLabel)
PreviewMode component. Split before/after comparison with toggle to switch views. Shows impact summary of all changes.
useQuery(api.terminology.getPreview) | useMutation(api.terminology.applyAll)
CategoryDetail for financial terms. Same component, different category data. Info card explains where labels appear externally.
useQuery(api.terminology.getLabelsByCategory, { category: "financial" })
BulkImport screen. CSV upload with drag-and-drop, mapping table preview, validation warnings for short labels or conflicts.
useMutation(api.terminology.bulkImport) | parseCSV utility
TeamTerminology screen. Role tabs for per-role overrides with comparison table showing what each role sees for each label.
useQuery(api.terminology.getByRole) | useMutation(api.terminology.updateRoleLabel)
TerminologyAnalytics screen. Tracks label usage, confusion signals from support tickets, and AI-powered recommendations to standardize.
useQuery(api.terminology.getAnalytics) | useQuery(api.support.getLabelTickets)
api.terminology.getCategories — All label categories with customization countsapi.terminology.getLabelsByCategory — Labels for a specific category with default/custom pairsapi.terminology.getPreview — Before/after preview data for all custom labelsapi.terminology.getByRole — Per-role label overrides for team terminologyapi.terminology.getAnalytics — Usage metrics, change frequency, confusion signalsapi.terminology.updateLabel — Set custom label for a default term (singular + plural)api.terminology.resetLabel — Revert single label to defaultapi.terminology.resetCategory — Revert all labels in a categoryapi.terminology.resetAll — Revert all custom labels company-wideapi.terminology.bulkImport — Apply CSV-parsed label mappings in bulkapi.terminology.updateRoleLabel — Set role-specific label overrideapi.terminology.applyAll — Apply all staged preview changescontractorId — v.id("contractorUsers")category — v.string() (jobs_bids, team_roles, customers, financial, scheduling)defaultLabel — v.string() (platform default: "Job", "Bid", etc.)customLabel — v.optional(v.string()) (null = use default)pluralLabel — v.optional(v.string()) (auto-generated if omitted)roleOverrides — v.optional(v.object(...)) (per-role label map)changeCount — v.number() (analytics: how many times changed)lastChangedAt — v.number() (timestamp)TerminologyCategory — { id, name, icon, labelCount, customizedCount }LabelMapping — { defaultLabel, customLabel, pluralLabel, category }RoleOverride — { role, labels: Record<string, string> }BulkImportRow — { defaultLabel, customLabel, status: valid | warning | error }LabelAnalytics — { label, changeCount, confusionTickets, lastChanged }TerminologyOverview — Category list with customization counts and searchCategoryDetail — Label mapping list with inline previews per categoryEditLabel — Modal/screen with input, char limit, live context previewsPreviewMode — Split before/after comparison with toggle and impact summaryBulkImport — CSV upload, mapping table, validation, apply allTeamTerminology — Role tabs with per-role overrides and comparison tableTerminologyAnalytics — Metrics, bar charts, confusion signals, recommendationsIconCircle — Styles B (filled), D (outline), F (white+terracotta), G (dark bg)Card — All label mapping rows and metric tilesSearchBar — Label search on overview screenButton — variant="secondary" for all CTAsInput — Custom label entry with character limitScreenLayout — Terracotta header with back buttonEmptyState — When no custom labels configured yetuseTerminology() hook — Global label resolver consumed by all screenst("Job") — Inline label function returns custom or default labelt.plural("Job") — Returns "Work Orders" or "Jobs" based on configpapaparse or built-in parserapi.support.getLabelTickets for confusion metrics