Back to all cases

AlmaCRM

An in-house sales CRM written from scratch: a deal pipeline, tasks, a single client database, a dashboard builder and a design system of its own.

About the project:

AlmaCRM is an in-house tool for the sales team. Our team built all of it, from scratch, to replace the previous system.

The company sells software to property developers in several countries, and the sales cycle here is long: it takes many steps to get from first contact to a deal, hundreds of clients are in play at once, and the whole team has to run them by rules everyone understands.

AlmaCRM deal pipeline: stages on a board, each stage with its own colour, counter and total
The deal pipeline: stages with a colour, a counter and a total.

Pipeline:

Deals move through stages on a board: every stage has its own colour, counter and total. A card can be dragged to the next stage, and the set of fields on the card is configurable — different stages need different things. There are bulk actions and a switch between the board and a table.

The AlmaCRM deal board in the dark theme
The same board in the dark theme.

Deal card:

A page of its own: on the left — the stage, the assignee, the company, the contacts with their communication channels, the planned dates and the price calculated from the product catalogue with discounts. On the right — the activity feed for the deal.

Three kinds of entries go into the feed: a task, a note and a message. Files live there too, plus a separate tab with the change history — you can see who changed what.


Tasks:

Two views to choose from. The table — with configurable columns, sorting and filters. The board — columns by due date: overdue, today, tomorrow, this week, next week. A team lead sees the workload of the team, a sales manager sees their own day.

AlmaCRM tasks on a board: columns by due date — overdue, today, tomorrow, this week
The task board: columns by due date.

Clients and dashboards:

The database is split into companies and contacts: company type, country, status, assignee, and people linked to their organisations.

The dashboard is assembled from widgets by dragging — everyone sets up their own workspace. Widgets can be personal or shared with the team.

AlmaCRM client database: companies and contacts, type, country, status and assignee
The client database: companies and contacts.

What else is inside:

Roles and permissions — administrator, director, sales manager, with departments and team leads; access control is checked on the server, not just by hiding buttons. Reference lists: the pipeline, task types, the product catalogue, countries and cities, exchange rates, acquisition channels, rejection reasons, tags.

AlmaCRM reference lists and access control: the pipeline, task types, the product catalogue, roles
Reference lists and permissions: the pipeline, task types, the product catalogue, roles.

The system is multi-currency — the rates are kept in a reference list and shown as a live ticker with the daily change. The interface comes in two languages, in a light and a dark theme. Who on the team is online right now is visible in real time.


Design system:

The project has a living design system of its own — a separate screen with 27 sections that holds the colour and typography tokens, the scale of pipeline stages, the icons, the components, the navigation patterns and the interface states: empty, loading, error, no permissions. It isn’t documentation “on paper” but a working showcase that all development is checked against.


Mobile:

On a phone the side rail is replaced by a bottom bar, and the deal card splits into two tabs — the data and the work on the deal.


My role:

I built the product from scratch up to the base version — the one the sales team was moved onto and started working with in production.

After that the client got not only the system but a tool to keep developing it themselves — Dev Platform. The product is now taken forward by the client: mostly on their own, and on some tasks with my help.


Stack:

Backend — Laravel, PostgreSQL, Redis, a separate real-time service, permissions enforced on the server. Frontend — React and TypeScript, custom drag-and-drop boards and a widget grid. Deployed in Docker.