Agentfitness.pl — monitoring aktywności klientów w klubie fitness

Case study aplikacji Agentfitness.pl — web app dla właściciela klubu fitness, która śledzi aktywność klientów, wysyła kampanie SMS i liczy pensje instruktorów.

JAJarosław Armatys 6 min czytania
Wersja wideo tego wpisu — obejrzyj na YouTube

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:

  1. Przyjmie eksport z istniejącego systemu (Excel),
  2. Pokaże, kto z klientów przestał przychodzić,
  3. Pozwoli jednym kliknięciem wysłać do nich SMS z przypomnieniem,
  4. 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.

Tagi:#portfolio#dotnet#fitness#sms#case-study

Masz pytanie do tego wpisu?

Napisz do mnie — chętnie porozmawiam o szczegółach technicznych, albo o tym jak zastosować to u Ciebie w projekcie.