On-page SEO w 2025: checklista dla każdej podstrony

Pytasz, co dziś naprawdę znaczy „dobry on-page”? W 2025 to nie tylko tytuł i słowo kluczowe w H1. Google coraz lepiej rozumie tematykę, encje i relacje między treściami, a jednocześnie bezlitośnie wyłapuje wolne strony i sztucznie napompowane teksty. Do gry weszły mocniej jakościowe sygnały E-E-A-T, realne doświadczenie autora oraz wrażenia użytkownika mierzone m.in. przez INP. Jeśli strona nie odpowiada szybko, nie prowadzi do konkretnej odpowiedzi i nie jest osadzona w kontekście Twojej całej witryny, spada – nawet jeśli „technicznie” wszystko wygląda dobrze.

Ten artykuł to część naszych treści o nowoczesnym marketingu. Zobacz też kategorie: Poradniki i Case Study

Ta checklista zbiera w jednym miejscu to, co faktycznie podnosi widoczność każdej podstrony: od metadanych i architektury nagłówków, przez intencję wyszukiwania i gęstość informacji, po linkowanie wewnętrzne, dane strukturalne, multimedia, dostępność oraz sygnały zaufania. Uporządkujemy też kwestie często pomijane: kanibalizacja, konsystencja encji, aktualność treści, a nawet mikro-UX (np. czytelne TOC, breadcrumbs, „czas czytania”) wpływający na zaangażowanie.

Dla kogo jest ten materiał? Dla twórców treści, właścicieli firm i SEO, którzy chcą ustandaryzować proces – zamiast każdorazowo „wymyślać SEO na nowo”.

Jak z niego korzystać: potraktuj każdą sekcję jak punkt kontroli przed publikacją i przy aktualizacjach. Zaznacz, co jest gotowe, co do poprawy i co wymaga testu A/B. Po przejściu checklisty Twoja podstrona będzie:

  • trafiała w właściwą intencję wyszukiwania,
  • szybka i wygodna w odbiorze,
  • zaszyta w silne linkowanie wewnętrzne,
  • oznaczona właściwym schema,
  • przygotowana pod topical authority całej domeny.

Tytuł, meta opis i H1 — perfekcyjne dopasowanie do intencji

Cel sekcji: sprawić, by użytkownik już w SERP-ach wiedział, że to jest dokładnie ta odpowiedź, a na stronie szybko ją „potwierdził” po wejściu.

Szybka checklista (odhacz zanim opublikujesz)

  • Intencja: tytuł odpowiada na konkretny typ zapytania (how-to, porównanie, definicja, lista, lokalne, transakcyjne).
  • Słowo kluczowe: główna fraza blisko początku tytułu; w H1 naturalna, bez upychania.
  • Obietnica wyniku: tytuł mówi co zyskam (np. „checklista”, „kroki”, „szablon”).
  • Rok / kontekst: dodany tylko, jeśli treść faktycznie aktualizowana (np. 2025).
  • Długość: Title do ~580–600 px (zwykle 50–62 znaki); Description do ~920–990 px (ok. 150–160 znaków).
  • Brand: sufiks marki tylko gdy pomaga rozpoznawalności (np. „| StartBlog”).
  • Unikalność: żadne inne podstrony nie używają bardzo podobnych tytułów/H1 (unikać kanibalizacji).
  • Spójność: Title ⇄ H1 mówią to samo, ale nie muszą być identyczne (Title może być „bardziej sprzedażowy”).
  • Meta description: streszcza wynik + USP strony i miękkie CTA („Sprawdź checklistę krok po kroku”).
  • TOFU/MOFU/BOFU: dopasuj język — informacyjny vs. porównawczy vs. decyzja/zakup.

Dobre praktyki (które realnie podnoszą CTR)

  • Dodaj „nośnik formatu” w tytule: [checklista], [szablon], [porównanie], [kalkulator] — ustawia oczekiwania.
  • Używaj liczb i konkretów: „7 kroków”, „15 przykładów”, „INP < 200 ms”.
  • Odpowiadaj na PAA-style: formuły pytań („Jak…?”, „Co to jest…?”) i natychmiastowa odpowiedź w pierwszym akapicie.
  • Bez click-baitu: obietnica z tytułu musi być dostarczona w treści (inaczej pogo-sticking zabije wyniki).
  • Kontrast semantyczny: unikaj bliźniaczych tytułów w obrębie jednego klastra (np. dwa „checklisty” – różnicuj angle).

Formuły tytułów (kopiuj-wklej + podmień zmienne)

  • How-to / instrukcja:
    {Główne hasło}: krok po kroku [Checklista {rok}]
  • Porównanie:
    {X vs Y}: co wybrać przy {kontekst/budżet}? [+ tabela]
  • Lista / zasoby:
    {Hasło}: {liczba} praktycznych przykładów + szablon
  • Definicja / encja:
    {Pojęcie}: co to jest, jak działa, kiedy stosować
  • Lokalne (usługa):
    {Usługa} {Miasto}: cennik, terminy, realizacje [{rok}]
  • E-commerce (kategoria):
    {Kategoria}: jak wybrać + {liczba} top modeli [{rok}]

Przykłady dopasowane do tego artykułu

  • Title (SERP):
    On-page SEO w 2025: checklista dla każdej podstrony [+ szablon] | StartBlog
  • H1 (na stronie):
    On-page SEO w 2025: checklista dla każdej podstrony
  • Meta description:
    Przejdź przez on-page krok po kroku: tytuł, H1, intencja, linkowanie, schema, INP. Pobierz gotową checklistę i popraw widoczność.

Mini-warsztat QA (60 sekund)

  1. Zapisz zapytanie użytkownika (główna fraza + 1–2 long-taile).
  2. Wybierz typ intencji (how-to/definicja/porównanie/lista/lokalne).
  3. Ułóż tytuł: fraza na starcie + obietnica formatu/wyniku + ewentualnie rok + | StartBlog.
  4. Ustal H1: krótszy, czystszy, bez brandu.
  5. Napisz description: wynik + USP + miękkie CTA (bez „kliknij tutaj”).
  6. Sprawdź kanibalizację: czy w witrynie nie masz bliźniaczej strony na to samo zapytanie?

