Zehra Jaffrey

case study · 2025

Building tilli's design system from the ground up

During my time at the fintech start-up, I discovered mid-project that the company had no shared visual language.

So I built one… from scratch, alongside a 0→1 product build, with no prior foundation to work from.

role
Sole Product Designer
industry
B2B, Fintech, SaaS
Components from the tilli design system on a dotted canvas: a payment summary with a discount code and a disabled Pay Now button, a debit or credit card form with billing address fields, a bank and card selection with a Pay Now button, an invoice checkout list with amounts, and a stepper (Account Lookup, Select Invoices, Payment Method, Checkout).

Context

Laying the groundwork to scale.

When I joined tilliX, tilli was already operating as a growing product with multiple live workflows, but there was no design system to support that scale.

Inconsistent components, no shared tokens, no docs. Engineers were filling design gaps themselves just to keep moving.

A diagram of three products (Product #1, #2, #3), each a dashboard with different chart and table layouts, with arrows from a single source: crosses on the first two and a tick on the third, showing inconsistent components across products.
“I couldn't build a zero-to-one product cleanly on top of inconsistency. And neither could anyone who came after me.”

Engineer interviews and component documentation

Understanding how teams use component docs.

Three quotes from engineers. “When there's no component to reference, I just build what looks right to me. It's not ideal.” “There was no single place to check. I was going between three different files trying to piece it together.” “I've been copying styles from old screens because I didn't know where else to look.”

Since they were the ones actually building these components, I sat down with engineers to understand what was actually painful in their day-to-day.

A sketch of a form creation screen with a menu of options (Labels, Namespaces, Size, Type) and a chat between designer and engineer: “Should I just place this here?” and “I think so...? Kinda looks like it would fit”.

Design priorities

I made sure to align the design features with our product team needs, creating goals to ensure my solution addressed the prior pain points successfully.

Three concentric circles of design goals, from the centre out: component reuse, visual consistency and accessibility (WCAG), and engineer adoption.

visual inconsistency

Shared components establish consistent patterns across product workflows.

no source of truth

A shared component library and documentation give design and engineering a common reference.

compounding debt

Every new product made it worse.

offshore risk

No shared standards meant misalignment would happen fast.

Design tokens and component architecture

As tilli expanded its product suite, I focused on creating the building blocks to support that growth - a scalable system of visual foundations and reusable components.

Structure analysis

Foundations (colour tokens, typography scale, iconography) feed the components (buttons, form inputs, cards, data display), which tilliX Quick Pay, the tilliX dashboard, and the tilli.pro website are built from.

By the time I moved into designing the tilliX dashboard, I was assembling from a system, not designing from scratch.

Design system adoption and collaboration

Documentation for the Margin tokens: a table of variables, values and descriptions, from paddingXXS (4px / 0.25rem) to paddingXL (32px / 2rem), and an alert dialog example (Are you absolutely sure?) with its spacing marked.

Our product users were finance and ops teams handling high-volume payments under pressure.

I prioritized clarity: larger, more legible components to reduce risk in critical moments.

I ran weekly design system reviews with engineers and stakeholders: sharing decisions, gathering feedback, and iterating so the system stayed grounded in what could actually be built.

The design system's page list in Figma: Design System, Colours, Typography, Buttons, Margin and Border Space, Components, Error messages.

The finalized design

The result of this work led to a complete overhaul of tilli’s component documentation moving forward. I presented these updates to the broader team to gather feedback and align on how the system would scale across products.

The finalized components on a dotted canvas: a payment summary with a discount code and a disabled Pay Now button, a debit or credit card form, bank selected and card active states, a Pay Now button, an invoice checkout list and the Quick Pay stepper.

01 — dark mode

Both modes, one system.

🌑 ⟶ 🌘 ⟶ 🌖 ⟶ 🌕

Color tokens were built to support both light and dark mode from day one. Switching modes required no component rework just swapping the token values.

The Buttons page of the design system: a row of button variants, then the same documentation in dark mode and in light mode side by side, covering primary, secondary, outlined, ghost and link buttons with their states and disabled colours.

02 — scalable components

One brand reflected on every surface.

The system was built to outlast tilliX. Tokens, type scale, and components are structured so any future tilli product can inherit the foundation without starting over.

A blue Scan to Pay button with a contactless icon, being dragged by a cursor out of a dashed component outline.

Components were composable building blocks & engineers source of truth. Quick Pay and the post-login dashboard are entirely different experiences - assembled from the same parts.

03 — accessibility

Every interactive state designed and documented.

Buttons, form inputs, cards, and data display are built with every state documented, including error, focus, and disabled.

04 — seamless integration

One update propagates across every file.

When a component in the library gets updated, every instance across every file updates with it. Engineers did not have to hunt down stale components, the system stays in sync automatically.

Two component instances (a bell icon and a payment icon), each marked Added with an updated version above the old one, and a Merge Changes button below.

Crafting the visual experience

Once the system was established, I used it to continue building out tilliX — applying the same components and patterns across new features and flows.

Click here to see my work.

A laptop showing the tilliX saved payment methods dashboard: Welcome to your Saved Payment Methods, with payment method cards and a recent transactions table.