Case Study On-Page SEO Technical SEO AEO · GEO · AI Search

OYH.pl — SEO Score Transformation
by RankifyGenius

A comprehensive On-Page & Technical SEO audit and optimization case study for Poland's free classifieds portal oyh.pl — a marketplace with 43,000+ live listings across nieruchomości (real estate), praca (jobs), motoryzacja (automotive) and usługi (services). Powered by RankifyGenius.com's AEO, GEO and AI-search methodology, the site's SEO score climbed from 34/100 to 87/100 in just 45 days.

ClientOYH.pl (Darmowe Ogłoszenia)
IndustryClassified Ads / Marketplace
MarketPoland 🇵🇱
Optimized byRankifyGenius.com
Timeline45 Days
34
/ 100
SEO Score — Before
+53 pts
+156% lift
87
/ 100
SEO Score — After
⚡ Key Takeaways
  • SEO score lifted from 34/100 to 87/100 — a 156% improvement in 45 days.
  • 18 of 21 audited on-page & technical issues fully resolved.
  • LCP cut from 4.8s to 1.9s; CLS from 0.38 to 0.04 — all Core Web Vitals now pass.
  • Zero schema → 6 validated schema types, unlocking rich-result eligibility.
  • 2,800+ duplicate URLs resolved with canonicals, saving ~40% crawl budget.
  • AI-search ready for GPTBot, PerplexityBot & ClaudeBot via SSR + llms.txt.
21
Issues Found
18
Issues Fixed
43K+
Live Listings
45
Days to Results

On-Page SEO Issues — Before & After

Every critical on-page signal audited and corrected by RankifyGenius
Critical

Title Tag — Over-optimised & Non-Compelling

✕ Before
Darmowe ogłoszenia - bezpłatne oferty - OYH.pl
Raw keyword stuffing, no value proposition, no CTR hook. 52 chars with no brand differentiation vs Allegro/OLX.
✓ After
OYH.pl — 43 000+ Darmowych Ogłoszeń | Dodaj Bezpłatnie
Live listing count adds trust. Clear action CTA. Under 60 chars. Differentiates from OLX/Allegro with specificity.
✓ CTR +28% projected
Why it matters: The title tag is the single strongest on-page ranking factor and the first thing users and AI answer engines read. A specific, benefit-led title improves click-through rate and gives Perplexity and Google AI Overviews a clean entity anchor to cite.
Critical

Meta Description — Generic & Missing Search Intent

✕ Before
Description repeated the title verbatim. 178 chars of keyword list with no user benefit statement. No action word. AI search engines (Perplexity, AI Overviews) had no snippet anchor to surface.
✓ After
Rewritten to: "Szukasz lub sprzedajesz? OYH.pl to portal 43 000+ bezpłatnych ogłoszeń — nieruchomości, praca, motoryzacja i usługi. Dodaj ogłoszenie za darmo w 2 minuty."
✓ AEO snippet-ready
Why it matters: A meta description written around real search intent and a clear action ("Dodaj za darmo w 2 minuty") wins the click in crowded SERPs and becomes the summary line AI engines lift into zero-click answers.
Critical

H1 Tag — Dynamically Injected JS, Not Crawlable

✕ Before
H1 contained live count: Darmowe ogłoszenia - szukaj z 43436 bezpłatnych ofert. The number was JS-injected post-render — Googlebot & AI crawlers received no H1 in raw HTML. Zero heading hierarchy below.
✓ After
H1 server-rendered with SSR fallback. Count moved to a <span aria-live="polite">. Static H1 value: "Darmowe Ogłoszenia w Polsce — OYH.pl". Heading hierarchy H1→H2→H3 fully established.
✓ Crawlability restored
Why it matters: Many AI crawlers do not execute JavaScript. Server-side rendering the H1 guarantees both Googlebot and AI bots see the page's primary topic instantly — the foundation of every AEO win.
High

Image Alt Attributes — Missing Across 200+ Images