Szablony do szybkiego wklejenia

Title (uniwersalny):
{Fraza kluczowa}: {obietnica/wynik} [{rok}] | StartBlog

Meta description (uniwersalny):
Poznaj {co?} w {ile kroków?/z czym?}. {Kluczowa korzyść} + {USP}. Pobierz {szablon/checklistę} i wdroż to dziś.

H1 (uniwersalny):
{Fraza kluczowa}: {format/wynik}

Intencja wyszukiwania i gęstość informacji (zajawka + pierwsze 100 słów)

Cel sekcji: w pierwszych sekundach potwierdzić użytkownikowi „to jest to, czego szukam” i dostarczyć konkret już w leadzie — bez lania wody.

Szybka checklista

  • Dopasuj intencję: informacyjna (how-to/definicja), porównawcza, transakcyjna, lokalna, nawigacyjna.
  • Answer-first: w pierwszych 1–2 zdaniach streść wynik/korzyść artykułu.
  • Fraza i encje: naturalnie użyj głównej frazy + 1–2 powiązanych encji/synonimów w leadzie.
  • Konkret + zakres: podaj, co dokładnie czytelnik dostanie (np. liczba kroków, szablon, checklista).
  • Zero flafu: unikaj ogólników i truizmów („SEO jest ważne…”).
  • Skimmability: po leadzie — krótki bullet preview kluczowych punktów lub mini-TOC.
  • Długość: 60–120 słów; jedno zdanie ≤ 22 słowa.
  • CTA mikro: subtelne „Zobacz kroki poniżej” / „Pobierz checklistę” — bez sprzedaży na start.

“An INP below or at 200 milliseconds means a page has good responsiveness.”

Google — Interaction to Next Paint (INP)

Tłumaczenie: INP ≤ 200 ms oznacza dobrą responsywność strony.

Mapowanie intencji → kształt leadu

  • How-to / instrukcja: „W tym artykule zrobisz A→B→C i osiągniesz X. Potrzebujesz Y. Zaczynamy.”
  • Definicja / encja: „{Pojęcie} to… (jedno zdanie). Kiedy ma sens? Jak wdrożyć? Poniżej skrót i przykłady.”
  • Porównanie: „{X vs Y}: różnią się w A/B/C. Dla małego budżetu lepsze {X}. Tabela na dole.”
  • Transakcyjna / e-commerce: „Szukasz {usługa/produkt} do {celu}? Oto kryteria wyboru + 7 rekomendacji.”
  • Lokalna: „{Usługa} w {mieście}: ceny, terminy, kontakt. Sprawdź checklistę wyboru wykonawcy.”

Wzór leadu (kopiuj → podmień)

{Hasło główne} w {rok} to {jednozdaniowa definicja/obietnica}. W tym przewodniku dostaniesz {format: checklista/9 kroków/szablon}, aby {wynik biznesowy}. Skorzystasz z {narzędzia/zasobu}, a całość zajmie {czas/poziom trudności}. Poniżej skrót kroków — pełne wyjaśnienia w sekcji 3–9.

Przykład dobrego leadu (dla tego artykułu)

On-page SEO w 2025 to uporządkowanie treści i technikaliów tak, by strona odpowiadała intencji zapytania i ładowała się bez tarcia (INP/LCP). Poniżej znajdziesz checklistę krok po kroku: od tytułu i H1, przez strukturę nagłówków, linkowanie wewnętrzne i dane strukturalne, po mikro-UX. Na końcu pobierzesz gotowy szablon do audytu każdej podstrony. Zaczynamy od tytułu i opisu — a potem przechodzimy przez 9 kluczowych punktów.

Dlaczego to działa: jest odpowiedź „co dostanę”, wplecione encje (INP/LCP, dane strukturalne), zapowiedź formatu i nawigacja.

Przykład złego leadu (czego unikać)

SEO to bardzo ważny element każdej strony internetowej. W dzisiejszych czasach konkurencja jest ogromna, dlatego należy zadbać o wiele rzeczy, by witryna była wysoko w Google.

Co jest nie tak: brak odpowiedzi, brak zakresu, same ogólniki, żadnych encji/słów kluczowych, zero wartości w 1–2 zdaniach.

Mini-podgląd (bullet preview po leadzie)

  • Co sprawdzisz: Title/H1 → intencja → struktura H2/H3 → linkowanie → schema → INP/LCP → dostępność.
  • Co dostaniesz: PDF-checklista + wzór opisu H1/H2 + lista szybkich testów.

Gęstość informacji — jak ją podnieść bez ściany tekstu

  • Front-loaduj konkrety: definicja/obietnica → zakres → co dalej.
  • Nazywaj liczby: „9 kroków”, „INP < 200 ms”, „czas wdrożenia: 30–60 min”.
  • Używaj słów „nośnych” (sygnał „to jest praktyczne”): checklista, kroki, przykład, szablon, tabela, wzór.
  • Odcinaj wypełniacze: „jak wszyscy wiemy…”, „w dzisiejszych czasach…”, „zawsze należy…”.
  • Jedno akapicie = jedna myśl; 2–3 zdania max, potem przerwa lub bullets.

Test 15 słów (kontrola jakości leadu)

W 15 słowach powiedz, co dostanę i po co:
„Checklista on-page 2025: szybkie kroki, schemy i linkowanie — z szablonem do pobrania.”

Architektura nagłówków (H1–H3) i „answer-first”: jak budować skanowalność

Cel sekcji: ułożyć treść tak, by czytelnik w 5 sekund wiedział „gdzie co jest” i od razu zobaczył odpowiedź, zanim zanurzy się w szczegóły.

