Case studies/Health, real estate & civic
Healthcare · Webflow to Astro migration

Understood Care

2026

Medicare care-advocate service: visual updates on the existing Webflow site, then a migration to a static Astro site on Cloudflare Pages that kept the design, self-hosted every asset and replaced the 265 KB Webflow runtime with 8 KB of custom JavaScript.

Overview

Understood Care connects Medicare members with care advocates who take on paperwork, claims, appointments, medications and benefits, with the service covered by Medicare. Data Subsystems took the site on in 2026 while it still ran on Webflow: first visual changes inside Webflow, then a complete move off the platform.

The migration kept the design the client already had. Webflow's exported HTML became the layout source for a static Astro site: Astro pages wrap those shells, inject a new mega menu and mobile drawer, and fill them with care guides, articles, care types and FAQ stored as files in git. About 1,200 images and fonts were pulled off Webflow's CDN and self-hosted, redirects keep old URLs working, and every push deploys to Cloudflare Pages with preview URLs for pull requests.

Speed was a stated requirement: the client asked for Lighthouse 90+. The Webflow runtime, webflow.js with jQuery at about 265 KB, was replaced by an 8 KB script that covers only the interactions the site uses, CSS is purged per page, fonts are self-hosted and loaded asynchronously, and analytics wait until the page has loaded. A Lighthouse run on September 16, 2026 scored the homepage 93 to 99 for performance on mobile and 99 to 100 on desktop, with 99 for accessibility and 100 for best practices and SEO.

What was built

Stack

Frontend

Astro 6
Static build that wraps the Webflow-exported pages and renders content from the repository
TypeScript
Routes, layouts, the Webflow shell loader and data helpers
Tailwind 4
Styling for the new navigation, footer and editorial pages, with the typography plugin
uc.js (8 KB)
Hand-written runtime that replaced webflow.js and jQuery for the few interactions in use
Fontsource fonts
Merriweather, Inter and Montserrat self-hosted as a Latin-only subset, loaded asynchronously

Data

Content in git
Each guide or article is a folder with metadata and HTML; every edit is a commit
cheerio
Build-time HTML processing that injects menus and listing content into the Webflow shells

Infrastructure & DevOps

Cloudflare Pages
Deploys on every push to main, preview URLs for pull requests, redirect rules for renamed URLs
GitHub Actions
Runs the unit and end-to-end test suites on changes

Integrations & Payments

AEO Content studio
Publishes new care guides and articles into the repository as pull requests
Google Tag Manager, GA4, Google Ads, PostHog
Analytics and conversion tags, all deferred until after the page loads

CMS & Commerce

Webflow
The original platform: visual updates first, then its exported HTML kept as the design source

Tooling & QA

PurgeCSS
Per-page pass after the build that strips unused Webflow framework CSS
Lighthouse
Local audits against the client's Lighthouse 90+ requirement
Vitest
Unit tests for SEO data, the sitemap, llms.txt, feeds and JSON-LD, about 94 percent line coverage
Playwright
End-to-end browser tests, runnable against a local build or production

Engineering highlights

Kept the design, dropped the platform: Webflow's exported HTML stays the source of the layout, so the familiar look survived while hosting, content and scripts moved to a static Astro build.

Chose files in git over a CMS stack: an early build with a headless CMS, a database and an admin was retired in April 2026 for a fully static site where every edit is a commit and every deploy is a full rebuild.

Performance work was measured rather than assumed: fonts moved into an async Latin-only stylesheet and the hero image was preloaded to bring LCP down, and an async-CSS experiment that delayed LCP was reverted.

Guardrails written into the repository: Webflow CSS loads only on pages that render Webflow shells, no new runtime JavaScript, and a Lighthouse 90+ check for every change.