Practice
The Design System Audit Checklist for Enterprise SaaS

A practical method for finding drift across tokens, components, accessibility, and handoff.
Most design system problems do not begin inside the design system itself. They emerge gradually as products evolve and teams make small decisions to solve immediate needs. A new feature ships with a slightly different button style, a developer creates a local component variation to meet a deadline, or a designer introduces spacing values that fall outside the approved token system. Individually, these decisions seem harmless. Over time, however, they create inconsistencies that spread across design files, codebases, documentation, and production experiences.
As products grow, these inconsistencies become increasingly difficult to manage. Teams begin solving the same problems multiple times, accessibility standards become uneven, reviews take longer, and shipping new features requires more effort and coordination. Eventually, the design system documented by the organization no longer reflects the one being used in practice. This disconnect, often referred to as design drift, creates operational friction that slows teams down and reduces confidence in the system itself.
A design system audit helps organizations identify and address this drift before it becomes a larger problem. It provides a structured evaluation of whether the design system is still functioning as the source of truth across design, engineering, product, and accessibility teams. For enterprise SaaS products, where complex workflows, multiple user roles, integrations, and AI-powered experiences are common, maintaining consistency becomes significantly more challenging. The goal of an audit is not perfection. It is confidence: confidence that teams are building from shared foundations, that accessibility standards are being maintained, and that the system can continue supporting product growth without creating unnecessary friction.
Before evaluating tokens, components, accessibility, or governance, it is useful to understand how design drift appears in practice and why it becomes difficult to detect as products scale.
What design drift means
Design drift is any divergence between the approved design system and the product experience teams actually produce. That divergence can happen in Figma, code, documentation, Storybook, or the shipped interface. It may appear as raw values replacing design tokens, duplicated components, missing states, stale documentation, inaccessible semantics, or handoff links that no longer point to the right implementation.
In enterprise SaaS, drift often becomes visible through workflow friction. Designers spend more time looking for the correct pattern. Engineers modify components locally to meet delivery pressure. Product teams approve exceptions that remain undocumented. Accessibility fixes are applied inconsistently across similar experiences.
Over time, these gaps create more than visual inconsistency. They increase maintenance effort, slow delivery, weaken accessibility, and make product reviews harder than they need to be. A useful design system audit looks at the full chain between system decisions and shipped software.
What a design system audit should measure
A strong audit is broader than a component library review. The most useful audit scope covers five areas: token integrity, component integrity, state and variant parity, accessibility and semantics, and governance plus handoff. If one of these layers is weak, UI consistency usually degrades somewhere else. The goal is to understand whether the system still works as infrastructure for product teams, not whether the library looks organized from the outside.
Tokens
Tokens are often the first place where design drift becomes visible. As products evolve, teams sometimes introduce local spacing values, custom colors, or typography variations to solve immediate problems. Individually, these decisions may seem harmless. Over time, they create inconsistencies that spread throughout the component library and eventually into production.
A token audit should focus on whether teams are still using shared design decisions or creating new ones outside the system. Design tokens are meant to express reusable decisions across tools and technologies. In Figma, variables and modes provide the practical mechanism for implementing those decisions across themes, brands, density modes, and responsive contexts.
A token audit should review whether color, typography, spacing, radius, elevation, motion, and layout values are represented as reusable variables or exported tokens rather than raw values. It should also check whether naming patterns are consistent, aliases are clear, variable collections are scoped properly, and published libraries are current. If a system supports multiple themes, brands, or product densities, token drift is usually where inconsistencies begin.
Components
Components are where teams usually feel the cost of drift. A button that exists in several slightly different forms, a table component with inconsistent sorting behavior, or a locally modified version of a shared pattern can all create friction during design, development, and review.
The objective of a component audit is not only to confirm that components exist. It is to understand whether teams are still using the system as their primary source of reusable patterns. A proper component audit should verify whether each reusable UI pattern comes from the canonical library, whether duplicate components or local forks exist, whether descriptions and naming are clear, whether ownership is obvious, and whether teams are updating to current versions.
Usage data is especially helpful here. A low-quality component used across hundreds of screens deserves more attention than a visually imperfect pattern on a rarely used admin page. Adoption and blast radius should influence priority.
States and variants
Enterprise users rarely experience a component in its clean default state. They interact with loading states, empty states, error states, disabled states, selected states, permission-driven states, warning states, focus states, and success states. Those states are often where a system looks consistent on paper but breaks in actual use.
A state and variant audit should compare what exists in design, what exists in Storybook, and what appears in production. For every business-critical component, the audit should confirm that the state matrix exists in Figma, that matching stories exist in Storybook, and that key state transitions are tested or reviewed in the browser. If the design includes an error state that code does not support, drift exists. If Storybook includes behavior that design never documented, drift still exists. If production behaves differently from both, the audit should treat that as an implementation gap rather than a design preference.
Accessibility and semantics
Accessibility inside a design system audit should not stop at contrast. A component can look correct while failing keyboard navigation, focus order, semantic structure, accessible naming, or screen-reader expectations. In a shared component library, that risk compounds quickly because one weak pattern can appear across hundreds of screens.
An accessibility audit should review WCAG alignment, keyboard behavior, focus visibility, accessible names and descriptions, semantic roles, form labels, error messaging, status updates, and reading order. Automated checks are useful, especially in Storybook and CI workflows. They help catch common violations early. Manual review is still required for semantics, ARIA behavior, keyboard interaction, and whether the component actually supports the intended workflow. Accessibility should be treated as part of system quality, not a separate cleanup phase.
Documentation, handoff, and governance
Documentation drift is often the reason teams stop trusting a design system. A component may exist in the library, but the documentation is stale. A Storybook story may reflect the latest implementation, but the Figma frame still shows an older pattern. A component may be deprecated, but teams do not know what to use instead.
Governance gives the system a way to stay useful as it changes. A good audit should check whether each high-impact component has an owner, a release phase, a deprecation path, a migration note, and change notes that teams can act on. It should also check whether Figma and Storybook are linked clearly enough for designers and engineers to review the same source of truth.
If your internal system is called Tenet, this is where the rule should be explicit: Tenet should define what is approved, what is experimental, what is deprecated, and what teams should use next. Without clear ownership and release discipline, teams eventually create their own truth.
Design system audit scorecard
Use this scorecard to summarize the audit before moving into detailed findings.
| Area | What to measure | Common drift signal |
|---|---|---|
| Tokens | Reusable token coverage, naming, aliases, modes, code sync | Raw values, duplicate tokens, unpublished changes |
| Components | Canonical library usage, duplicates, descriptions, ownership | Local forks, similar components with different names |
| States and variants | Documented states in Figma and matching states in Storybook or code | Missing loading, focus, error, or theme states |
| Accessibility and semantics | WCAG, keyboard behavior, ARIA patterns, contrast, naming | Visually accurate but inaccessible components |
| Handoff and docs | Figma-to-Storybook links, publish notes, current documentation | Stale design links, outdated stories, confusing specs |
| Governance | Release phase, deprecation status, adoption data, owners | No clear owner, no migration path, unknown usage |
This scorecard gives product, design, and engineering leaders a shared view of system health before teams begin debating individual issues.
A step-by-step design system audit checklist
Use the worksheet below as the structure for a practical design system audit. It is designed for enterprise SaaS teams using Figma design systems, Storybook-backed front ends, and shared component libraries.
| Audit area | Audit question | Evidence to check | Pass condition |
|---|---|---|---|
| Tokens | Are core decisions stored as tokens or variables instead of raw values? | Figma variables, exported token files, code tokens | No raw values for core foundations |
| Tokens | Do required modes exist for theme, brand, or density contexts? | Variable collections and modes | All supported contexts represented |
| Tokens | Are token names, aliases, and descriptions consistent? | Variable naming, token docs, code exports | Shared naming pattern and no ambiguous duplicates |
| Tokens | Are token changes published and synced to code? | Figma publish history, CI sync, token repository | Latest approved values are live in design and code |
| Components | Is every reusable UI pattern coming from the canonical library? | Figma library usage, local files | No local fork unless intentionally exempted |
| Components | Are duplicate components or near-duplicates consolidated? | Library inventory, thumbnail review, usage analytics | One approved component per shared pattern |
| Components | Does each major component have a description, owner, and last update trail? | Figma metadata, docs, changelog | Ownership and intent are clear |
| States and variants | Does each component have a documented state matrix? | Figma component sets, design specs | Default and all critical states documented |
| States and variants | Do Storybook stories cover those same states? | Storybook stories, args, controls | Parity exists between design and stories |
| States and variants | Are state transitions tested for interactive components? | Storybook interaction tests | Critical interactions verified |
| Accessibility | Do automated accessibility checks pass for key stories? | Storybook accessibility results | No unresolved errors on approved components |
| Accessibility | Are roles, names, descriptions, and keyboard behavior correct? | Manual review, ARIA patterns, screen reader checks | Component is semantically correct, not only visually correct |
| Accessibility | Do contrast, focus, error, and help states meet the standard you target? | WCAG review, design QA, browser checks | No critical accessibility gaps |
| Handoff | Is each major component linked between Figma and Storybook? | Storybook Connect, Designs addon, documentation | Designers and engineers review the same thing |
| Handoff | Do publish notes explain decisions and changes? | Figma publish flow, changelog | Consumers can understand what changed |
| Governance | Does each high-impact component have a release phase and deprecation path? | Governance docs, release notes | Teams know whether it is experimental, stable, or sunsetting |
| Governance | Are adoption and blast radius visible? | Figma Library Analytics, usage reports | Priority can be set by real usage data |
A practical audit flow starts by defining canonical sources. From there, pull inventories from Figma and Storybook, compare parity across tokens, components, and states, run automated and manual accessibility checks, then assign ownership and severity. That order matters — it keeps the audit grounded in evidence rather than opinion.
A drift severity rubric
The easiest way to score drift is to treat it as operational risk. A useful severity model should account for task impact, reuse surface, accessibility risk, and how many artifacts are out of sync. This helps teams avoid spending time on visible but low-impact issues while higher-risk problems remain unresolved.
| Dimension | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| Task impact | No visible issue | Cosmetic inconsistency | Noticeable workflow friction | Blocks or misleads user action |
| Reuse surface | One local screen | One feature flow | Shared component | Foundational primitive or token |
| Accessibility risk | No known issue | Minor issue with workaround | Partial failure | Clear WCAG, keyboard, or semantic failure |
| Sync gap | One artifact stale | Design and code mismatch | Design, code, and docs mismatch | Systemic drift across teams |
Score interpretation
| Total | Severity | Meaning |
|---|---|---|
| 10–12 | Critical | Fix immediately. Likely foundational or accessibility-sensitive |
| 7–9 | High | Prioritize in the current cycle |
| 4–6 | Medium | Plan after systemic issues |
| 1–3 | Low | Track, batch, or fix with related work |
| 0 | None | Matches source of truth |
The score does not need to be perfect. It needs to create agreement. When design, engineering, product, and accessibility teams can see the same risk clearly, prioritization becomes easier.
What to fix first
Fix the issues with the largest blast radius first. A common audit mistake is prioritizing what looks most inconsistent. In enterprise SaaS, the better approach is to prioritize what affects the most users, the most workflows, or the most reusable system assets.
Start with foundational tokens because one bad spacing, color, typography, or radius decision can cascade through many components. Then move to foundational interactive components such as buttons, inputs, selects, checkboxes, tabs, modals, table primitives, and form-field wrappers. After that, address shared state parity gaps such as focus, loading, empty, error, disabled, and permission-driven states. Then move into documentation, handoff, and lower-impact local inconsistencies.
| Drift example | Why it matters | Typical severity |
|---|---|---|
| Primary button uses hard-coded radius and spacing instead of tokens | Token drift cascades into every button consumer | Critical |
| Select component looks correct but fails keyboard navigation and naming | Semantic failure, not visual drift | Critical |
| Data table has loading state in code but no design spec and no Storybook story | State parity and handoff drift | High |
| Modal component is linked to a stale Figma frame while code is current | Handoff drift slows review and approval | Medium |
| One admin-only report page uses a slightly different badge style | Local inconsistency with small blast radius | Low |
If the system has many issues, resist the urge to fix everything at once. Start with the areas that reduce the most risk and create the most reuse.
How AI is changing design system audits
AI-assisted design and development are making design system governance more important. Teams can now produce interface variations, code snippets, and product concepts faster than before. That speed is useful, but it also increases the risk of unmanaged variation. A component created quickly for one workflow may never be reconciled with the shared system. A generated layout may use values that sit outside the approved token structure. A new interaction pattern may ship without accessibility review.
This does not mean teams should slow down. It means the system needs better guardrails. In AI-assisted product work, the design system becomes more than a library. It becomes the constraint layer that keeps speed from turning into inconsistency.
For enterprise SaaS, this is especially important because AI is increasingly being introduced into operational workflows, dashboards, decision-support tools, and internal platforms. These systems need consistency, trust, and predictable behavior. A design system audit helps ensure that the product foundation can support that pace of change.
Frequently asked questions
Frequently asked questions
Enspirit is an AI-native product design and engineering studio. Start a conversation about what you're building.