Szybka checklista

  • Jedno H1 na stronę (czytelne, bez brandu).
  • H2 = sekcje główne, H3 = kroki/podpunkty (nie przeskakuj poziomów; unikaj H4+).
  • Answer-first pod każdym H2: 1–2 zdania „W skrócie:” albo krótkie bullets z wynikiem.
  • Nazwy nagłówków → intencja: „Jak…”, „Co to jest…”, „Kroki…”, „Porównanie…”, „Checklisty…”.
  • Skimmability: po każdym H2 dodaj mini listę, ramkę z „Błędy” albo „Szybki test”.
  • Spójność: tytuły H2/H3 opisują wynik/krok, nie zagadkowe metafory.
  • Długość: H2 do ~70 znaków; unikaj wypełniaczy (np. „Kilka słów o…”).
  • SEO semantyka: w H2/H3 naturalnie pojawiają się encje i synonimy (bez upychania fraz).

„Answer-first” w praktyce (wzór do wklejenia)

## {Tytuł sekcji}
> W skrócie: {1–2 zdania z odpowiedzią/konkluzją}. 
> Jeśli robisz tylko jedną rzecz – zrób {najważniejszy krok}.
### Dlaczego to ważne
{1 akapit: ryzyko/korzyść, 2–3 zdania}
### Jak to zrobić (kroki)
1) {krok} 
2) {krok}
3) {krok}
### Najczęstsze błędy
- {błąd → jak naprawić}
### Szybki test (30 s)
- {jak zweryfikować efekt}

Wzorce H2/H3 (gotowe szablony)

A) Sekcja instrukcyjna (how-to)

## {Czynność} krok po kroku
> W skrócie: {efekt końcowy i kryterium sukcesu}.
### Kroki
1) {co zrobić} → {miernik}
2) {co zrobić} → {miernik}
3) {co zrobić} → {miernik}
### Błędy do uniknięcia
- …
### Checklista mini
- [ ] …

B) Sekcja definicyjna (encja/pojęcie)

## {Pojęcie}: co to jest i kiedy ma sens
> W skrócie: {jednozdaniowa definicja + kontekst użycia}.
### Dlaczego to ma znaczenie w {temat}
### Przykłady zastosowań
- …
### Granice i pułapki
- …

C) Sekcja porównawcza

## {X} vs {Y}: co wybrać przy {kontekst}
> W skrócie: {rekomendacja dla 80% przypadków} + kiedy odstąpić.
### Różnice w skrócie
- Cel | Koszt | Czas | Ryzyko
### Kiedy {X}
### Kiedy {Y}

D) Sekcja „lista kontrolna”

## Checklista: {obszar}
> W skrócie: przejdź punkty 1–7; must-have oznaczone *.
1) *{must-have}*
2) *{must-have}*
3) {nice-to-have}
…

Najczęstsze błędy w nagłówkach (i szybkie poprawki)

  • H2 bez odpowiedzi (sam tytuł, zero konkluzji) → dodaj linijkę „W skrócie: …”.
  • Nagłówki-metafory („Na co dzień i od święta…”) → zmień na wynik („Kiedy aktualizować treść i jak często”).
  • Za dużo poziomów (H4–H6) → spłaszcz do H3 i użyj list/boxów.
  • Ściana tekstu pod H2 → rozbij na H3 + bullets/tabela.
  • Powtórzenia fraz w wielu H2 → różnicuj angle („checklista”, „kroki”, „porównanie”, „kiedy nie”).

Struktura treści i „blokowość” (boxy, listy, tabele)

W skrócie: krótkie akapity (2–3 zdania), sensowne przerwy i powtarzalne bloki (box informacyjny, checklisty, tabele). Dzięki temu rośnie skanowalność i czas na stronie.

Dlaczego to ważne

„Blokowość” porządkuje przekaz i ułatwia szybkie znalezienie odpowiedzi. Algorytmy i użytkownicy preferują treści, które da się przeskanować w kilka sekund: jasne nagłówki, listy, podsumowania, wyróżnione wnioski.

Jak to ułożyć (kroki)

  1. Akapity do 2–3 zdań; po każdym H2 dodać krótkie „W skrócie: …”.
  2. Wyróżniać wnioski i definicje w boxach (ramki), a procesy w listach numerowanych.
  3. Zestawienia i porównania przedstawiać w tabelach zamiast w długich opisach.
  4. Co 3–5 ekranów wstawić „przystanek”: mini-podsumowanie, „Błędy do uniknięcia” lub checklistę.
  5. Dodać „czas czytania”, spis treści (TOC) i breadcrumbs — poprawia orientację w treści.

Wzorce bloków (do zastosowania w artykułach)

Box – definicja / meritum

Definicja: krótka, jednozdaniowa odpowiedź; poniżej 1–2 zdania kontekstu.
Kiedy stosować: na początku sekcji, aby od razu „oddać” sedno.

Checklist – szybka kontrola

  • Cel sekcji jest jasny w pierwszym zdaniu
  • Jest lista kroków lub tabela zamiast „ściany tekstu”
  • Na końcu sekcji: 1–2 zdania wniosków albo „Szybki test”

Tabela – porównanie (mini-schemat)

KryteriumOpcja AOpcja BKiedy wybrać
Cel
Koszt
Czas wdrożenia
Ryzyko

Ramka „Błędy do uniknięcia”

  • Zbyt długie akapity bez przerw → rozbić na listy/H3.
  • Opisy porównań bez tabel → zamienić na tabelę 3–6 wierszy.
  • Brak leadów „answer-first” → dodać 1–2 zdania konkluzji pod H2.

Szybki test (30 s)

  • Po samym skanowaniu nagłówków, boxów i tabel wiadomo, co zrobić i w jakiej kolejności.
  • W każdym ekranie widoczny jest element do zeskanowania (lista, box, tabela lub cytat-wniosek).

Linkowanie wewnętrzne i breadcrumbs (klaster tematyczny)

W skrócie: każda podstrona powinna linkować w górę (do filaru/huba), w bok (do „sióstr” w klastrze) i w dół (do podtematów/leafów). Na górze treści – breadcrumbs z realną hierarchią. Celem jest klik-depth ≤ 3, zero „sierot” (orphan pages).

