Project · 2026
Dra. Débora Mausolff — Site & SEO
Website for Dr. Débora Mausolff (Clínica Mithie, Canoas, Brazil) — a local-SEO engine in React: 113 URLs, 86 model-generated city × service pages, 18 structured-data types, a blog and WhatsApp booking that knows which city she attends in. Prerendered and deployed on Azure.
A clinic website built as a local-SEO engine: each of the 113 pages exists to be found on Google in the right city — and to convert into a WhatsApp booking, message already written.

Professional website for Dr. Débora Mausolff (Clínica Mithie), an advanced-aesthetics physician who attends at 5 clinics in 4 cities of southern Brazil — Canoas, Esteio, Tapes and Sertão Santana. The goal is strong organic presence: being found in local searches (Botox, facial harmonization, cryolipolysis… in the right city) and converting into bookings. Built in public since January 2026: 126 commits in 8 months.
It is a local-SEO engine by construction. A model with 16 services (Botox, facial, lip and gluteal harmonization, collagen biostimulators, cryolipolysis, rhinomodeling, dark circles, microneedling, spider veins…) crossed with the cities generates 86 programmatic landing pages — each with its own title, description, canonical and content. Together with 11 blog URLs, 3 procedure pages and the institutional ones, that is 113 URLs in the sitemap, with lastmod stamped at build time.
Real clinic structured data: 18 JSON-LD types per route — MedicalBusiness and MedicalClinic, Service with Offer, Person with Occupation and professional credential (EducationalOccupationalCredential), FAQPage with Question/Answer, BlogPosting, BreadcrumbList, ItemList, ImageObject, Organization and WebSite. Plus robots, sitemap and an llms.txt for AI discovery. The SEO routine is part of every change, not a step afterwards.
An SPA search engines can read: a lightweight post-build prerender (esbuild) generates, for every indexable route in the sitemap, the HTML with a complete head — title, description, canonical, robots, Open Graph, Twitter and JSON-LD, marked so react-helmet adopts them without duplicating — and a body with H1 and content. A crawler without JavaScript sees the real page; the visitor sees the React app take over on mount.
Conversion that knows the schedule: the booking CTA opens a modal to pick the city and clinic, and WhatsApp opens with the message pre-filled per city and service. A blog with 7 articles answering real questions (how long Botox lasts, preventive Botox, when to start, does cryolipolysis work?, how many sessions, spider-vein care), a results gallery with 25 images, testimonials and the Botox Club page.
A React front organized in MVC — 17 models (data, copy, SEO, consent), 8 controllers (hooks) and 45 pages with 18 components — on a custom design system: 32 tokens, warm palette (cream and brown), Nunito and an editorial serif (Cormorant / EB Garamond). 33 images in WebP.
LGPD that actually blocks: Google Analytics and the Meta Pixel only load after consent in the banner; Privacy Policy, Terms of Use and Data Deletion pages. A build that defends itself: source maps removed and verified absent before prerendering. Continuous deployment on Azure Static Web Apps via GitHub Actions, with SPA fallback and a custom 404.
By the numbers
- 113
- URLs in the sitemap
- 86
- City × service pages
- 16
- Services modeled
- 5
- Clinics in 4 cities
- 18
- JSON-LD types
- 7
- Blog articles
- 45
- React pages (views)
- 33
- WebP images
- 0
- Source maps in production
- 126
- Commits since Jan 2026
Engineering decisions
- 01
SEO is part of the task, not an extra step
Every page change already updates title, canonical, Open Graph, JSON-LD, sitemap and internal links — the SEO routine is built into the workflow. The sitemap gets lastmod stamped at build time, and the llms.txt describes the site for AI agents.
- 02
86 landing pages from a single model
Instead of writing page by page, a model with 16 services crossed with the cities served generates the 86 city × service pages — each with its own title, description, canonical and content, capturing local search intent without pointless duplication. Change the model, all of them change.
- 03
An SPA search engines can read
No framework migration: a lightweight post-build prerender, with esbuild, generates for every indexable route the HTML with a complete head (marked so react-helmet adopts it without duplicating) and a body with H1 and content. A crawler without JavaScript sees the real page; the visitor sees React take over on mount.
- 04
Real clinic structured data
18 JSON-LD types per route: MedicalBusiness and MedicalClinic, Service with Offer, Person with Occupation and professional credential, FAQPage with questions and answers, BlogPosting, BreadcrumbList and ItemList. Google understands she is a physician, what she does, where and for how much — not just a pretty page.
- 05
Booking that knows where she attends
She attends at 5 clinics in 4 cities. The CTA opens a modal to pick the city and clinic, and WhatsApp opens with the message pre-filled per city and service — whoever arrives via the cryolipolysis-in-Esteio page sends the right message, to the right place.
- 06
LGPD that actually blocks
The consent banner is not decorative: Google Analytics and the Meta Pixel only load after acceptance, driven by a consent model and controller. Privacy Policy, Terms of Use and Data Deletion pages close the loop.
- 07
A build that defends itself
The build pipeline strips source-map references and then verifies none remain before prerendering — source code never ships to production by accident. WebP images, cache headers and a custom 404 configured on Azure Static Web Apps.
- 08
MVC architecture on the front
17 models (data, copy, SEO, consent), 8 controllers (hooks) and 45 pages with 18 components. Data and copy separated from logic and screens: services, cities and articles scale without turning into a mess — and a 32-token design system keeps everything consistent.
Architecture
Models
Data · copy · SEO
17 models: services, cities and clinics, blog, per-route SEO, consent.
Controllers
8 hooks
Booking, consent, navigation and screen state.
Views
45 React pages
Home, procedures, 86 city × service pages, blog, club and institutional pages.
SEO por rota
react-helmet-async
Title, canonical, OG and 18 JSON-LD types; sitemap, robots and llms.txt.
Prerender
Light SSG with esbuild
HTML with head and content per indexable route; React takes over on mount.
Conversão
City-and-clinic modal + message pre-filled per service.
LGPD
Consent gating
GA and Meta Pixel only after consent; Privacy, Terms and Data Deletion.
Azure SWA
GitHub Actions
CI build with no source maps, SPA fallback, custom 404 and caching.
Stack