Zadanie
SHIFT>_CRM to system CRM dla firm z każdej branży z osobną instalacją dla każdego klienta.
Uniwersalne systemy CRM pasują trochę do wszystkich, ale do nikogo w pełni. Są projektowane z myślą o „przeciętnej" firmie, więc każda firma musi naginać swoje procesy do cudzej logiki, godzić się z niepotrzebnymi funkcjami i obywać się bez tych, których potrzebuje, a dane wszystkich klientów przechowuje jeden dostawca. Celem projektu było stworzenie CRM, który działa dokładnie tak, jak działa biznes konkretnej firmy. Każda firma otrzymuje własną, niezależną kopię na osobnym serwerze, z własną bazą danych i własnym adresem, skonfigurowaną pod jej procesy: pracownicy, uprawnienia, etapy pracy z klientem, słowniki, własne pola, a nawet pojęcia, do których przywykł zespół. W efekcie firma dostaje system, z którym nie może się równać żaden duży uniwersalny CRM, bo żaden nie powstał z myślą o niej.
W CRM prowadzi się całą pracę z klientami: karta klienta z kilkoma osobami kontaktowymi, komentarzami i plikami, zmiana statusu bezpośrednio w karcie, płatności w różnych walutach, lejek sprzedaży, przypomnienia i powiadomienia. Statystyki pokazują obraz zarówno w podziale na klientów, jak i na poszczególnych pracowników: transakcje, konwersję, płatności, rozmowy i zaległe zadania. Zgłoszenia ze strony internetowej i z Facebook Lead Ads automatycznie stają się nowymi klientami, a ponowne zapytania są rozpoznawane. Wbudowany telefon pozwala dzwonić i odbierać połączenia bezpośrednio w przeglądarce, a każda rozmowa trafia do historii klienta. Do komunikacji w zespole służy komunikator z prywatnymi czatami, wiadomościami głosowymi, odpowiedziami na wiadomości i natychmiastowym doręczaniem.
Osobną częścią systemu jest sztuczna inteligencja. Asystent AI odpowiada na pytania handlowców dotyczące bazy, na przykład do kogo warto dziś zadzwonić, przy czym widzi tylko dane, do których pracownik ma dostęp, i niczego sam nie zmienia. Firma może korzystać z własnego modelu Qwen na swoim serwerze albo podłączyć ChatGPT, Claude, Gemini i DeepSeek za pomocą klucza API; administrator wybiera główną usługę i decyduje, kto z której może korzystać. Opis firmy dla AI można wczytać z pliku Word lub PDF, a w trybie uczenia AI samodzielnie gromadzi ogólne notatki o firmie, nie zapisując danych osobowych klientów. Każdej nocy AI analizuje zmiany u klientów i do szóstej rano przygotowuje każdemu pracownikowi plan dnia. Komentarze można dyktować głosem, a system sam zamienia je na tekst.
Szczególną uwagę poświęcono bezpieczeństwu. Hasła są przechowywane jako skróty Argon2id, sesje w zabezpieczonych plikach cookie, a do dyspozycji jest uwierzytelnianie dwuskładnikowe przez aplikację uwierzytelniającą. Uprawnienia sprawdza serwer, dane są dodatkowo chronione zabezpieczeniami na poziomie wierszy w bazie danych, a wszystkie działania trafiają do dziennika audytu, którego nie można zmienić. Jest automatyczne wylogowanie po okresie bezczynności i codzienne wylogowanie wszystkich pracowników o ustalonej godzinie, klucze usług zewnętrznych są szyfrowane, kopie zapasowe tworzą się automatycznie i również są szyfrowane, a strona działa wyłącznie przez HTTPS. Interfejs przetłumaczono na 11 języków, dostępnych jest kilka motywów kolorystycznych oraz wersja demonstracyjna z fikcyjną firmą do prezentacji dla klientów.
Projekt jest w całości napisany w TypeScript. Interfejs zbudowano w React 19 i React Router na własnym systemie projektowym, a serwer w Node.js i Fastify z bazą danych PostgreSQL, zapytaniami przez Kysely i walidacją danych w Zod. Aktualizacje na żywo docierają przez Server-Sent Events i mechanizm powiadomień PostgreSQL, a telefonia działa na WebRTC i JsSIP i została przetestowana z Asterisk. Funkcje AI korzystają z OpenAI API, Anthropic SDK i Ollama. System wdraża się na VPS z Ubuntu za pomocą Docker Compose, a Caddy automatycznie wystawia certyfikaty HTTPS. Kluczowe scenariusze są objęte testami automatycznymi.
W efekcie powstał produkt, do którego klient nie musi się dopasowywać: CRM z telefonią, komunikatorem i asystentem AI działa na własnym serwerze klienta i od pierwszego dnia jest zorganizowany tak, jak jego biznes.