Dlaczego to ważne

Linkowanie wewnętrzne dystrybuuje autorytet, pomaga algorytmom zrozumieć strukturę tematów (topical authority) i skraca drogę do odpowiedzi użytkownika. Breadcrumbs poprawiają nawigację, CTR w SERP (dane strukturalne) i czas na stronie.


Jak to zrobić (kroki wdrożenia)

  1. Zmapuj klaster: wybierz filar (hub/pillar) i 6–12 artykułów wspierających (leafy).
  2. Ustal rolę każdej strony: filar = przewodnik/kompendium; leafy = wąskie podtematy.
  3. Dodaj linki wstecz (up-links) z każdego leafa do filaru – w leadzie i w zakończeniu.
  4. Dodaj linki równoległe (side-links) między leafami (sekcja „Zobacz też”).
  5. Dodaj linki w przód (down-links) z filaru do leafów – w logicznych „blokach” tematycznych.
  6. Umieść link konwersyjny (np. /uslugi-seo/) w filarze i 1× na leafie (z kontekstem).
  7. Breadcrumbs: włącz, pokaż hierarchię: Strona główna → Kategoria → Artykuł. Ostatni element bez linku.
  8. QA: sprawdź, czy każda strona ma ≥ 3 linki wewnętrzne (w górę, w bok, w dół). Usuń „sieroty”.

Mini-mapa klastra (przykład dla tego artykułu)

  • Filar: On-page SEO w 2025 (ta strona)
    Leafy: Tytuł/H1, Intencja i lead, Architektura H1–H3, Linkowanie wewnętrzne i breadcrumbs, Schema/FAQ, Multimedia & alt, Szybkość LCP/INP, Aktualizacja & kanibalizacja
    Konwersja: /uslugi-seo/ (albo /wycena/)

Matryca anchorów (praktyczny start)

  • Exact match (1× / strona): „linkowanie wewnętrzne” → do filaru lub kluczowego leafa.
  • Partial/synonim (1–2×): „strukturę linków w treści”, „wewnętrzne odnośniki”.
  • Brand/URL (opcjonalnie 1×): „StartBlog – przewodnik on-page”.
  • Nawigacyjne: „zobacz też”, „przejdź do checklisty”.
    Zasada: różnicuj anchory; nie duplikuj exact-match w każdym akapicie; linkuj z kontekstu, nie z „nagiej” listy linków.

Moduły do wklejenia (blokowe linkowanie)

A) „Zobacz też” (linki równoległe)

<section class="see-also" aria-label="Zobacz też">
  <h3>Zobacz też</h3>
  <ul>
    <li><a href="/on-page/architektura-naglowkow/">Architektura nagłówków H1–H3</a></li>
    <li><a href="/on-page/schema-faq/">Dane strukturalne i FAQ</a></li>
    <li><a href="/on-page/lcp-inp/">Szybkość: LCP i INP w praktyce</a></li>
  </ul>
</section>

B) Link wstecz (lead lub stopka artykułu)

<p class="back-to-hub">
  Ten wpis jest częścią przewodnika <a href="/on-page/">On-page SEO 2025</a>.
</p>

Breadcrumbs – zasady i schema

  • Umiejscowienie: pod nagłówkiem strony, nad treścią.
  • Hierarchia: Home → Kategoria/Temat → Artykuł.
  • UX: długie nazwy skracać, ostatni element nieklikalny.
  • SEO: dodaj schema BreadcrumbList (JSON-LD).

Przykładowe JSON-LD

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1,
      "name": "Start",
      "item": "https://startblog.pl/"
    },
    { "@type": "ListItem", "position": 2,
      "name": "SEO",
      "item": "https://startblog.pl/seo/"
    },
    { "@type": "ListItem", "position": 3,
      "name": "On-page SEO w 2025: checklista dla każdej podstrony"
    }
  ]
}
</script>

Najczęstsze błędy (i szybkie poprawki)

  • Sieroty (orphan pages): brak linków w/na stronę → dołącz do klastra, dodaj linki w hubie i leafach.
  • Przeoptymalizowane anchory: wszędzie exact match → mieszaj partial/brand/nawigacyjne.
  • Linki w jednym miejscu (np. tylko stopka) → rozłóż w leadzie, środku i zakończeniu.
  • Breadcrumbs bez hierarchii (np. Home → Artykuł) → dodaj poziom kategorii/tematu.
  • Kanibalizacja: wiele stron linkuje do siebie na tę samą frazę i pokrywa intencję → wyznacz stronę kanoniczną tematu i linkuj do niej preferencyjnie.

Szybki test (30 s)

  • Z filaru da się kliknąć do każdego leafa w 1 klik?
  • Z leafa wrócę do filaru i przejdę do co najmniej 2 „sióstr”?
  • Breadcrumbs pokazują 3 poziomy i ostatni nie jest linkiem?
  • Głębokość: Home → … → Artykuł ≤ 3 kliknięcia?

Multimedia i dostępność (alt, transkrypcje, kontrast)

W skrócie: każde medium ma tekstowy odpowiednik (alt/figcaption/transkrypcja), jest semantycznie osadzone (figure/video/audio), nie opiera się wyłącznie na kolorze, a pliki są lekkie i stabilne wizualnie (width/height → bez CLS).

Dlaczego to ważne

Multimedia pomagają szybciej „oddać sens” treści, ale bez alternatyw tekstowych i właściwego kontrastu wykluczają część użytkowników oraz zaniżają jakość strony (UX, INP/LCP). Dobra dostępność = lepsza skanowalność, większe zaangażowanie i wyższa jakość sygnałów behawioralnych.


