W zeszłym tygodniu klient zapytał mnie: „Mamy w kodzie plik schemas.ts, ale nikt już nie pamięta, po co on jest i co robi każdy z bloków". To nie wyjątek. W co najmniej połowie projektów, które przeglądam, gdzieś leży osierocony plik JSON-LD — wrzucony kiedyś przez developera, bez dokumentacji, bez jasnego celu i często bez pewności, czy w ogóle jest poprawny.
Szkoda, bo dane strukturalne to dokładnie ten rodzaj informacji, na który łakną systemy AI: ChatGPT, Perplexity i Google AI Overviews. To kontekst czytelny dla maszyn, który mówi: „jesteśmy tym, tu się znajdujemy, a to odpowiedzi na najczęstsze pytania". Bez tego kontekstu model językowy musi zgadywać na podstawie niestrukturalnego tekstu. Z tym kontekstem dostaje bezpośrednie, wiarygodne źródło.
W tym artykule wyjaśniam trzy najczęściej używane typy schematu — Organization, LocalBusiness i FAQPage — z konkretnymi przykładami, które możesz wdrożyć od razu.
Dlaczego dane strukturalne wciąż mają znaczenie w erze AI
Dane strukturalne (najczęściej JSON-LD) istnieją od 2011 roku dzięki schema.org, którą wspólnie stworzyły Google, Bing, Yahoo i Yandex. Cel był wtedy prosty: pomóc wyszukiwarkom zrozumieć treść, żeby mogły pokazywać bogate wyniki — recenzje z gwiazdkami, godziny otwarcia, rozwijane FAQ w wynikach wyszukiwania.
Co się zmieniło: „czytelnikiem" Twoich danych strukturalnych nie jest już wyłącznie crawler indeksujący strony na potrzeby listy wyników. To także model językowy, który parsuje Twoje treści, żeby sformułować odpowiedź dla użytkownika, który może w ogóle nie wejść na Twoją stronę. Jeśli ktoś zapyta ChatGPT: „które firmy w Warszawie zajmują się konsultingiem AI", szansa, że Twoje JSON-LD trafi do odpowiedzi, jest wielokrotnie większa niż szansa, że model zinterpretuje akapit tekstu marketingowego.
Wynika to stąd, że dane strukturalne są jednoznaczne. Zdanie „Siedzimy w sercu Utrechtu" model musi zinterpretować i coś założyć. Obiekt PostalAddress z addressLocality: "Utrecht" nie wymaga interpretacji — to fakt, który można wyodrębnić bezpośrednio.
Jeśli chcesz poznać szerszą strategię stojącą za taką optymalizacją, przeczytaj też czym dokładnie jest GEO — dane strukturalne to tylko jeden element większej układanki.
Trzy typy schematu, których potrzebujesz niemal zawsze
Organization: kim naprawdę jesteś?
Schemat Organization to podstawa. Odpowiada na pytanie, którego systemy AI najczęściej nie potrafią rozstrzygnąć: czym jest ta firma i dlaczego miałbym jej zaufać? Ten schemat powinien znaleźć się na stronie głównej, a najlepiej powtarzać go (lub odwoływać się do niego) na każdej podstronie przez layout.
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "WeArkMedia",
"url": "https://wearkmedia.nl",
"logo": "https://wearkmedia.nl/logo.png",
"description": "AI-native tworzenie stron i optymalizacja GEO/AEO dla firm, które chcą być znajdowane przez ChatGPT, Perplexity i Google AI Overviews.",
"sameAs": [
"https://www.linkedin.com/company/wearkmedia",
"https://twitter.com/wearkmedia"
],
"contactPoint": {
"@type": "ContactPoint",
"email": "hallo@wearkmedia.nl",
"contactType": "customer service"
}
}
Co tu ważne: sameAs to nie ozdoba. To pole łączy Twoją firmę z zewnętrznymi, weryfikowalnymi źródłami — LinkedInem, stroną w Wikipedii (jeśli istnieje), profilem w Crunchbase. Modele AI wykorzystują takie odnośniki, żeby ustalić, czy dana encja jest „prawdziwa". Schemat Organization bez sameAs przypomina profil na LinkedInie bez kontaktów: technicznie poprawny, ale mało przekonujący.
Opisu (description) nie kopiuj z meta description. Napisz zdanie, które konkretnie mówi, co robisz i dla kogo — nie „jesteśmy wiodącą agencją", tylko konkret: co, dla kogo i czym się wyróżniasz.
LocalBusiness: kluczowy, gdy liczy się fizyczna lokalizacja
Jeśli masz fizyczną lokalizację — biuro, sklep, gabinet — LocalBusiness (albo bardziej szczegółowy podtyp, np. ProfessionalService, Restaurant, Store) jest niezbędny. To właśnie dzięki temu schematowi asystenci AI potrafią odpowiadać na pytania typu „w pobliżu".
{
"@context": "https://schema.org",
"@type": "ProfessionalService",
"name": "WeArkMedia",
"image": "https://wearkmedia.nl/kantoor.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "Vredenburg 40",
"addressLocality": "Utrecht",
"postalCode": "3511 BD",
"addressCountry": "NL"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 52.0907,
"longitude": 5.1214
},
"telephone": "+31-30-1234567",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "17:30"
}
],
"priceRange": "€€€"
}
Dwie rzeczy często idą nie tak. Po pierwsze: ludzie zapominają o współrzędnych geo, a to właśnie na ich podstawie systemy liczą odległość przy zapytaniach o „najbliższy" punkt. Po drugie: @type bywa zbyt ogólny. Nie używaj domyślnie LocalBusiness, jeśli istnieje bardziej szczegółowy podtyp — Google i systemy AI znacznie trafniej dopasowują intencję, gdy podasz konkretny typ (np. Dentist, Accountant, MarketingAgency, jeśli jest dostępny).
To temat, który szerzej omawiam w GEO dla lokalnych firm — piszę tam też, jak radzić sobie z wieloma lokalizacjami.
FAQPage: najbardziej niedoceniany schemat w AEO
Jeśli jest jeden typ schematu, który bezpośrednio wpływa na to, czy zostaniesz zacytowany w odpowiedzi AI, to właśnie FAQPage. Dlaczego? Bo dostarcza dosłownie strukturę pytanie-odpowiedź, której model językowy potrzebuje, żeby wykorzystać Twoje treści we własnej odpowiedzi — często słowo w słowo.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Ile kosztuje strona AI-native?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Strona AI-native powstaje etapami. Koszt zależy od liczby podstron, liczby języków i integracji z istniejącymi systemami. Poproś o wycenę na podstawie własnego zakresu, z podziałem na godziny w każdym etapie."
}
},
{
"@type": "Question",
"name": "Czy dane strukturalne działają też bez zespołu technicznego?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Tak. Większość systemów CMS i frameworków obsługuje JSON-LD przez wtyczki lub proste snippety kodu. Nie potrzebujesz dedykowanego developera, żeby wdrożyć schemat Organization lub FAQPage."
}
}
]
}
Pułapka polega na tym, że ludzie wypełniają schemat FAQPage pytaniami marketingowymi („Dlaczego my?") zamiast pytaniami, które ludzie naprawdę zadają wyszukiwarce albo asystentowi AI. Zajrzyj do sekcji „People Also Ask" w Google albo sam sprawdź w ChatGPT i Perplexity, jakie pytania pojawiają się wokół Twojego tematu. Pisz odpowiedzi, które bronią się samodzielnie — muszą być zrozumiałe bez ponownego czytania pytania, bo właśnie w ten sposób model językowy je wycina.
Rozwinąłem to szerzej w praktycznym przewodniku po AEO, wraz z tym, jak ustalić, które pytania warto odpowiadać.
Od luźnego pliku do działającego systemu: praktyczna implementacja
Gdzie to umieścić w kodzie?
Jeśli masz już lib/schemas.ts (lub coś podobnego), logiczna struktura wygląda tak: eksportuj funkcje, które generują obiekty JSON-LD na podstawie treści, a nie statyczne stringi. Przykład:
// lib/schemas.ts
export function generateOrganizationSchema() {
return {
"@context": "https://schema.org",
"@type": "Organization",
name: "WeArkMedia",
url: "https://wearkmedia.nl",
// ...
};
}
export function generateFAQSchema(faqs: { question: string; answer: string }[]) {
return {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: faqs.map((faq) => ({
"@type": "Question",
name: faq.question,
acceptedAnswer: {
"@type": "Answer",
text: faq.answer,
},
})),
};
}
To zapobiega rozjeżdżaniu się schematów i treści — częsty problem, gdy tekst FAQ na stronie zostaje zmieniony, a schemat za nim nie. Niespójność między widoczną treścią a danymi schematu to dokładnie to, czego nie chcesz: podkopuje zaufanie zarówno u Google, jak i u crawlerów AI.
Przetestuj i zwaliduj przed publikacją
Zanim opublikujesz, skorzystaj z Google Rich Results Test i walidatora Schema.org. Częsty błąd to literówka w @type (np. Organisation z brytyjską pisownią zamiast Organization) — schemat wtedy po cichu nie działa, bez komunikatu błędu na stronie, a orientujesz się dopiero wtedy, gdy zastanawiasz się, dlaczego nic nie działa.
Nie zapomnij też sprawdzić, czy Twój robots.txt nie blokuje crawlerów AI, które właśnie te dane powinny czytać — zajrzyj do poradnika o robots.txt i crawlerach AI, jeśli nie masz pewności, czy Twoja konfiguracja jest poprawna.