Pushpay · 2022–Present · NDA

A system built
across years,
not sprints.

How Pushpay's design system evolved from fragmented product libraries into a unified, scalable ecosystem — and how a board meeting about one page became the catalyst for modernising everything.

My role

UX Designer → Senior UX Designer → Design System Lead
Owner — Figma library architecture, token system, and DS governance. Partner to engineering on Storybook parity.

Scope

7 products · 2 user types · 10+ languages · 13+ designers

Focus areas

Figma Variables Token Architecture Component Library Storybook Parity DS Governance AI Tooling
4→1
Libraries consolidated
30+→13
Button variants reduced
~60%
Less maintenance overhead
17k
Variables migrated in one day
7
Products on one system

A like-for-like rebuild.
A board that wanted more.

It started as maintenance. The Groups page in ChMS used old styles that predated Prism — Pushpay's design system. The brief: rebuild it like-for-like on Prism 1.0, alongside the US UX Manager. No new features.

The board approved it with a condition: consistent, but not modern enough for where the product needed to go. They wanted a modernised UI alongside the consolidation.

"That condition changed everything. What started as a like-for-like rebuild became the mandate to modernise the entire design system — UI, tokens, and architecture."

I had one week. I focused on the foundation — border radius, elevation, typography, iconography — changes that cascade through everything built on top. The board accepted it.

From that point I owned Staq Modernisation: setting priorities, delegating, and working with engineering to close the gap between design intent and built output.

Three phases.
One continuous system.

The system didn't transform overnight. It evolved across years — each phase driven by new technology or a shift in business direction.

Phase 01 · Early

One library per product

Each product maintained its own Figma library. No shared tokens, no cross-product consistency. Engineering had one component library — but each product's application layer introduced its own inconsistencies.

Phase 02 · Consolidation

Two libraries: admin and end-user

A first consolidation — many product libraries down to two: admin and end-user. Better, but still fragmented. Without Figma Variables, theming across products still meant duplicate components per brand colour.

Phase 03 · Now

One library, variable-driven

When Figma released Variables, the architecture became possible. I led the consolidation into a single library — semantic token collections, modes for responsiveness and user types, and multi-brand theming. The north star: Figma and Storybook in full parity, ready for when all products converge into one SaaS.

From 30 button variants
down to 13.

Buttons are the clearest example. Before the variable architecture, every product needed its own variants — default, hover, active — across each product colour. That's 30+ variants to maintain. A change to one product's button required manual updates across every other.

With Figma Variables and semantic token collections, 13 button components use modes to swap colour and state. Change the mode, change the product. No duplicate components. No manual maintenance.

The same pattern, scaled up: product templates. Where every product had its own four screen artboards — 16 templates total across four products — the variable architecture collapsed them into one Product Template that changes its look, size, and feel based on which mode is active.

Before

  • One library per product — siloed and unsynchronised
  • 30+ button variants — one per product colour state
  • 16 product templates — four artboards across four products
  • Flat variable structure — no semantic layer
  • Theming required rebuilding components per brand
  • Design debt faster than resolution
  • 13 designers with no single source of truth
  • Every new product launch built from scratch

After

  • One unified library — all products, all surfaces
  • 13 button components — colour driven by variable modes
  • 1 Product Template — look, size, and feel adapt by mode
  • Semantic token collections — primitive separated from semantic
  • Light/dark, B2B/B2C, multi-brand in a single system
  • ~60% less maintenance overhead
  • 13 designers working from one source of truth
  • New product launches without building from scratch

Variable architecture

Primitive → semantic

Built collections separating raw values (primitives) from their applied meaning (semantic tokens). A colour isn't just #1A73E8 — it's "interactive/default" — which means updating the primitive cascades correctly through every usage without breaking context.

Modes

Responsiveness + user types

Modes let the same component serve different products, user types, and screen sizes from one definition. One source, multiple valid states.

Foundation refresh

Atoms first

Border radius, elevation, typography scale, iconography — refreshed as the first priority. Get these right and everything built on top inherits the improvement automatically. This was the layer the board responded to in that first one-week sprint.

Storybook alignment

Design meets engineering

The component library, Storybook and the Figma UI library need to speak the same language. Currently leading the work to establish parity — so a component in Figma maps cleanly to its built counterpart, with no interpretation gap.

The bridge between
design and engineering.

As Design System Lead, the work has shifted from building the system to governing it — setting priorities, defining component health, and keeping Figma and Storybook aligned as both evolve.

I act as the bridge between Product, UX, and engineering. No component exists twice. Everything is tracked in Jira using an atomic design structure I built — so the team can see state, dependencies, and blockers at a glance.

01
Jira component map — built a structured space in Jira where every component is logged, grouped by atomic design layer (atom → molecule → organism), with tickets linked so the state, ownership, and dependencies are always visible.
02
AI-assisted auditing — using Claude to run cross-channel audits between Figma, Storybook, and GitHub. Identifying variable mismatches, hardcoded values, and component inconsistencies — then generating Jira tickets directly from findings. Work that took weeks now runs in hours.
03
17k variables migrated in one day — used Claude to update the entire variable structure directly in Figma: auditing old usages, replacing hardcoded values, and pushing the new token architecture across the library without manual component-by-component work.
04
Atom workshop — currently running a structured audit of every atom-level component to assess health, consistency, and parity with engineering. The principle: fix atoms first, and every molecule and organism built on top benefits automatically — without the DS team becoming a blocker.

One system.
One SaaS. Eventually.

The long-term direction for Pushpay is a single unified SaaS — all products under one roof, no distinction between what was historically separate. The design system needs to be ready for that.

That's what the current work is really about. The Jira structure, atom audits, Storybook parity, AI tooling — infrastructure for a future state where a component built today works across every product without modification.

We're not there yet. The system still has to support separate products while that future is built. But every decision now is made with that north star in mind.

Library consolidation
Done
Token architecture
85%
UI modernisation
70%
Storybook parity
In progress
Atom audit
Started

Next case study

AI as a Design System Force Multiplier →