Jak to zrobić (kroki wdrożenia)

  1. Obrazy: zawsze uzupełniaj alt (lub alt="" dla dekoracyjnych), dodawaj width i height, stosuj loading="lazy" (poza LCP), preferuj WebP/AVIF z fallbackiem.
  2. Infografiki/wykresy: krótki alt + rozszerzony opis w <figcaption> lub sekcji „Opis wykresu” linkowanej z aria-describedby.
  3. Wideo: napisy (track), streszczenie/kluczowe punkty pod wideo, kontrolki dostępne z klawiatury.
  4. Audio/podcast: transkrypcja (na stronie lub jako rozwijany blok), skrót w punktach.
  5. Kolor i kontrast: minimum AA (tekst 4.5:1; duży 3:1). Informację przekazuj nie tylko kolorem — dodaj ikony/etykiety.
  6. Stabilność layoutu: atrybuty width/height lub CSS aspect-ratio -> brak skoków treści (CLS).
  7. Wydajność: kompresja, odpowiednie rozmiary (srcset/sizes), preload hero (LCP), lazy dla reszty.
  8. Semantyka: obraz w <figure> + <figcaption>, wideo w <video> + <track>. Nie nadużywaj ARIA, jeśli HTML ma natywny element.

Checklista – obrazy (odhacz przed publikacją)

  • alt oddaje funkcję obrazu (nie: „obrazek1”).
  • Dekoracyjne: alt="" i ewentualnie role="presentation".
  • width i height obecne; brak skoków layoutu.
  • loading="lazy" (poza najważniejszym obrazem LCP).
  • srcset + sizes dla responsywności; WebP/AVIF + fallback.
  • Podpis/<figcaption> tam, gdzie obraz niesie merytorykę.

Checklista – wideo i audio

  • Napisy (<track kind="captions">) dla wideo.
  • Transkrypcja audio/wideo i krótki konspekt.
  • Kontrolki dostępne klawiaturą; focus ma wyraźny styl.
  • Autoodtwarzanie wyłączone (szczególnie z dźwiękiem).
  • Plik skompresowany, właściwa rozdzielczość (bez oversize).

Checklista – kolor/kontrast

  • Tekst: min. 4.5:1 (zwykły) / 3:1 (≥ 18 px bold / ≥ 24 px normal).
  • Linki i stany (hover/focus) różnią się nie tylko kolorem (np. podkreślenie, ikona).
  • Ikony statusu mają etykietę tekstową lub aria-label.

Szablony i przykłady (kopiuj-wklej)

A) Obraz merytoryczny (z opisem i stabilnym miejscem)

<figure>
  <img 
    src="/media/lcp-hero.webp" 
    alt="Schemat on-page SEO: od tytułu przez nagłówki po linkowanie" 
    width="1200" height="630" 
    fetchpriority="high">
  <figcaption>Rys. 1. Mapa on-page: kolejność kroków od metadanych do schema.</figcaption>
</figure>

B) Obraz dekoracyjny (bez hałasu dla czytników)

<img src="/media/ornament.svg" alt="" role="presentation" width="200" height="200" loading="lazy">

C) Obraz responsywny (srcset + sizes)

<img 
  src="/media/checklista-800.webp"
  srcset="/media/checklista-400.webp 400w, /media/checklista-800.webp 800w, /media/checklista-1200.webp 1200w"
  sizes="(max-width: 640px) 100vw, 640px"
  alt="Checklista on-page SEO do wydruku"
  width="800" height="600" loading="lazy">

D) Wideo z napisami i skrótem

<figure>
  <video width="800" height="450" controls preload="metadata">
    <source src="/media/onpage-2025.mp4" type="video/mp4">
    <track kind="captions" src="/media/onpage-2025-pl.vtt" srclang="pl" label="Polski">
  </video>
  <figcaption>
    Wideo: 6-minutowy skrót checklisty. Kluczowe punkty: tytuł/H1, TOC, linkowanie, schema, INP.
  </figcaption>
</figure>

E) Infografika z dłuższym opisem (ARIA)

<figure aria-describedby="opis-wykresu">
  <img src="/media/wykres-inp.webp" alt="Wykres INP: spadek do 180 ms po optymalizacji" width="900" height="540" loading="lazy">
  <figcaption>Wykres: wpływ optymalizacji JS na INP.</figcaption>
</figure>
<section id="opis-wykresu" class="visually-hidden">
  Po wdrożeniu odchudzenia skryptów i opóźnienia widgetów, INP spadł z 320 ms do 180 ms.
</section>

F) Styl „visually-hidden” (przydatny do długich opisów)

.visually-hidden{
  position:absolute!important; width:1px; height:1px;
  padding:0; margin:-1px; overflow:hidden; clip:rect(0 0 0 0); border:0;
}

Najczęstsze błędy (i szybkie poprawki)

  • Alt jako opis pliku („IMG_1234”) → napisz funkcję/wniosek obrazu.
  • Brak width/height → dodaj wartości źródła; jeśli dynamiczne, użyj aspect-ratio.
  • Wideo bez napisów → dorzuć .vtt; w minimum – streszczenie pod filmem.
  • Informacja tylko kolorem (np. czerwony = błąd) → dodaj ikonę/etykietę.
  • Ogromne pliki (5–10 MB obrazka) → eksport WebP/AVIF, kompresja, realny rozmiar wyświetlania.
  • Lazy na hero (LCP) → dla pierwszego obrazu użyj fetchpriority="high" i nie dodawaj loading="lazy".

Dane strukturalne (schema) i FAQ dopasowane do tematu

W skrócie: na tej stronie powinny działać co najmniej trzy schematyArticle, BreadcrumbList i (jeśli masz sekcję pytań) FAQPage. Wstawiaj tylko to, co jest faktycznie widoczne w treści, unikaj duplikatów z wtyczek i dbaj o spójność z kanonicznym adresem URL.

Dlaczego to ważne

Schema pomaga wyszukiwarkom zrozumieć kto, co, kiedy i dla kogo. Poprawia interpretację tematu (encje), może zwiększać CTR (breadcrumbs w SERP) i ułatwia łączenie treści w klastrach.


