2024Banking license securedKonto & Karte project begins
Early 2025Platform scope expandsDesign System build starts
Late 2025Factoring addedThis project
End of 2025Funding endsPlatform discontinued

Problem & Context

By late 2025, the company was mid-way through building a new banking platform around a recently acquired banking license. What started as a contained project for "Konto & Karte" had grown into something larger: every product the company offered would eventually need to migrate to this new infrastructure.
Factoring was next.

Factoring is a financing product where businesses sell their unpaid invoices to a third party in exchange for immediate liquidity. The factoring provider then collects the payment from the end customer.

The brief, delivered as three Jira tickets under a single Epic, had a clear goal: a fully digital, self-service Factoring experience that reduced manual back-and-forth, improved cash flow visibility for customers, and integrated cleanly into the new banking platform.

[1]

Kontakte
Contact Directory

[2]

Dokumentenübersicht
Document Overview

[3]

Rechnungsupload
Invoice Upload

In reality, each ticket described functionality that didn’t exist yet, but was framed as a redesign rather than new system work.

What this actually required:

CREATION

Multi-step Creation Flows

Conditional Form Logic

CONSTRAINTS

Compliance Constraints

Granular Error States

VISIBILITY

In-app Document Preview

It was more accurate to say, the project sat at the intersection of four things happening simultaneously:

It was more accurate to say, the project sat at the intersection of four things happening simultaneously:

design a new feature set, in the visual language of a Design System still being built, for a platform and a parallel project still finding their shape, while answering questions the Product Manager didn't have time for

design a new feature set, in the visual language of a Design System still being built, for a platform and a parallel project still finding their shape, while answering questions the Product Manager didn't have time for

All of these workstreams had been operating separately, which created problems the moment Factoring required them to connect.

This was the actual brief.

Navigation

Before Factoring could be designed, the platform's core navigation needed work. The sidebar had been carried over from a much denser product and never adapted to the simpler structure of the new banking platform.


I addressed this as part of the Design System build. The sidebar was a core component, and getting it right meant every screen that followed would sit on a consistent navigation framework.
The corrections were small but structural: icon treatment, spacing, indentation, a proper active state, and Factoring added under Finances, where it belonged.

The same logic applied to the header:

Contact Directory

  1. Contact List

PROBLEM

The old card grid had no metadata hierarchy, inconsistent contact details across cards, and actions hidden behind a three-dot menu.

DECISION

Keep the card layout but rebuild the information structure. Surface email, phone, and address with icons. Add created/updated timestamps. Make edit and delete explicit. Upgrade pagination from basic prev/next to a full range navigator.

RESULT
previous state
previous state
previous state
Explicit edit + delete
Created / Updated timestamps
Structured metadata with icons
Full pagination
updated structure ✓
updated structure ✓
  1. Contact Creation

PROBLEM

The old flow combined DB ("Datenbank") search and manual entry with no visual or hierarchical separation. Users couldn't tell where imported data came from.

DECISION

Split creation into two clearer steps.
Search first and manual entry as an explicit fallback below it. Tag each autocomplete result with its source: "Datenbank" or "Firmenwissen."

Design Constraint: the latter wasn't a visual preference. The ticket specified it as a compliance requirement: users needed to know where data was coming from before accepting it.

RESULT
previous state
Source labeling per result
Search-first, manual fallback
updated structure ✓
  1. Dynamic Forms

PROBLEM #1 · FORM ARCHITECTURE

The old form was one flat layout regardless of legal entity type. The Rechtsform/legal from dropdown existed but changed nothing.

DECISION

Restructure into grouped sections (Tax, Company, Address, Contact) that adapt based on entity type. "Freiberufler" surfaces personal fields; "GbR" adds an expandable partner section.

RESULT
previous state
Sections with icons
Country code selector
Fields adapt per entity type
Sections with icons
Country code selector
Fields adapt per entity type
Expandable partner section
Expandable partner section
updated structure ✓
PROBLEM #2 · DATA IMPORT & COMPLIANCE

The old platform had no confirmation step after data import and no compliance constraints on what was pulled in automatically.

DECISION

