Blog
PLEN

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.

·7 min read
Schema.org dla małych firm — Local SEO który realnie działa w 2026

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:

  1. 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.
  2. Rich snippets w wynikach, gwiazdki recenzji, ceny od/do, godziny "otwarte teraz", lista usług. Te 2 dodatkowe linijki podnoszą CTR o ~30%.
  3. Mapy Google integracja, schema synchronizuje się z Google Business Profile (po weryfikacji). Wpis na mapie pokazuje stronę z poprawnymi danymi.
  4. Voice search, Asystent Google i Alexa czytają schema żeby odpowiedzieć "kiedy otwarte X". Bez schema → odpowiedź "nie wiem".
  5. 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 stronie
  • priceRange, 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 /book z Reservation schema

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 mobile

Wzrost 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
  • sameAs z Facebook + Instagram (jeśli aktywne)
  • Specjalny subtype jeśli pasuje (LodgingBusiness, Restaurant, MedicalClinic, etc.)
  • Service schema 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).