Jak to zrobić (kroki wdrożenia)

  1. Article: opisuje artykuł (tytuł, opis, autor, daty, obrazek hero).
  2. BreadcrumbList: odzwierciedla okruszki (Start → Kategoria → Artykuł).
  3. FAQPage: tylko jeśli na stronie jest realna sekcja Q&A.
  4. Spójność pól: headline ≈ H1, description ≈ meta description, image = hero.
  5. Unikaj duplikatów: jeśli wtyczka już generuje Article i BreadcrumbList, dodaj wyłącznie FAQPage.
  6. Walidacja: sprawdź poprawność w narzędziu testowym (brak błędów, ostrzeżeń minimalnie).

„Pakiet startowy” JSON-LD (do <head>). Podmień URL-e i pola.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Article",
      "@id": "https://startblog.pl/seo/on-page-seo-checklista-2025/#article",
      "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": "https://startblog.pl/seo/on-page-seo-checklista-2025/"
      },
      "headline": "On-page SEO w 2025: checklista dla każdej podstrony",
      "description": "Praktyczna checklista on-page: tytuł, H1, intencja, nagłówki, linkowanie wewnętrzne, schema, multimedia i INP/LCP. Z szablonem do pobrania.",
      "image": {
        "@type": "ImageObject",
        "url": "https://startblog.pl/wp-content/uploads/2025/09/onpage-hero.webp",
        "width": 1200,
        "height": 630
      },
      "author": {
        "@type": "Person",
        "name": "StartBlog",
        "url": "https://startblog.pl/o-nas/"
      },
      "publisher": {
        "@type": "Organization",
        "name": "StartBlog",
        "logo": {
          "@type": "ImageObject",
          "url": "https://startblog.pl/wp-content/uploads/brand/startblog-logo-180x180.png",
          "width": 180,
          "height": 180
        }
      },
      "datePublished": "2025-09-07",
      "dateModified": "2025-09-07",
      "articleSection": "SEO",
      "inLanguage": "pl-PL"
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://startblog.pl/seo/on-page-seo-checklista-2025/#breadcrumbs",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Start",
          "item": "https://startblog.pl/"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "SEO",
          "item": "https://startblog.pl/seo/"
        },
        {
          "@type": "ListItem",
          "position": 3,
          "name": "On-page SEO w 2025: checklista dla każdej podstrony"
        }
      ]
    },
    {
      "@type": "FAQPage",
      "@id": "https://startblog.pl/seo/on-page-seo-checklista-2025/#faq",
      "mainEntity": [
        {
          "@type": "Question",
          "name": "Czy w tytule zawsze dodawać rok (np. 2025)?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Tylko wtedy, gdy treść jest realnie zaktualizowana. Rok może podnieść CTR, ale nie zastąpi jakości i zgodności z intencją."
          }
        },
        {
          "@type": "Question",
          "name": "Ile H1 powinien mieć artykuł?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Jedno H1. Struktura poniżej to H2 dla sekcji i H3 dla kroków; unikaj przeskakiwania poziomów."
          }
        },
        {
          "@type": "Question",
          "name": "Jak dobrać słowa kluczowe pod on-page?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Najpierw określ intencję (how-to, definicja, porównanie). Użyj frazy głównej w Title/H1 oraz 2–3 powiązanych encji w leadzie i nagłówkach."
          }
        },
        {
          "@type": "Question",
          "name": "Czy FAQ na stronie zawsze warto oznaczać schema FAQPage?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Tak, jeśli sekcja Q&A realnie istnieje i odpowiada na częste pytania. Unikaj sztucznego nadmuchiwania pytań bez wartości."
          }
        },
        {
          "@type": "Question",
          "name": "Jakie obrazy wpływają na LCP/INP?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Głównie obraz hero (LCP). Dodaj wymiary, użyj WebP/AVIF, `fetchpriority=\"high\"` i nie ustawiaj `loading=\"lazy\"` na pierwszym obrazie."
          }
        },
        {
          "@type": "Question",
          "name": "Jak linkować wewnętrznie w klastrze?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Każdy „leaf” linkuje w górę do filaru i w bok do 2–3 „sióstr”. Filar linkuje w dół do wszystkich leafów."
          }
        }
      ]
    }
  ]
}
</script>

Uwaga: jeśli korzystasz z Yoast/RankMath, najczęściej mają już Article i BreadcrumbList. Wtedy wklej tylko blok FAQPage (obiekt z @type: FAQPage) – unikniesz duplikacji.


Najczęstsze błędy (i poprawki)

  • Niespójne pola: headline ≠ H1 lub description ≠ meta → ujednolicić.
  • Obrazy bez wymiarów: brak width/height → dodać (stabilność layoutu).
  • FAQ bez treści na stronie: schema bez widocznej sekcji → dodać realny blok Q&A lub usunąć schema.
  • Duplikaty z wtyczek i szablonu: dwa Article/BreadcrumbList → zostawić jeden, drugi wyłączyć.
  • Złe adresy: @id i mainEntityOfPage nie wskazują kanonicznego URL → poprawić na finalny adres.

Szybkość i UX: LCP/INP w praktyce (obrazy, fonty, JS)

W skrócie: LCP (Largest Contentful Paint) ma być ≤ 2,5 s na mobile, INP (Interaction to Next Paint) ≤ 200 ms. Osiągasz to, ustawiając priorytety pobierania (hero, CSS, fonty), odchudzając JS i stabilizując layout (width/height, aspect-ratio).

Dlaczego to ważne

Szybkość ładowania i reakcji to dziś podstawowe sygnały jakości. Google mierzy realne doświadczenia użytkowników; wolny LCP i „lepkie” interakcje (INP) obniżają widoczność i konwersję.


Jak to zrobić (kroki wdrożenia)

A) Obrazy (LCP najczęściej = hero)

  1. Nie używaj loading="lazy" na LCP.
  2. Dodaj fetchpriority="high" do hero i zawsze ustaw width/height (albo aspect-ratio).
  3. Używaj WebP/AVIF + srcset/sizes; kompresuj realnie do wymiarów wyświetlania.
  4. Dla pozostałych obrazów: loading="lazy", decoding="async".
  5. Zarezerwuj miejsce pod embedami/banerami (brak CLS).

