Przez pierwsze dwa lata prowadziłem follow-upy w głowie. Wychodziłem ze spotkania, pisałem notatkę na telefonie, mówiłem sobie "odezwę się za 3 dni". Zgadnij ile razy rzeczywiście się odzywałem po 3 dniach.
Czasem tak. Częściej po tygodniu, z przeprosinami. Czasem temat po prostu ginął.
Przy 5 klientach to był koszt do opanowania. Przy 26 - to był chaos który kosztował mnie pieniądze. Nie widziałem tego bezpośrednio, ale temat który nie wróci w odpowiednim momencie to często temat który odpada.
Zbudowałem system. Opiszę jak działa.
Skąd wziął się problem
Mam 26 klientów aktywnych. To nie jest dużo jak na agencję, ale każdy z nich ma kilka wątków jednocześnie. Jasek Transport - controlling, mailing B2B, strona. Torro - e-learning, materiały dla partnerów. Kamena - komunikacja rajdowa, posty, raporty. I tak dalej.
Do każdego wysyłam maile. Część z nich wymaga odpowiedzi. Część to wiadomości, po których chcę wiedzieć czy dotarły i czy coś z nich wynikło. Część to propozycje, po których powinien paść jakiś ruch.
Problem z follow-upami jest prosty: nikt nie lubi ich wysyłać. Czujesz się natarczywy. Myślisz "może sami wrócą". Rzadko wracają.
A nawet jeśli chcesz wysyłać - musisz pamiętać kiedy wysłałeś, co dokładnie, do kogo, co czekasz na odpowiedź. Przy kilku wątkach jednocześnie to pełna etatowa praca.
Zdecydowałem że tego nie będę robił ręcznie.
Architektura w trzech warstwach
System składa się z trzech elementów:
alex_ai_contacts.json - plik z danymi każdego kontaktu. Imię, email, firma, historia interakcji, i - to ważne - pole `corrections`. Do tego wrócimy.
followup_history.db - baza SQLite. Każdy wysłany mail wchodzi do tej bazy razem z datą i statusem. Kiedy przychodzi czas na follow-up, skrypt sprawdza bazę i wie co już zostało wysłane.
Google Sheets - zakładka "Follow-upy". To jest mój interfejs roboczy. Dodaję tam tematy które wymagają śledzenia, zapisuję statusy, i - co najważniejsze - piszę "Alex wyślij follow-up" gdy chcę żeby Alex AI sam sformułował i wysłał przypomnienie.
Trzy warstwy, trzy funkcje. Baza danych pilnuje historii. Sheets pilnuje tego co aktywne. Alex AI pilnuje żebym nie musiał pamiętać.
Google Sheets jako interfejs
Mogłem zrobić dedykowaną aplikację. Rozważałem to. Skończyłem na Sheets bo wszyscy go znają, działa na telefonie i nie wymaga ode mnie żadnego utrzymania.
Zakładka "Follow-upy" ma kolumny:
- Kontakt - do kogo
- Temat - co
- Data wysłania - kiedy poszedł oryginalny mail
- Status - tu wpisuję co się dzieje: "czekam na odpowiedź", "Alex wyślij follow-up", "Załatwione", "Zrezygnuj"
- Uwagi - notatki dla mnie
Praca wygląda tak: wysyłam mail do klienta, dodaję wiersz do Sheets, wpisuję "czekam na odpowiedź". Po 3 dniach jeśli nie ma odzewu - zmieniam status na "Alex wyślij follow-up". Alex wysyła i zmienia status na "wysłano follow-up 1".
Wiersze ze statusem "Załatwione" i "Zrezygnuj" są usuwane z arkusza automatycznie po przetworzeniu - zostają w bazie historycznej, ale nie zaśmiecają widoku roboczego.
Efekt: w Sheets widzę tylko aktywne tematy. Żadnych zamkniętych spraw zalegających w widoku.
Alex AI wysyła sam
Skrypt `followup_status_db.py` uruchamiam raz dziennie. Robi cztery rzeczy:
1. Odczytuje Google Sheet 2. Zapisuje statusy do `followup_history.db` 3. Dla wierszy z "Alex wyślij follow-up" - wysyła maile 4. Usuwa z arkusza wiersze "Załatwione" i "Zrezygnuj"
"Wysyła maile" oznacza że Alex AI - mój asystent emailowy działający z adresu alex.ai@idea4me.pl - formułuje wiadomość i wysyła ją z odpowiednimi nagłówkami `In-Reply-To` i `References`, żeby mail wpadał do istniejącego wątku. Odbiorca widzi kontynuację rozmowy, nie nową wiadomość od obcego adresu.
Każdy follow-up jest oddzielny. Alex nie wysyła masowego przypomnienia do wszystkich - wysyła do każdej osoby osobno, z kontekstem który zna z pliku kontaktów.
Po wysłaniu: `add_followup()` zapisuje wpis do bazy. System wie że pierwszy follow-up poszedł. Jeśli dalej nie ma odpowiedzi i znów wpiszę "Alex wyślij follow-up" - wysyła drugi. Po dwóch follow-upach temat oznaczam jako "Zrezygnuj" - dalsze gonienie nie ma sensu.
Maksymalnie dwa follow-upy na temat. To wystarczy żeby sprawdzić czy klient jest zainteresowany. Jeśli po dwóch przypomnieniach cisza - odpowiedź jest też odpowiedzią.
Szerzej o tym jak działa sam Alex AI - napisałem o tym wcześniej.
Corrections - co wiem o każdym kontakcie
W `alex_ai_contacts.json` każdy kontakt ma pole `corrections`. To jest lista rzeczy których Alex musi pamiętać przy pisaniu do tej osoby.
Kilka przykładów z rzeczywistości:
- jeden klient nie lubi gdy piszę "w nawiązaniu do naszej rozmowy" - wyznał mi przy spotkaniu że to brzmi dla niego sztywno
- do innego zawsze piszę z CC do jego asystentki, bo bez tego maile giną
- do jednej osoby zwracam się per "Panie Marku" mimo że znamy się od lat - sam mnie o to poprosił
- do kilku osób nie używam słowa "zoptymalizować" - to ich irytuje
Brzmi jak drobiazg. Ale właśnie te drobiazgi decydują o tym czy mail wygląda jakbyś go pisał do konkretnej osoby, czy jakbyś kopiował szablon.
Pole `corrections` czytam przed napisaniem każdego maila do tego kontaktu. Alex też. Dlatego maile nie brzmią jak generyczne przypomnienia z CRMu.
Liczby po roku
System działa od marca 2025. Kilka danych:
- 184 maile wysłane przez Alex AI łącznie (nie tylko follow-upy - wszystkie)
- Wskaźnik odpowiedzi na follow-upy: ok. 40%. Na 10 wysłanych przypomnień 4 kończyły się odpowiedzią lub działaniem.
- Tematy które zamknąłem przez "Zrezygnuj": 23. Tyle razy zdecydowałem że dalsze gonienie nie ma sensu.
- Tematy reaktywowane po follow-upie: 17. Czyli klienci którzy wrócili tylko dlatego że im przypomniałem.
17 tematów reaktywowanych. Gdyby każdy z nich kosztował mnie tylko jedną rozmowę o wartości 2 tys. zł - to 34 tys. zł które w poprzednim systemie (głowa + notatki na telefonie) po prostu bym stracił.
To nie jest hipotetyczne. Te tematy istniały. Były w arkuszu. Wróciły po follow-upie.
Co nie wyszło
System ma wady.
Po pierwsze: ręczne dodawanie. Nadal muszę pamiętać żeby dodać temat do Sheets. System pilnuje tego co w arkuszu. Jeśli nie wpisałem tematu - system nie wie że istnieje. Kilka razy wysłałem mail i zapomniałem go zalogować. Wątek zaginął.
Rozwiązanie w budowie: IMAP watcher który flaguje maile wysłane przez Alexa i automatycznie proponuje dodanie do "Follow-upy". Jeszcze nie działa.
Po drugie: OAuth wygasa. Google Sheets ma opóźnienia przy autoryzacji. Raz na jakiś czas token OAuth wygasa i skrypt się sypie. Przez kilka dni nie zauważyłem, a follow-upy nie szły. Zbudowałem monitoring który wysyła mi alert gdy skrypt nie zaloguje żadnej aktywności przez 48h.
Po trzecie: dwa follow-upy to za mało dla dużych spraw. Jeśli temat jest duży i klient ma długi cykl decyzyjny - czasem warto napisać po miesiącu, nie po tygodniu. Aktualnie robię to ręcznie. Myślę o dodaniu pola "data następnego kontaktu" w Sheets.
Żaden z tych problemów nie jest blokujący. Ale piszę o nich dlatego że każdy "system" ma swoje wyjątki, i lepiej to powiedzieć wprost niż udawać że wszystko działa idealnie.
Jak to zbudowałem - dla tych co chcą wiedzieć
Nie ma gotowego narzędzia które robi dokładnie to. Próbowałem kilku:
Pipedrive, HubSpot - za duże, za drogie jak na to czego potrzebuję, za dużo klikania.
Streak w Gmail - niezłe, ale mam własny email server (poczta.idea4me.pl) i integracja jest kłopotliwa.
Reminderly, Boomerang - dobre do prostych przypomnień, ale nie integrują się z moim systemem kontaktów.
Skończyłem na własnym rozwiązaniu: Python + SQLite + Google Sheets API + smtplib. Łącznie ok. 400 linii kodu. Niezbyt eleganckie, ale robi dokładnie to czego potrzebuję - i nic więcej.
Baza kontaktów którą mam w `alex_ai_contacts.json` to nie jest tylko follow-up. To ten sam plik który napędza mój system RAG i mailing B2B dla klientów. System follow-upów jest jedną z warstw, nie oddzielną aplikacją.
Czy warto budować coś takiego od zera
Dla firmy 2-3 osoby z kilkoma klientami: prawdopodobnie nie. Wystarczy Notion z przypomnieniami, Trello z automatyzacją Zapiera, albo zwykłe Google Sheets bez skryptów.
Próg rentowności jest gdzieś koło 15-20 aktywnych wątków jednocześnie. Poniżej - narzut na budowanie i utrzymanie własnego systemu nie zwraca się. Powyżej - każde narzędzie gotowe albo jest za drogie, albo nie pasuje do twojego workflow.
Jeśli jesteś w przedziale 20-50 kontaktów i płacisz za CRM który w połowie nie używasz - warto policzyć co ci tak naprawdę potrzebne.
Słownik pojęć
- Follow-up
- Wiadomość wysyłana po braku odpowiedzi na wcześniejszy mail. Jej celem jest przypomnienie o temacie, nie ponowienie oferty od zera.
- SQLite
- Lekka baza danych zapisywana jako jeden plik na dysku. Nie wymaga serwera, idealny do lokalnych narzędzi i skryptów.
- IMAP
- Protokół dostępu do skrzynki email przez serwer. Umożliwia odczyt, wyszukiwanie i flagowanie wiadomości z poziomu skryptu.
- OAuth
- Standard autoryzacji używany przez Google. Skrypt dostaje tymczasowy token zamiast hasła. Token wygasa i trzeba go odnawiać.
- Corrections
- Pole w bazie kontaktów przechowujące indywidualne zasady komunikacji z daną osobą - preferowane zwroty, osoby w CC, tematy których unikać.
Co mogę dla ciebie zrobić
Jeśli masz podobny problem - zbyt wiele wątków, zbyt mało czasu żeby je pilnować - chętnie pogadam o tym jak to wygląda w twojej firmie.
Nie każdy potrzebuje własnego systemu. Czasem wystarczy lepszy CRM. Czasem mały skrypt automatyzujący to co już masz. Czasem wystarczy zmienić workflow.
Napisz: j.cybulski@idea4me.pl