✕ Before
Category icons used filename-based alt: "motoryzacja.webp". Listing thumbnails entirely missing alt text. Decorative ads had descriptive alt (reversed best practice). Google Image Search invisible.
✓ After
Category images: keyword-rich alt "Ogłoszenia motoryzacja — samochody i motocykle". Listing thumbs: auto-generated from listing title. Decorative elements: alt="". Structured image schema added.
✓ Image SEO enabled
Why it matters: Descriptive alt text unlocks Google Images traffic, improves accessibility (WCAG), and gives multimodal AI models the context to understand and surface listing visuals.
High

Internal Linking — No Anchor Text Strategy

✕ Before
Category links used generic labels: "Zobacz wszystkie" (×4 duplicates on page). Navigation links were icon-only with no descriptive text. 48 city links listed with no contextual surrounding copy.
✓ After
All "Zobacz wszystkie" anchors replaced with keyword-rich variants: "Ogłoszenia Motoryzacja", "Praca Polska". Breadcrumb schema added. City links wrapped in descriptive paragraph text.
✓ Link equity flows correctly
Why it matters: Descriptive internal anchors tell search engines what each destination page is about and distribute link equity to high-value categories — a low-cost, high-return on-page lever.
High

Keyword Cannibalization — Homepage vs Category Pages

✕ Before
Homepage, /darmowe-ogloszenia/ and /ogloszenia-bezplatne/ all targeted "darmowe ogłoszenia" with near-identical thin content. Google confused about canonical intent. Three pages splitting ranking signals.
✓ After
Homepage repositioned as brand authority. Duplicate pages canonicalized to homepage. Each category page given unique long-tail focus. Keyword map created to eliminate overlaps across all 21 categories.
✓ Cannibalization eliminated
Why it matters: When multiple pages compete for one keyword, ranking signals split and none reach page one. A clean keyword map consolidates authority so each query has exactly one strongest page.
High

Content Depth — Homepage Thin Below the Fold

✕ Before
Only ~280 words of unique body copy — insufficient for AI search engines that use NLP entity extraction. The FAQ section (2 questions) was shallow. No E-E-A-T signals, author info, or trust content. No schema FAQ markup.
✓ After
800+ words of unique, structured Polish-language copy added. FAQ expanded to 8 Q&A pairs with FAQPage JSON-LD. "About OYH.pl" trust block with founding year and stats. AI-readable entity clusters built.
✓ E-E-A-T signals added
Why it matters: AI answer engines reward depth, structure and entity richness. Expanding thin pages into well-organized, question-led content gives models something substantive to extract, quote and attribute.
Medium

Open Graph & Social Meta — Incomplete Configuration

✕ Before
OG tags present but og:type set to generic "website" sitewide. No Twitter Card tags. No og:locale (critical for Polish-market GEO targeting). og:image dimensions declared but image was outdated.
✓ After
Full Open Graph suite: og:locale="pl_PL", og:site_name, Twitter Card summary_large_image. Updated OG image with brand overlay. Category pages use og:type="website" with category-specific descriptions.
✓ GEO signals strengthened
Why it matters: Rich social previews lift shares and referral traffic, while og:locale=pl_PL reinforces the Polish-market GEO signal that helps the right audience find the site.

Technical SEO Issues — Before & After

Infrastructure-level fixes that unlock crawl efficiency and Core Web Vitals
Critical

user-scalable=no — Accessibility & Ranking Penalty

✕ Before
Viewport meta: maximum-scale=1, user-scalable=yes — contradictory and effectively blocking zoom on older Android devices. WCAG 2.1 violation (SC 1.4.4). Google penalizes this in mobile-first indexing rankings.
✓ After
Updated to: <meta name="viewport" content="width=device-width, initial-scale=1">. All zoom restrictions removed. Mobile CLS score improved by removing conflicting scale constraints.
✓ Mobile ranking signal restored
Why it matters: Google indexes the mobile version of every site first. Removing zoom blocks fixes an accessibility violation and a direct mobile-usability ranking signal in one change.
Critical

Structured Data — Zero Schema Markup Present

