Agentfitness.pl to aplikacja webowa, którą zbudowałem dla właściciela klubu fitness. Problem był prosty: w systemie, którego klub używał do kart wejść i karnetów, brakowało jednej rzeczy — widoku, który powie właścicielowi, kto przestał przychodzić i komu warto wysłać przypomnienie, zanim zrezygnuje z członkostwa. Dorzuciłem też drugi moduł, który na bazie eksportów z Excela liczy pensje instruktorom. Opowiem, jak to wszystko spięte.
Problem biznesowy klubu
Klub fitness żyje z tego, że karnet się odnawia. Jeśli klient przestaje przychodzić, z dużym prawdopodobieństwem nie przedłuży — a właściciel dowiaduje się o tym dopiero w miesiącu, w którym pieniądze nie wpływają. Za późno.
System, z którego klub już korzystał, zbiera dane o wejściach na salę, ale nie raportuje ich w formie, która byłaby przydatna do decyzji biznesowych. Dostajesz surowy plik Excela i musisz go sam przeanalizować. W praktyce nikt tego nie robi, bo nie ma na to czasu.
Właściciel potrzebował aplikacji, która:
- Przyjmie eksport z istniejącego systemu (Excel),
- Pokaże, kto z klientów przestał przychodzić,
- Pozwoli jednym kliknięciem wysłać do nich SMS z przypomnieniem,
- Zmierzy konwersję tych SMS-ów, żeby wiadomo było, czy to działa.
I tak powstał Agentfitness.pl.
Jak klient się rejestruje w systemie
Cały obieg danych jest zbudowany wokół importu raportów. Klub fitness regularnie eksportuje ze swojego głównego systemu plik Excela z aktywnością klientów — imię, nazwisko, daty wejść na salę w ostatnich dniach. Ten plik wrzuca się bezpośrednio do Agentfitness.
Po imporcie aplikacja:
- parsuje arkusz i wrzuca rekordy do bazy,
- liczy, ile osób było aktywnych w tym tygodniu względem poprzedniego,
- na dashboardzie pokazuje przyrost albo spadek liczby aktywnych klientów,
- aktualizuje zakładkę Aktywność, w której każdy klient ma swoją ścieżkę z ostatnich pięciu tygodni.
Widok aktywności to serce aplikacji. Każdy klient to jeden wiersz, a obok niego pięć bloczków — po jednym na tydzień. Zielony bloczek znaczy, że klient był w tym tygodniu na sali. Czerwony — że go nie było. Na pierwszy rzut oka widać, kto regularnie przychodzi, kto się waha, a kto już praktycznie zniknął.
Całe UI jest zaprojektowane tak, żeby właściciel klubu w dwie minuty wiedział, na kogo się zamachnąć z kampanią SMS. Nie ma żadnego drążenia w tabelach — wchodzi, widzi czerwone bloczki, klika.
Powiadomienia SMS z automatycznym dopasowaniem treści
Najważniejsza funkcjonalność biznesowa. Jeśli klient nie był na sali przez tydzień albo dwa, właściciel może wysłać mu SMS z przypomnieniem. Ale nie ma sensu wysyłać takiego samego komunikatu komuś, kogo nie było tydzień, i komuś, kogo nie widzieliśmy przez miesiąc — to zupełnie inne sytuacje i inny ton wiadomości.
Dlatego aplikacja pozwala przygotować szablony SMS-ów osobno dla każdego okresu bezczynności:
- szablon dla klientów nieobecnych 1 tydzień — łagodne przypomnienie,
- szablon dla nieobecnych 2 tygodnie — mocniejszy akcent, ewentualna oferta,
- szablon dla nieobecnych 3+ tygodnie — komunikat „wracaj, bo kończy ci się karnet”.
Podczas wysyłki system sam sprawdza, ile dokładnie tygodni klient był nieobecny, i dopasowuje odpowiedni szablon. Właściciel klubu nie musi ręcznie segregować listy odbiorców — wciska przycisk, a Agentfitness sam rozsyła każdemu klientowi SMS dopasowany do jego sytuacji.
Sama wysyłka idzie przez integrację z zewnętrznym bramą SMS-ową (SerwerSMS.pl) — REST API, autoryzacja tokenem, kolejkowanie wysyłek po stronie Agentfitness, żeby nie zabić API jednym uderzeniem kilkuset wiadomości.
Statystyki i mierzenie konwersji kampanii
Wysyłka SMS-ów to jedno. Drugie — odpowiedź na pytanie: czy to w ogóle działa? Dlatego w aplikacji jest moduł statystyk, który dla każdej kampanii SMS liczy:
- ile wiadomości zostało wysłanych,
- ilu klientów z tej grupy wróciło do klubu w ciągu ustalonego okresu (np. 7 dni po wysyłce),
- jaka jest realna konwersja procentowa,
- ile kampania kosztowała (cena SMS-a × liczba wysłanych).
W praktyce wygląda to tak: właściciel wysyła 15 SMS-ów do klientów, którzy nie byli w klubie od tygodnia. Po kilku dniach Agentfitness sprawdza, którzy z tych 15 ponownie pojawili się na sali. Jeśli 4 — konwersja wynosi 27%. Właściciel od razu widzi, że dla tej grupy szablon działa, a może warto go skopiować i przetestować mocniejszy wariant.
Dodatkowo dashboard pokazuje aktywność klubu w przedziale czasu — krzywą liczby aktywnych klientów w ostatnich tygodniach/miesiącach. Właściciel dostaje wykres, po którym poznaje sezonowość i efekty swoich działań marketingowych.
Bez modułu konwersji właściciel wysyłałby SMS-y „na oko" i nigdy nie dowiedziałby się, czy to zadziałało. Z nim — widzi dokładnie, ile kampania kosztowała i ile klientów realnie wróciło. To różnica między marketingiem a wróżeniem z fusów.
Rozliczanie pensji instruktorów z Excela
Drugi moduł aplikacji — nie tak spektakularny jak SMS-y, ale od niego robi się u właściciela sporo roboczogodzin w miesiącu. Klub rozlicza instruktorów na podstawie czasu pracy. System kas generuje miesięczny raport w Excelu, w którym każdy instruktor ma zsumowane godziny. Tyle że do tego trzeba jeszcze nałożyć stawkę godzinową, bonusy, ewentualne premie i wydać z tego listę płac.
Agentfitness przyjmuje ten raport, parsuje wiersze, dopasowuje instruktorów do zdefiniowanych w systemie stawek i liczy wynagrodzenie za miesiąc. Zamiast ręcznego kalkulatora raz w miesiącu — jedno kliknięcie i gotowy wydruk.
Stos i architektura
Aplikacja jest zbudowana na klasycznym stosie .NET:
- ASP.NET Core MVC jako warstwa prezentacji i API,
- Entity Framework Core do pracy z bazą (MSSQL),
- parser Excela (ClosedXML) do importu raportów z głównego systemu klubu,
- integracja REST z SerwerSMS.pl jako bramą SMS-ową,
- Razor + Bootstrap na froncie — prosty, ale funkcjonalny panel.
Architektura jest warstwowa: kontrolery trzymają się cienko, całość logiki biznesowej (liczenie aktywności, dobór szablonu SMS, liczenie konwersji, kalkulacja pensji) siedzi w serwisach. Dependency Injection spina to w całość, a kod jest wydzielony na tyle, że wymiana bramy SMS-owej albo źródła danych o aktywnościach sprowadza się do napisania nowej implementacji interfejsu.
Logowanie jest przez własną warstwę autoryzacji — aplikacja ma dziś jednego użytkownika (właściciela klubu), więc nie było potrzeby pchać się w Identity Server. Sesja, ciasteczka, prosta walidacja hasła — tyle wystarczy.
Zobacz więcej
Agentfitness pokazuje coś, co często widzę u małych i średnich firm: system, z którego już korzystają, obsługuje 80% potrzeb, ale brakuje w nim jednej konkretnej rzeczy, która realnie przekłada się na pieniądze. Wtedy nie ma co od razu wywalać całego softu — wystarczy dolepić do niego małą aplikację z konkretną funkcją.
Jeśli masz podobny problem u siebie (eksport z CSV/Excela, konieczność mierzenia czegoś, integracja z SMS-em albo mailem) — dobra, dedykowana aplikacja nadbudowana na istniejącym systemie potrafi się spiąć finansowo w kilka miesięcy. Po inne realizacje portfolio zajrzyj do sekcji wpisów — opisuję tam kolejne przypadki z podobnej półki.
