Background
About the project
Stem Cell for Life is a physician-led stem cell therapy clinic. I was already managing its Google Ads, and I took on a full rebuild of its WordPress site as the next step. I handled design, development, content structure, SEO, and deployment.
The Problem
What wasn't working
The old WordPress site had three issues:
- Compliance risk. Google classifies stem cell therapy as “Speculative and Experimental Medical Treatment,” so site copy had to stay educational, with no efficacy claims or booking language. WordPress made it hard to enforce that consistently.
- Hard to maintain. Content, templates, and plugins were tangled together, so even small edits risked breaking something.
- Weak search foundation. There was no structured data, and no content shaped for AI answer engines as well as traditional search.
The Solution
The approach
I rebuilt the site on Astro, with Sanity for content, Resend for forms, and Cloudflare for hosting.
Tools & workflow
Process
How it came together
- Architecture: I chose Cloudflare for its generous free tier since the client is a small business, along with having to use a D1 database for form submissions, so it just made sense. The site is server-rendered so new posts publish without a rebuild.
- Content modeling: I designed Sanity schemas for condition pages and reusable content sections, so the clinic can add and edit pages without code.
- Forms: The contact form posts to an Astro API route. It writes to D1 first, and a failed write is a hard failure so no submission is lost. It then sends an email through Resend, and a failed email is a soft failure that doesn’t block the submission.
- SEO and AEO: I wrote a spec covering canonical tags, Open Graph and Twitter metadata, author bylines, alt text, internal linking, and JSON-LD for Article, FAQPage, BreadcrumbList, and MedicalWebPage. I also wrote short direct-answer summaries for the major blog posts, plus meta descriptions for the condition pages.
Challenges
Bumps along the way
This was not a one-to-one move from WordPress. Between the new architecture, content modeling, and SEO/AEO requirements, there were a lot of moving parts to get right, while still keeping the site fast and accessible.
- This was my first time using Sanity for a migration from WordPress and it also involved adding new content.
- The client wanted to be able to edit and create pages similar to WordPress, which involved setting up Sanity's presentation mode along with custom blocks.
- Since the client wanted to be able to make edits, I had to make sure the entire site is server-side rendered vs static because otherwise there would be daily deployments.
Final Product
The finished site
- A live Astro site on the clinic's own domain, replacing WordPress.
- Sanity CMS with structured condition and content schemas.
- Forms backed by D1 and Resend.
- JSON-LD across the site.
- A fast, accessible, and maintainable site that meets the client's needs.
Results
The impact
No more clunky PHP. No more plugin conflicts. A modern, fast, and accessible site that the client can edit without fear of breaking anything.
Speed and accessibility were of the utmost importance, and we pulled it off with the new framework.
Learnings
What I learned
This was the first project where I went all in with Astro, Sanity, Cloudflare and Resend. I think the end result is excellent and I am very happy with how it performs, all while staying within the client's budget and allowing them to make their own site edits.
I had never used Resend before, and I was impressed with how easy it was to set up and integrate. I will definitely use it for future projects.
I believe Sanity is a huge upgrade from WordPress. It came with a learning curve for this project, but it was well worth it and I would also use it again.