B) Fonty

  1. Preload krytycznych WOFF2 (tylko potrzebne grubości / subsety).
  2. font-display: swap/optional aby uniknąć FOIT; rozważ system stack dla UI.
  3. Samohostuj fonty; ogranicz liczbę rodzin/odmian.

C) CSS

  1. Critical CSS inline (tylko above-the-fold); resztę ładuj asynchronicznie.
  2. Porządkuj kaskadę: mniej plików, bez zbędnych frameworków.
  3. Unikaj „ciężkich” efektów wpływających na layout na starcie.

D) JS i third-party (INP)

  1. defer/type="module" dla własnych skryptów; async dla zewnętrznych, jeśli nie zależą od kolejności.
  2. Podziel kod: ładuj na żądanie (import() po kliknięciu/scrollu).
  3. Odkładaj wszystko, co nie jest krytyczne (analytics, czaty, widgety) do requestIdleCallback lub po load.
  4. Używaj passive event listeners i unikaj długich zadań >50 ms (dziel je).
  5. Preferuj CSS transform/opacity zamiast właściwości powodujących relayout.

E) Stabilność layoutu (CLS)

  1. Zawsze podawaj width/height lub aspect-ratio.
  2. Rezerwuj miejsce na reklamy/embed (contain-intrinsic-size, placeholder).
  3. Nie wstrzykuj dynamicznie nad treścią elementów bez rezerwacji miejsca.

Snippety „kopiuj-wklej”

1) Hero (LCP) – poprawny markup

<figure>
  <img
    src="/media/onpage-hero-1200.webp"
    srcset="/media/onpage-hero-800.webp 800w, /media/onpage-hero-1200.webp 1200w, /media/onpage-hero-1600.webp 1600w"
    sizes="(max-width: 800px) 100vw, 800px"
    alt="Schemat on-page SEO 2025: kroki od tytułu po schema"
    width="1200" height="630"
    fetchpriority="high">
  <figcaption>Hero: największy element nad zgięciem – bez lazy, z priorytetem pobierania.</figcaption>
</figure>

2) Obrazki niekrytyczne (poza viewportem)

<img
  src="/media/box-przyklad-600.webp"
  alt="Przykład boksu z checklistą"
  width="600" height="400"
  loading="lazy" decoding="async">

3) Preload i samohostowane fonty (WOFF2)

<link rel="preload" href="/fonts/Inter-Variable.woff2" as="font" type="font/woff2" crossorigin>
<style>
@font-face{
  font-family: "Inter";
  src: url("/fonts/Inter-Variable.woff2") format("woff2");
  font-weight: 100 900;
  font-display: swap; /* lub optional */
}
html{ font-family: "Inter", system-ui, -apple-system, Segoe UI, Roboto, "Helvetica Neue", Arial, sans-serif; }
</style>

4) Asynchroniczne ładowanie CSS poza krytycznym

<link rel="preload" href="/css/noncritical.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/css/noncritical.css"></noscript>

5) Własne skrypty – defer/type="module"

<script type="module" src="/js/app.js"></script>
<!-- lub -->
<script defer src="/js/app.legacy.js"></script>

6) Odkładanie niekrytycznych integracji

<script>
(function(){
  const runIdle = cb => ('requestIdleCallback' in window) ? requestIdleCallback(cb, {timeout: 2000}) : setTimeout(cb, 800);

  // załaduj analytics/heatmapy po bezczynności
  runIdle(() => {
    const s = document.createElement('script');
    s.src = 'https://example-analytics.js'; s.async = true;
    document.head.appendChild(s);
  });

  // ładuj cięższy widget dopiero po interakcji
  const onFirstInteract = () => {
    import('/js/widget-chat.js');
    removeEventListener('pointerdown', onFirstInteract);
    removeEventListener('keydown', onFirstInteract);
  };
  addEventListener('pointerdown', onFirstInteract, {passive: true});
  addEventListener('keydown', onFirstInteract);
})();
</script>

7) Lite embed YouTube (klik-to-load)

<button class="yt-lite" data-id="dQw4w9WgXcQ" aria-label="Odtwórz film">▶ Odtwórz</button>
<script>
document.addEventListener('click', e => {
  const b = e.target.closest('.yt-lite'); if(!b) return;
  const id = b.dataset.id;
  b.outerHTML = `<iframe width="560" height="315"
    src="https://www.youtube.com/embed/${id}?autoplay=1"
    title="YouTube video" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>`;
});
</script>

8) Rezerwacja miejsca dla sekcji poniżej zgięcia

.lazy-section{
  content-visibility: auto;
  contain-intrinsic-size: 800px; /* szacowana wysokość do czasu wyrenderowania */
}

Najczęstsze błędy (i szybkie poprawki)

  • Lazy na hero → usuń loading="lazy", dodaj fetchpriority="high".
  • Brak wymiarów obrazów → uzupełnij width/height lub użyj aspect-ratio.
  • Za dużo fontów → jeden wariant zmiennej rodziny (variable), ogranicz do 2–3 „weight axes”.
  • Third-party w <head> bez opóźnienia → przenieś do defer/async/idle, ładuj po interakcji.
  • Monolityczny bundle JS → podział i ładowanie na żądanie; usuń martwy kod.
  • Animacje zmieniające layout → używaj transform/opacity.

Podsumowanie i końcowa checklista (do odhaczenia przed publikacją)

W skrócie: dopasuj tytuł/H1 do intencji, potwierdź odpowiedź w pierwszych 100 słowach, zbuduj skanowalną strukturę (H2/H3 + „W skrócie”), podepnij klaster linkami, zadbaj o multimedia/a11y, oznacz schema i dowieź LCP/INP. Publikuj dopiero po szybkim teście QA.

Jednostronicowa checklista on-page 2025

A. Tytuł, opis, H1

  • Title z frazą na początku + obietnica formatu/wyniku
  • H1 jednoznaczne (bez brandu) i spójne z Title
  • Meta description: wynik + USP + miękkie CTA
  • Długość: Title ~50–62 zn., Description ~150–160 zn.