Show a success banner prompting the user to review imported data. Pre-fill address fields but leave contact fields (phone, email) intentionally empty, enforcing the compliance rule that contact data cannot be auto-imported.

RESULT
Review prompt after import
Address pre-filled
Contact fields intentionally empty
Review prompt after import
Address pre-filled
Contact fields intentionally empty
PROBLEM #3 · ERROR HANDLING

The old platform had no inline validation, no duplicate detection, and no confirmation dialogs.

DECISION

Three layers of error handling. Inline field errors for validation. A duplicate detection banner with a direct link to the existing record.
Two alert dialog variants: destructive (red) for deletion, warning (amber) for unsaved changes, each with correctly weighted button hierarchy. An error toast for failed creation attempts with a retry prompt.

RESULT
Inline field validation
Duplicate detected + direct link
Destructive vs. warning hierarchy
Destructive vs. warning hierarchy

Document Overview

  1. Structure & Interactions

PROBLEM #1 · INFORMATION ARCHITECTURE

The old document section used tabs with raw system filenames, no metadata, no dates, no filtering, and no actions beyond a download icon per row.

DECISION

Replace tabs with collapsible accordion sections, each with a document count and contextual empty state. Clear document titles replaced raw system filenames. Each row carries creation date, file format, and file size.
"Abrechnungen" rows add a secondary metadata line (billing period + reference ID). A persistent filter bar provides date range and category filtering. Per-row actions expand to view or download.
The "Offene Posten" header surfaces the nightly update timestamp.

RESULT
previous state
previous state
previous state
updated structure ✓
updated structure ✓
updated structure ✓
Each section carries its own contextual empty state as well.
Each section carries its own contextual empty state as well.
Each section carries its own contextual empty state as well.
Collapsible sections with document count
Clear titles + row metadata
Billing period + reference ID
Collapsible sections with document count
Clear titles + row metadata
Billing period + reference ID
Date range picker
Category filter with count
Sortable by date
Last updated timestamp
Date range picker
Category filter with count
Sortable by date
Last updated timestamp
updated structure ✓
updated structure ✓
Filters, actions, and feedback states shown alongside the base view.
Filters, actions, and feedback states shown alongside the base view.
From this point on, there was no equivalent in the old platform, so no previous-state exists for the features that follow.
PROBLEM #2 · BULK DOWNLOAD

The old platform only supported individual file downloads, one at a time.

DECISION

Add row-level checkboxes with a scoped selection bar per section. The bar shows the count and a single "Download selected" action.
Toast feedback covers the full loop: loading, success, error.

RESULT
Selection scoped per section
Download feedback
  1. In-App Preview

PROBLEM

The old platform was download-only. No way to view a document without leaving the interface.

DECISION

Open documents in a side drawer that keeps the list in context. The drawer header carries the filename and a download fallback.
Loading and error states are handled within the drawer independently from the main page. If preview fails, a "Download instead" fallback is offered immediately; this wasn't in the ticket but followed naturally from the Error Handling approach applied across the rest of the project.

RESULT
Preview without navigating away
Download fallback in header
Page navigation
DRAWER STATES
Active state alternative; top placement kept controls closer to the document header
Loading state
Error state + download fallback
  1. Error Handling

PROBLEM

The old platform had no error states, no empty states, no loading feedback.

DECISION

Three failure levels, each proportional to the scope of the problem.

  1. Page-level service error as a top banner with structure preserved.

  2. Mixed-state failures where each section handles its own error independently.

  3. A full service-down error page with error code, retry, and support contact.

RESULT
Page-level error, structure preserved
Stale data warning
Section-level error
Stale data warning
Section-level error
Full service-down with error code
Full service-down with error code

Outcome

The platform didn't launch. Funding ran out before the remaining products could be migrated, and the work was cut before the third ticket, "Rechnungsupload" / "Invoice Upload", could be designed.

What was completed covers the two most complex sections of the Factoring feature set, built on a Design System that was being established in parallel. The work carried both system-level and feature-level decisions simultaneously.

The Design System foundation behind this work is documented separately.

Create a free website with Framer, the website builder loved by startups, designers and agencies.