Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesMinisitesMinisites — QA Plan

Minisites — QA Plan

Resolution

StepExpected
Hit https://<orgsubdomain>.fitkit.fit/Astro fetches /minisites/resolve?host=<host> and renders publishedContent.
Hit a custom domain registered against an orgSame — resolves by custom_domain.
Hit a host that matches no rowAPI returns 404; Astro renders “Site not found”.
Org row exists but is_published = falseAstro renders 404 — drafts must not leak.
Org row exists, is_published = true, published_content = nullAstro renders 404.

Section rendering

StepExpected
Org has no programs, but classes section is enabledSection is filtered out of visibleSections and does not render.
Org has no upcoming sessionsschedule section is hidden.
Section’s isEnabled is falseSection is hidden regardless of data presence.
Two sections share the same orderStable order falls back to insertion sequence.

Theme

StepExpected
Owner edits primary color in editor and publishesNew color appears on next request after the 120s SWR window.
Owner sets a fontFamily not in the enumFalls back to inter.
Owner uploads a favicon<link rel="icon"> points at the uploaded URL.

Localization

StepExpected
Org locale = hePage renders RTL with Hebrew strings.
Org locale = enLTR English.
Org locale = ruLTR Russian.
Locale is malformedFalls back to he.

Live data freshness

StepExpected
Add a class session in the dashboardNew session appears on the schedule within 2 min (cache TTL).
Pause a planPlan disappears from pricing within 2 min.
Force-refresh via Vercel cache purgeUpdates visible immediately.

Performance

CheckThreshold
LCP on mobile (Lighthouse)< 2.5s.
Total JS bytes< 30KB gzipped (WhatsApp button + scroll observers only).
Hero image preload tag presentYes when hero has backgroundImage.

SEO

StepExpected
<title> and <meta description> come from seoTitle / seoDescriptionWhen set, override default.
robots.txt served at /robots.txtReturns a 200 with the org’s robots directives.
Cache-Control headerpublic, s-maxage=120, stale-while-revalidate=300.

Contact / lead capture

StepExpected
Submit the contact formLead lands in the org’s leads pipeline tagged as source: 'minisite'.
Submit with spam payload (honeypot triggered)Server rejects; no lead created.

Custom domain provisioning

StepExpected
Owner adds custom_domain and points CNAME to cname.vercel-dns.comVercel auto-issues cert; requests resolve.
Owner adds domain but never updates CNAMERequests return generic Vercel 404 (gap — see README).

Negative tests

  • Hit /minisites/resolve?host= with an empty host → API returns 400.
  • Hit the resolve endpoint with a host that includes a port → API strips the port before lookup.
  • Render with content.sections empty → only the hero (always-on) renders.