O projekcie
Automatyzacja, która rozdziela pocztę przychodzącą od firm do właściwych handlowców, wydana w dwóch postaciach: jako wtyczka w warstwie poczty i jako dodatek do CRM-u na pulpicie. Oba wydania podejmują tę samą decyzję, bo pytają o nią to samo miejsce.
Zacznę od zdania, które przestawia całe zadanie: TO NIE JEST PROBLEM KLASYFIKACJI, TO PROBLEM WŁAŚCICIELSTWA. Kto opiekuje się daną firmą, jest FAKTEM ZAPISANYM W CRM, a nie czymś do wywnioskowania z treści listu. Dlatego reguła pierwsza brzmi: jeśli domena nadawcy prowadzi do konta, które ma opiekuna, list idzie do tego opiekuna — bez udziału jakiegokolwiek klasyfikatora.
Kolejność odwrotna jest najczęstszym błędem w takich wdrożeniach i ma nazwę: pozwolić modelowi ROZSTRZYGAĆ TO, CO BAZA JUŻ WIE. Skutek jest gorszy niż brak automatyzacji — list od klienta obsługiwanego od trzech lat trafia do innego handlowca, który dzwoni do niego jak do nowego kontaktu. Klient słyszy wtedy, że firma go nie pamięta, a to jest szkoda, której nie odrabia żadna oszczędność czasu.
Klasyfikacja wchodzi więc dopiero tam, gdzie naprawdę nie ma czego odczytać: przy nadawcy nieznanym z żadnego konta. I także tam jest ograniczona — model PROPONUJE handlowca razem z uzasadnieniem, a przydziela reguła albo człowiek. Propozycja bez przydziału jest bezpieczna, bo najgorsze, co może zrobić, to zająć komuś dziesięć sekund.
Druga rzecz, na którą trzeba uważać: DOMENA NIE JEST FIRMĄ. Adresy z poczty darmowej — gmail, wp, interia — nie niosą żadnego sygnału o firmie, a domeny współdzielone przez hostingi niosą sygnał FAŁSZYWY, bo łączą ze sobą podmioty bez związku. Stąd lista wykluczeń, a przy poczcie darmowej sięgnięcie do stopki, numeru telefonu i treści. Gdy i to nie wystarcza, list idzie do kolejki nieprzydzielonych — NIGDY do najbardziej prawdopodobnego handlowca.
WĄTEK ZOSTAJE U SWOJEGO WŁAŚCICIELA i to jest reguła mocniejsza od wszystkich pozostałych. Odpowiedź skierowana do kogoś innego rozcina rozmowę na dwie osoby, a klient dostaje dwie różne wersje tej samej sprawy. Tożsamość wątku bierze się z nagłówków „In-Reply-To” i „References”, a NIE z tematu listu: temat dostaje przedrostki „Re”, „Fw” i „Odp”, bywa ręcznie zmieniany, tłumaczony i przerabiany przez listy dyskusyjne. Dopasowywanie po temacie wygląda na wygodne i psuje się w pierwszym tygodniu.
IDEMPOTENCJA nie jest tu ozdobą, bo poczta dubluje się częściej, niż się sądzi: identyfikatory wiadomości w skrzynce zmieniają się przy przeniesieniu do innego folderu, pełna synchronizacja po awarii przynosi wszystko od nowa, a integracje potrafią dostarczyć tę samą wiadomość dwa razy. Przydzielenie jej dwa razy znaczy dwa zadania i dwóch dzwoniących ludzi, więc kluczem jest identyfikator wiadomości, a powtórne przetworzenie nie robi nic.
AUTOODPOWIEDZI I ODBICIA NIE TWORZĄ LEADÓW — to jedno zdanie oszczędza tygodnie porządkowania bazy. Powiadomienia o nieobecności, zwrotki o niedostarczeniu, potwierdzenia odczytu i wiadomości masowe to klasyczne śmieci, którymi zapełniają się CRM-y, bo z technicznego punktu widzenia są zwykłą przychodzącą pocztą. Rozpoznajemy je z nagłówków przeznaczonych dokładnie do tego („Auto-Submitted”, „Precedence”, „X-Auto-Response-Suppress”) i ze struktury zwrotki, a nie ze zgadywania, czy w treści stoi „jestem na urlopie”.
Cena pomyłki jest w tej dziedzinie szczególna i warto ją nazwać, bo nie chodzi o opóźnienie. Zły przydział kończy się albo tak, że do klienta dzwoni DWÓCH handlowców, albo tak, że NIE DZWONI ŻADEN — bo każdy zakłada, że sprawę ma ten drugi. Dlatego w każdym momencie właściciel jest dokładnie jeden, przy przydziale zapisany jest powód, a brak rozstrzygnięcia jest WIDOCZNĄ KOLEJKĄ, nie cichym ustawieniem domyślnym.
Rozdział po równo jest pułapką, choć brzmi sprawiedliwie. Licznik listów nie wie nic o obłożeniu ani o rejonie, a handlowiec na urlopie dostaje swoją kolejkę tak samo jak obecny. Kolejność pierwszeństwa jest więc ZADEKLAROWANA: właścicielstwo z CRM, potem rejon i specjalizacja, potem dostępność, a dopiero na końcu obłożenie. Zapas na wypadek, gdy nic nie pasuje, jest KONKRETNYM CZŁOWIEKIEM, nie pustym miejscem — bo pusty zapas znaczy, że list nie ma właściciela, a to właśnie stan, którego ta automatyzacja ma nie dopuścić.
Dwa wydania, ale JEDEN SILNIK DECYZJI — to najważniejsza decyzja konstrukcyjna tego projektu. Gdyby wtyczka i dodatek liczyły przydział każde po swojemu, ten sam list byłby przypisany inaczej w zależności od tego, gdzie się patrzy, a rozbieżność wyszłaby najpóźniej i najdrożej: przy rozmowie z klientem. Reguły są więc DANYMI w jednym miejscu, a oba wydania o nie pytają. Żadne nie ma własnej kopii logiki.
Dodatek na pulpicie musi działać, gdy sieci nie ma, więc pracuje na ostatnim znanym przydziale i kolejkuje poprawki ręczne do późniejszej synchronizacji. Reguła nadrzędna: POPRAWKA CZŁOWIEKA BIJE REGUŁĘ i jest zapisywana jako decyzja człowieka, nie jako dane. To rozróżnienie ma skutek praktyczny — decyzji nie nadpisuje kolejny przebieg reguł, a przy przeglądzie widać, co wynikło z automatu, a co ktoś poprawił ręcznie.
Na koniec miara, bo bez niej takie wdrożenie żyje na wrażeniach. Jedyną uczciwą miarą NIE jest skuteczność na zbiorze testowym, tylko TO, JAK CZĘSTO CZŁOWIEK POPRAWIA PRZYDZIAŁ. Liczona osobno dla każdej reguły, bo rosnący współczynnik poprawek mówi nie tylko „jest gorzej”, ale i KTÓRA reguła rozjechała się z rzeczywistością — na przykład po zmianie rejonów albo po odejściu handlowca.
Problem
Poczta od firm wpada na wspólną skrzynkę i ktoś rozdziela ją ręcznie, więc rozdział trwa godziny i zależy od tego, kto właśnie patrzy. Listy od klientów obsługiwanych od lat trafiają do przypadkowych osób, część odpowiedzi rozjeżdża się na dwóch handlowców, a autoodpowiedzi i zwrotki zakładają w CRM widmowe kontakty.
Rozwiązanie
Najpierw właścicielstwo z CRM: domena prowadzi do konta, konto do opiekuna i on dostaje list — bez klasyfikatora. Reguły i model wchodzą tylko przy nadawcy nieznanym, wątek zostaje u swojego właściciela, a brak rozstrzygnięcia jest widoczną kolejką. Oba wydania, wtyczka i dodatek, pytają o decyzję jeden silnik.
Funkcje
- właścicielstwo z CRM ma pierwszeństwo przed każdą regułą i przed modelem
- model tylko PROPONUJE handlowca dla nieznanego nadawcy; przydziela reguła albo człowiek
- wątek zostaje u właściciela — tożsamość z nagłówków, nigdy z tematu listu
- klucz idempotencji na identyfikatorze wiadomości; powtórka nie przydziela drugi raz
- autoodpowiedzi, zwrotki i poczta masowa nie tworzą leadów ani zadań
- lista wykluczeń domen darmowych i współdzielonych, żeby nie łączyć obcych firm
- zadeklarowana kolejność: właścicielstwo, rejon, dostępność, obłożenie
- zapas jest konkretnym człowiekiem, nie pustym miejscem
- jeden silnik decyzji dla wtyczki i dodatku — bez dwóch kopii reguł
- miarą jest częstość ręcznych poprawek, liczona osobno per reguła
Moduły
mail-przyjecie
warstwa wejściaPobiera pocztę ze skrzynek i pilnuje, żeby ta sama wiadomość weszła raz.
- klucz idempotencji na identyfikatorze wiadomości, nie na numerze w skrzynce
- przeniesienie listu do innego folderu nie jest nowym listem
- pełna synchronizacja po awarii nie przydziela wszystkiego od nowa
- stan po każdej porcji, więc przerwane pobieranie wznawia się, nie startuje od zera
- treść zostaje w infrastrukturze klienta; dalej idą cechy, nie listy
mail-higiena
warstwa odsiewuOdsiewa to, co jest pocztą techniczną, zanim zamieni się w lead albo zadanie.
- autoodpowiedzi rozpoznawane z nagłówków przeznaczonych do tego, nie z treści
- zwrotki o niedostarczeniu czytane ze struktury raportu, nie z tekstu
- potwierdzenia odczytu i poczta masowa odcięte od tworzenia kontaktów
- odsiane wiadomości SĄ zapisane i przeglądalne — odsiew to nie kasowanie
- niepewny przypadek idzie do kolejki nieprzydzielonych, nie do kosza
watki
spójność rozmowyTrzyma całą rozmowę u jednej osoby, także gdy temat listu się zmienia.
- tożsamość wątku z nagłówków „In-Reply-To” i „References”
- temat NIGDY nie jest kluczem — przedrostki, tłumaczenia i listy go psują
- odpowiedź w istniejącym wątku idzie do jego właściciela, nie przez reguły
- przekazanie wątku innej osobie jest operacją jawną i zapisaną
- wątek rozgałęziony na dwa adresy zostaje jednym wątkiem z jednym właścicielem
wlascicielstwo
warstwa faktów z CRMOdpowiada na pytanie, kto już opiekuje się tą firmą — i ma pierwszeństwo.
- domena prowadzi do konta, konto do opiekuna; to jest fakt, nie wnioskowanie
- lista wykluczeń domen darmowych i hostingowych, żeby nie łączyć obcych firm
- przy poczcie darmowej sięgnięcie do stopki, numeru telefonu i treści
- brak dopasowania to kolejka nieprzydzielonych, nie najbardziej prawdopodobny opiekun
- zmiana opiekuna w CRM działa od następnego listu, nie wstecz na zamkniętych sprawach
reguly-przydzialu
silnik regułRozstrzyga przydział tam, gdzie właścicielstwa nie ma — w zadeklarowanej kolejności.
- kolejność: właścicielstwo, rejon i specjalizacja, dostępność, obłożenie
- nieobecność handlowca zdejmuje go z kolejki, zamiast zapełniać mu skrzynkę
- obłożenie liczone z otwartych spraw, nie z liczby listów
- zapas jest KONKRETNYM CZŁOWIEKIEM — puste miejsce znaczy list bez właściciela
- reguły są danymi; zmiana rejonów nie wymaga wydania nowej wersji
propozycje
warstwa podpowiedziDla nadawcy nieznanego z żadnego konta proponuje handlowca wraz z uzasadnieniem.
- wchodzi WYŁĄCZNIE tam, gdzie nie ma właścicielstwa ani dopasowania reguł
- PROPONUJE i uzasadnia; przydziela reguła albo człowiek, nigdy sama propozycja
- nie rozstrzyga niczego, co CRM już wie — to jest granica, nie wytyczna
- uzasadnienie wskazuje fragmenty listu, na których się oparło
- odrzucona propozycja jest zapisana i zasila miarę trafności
silnik-wspolny
jedno źródło decyzjiJedyne miejsce, które liczy przydział; oba wydania o niego pytają.
- wtyczka i dodatek NIE mają własnych kopii reguł ani własnej logiki
- ta sama wiadomość daje ten sam przydział niezależnie od miejsca pytania
- decyzja zwracana razem z powodem i z regułą, która ją podjęła
- zmiana reguły obowiązuje w obu wydaniach z chwilą zapisania
- rozbieżność między wydaniami jest niemożliwa z konstrukcji, nie z uzgodnienia
wtyczka-poczty
wydanie w warstwie pocztyDziała tam, gdzie poczta już jest: znakuje, przenosi i przypisuje przy odbiorze.
- decyzja podejmowana przy odbiorze, więc handlowiec widzi list od razu u siebie
- znacznik i folder zamiast kopiowania wiadomości w drugie miejsce
- awaria wtyczki nie wstrzymuje poczty — list dochodzi, tylko bez przydziału
- nieprzydzielone zostaje widoczne na wspólnej skrzynce, nie znika
- pracuje na nagłówkach i cechach; treść nie wychodzi poza instalację
dodatek-crm
wydanie na pulpicieDodatek do CRM-u: pokazuje przydziały, pozwala poprawić i działa bez sieci.
- pracuje na ostatnim znanym przydziale; brak sieci nie blokuje pracy
- POPRAWKA CZŁOWIEKA BIJE REGUŁĘ i jest zapisana jako decyzja, nie jako dane
- poprawki kolejkowane offline i synchronizowane po powrocie łącza
- kolejka nieprzydzielonych jest osobnym widokiem, nie zakładką do odkrycia
- historia przydziału przy każdej sprawie: kto, kiedy, z jakiego powodu
Architektura
- Podstawa
- usługa w TypeScripcie z bazą PostgreSQL, wtyczka w warstwie poczty (IMAP) i dodatek desktopowy w Electronie
- Kolejność decyzji
- właścicielstwo z CRM, potem rejon i specjalizacja, dostępność, obłożenie; propozycja modelu tylko przy nadawcy nieznanym
- Granica modelu
- proponuje i uzasadnia, nigdy nie przydziela i nigdy nie rozstrzyga tego, co CRM już wie
- Wątki
- tożsamość z nagłówków „In-Reply-To” i „References”; temat listu nie jest kluczem w żadnym miejscu
- Idempotencja
- klucz na identyfikatorze wiadomości; przeniesienie do innego folderu i pełna synchronizacja nie przydzielają ponownie
- Poczta techniczna
- autoodpowiedzi, zwrotki, potwierdzenia odczytu i poczta masowa nie tworzą leadów; zapisane i przeglądalne, nie skasowane
- Domeny
- lista wykluczeń poczty darmowej i domen hostingowych; bez niej system łączy w jedno konto firmy bez związku
- Brak rozstrzygnięcia
- widoczna kolejka nieprzydzielonych; zapas regułowy jest konkretnym człowiekiem, nie pustym miejscem
- Jeden silnik
- oba wydania pytają o decyzję to samo miejsce; rozbieżność jest niemożliwa z konstrukcji, nie z uzgodnienia
- Praca offline
- dodatek pracuje na ostatnim przydziale i kolejkuje poprawki; poprawka człowieka bije regułę i jest zapisana jako decyzja
- Prywatność
- treść poczty nie opuszcza instalacji klienta; dalej idą nagłówki i cechy, a dziennik przydziałów ma własną retencję
- Rozliczalność
- przy każdym przydziale zapisany powód i reguła; dokładnie jeden właściciel w danym momencie
- Miara
- częstość ręcznych poprawek liczona per reguła — pokazuje nie tylko że jest gorzej, ale KTÓRA reguła się rozjechała
Technologie
- TypeScript
- Node.js
- IMAP
- PostgreSQL
- Electron
- Claude
Autor
Mariusz PerzyńskiClient Relations & Operations