This is the full developer documentation for Sportigio # Baza wiedzy Sportigio > Scenariusze krok po kroku dla klubu. Każdy opisany w panelu i przez API, sprawdzony na klubie demo. ## Wybierz obszar [Dział zatytułowany „Wybierz obszar”](#wybierz-obszar) [Strona WWWPublikacja, wygląd, strona główna z sekcji, menu i podstrony.6 scenariuszy](/website/publish/)[SponsorzyKategorie sponsorów, logotypy, kolejność i podstrona partnerów.1 scenariusz](/content/sponsors/)[SklepZamówienia, maile do kupujących, wiadomości do wielu kupujących i VAT.4 scenariusze](/earn/store-orders/) Sprzedaż biletówWydarzenie, rodzaje biletów, plan miejsc, karnety i skanowanie.W przygotowaniu AkademiaNabór, grupy treningowe, składki, zgody i portal rodzica.W przygotowaniu Pakiety wsparciaPakiety członkowskie (subskrypcje), portal wspierającego i zbiórki.W przygotowaniu ## Zacznij tutaj [Dział zatytułowany „Zacznij tutaj”](#zacznij-tutaj) [Pierwsze kroki w panelu](/getting-started/first-steps/)Logowanie, nazwa klubu, logo, kolory, media społecznościowe. [Jak korzystać z tej bazy](/getting-started/how-to-use/)Układ stron, oznaczenia planów, ścieżki w panelu, sekcja dla agentów AI. [Dodaj pierwszą aktualność](/content/news/)Artykuł z okładką, przypięcie do slidera, galeria i wideo. [Podłącz asystenta AI do klubu](/getting-started/connect-ai/)Claude Code, Codex i Cursor przez MCP oraz zakres integracji ChatGPT. ## Dla agentów AI [Dział zatytułowany „Dla agentów AI”](#dla-agentów-ai) Ta baza jest też źródłem dla agenta AI Sportigio i dla narzędzi MCP. Mapa “use case → narzędzie” i zasady pracy: [Dla agentów AI](/for-agents/overview/). Cały tekst bazy w jednym pliku dla modeli: [`/llms-full.txt`](/llms-full.txt). # Dodaj mecze i wyniki > Liga, sezon, rywale z herbami, terminarz, wpisywanie wyników, Centrum Meczowe i linki do biletów lub transmisji. * Scenariusz UC-008 * Plan każdy; synchronizacja z API rozgrywek zależnie od dyscypliny i planu * Czas 20 minut na pierwszy terminarz ## Cel [Dział zatytułowany „Cel”](#cel) Kibic widzi terminarz, ostatni wynik i odliczanie do najbliższego meczu na stronie, w profilu i w mailach, a klub wpisuje wynik w minutę po meczu. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Dyscyplina ustawiona w [Pierwszych krokach](/getting-started/first-steps/). * Lista rywali z herbami (PNG) i terminarz z datami, godzinami i miejscem. * Nowy klub ma już jedną ligę, jeden własny klub i jeden sezon. Zmień ich nazwy zamiast tworzyć nowe. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Treści > Mecze** (`/app/games`). Zakładki: **Przegląd** (najbliższy i ostatni mecz, forma), **Terminarz**, **Wyniki**, **Ustawienia**. 2. W **Ustawienia > Ligi** wejdź w kartę ligi: nazwij ją (np. “IV liga, gr. mazowiecka”), ustaw sezon, opcjonalnie adres tabeli albo synchronizację z API rozgrywek. 3. W tej samej karcie sekcja **Rywale**: dodaj przeciwników i wgraj ich herby. To jedyne miejsce na rywali - nie ma osobnej zakładki “Kluby”. 4. Wróć do **Mecze** i kliknij **+ Dodaj Mecz**: gospodarz, gość, data i godzina, kolejka, miejsce, liga i sezon. 5. Po meczu na karcie w **Przegląd** kliknij **Popraw wynik** albo wejdź w **Centrum Meczowe**: wynik, status (zaplanowany, trwa, zakończony, przełożony, anulowany), opis, skład, wydarzenia meczowe. 6. **Linki** przy meczu: bilety, transmisja, relacja, galeria - pokazują się na karcie meczu na stronie. **Udostępnij** daje grafikę i link, **Zmień datę** przekłada spotkanie. ![Mecze: przegląd](/_astro/admin-games.bNYgmPck_Z1zO3o.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Sekcja **Mecze** na stronie głównej pokazuje ostatnie wyniki i nadchodzące spotkania z herbami rywali. * Podstrony `/games` (terminarz), wyniki i tabela ligowa działają z menu. * Kibic dodaje mecz do kalendarza Google, Apple albo pliku ICS z karty meczu. * Najbliższy mecz pojawia się na Pulpicie panelu z odliczaniem. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | --------------------------------- | ------------------------------------------------------------------------------------------------------------- | | Własne drużyny i rywale | `list_clubs` (`is_my_team` oznacza własne) | | Nowy rywal | `create_club {name, color?, logo_url?, league_id?}` | | Herb rywala albo własnego klubu | `update_club {id, logo_url}` | | Nowy mecz | `create_game {home_id, guest_id, date_time "Y-m-d H:i:s", league_id, season_id, round?, venue?}` | | Wynik i status | `update_game {id, points_home, points_guest, status}` (`2` = zakończony, `91` = przełożony, `92` = anulowany) | | Linki na karcie meczu | `save_game_link`, `list_game_links`, `delete_game_link` | | Tabela ligowa | `get_standings` | | Fakty przed napisaniem zapowiedzi | `get_game_context {id}` | | Import terminarza z API rozgrywek | `search_games_api` → `configure_games_sync` | Terminarz, o który pyta kibic (“najbliższy mecz”): `list_games {scope: "upcoming"}`. Nigdy nie podawaj nazwy własnego klubu w `search` - wynik będzie pusty. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Bez rywala nie dodasz meczu.** Rywal musi istnieć w lidze przed spotkaniem. * **Rywal bez herbu dostaje kolorowy placeholder z inicjałami** - lepsze niż pusty kwadrat, ale herb warto dodać, bo pokazuje się na kartach, w sliderze i w grafikach do udostępnienia. * **Status “zakończony” trzeba ustawić.** Sam wynik bez statusu zostawia mecz jako zaplanowany w części widoków. * Data w API to zawsze `Y-m-d H:i:s` w strefie klubu. * Synchronizacja z API rozgrywek działa dla wybranych dyscyplin i lig; ręczny terminarz działa zawsze. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Dodaj kadrę](/content/squad/) * [Dodaj aktualność](/content/news/) (zapowiedzi i relacje z `game_id`) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) # Dodaj aktualność > Artykuł, galeria lub wideo z okładką, tagami, przypięciem do slidera i planowaną publikacją. * Scenariusz UC-007 * Plan każdy; auto-tagowanie AI i filtry tagów od PRO * Czas 10 minut ## Cel [Dział zatytułowany „Cel”](#cel) Klub publikuje wpis z okładką, który pojawia się w sekcji aktualności, w sliderze na górze strony i w profilu, bez zależności od algorytmu Facebooka. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Tytuł i kilka akapitów treści. Jedna myśl na akapit. * Okładka pozioma (16:9). Zdjęcie pionowe zostanie wpasowane z rozmytym tłem. * Dla wideo: link do YouTube. Dla galerii: zdjęcia z dysku. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Treści > Aktualności** (`/app/posts`). Zakładki: **Wszystkie**, **Przypięte** (slider), **Zaplanowane**, **Analiza** (odsłony). 2. Kliknij **+ Dodaj post** albo kafel **Nowy Post**. 3. Wybierz typ: artykuł, galeria, wideo. Można je łączyć w jednym wpisie. 4. Wpisz tytuł, krótki opis (zajawka na kartach) i treść. **Redaktor AI** w prawej kolumnie pomaga napisać albo skrócić tekst. 5. Wgraj **okładkę**. Wpis o konkretnym meczu może dostać okładkę z herbami obu drużyn generowaną automatycznie. 6. Dodaj **tagi** (segmentacja i filtry na stronie od PRO). 7. Ustaw datę publikacji, jeśli wpis ma wyjść później - trafi do **Zaplanowane**. 8. Zapisz. Na karcie wpisu ikona **gwiazdki** przypina wpis do slidera na stronie głównej; kolejność przypiętych ustawiasz w zakładce **Przypięte**. ![Lista aktualności](/_astro/admin-posts.DrP42AGc_Z2v4m79.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Wpis jest w sekcji **Aktualności** na stronie głównej i na liście `/posts`. * Przypięty wpis pokazuje się w sliderze (jeśli slider jest włączony w [ustawieniach wyglądu](/website/appearance/)). * Kibic może udostępnić wpis; licznik odsłon jest w **Analiza**. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | Lista wpisów | `list_posts` | | Nowy wpis | `create_post {title, content (HTML), photo_url?, video_url?, gallery_image_urls?, tag_ids?, pinned?, hero_order?, created_at?, visibility?}` | | Okładka z herbami dla wpisu o meczu | `create_post {..., game_id}` (zamiast `photo_url`) | | Edycja, przypięcie, zmiana okładki | `update_post {id, ...}` | | Kolejność slidera | `reorder_pinned_posts {ids}` | | Fakty do zapowiedzi lub relacji z meczu | `get_game_context {id}` | | Post z Facebooka jako materiał | `list_facebook_posts` → `get_facebook_post {id}` | | Tagi klubu | `list_tags` | Wpis bez `photo_url` i `game_id` dostaje domyślną okładkę w barwach klubu. `created_at` w przyszłości = wpis zaplanowany. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Slider to przypięte wpisy, nie najnowsze.** Bez gwiazdki slider jest pusty. * **Okładka z adresu URL musi być publiczna (https).** Adres prywatny albo lokalny jest odrzucany po cichu i wpis dostaje okładkę domyślną. * Pełnowymiarowe zdjęcia z Facebooka bywają za duże do importu; wybierz mniejszy wariant. * **Aktualności** i **Lista postów** na jednej stronie głównej dublują wpis. * Widoczność “członkowie” bez aktywnych pakietów pokazuje wszystkim zajawkę. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) * [Dodaj mecze i wyniki](/content/matches/) # Dodaj sponsora > Kategorie sponsorów, logotypy, kolejność, sekcja Sponsorzy na stronie, podstrona partnerów i logotypy w nagłówku. * Scenariusz UC-010 * Plan każdy; logotypy w nagłówku strony od PRO * Czas 15 minut ## Cel [Dział zatytułowany „Cel”](#cel) Sponsorzy widzą swoje logo na stronie klubu w kolejności, którą ustala klub, a sponsor główny jest wyraźnie większy. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Logotypy w PNG z przezroczystym tłem, w poziomym formacie (szerokość większa od wysokości). Loga w JPG z białym tłem będą białymi prostokątami na kolorowym tle. * Podział na kategorie, np. Sponsor główny, Partnerzy, Partnerzy medialni. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Treści > Sponsorzy** (`/app/sponsors`). Zakładki: **Sponsorzy** i **Kategorie**. 2. W **Kategorie** dodaj kategorie w kolejności, w jakiej mają się wyświetlać. Każda ma **wysokość wiersza logotypów** (sponsor główny wyższy) i przełącznik **pokazuj na stronie**. 3. Wróć do **Sponsorzy** i kliknij **+ Nowy Sponsor** albo kafel **DODAJ** w kategorii: nazwa, kategoria, logo, adres strony sponsora, krótki opis (widoczny w układzie z listą i w Klubie Biznesu). 4. Zapisz. **Edytuj kolejność** przy nazwie kategorii układa loga w jej obrębie. 5. Dodaj sekcję **Sponsorzy** na stronie głównej ([sekcje](/website/homepage-sections/)): układ `cards` (kafle), `plain` (same loga), `wall` (gęsta ściana) albo `list` (wiersze z opisem), z nazwami kategorii albo bez. 6. Od PRO: karta **Logotypy w nagłówku strony > Zarządzaj** pokazuje wybrane loga w prawym górnym rogu każdego układu nagłówka. ![Sponsorzy](/_astro/admin-sponsors.SOXiLaPU_qwbxn.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Sekcja **Sponsorzy** na stronie głównej i podstrona `/sponsors` pokazują loga według kategorii, z linkami do stron sponsorów. * Sponsor główny jest w osobnym, wyższym wierszu. * Loga pojawiają się też w profilu klubu i w stopce, zależnie od układu. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | ---------------------------------- | ------------------------------------------------------------------------------------------- | | Kategorie | `list_sponsor_categories`, `create_sponsor_category {name, height?, show_on_website?}` | | Nowy sponsor | `create_sponsor {name, category_id, logo_url, url?, about?}` | | Lista i kolejność | `list_sponsors`, `reorder_sponsors {ids}`, `reorder_sponsor_categories {ids}` | | Edycja i usunięcie | `update_sponsor`, `delete_sponsor` | | Sekcja na stronie głównej | `create_page_block {content_type: "sponsors", layout, category_ids?, show_category_names?}` | | Podstrona partnerów jednym krokiem | `create_sponsors_page` | | Logotypy w nagłówku (PRO) | `get_header_partner_logos`, `update_header_partner_logos {enabled, size, items}` | Logo z `logo_url` musi być publicznym adresem https; z dysku wgrywasz przez `POST /api/v1/uploads` i podajesz zwrócony `url`. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Kolejność kategorii to kolejność ich utworzenia.** Załóż je od najważniejszej. * **Kategoria z wyłączonym “pokazuj na stronie”** nie wchodzi do domyślnej sekcji; żeby ją pokazać, wskaż ją jawnie w `category_ids` sekcji. * Logo w JPG z białym tłem psuje każdy układ na kolorowym tle. Proś sponsora o PNG lub SVG. * Zbyt wysoki wiersz dla małych logotypów rozciąga je i rozmywa. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) * [Dodaj podstronę](/website/subpages/) (np. “Zostań sponsorem”) # Dodaj kadrę > Zawodnicy i sztab, numery, pozycje, drużyny w sezonie, zdjęcia profilowe i sekcja Kadra na stronie. * Scenariusz UC-009 * Plan każdy; zakładki drużyn w sekcji Kadra od PRO * Czas 20 minut na drużynę ## Cel [Dział zatytułowany „Cel”](#cel) Strona pokazuje aktualny skład z numerami, pozycjami i zdjęciami, a sztab jest osobno od zawodników. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Lista zawodników: imię, nazwisko, numer, pozycja. Lista sztabu: imię, nazwisko, rola. * Zdjęcia profilowe, najlepiej popiersia na jednolitym tle. Zdjęcie jest kadrowane do kwadratu z twarzą pośrodku. * Pozycje dla dyscypliny (**Treści > Skład > Ustawienia**): każdy klub ma własną listę, np. Bramkarz, Obrońca, Pomocnik, Napastnik; role sztabu są osobną listą. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Treści > Skład** (`/app/players`). Zakładki: **Skład**, **Drużyny**, **Ustawienia**. 2. W **Ustawienia** sprawdź listę pozycji i ról sztabu. Dodaj brakujące (np. “Pomocnik”). 3. W **Drużyny** upewnij się, że jest drużyna, do której przypiszesz osoby. Nowy klub ma jedną własną drużynę; przy kilku grupach wiekowych dodaj kolejne. 4. Kliknij **+ Dodaj Zawodnika**: typ (zawodnik lub sztab), imię, nazwisko, numer (tylko zawodnik), pozycja albo rola, drużyna, data urodzenia, wzrost, waga, opis, zdjęcie. 5. Zapisz. Filtry **Wszyscy / Zawodnik / Sztab** i wyszukiwarka porządkują listę; przełącznik po prawej zmienia kafle na listę. 6. Dodaj sekcję **Kadra** na stronie głównej ([sekcje](/website/homepage-sections/)) i pozycję **Zawodnicy** w menu ([menu](/website/menu/)). ![Skład](/_astro/admin-players.xkVtE5mk_1hd8Re.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Podstrona `/players` pokazuje zawodników według pozycji, sztab osobno, z profilami. * Sekcja **Kadra** na stronie głównej pokazuje skład wybranej drużyny (na PRO z zakładkami drużyn). * Profil zawodnika ma zdjęcie, numer, pozycję, opis i statystyki z meczów, jeśli klub je prowadzi. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | --------------------------------------- | --------------------------------------------------------------------------------------- | | Pozycje i role sztabu klubu | `get_positions` | | Własne drużyny | `list_clubs` (`is_my_team: true`) | | Nowa drużyna | `create_player_team {name}` | | Nowy zawodnik | `create_player {first_name, last_name, number?, position, club_id?, photo_url?, text?}` | | Członek sztabu | `create_player {..., type: "staff", position: "Trener"}` | | Zdjęcie, numer, opis | `update_player {id, photo_url?, number?, text?}` | | Przynależność do kilku drużyn w sezonie | `set_player_teams {id, team_ids, primary_team_id}`, masowo `bulk_set_player_teams` | | Usunięcie (trwałe) | `delete_player {id}` | Nowa nazwa pozycji przekazana w `position` jest automatycznie dodawana do listy klubu. Zdjęcie z `photo_url` musi być publicznym adresem https; z dysku wgrywasz przez `POST /api/v1/uploads`. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Pusta kadra na stronie, choć zawodnicy są w panelu**: osoby nie są przypisane do domyślnej drużyny albo drużyna nie ma ustawionej kolejności. Sprawdź **Drużyny**. * **Zdjęcie poziome z całą drużyną** po kadrowaniu do kwadratu pokazuje przypadkowy fragment. Wgrywaj portrety. * **Usunięcie zawodnika jest trwałe** i zabiera jego wpisy w składach meczowych. * Sztab nie ma numeru; numer przekazany dla sztabu jest ignorowany. * Zawodnik może być w kilku drużynach naraz, ale jedna jest główna - to ona decyduje, gdzie pokazuje się w sekcji Kadra. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Dodaj mecze i wyniki](/content/matches/) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) # Plan i architektura bazy wiedzy > Dlaczego osobne repo i Starlight, jak baza łączy się z panelem, agentem AI, help center i landingiem, oraz plan rozwoju. Decyzja z 2026-09-24. Ten dokument jest źródłem prawdy o tym, **gdzie** żyje wiedza o Sportigio i **jak** ma być utrzymywana. ## Problem [Dział zatytułowany „Problem”](#problem) Wiedza o produkcie była w czterech miejscach, żadne nie nadawało się dla klubów i agenta naraz: | Miejsce | Co tam jest | Dlaczego nie wystarcza | | ------------------------------------------ | --------------------------------------------- | --------------------------------------------------------------------------------------------- | | `club-web/docs/` (ok. 150 plików) | dokumentacja techniczna po polsku | dla developerów; nazwy klas i tras, sekrety wdrożeniowe, brak wersji EN/DE | | `club-web/resources/ai/agent-knowledge.md` | mapa panelu dla agenta (`get_platform_guide`) | jeden plik, po polsku, rośnie wolniej niż lista narzędzi | | `help.sportigio.com` | hostowane centrum pomocy | treść poza gitem, bez dostępu dla agenta, bez kontroli i18n, nie da się aktualizować promptem | | Landing `get.sportigio.com/poradniki` | 2 poradniki | treść w słownikach TypeScript (plik typów ma 2 tys. linii) - dobre na 2 artykuły, złe na 100 | ## Decyzja [Dział zatytułowany „Decyzja”](#decyzja) **Osobne repo `sportigio-docs`** w folderze nadrzędnym firmy, obok `club-web`, `sportigio-founders` i `com-sportigio-get`. Silnik: **Astro Starlight**. Dlaczego tak, a nie inaczej: * **Markdown w gicie** - agent (Claude, Codex) aktualizuje bazę tym samym promptem, którym zmienia kod, w tym samym tygodniu. Review przez PR jak w kodzie. * **Trzy języki bez dopłat** - Starlight ma i18n wbudowane: PL jako root, EN i DE jako lustra pod tą samą ścieżką, automatyczny fallback na polski, przełącznik języka, tłumaczenia UI. * **Wyszukiwarka i tryb ciemny** z pudełka (Pagefind), zero backendu, statyczny `dist/`. * **`llms.txt` i `llms-full.txt`** generowane przy buildzie (plugin `starlight-llms-txt`): ta sama treść, którą czyta człowiek, trafia do agenta bez osobnego pliku wiedzy. * **Deploy na Cloudflare Pages**: push na `main` → Cloudflare → `npm run build` → `dist/` pod `docs.sportigio.com`. Bez GitHub Actions. * **Koszt zero**. Mintlify i GitBook robią podobne rzeczy za abonament i z treścią pod cudzą kontrolą; Docusaurus i VitePress wymagają więcej własnej konfiguracji i18n. Odrzucone: rozbudowa `club-web/docs/` (miesza wiedzę dla klubów z wiedzą dla developerów i sekretami), Notion (nie wersjonowane, słabe dla agenta, brak i18n), landing (słowniki TS), help.sportigio.com (poza gitem). ## Jednostka treści: use case [Dział zatytułowany „Jednostka treści: use case”](#jednostka-treści-use-case) Klub nie myśli modułami (“PageBlock v6”), tylko celami (“chcę, żeby na stronie były mecze”). Każda strona to jeden cel, z siedmioma stałymi sekcjami ([szablon](/contributing/template/)) i metadanymi we frontmatterze: ```yaml useCase: id: UC-004 module: website # website | content | earn | community | academy | business | ai | settings surfaces: [panel, mcp] # gdzie da się to zrobić plan: PRO # minimalny plan, jeśli dotyczy time: 20 min verified: 2026-09-24 # ostatnie przeklikanie na panelu sources: [app/...] # pliki w club-web, które są źródłem prawdy ``` Sekcja **Przez API / MCP** jest obowiązkowa. Dzięki temu ta sama strona uczy człowieka klikać i agenta wywoływać narzędzia, a rozjazd między nimi jest widoczny od razu. ## Jak baza łączy się z resztą [Dział zatytułowany „Jak baza łączy się z resztą”](#jak-baza-łączy-się-z-resztą) ```plaintext club-web (kod, tests, docs techniczne) │ zmiana funkcji ▼ skill docs-sync w club-web ──prompt──▶ sportigio-docs (PR) ──push main──▶ docs.sportigio.com │ │ │ build │ /llms-full.txt ▼ ▼ zrzuty z klubu demo agent AI (get_platform_guide, Sportigio FC (localhost) AI Center, Claude/Codex z MCP) ``` * **Klub demo Sportigio FC** (`club-web`, `klub1.sportigio.test.localhost`, space 2) to stan odniesienia: każdy use case jest tam przeklikany, zrzuty ekranu pochodzą stamtąd. Reset do zera: **Ustawienia > Zaawansowane > Strefa zagrożenia** (tylko localhost). Odbudowa danych: `build.py` z tej sesji (kolejność w [mapie narzędzi](/for-agents/tool-map/)). * **help.sportigio.com** zostaje na okres przejściowy jako link w panelu; docelowo `SPORTIGIO_HELP_CENTER` w `club-web/config/sportigio.php` wskazuje na `docs.sportigio.com`. * **Landing** linkuje do bazy z sekcji Poradniki zamiast trzymać własne artykuły. ## Etapy [Dział zatytułowany „Etapy”](#etapy) | Etap | Zakres | Stan | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | | 1 | Repo, Starlight, i18n PL/EN/DE, brand, `llms.txt`, 10 use case’ów WWW i treści, mapa dla agentów, szablon i prompt aktualizacji | zrobione 2026-09-24 | | 2 | Repo na GitHubie, Cloudflare Pages, `docs.sportigio.com` (zrobione 2026-11-02); link z panelu (`help_center`) i z landingu | w toku | | 3 | Agent czyta bazę: `get_platform_guide` pobiera `/llms-full.txt` (cache 1 h) zamiast `agent-knowledge.md`; import wybranych stron do AI Center jako baza wiedzy publicznych agentów | do zrobienia | | 4 | Kolejne 30 use case’ów z [backlogu](/contributing/backlog/): zarabianie, kibice, akademia, sponsoring, AI, ustawienia | w toku, po jednym module na tydzień | | 5 | Kontrola dryfu: skrypt porównujący nazwy narzędzi w bazie z `tools/list` i ścieżki `/app/...` z `route:list`; wynik w CI repo | do zrobienia | ## Zasady utrzymania [Dział zatytułowany „Zasady utrzymania”](#zasady-utrzymania) 1. Zmiana funkcji w `club-web` = zmiana strony w bazie w tym samym tygodniu ([prompt aktualizacji](/contributing/update-prompt/)). 2. Nowa strona najpierw po polsku, z datą `verified`. EN i DE mogą wejść osobnym PR-em. 3. Zrzuty ekranu tylko z klubu demo, w trybie jasnym, bez paska debugowania i banerów. 4. Nazwy z interfejsu, nie z kodu. Kod zostaje w `sources`. 5. Żadnych liczb i cen z pamięci - tylko z `config/plans.php` albo z produkcji. # Backlog scenariuszy > Kolejne use case'y do opisania, pogrupowane działami panelu, z priorytetem według pytań klubów. Pierwsze dziesięć scenariuszy (UC-001 do UC-010) obejmuje ustawienia, stronę WWW i treści. Poniżej kolejka. Priorytet: **A** = kluby pytają o to w pierwszym tygodniu, **B** = w pierwszym miesiącu, **C** = rzadziej. Numery przydzielaj po kolei przy tworzeniu strony. ## Strona WWW i profil [Dział zatytułowany „Strona WWW i profil”](#strona-www-i-profil) | Priorytet | Scenariusz | Folder | Narzędzia MCP | | --------- | ------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------- | | A | Uruchom profil klubu (link in bio): linki, baner, następny mecz, QR | `website/` | `get_bio_settings`, `update_bio_settings`, `save_bio_link`, `reorder_bio_links` | | A | Podepnij własną domenę (DNS, SSL, co robi Sportigio) | `website/` | `report_support_issue` | | B | Popup promocyjny na stronie (kampania, newsletter, następny mecz) | `website/` | `list_promo_modals`, `create_promo_modal` | | B | Sekcja “Zdjęcia” i galerie z meczu | `website/` | `create_page_block {photos}`, `create_post {gallery_image_urls}` | | B | Mini-baza danych i lista na stronie (trenerzy, FAQ, cennik) | `website/` | `create_database`, `add_database_records`, `create_database_page` | | C | Własny CSS i JS na stronie | `website/` | tylko panel | | C | Analityka strony: wizyty, kliknięcia, źródła | `website/` | `get_space_stats` | ## Zarabianie [Dział zatytułowany „Zarabianie”](#zarabianie) | Priorytet | Scenariusz | Folder | Narzędzia MCP | | --------- | ----------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------- | | A | Uruchom konto płatnicze klubu (Stripe, Paymove) | `earn/` | tylko panel | | A | Sprzedaj bilety na mecz: wydarzenie, rodzaje biletów, plan miejsc, skanowanie | `earn/` | `create_ticket_event`, `create_ticket_type`, `get_ticket_sales`, `create_scanner_link` | | A | Karnety sezonowe | `earn/` | `create_ticket_type` | | B | Sklep klubowy: produkt fizyczny, cyfrowy, zamówienia | `earn/` | `create_product`, `list_store_orders`, `update_store_order_status` | | B | Pakiety członkowskie (Klub 100) i portal wspierającego | `earn/` | `create_membership_tier`, `list_membership_subscribers` | | B | Zbiórka i strona wsparcia | `earn/` | `create_fundraiser`, `record_donation` | | B | Kody rabatowe | `earn/` | `create_discount_code` | | C | Rozliczenia i wypłaty | `earn/` | tylko panel | ## Kibice i komunikacja [Dział zatytułowany „Kibice i komunikacja”](#kibice-i-komunikacja) | Priorytet | Scenariusz | Folder | Narzędzia MCP | | --------- | ---------------------------------------------------- | ------------ | --------------------------------------------------------------------- | | A | Zbieraj kontakty: formularz, import, tagi, zgody | `community/` | `add_contact`, `tag_contact`, `list_contacts` | | A | Wyślij newsletter (szkic przez AI, wysyłka w panelu) | `community/` | `create_campaign_draft` | | B | Automatyczne maile wokół meczu | `community/` | tylko panel | | B | Strefa Kibica: punkty, questy, eTrybuna na mecz | `community/` | `create_fan_quest`, `attach_game_activity`, `update_fanzone_settings` | | B | Ankieta z własnym linkiem `/poll/{slug}` | `community/` | `create_voting` | | B | Quiz i Liga Typera | `community/` | `create_quiz` | | C | Program lojalnościowy z nagrodami | `community/` | `add_user_points` | ## Akademia [Dział zatytułowany „Akademia”](#akademia) | Priorytet | Scenariusz | Folder | Narzędzia MCP | | --------- | -------------------------------------------- | ---------- | ----------------------------------------------------------------------------- | | A | Nabór: formularz, pola, zgłoszenia | `academy/` | `create_recruitment`, `add_recruitment_field`, `list_recruitment_submissions` | | A | Grupy treningowe i harmonogram | `academy/` | `create_training_group`, `create_training_schedule`, `get_academy_schedule` | | A | Składki: kwoty, przypomnienia, ręczne wpłaty | `academy/` | `get_dues_status`, `send_dues_reminders`, `mark_dues_paid` | | B | Komunikat do rodziców | `academy/` | `create_academy_announcement` | | B | Deklaracje i zgody do podpisu online | `academy/` | `create_academy_document`, `send_document_sign_requests` | | B | Portal rodzica: co widzi rodzic | `academy/` | `get_portal_settings` | | C | Zajęcia dodatkowe i obozy | `academy/` | `create_activity`, `list_activity_signups` | ## Sponsoring i biznes [Dział zatytułowany „Sponsoring i biznes”](#sponsoring-i-biznes) | Priorytet | Scenariusz | Folder | Narzędzia MCP | | --------- | ----------------------------------------- | ----------- | ----------------------------------------------------------------------------- | | A | Media kit i oferta reklamowa | `business/` | `get_advertising_offer` | | B | Inwentarz świadczeń i pakiety sponsorskie | `business/` | `create_sponsorship_asset`, `create_sponsor_package`, `apply_sponsor_package` | | B | Umowa sponsorska i raport realizacji | `business/` | `create_sponsor_contract`, `get_sponsor_report` | | B | Wydarzenie biznesowe z RSVP | `business/` | `create_business_event`, `invite_sponsors_to_event` | | C | Strona Klubu Biznesu | `business/` | `get_business_club_page` | Uwaga 2026-09-25: folder `business/` jest wciąż pusty, a panel zmienił się (hub BizZone ma blok “Wymaga uwagi”, lista CRM kolumnę i filtr “Umowa”, portal sponsora pokazuje umowę z realizacją i zdjęciami dowodowymi). Przegląd do przepisania na strony klubu: `club-web/docs/platform/bizzone-overview.md`. ## AI, integracje, ustawienia [Dział zatytułowany „AI, integracje, ustawienia”](#ai-integracje-ustawienia) | Priorytet | Scenariusz | Folder | Narzędzia MCP | | --------- | --------------------------------------------- | ----------- | ----------------------------- | | A | Klucz API i podłączenie MCP do Claude / Codex | `ai/` | tylko panel (`/app/api-keys`) | | A | Asystent AI w panelu: co umie, jak pytać | `ai/` | `get_platform_guide` | | B | Publiczny agent AI dla kibiców i rodziców | `ai/` | tylko panel (AI Center) | | B | Zespół i uprawnienia | `settings/` | tylko panel | | B | Plan, faktury, zmiana planu | `settings/` | `get_plan_info` | | C | Webhooki automatyzacji (n8n, Make) | `ai/` | tylko panel | Dodano UC-011: [Podłącz asystenta AI](/getting-started/connect-ai/), zweryfikowano lokalnie 2026-09-25. Dodano UC-012 do UC-015 (sklep): [zamówienia](/earn/store-orders/), [maile do kupujących](/earn/store-emails/), [wiadomość do wielu kupujących](/earn/store-message-buyers/), [VAT](/earn/store-vat/), zweryfikowano lokalnie 2026-10-28. Zostaje osobny scenariusz o dodaniu produktu (fizyczny, cyfrowy, warianty). Dodano UC-016: [Zmień kolejność sekcji na stronie głównej](/website/reorder-homepage-sections/), z nagraniem z lektorem, sprawdzone na produkcji 2026-10-30, lustra EN/DE z polskim nagraniem. # Szablon use case'a > Gotowy plik do skopiowania z frontmatterem i siedmioma sekcjami w stałej kolejności. Skopiuj poniższy plik do właściwego folderu (`getting-started/`, `website/`, `content/`, `earn/`, `community/`, `academy/`, `business/`, `ai/`), nadaj angielską nazwę pliku (`homepage-sections.md`) i wypełnij sekcje w tej kolejności. Sekcje **Efekt** i **Pułapki** pomiń, jeśli nie dodają nic ponad to, co jest wyżej. Pozostałe sekcje zostają zawsze. ```md --- title: description: sidebar: order: useCase: id: UC- module: surfaces: [panel, api, mcp] plan: time: verified: sources: - <ścieżka w club-web, np. app/Mcp/Tools/SponsorTools.php> ---
Scenariusz
UC-
Plan
Czas
<...>
## Cel ## Zanim zaczniesz - ## Krok po kroku w panelu 1. Otwórz **Dział > Pozycja** (`/app/...`). 2. Kliknij **Nazwa przycisku dokładnie jak w panelu**. 3. ... ![Opis zrzutu](../../../assets/screens/.png) ## Efekt - ## Przez API / MCP | Krok | Narzędzie | |---|---| | | `nazwa_narzedzia {najważniejsze pola}` | ## Pułapki - **** - . ## Zobacz też - [](///) ``` ## Zasady stylu [Dział zatytułowany „Zasady stylu”](#zasady-stylu) * Krótkie zdania. Jedna myśl na zdanie. Bez emoji, bez długich pauz (tylko “-”). * Nazwy przycisków i zakładek **pogrubione**, dokładnie jak w interfejsie po polsku. * Adresy panelu w nawiasie, w `kodzie`, jako wsparcie. * Narzędzia MCP w `kodzie`, z nazwami pól, które decydują o wyniku. * Pułapka to coś, co naprawdę zepsuło się klubowi albo agentowi. Nie wymyślaj. * Zrzut ekranu z klubu demo, tryb jasny, szerokość 1440 px, bez paska debugowania. ## Wersje językowe [Dział zatytułowany „Wersje językowe”](#wersje-językowe) Ten sam plik pod tą samą ścieżką w `src/content/docs/en/` i `src/content/docs/de/`. Tłumacz tytuły, opisy, treść i nazwy przycisków (interfejs klubu ma wersje EN i DE). Nie tłumacz: nazw narzędzi MCP, pól API, ścieżek `/app/...`, nazw plików w `sources`. # Prompt aktualizacji po zmianie w produkcie > Gotowy prompt i checklista dla agenta, który po zmianie funkcji w club-web ma zaktualizować bazę wiedzy w trzech językach. Każda zmiana funkcji w `club-web` wywołuje aktualizację tej bazy. Nie “kiedyś”, tylko w tym samym tygodniu, najlepiej w tym samym PR-ze co kod, jako osobny commit w repo `sportigio-docs`. W `club-web` jest skill `docs-sync`, który prowadzi agenta przez dokładnie ten proces; poniżej ten sam prompt do wklejenia ręcznie. ## Prompt [Dział zatytułowany „Prompt”](#prompt) ```text Zmieniliśmy funkcję w club-web. Zaktualizuj bazę wiedzy w repo sportigio-docs. Co się zmieniło (wklej albo opisz): Zrób po kolei: 1. Wypisz, których scenariuszy (UC-xxx) dotyczy zmiana. Szukaj po nazwach narzędzi MCP, ścieżkach /app/... i nazwach zakładek. Jeśli żaden nie pasuje, zaproponuj nowy scenariusz z contributing/template.md i dodaj go do contributing/backlog.md. 2. Dla każdego scenariusza: przeklikaj zmieniony krok na klubie demo Sportigio FC (club-web, klub1.sportigio.test.localhost, space 2) albo na produkcji. Nie opisuj z pamięci. Jeśli zmiana dotyczy narzędzia MCP, wywołaj je i sprawdź wynik odczytem. 3. Zaktualizuj polską stronę: kroki, nazwy przycisków, tabelę "Przez API / MCP", pułapki, pole verified na dzisiejszą datę, sources na zmienione pliki. 4. Zaktualizuj lustra en/ i de/ pod tą samą ścieżką. Ta sama struktura nagłówków. Nazwy przycisków po angielsku i niemiecku bierz z resources/lang/{en,de} w club-web, nie tłumacz ich sam. 5. Jeśli zmieniły się zrzuty ekranu: zrób nowe z klubu demo (tryb jasny, 1440 px, bez paska debugowania i banerów) i podmień pliki w src/assets/screens/. 6. Jeśli zmiana dotyczy narzędzi MCP, zaktualizuj for-agents/tool-map.md (PL/EN/DE). 7. npm run build w sportigio-docs. Build musi przejść. 8. Podsumuj w trzech zdaniach: co zmieniłeś, które strony, co zostało do zrobienia (np. zrzut, którego nie dało się zrobić). Reguły: AGENTS.md w sportigio-docs. Krótkie zdania, nazwy z interfejsu, bez AI slopu, bez długich pauz, żadnych cen i liczb z pamięci. ``` ## Checklista recenzenta [Dział zatytułowany „Checklista recenzenta”](#checklista-recenzenta) * [ ] Każda zmieniona strona ma `verified` z datą z tego tygodnia. * [ ] PL, EN i DE mają te same nagłówki H2 w tej samej kolejności. * [ ] Nazwy narzędzi w sekcji “Przez API / MCP” istnieją w `club-web/docs/mcp-tools.md`. * [ ] Ścieżki `/app/...` istnieją (`php artisan route:list` w club-web). * [ ] Zrzuty są z klubu demo i nie pokazują danych prawdziwych klubów. * [ ] `npm run build` przeszedł; `dist/llms-full.txt` zawiera zmienioną stronę. ## Kiedy zakładać nowy scenariusz, a kiedy rozszerzać istniejący [Dział zatytułowany „Kiedy zakładać nowy scenariusz, a kiedy rozszerzać istniejący”](#kiedy-zakładać-nowy-scenariusz-a-kiedy-rozszerzać-istniejący) * **Nowy**, gdy klub zadałby o to osobne pytanie (“jak sprzedać bilety na mecz”). * **Rozszerzenie**, gdy zmienia się krok w istniejącym celu (nowa wersja sekcji, nowe pole w formularzu, nowe narzędzie MCP do tego samego celu). * Nie zakładaj strony dla ekranu, który jest tylko środkiem do celu (np. “zakładka Tagi”). Tagi opisuje scenariusz o aktualnościach. ## Rytm [Dział zatytułowany „Rytm”](#rytm) * Zmiana funkcji: aktualizacja w tygodniu wdrożenia. * Raz w miesiącu: przegląd stron z `verified` starszym niż 90 dni. Przeklikaj albo oznacz w tytule “(do weryfikacji)”. * Raz na kwartał: porównanie `for-agents/tool-map.md` z `tools/list` i backlog. # Ustaw maile do kupujących > Adres kontaktowy sklepu, co kupujący dostaje przy każdym statusie zamówienia, własne szablony wiadomości i pełna lista zmiennych. * Scenariusz UC-013 * Plan każdy * Czas 20 minut ## Cel [Dział zatytułowany „Cel”](#cel) Kupujący dostaje od klubu maile napisane jego językiem, w momentach, które klub wybrał, a jego odpowiedź trafia do osoby, która prowadzi sklep. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Moduł **Sklep** włączony. * Adres e-mail osoby, która odpowiada na pytania kupujących (np. `sklep@twojklub.pl`). * Podgląd szablonu używa ostatniego opłaconego zamówienia. Gdy sklep nic jeszcze nie sprzedał, podgląd pokazuje przykładowe zamówienie. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Zarabianie > Sklep > Ustawienia** i wybierz **Maile** (`/app/earn/store/settings?section=emails`). 2. **Adres kontaktowy sklepu**: wpisz **Adres do odpowiedzi (reply-to)**. Puste pole oznacza adres kontaktowy klubu. Adres jest też w stopce każdej wiadomości ze sklepu. 3. **Co dostaje kupujący**: przy każdym zdarzeniu wybierz **Wbudowana wiadomość**, jeden z własnych szablonów albo **Nie wysyłaj**. Zdarzenia, po kolei: * **Zamówienie opłacone (potwierdzenie)**, * **Status: …** dla każdego kroku obiegu, także własnych kroków klubu, * **Status: Anulowano** i **Status: Zwrócona**. **Podgląd wiadomości** przy zdarzeniu pokazuje, co pójdzie. Zapisz przyciskiem **Zapisz ustawienia e-maili**. ![Ustawienia sklepu, pigułka Maile](/_astro/admin-store-emails.CuafLZSQ_2aVWSm.webp) 4. **Własne szablony**: kliknij **Nowy szablon**. Z prawej otwiera się edytor z gotowym początkiem wiadomości. Podaj **Nazwa szablonu** (np. “Paczka w drodze”), **Temat** i **Treść**. 5. Pod treścią jest lista **Zmienne**. Kliknięcie wstawia zmienną w miejscu kursora. **Podgląd** pokazuje maila z danymi zamówienia. Zapisz przyciskiem **Zapisz szablon**. 6. Wróć do **Co dostaje kupujący** i podepnij szablon pod zdarzenie, np. **Status: Wysłano**. ### Zmienne w szablonie [Dział zatytułowany „Zmienne w szablonie”](#zmienne-w-szablonie) | Grupa | Zmienna | Co wstawia | | ---------- | ---------------------- | ---------------------------------------------- | | Kupujący | `{{buyer_name}}` | Imię i nazwisko (gdy brak, adres e-mail) | | Kupujący | `{{buyer_first_name}}` | Imię | | Kupujący | `{{buyer_email}}` | E-mail | | Kupujący | `{{buyer_phone}}` | Telefon | | Zamówienie | `{{order_number}}` | Numer zamówienia, np. `#1001` | | Zamówienie | `{{order_date}}` | Data zamówienia (dd.mm.rrrr) | | Zamówienie | `{{order_total}}` | Kwota zapłacona łącznie | | Zamówienie | `{{order_status}}` | Aktualny status | | Zamówienie | `{{products}}` | Produkty w jednej linii, z wariantem i ilością | | Zamówienie | `{{products_table}}` | Tabela produktów z ceną, dostawą i sumą | | Zamówienie | `{{order_url}}` | Link do strony zamówienia kupującego | | Dostawa | `{{shipping_method}}` | Sposób dostawy | | Dostawa | `{{shipping_address}}` | Adres dostawy (z Paczkomatem, jeśli wybrany) | | Dostawa | `{{tracking_number}}` | Numer przesyłki | | Dostawa | `{{tracking_url}}` | Link do śledzenia | | Dostawa | `{{eta}}` | Przewidywana data | | Klub | `{{club_name}}` | Nazwa klubu | | Klub | `{{store_url}}` | Adres sklepu | | Klub | `{{contact_email}}` | E-mail kontaktowy sklepu | ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Przy każdym zdarzeniu kupujący dostaje wybraną wiadomość albo nic. * Odpowiedź na maila ze sklepu trafia na adres kontaktowy sklepu. * Każda wysłana wiadomość ma kopię w zamówieniu, w sekcji **Maile**. * Szablonu użyjesz też ręcznie: z zamówienia (**Napisz wiadomość**) i w wysyłce do wielu kupujących ([Napisz do kupujących ze sklepu](/earn/store-message-buyers/)). ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) Nie ma narzędzi do adresu kontaktowego, szablonów ani automatyzacji maili sklepu. `get_store_settings` i `update_store_settings` obsługują obieg statusów i adresy powiadomień dla klubu o nowym zamówieniu (`notify_emails`), nie maile do kupujących. Agent kieruje klub do **Zarabianie > Sklep > Ustawienia > Maile**. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Literówka w zmiennej zostaje w mailu.** Nieznana zmienna, np. `{{order_numer}}`, nie jest zamieniana. Sprawdź **Podgląd** przed zapisem. * **Usunięty szablon wraca do wbudowanej wiadomości.** Zdarzenia, które go używały, znów wysyłają **Wbudowana wiadomość**, nie milkną. * **Własny szablon nie ma linku do pobrania produktu cyfrowego.** Link jest tylko w wbudowanym potwierdzeniu. Jeśli sprzedajesz produkty cyfrowe, zostaw dla **Zamówienie opłacone** opcję **Wbudowana wiadomość**. Wyjątek: produkt cyfrowy, który nie jest pierwszą pozycją koszyka, zawsze dostaje osobne wbudowane potwierdzenie. * **Zmiana statusu przez API omija te ustawienia** i wysyła wbudowany mail o statusie (patrz [Obsłuż zamówienia ze sklepu](/earn/store-orders/)). * Limit to 30 własnych szablonów. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Obsłuż zamówienia ze sklepu](/earn/store-orders/) * [Napisz do kupujących ze sklepu](/earn/store-message-buyers/) # Napisz do kupujących ze sklepu > Jedna wiadomość do wielu kupujących naraz, z filtrem po statusie, dacie i produkcie, z podglądem i testem do siebie. * Scenariusz UC-014 * Plan każdy * Czas 10 minut ## Cel [Dział zatytułowany „Cel”](#cel) Wszyscy, którzy kupili nową koszulkę, dowiadują się z jednego maila, że dostawa przesunie się o tydzień albo że odbiór jest w klubie po meczu. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Co najmniej jedno opłacone zamówienie w sklepie. Test do siebie też go wymaga. * Treść wiadomości albo gotowy szablon z [Ustaw maile do kupujących](/earn/store-emails/). ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Zarabianie > Sklep > Zamówienia** (`/app/earn/store/orders`) i kliknij **Nowa wiadomość**. Z prawej otwiera się panel **Nowa wiadomość do kupujących**. 2. **Do kogo**: zawęź odbiorców. * **Status zamówienia**: **Wszystkie opłacone** albo wybrane statusy. Anulowane i zwrócone wchodzą tylko wtedy, gdy zaznaczysz ich status. * **Data zamówienia**: od i do. Puste = bez ograniczenia. * **Produkt**: **Dowolny produkt** albo jeden produkt. Pod filtrem widać, do ilu kupujących pójdzie wiadomość. 3. **Wiadomość**: wybierz **Szablon** albo **Bez szablonu - własna treść**, wpisz **Temat** i **Treść**. Zmienne (np. `{{buyer_first_name}}`, `{{order_number}}`) wypełniają się danymi ostatniego zamówienia każdego kupującego. 4. Kliknij **Test do mnie** i sprawdź maila u siebie. Test używa ostatniego opłaconego zamówienia sklepu. 5. Kliknij **Wyślij** i potwierdź w oknie **Wysłać wiadomość?**. ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Każdy adres z filtra dostaje jedną wiadomość, nawet jeśli ma kilka zamówień. * Odpowiedzi trafiają na adres kontaktowy sklepu. * Kopia trafia do zamówienia każdego odbiorcy, w sekcji **Maile**, jako **Wysyłka do kupujących**. * Komunikat po wysyłce podaje liczbę wysłanych. Gdy część adresów nie przeszła, szczegóły są w zamówieniach. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) Nie ma narzędzia do wysyłki do kupujących. Agent może przygotować listę przez `list_store_orders` i treść wiadomości, ale wysyłkę klub robi w panelu: **Zarabianie > Sklep > Zamówienia > Nowa wiadomość**. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Wysyłki nie da się cofnąć.** Zawsze najpierw **Test do mnie**. * **Maksymalnie 2000 odbiorców naraz.** Przy większej liście panel odmawia wysyłki. Zawęź filtr datą albo produktem i wyślij w kilku turach. * **Filtr bez wyników nic nie wysyła.** Gdy nikt nie pasuje, panel pokazuje komunikat i wiadomość nie wychodzi. * **To nie jest newsletter.** Wiadomość idzie tylko do kupujących ze sklepu, w sprawie ich zamówień. Do kibiców z listy kontaktów służą kampanie mailowe. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ustaw maile do kupujących](/earn/store-emails/) * [Obsłuż zamówienia ze sklepu](/earn/store-orders/) # Obsłuż zamówienia ze sklepu > Zakładka Przegląd, lista zamówień, szczegóły zamówienia w szufladzie, statusy, telefon kupującego i wszystkie maile wysłane do kupującego. * Scenariusz UC-012 * Plan każdy; metody dostawy (kurier, Paczkomat) w sklepie eCommerce PRO * Czas 5 minut na zamówienie ## Cel [Dział zatytułowany „Cel”](#cel) Kibic, który kupił szalik, dostaje go na czas i wie, co dzieje się z jego zamówieniem, a klub widzi w jednym miejscu, ile sprzedaje i co czeka na wysyłkę. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Moduł **Sklep** włączony i co najmniej jeden produkt w zakładce **Produkty**. * Podłączone konto płatnicze klubu. Bez niego płatności działają w trybie testowym. * Zakładka **Przegląd** pojawia się dopiero po pierwszym opłaconym zamówieniu. Wcześniej sklep otwiera się na liście produktów. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Zarabianie > Sklep** (`/app/earn/store`). Gdy sklep już sprzedaje, startuje na zakładce **Przegląd**: * kafle **Sprzedaż** i **Zamówienia** z porównaniem do poprzedniego okresu, **Średnie zamówienie** z liczbą sprzedanych sztuk i **Do realizacji** z liczbą zaległych, * przełącznik **7 dni**, **30 dni**, **90 dni** i wykres **Sprzedaż dzień po dniu**, * **Najpopularniejsze produkty** i **Najnowsze zamówienia** (po sześć), * podpowiedzi, co blokuje sklep: płatności w trybie testowym, sklep w trybie testowym z hasłem, brak adresu kontaktowego sklepu, brak metod dostawy. Każda ma przycisk **Otwórz ustawienia**. ![Zakładka Przegląd sklepu](/_astro/admin-store-overview.C1ux77mt_2egsmW.webp) 2. Przejdź do zakładki **Zamówienia** (`/app/earn/store/orders`). Licznik przy nazwie to zamówienia, które czekają na realizację. Widok **Tabela** albo **Tablica**. 3. Kliknij zamówienie. **Szczegóły zamówienia** otwierają się w szufladzie z prawej strony (na telefonie od dołu), lista zostaje pod spodem. **Otwórz na całej stronie** daje pełną stronę zamówienia ze stałym adresem (`/app/earn/store/orders/{id}`), np. do wysłania koledze z zarządu. 4. W sekcji **Kupujący i dostawa** masz kupującego, **Adres e-mail**, **Numer telefonu** i **Adres wysyłki**. Telefon jest obowiązkowy w koszyku i zapisuje się też na koncie kupującego. Telefon i e-mail widać też w nagłówku zamówienia. 5. W sekcji **Realizacja** kliknij **Zmień stan**. Domyślny obieg: **Zamówienie przyjęte** > **W produkcji** > **Pakowanie** > **Wysłano**, plus własne kroki klubu. Z zaznaczonym **Powiadom kupującego mailem o tej zmianie** kupujący dostaje to, co ustawiono w [Ustaw maile do kupujących](/earn/store-emails/). 6. Po nadaniu paczki kliknij **Dodaj numer przesyłki**. Zaznacz **Wyślij numer kupującemu e-mailem**, a kupujący dostanie numer razem z linkiem do śledzenia. 7. Sekcja **Maile** pokazuje każdą wiadomość, która poszła do kupującego: potwierdzenie, zmiany statusu, automatyczne i własne wiadomości klubu, z datą, adresem i osobą, która wysłała. **Podgląd** przy wiadomości otwiera kopię dokładnie tej treści, którą kupujący otrzymał. 8. **Napisz wiadomość** (w nagłówku zamówienia i w sekcji **Maile**) wysyła maila do tego kupującego: wybierz **Szablon** albo **Bez szablonu - własna treść**, uzupełnij **Temat** i **Treść**, sprawdź **Podgląd wiadomości** i kliknij **Wyślij do** (adres kupującego). Zmienne jak `{{order_number}}` wypełniają się danymi tego zamówienia. 9. **Wyślij potwierdzenie ponownie** i **Wyślij aktualny status** ponawiają wbudowane maile, np. gdy kupujący napisze, że nic nie dostał. ![Zamówienie z sekcją Maile](/_astro/admin-store-order._6dkAWP1_kAEjF.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Kupujący widzi aktualny status na stronie swojego zamówienia i dostaje maile przy zmianach, w kopii zapisanej w sekcji **Maile**. * Odpowiedź kupującego na maila ze sklepu trafia na adres kontaktowy sklepu. * Eksport zamówień (przycisk **CSV** nad listą) ma kolumny **Telefon**, **Stawki VAT**, kwotę netto i **Kwota VAT**. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | ------------------------------------------------ | ----------------------------------------------------------- | | Lista opłaconych zamówień | `list_store_orders` | | Jedno zamówienie z telefonem i historią statusów | `get_store_order {id}` (pole `buyer_phone`) | | Zmiana statusu, data dostawy, notatka | `update_store_order_status {id, status, eta?, admin_note?}` | | Obieg statusów | `get_store_settings` (`status_flow`) | | Produkty | `list_products`, `create_product`, `update_product` | Tylko w panelu: zakładka **Przegląd**, **Napisz wiadomość**, podgląd wysłanych maili, ponowna wysyłka potwierdzenia, numer przesyłki, zwrot i anulowanie zamówienia. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Zmiana statusu przez API wysyła zawsze wbudowany mail o statusie.** Narzędzie `update_store_order_status` nie patrzy na ustawienie **Co dostaje kupujący** i nie zapisuje kopii w sekcji **Maile**. Jeśli klub ma dla statusu własny szablon albo **Nie wysyłaj**, zmieniaj status w panelu. * **Starsze zamówienia nie mają telefonu.** Telefon zapisuje się w zamówieniu od chwili, gdy stał się obowiązkowy w koszyku. Przy wcześniejszych zamówieniach pole jest puste, także w `get_store_order` i w CSV. * **Jedna płatność to jedno zamówienie.** Koszyk z kilkoma produktami jest jednym zamówieniem z kilkoma pozycjami, nie kilkoma zamówieniami. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ustaw maile do kupujących](/earn/store-emails/) * [Napisz do kupujących ze sklepu](/earn/store-message-buyers/) * [Ustaw VAT w sklepie](/earn/store-vat/) # Ustaw VAT w sklepie > Domyślna stawka VAT według kraju klubu, własna stawka dla produktu i rachunek "w tym VAT" w potwierdzeniu zamówienia. * Scenariusz UC-015 * Plan każdy * Czas 5 minut ## Cel [Dział zatytułowany „Cel”](#cel) Kupujący dostaje potwierdzenie z kwotą VAT liczoną właściwą stawką, a klub ma te same liczby w eksporcie dla księgowości. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Sprawdź z księgowym, czy klub jest płatnikiem VAT i jakie stawki mają Wasze produkty (np. odzież inną niż książki czy bilety). * Kraj klubu decyduje o stawce domyślnej. Opis pod **Stawka VAT** pokazuje, który kraj i jaką stawkę przyjął sklep. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Zarabianie > Sklep > Ustawienia** i pigułkę **Zamówienia** (`/app/earn/store/settings`). 2. W wierszu **Stawka VAT** zostaw **Standardowa dla kraju** (np. 23% w Polsce, 19% w Niemczech) albo wybierz inną stawkę z listy dla kraju klubu. Klub, który nie jest płatnikiem VAT, wybiera **zw.**. Zapisz. 3. Produkt z inną stawką: **Zarabianie > Sklep > Produkty**, otwórz produkt, w polu **Stawka VAT** wybierz stawkę zamiast **Domyślna sklepu**. Zapisz. Ceny w sklepie są zawsze brutto. VAT jest liczony “w tym”: cena się nie zmienia, zmienia się tylko podział na netto i VAT. ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Mail z potwierdzeniem, strona “dziękujemy” i strona zamówienia kupującego pokazują rachunek: pozycje, dostawę, **Zapłacono łącznie** i linię **w tym VAT** ze stawką, osobno dla każdej stawki w koszyku. * Gdy klub jest zwolniony, rachunek ma dopisek **Sprzedawca zwolniony z VAT**. * Eksport zamówień (przycisk **CSV** nad listą zamówień) ma kolumny **Stawki VAT**, netto i **Kwota VAT**. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) Nie ma narzędzia do stawki VAT sklepu ani produktu. `create_product` i `update_product` tworzą produkt ze stawką domyślną sklepu. Stawkę zmienia się w panelu. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Stawka jest zamrażana w chwili zakupu.** Zmiana stawki nie przelicza opłaconych zamówień. Starsze zamówienia bez zapisanej stawki biorą stawkę produktu, a potem domyślną sklepu. * **Dostawa idzie po stawce sklepu**, nie po stawce produktu. * **Rachunek to nie faktura.** Potwierdzenie zamówienia z rozbiciem VAT nie zastępuje faktury, jeśli kupujący o nią prosi. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Obsłuż zamówienia ze sklepu](/earn/store-orders/) * [Ustaw maile do kupujących](/earn/store-emails/) # Jak agent AI ma czytać tę bazę > Zasady pracy agenta z bazą wiedzy Sportigio - kolejność działań, kontekst klubu, pliki, weryfikacja i uczciwość wobec ograniczeń. Ta baza jest pisana dla dwóch odbiorców naraz: dla osoby z klubu i dla agenta AI, który pracuje przez narzędzia MCP Sportigio (`/api/v1/mcp`) albo REST `/api/v1`. Agentem może być asystent w panelu klubu, Claude lub Codex z kluczem API, albo integracja klubu. ## Skąd brać treść [Dział zatytułowany „Skąd brać treść”](#skąd-brać-treść) * **Cała baza jednym plikiem**: `/llms-full.txt` (pełny tekst) i `/llms.txt` (spis stron z opisami). Oba pliki są generowane z tych samych stron, które czyta człowiek. * **Jedna strona**: adres strony bez zmian; treść jest zwykłym HTML z nagłówkami H2. * Język źródłowy to polski. Wersje EN i DE są lustrami i mogą być o krok w tyle. ## Kolejność działań agenta [Dział zatytułowany „Kolejność działań agenta”](#kolejność-działań-agenta) 1. **Ustal cel klubu**, nie ekran. Dopasuj do scenariusza z tej bazy po tytule i polu `id` (`UC-004`). 2. **Przeczytaj “Zanim zaczniesz”** i sprawdź warunki narzędziami do odczytu: `get_website_status`, `get_plan_info`, `get_module_catalog`, `list_*`. 3. **Wykonaj sekcję “Przez API / MCP”** narzędziami dokładnie o tych nazwach. Nazwy pochodzą z `tools/list`; jeśli narzędzia nie ma na Twojej liście, nie zgaduj - klucz może nie mieć scope’u. 4. **Zweryfikuj efekt** odczytem (`list_page_blocks`, `get_post`, `list_games`) i podaj klubowi publiczny adres do sprawdzenia. 5. **Powiedz wprost, czego nie zrobiłeś.** Jeśli krok jest tylko w panelu, podaj ścieżkę dokładnie tak, jak w sekcji “Krok po kroku w panelu”, jako klikalny link. ## Kontekst klubu [Dział zatytułowany „Kontekst klubu”](#kontekst-klubu) * Klucz klubu działa w kontekście tego klubu automatycznie. * Klucz platformowy (Sportigio) wymaga `space_id` w **każdym** wywołaniu. `use_space` działa tylko w obrębie jednego requestu i nie przenosi się na kolejne. Bez `space_id` listy wracają puste i wygląda to jak “klub bez danych”. ## Pliki i obrazy [Dział zatytułowany „Pliki i obrazy”](#pliki-i-obrazy) * Każde pole graficzne w API (`logo_url`, `photo_url`, `image_url`) przyjmuje **publiczny adres https**. Adresy prywatne, lokalne i wewnętrzne są odrzucane; niektóre narzędzia w takim wypadku po cichu używają grafiki domyślnej. * Plik z dysku wgrywasz przez `POST /api/v1/uploads` (multipart `file=@...`) i używasz zwróconego `url`. Narzędzie `upload_file` przyjmuje tylko `url` albo małe `data_base64`. ## Czego nie obiecywać [Dział zatytułowany „Czego nie obiecywać”](#czego-nie-obiecywać) * Sprzedaży i zwrotów biletów, wysyłki newsletterów i push (tylko szkice), zmian planu, zarządzania zespołem, własnej domeny (zgłoszenie do wsparcia przez `report_support_issue`). * Sekcji, których nie ma w katalogu API: karuzela kart, licznik biletów, sklep, social media, sekcja z kolumnami - te tylko w panelu. ## Gdy baza i narzędzie się różnią [Dział zatytułowany „Gdy baza i narzędzie się różnią”](#gdy-baza-i-narzędzie-się-różnią) Twoja aktualna lista narzędzi jest źródłem prawdy o tym, co umiesz. Ta baza mówi, **jak** to robić i **co** klub widzi. Jeśli narzędzie istnieje, a baza o nim milczy, użyj narzędzia i zgłoś brak w bazie ([Rozwijanie bazy](/contributing/update-prompt/)). # Mapa scenariuszy i narzędzi > Każdy scenariusz z tej bazy z narzędziami MCP, które go realizują, i ścieżką w panelu dla kroków bez API. Tabela do szybkiego dopasowania: cel klubu → scenariusz → narzędzia do odczytu i zapisu → ścieżka w panelu, gdy API nie wystarcza. | Scenariusz | Cel klubu | Odczyt | Zapis | Tylko w panelu | | --------------------------------------- | ----------------------------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | | [UC-001](/getting-started/first-steps/) | Nazwa, logo, kolory, social | `get_social_links` | `set_club_logo`, `update_social_links`, `save_club_profile` | Ustawienia > Ogólne (nazwa, dyscyplina), Ustawienia > Wygląd (kolory) | | [UC-002](/website/publish/) | Opublikuj stronę | `get_website_status`, `get_plan_info` | `set_website_published`, `set_default_landing` | Ustawienia > Udostępnianie (subdomena, własna domena, przełącznik Strona WWW) | | [UC-003](/website/appearance/) | Nagłówek, slider, stopka | `get_site_design_settings` | `update_site_design_settings` | Wygląd: czcionki, edytor stylów PRO | | [UC-004](/website/homepage-sections/) | Sekcje strony głównej | `list_page_blocks` | `create_page_block`, `update_page_block`, `move_page_block`, `reorder_page_blocks`, `delete_page_block`, `create_club_banner` | Karuzela kart, licznik biletów, sklep, social media, sekcja z kolumnami | | [UC-005](/website/menu/) | Menu strony | `list_menu_items` | `create_menu_item`, `update_menu_item`, `reorder_menu_items`, `delete_menu_item` | - | | [UC-006](/website/subpages/) | Podstrony | `list_infopages`, `get_infopage` | `create_infopage`, `update_infopage`, `create_sponsors_page`, `create_database_page` | Usuwanie podstrony | | [UC-007](/content/news/) | Aktualności | `list_posts`, `get_post`, `list_tags`, `get_game_context` | `create_post`, `update_post`, `delete_post`, `reorder_pinned_posts` | Upload okładki z dysku (albo `/api/v1/uploads`) | | [UC-008](/content/matches/) | Mecze i wyniki | `list_clubs`, `list_games`, `get_game`, `get_standings`, `get_game_context` | `create_club`, `update_club`, `create_game`, `update_game`, `delete_game`, `save_game_link`, `configure_games_sync` | Nazwa ligi i sezonu, skład meczowy, wydarzenia meczowe | | [UC-009](/content/squad/) | Kadra | `get_positions`, `list_players`, `get_player` | `create_player`, `update_player`, `create_player_team`, `set_player_teams`, `bulk_set_player_teams`, `delete_player` | Kolejność drużyn | | [UC-010](/content/sponsors/) | Sponsorzy | `list_sponsor_categories`, `list_sponsors`, `get_header_partner_logos` | `create_sponsor_category`, `create_sponsor`, `update_sponsor`, `reorder_sponsors`, `reorder_sponsor_categories`, `update_header_partner_logos` | - | | [UC-012](/earn/store-orders/) | Zamówienia ze sklepu | `list_store_orders`, `get_store_order`, `get_store_settings` | `update_store_order_status` (wysyła zawsze wbudowany mail o statusie) | Przegląd sklepu, Napisz wiadomość, podgląd wysłanych maili, numer przesyłki, zwrot, anulowanie | | [UC-013](/earn/store-emails/) | Maile do kupujących | - | - | Ustawienia sklepu > Maile: adres kontaktowy, automatyzacje, własne szablony | | [UC-014](/earn/store-message-buyers/) | Wiadomość do wielu kupujących | `list_store_orders` | - | Zamówienia > Nowa wiadomość | | [UC-015](/earn/store-vat/) | VAT w sklepie | - | - | Ustawienia sklepu > Zamówienia > Stawka VAT; stawka produktu w formularzu produktu | ## Wspólne dla wszystkich [Dział zatytułowany „Wspólne dla wszystkich”](#wspólne-dla-wszystkich) * `POST /api/v1/uploads` - jedyna droga dla pliku z dysku; zwraca `url`. * `report_support_issue` - gdy klub prosi o coś poza zasięgiem narzędzi (własna domena, zwrot płatności, zmiana planu). * `get_platform_guide` - skrócony przewodnik po panelu wbudowany w agenta; ta baza jest jego rozwinięciem. ## Kolejność budowy nowego klubu [Dział zatytułowany „Kolejność budowy nowego klubu”](#kolejność-budowy-nowego-klubu) Sprawdzona 2026-09-24 na klubie demo, od zera do opublikowanej strony w jednym przebiegu: 1. `update_club` (własna drużyna: nazwa, herb) → `create_club` ×N (rywale) 2. `create_game` ×N → `update_game` (wyniki rozegranych) 3. `create_player` ×N (zawodnicy, potem sztab) 4. `create_sponsor_category` → `create_sponsor` ×N 5. `create_post` ×N (dwa przypięte) 6. `create_infopage` ×3 (O klubie, Kontakt, Zostań sponsorem) 7. `create_page_block`: `games_last_next` v6, `news` v6, `media_text`, `players`, `sponsors`, `newsletter` 8. `create_menu_item` (top ×6, buttons ×1, footer ×3), `update_social_links` 9. `update_site_design_settings` → `set_website_published` → `set_default_landing {website}` 10. Sprawdzenie w panelu: **Ustawienia > Udostępnianie**, przełącznik **Strona WWW**. ## Połączenie asystenta (UC-011) [Dział zatytułowany „Połączenie asystenta (UC-011)”](#połączenie-asystenta-uc-011) [Podłącz asystenta AI](/getting-started/connect-ai/). Powyższy katalog dotyczy `/api/v1/mcp`. Osobny `/api/mcp` dla ChatGPT udostępnia tylko `list_posts`, `list_games`, `list_sponsors`, bez zapisu. Odczytaj jego `tools/list`, aby poznać właściwe argumenty. # Podłącz asystenta AI do klubu > Połączenie Claude Code, Codexa i Cursora oraz zakres integracji ChatGPT. ## Cel [Dział zatytułowany „Cel”](#cel) Asystent korzysta z danych właściwego klubu przez MCP. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) Potrzebujesz dostępu do zarządzania klubem, klucza API tego klubu oraz zainstalowanego Claude Code, Codexa lub Cursora. Instrukcję i odczyty sprawdzono lokalnie 2026-09-25. Integracja ChatGPT wymaga jeszcze konfiguracji i publikacji przez Sportigio. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Klucze API** (`/app/api-keys`) i **Podłącz asystenta AI**. 2. Wybierz zakładkę **Claude Code**, **Codex** albo **Cursor**. 3. Kliknij **Zarządzaj kluczami** i przygotuj osobny klucz klubowy. Do przeglądania wybierz `content:read`, `matches:read` i `sponsors:read`. 4. Udostępnij klucz procesowi asystenta jako zmienną środowiskową `SPORTIGIO_CLUB_MCP_TOKEN`. Nie wpisuj go do rozmowy ani pliku w repozytorium. 5. Kliknij **Kopiuj konfigurację**. Dodaj fragment do `.mcp.json` dla Claude Code, `~/.codex/config.toml` dla Codexa albo `~/.cursor/mcp.json` dla Cursora. Zachowaj istniejące serwery. 6. Uruchom ponownie asystenta i sprawdź serwer `sportigio-club`. Poproś o ostatnie posty bez wprowadzania zmian. ![Instrukcja połączenia na lokalnym klubie demo](/_astro/admin-mcp-connect.BYjDfbyh_Z4q85P.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) Asystent łączy się z klubowym `/api/v1/mcp` i działa w zakresie uprawnień klucza. Zakładki generują konfigurację dla aktualnej domeny klubu. Claude Code oznacza aplikację CLI, nie Claude w przeglądarce. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) Połączenia i sekretu nie tworzysz przez te narzędzia. Przygotuj je w panelu i konfiguracji klienta. Osobny profil ChatGPT korzysta z `/api/mcp`, OAuth i zgody na jeden klub. Ma wyłącznie `list_posts`, `list_games`, `list_sponsors`, z polami `page`, `per_page` i dodatkowo `scope` dla meczów. Przed wywołaniem odczytaj `tools/list`, ponieważ schemat różni się od `/api/v1/mcp`. Dostęp wygasa po godzinie i wymaga ponownego połączenia. Aktywne połączenie można wcześniej odwołać na stronie **Podłącz asystenta AI**. Jeśli panel pokazuje oczekiwanie na konfigurację, klub nie uruchomi jeszcze integracji ChatGPT samodzielnie. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * Zmienna środowiskowa musi być widoczna dla procesu aplikacji. Zmienna ustawiona w terminalu nie zawsze trafia do aplikacji uruchomionej z Docka. * Nie zastępuj całego pliku konfiguracji: dopisz serwer do istniejącej sekcji. * Klucz platformowy superadmina nie jest kluczem klubu i nie należy do publicznego połączenia ChatGPT. * Podczas testów lokalnych używaj `http://klub1.sportigio.test.localhost`. Zdalny ChatGPT wymaga publicznego HTTPS. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Mapa scenariuszy i narzędzi](/for-agents/tool-map/) * [Aktualności klubu](/content/news/) # Pierwsze kroki w panelu > Logowanie, nazwa klubu, dyscyplina, logo, kolory i media społecznościowe - fundament, z którego korzysta strona, profil, bilety i maile. * Scenariusz UC-001 * Plan każdy * Czas 10 minut ## Cel [Dział zatytułowany „Cel”](#cel) Klub ma poprawną nazwę, logo, kolory i linki do social mediów, zanim zacznie cokolwiek publikować. Te ustawienia dziedziczy wszystko: strona WWW, profil (link in bio), bilety, maile do kibiców i portal rodzica. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Konto administratora klubu (zaproszenie od właściciela przestrzeni albo rejestracja). * Logo klubu w PNG z przezroczystym tłem, najlepiej kwadratowe, co najmniej 512 px. * Adresy profili klubu na Facebooku, Instagramie, YouTube (wystarczy nazwa profilu). ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Zaloguj się pod adresem klubu (`/login`). Po zalogowaniu widzisz **Pulpit** z powitaniem, statystykami i skrótami. 2. Otwórz **Ustawienia** (ikona koła zębatego na dole lewego paska) i zostań w zakładce **Ogólne**. 3. Wpisz **Nazwę organizacji**. To nazwa, którą kibic zobaczy w nagłówku strony, w tytule karty przeglądarki i w mailach. 4. Sprawdź **Dyscyplinę sportu** (przycisk **Zmień**). Dyscyplina decyduje o polach meczu i pozycjach zawodników, więc ustaw ją przed dodaniem kadry. 5. W sekcji **Media społecznościowe** wklej nazwę profilu albo pełny adres. Ikony na stronie pojawią się tylko dla wypełnionych pól. 6. Kliknij **Zapisz Zmiany**. 7. Przejdź do zakładki **Wygląd**. Wgraj **Logo** (herb w nagłówku, stopce, na biletach) oraz osobno **Ikonę aplikacji** (kwadrat na ekranie telefonu i w karcie przeglądarki). 8. Ustaw **Kolor główny** (tło nagłówka slidera, przyciski) i **Kolor akcentu**. Kliknij **Zapisz Zmiany**. ![Ustawienia ogólne klubu](/_astro/admin-settings.BUtEQzIV_Z1XDFYw.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Nagłówek strony i profil pokazują nowe logo i nazwę. * Slider, przyciski i karty meczów przyjmują kolor główny. * Ikony social mediów w nagłówku i stopce prowadzą do wpisanych profili. Sprawdź na stronie klubu (przycisk **Podgląd** w prawym górnym rogu panelu, ikona oka). ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | ------------------------------------ | ------------------------------------------------------------------------------- | | Logo w nagłówku, stopce, na biletach | `set_club_logo {target: "logo", url}` | | Ikona aplikacji / favicon | `set_club_logo {target: "icon", url}` | | Media społecznościowe | `update_social_links {facebook, instagram, youtube, tiktok, linkedin, twitter}` | | Opis klubu dla asystenta AI | `save_club_profile {club_info}` | | Plik z dysku na adres URL | `POST /api/v1/uploads` (multipart `file=@logo.png`), potem `url` w polu `url` | Nazwy organizacji, dyscypliny i kolorów nie da się dziś zmienić przez API - agent ma wskazać **Ustawienia > Ogólne** i **Ustawienia > Wygląd**. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Logo z białym tłem** wygląda jak biały kwadrat na ciemnym nagłówku. Użyj PNG z alfą. * **Zbyt jasny kolor główny** zjada biały tekst na przyciskach. Sprawdź kontrast na podglądzie strony, zanim zapiszesz. * Import logo z adresu URL działa tylko dla **publicznych adresów https**. Adresy lokalne i prywatne są odrzucane. * Zmiana dyscypliny po dodaniu kadry nie przepisuje pozycji zawodników. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Opublikuj stronę klubu](/website/publish/) * [Ustaw wygląd strony](/website/appearance/) # Jak korzystać z tej bazy > Układ stron, oznaczenia planów, ścieżki w panelu i to, jak czytać sekcję dla agentów AI. Każda strona w tej bazie to jeden **scenariusz**: coś, co klub chce osiągnąć. Nie opisujemy ekranów po kolei, tylko drogę od celu do efektu, który widzi kibic, rodzic albo sponsor. ## Układ każdego scenariusza [Dział zatytułowany „Układ każdego scenariusza”](#układ-każdego-scenariusza) 1. **Cel** - jedno zdanie. 2. **Zanim zaczniesz** - plan, włączony moduł, pliki, które warto mieć pod ręką. 3. **Krok po kroku w panelu** - ścieżka i nazwy przycisków dokładnie tak, jak je widać. 4. **Efekt** - co się zmienia na stronie i gdzie to sprawdzić. 5. **Przez API / MCP** - te same kroki narzędziami, których używa agent AI Sportigio. 6. **Pułapki** - rzeczy, które naprawdę psuły się klubom. 7. **Zobacz też** - powiązane scenariusze. ## Jak czytamy ścieżki [Dział zatytułowany „Jak czytamy ścieżki”](#jak-czytamy-ścieżki) Ścieżka `Treści > Mecze > Ustawienia` oznacza: lewy pasek panelu, dział **Treści**, pozycja **Mecze**, zakładka **Ustawienia**. Adres w nawiasie (`/app/games`) jest wsparciem - możesz go wkleić po domenie klubu, ale w panelu klikasz nazwy, nie adresy. Nowy panel ma adresy `/app/...`. Kilka starszych ekranów (ustawienia konta, udostępnianie, ekran startowy) wciąż mieszka pod `/admin/...`. Oba działają na tej samej sesji. ## Oznaczenia [Dział zatytułowany „Oznaczenia”](#oznaczenia) * **Plan** - `FREE`, `LITE`, `PRO`, `CHAMPION`. Jeśli scenariusz ma oznaczony plan, kroki poniżej tego planu pokażą informację o wymaganym planie zamiast przełącznika. * **Powierzchnie** - `panel` (klikanie), `api` (REST `/api/v1`), `mcp` (narzędzia agenta). ## Dla agentów AI [Dział zatytułowany „Dla agentów AI”](#dla-agentów-ai) Sekcja “Przez API / MCP” podaje nazwy narzędzi z listy `tools/list` serwera MCP Sportigio. Jeśli czegoś nie da się zrobić przez API, piszemy to wprost - agent ma wtedy podać klubowi ścieżkę w panelu, a nie udawać, że wykonał zadanie. Zasady pracy agenta z tą bazą: [Dla agentów AI](/for-agents/overview/). # Ustaw wygląd strony > Układ nagłówka, slider aktualności, stopka, nazwa klubu obok herbu, czcionki i style sekcji. * Scenariusz UC-003 * Plan każdy; style sekcji i nagłówków podstron od PRO * Czas 15 minut ## Cel [Dział zatytułowany „Cel”](#cel) Strona ma układ nagłówka, slidera i stopki dopasowany do klubu, bez ruszania kodu. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Logo i kolory z [Pierwszych kroków](/getting-started/first-steps/). * Co najmniej dwie przypięte aktualności, jeśli chcesz zobaczyć slider z treścią ([Dodaj aktualność](/content/news/)). ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Strona www > Wygląd** (`/app/settings/website`, sekcja **Wygląd**). 2. **Układ nagłówka**: wybierz jeden z wariantów (`x1`, `x2`, `x2_big_logo`, `x2_center`, `x2_mega_menu`, `x4`, `x5`, `x6`, `x7`, `x8`). Każdy ma podgląd na żywo z Twoim logo i menu. `x6` to spokojny domyślny układ z menu w jednej linii; `x7` jest oznaczony PRO. 3. **Nazwa klubu obok herbu**: włącz, jeśli herb jest mało czytelny w małym rozmiarze. 4. **Slider aktualności (hero)**: wybierz wariant (`x1`, `x2`, `x3`, `x6`, `x6a`, `x7`). Slider pokazuje **przypięte** aktualności, nie najnowsze. Bez przypiętych wpisów nie renderuje się wcale. 5. **Stopka**: `domyślna`, `v1`, `simple` lub `v2`. 6. **Kod w prawym górnym rogu**: pole na własny HTML (odliczanie, baner sponsora, link). Zostaw puste, jeśli nie masz konkretnego celu. 7. Kliknij **Zapisz zmiany** u góry strony. 8. **Ustawienia > Wygląd - zaawansowane** (`/admin/settings`, zakładka Wygląd): czcionka nagłówków i tekstu (nazwa z Google Fonts albo adres pliku), drugi kolor główny i akcentu, kolory trybu ciemnego. 9. Od planu PRO w tej samej sekcji **Wygląd** działa edytor stylów: tytuły sekcji (`classic`, `editorial`, `slash`, `accent_bar`, `centered_line`, `boxed`, rozmiar S-XL), nagłówki podstron (`classic`, `image`, `minimal`, `outline`, `diagonal`, `logo_blur`), zakładki (`underline`, `chips`, `minimal`) i przyciski (`classic`, `square`). Każdy element ma własną kartę i mały podgląd; strona publiczna zmienia się dopiero po zapisie. ![Strona www: Przegląd i wejście do Wyglądu](/_astro/admin-website-settings.CH6-eNrb_Z1efcJm.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) Nagłówek, slider i stopka przyjmują wybrane układy na wszystkich podstronach. Sekcje strony głównej dziedziczą styl tytułów. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | Odczyt układów i dozwolonych wartości | `get_site_design_settings` | | Zmiana nagłówka, slidera, stopki, kodu w rogu, nazwy przy herbie | `update_site_design_settings {header_version, hero_version, footer_alternative, top_right_code, header_show_club_name}` | Wartości `header_version` i `hero_version` muszą pochodzić z listy zwróconej przez `get_site_design_settings`. Czcionek i edytora stylów PRO nie ma w API. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Slider jest pusty, choć są aktualności** - żadna nie jest przypięta. Zobacz [Dodaj aktualność](/content/news/). * **Dwa powitania na górze strony**: slider z ustawień plus sekcja **Powitanie (hero)** na stronie głównej. Wybierz jedno. * Czcionka wpisana z literówką nie ładuje się i strona spada na czcionkę domyślną bez komunikatu. * Edytor stylów PRO na planie FREE/LITE pokazuje informację o planie także przy próbie zapisu. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) * [Opublikuj stronę klubu](/website/publish/) # Ułóż stronę główną z sekcji > Edytor strony głównej - jakie sekcje istnieją, kiedy której użyć, jak zmieniać wersje, kolejność i widoczność. * Scenariusz UC-004 * Plan każdy; karuzela kart, bazy danych i tła sekcji od PRO * Czas 20 minut ## Cel [Dział zatytułowany „Cel”](#cel) Strona główna składa się z gotowych sekcji, które same biorą dane klubu: mecze, aktualności, kadrę, sponsorów. Klub układa kolejność i wybiera wersje wyglądu, nie pisze HTML. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Treści, które sekcje mają pokazać: [aktualności](/content/news/), [mecze](/content/matches/), [kadra](/content/squad/), [sponsorzy](/content/sponsors/). Pusta sekcja pokazuje ramkę “materiały pojawią się tutaj”, a nie znika. * Jedno dobre zdjęcie poziome, jeśli chcesz sekcję **Zdjęcie z tekstem** albo **Powitanie**. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Strona www > Strona główna** albo przycisk **Otwórz edytor strony głównej** w **Strona www > Przegląd** (`/app/page-blocks`). 2. Po lewej jest paleta **Dodaj moduł**. Kliknięcie kafla dodaje sekcję na koniec listy: * **Ogólne**: Banner (grafika), Powitanie (hero), Zdjęcie z tekstem, Własna treść, Zdjęcia, Karuzela kart (PRO), Lista (baza danych). * **Posty**: Aktualności, Lista postów, Video, Galerie. * **Dyscyplina**: Mecze, Licznik biletowy, Kadra. * **Inne**: Sponsorzy, Sklep, Social Media, Program klubowy, Zapis do newslettera, Reklama. * **Layout**: Sekcja z kolumnami. 3. Kliknij nazwę sekcji na liście, żeby otworzyć jej ustawienia: tytuł, **wersja** układu, liczba elementów, widoczność na komputerze i telefonie. Ikona oka po prawej ukrywa sekcję bez usuwania. 4. Kolejność zmieniasz strzałkami góra/dół przy sekcji ([Zmień kolejność sekcji](/website/reorder-homepage-sections/)). Wiersze **Nagłówek**, **Slider - Aktualności** i **Stopka** nie są sekcjami - prowadzą do [ustawień wyglądu](/website/appearance/). 5. **Pokaż podgląd wszystkich** rozwija miniatury; **Podgląd** w prawym górnym rogu otwiera stronę publiczną. ![Edytor strony głównej](/_astro/admin-page-blocks.BCvrVSqD_2ijfA4.webp) ### Które sekcje wybrać [Dział zatytułowany „Które sekcje wybrać”](#które-sekcje-wybrać) | Potrzeba | Sekcja | Uwagi | | --------------------------------------------- | --------------------------------------- | ---------------------------------------------------------------------- | | Terminarz i wyniki | **Mecze** (`games_last_next`) | wersja 6 = slider kart w barwie klubu; wersja 1 ma odliczanie do meczu | | Najnowsze artykuły | **Aktualności** (`news`) | wersja 6 = spokojna siatka, domyślna dla nowych stron | | Artykuły, galerie i wideo w jednym strumieniu | **Lista postów** (`posts`) | nie łącz z **Aktualności**, wpisy się zdublują | | Skład drużyny | **Kadra** (`players`) | wersje 1-8; zakładki drużyn od PRO | | Loga sponsorów | **Sponsorzy** (`sponsors`) | układ `cards`, `plain`, `wall` lub `list` z opisem | | Zdjęcie i tekst z przyciskiem | **Zdjęcie z tekstem** (`media_text`) | przemiennie lewo/prawo, gdy jest kilka | | Duże powitanie ze zdjęciem | **Powitanie** (`hero`) | pierwsza sekcja i tylko raz; zamiast slidera, nie obok | | Zbieranie adresów e-mail | **Zapis do newslettera** (`newsletter`) | zapisy trafiają do kontaktów ze źródłem `website` | | Wyróżnik: 1,5% podatku, nabór, zbiórka | baner klubu (`html` z gotowym układem) | w barwach klubu, trzy układy | | Coś, czego nie ma w katalogu | **Własna treść** (`html`) | edytor z szablonami i “Poproś AI”; sam pilnujesz odstępów | ## Efekt [Dział zatytułowany „Efekt”](#efekt) Strona główna pokazuje sekcje w ustalonej kolejności, w barwach klubu, na komputerze i telefonie. Nowe mecze, wpisy i zawodnicy pojawiają się w sekcjach automatycznie. ![Strona główna Sportigio FC](/_astro/home.DZTl2srH_1RkXes.webp) ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | --------------------------------------------------- | ------------------------------------------------------- | | Lista sekcji i katalog typów z dozwolonymi wersjami | `list_page_blocks` | | Nowa sekcja | `create_page_block {content_type, version, title, ...}` | | Zmiana tytułu, wersji, widoczności, treści | `update_page_block {id, ...}` | | Przesunięcie jednej sekcji pod inną | `move_page_block {id, reference_id, position}` | | Pełna kolejność | `reorder_page_blocks {ids}` | | Usunięcie | `delete_page_block {id}` | | Gotowy baner wyróżnika w barwach klubu | `create_club_banner {kind, heading, ...}` | | Zdjęcie do sekcji | `POST /api/v1/uploads`, potem `image_url` | Kolejność, która działa dla nowego klubu: `games_last_next` v6, `news` v6, `media_text`, `players`, `sponsors`, `newsletter`. Przez API nie postawisz **Karuzeli kart**, **Licznika biletowego**, **Sklepu**, **Social Media** ani **Sekcji z kolumnami** - te tylko w panelu. Odwrotnie: sekcję **Nadchodzące wydarzenia** (`events_upcoming`) postawi tylko API. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Aktualności obok Listy postów** pokazują ten sam artykuł dwa razy. * **Powitanie (hero) pod sliderem** daje dwa duże bloki na górze. Wybierz jedno ([wygląd](/website/appearance/)). * **Sekcja Mecze nie znika po sezonie** - dalej pokazuje ostatnie wyniki. * Zdjęcie do sekcji importowane z adresu URL musi być **publiczne (https)**. Adresy prywatne i lokalne są odrzucane bez komunikatu w panelu. * Tło sekcji (`club`, `color`, `gradient`, `image`) i filtry tagów zapisują się tylko na PRO, także przez API. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ustaw wygląd strony](/website/appearance/) * [Dodaj podstronę](/website/subpages/) * [Dodaj sponsora](/content/sponsors/) # Zbuduj menu strony > Menu górne, przyciski w nagłówku, stopka i menu mobilne - pozycje, podmenu, linki do podstron i modułów. * Scenariusz UC-005 * Plan każdy * Czas 10 minut ## Cel [Dział zatytułowany „Cel”](#cel) Kibic z nagłówka trafia do meczów, kadry, aktualności i podstron klubu, a w nagłówku jest jeden wyraźny przycisk (bilety, zapisy, sponsoring). ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Podstrony, do których chcesz linkować ([Dodaj podstronę](/website/subpages/)). * Lista pięciu, najwyżej siedmiu pozycji menu górnego. Dłuższe menu łamie się na telefonie. ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Strona www > Menu** (`/app/menu`). Na górze jest schemat strony z licznikami pozycji w każdym obszarze: **Menu Górne**, **TOP - Przyciski**, **Stopka**, **Menu dolne (mobile)**, **Blok - linki**. 2. Kliknij obszar, np. **Menu Górne**, potem **+ Dodaj pozycję menu**. 3. Wpisz nazwę i wybierz **jeden** cel: * **Moduł** - gotowa strona Sportigio: Aktualności, Terminarz i Wyniki, Terminarz, Wyniki, Tabela (wskaż ligę), Zawodnicy (opcjonalnie drużyna), Galerie, Lista Video, Sponsorzy, Kalendarz, Oferta reklamowa, Wsparcie klubu, Klub biznesu; * **Podstrona** - strona z **Treści > Strony**; * **Własny adres** - pełny URL albo ścieżka względna, np. `/tickets`. 4. Zapisz. Pozycja pojawia się na liście z akcjami: **+** (dodaj pozycję podrzędną, czyli rozwijane podmenu), strzałki góra/dół (kolejność), **Edytuj**, kosz. 5. Przełącz zakładkę **TOP - Przyciski** i dodaj jeden przycisk akcji, np. **Zostań sponsorem** do podstrony sponsoringu albo **Bilety** do `/tickets`. 6. W **Stopce** powtórz najważniejsze linki: O klubie, Kontakt, Partnerzy. ### Zobacz na ekranie [Dział zatytułowany „Zobacz na ekranie”](#zobacz-na-ekranie) [Twoja przeglądarka nie odtwarza wideo. Pobierz GIF.](/media/uc-005/uc-005-add-menu-item.gif) **Krok 2** - przycisk **+ Dodaj pozycję menu** nad listą. ![](/_astro/02-add-button.DbB-ccSs_Z1BEQlW.webp) **Krok 3** - cel pozycji: tu **Moduł** i wybór **Galerie Zdjęć** z listy. Tytuł wypełnia się sam. ![](/_astro/03-pick-module.Bn6KIfrL_21fz6o.webp) **Krok 3** - własny tytuł zamiast podpowiedzianego. ![](/_astro/04-title.W_cascBV_12Lm2c.webp) **Krok 4** - **Zapisz** na dole panelu. ![](/_astro/05-save.BaiIRD5j_1nTaOB.webp) **Efekt** - nowa pozycja na końcu listy, od razu widoczna na stronie. ![](/_astro/06-result.B0xEXxKt_Z1DtXUf.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) Nagłówek pokazuje menu górne i przycisk, stopka swoje linki. Na telefonie menu składa się w hamburger; **Menu dolne (mobile)** to osobny pasek na dole ekranu, jeśli go wypełnisz. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | ---------------------------------------- | ------------------------------------------------------------------------------------------- | | Aktualne menu i lista dostępnych modułów | `list_menu_items` | | Nowa pozycja | `create_menu_item {title, area: top\|buttons\|footer\|links, url \| infopage_id \| module}` | | Podmenu | `create_menu_item {..., parent_id}` (tylko w obszarze `top`, jeden poziom) | | Edycja | `update_menu_item {id, ...}` | | Kolejność w jednym obszarze albo podmenu | `reorder_menu_items {area, ids, parent_id?}` | | Usunięcie | `delete_menu_item {id}` | Cel pozycji to dokładnie jedno z: `url`, `infopage_id`, `module`. Moduł `standing` wymaga `league_id`, moduł `players` przyjmuje `club_id` konkretnej drużyny. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Link do wyłączonego modułu znika ze strony**, choć jest na liście w panelu. Stan modułu wygrywa z widocznością linku - włącz moduł w **Ustawienia > Aktywne moduły**. * **Menu dolne (mobile)** i **Blok - linki** są puste u nowego klubu i nie muszą być wypełnione. Blok linków to osobna sekcja profilu, nie strony [WWW](http://WWW). * Link do Strefy Kibica ma być prawdziwą ścieżką (`/fan/typer`), nigdy `#`. * Podmenu ma jeden poziom. Trzeci poziom nie istnieje. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Dodaj podstronę](/website/subpages/) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) # Opublikuj stronę klubu > Adres klubu, co otwiera się pod domeną główną, włączenie strony WWW i podpięcie własnej domeny. * Scenariusz UC-002 * Plan LITE lub wyższy (publikacja WWW i własna domena) * Czas 10 minut ## Cel [Dział zatytułowany „Cel”](#cel) Kibic wpisuje adres klubu i widzi stronę WWW, a nie ekran “w budowie” ani pusty profil. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Plan **LITE** lub wyższy. Na planie FREE przełącznik strony WWW pokazuje informację o planie. * [Pierwsze kroki](/getting-started/first-steps/): nazwa, logo, kolory. * Co najmniej jedna sekcja na stronie głównej, inaczej strona będzie pusta ([Ułóż stronę główną z sekcji](/website/homepage-sections/)). ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Ustawienia > Udostępnianie** (`/admin/sharing`). 2. **Adres klubu**: sprawdź subdomenę w polu **Adres Sportigio** (`nazwa.sportigio.com`). Dozwolone są małe litery, cyfry i myślniki. Ten adres zostaje z klubem na stałe. 3. **Strona główna**: wybierz, co otwiera się pod adresem klubu. Dla strony WWW zaznacz **Strona WWW**. Pozostałe powierzchnie zachowują swoje podadresy: `/bio`, `/www`, `/hub`. 4. **Twoje strony**: włącz przełącznik przy **Strona WWW**. Obok jest publiczny adres, pod którym strona będzie dostępna. 5. **Własna domena** (opcjonalnie): włącz **Użyj własnej domeny dla strony www** i wpisz domenę, np. `www.klub.pl`. Rekordy DNS ustawia zespół Sportigio po zgłoszeniu - klub nie ma zakładki do DNS. 6. Kliknij **Zapisz ustawienia udostępniania**. Panel przekierowuje na adres klubu i loguje Cię automatycznie, więc od razu widzisz efekt. ![Udostępnianie: adres, strona główna, publikacja](/_astro/admin-sharing.B5b79Lae_LYat2.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) * Adres klubu otwiera stronę [WWW](http://WWW). Profil (link in bio) dalej działa pod `/bio`. * W **Strona www > Przegląd** (`/app/settings/website`) domena ma status **Opublikowane**. * Prawy górny róg panelu (ikona oka) otwiera podgląd strony. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | ------------------------------- | ---------------------------------------------------------------- | | Stan publikacji i liczba sekcji | `get_website_status` | | Włącz stronę | `set_website_published {published: true}` | | Co otwiera adres klubu | `set_default_landing {landing: "website"}` (`bio`, `hub`, `app`) | | Zgłoszenie własnej domeny | `report_support_issue` z nazwą domeny | Subdomeny i własnej domeny nie da się ustawić przez API. Agent ma wskazać **Ustawienia > Udostępnianie** albo zgłosić domenę do wsparcia. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Bez publikacji kibic widzi “w budowie”**, mimo że `/tickets` i portale już działają. * **Domyślnym landingiem nowego klubu jest profil (bio)**, nie strona [WWW](http://WWW). Pusty profil to najgorsze pierwsze wrażenie - ustaw stronę główną świadomie. * **Dwa przełączniki, jedno słowo “publikacja”.** Narzędzie `set_website_published` ustawia publiczną widoczność przestrzeni, a przełącznik **Strona WWW** w Udostępnianiu włącza produkt. Po pracy przez API sprawdź w panelu, czy przełącznik jest włączony. Rozbieżność jest zgłoszona do ujednolicenia. * Własna domena na planie FREE pokazuje plakietkę **LITE** i wraca do adresu platformowego. * Zmiana subdomeny zmienia też adresy w kodach QR i materiałach, które klub już rozdał. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) * [Ustaw wygląd strony](/website/appearance/) * [Zbuduj menu strony](/website/menu/) # Zmień kolejność sekcji na stronie głównej > Przesuń sekcję strony głównej wyżej albo niżej strzałkami w edytorze, np. aktualności nad mecze. * Scenariusz UC-016 * Plan każdy * Czas 1 minuta ## Cel [Dział zatytułowany „Cel”](#cel) Kibic widzi na stronie głównej najpierw to, co klub uważa za najważniejsze, np. aktualności nad meczami. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) Sekcje, które chcesz przestawić, są już na stronie głównej. Jak je dodać: [Ułóż stronę główną z sekcji](/website/homepage-sections/). ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Strona www** i kliknij **Otwórz edytor strony głównej** (`/app/page-blocks`). 2. Po prawej jest lista sekcji w tej kolejności, w jakiej widać je na stronie: **1 Mecze**, **2 Aktualności**, **3 Skład** itd. 3. Przy sekcji, którą chcesz przesunąć, kliknij strzałkę w dół albo w górę. Jedno kliknięcie zamienia ją miejscami z sąsiednią sekcją. 4. Zmiana zapisuje się od razu. Nie ma przycisku **Zapisz**. 5. Odśwież stronę główną klubu i sprawdź nową kolejność. ### Zobacz na ekranie [Dział zatytułowany „Zobacz na ekranie”](#zobacz-na-ekranie) [Twoja przeglądarka nie odtwarza wideo. Pobierz MP4.](/media/uc-016/uc-016-reorder-sections.mp4) | Czas | Na ekranie | | ---- | --------------------------------------------------------------------------------------------------------- | | 0:00 | Strona główna klubu: sekcja Mecze jest nad Aktualnościami. | | 0:04 | Panel: **Strona www**, przycisk **Otwórz edytor strony głównej**. | | 0:10 | Edytor: lista sekcji **Nagłówek**, **Slider - Aktualności**, **1 Mecze**, **2 Aktualności**, **3 Skład**. | | 0:14 | Przy sekcji Mecze kliknięta strzałka w dół. Aktualności wskakują na 1. miejsce. | | 0:19 | Odświeżona strona główna: Aktualności są nad Meczami. | ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | ---------------------------------- | ------------------------------------------------------------------- | | Aktualna lista sekcji z id | `list_page_blocks` | | Jedna sekcja tuż nad albo pod inną | `move_page_block {id, reference_id, position: "after" \| "before"}` | | Pełna kolejność wszystkich sekcji | `reorder_page_blocks {ids}` | Agent zawsze pobiera świeżą listę `list_page_blocks` tuż przed przesunięciem. Sekcje rozpoznaje po `content_type` (aktualności to `news`, mecze to `games_last_next`). Do przesunięcia jednej sekcji wystarczy `move_page_block` - nie wymaga pełnej listy id. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Ułóż stronę główną z sekcji](/website/homepage-sections/) * [Ustaw wygląd strony](/website/appearance/) # Dodaj podstronę > Strony informacyjne - O klubie, Kontakt, regulaminy, oferta - z edytorem treści, okładką, adresem i widocznością. * Scenariusz UC-006 * Plan każdy (liczba podstron zależy od planu) * Czas 10 minut ## Cel [Dział zatytułowany „Cel”](#cel) Klub ma podstrony “O klubie”, “Kontakt”, “Zostań sponsorem” pod czytelnymi adresami i podpięte w menu. ## Zanim zaczniesz [Dział zatytułowany „Zanim zaczniesz”](#zanim-zaczniesz) * Tekst podstrony. Wystarczy kilka akapitów i nagłówki drugiego poziomu. * Opcjonalnie zdjęcie na okładkę (poziome). ## Krok po kroku w panelu [Dział zatytułowany „Krok po kroku w panelu”](#krok-po-kroku-w-panelu) 1. Otwórz **Treści > Strony** (`/app/infopages`). Zakładki: **Własne** (Twoje podstrony), **Domyślne** (strony systemowe, np. regulaminy portali), **Bazy danych** (mini-bazy do list na stronie). 2. Kliknij **+ Nowa Strona**. 3. Wpisz **Tytuł**. Adres (slug) powstaje z tytułu; możesz go zmienić przed pierwszą publikacją. Slug wchodzi wprost do adresu: `/o-klubie`. 4. Wpisz treść w edytorze (nagłówki, listy, linki, obrazy). Dla dłuższych stron używaj nagłówków H2 - przeglądarka i agent AI lepiej czytają strukturę. 5. Opcjonalnie wgraj **okładkę** i ustaw **widoczność**: publiczna, tylko dla zalogowanych albo tylko dla członków z pakietem (osoba bez dostępu widzi zajawkę i przycisk). 6. Zapisz. Na liście każda strona ma ikony: podgląd, udostępnij (link i QR), więcej. 7. Dodaj stronę do menu: [Zbuduj menu strony](/website/menu/). ![Lista podstron](/_astro/admin-infopages.By1_jC10_Z1BFkN4.webp) ## Efekt [Dział zatytułowany „Efekt”](#efekt) Podstrona jest dostępna pod `adres-klubu/slug`, z nagłówkiem strony w stylu z [ustawień wyglądu](/website/appearance/) i w menu, jeśli ją tam dodałeś. ## Przez API / MCP [Dział zatytułowany „Przez API / MCP”](#przez-api--mcp) | Krok | Narzędzie | | --------------------------------------------- | ------------------------------------------------------------------------- | | Lista podstron (id, tytuł, slug) | `list_infopages` | | Nowa podstrona | `create_infopage {title, content (HTML), slug?, photo_url?, visibility?}` | | Treść jednej strony | `get_infopage {id}` | | Zmiana tytułu, treści, okładki | `update_infopage {id, ...}` | | Podstrona sponsorów z gotową sekcją logotypów | `create_sponsors_page` | | Podstrona z listą z mini-bazy | `create_database_page {database_id}` | Treść to gotowy HTML bez `` i ``. Okładka z `photo_url` musi być publicznym adresem https. ## Pułapki [Dział zatytułowany „Pułapki”](#pułapki) * **Zmiana slugu po publikacji psuje linki** rozdane w social mediach i na drukach. * **Strona nie jest widoczna, dopóki nie ma jej w menu** albo nie podlinkujesz jej z sekcji. Sam zapis nie dodaje pozycji menu. * Podstrona z widocznością “członkowie” bez aktywnych pakietów członkowskich pokazuje wszystkim tylko zajawkę. * Liczba podstron jest limitowana planem; przy limicie przycisk **+ Nowa Strona** pokazuje informację o planie. ## Zobacz też [Dział zatytułowany „Zobacz też”](#zobacz-też) * [Zbuduj menu strony](/website/menu/) * [Dodaj sponsora](/content/sponsors/)