1
Site migration
Off the drag-and-drop builder onto a static, hand-built site. Every one of the 214 old URLs mapped to its new home with a 301, staging locked away, and rankings watched daily through cut-over.
A fictional business. The figures are a modelled scenario, not a client result.
SEO case study · Kapana Courtyard Rooms
9-room guesthouse · Plovdiv · Bulgaria
3.1×
Direct bookings from organic up 3.1x, over 7 months on the Signal plan.
Nine rooms. Nine keys. Each one a fix. Pick them up below.
iThe challenge
A drag-and-drop site builder loaded 9 MB of images on mobile, ran four language versions with no hreflang and had a booking widget Google could not crawl. Nearly every booking came through OTAs at 18% commission.
Guests were finding Kapana Courtyard Rooms on the platforms, then paying the platforms. The guesthouse’s own site was slow on the phones people actually use while wandering Kapana, showed German visitors Bulgarian pages, and hid its rates inside a widget search engines could not open. The goal was not more traffic for its own sake: it was to make the direct route the easiest one to find.
Where bookings came from
Modelled share of all bookings, by channel
Every OTA booking cost 18% commission.
iiThe diagnosis
iiiThe key rack
Hooks start empty. Drag the dial through the 7 months and watch each key come back as its fix ships.
Technical fix
01
Scheduled · month 2
Before
9.2 MB of uncompressed JPEGs on the mobile homepage, full-size room photos sent to a 360px screen.
After (planned)
AVIF and WebP with responsive srcset, lazy-loaded galleries and a 38 KB hero.
9.2 MB → 640 KB
The single largest cause of the 6.8s mobile LCP.
ivThe strategy
Built on our Signal plan: technical foundations first, so every later page has something solid to stand on.
1
Off the drag-and-drop builder onto a static, hand-built site. Every one of the 214 old URLs mapped to its new home with a 301, staging locked away, and rankings watched daily through cut-over.
2
Images re-encoded and sized per device, render-blocking CSS and scripts removed, the hero preloaded. Field data, not lab scores, decided when a fix was done.
3
Hotel, HotelRoom and Offer markup so search engines understand nine distinct rooms, their prices and amenities, and the business profile points to the direct booking page.
4
Four languages in their own subfolders, each page declaring its three siblings and an x-default, so German searchers get German pages instead of Bulgarian ones.
vThe stay
Month 1
Full crawl of all four language versions, field Core Web Vitals pulled, booking funnel mapped from search to OTA. Every old URL logged for the redirect map.
15 bookings · LCP 6.6s · 22 pages
Month 2
Static rebuild off the site builder; images re-encoded; 214 redirects live at cut-over. Mobile LCP drops to 2.4s within the first field-data window.
18 bookings · LCP 2.4s · 41 pages
Month 3
Bulgarian, English, German and Turkish moved to subfolders with reciprocal hreflang. Indexed pages climb from 41 to 68.
22 bookings · LCP 2.3s · 68 pages
Month 4
Server-rendered rate pages replace the iframe; Hotel and HotelRoom schema shipped; business profile booking link moved off the OTA.
27 bookings · LCP 2.1s · 84 pages
Month 5
Individual room pages written in all four languages, plus old-town walking guides that link to the room closest to each sight.
33 bookings · LCP 2s · 92 pages
Month 6
Third-party scripts cut from 11 to 3; INP under 200ms. LCP settles at 1.9s in field data.
38 bookings · LCP 1.9s · 95 pages
Month 7
Direct organic bookings reach 43 a month against a baseline of 14. Commission avoided annualises to roughly €14,800.
43 bookings · LCP 1.9s · 96 pages
viThe ledger
Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.
Indexed before (22)Newly indexed (74)
29 extra direct bookings a month × 12 × €236 average stay × 18% commission that no longer goes to a platform ≈ €14,800 a year.
Modelled Google positions, mobile, Plovdiv. “—” means not in the top 100.
| Search | Lang | Monthly searches | Before | After |
|---|---|---|---|---|
| guesthouse kapana plovdiv | EN | 590 | 19 | 2 |
| къща за гости капана | BG | 880 | 11 | 1 |
| pension altstadt plovdiv | DE | 320 | — | 3 |
| plovdiv eski şehir otel | TR | 480 | — | 4 |
| quiet room old town plovdiv | EN | 140 | 34 | 2 |
| хотел стария град пловдив | BG | 1300 | 23 | 5 |
| where to stay in plovdiv | EN | 1900 | — | 6 |
| unterkunft plovdiv zentrum | DE | 210 | 48 | 4 |
A clean technical foundation, every language indexed, and a booking path search engines can read.