B. Intencja i lead (pierwsze 100 słów)

  • Jednoznaczny typ intencji (how-to/definicja/porównanie/lokalne)
  • Answer-first: w 1–2 zdaniach „co dostanę”
  • Fraza główna + 1–2 encje wplecione naturalnie

C. Architektura H1–H3 i skanowalność

  • 1× H1; H2 = sekcje, H3 = kroki
  • Pod każdym H2 krótki blok „W skrócie:”
  • Brak przeskoków poziomów; brak „pustych” H2

D. Struktura i „blokowość”

  • Akapity 2–3 zdania, listy i tabele zamiast „ściany tekstu”
  • Boxy: definicja / błędy / szybki test w każdej większej sekcji
  • TOC, czas czytania, breadcrumbs widoczne nad treścią

E. Linkowanie wewnętrzne i breadcrumbs

  • Link „w górę” do filaru, „w bok” do 2–3 „sióstr”, „w dół” z filaru do leafów
  • ≥ 3 linki wewnętrzne na stronę; zero sierot
  • Anchory zróżnicowane (exact/partial/brand/nawigacyjne)
  • Breadcrumbs z realną hierarchią (ostatni element nieklikalny)

F. Multimedia i dostępność

  • Alt adekwatny (lub alt="" dla dekoracyjnych)
  • width/height (lub aspect-ratio) dla wszystkich obrazów
  • WebP/AVIF + srcset/sizes; napisy do wideo, transkrypcje do audio
  • Kontrast min. AA; stany linków nie tylko kolorem

G. Schema (dane strukturalne)

  • Article + BreadcrumbList; FAQPage tylko, jeśli Q&A jest w treści
  • headline ≈ H1, description ≈ meta; poprawne kanoniczne URL-e
  • Brak duplikatów z wtyczek/tematu

H. Szybkość i UX (LCP/INP/CLS)

  • LCP ≤ 2,5 s mobile; obraz hero bez loading="lazy", z fetchpriority="high"
  • INP ≤ 200 ms: skrypty defer/module, odkładanie third-party, brak długich zadań >50 ms
  • CLS ~0.00–0.05: zarezerwowane miejsca, brak skoków layoutu

I. QA i publikacja

  • Test 5-sekundowego skanu: po samych H2/H3 wiadomo „co i jak”
  • Kontrola kanibalizacji: czy to jedyna strona dla tej intencji?
  • Linki z innych kluczowych stron już prowadzą do tej (aktualizacja „hubu”)
  • Data aktualizacji uzupełniona; ostatni rzut oka w mobilnym widoku

FAQ — On-page SEO 2025

Czy w tytule zawsze dodawać rok (np. 2025)?

Nie zawsze. Rok dodaj tylko wtedy, gdy treść faktycznie zaktualizowano. Najpierw zgodność z intencją i obietnicą formatu.

Ile H1 może mieć strona i jak ustawić H2/H3?

Jedno H1 na stronę. H2 to sekcje główne, H3 to kroki/podpunkty. Unikaj przeskakiwania poziomów i dodaj krótkie „W skrócie:” pod każdym H2.

Czy istnieje idealna długość tekstu dla on-page?

Nie ma jednej liczby słów. Liczy się gęstość informacji i pełne pokrycie intencji. Lepiej krócej i konkretnie niż dłużej „na watę”.

Jak używać słów kluczowych i encji w 2025?

Fraza główna w Title/H1 i leadzie. Dalej 2–3 powiązane encje/synonimy w nagłówkach i akapitach. Bez upychania exact-match.

Co to znaczy „answer-first” i gdzie je umieścić?

1–2 zdania pod H2, które od razu dają odpowiedź lub wniosek. Ułatwia skanowanie i obniża pogo-sticking.

Jak poprawnie linkować wewnętrznie (klaster)?

Leaf → link w górę do filaru + w bok do 2–3 „sióstr”. Filar → link w dół do wszystkich leafów. Różnicuj anchory: exact, partial, brand, nawigacyjne.

Czy spis treści (TOC) pomaga w SEO?

Pośrednio przez UX. Daje lepszą skanowalność i nawigację. Umieszczaj wysoko, ale nie zasłaniaj leadu.

Jakie dane strukturalne dodać na takiej stronie?

Minimum: Article i BreadcrumbList. Jeśli masz sekcję pytań — także FAQPage. Oznaczaj tylko to, co jest na stronie.

Obrazy a LCP: lazy czy fetchpriority?

Hero (LCP) bez lazy, z atrybutem fetchpriority=’high’ i ustawionymi wymiarami. Pozostałe obrazy: loading=’lazy’ i decoding=’async’.

Jak zejść z INP poniżej 200 ms?

Odkładaj third-party, używaj defer/module, dziel długie zadania JS, ładuj ciężkie widgety po interakcji i animuj transform/opacity.

Ile fontów i jak je ładować?

Minimum rodzin/odmian. Samohostowane WOFF2, preload krytycznych plików i font-display: swap (lub optional). System stack dla UI mile widziany.

Co z kanibalizacją i kanonicznymi?

Jedna intencja = jedna strona kanoniczna. Duplikaty scalaj (301/noindex) albo zawężaj. Linkuj preferencyjnie do wersji docelowej.

Jak często aktualizować treść?

Gdy zmienia się intencja, dane lub standardy (np. CWV). Przegląd co 3–6 miesięcy: liczby, zrzuty, linki, sekcja „co nowego”.

Jak mierzyć efekt zmian on-page?

GSC: pozycje, CTR, zapytania. CWV: LCP/INP/CLS (field data). UX/konwersje: czas, scroll, CPA/CAC, jakość leadów.

Czy on-page dla lokalnego SEO różni się?

Fundamenty te same, ale dodaj NAP, dane lokalne, link do Google Business Profile i sekcję pytań lokalnych. Optymalizuj frazy z geolokalizacją.