Mutterbox — analiza opinii klientów z raportem PDF
Właściciel hotelu albo aquaparku ma pod obiektem kilka tysięcy opinii i żadnego sposobu, żeby dowiedzieć się z nich czegoś konkretnego. Średnia ocena nic nie mówi, a przeczytanie wszystkiego to tydzień pracy. Mutterbox czyta je za niego i zwraca listę powtarzalnych problemów — każdy z cytatami ze źródła, nie z podsumowania.
Skąd się wziął
Problem jest banalny do opisania i trudny do rozwiązania: opinie o obiekcie leżą w czterech różnych serwisach, w liczbie, której nikt nie przeczyta, i w formie, z której nie da się nic policzyć. Właściciel wie, że „coś jest nie tak z recepcją", ale nie wie, czy to trzy osoby, czy trzysta.
Pierwsze podejście zakładało prostą klasyfikację i wykres. Okazało się bezużyteczne — wykres pokazywał, że 18% opinii dotyczy obsługi, i nikt nie wiedział, co z tym zrobić. Wartość leży nie w liczbie, tylko w zdaniu, które klient naprawdę napisał. Dlatego każda karta problemu w raporcie nosi cytaty wycięte z oryginałów, a nie parafrazy.
Druga rzecz, która wyszła dopiero na prawdziwych danych: opinie z różnych serwisów opisują to samo innymi słowami. Zbudowanie wspólnego słownika okazało się większą częścią pracy niż sama analiza.
Co trzeba było rozwiązać
Cztery problemy, które wyznaczyły architekturę
Oficjalne API zwraca maksymalnie pięć pozycji. Pełny zbiór trzeba pobierać zewnętrznym aktorem, co znaczy: koszt na obiekt i format, którego nie kontrolujesz.
Przy tysiącach opinii rachunek rośnie szybciej niż wartość. Zadania trafiają więc do różnych modeli: tani do klasyfikacji, mocniejszy tylko do syntezy i weryfikacji.
Przy produkcie wielofirmowym to nie jest funkcja, tylko warunek istnienia. Izolacja stoi na dwóch niezależnych warstwach, a nie na pamiętaniu o WHERE w zapytaniu.
Klient wysyła go dalej — zarządowi, załodze, właścicielowi. To znaczy PDF ze składem, a nie wydruk strony internetowej.
Mechanizm
Z czego to jest zbudowane
Bez kluczy API produkt działa w całości — na korpusie demonstracyjnym i analizie słownikowej. To ten sam kod, tylko inna implementacja za interfejsem.
Symfony 7.4 i Doctrine
Konta, organizacje, role, zaproszenia, logowanie dwuskładnikowe, kolejka i harmonogram.
Router zadań do modelu
Każde zadanie idzie do modelu dobranego pod koszt i trudność. Zejście na dostawcę zastępczego zapisuje się w logu, żeby nie dało się go przeoczyć.
Koszt liczony przy każdym przebiegu
Rachunek za analizę widać w panelu od pierwszego dnia. Bez tego marża na raporcie jest zgadywana.
Raport HTML, PDF i CSV
Plus link do udostępnienia i eksport danych. Skład PDF w czystym PHP, bez zależności od przeglądarki na serwerze.
Stripe z kredytami i limitami
Bez skonfigurowanych płatności limity po prostu nie obowiązują — produkt nadal działa w całości.
Dwie warstwy izolacji najemców
Filtr na poziomie zapytań i osobne sprawdzenie dostępu, plus automatyczny test przechodzący po wszystkich trasach.
Wnioski z projektu
Tryb demonstracyjny doklejony obok produktu to pułapka. Pierwsza wersja miała osobną ścieżkę „demo" i zaczęła się rozjeżdżać z prawdziwą po dwóch tygodniach. Teraz kod jest jeden, a zmienia się tylko implementacja za interfejsem — dzięki temu nie ma czegoś takiego jak „działa w demo, nie działa u klienta".
Największym błędem było zostawienie na witrynie zdań o wersji demonstracyjnej. Przez dłuższy czas pod każdą podstroną, łącznie z regulaminem, wisiał komunikat „wersja demonstracyjna". To jest zdanie, które mówi odwiedzającemu „nie kupuj tego jeszcze" — i mówiło je długo po tym, jak produkt był gotowy.
Karty przykładowe na landingu były nieproporcjonalne. Karta problemu miała około 650 pikseli wysokości i stała naprzeciwko akapitu o wysokości 200. Wzrok szedł do ilustracji zamiast do argumentu. Lekcja: element pokazowy ma pokazać kształt, a nie odtworzyć cały raport.
Cztery rzeczy, które przenoszę dalej
Policz koszt operacji od pierwszego dnia
Jeśli produkt wywołuje model językowy, koszt pojedynczego przebiegu musi być widoczny w panelu, zanim pojawi się pierwszy płacący klient. Inaczej marżę poznajesz z faktury na koniec miesiąca.
Zbuduj wersję działającą bez kluczy API
Nie jako demo obok produktu, tylko jako zastępnik za tym samym interfejsem. Skraca wdrożenie u nowej osoby do jednej komendy i wyłapuje błędy, które w trybie „prawdziwym" chowają się za kosztem.
Izolację danych oprzyj na dwóch warstwach
Jedna zawsze kiedyś zawiedzie, bo ktoś napisze zapytanie z pominięciem filtra. Do tego test, który przechodzi po wszystkich trasach i sprawdza, czy najemca widzi tylko swoje.
Wyczyść komunikaty rozwojowe, zanim ruszysz ze sprzedażą
Zdania o wersji demonstracyjnej, notatki dla siebie w podpisach ilustracji, teksty pisane językiem dokumentacji wewnętrznej. Odwiedzający czyta je dosłownie.
Budujesz produkt? Porozmawiajmy
Multi-tenant, koszty modeli, skład PDF bez przeglądarki na serwerze, płatności, które muszą dać się wyłączyć. Opisz, gdzie stoisz.
Umów rozmowę