Cappfinity are global leaders in measuring and developing potential in Talent Acquisition and Talent Management. Cappfinity product ecosystem spans enterprise tools, assessments, learning tools, and marketing websites, each built in different teams with inconsistent design standards. As the lead designer, I led the creation of a new design system to bring cohesion, improve usability, and reduce inefficiencies.
This was a step toward creating a unified and scalable digital experience to support future productisation. It now supports multiple products enabling teams to move faster and design more consistently, while building in flexibility for product/brand specific patterns.
Product/UX Designer
UX Audit, System Strategy & Architecture, Component Design, Design Ops, Facilitation
Team
2 Engineers, Brand Manager
Date
February 2023 - March 2024
When I joined Cappfinity, the business was starting to productise more of their offerings. Years of saying yes to client requests had resulted in platforms full of bolted-on features that were functional but had poor usability, was hard to scale, and difficult to onboard new users.
Inconsistent user table designs within enterprise products highlights the need for a unified component system.
Understanding the impact of lacking systemisation helped us define what success needed to look like for this design system.
At Cappfinity there is a lot going on, so before zooming in to the specific inconsistencies, it was important to understand exactly what the product ecosystem was comprised of.
The Cappfinity Product Ecosystem with some example products
I had 4 main goals for the audit:
I used Trello to organise the audit. It became a tool our devs and PMs could use to reference specific issues, screenshots, and component discussions.
Trello board used for UX Audit process
These findings became the foundation for the design system work:
18+ variants of core components within enterprise tools
No standard approach to colour with contrast issues on more than 30% of screens.
Around 25% of UI components not reusable due to being hard-coded for specific contexts
Visual and behavioural drift without a shared standard for when to differ
Lack of visual through line and consistent layouts across Websites, Enterprise products and Learning and Development products uncovered by the audit
Given the range of products and the differences in usage goals and contexts, a legitimate question I needed to ask after looking at all these inconsistencies was "Is the divergence we are seeing here justified?"
These questions would require input from various people - designers, product owners and engineers. I facilitated a couple of workshops to help us, in a structured way, identify where the system needed to be adaptable.
Plan for facilitating a workshop to help identify where and why flexibility would be needed in the design system
In these discovery sessions we mapped components across products using a Same / Similar / Different framework and paired this with a contextual audit of each product’s purpose, users, and constraints.
Contextual mapping: Understanding the context and constraints of each product
Intra-product type SSD: identify what can be reused, adapted, or needs redesign within the same product
The within-product type Same/Similar/Different activity identified what variation existed and the contextual audit identified why some legitimate variation might exist. When combined it allow us to see where divergence was necessary at the within product level.
This created a stable baseline for cross-product component mapping.
Cross-product component mapping: defining where alignment and divergence can be justified at the cross product type level
A visual demonstrating each level of the design system orbiting the core tokens
This structure solves the challenge of systematising a fragmented ecosystem by anchoring consistency at the token level, while progressively allowing flexibility outward, so product teams can meet local needs without compromising global integrity.
Collaborating with developers early helped me align the design system’s foundations with Angular's architectural needs, shaping how tokens, theming, and documentation were structured.
Taking guidance from the Brand Manager, we defined a shared set of raw values to anchor the system, ensuring consistency.
System-wide constants, aligned with brand, and used as the foundation for semantic token mapping
To make these primitive values meaningful across different contexts, we needed a layer of abstraction. That’s where semantic tokens came in.
Examples of semantic tokens, the element they are supposed to refer to on an interface as well as the linked default primitives
Whilst there are default values applied, it's best to think of these design tokens as value neutral. It's about defining what something is not necessarily how it looks yet.
Based on previous experience, I recognised that tokenising everything can lead to unnecessary complexity. I worked with engineers, product owners, and other designers to identify where it made sense to make something a token. That's where yet another decision framework came in:
Decision-making framework for deciding whether or not something should be a token as part of the design system governance
The tokens could end up in one of five categories: static value, static semantic, themed semantic, component-level and alias.
Tokens alone don’t create usable interfaces. The next step was translating these values into functional UI through base components. This allowed me to separate component structure, interaction and accessibility rules from visual expression.
This diagram shows how base components consume tokens, creating structure for components
To demonstrate how the design system supports visual flexibility, I'll zoom into how I applied theming to the Card component. This example shows the pay off for everything we had done to this point.
Audited how the Card component appeared across products and found widespread use but with significant visual and behavioural differences.
Contextual mapping helped determine that many of these differences were justified, shaped by differing UX goals, content density, and product-specific interaction patterns. Some within-product differences were avoidable, but most between-product variations were purposeful.
Abstracted the shared logic of what makes something a "Card" into a single base component.
A base Card component built from system styling tokens and configurable content areas, enabling consistent structure with flexible expression across products.
Despite visual differences, every card was fundamentally doing the same thing on the interface: it previewed content and directed users to act. I codified common behaviours and planned for Angular's configurability to toggle optional elements via inputs.
Applied theming to allow brand and product-specific expression based on different user goals and content densities.
Card component adjusting to different product contexts whilst remaining behaviourally consistent with a clear visual through line
Even as layout and styling shifted, each instance remained recognisably a "Card", in form and function, thanks to consistent logic, shared anatomy, and alignment to the base component. This illustrated the power of the system to balance cohesion and contextual expression at scale.
This illustrated the power of the system to balance cohesion and contextual expression at scale.
... weren't quite the best. Despite all the upfront thinking, structure, and system logic I’d put in place, the first phase of rollout surfaced cracks I hadn’t accounted for. Before unpacking those in detail, here's an overview of my approach to the first rollout:
Documenting components in Storybook to try and ensure alignment between Figma and code with a live, version controlled source of truth
So what went wrong?
The documentation showed how components looked and behaved, but lacked functional context. This made the system hard to use in practice, especially in enterprise products with complex content.
In a low UX maturity environment, design was often left out. Features were pushed top-down with tight deadlines, and the system wasn’t yet robust enough to handle that unpredictability.
Inappropriate use of the modal component: too much complexity and too many consequential actions for a transient surface
Due to other project demands, documentation eventually became a stand-in for my ongoing involvement. Without regular checkpoints or feedback loops, I lost visibility of how the system was being implemented.
Our continuous improvement loop connects Figma, Storybook, and developer workflows
Another key issue was relying too heavily on existing development workflows. While this made initial integration feel faster, it ultimately came at the cost of design fidelity. This way of working encouraged doing things the easy way.
Storybook’s integration with Angular was clunky, so developers often defaulted to existing code rather than using it. The result: components that technically "worked," but no longer aligned with the system’s visual or behavioural logic.
The modal component, while an improvement from where we started in terms of brand alignment, but still a clear departure from intended designs defined in Figma
This experience became the catalyst for taking the initiative to define an actual design ops strategy and process. It became clear that no amount of component refinement or documentation could compensate for a lack of systemic support for design. For the design system to succeed long term, attitudes towards designs role had to improve. Without that shift, the system would always risk being sidelined, no matter how well it was built.
After the first rollout exposed the gaps in our processes and design influence, we hit pause, partly due to engineering resource constraints, but also as a chance to regroup. I used the breathing room to implement all the improvements to the documentation and processes based on lessons learnt from the first release.
By the time we were ready to relaunch the system months later, we were armed with a better, more resilient process.
These foundational tokens ensure consistency across the system while allowing for theming for different brands and product types.
What started as raw values was translated into semantic roles in code that formed the base for real, live components on interfaces. Storybook bridged the gap between Figma and frontend, surfacing the tokens powering each UI element.
The journey from primitive tokens to the CSS variables to live, themed "Label" component
Storybook preview of the primary Button component switching between Enterprise and Marketing themes
The system supports visual and functional divergence at the between product level while preserving a shared foundation. This was enabled through themed tokens and product-level variants.
Adapt to hierarchy, layout, and action, without breaking system rules.
Marketing supports quick orientation for conversion; Learning minimises distraction with a compact layout; and Enterprise defaults to an expanded view to support multi-tasking and admin-heavy workflows
Flexes for content density and range of content types with a clear shared visual identity and predictable interaction behaviours
Within-product type variation was sometimes necessary. For example, adapting hero layouts on the B2C e-commerce site to better support conversion. These were handled through prop-based flexibility and scoped semantic tokens.
Semantic tokens and structured overrides allowed for brand and product-specific variants, supporting different platform nuances, and UX goals, all while maintaining a a visual through line.
As part of a wider initiative, I partnered with the Brand Manager to integrate our design system components and documentation into our Digital Media Toolkit. This gave non-design teams a clearer of view of what our product ecosystem could look like with the system fully rolled out, helping to build momentum.
The Digital Media Toolkit — a shared space where teams access brand, design, and marketing guidance
Accessibility and responsiveness were built into the system. This included colour token contrast rules, keyboard-friendly components and semantic markups, ensuring accessible, and responsive UI patterns that adapt.
Design systems are never truly "done". They evolve with the products and teams they support. While this system has already greatly improved visual consistency across the Cappfinity ecosystem and improved how design and development relate to each other, full adoption across all products is still a work in progress.
Creating this design system highlighted the importance of speaking the language of your stakeholders. Embedding the system into existing workflows, providing usage guardrails, and actively supporting implementation through QA were just as critical as the design work itself.