✕ Before
No JSON-LD schema on any page. No Organization, WebSite, BreadcrumbList, FAQPage, Product/Offer, or ItemList schema. AI engines (Perplexity, AI Overviews, Gemini) cannot extract structured entity data. Rich results = 0.
✓ After
Full schema suite deployed: Organization + WebSite (with SearchAction sitelinks), BreadcrumbList, FAQPage, ItemList for category pages, Offer on listing pages. Validated via Rich Results Test.
✓ Rich results eligible
Why it matters: Schema is the language search engines and LLMs trust most. It converts free-text pages into machine-readable facts — the difference between being read and being cited in an AI answer.
Critical

Core Web Vitals — LCP & CLS Failing

✕ Before
LCP: ~4.8s (logo loaded via non-preloaded PNG, render-blocking JS). CLS: 0.38 (sliding carousel injected above-the-fold, category images loaded without dimensions). INP: 280ms. Page speed score: 41/100 mobile.
✓ After
LCP: 1.9s (logo preloaded via <link rel="preload">, JS deferred). CLS: 0.04 (explicit width/height on all category images). INP: 110ms. Page speed score: 78/100 mobile.
✓ All CWV pass threshold
Why it matters: Core Web Vitals are a confirmed ranking factor and a conversion lever — faster, more stable pages keep users from bouncing and signal quality to Google's page-experience systems.
High

Robots.txt & XML Sitemap — Misconfiguration

✕ Before
No reference to sitemap in robots.txt. XML sitemap missing category pages and article URLs. User-generated listing URLs crawled inefficiently — crawl budget wasted on low-value paginated pages without rel=noindex.
✓ After
Sitemap URL added to robots.txt. Sitemap restructured into 3 sitemaps: main, listings, articles. Low-value paginated pages disallowed in robots.txt + noindex. Crawl budget saved ~40%.
✓ Crawl budget optimised
Why it matters: On a 43,000-listing marketplace, crawl budget is finite. Guiding bots to high-value URLs and away from thin paginated ones means new listings get indexed faster.
High

Hreflang — Missing for Multilingual Listings

✕ Before
Site contains listings in Polish but also intermittent German/English content from international users. No hreflang tags. Google treating multilingual content as duplicate. "Oslo" city page indexed without language context.
✓ After
hreflang="pl" declared on all primary pages. International listing category added with hreflang="x-default". Language signal now consistent. GEO targeting for Polish-speaking diaspora internationally enabled.
✓ GEO signals clarified
Why it matters: Hreflang is the backbone of GEO. It tells search engines which language and region a page serves, preventing duplicate-content dilution and putting the right page in front of the right market.
High

Render-Blocking Resources — 11 JS/CSS Files

✕ Before
11 synchronous <script> tags in <head> blocking first paint. Carousel/slider JS loaded unconditionally even on pages with no carousel. 3 separate CSS files loaded sequentially. Total blocking time: 1,840ms.
✓ After
All non-critical JS moved to async/defer. Carousel JS lazy-loaded only when component is in viewport. CSS bundled and critical CSS inlined. Total blocking time reduced to 210ms.
✓ TBT -88%
Why it matters: Render-blocking resources delay first paint and hurt INP. Deferring non-critical scripts lets content appear instantly, improving both Core Web Vitals and perceived speed.
High

Canonical Tags — Duplicate Listing URLs

✕ Before
Listing detail pages accessible via 3 URL patterns: /ogloszenie-{slug}-{id}/, /ogloszenia/id/{id}, and print view. No canonical on any. Search Console showed 2,800+ duplicate URLs consuming crawl budget. Zero consolidation of link equity.
✓ After
Self-referencing canonical added to all listing pages. Alternate URL patterns 301-redirected to canonical slug-based URL. Print URLs set to noindex. Duplicate URL count in Search Console dropped to under 50.
✓ 2800+ duplicates resolved
Why it matters: Duplicate URLs scatter link equity and waste crawl budget. Canonicals consolidate every signal onto one authoritative URL, strengthening its ability to rank.
Medium

Security — Mixed Content Warnings (HTTP assets)

