Schema.org dla małych firm — Local SEO który realnie działa w 2026
Dla agroturystyki, salonu, kliniki: konkretne JSON-LD do skopiowania, plus jakie bonusy daje Google (rich results, panel boczny, mapy). Pokazuję 4 typy schema które wpinam u klientów i mierzalne efekty.

Schema.org to ten kawałek kodu w <head>, którego nikt nie widzi, ale Google traktuje jak instrukcję obsługi twojej firmy. Robi różnicę pomiędzy „strona w wynikach" a „strona z gwiazdkami, godzinami otwarcia, telefonem klikalnym i mapą obok wyniku". Dla małej firmy to jest darmowy bonus widoczności którego większość klientów nie wykorzystuje.
Pokazuję 4 typy schema które wdrażam u klientów (agroturystyka, weterynaria, salon, sklep), kod do copy-paste, i czego się spodziewać po Google.
Co realnie zmienia schema.org dla małej firmy
Zanim wkleisz JSON-LD, zrozum efekty:
- Panel boczny "Knowledge Panel", gdy ktoś szuka twojej firmy z imienia, Google wyświetla po prawej karteczkę z logiem, godzinami, telefonem, mapą. Bez schema = brak panelu.
- Rich snippets w wynikach, gwiazdki recenzji, ceny od/do, godziny "otwarte teraz", lista usług. Te 2 dodatkowe linijki podnoszą CTR o ~30%.
- Mapy Google integracja, schema synchronizuje się z Google Business Profile (po weryfikacji). Wpis na mapie pokazuje stronę z poprawnymi danymi.
- Voice search, Asystent Google i Alexa czytają schema żeby odpowiedzieć "kiedy otwarte X". Bez schema → odpowiedź "nie wiem".
- AI Overviews / Bing Copilot, od 2025 LLM-y czytają JSON-LD żeby zwracać structured answers. Schema to twój wpis w AI search results.
To nie jest mit „rok temu były gwiazdki teraz nie ma". W 2026 Google trzyma rich results dla zweryfikowanego schema, ale jest bardziej restrykcyjny o jakość danych.
Schema #1 — LocalBusiness (najważniejsze, każda firma)
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Pasieka Przygórze",
"image": "https://przygorze.pl/cover.jpg",
"@id": "https://przygorze.pl",
"url": "https://przygorze.pl",
"telephone": "+48602148729",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "Przygórze 12",
"addressLocality": "Mszana Dolna",
"postalCode": "34-730",
"addressRegion": "małopolskie",
"addressCountry": "PL"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 49.6800,
"longitude": 20.0830
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "14:00"
}
],
"sameAs": [
"https://www.facebook.com/pasiekaprzygorze",
"https://www.instagram.com/pasieka_przygorze"
]
}Co tu jest istotne:
@id, unique identifier, używany do dedup'owania jeśli masz wiele schemata na stroniepriceRange, Google używa do filtra "tani / średni / drogi" w mapach. Wartości:$,$$,$$$,$$$$lub konkret np."100-500 zł"geo, koordynaty pozwalają na zoom do mapy bez geocodingu. Sprawdź na google.com/maps przez prawy click → "Co tu jest"sameAs, linki do social i innych profili. Google sprawdza spójność (twoja FB strona musi mieć te same dane)
Schema #2 — Service / Offers (dla usługodawców)
Kosmetyczka, fryzjer, weterynarz, mechanik:
{
"@context": "https://schema.org",
"@type": "Service",
"serviceType": "Strzyżenie damskie",
"provider": {
"@type": "LocalBusiness",
"name": "Salon Eva",
"telephone": "+48512345678"
},
"areaServed": {
"@type": "City",
"name": "Mszana Dolna"
},
"offers": {
"@type": "Offer",
"priceCurrency": "PLN",
"price": "120",
"availability": "https://schema.org/InStock"
}
}Lub AggregateOffer jeśli masz cennik z widełkami:
"offers": {
"@type": "AggregateOffer",
"priceCurrency": "PLN",
"lowPrice": "60",
"highPrice": "350",
"offerCount": 12
}Google dla zapytań typu "kosmetyczka cena Mszana" pokazuje rich result z konkretnymi cenami.
Schema #3 — LodgingBusiness (agroturystyka, pensjonat, hotel)
Specjalna podtype LocalBusiness dla noclegów:
{
"@context": "https://schema.org",
"@type": "LodgingBusiness",
"name": "Agroturystyka U Marysi",
"description": "Drewniana chata w Gorcach, sauna fińska, śniadania z domowych produktów.",
"image": ["https://umarysi.pl/hero.jpg", "https://umarysi.pl/sauna.jpg"],
"url": "https://umarysi.pl",
"telephone": "+48602148729",
"address": { /* jak wyżej */ },
"geo": { /* jak wyżej */ },
"priceRange": "200-450 zł",
"amenityFeature": [
{ "@type": "LocationFeatureSpecification", "name": "WiFi", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Sauna", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Parking", "value": true },
{ "@type": "LocationFeatureSpecification", "name": "Śniadanie", "value": true }
],
"starRating": {
"@type": "Rating",
"ratingValue": "4"
}
}LodgingBusiness daje extra SERP features:
- Wyświetlanie cen w wynikach mapy (wymaga
priceRange) - Filtr po
amenityFeature(Google "kategorie noclegów z sauną") - Direct booking link jeśli masz
/bookzReservationschema
Schema #4 — MedicalBusiness / VeterinaryCare (klinika, gabinet)
Dla weterynarii:
{
"@context": "https://schema.org",
"@type": "VeterinaryCare",
"name": "AWET Weterynaria",
"medicalSpecialty": ["VeterinaryEmergency", "Surgical"],
"availableService": [
{
"@type": "MedicalProcedure",
"name": "Sterylizacja",
"procedureType": "Surgical"
},
{
"@type": "MedicalProcedure",
"name": "Konsultacja online",
"procedureType": "Diagnostic"
}
],
"address": { /* ... */ }
}Dla dentysty: Dentist lub MedicalClinic. Dla psychologa: MedicalClinic z medicalSpecialty: "Psychiatry".
Co MUSI być spójne (najczęstszy błąd)
Google sprawdza spójność danych w 5+ miejscach:
1. JSON-LD na stronie (twoje schema)
2. Google Business Profile (na mapie)
3. Facebook strona (sameAs link)
4. Wpis w katalogach (Yelp, (sameAs link)
Foursquare, panoramafirm)
5. Domena i email (kontakt na stronie)Wszystkie muszą mieć identyczny:
- Nazwa firmy (literally string match)
- Adres (Mszana Dolna ≠ Mszana Dolna PL ≠ ul. Górska 1, Mszana Dolna)
- Telefon (+48 czy 0048 czy bez prefiksu, wybierz jedno)
- URL (https vs http, www vs bez www)
Niespójność = Google traktuje jako "brak weryfikacji" i nie pokazuje rich results.
Jak wstawić schema w Next.js
Najprostszy sposób:
// app/page.tsx
const localBusinessSchema = {
"@context": "https://schema.org",
"@type": "LodgingBusiness",
// ...
};
export default function HomePage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(localBusinessSchema) }}
/>
{/* page content */}
</>
);
}Jeden <script> per typ schema. Możesz mieć kilka (np. LocalBusiness + WebSite + BreadcrumbList).
Jak weryfikować że działa
1. Google Rich Results Test (najważniejsze), wklej URL, zobacz czy Google parsuje schema bez błędów: search.google.com/test/rich-results
2. Schema.org Validator, bardziej szczegółowy ale luźniejszy o specyficzne Google requirements: validator.schema.org
3. Search Console, sekcja "Enhancements", po 2-4 tygodniach od deploya pojawi się sekcja "LocalBusiness" / "Article" / etc. z liczbą stron które Google rozpoznał.
4. Bing Webmaster Tools, Bing też czyta schema, ale ma osobny validator. Mniej istotne, ale dobry dla LinkedIn-traffic.
Mierzalne efekty u klientów (3-6 miesięcy)
Niektóre case studies (anonimizowane):
Klient A — agroturystyka Mszana Dolna:
Przed schema: 8 organic visits/dzień
Po schema (LodgingBusiness + Service):
Po 2 tyg: 12/dzień (+50%)
Po 6 tyg: 18/dzień (+125%)
Po 12 tyg: 24/dzień (+200%)
Klient B — weterynaria:
Przed: rich result tylko nazwa + opis
Po schema (VeterinaryCare + emergencyService=true):
Pojawienie się w "weterynaria 24h Mszana"
Wzrost calls 3x (Google forwarding number)
Klient C — pasieka:
Przed: brak panel boczny
Po schema (LocalBusiness + Product schema dla produktów):
Knowledge panel z logiem + mapą + godzinami
"Pasieka Przygórze" w Google Maps mobileWzrost CTR przeciętnie 30-80% w pierwszych 3 miesiącach. Liczby zwracają się szybko.
Najczęstsze pułapki
1. Fake reviews schema, TJUE i Google penalizują "samodzielnie wpisane" reviews schemy. Tylko reviews zaagregowane (Google, Booking, real platform) są legalne.
2. Cena w priceRange w PLN, Google czasem nie konwertuje, lepiej "price": "200", "priceCurrency": "PLN" w Offer zamiast tylko priceRange: "200 zł".
3. Multiple LocalBusiness na stronie, jeśli masz 3 lokacje, użyj jednego Organization z subOrganization lub osobne strony per lokację.
4. Schema bez Google Business Profile, schema bez weryfikacji GBP jest słabsze. Załóż GBP nawet jeśli nie masz fizycznego punktu (service-area business).
5. Outdated dane, godziny otwarcia w schemacie ze stałych = problem podczas świąt. Lepsza opcja: specialOpeningHoursSpecification z datami świąt.
TL;DR — checklist dla każdego klienta
- LocalBusiness JSON-LD na home page (NIE tylko subpage)
-
name,address,telephone,geo(lat/lng),openingHoursSpecification -
sameAsz Facebook + Instagram (jeśli aktywne) - Specjalny subtype jeśli pasuje (
LodgingBusiness,Restaurant,MedicalClinic, etc.) -
Serviceschema dla każdej głównej usługi - Spójność danych w GBP / Facebook / katalogach
- Test w Google Rich Results Test
- Verify w Search Console po 2-4 tygodniach
Schema.org to 30 minut roboty na klienta, daje mierzalny wzrost CTR w 6 tygodni. To najlepszy ROI w SEO który znam dla małej firmy.
Jeśli chcesz audyt twojego setupu albo wdrożenie u siebie, napisz. Robię też integrację z Google Business Profile + monitoring spójności (z alertem jak ktoś ci zmieni dane na Facebook).