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.

In brief: 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

What matters most in this project?

  • 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.

What is the project built with?

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 did it start?

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.

What was built?

🌐 What is on the site?

  • 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

🗓 How does the booking system work?

  • 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

🔍 What was done for 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

🖼 How were social and accessibility handled?

  • 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

🚚 How did the migration and launch go?

  • 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

What is the result?

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 audit—0 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

What does it cost at list price?

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.

“The thing I see most often is a thought smeared across the page. The answer is there, but it assembles from four paragraphs spread top to bottom. A human will read on and put it together. A model takes the first third and leaves.”

Evgenii Slepinin, founder of SEO7, systems architect

Frequently asked questions

Why replace Bitrix with Django?

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.

Was the site down for long during the migration?

No. The new site was brought up in parallel, the domain was switched with no downtime, and all old URLs were preserved.

What was wrong with the old site?

It ran on an outdated, infected Bitrix build and served a `noindex, nofollow` directive in the `<head>` — to search engines the site simply did not exist.

Will old links (including .php) stop working?

No. All previous URLs, including `.php`, were preserved with redirects — old links do not break.

What is server-side rendering and why does it matter for SEO and AI search?

The HTML is delivered ready, not assembled by scripts. Search robots and AI crawlers, which barely run JavaScript, see all the content and markup right away.

How does the booking system work?

It is a custom Django app: an admin class calendar, studios with capacity, instructors and seat-limit control with no race conditions. A class is created with a click.

Where does the schedule on the site come from?

It is imported from an external calendar for both branches, automatically once an hour. If the calendar fails to load, the user sees a correct status, not an error.

What are the 1,132 FAQ questions for?

FAQ blocks on 110 pages with FAQPage markup. It is built from the same text the user sees and raises the chance of appearing in answer blocks and AI search.

Why 116 pages?

Every page is built from a single content registry: home, 24 disciplines, 18 instructors, services, pricing, contacts and a blog of 50 articles. Duplicates are impossible by design.

Is the site ready for AI search (ChatGPT, Perplexity)?

Yes. Server-side rendering, Schema.org markup and the llms.txt / llms-full.txt map give AI crawlers a clear content structure. It is a technical base, not a guarantee of appearing in answers.

Who manages the content now?

The center itself, through the Django admin panel. Pages, disciplines, instructors, texts and meta are edited centrally in a single registry.

What about security after the infection?

The infected Bitrix and its databases were removed, without a single line of legacy code. The new site runs over HTTPS with an HTTP→HTTPS redirect.

What does Schema.org markup give you?

A coherent JSON-LD @graph with 8+ types (Organization, two branches as LocalBusiness, Service, Person, FAQPage, BreadcrumbList, Article) helps search engines and AI understand what business and pages they are looking at.

What comes next after launch?

We removed the `noindex`, opened the site to search engines and prepared the sitemap for submission to Search Console. After that comes the build-up of indexing and data.

Related projects.

Ready for your project?

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