✕ Before
Site serves via HTTPS but 23 user-uploaded images referenced via http:// protocol (older listings). Browser console showed mixed content warnings. Google Chrome blocked passive mixed content since 2021 — images not loading for some users.
✓ After
Server-side rewrite rule converts all asset URLs to protocol-relative //. Legacy image URLs run through HTTPS proxy. Zero mixed-content warnings. HTTPS integrity score: 100%.
✓ Full HTTPS security
Why it matters: Mixed content breaks the padlock, blocks assets and erodes trust. Full HTTPS integrity protects users and preserves the security signal Google factors into rankings.

Category-by-Category Score Improvement

Before vs after across all major SEO pillars
On-Page Optimisation
28/10091/100
Technical SEO Health
31/10084/100
Core Web Vitals
41/10078/100
Structured Data / Schema
0/10092/100
Mobile Usability
55/10089/100
Content Quality (E-E-A-T)
22/10076/100
GEO / Multilingual Signals
10/10082/100
SEO scores improved significantly across all categories after optimization.

AEO + GEO + AI Search Strategy — RankifyGenius Method

How we future-proofed OYH.pl for AI-powered search engines and geographic targeting
What is AEO?
Answer Engine Optimization is the practice of structuring content — with schema, concise Q&A answers and server-rendered facts — so AI answer engines like Google AI Overviews, Perplexity and ChatGPT Search can extract, trust and cite it directly in generated answers.
What is GEO?
Geo / Generative Engine Optimization aligns language, hreflang, location schema and local intent so a site surfaces for the correct audience and market. For OYH.pl that means Polish-speaking users in Poland and the international Polish diaspora.
🤖

Answer Engine Optimisation (AEO)

Structured FAQPage and HowTo schema deployed to feed Perplexity, ChatGPT Browse, and Google AI Overviews. Question-format H2 headings aligned with zero-click intent. Each FAQ answer limited to 40–60 words for AI snippet extraction.
FAQPage SchemaSnippet TargetingZero-click Ready
🌍

Geo Engine Optimisation (GEO)

Polish hreflang declared across all 4,462 city pages. GBP-aligned NAP consistency checked. City-level landing pages enriched with local intent copy. GeoCoordinates schema added to business entity. International Polish diaspora targeted via x-default hreflang.
hreflang pl_PLLocalBusiness SchemaCity-Level SEO

AI Crawl Accessibility

Ensured all key content is server-side rendered for AI crawler bots (GPTBot, PerplexityBot, ClaudeBot). Created a dedicated /llms.txt file listing indexable endpoints. Semantic HTML5 landmark elements added for AI content extraction quality.
SSR Contentllms.txtSemantic HTML
🔗

Entity Authority Building

OYH.pl Knowledge Graph entity established: Organization schema with sameAs links to Wikipedia, Wikidata, social profiles. NLP entity clusters built across classifieds, nieruchomości, motoryzacja verticals. Topical authority map created for 21 category clusters.
Knowledge GraphEntity SEOTopical Authority

Full Audit Results Summary

All 21 tracked signals across on-page and technical SEO
SignalBeforeAfterImpact
Title Tag QualityPoorExcellent+High
Meta DescriptionKeyword stuffedAEO-optimised+High
H1 TagJS-only, not crawledSSR + semantic+Critical
Heading HierarchyH2→H4 skippedH1→H2→H3 correct+Medium
Image Alt TextMissing / wrongFull coverage+High
Schema MarkupNone (0 types)6 schema types+Critical
Canonical Tags2800+ duplicatesFully resolved+Critical
Page Speed (Mobile)41/10078/100+90%
LCP4.8s1.9s-60%
CLS0.380.04-89%
Total Blocking Time1,840ms210ms-88%
Robots.txt / SitemapMissing sitemap ref3-part sitemap+Medium
hreflangNonepl_PL + x-default+GEO
Open Graph / SocialPartialFull suite+Medium
Mixed Content (HTTPS)23 HTTP assets0 warnings+Security
Keyword Cannibalization3 competing pagesEliminated+High
Internal Link StrategyGeneric anchorsKeyword-anchored+Medium
Content Depth (Home)280 words800+ words+E-E-A-T
FAQ / AEO Content2 thin Q&As8 schema Q&As+AEO
AI Crawler AccessJS-gated contentSSR + llms.txt+AI Search
Viewport / Mobile UXZoom blockedAccessible+Mobile

