SEO7.ES — Web, SEO, AI & Automation
Skip to content

Case · Website + SEO

A website Google could not see.

Yoga center «Praktika» — мобильная версия

We pulled the yoga center off an infected Bitrix and rebuilt the site on Django with server-side rendering. We added an in-house booking system and moved 116 pages out of noindex — into search and AI answers.

Cheboksary · two studios · 24 disciplines · 18 instructors · 4,000+ clients over 20 years.

Yoga center «Praktika» — десктоп

Want a similar project?

Take a short brief — we’ll come back with a plan and a quote.

Twenty years in business, two studios, 24 disciplines, 18 instructors and more than four thousand clients. And a website search engines never saw: the old Bitrix build was infected and, on top of that, returned a noindex directive in every response. However much content sat there, for Google and Yandex the centre simply did not exist. We rebuilt the project from scratch on Django, added our own booking system and opened 116 pages for indexing.

Client: Praktika yoga centre, Cheboksary · Category: website + SEO

The short version

  • From 0 indexed pages to 116. The whole site sat under noindex; for search it did not exist.
  • The infected Bitrix was replaced with clean Django, without a single line of inherited code.
  • Our own booking system with an admin calendar and hourly schedule sync from Yandex Calendar.
  • 1132 FAQ questions marked up across 110 pages: that much living text the centre had gathered over twenty years.
  • 26 KB of HTML, a 0.4-second response, gzip and HTTPS.
  • Every old URL preserved, including the .php ones, so links from old posts still land.

Tech stack

  • Backend: Python, Django 5.2 with server-side rendering, Phusion Passenger.
  • Database: MySQL 8, migrated from an inherited 5.7. On shared hosting the standard driver will not build, so pure PyMySQL is used.
  • Infrastructure: nginx, Apache, Passenger, HTTPS via Let's Encrypt, gzip, forced HTTPS redirect.
  • Booking: a custom Django application, with the admin panel serving as the staff interface.
  • Integrations: schedule import from Yandex Calendar over iCal, Yandex Metrica, cron.
  • SEO and GEO: JSON-LD @graph, sitemap.xml, robots.txt, llms.txt and llms-full.txt.

Server-side rendering was not a fashion choice. The HTML arrives fully assembled, so both search crawlers and AI crawlers, which barely execute JavaScript, see all the content and markup straight away.

How it started

The centre came with a complaint you hear often: “we have a website and it brings no clients”. Usually that means weak copy or slow loading. Here the cause was different and considerably worse.

First, the engine was infected. The old Bitrix build had gone years without updates and was hosting malicious code. Second, the entire site returned a noindex, nofollow directive in its header. It worked perfectly well, showed the schedule and the prices, and yet for search engines it did not exist.

Treating that makes no sense: the same holes bring back the same problem. The project was rebuilt entirely, the content moved into a single registry, and the old site was retired without any downtime for the live domain.

Full list of what was built

🌐 Site and content

  • 116 pages: home, a catalogue of 24 disciplines, 18 personal instructor pages, services, prices, contacts, blog
  • A three-week schedule with day-by-day scrolling and a mobile layout
  • A blog of 50 yoga articles targeting search and informational queries
  • A “Coming up” block on the home page, live, from the same source as the schedule
  • A single content registry: pages, disciplines, instructors, copy, keywords and meta are edited in one place, and duplicates are impossible by design

🗓 Booking system

  • The class calendar as the main admin screen, a class created with one click
  • Studios with capacity, instructors, discipline cards, seat limits enforced without race conditions
  • Schedule import from Yandex Calendar for both locations, automatically every hour
  • A clear split between “the calendar failed to load” and “there are no classes”, so people see a correct status rather than an alarming error

🔍 Technical SEO and markup

  • Unique titles of 30 to 60 characters and descriptions of 120 to 160 across all 116 pages, zero duplicates
  • Canonical tags, correct indexing, Open Graph and Twitter Card on every page
  • JSON-LD @graph: Organization, both locations as LocalBusiness with addresses and hours, WebSite, WebPage, Service for disciplines, Person for instructors, FAQPage, BreadcrumbList, Article
  • Semantic breadcrumbs on 115 pages, tied into the schema
  • FAQ blocks: 1132 questions across 110 pages, with markup built from the same text people read
  • Sitemap, robots.txt, llms.txt and llms-full.txt as a content map for AI search

🖼 Social and accessibility

  • 116 social cards at 1200×630: a photo plus the brand strip with the logo, generated by script
  • Labels on form fields, accessible names for icon links and buttons, correct markup for decorative images

🚚 Migration and launch

  • The infected Bitrix and its databases were removed and the old site retired with no domain downtime
  • Every previous URL preserved, including the .php ones
  • The site was taken through seven stages: indexing, meta, markup, breadcrumbs, page schema, accessibility, content
  • The live site was checked across all 116 pages until two clean passes in a row
  • Noindex was lifted, the site opened to search engines and the sitemap prepared for Webmaster and Search Console

Results

MetricBeforeAfter
Pages open to indexing0, whole site under noindex116
Engineinfected BitrixDjango 5.2, clean code
Unique titles and descriptionsnone116 of 116, 0 duplicates
Schema.org markupabsent8+ entity types, a connected @graph
FAQ with markupnone1132 questions across 110 pages
Social cardsplaceholder logo116 cards at 1200×630
Booking systemnoneadmin calendar and hourly sync
Technical audit0 critical findings across 116 pages

Not sure where to start?

We’ll review your case in a free consultation and propose a solution.

More about this case

The full story of this project — how one line of code kept a 20-year-old business out of Google for four years, and what we did about it.

Read on LinkedIn

A related technical deep dive: how to let the right AI crawlers in and keep scrapers out — Web Bot Auth signatures, IP checks, and why you need both.

Read the article

Itemised estimate

17 itemsTimeline: ~1 month
À la carte (separately)€2300
Bundle saving−€1200
Turnkey package€1100

Prices per our list. Each module costs more separately: integrations, management, overhead. As one project on a single backend it’s cheaper. Exact quote for your case after the brief.

The more features, the better the bundle

SeparatelyBundle price
Минимум · €390Стандарт · €1490€2300−€1200This project€1100Scope of features →17Cost, €

Bought separately, cost grows linearly. As a bundle it plateaus: shared architecture, one backend, code reuse. So the more features, the wider the gap — and the bigger your saving. This project (41 features) is already at the plateau.

Frequently asked questions

The old Bitrix was infected with malicious code and fully closed to indexing. Django gave a clean, manageable platform with server-side rendering and an in-house booking system.

Related projects.

Ready for your project?

Leave a request — we’ll estimate the timeline and price for your business.