Parametry rankingu
Restauratorzy korzystający z Feasty mają prawo wiedzieć, jak ich lokale są pozycjonowane na mapie, w wyszukiwarce i w trybie matchmakera. Ten dokument opisuje wszystkie parametry rankingu oraz ich relatywną wagę zgodnie z art. 5 Rozporządzenia UE 2019/1150 (P2B).
1. Główne parametry rankingu
Każda restauracja w bazie Feasty ma agregowany zbiór sygnałów. Algorytm łączy je multiplikatywnie z domyślnym
sortowaniem po jakości (dominantTier) i odległości (geohash query). Wszystkie pola są dostępne
publicznie (z wyjątkiem oznaczonych jako server-only).
| Parametr | Charakter | Źródło danych |
|---|---|---|
restaurantStats.dominantTier |
Główny sygnał jakości | Weighted-mean tier z recencją (Scoring v2 — patrz §2 niżej) |
restaurantStats.scoreNumericAvg |
Liczba 0–10 (panel B2B) | Regenerowane przez callable requestRestaurantScoreRefresh (co 7 dni / cron 30 dni) |
restaurantStats.ratingsCount |
Tie-break + Proof of Work cap (§3) | Publiczny counter recenzji |
| Bliskość geograficzna | Hard filter (mapa, matchmaker) | Geohash query po lat/lng restauracji |
restaurantStats.trendingScore |
Boost recency | Counter malejący w czasie (proporcjonalny do świeżych recenzji) |
inMembersLists (matchmaker) |
Boost społeczny | Query po listach członków sesji matchmakera |
restaurantStats.isPromoted |
Sponsored — osobny bucket z etykietą "Reklama" | Wymaga b2bSettings.tier == 'premium' + active campaign w adPlacements/* |
1.1. Feed „Odkrywaj" — kolejność treści użytkowników
Od 24 sierpnia 2026 r. zakładka „Odkrywaj" w aplikacji nie jest już czystą osią czasu: porządkuje recenzje użytkowników automatycznym wzorem. Recenzja dotyczy konkretnej restauracji, więc kolejność wpływa pośrednio na jej widoczność — dlatego parametry ujawniamy tu razem z pozostałymi, mimo że rankingowi podlega treść użytkownika, a nie lokal.
| Parametr | Charakter | Waga |
|---|---|---|
| Relacja autora z odbiorcą | Główny sygnał | ×3,0 osoba obserwowana · ×1,6–2,0 osoba obserwowana przez obserwowanych · ×1,0 pozostali |
| Oznaczenie osoby, którą obserwuje odbiorca | Sygnał z grafu odbiorcy | Relacja liczona co najmniej jako ×2,0, gdy autor oznaczył w recenzji osobę obserwowaną przez odbiorcę — nie sumuje się z relacją autora (liczy się wyższa z dwóch) |
| Polubienia recenzji | Sygnał społeczny | Mnożnik (1 + liczba polubień) |
| Wiek wpisu | Spadek z czasem | Dzielenie przez (wiek w godzinach + 2)^1,4 |
| Zgodność miasta lokalu z miastem odbiorcy | Boost lokalny | ×1,3 |
isPromoted ani żadnego innego parametru płatnego —
treści sponsorowane mają osobny bucket z etykietą „Reklama" (§4) i nie mogą wpływać na kolejność organiczną.
Nie ma też profilowania: wzór nie korzysta z historii przeglądania, czasu spędzonego na treści ani z modelu
preferencji odbiorcy. Wynik liczony jest przy otwarciu feedu i nie jest nigdzie zapisywany.
Odbiorca może w każdej chwili przełączyć się na zakładkę „Zaufani”, która pokazuje wyłącznie osoby obserwowane
w porządku chronologicznym — bez rankingu.
2. Wagi recenzji (Scoring v2)
Każda recenzja kontrybuuje do bucketu swojego tieru z wagą obliczoną multiplikatywnie z poniższych sygnałów.
Floor i ceiling są stosowane na poziomie authorWeight (0.3 – 2.0) oraz recencyMul
(floor 0.15).
| Sygnał | Wartość multiplikatora |
|---|---|
| Wiek konta autora | <7 dni → ×0.6 · 7–30 dni → ×0.85 · ≥30 dni → ×1.0 |
| Obserwujący autora | 0 → ×0.8 · 1–9 → ×0.9 · ≥10 → ×1.0 |
| Lifetime recenzji autora | <5 → ×0.7 · 5–19 → ×0.85 · ≥20 → ×1.0 |
| Low-variance flag (autor prawie zawsze ten sam tier) | ×0.5 |
| Prestige autora | Standard → ×1.0 · Elite → ×1.5 · Connoisseur → ×2.0 |
| Wiek recenzji (half-life 180 dni) | max(0.15, 0.5 ^ (ageDays / 180)) |
3. Cap Proof of Work (ratingsCount < 10 → tier ograniczony do A)
Niezależnie od średniej, restauracja z mniejszą niż 10 recenzji nie może wyświetlać się jako S lub S+. Tier jest capowany do A dopóki próg nie zostanie przekroczony.
Uzasadnienie: Pojedynczy 5-gwiazdkowy głos (nawet od Connoisseura) nie powinien wynosić lokalu do statusu "elite". Tier musi być zasłużony przez powtarzalną zgodność wielu recenzentów. Ten cap chroni przed manipulacją oraz przypadkowym wybijaniem nowo otwartych lokali bez wystarczającego sample size.
4. Sponsored — etykietowanie i pozycjonowanie
Każda restauracja wyświetlana z isPromoted == true ma obowiązkową etykietę "Reklama"
widoczną w pierwszym frame'u. Etykieta jest jednolita w całej aplikacji — nie używamy wariantów
"Promowane", "Polecane", "Top wybór" ani innych nieczytelnych form.
- Wizualnie: sponsored entries są w osobnej sekcji albo na pierwszej pozycji viewportu, nigdy "wymieszane" z organic results bez label.
- Opt-out: user może wyłączyć sponsored results w ustawieniach (
users/{uid}.uiPrefs.hidePromoted). Po wyłączeniu queries pomijająisPromoted == true. - Audit trail: wszystkie kampanie są logowane w kolekcji
adPlacements/*z retencją 6 lat (PL termin przedawnienia roszczeń handlowych).
Podstawa prawna: art. 5 ust. 2 P2B (UE 2019/1150) + art. 26 Aktu o usługach cyfrowych (DSA).
5. Procedura zmian algorytmu (15-dniowy notice)
Każda merytoryczna zmiana parametrów rankingu lub ich wag MUSI zostać ogłoszona z co najmniej 15-dniowym wyprzedzeniem przed wdrożeniem, zgodnie z art. 3 ust. 2 P2B.
Mechanizm techniczny: konfiguracja config/rankingAlgorithm.{version, activeFrom, params} z
server-side cronem respektującym activeFrom. Restauratorzy otrzymują:
- In-app notification w panelu B2B (
https://business.feasty.com.pl) — sekcja "Ogłoszenia" - Email z 15-dniowym terminem na adres właściciela konta
- Update tej strony z nową wersją (changelog poniżej) i datą wejścia w życie
Changelog wersji
| Wersja | Aktywna od | Główne zmiany |
|---|---|---|
v2.0 |
15 września 2026 | Korekta opisu, ranking bez zmian: usunięty czynnik ×1.2 za „wizytę zweryfikowaną” — nic nie zapisywało metody weryfikacji, więc nigdy nie działał; poprawiona podstawa 15-dniowego wyprzedzenia (art. 3 ust. 2 P2B) i tryb odwołania (panel restauratora). |
v2.0 |
17 maja 2026 | Scoring v2 launch — recency × authorWeight × tierToScore (półokres 180 dni), Prestige multipliery (Elite ×1.5 / Connoisseur ×2.0), verified visit ×1.2. PoW cap przeniesiony do applyProofOfWorkCap. Closed-beta MVP exemption: 15-dniowy notice pominięty bo zero live B2B users at launch. |
v1.0 |
marzec 2026 | Initial release — modal dominant tier + counter ratingsCount + geohash distance. |
6. Anti-manipulation
Algorytm jest chroniony przez wiele warstw mechanizmów chroniących przed manipulacją:
- Rate limity na recenzje per user (dzienny / tygodniowy / miesięczny cap)
- Tier distribution caps per user (max 20% S+, max 40% S+S łącznie — nie można "rozdawać" same szóstek)
- Low-variance flag obniża wagę autora który prawie zawsze ocenia tym samym tierem (×0.5)
- Server-only
authorWeight— wartość jest niewidoczna dla klienta i recenzenta - Prestige z cyklicznego cronu — nie da się "kupić" tieru autora, jest funkcją historii recenzji
- Flagged review exclusion — recenzje oznaczone (moderation, DSA Art. 17) nie kontrybuują
- Deterministic review IDs (
${uid}_${placeId}) — jeden user = jedna recenzja per lokal
7. Odwołania (DSA Art. 20)
Restauratorzy mają prawo odwołać się od każdej decyzji algorytmu, która ma negatywny wpływ na widoczność lokalu (np. obniżenie tieru, ukrycie, suspension B2B).
- Wewnętrzna procedura: zawieszenie konta — odwołanie w panelu restauratora (zakładka „Odwołanie”), odpowiedź w ciągu 14 dni; w innych sprawach — contact@feasty.com.pl
- Mediatorzy (art. 12 P2B — co najmniej dwóch poza sądem):
- Centrum Mediacji Sądu Polubownego przy UOKiK (Warszawa, Plac Powstańców Warszawy 1)
- Sąd Arbitrażowy przy Krajowej Izbie Gospodarczej (Warszawa)
- Sąd właściwy: sąd właściwy miejscowo dla siedziby pozwanego (Operator: Polska)