Audyt SEO dużego serwisu z AI
Robisz audyt serwisu z setkami tysięcy adresów: sitemapy, crawl, indeksacja, duplikaty, kanibalizacja, schema. AI liczy i grupuje dane, wnioski piszesz ty. Kończysz raportem dla zarządu i sprzedajesz audyt za 3-15 tys. zł.
- Robisz crawl dużego serwisu tak, żeby nie położyć serwera i nie utonąć w danych.
- Analizujesz sitemapy liczone w setkach tysięcy adresów i porównujesz je ze stanem indeksu i crawla.
- Wykrywasz duplikaty, kanibalizację i błędy adresów kanonicznych, planujesz scalenia z przekierowaniami.
- Piszesz z Claude Code skrypty do pobierania i łączenia danych z Search Console, logów i crawla.
Duży serwis psuje się po cichu. Jedna zmiana w szablonie potrafi wyrzucić z indeksu tysiące stron. Na noktus.pl awaria noindex zdjęła z Google 1311 wpisów i to ja ją odkręcałem. Wyniosłem z tego zasadę, która wraca w każdym module: pusta odpowiedź API to „nie wiem”, a nie „zero”. Na podstawie braku danych nie zmieniam niczego masowo.
Na czym zarabiasz
Przy najniższej stawce (3 000 zł) tyle wystarczy, żeby kurs za 1 490 zł się zwrócił.
Duży serwis traci pieniądze na każdym błędzie indeksacji, więc wartość audytu łatwo pokazać. Cena zależy od skali i zakresu, od jednego obszaru po pełny audyt z planem wdrożeń. Po audycie często przychodzi zlecenie na nadzór nad wdrożeniem. Stawki są orientacyjne, nie gwarantuję zarobku.
Tak wygląda środek
Początek pierwszej lekcji, bez skrótów. Resztę i 27 kolejnych lekcji dostajesz w panelu.
Zakres i pytania biznesowe
Serwis obyty.pl miał być o zdrowiu: 741 opublikowanych wpisów o objawach, badaniach i lekach. Kiedy we wrześniu otworzyłem Search Console, wyświetlenia zbierały zupełnie inne teksty. Porównanie Emirates A380 z Boeingiem 777 miało ich 219, tekst o przeciętnym wynagrodzeniu według GUS 221, a poradnik o trzech formularzach do Wietnamu 67 wyświetleń i 5 kliknięć. Cały serwis zebrał w 90 dni 25 kliknięć.
To stare wpisy z poprzedniego wcielenia domeny. Audyt robiony według podręcznika kazałby je usunąć jako niepasujące do tematu, a to były jedyne strony, które w ogóle działały. Dlatego audyt dużego serwisu zaczynam od rozmowy i od pytania o pieniądze. Crawler odpalam później.
Krok 1. Pięć pytań na pierwszą rozmowę
Rozmowę prowadzę według stałej listy. Odpowiedzi zapisuję dosłownie, bo wracam do nich, kiedy układam priorytety.
- Z czego serwis żyje i które sekcje na to pracują. Reklama, afiliacja, subskrypcje, zapytania ofertowe. Na moim serwisie naukowym noktus.pl przychód 3 013 zł brał się z odsłon na wp.pl w programie WP Kreator, a nie z ruchu na własnej domenie. Licznik pokazywał wtedy 36 wejść dziennie przy 1 395 wpisach. Audyt indeksacji by tego nie wykrył, a po końcu programu pieniądze znikały bez względu na stan indeksu.
- Co się zmieniło i kiedy. Migracje, nowe szablony, wtyczki, automaty, które publikują albo czyszczą treść. Proszę o daty, choćby przybliżone.
- Kiedy spadł ruch i według którego narzędzia. Analityka, Search Console i panel reklamowy liczą różne rzeczy.
- Czego nie wolno ruszać.
- Kto wdroży zalecenia i ile ma na to czasu. Lista osiemdziesięciu zadań dla zespołu z jednym programistą na pół etatu zostanie w szufladzie, choćby każde zadanie było słuszne.
Drugie pytanie wygląda na formalność, dopóki nie trafisz na zmianę, o której nikt nie pamięta. Na promptowy.com czytelnik zgłosił, że strona wygląda jak goły HTML: niebieskie linki, punktory zamiast menu. Winna była wtyczka, która przy każdej publikacji czyściła cache razem ze zminifikowanymi plikami CSS i JS. Przy 7-24 wpisach dziennie arkusze znikały kilkanaście razy na dobę, a strony w tym oknie odwoływały się do pliku, którego nie było. Bez pytania o automaty szukałbym błędu w szablonie.
Krok 2. Sekcje i koncentracja ruchu
Odpowiedzi klienta sprawdzam w danych, zanim cokolwiek zacznę crawlować. Skrypt pobiera z Search Console wszystkie strony z wyświetleniami i sumuje je według pierwszego fragmentu ścieżki, czyli sekcji. Drugi wynik to koncentracja: jaki procent kliknięć robi najmocniejsza strona, pierwsza piątka, dwudziestka i setka.
# sekcje.py - ktore sekcje serwisu robia ruch z Google (Search Console API)
# uzycie: python sekcje.py https://www.domena.pl/ 28
# wymaga: pip install google-auth requests oraz klucz.json konta uslugi
import csv
import sys
import datetime as dt
from collections import defaultdict
from urllib.parse import quote, urlparse
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
sys.stdout.reconfigure(encoding="utf-8")
WLASCIWOSC = sys.argv[1]
DNI = int(sys.argv[2]) if len(sys.argv) > 2 else 28
klucz = service_account.Credentials.from_service_account_file(
"klucz.json", scopes=["https://www.googleapis.com/auth/webmasters.readonly"])
sesja = AuthorizedSession(klucz)
API = ("https://searchconsole.googleapis.com/webmasters/v3/sites/"
+ quote(WLASCIWOSC, safe="") + "/searchAnalytics/query")
koniec = dt.date.today() - dt.timedelta(days=3) # dane maja 2-3 dni opoznienia
start = koniec - dt.timedelta(days=DNI - 1)
def wszystkie_strony():
"""Stronicuje po 25 000 wierszy. API sortuje po kliknieciach i ucina reszte."""
wiersze, od = [], 0
while True:
r = sesja.post(API, json={
"startDate": start.isoformat(), "endDate": koniec.isoformat(),
"dimensions": ["page"], "rowLimit": 25000, "startRow": od}, timeout=120)
r.raise_for_status() # blad to wyjatek, nie pusta lista
paczka = r.json().get("rows", [])
wiersze += paczka
if len(paczka) < 25000:
return wiersze
od += 25000
dane = wszystkie_strony()
if not dane:
sys.exit("Zero wierszy z API. Nie licze udzialow - sprawdz wlasciwosc i daty.")
sekcje = defaultdict(lambda: [0, 0, 0]) # klikniecia, wyswietlenia, strony
for w in dane:
sciezka = urlparse(w["keys"][0]).path.strip("/")
nazwa = "/" + sciezka.split("/")[0] + "/" if sciezka else "/ (glowna)"
s = sekcje[nazwa]
s[0] += w["clicks"]
s[1] += w["impressions"]
s[2] += 1
suma = sum(w["clicks"] for w in dane) or 1
print(f"{start} - {koniec}: {len(dane)} stron z wyswietleniami, {suma:.0f} klikniec")
ranking = sorted(sekcje.items(), key=lambda x: -x[1][0])
for nazwa, (k, wy, n) in ranking[:25]:
print(f"{nazwa[:45]:45} {k:>9.0f} klik {k / suma:6.1%} {wy:>11.0f} wysw {n:>7} stron")
po_klik = sorted(dane, key=lambda w: -w["clicks"])
for n in (1, 5, 20, 100):
udzial = sum(w["clicks"] for w in po_klik[:n]) / suma
print(f"pierwsze {n:>3} stron = {udzial:.0%} klikniec")
with open("sekcje.csv", "w", newline="", encoding="utf-8") as f:
zapis = csv.writer(f)
zapis.writerow(["sekcja", "klikniecia", "wyswietlenia", "strony"])
for nazwa, (k, wy, n) in ranking:
zapis.writerow([nazwa, k, wy, n])Uruchamiam go poleceniem python sekcje.py https://www.domena.pl/ 28. Potrzebne są biblioteki google-auth i requests oraz plik klucza konta usługi, o którym piszę w następnej lekcji. Na WordPressie z wpisami w katalogu głównym pierwszy fragment ścieżki to sam wpis. Wtedy sekcje biorę z eksportu kategorii, a ze skryptu zostaje mi koncentracja.
Stronicowanie po 25 000 wierszy jest tam celowo. API sortuje wiersze po kliknięciach i ucina je na limicie. Na promptowy.com zapytałem kiedyś o 500 stron i wyszło mi, że tylko 3 z 41 recenzji mają jakiekolwiek wyświetlenia. Serwis miał 3 269 stron z wyświetleniami, a recenzje z zerem kliknięć po prostu nie zmieściły się w limicie. Po powtórzeniu pomiaru wyświetlenia miało 38 z 40.
Koncentracja na promptowym wyglądała tak: trzy strony o filtrze lat 80. dawały 57 procent kliknięć z 28 dni, pierwsza piątka 72 procent. Awaria szablonu tych trzech adresów kosztowałaby więcej niż bałagan w pozostałych ponad 2 500 adresach z map witryny. Od tej proporcji zależy kolejność całego audytu.
28 lekcji, ok. 9 h 13 min nauki
Każda lekcja to tekst z przykładami z moich zleceń, kodem i promptami do skopiowania, do tego wersja audio i zadanie na koniec.
- lekcje
- 28
- moduły
- 7
- czas nauki
- 9 h 13 min
- gotowe
- z audio
- pliki
- 29
M01Przygotowanie audytu dużej skali4 lekcje · 1 h 13 min
-
01
Zakres i pytania biznesoweOd czego zaczynam rozmowę z klientem: które sekcje zarabiają, co się zmieniło, kiedy spadł ruch. Audyt bez pytań biznesowych to lista błędów bez priorytetów.za darmo
-
02
Dostępy i daneSearch Console, analityka, logi serwera, dostęp do CMS. Jak pracuję, gdy klient nie daje dostępów - tryb black-box.gotowa
-
03
Środowisko pracy z Claude CodeFolder audytu, skrypty, dane w CSV i SQLite, notatki. Jak prowadzę Claude Code, żeby pisał narzędzia pod konkretny serwis.gotowa
-
04
Zasada „nie wiem to nie zero”Historia awarii noindex 1311 wpisów i procedury, które z niej wyniosłem: walidacja odpowiedzi API, progi bezpieczeństwa, zmiany na próbce przed całością.gotowa
M02Sitemapy i crawl4 lekcje · 1 h 26 min
-
05
Sitemapy z milionem adresówJak pobieram i rozpakowuję indeksy sitemap, liczę adresy według typów i znajduję śmieci. Na przykładzie audytu z 1,06 mln URL.gotowa
-
06
Crawl bez kładzenia serweraLimity zapytań, segmentacja, próbkowanie. Kiedy crawl całego serwisu, a kiedy reprezentatywnej próbki.gotowa
-
07
Porównanie trzech zbiorówSitemapy kontra crawl kontra indeks. Strony osierocone, adresy w sitemapach, których nie ma w linkowaniu, i odwrotnie.gotowa
-
08
Kody odpowiedzi i przekierowaniaŁańcuchy przekierowań, 404 w linkowaniu wewnętrznym, soft 404, adresy z parametrami.gotowa
M03Indeksacja4 lekcje · 1 h 24 min
-
09
Raport stron w Search ConsoleJak czytać powody niezaindeksowania na dużej skali i eksportować więcej niż pokazuje interfejs.gotowa
-
10
URL Inspection API na próbkachSkrypt do sprawdzania stanu indeksu na próbce adresów i limity API. Dlaczego brak odpowiedzi trzeba zapisać jako brak danych.gotowa
-
11
Logi serwera i budżet crawlowaniaCo Googlebot odwiedza, jak często i na co traci czas. Analiza logów z pomocą AI.gotowa
-
12
Noindex, canonical, robots - pułapkiKonflikty sygnałów, kanoniczne do stron z noindex, blokady w robots.txt. Jak wykryć awarię szablonu, zanim zabierze ruch.gotowa
M04Duplikaty i kanibalizacja4 lekcje · 1 h 27 min
-
13
Wykrywanie duplikatówPodobieństwo treści, tytułów i nagłówków. Jak grupuję tysiące wpisów i weryfikuję grupy z AI.gotowa
-
14
Kanibalizacja w danych Search ConsoleZapytania, na które konkuruje kilka adresów. Skrypt wskazujący pary do scalenia lub rozdzielenia.gotowa
-
15
Scalanie bez utraty ruchuJak scaliłem 265 duplikatów: wybór adresu docelowego, łączenie treści, przekierowania 301, aktualizacja linków wewnętrznych.gotowa
-
16
Thin content i strony do usunięciaKiedy usuwać, kiedy scalać, kiedy rozbudować. Decyzje na danych o ruchu i linkach, nigdy na samym braku danych.gotowa
M05Szablony, schema i wydajność4 lekcje · 1 h 12 min
-
17
Audyt według szablonówDuży serwis to kilka szablonów powtórzonych tysiące razy. Jak wybieram próbki i znajduję błąd, który dotyka całej sekcji.gotowa
-
18
Dane strukturalne na skaliArticle, Product, BreadcrumbList, Organization. Masowa walidacja i typowe błędy w szablonach.gotowa
-
19
Linkowanie wewnętrzne i architekturaGłębokość kliknięć, paginacja, kategorie, tagi. Jak pokazać zarządowi, gdzie ginie moc serwisu.gotowa
-
20
Core Web Vitals według typów stronDane z raportu CrUX i Search Console według szablonów, nie pojedynczych adresów.gotowa
M06Raport dla zespołu i zarządu4 lekcje · 1 h 31 min
-
21
Priorytety: wpływ, koszt, ryzykoJak układam kilkadziesiąt rekomendacji w kolejność, którą zespół jest w stanie wdrożyć.gotowa
-
22
Raport techniczny dla developerówOpis problemu, skala, przykłady adresów, kryterium odbioru. Każda rekomendacja da się zamienić w zadanie.gotowa
-
23
Jedna strona dla zarząduCo jest zagrożone, ile to może kosztować, co zrobić najpierw. Bez żargonu i bez obiecanego wzrostu.gotowa
-
24
Audyt black-box od początku do końcaPrzechodzę skrócony audyt dużego serwisu bez dostępów, od sitemap po podsumowanie dla zarządu.gotowa
M07Sprzedaż i wycena audytów4 lekcje · 1 h
-
25
Skąd biorę zlecenia na duże audytyWstępny skan black-box jako argument, współpraca z agencjami i software house, rozmowy po spadkach ruchu.gotowa
-
26
Wycena 3-15 tys. złJak liczę cenę: skala, liczba szablonów, dostępy, zakres raportu, prezentacja dla zarządu.gotowa
-
27
Umowa, odpowiedzialność i NDAZakres, wyłączenie odpowiedzialności za wdrożenia zespołu klienta, poufność danych, terminy.gotowa
-
28
Po audycie: nadzór i opiekaJak zamieniam audyt w nadzór nad wdrożeniem i stałą współpracę.gotowa
Co umiesz po kursie
Robisz crawl dużego serwisu tak, żeby nie położyć serwera i nie utonąć w danych.
Analizujesz sitemapy liczone w setkach tysięcy adresów i porównujesz je ze stanem indeksu i crawla.
Wykrywasz duplikaty, kanibalizację i błędy adresów kanonicznych, planujesz scalenia z przekierowaniami.
Piszesz z Claude Code skrypty do pobierania i łączenia danych z Search Console, logów i crawla.
Sprawdzasz dane strukturalne i szablony na próbkach.
Wprowadzasz zmiany według procedury, bez masowych noindexów na podstawie pustych odpowiedzi.
Oddajesz raport techniczny dla zespołu i jednostronicowe podsumowanie dla zarządu.
Dla kogo
- Specjalistom SEO, którzy chcą wejść w zlecenia dla dużych serwisów, sklepów i portali.
- Analitykom i SEO-wcom na etacie w firmach z dużymi serwisami.
- Właścicielom portali i blogów z tysiącami wpisów, którym spada ruch.
- Programistom, którzy chcą sprzedawać audyty techniczne z użyciem własnych skryptów.
- Agencjom, które potrzebują powtarzalnego procesu audytu dużej skali.
Komu odradzam
- Zaczynasz od zera w SEO. Potrzebujesz podstaw indeksacji i on-page.
- Szukasz automatu, który sam napisze raport. AI analizuje dane, wnioski i odpowiedzialność są po twojej stronie.
- Obsługujesz tylko małe strony firmowe. Dla serwisu z 20 podstronami ten proces jest za ciężki.
Pliki w panelu
Czego używam
| Claude Code pisanie skryptów i analiza danych | płatne, w ramach planu Claude lub API |
| Python skrypty do sitemap, API i łączenia danych | darmowe |
| Google Search Console + API indeksacja, zapytania, inspekcja adresów | darmowe |
| Screaming Frog SEO Spider crawl i analiza szablonów | darmowa wersja do 500 adresów, większe crawle wymagają licencji |
| Bing Webmaster Tools drugie źródło danych o indeksacji | darmowe |
| Arkusz kalkulacyjny lub SQLite łączenie i filtrowanie dużych zbiorów | darmowe |
Pytania o ten kurs
Czy potrzebuję mocnego komputera?
Wystarczy przyzwoity laptop z 16 GB RAM. Przy milionach adresów pracuję na próbkach i bazie SQLite zamiast trzymać wszystko w arkuszu.
Czy muszę umieć programować?
Nie musisz pisać kodu od zera. Skrypty dostajesz w materiałach, a nowe piszesz z Claude Code. Trzeba umieć je uruchomić i czytać wyniki krytycznie.
Czy w kursie są nagrania wideo?
Nie. Każda lekcja to tekst z przykładami z moich projektów, gotowymi skryptami Pythona, promptami oraz plikami do pobrania. Lekcję możesz też odsłuchać, czyta ją lektor AI. Prompt łatwiej skopiować z tekstu niż z filmu.
Czy da się zrobić audyt bez dostępu do Search Console?
Tak. W lekcji o audycie black-box robię cały audyt bez żadnych dostępów: crawl, mapy witryny, dane publiczne i próbki szablonów. Search Console daje dane o ruchu i kanibalizacji, więc bez niej część wniosków to szacunki i tak je w raporcie oznaczam.
Jak wygląda dostęp i aktualizacje?
Bezterminowy. Aktualizacje lekcji i skryptów są w cenie.
Czym różni się wersja z pracą ze mną?
Dwie konsultacje na piśmie: wysyłasz pytania, odpowiadam w ciągu 2 dni roboczych. Do tego przeglądam twój pierwszy audyt i podsumowanie dla zarządu przed oddaniem klientowi. Rozmów wideo nie prowadzę.
Co z prawem do odstąpienia od umowy?
To treść cyfrowa. Przy zamówieniu zgadzasz się na jej udostępnienie od razu i tracisz wtedy prawo do odstąpienia. Reklamacje rozpatruję w 14 dni.
Piotr Promptowy
Prowadzę promptowy.com, gdzie opublikowałem ponad 3 tysiące tekstów o AI, i newsletter czytany przez kilka tysięcy osób. Robię klipy i reklamy z AI dla znanych artystów i marek, buduję własne narzędzia i sklep z produktami AI. W tym kursie opisuję to, co zrobiłem naprawdę, razem z błędami.
Podobne kursy

GEO: firma, którą poleca ChatGPT

Strona dla lokalnej firmy w jeden dzień