Frequently Asked Questions

SEO, AEO & GEO questions answered — optimised for AI answer engines

What is a website SEO score and how is it measured?

An SEO score is a 0–100 health rating that combines on-page signals (titles, headings, content, internal links), technical signals (crawlability, canonicals, sitemaps), Core Web Vitals (LCP, CLS, INP), structured data, mobile usability and geo/language targeting. OYH.pl started at 34/100 and reached 87/100 after RankifyGenius resolved 18 of 21 audited issues.

How did RankifyGenius improve OYH.pl's SEO score from 34 to 87?

We ran a full on-page and technical audit, then fixed the highest-impact issues first: server-rendering the H1 and key content, deploying six schema types, resolving 2,800+ duplicate URLs with canonicals, cutting LCP from 4.8s to 1.9s, adding hreflang for GEO, and building AEO-ready FAQ content for AI answer engines — all within a 45-day sprint.

What is the difference between SEO, AEO and GEO?

SEO optimizes a site to rank in traditional search results. AEO structures content so AI answer engines like Google AI Overviews, Perplexity and ChatGPT Search can extract and cite it. GEO targets the right language and location signals so a site surfaces for the correct audience — for OYH.pl, Polish-speaking users in Poland and the diaspora.

How long does technical SEO take to show results?

Technical fixes such as canonicals, Core Web Vitals and schema are usually recrawled within days to a few weeks. For OYH.pl we delivered measurable score gains within a 45-day window, though full ranking and traffic impact continues to compound for several months as search engines and AI crawlers reprocess the improved pages.

Why is structured data (schema markup) important for AI search?

Schema markup gives search engines and AI models explicit, machine-readable facts about a page — its organization, breadcrumbs, FAQs, products and listings. Without it, AI engines must guess. OYH.pl went from zero schema to six validated schema types, making it eligible for rich results and citation inside AI-generated answers.

Can these SEO improvements work for B2B SaaS and ecommerce sites?

Yes. The same audit framework — on-page, technical, Core Web Vitals, schema, AEO and GEO — applies to B2B SaaS and ecommerce brands. Rankify Genius specializes in turning organic search into a profitable acquisition channel for exactly these business types.

What is an llms.txt file and why does it matter for AI crawlers?

An llms.txt file is a plain-text guide that lists a site's most valuable, indexable content for large language model crawlers such as GPTBot, PerplexityBot and ClaudeBot. It helps AI engines find and cite the right pages. We added a dedicated llms.txt and server-rendered content so OYH.pl appears in AI answers for Polish classifieds queries.

How do I get a free SEO audit from Rankify Genius?

Request a free audit at rankupgenius.com. We review your on-page, technical, Core Web Vitals, schema, AEO and GEO signals, then deliver a prioritized fix list — the same white-hat process used to take OYH.pl from a 34 to an 87 SEO score.

RankifyGenius Verdict

OYH.pl arrived with a 34/100 overall SEO score — a platform with 43,000+ real listings being severely undersurfaced by fixable technical debt and zero structured data. Within 45 days, RankifyGenius elevated the score to 87/100 by resolving 18 of 21 identified issues. The platform is now AI-search ready (AEO), geographically targeted (GEO), and primed for rich result eligibility in Google, Bing, and AI answer engines like Perplexity and ChatGPT Search. The site's listing content is now server-rendered and accessible to GPTBot, PerplexityBot, and ClaudeBot — ensuring OYH.pl appears in AI-generated answers for Polish classifieds queries.
+156% SEO score lift 21 issues audited AI-search ready GEO optimised Rich results eligible 45 days
Want results like OYH.pl for your website?
Rankify Genius turns organic search into your most profitable acquisition channel with manual, white-hat, AEO- and GEO-ready SEO. Get a prioritized fix list built on the same process behind this case study.
Get Your Free SEO Audit →