Skip to content
Internal productApplicationCRMIn development

WCRM: leads and tasks instead of spreadsheets

An internal CRM for the Walio sales team, currently in development. It is meant to bring together leads from Scrapik, planning the next step and the sales person’s work on the computer and on the phone.

Clientnkz.dev, internal
RoleInterface design and development
StatusIn development
WCRM – overview of leads and planned steps
The brief

Leads in a spreadsheet and in someone’s head

We sell Walio to local venues. Scrapik collects the contacts, but a batch of companies solves nothing on its own: someone has to decide who to call, when, and what happened last time. We ran it in a spreadsheet and after a few hundred records that stopped working.

Ready-made CRMs handle that part, but none could take batches from Scrapik without overwriting work in progress. So we wrote our own.

What we are building

Six parts of one application

The design and the data model are finished for every part. Screens are being connected to the database step by step; the import from Scrapik is still in progress.

Lead import from Scrapik

A batch of companies from Google Places and public registers is meant to arrive in the CRM, pass a duplicate check and be split between sales people. The connection is being prepared.

The sales person’s day list

The Today screen holds the planned steps. Every record has a next step, so nothing falls between calls.

Pipeline in two views

The kanban answers where things stand. The table answers what closes by the end of the month and what it is worth.

Company and contact detail

The company is the main entity, the contact has its own screen with history. I call a person, I want their history, not the whole company’s.

The sales person’s mobile app

Below 900 pixels four tabs render: Today, Companies, Search, Me. Work in the field without a shrunken desktop.

Roles without disabled buttons

Sales, manager and admin see different screens. An element the user has no right to simply is not in the interface.

Why this way

Three decisions about the interface

Contacts are not in the navigation but have their own screen

The company is the main entity, so a list of thousands of people would be a dead screen. A specific person is found by search. But the contact detail is a real workflow: I am calling them and I want their history.

Opportunities are a toggle, not a second navigation item

The kanban answers “where do things stand”, the table answers “what closes by the end of the month”. They are two views of the same data; two navigation items would force people to think about where to click.

Permissions are not locked, they simply do not render

No greyed-out button and no message about a missing right. On someone else’s company the sales person sees a limited preview and one action: request assignment. The application reads the role from the database, not from its own state.

How it ran

Four stages

Working in spreadsheets

We kept leads in a spreadsheet and in our heads. Nobody saw who called whom and what should happen next.

Interface design

First came a design handoff for desktop and mobile: screens, states, tokens for colours, radii and heights.

Database and sign-in

A schema in Supabase with permissions enforced at the database level. An account waits for admin approval; on its own it opens nothing.

Connecting the screens

The interface still reads sample data. We are replacing it with database queries, starting with the lists and the detail.

Business rules

What holds in the CRM even when you cannot see it

These rules are not interface details. If they stopped holding, the application would start losing work in progress.

An import does not overwrite work

A new batch updates only factual details about the venue. Owner, status, notes, tasks and history stay.

A discarded lead does not come back

The quality judgement is kept, so a manually discarded company does not return in the next batch as new.

Logging an activity is not a plan

An activity goes into history, a step into the future. After logging, planning the next step is offered; it can also be skipped.

Foreign data shows its source

Scrapik, Google Places or a public register. Such a value cannot be edited by hand.

Duplicates also by person’s name

The check looks at the company name, company number, e-mail, phone, domain and the person’s name. When it reports a match, the salesperson can still create the lead, because a match is not always a duplicate.

Taking over is not assigning

A free lead the salesperson takes straight away. For a company a colleague already owns, they have to ask, and the request goes to the colleague and the manager.

Technology

The database enforces permissions

Permissions are enforced by the database, not by the interface. Colours, radii and heights are held by our own tokens.

Application and data
React 19TypeScriptVite 7React Router 7SupabasePostgreSQLRow Level SecurityCustom CSS tokens
Scope

What the application is made of

3Roles with their own set of screens
2Interfaces: desktop and mobile
9Keyboard shortcuts on desktop
6Business rules described above
Where it stands

The database runs, the screens are being connected

The application has real sign-in and a real database schema including permissions. The screens, however, still read sample data, so a change of owner or stage does not survive a page reload.

We are replacing that with database queries step by step. The lists need paging, filters and sorting on the server, because there are thousands of records. The import from Scrapik will run on the server and the interface will only read the result.

Working on something similar?

Tell us how you track sales today. We reply within two business days.

More projects

What else we built

All projects →