Finvisor
From WordPress to Next.js & Sanity: An AI-Ready Site With Guardrails Built In
)
At a glance
Client
Finvisor, the outsourced finance team behind 600+ startups and SMBs
Industry
Finance and accounting services
Project
WordPress → Next.js & Sanity migration, AI-ready setup
Stack
Next.js, Sanity, shadcn/ui, TypeScript, Vercel
Timeline
8 weeks, kickoff 17 July → live 13 September 2026
Scope
~950 URLs migrated, 23 sections, 17 page templates
Small changes
Done in-house in minutes, instead of $750 and five hours through an agency
Ownership
Finvisor’s own repository and Vercel account
About The Client
For 12+ years, Finvisor has been the outsourced finance team behind 600+ startups and SMBs, from accounting and fractional CFO to payroll, tax, and R&D tax credits. In 2026 it repositioned as "senior finance experts, amplified by AI."
Behind that line is Finvisor OS, a platform built in-house so its accountants move at software speed and still own every number. With a new product and the business growing rapidly, Finvisor needed a website that could keep up.
)
Challenge
A Site Only Developers Could Change
The existing WordPress site had been running since 2020 and had grown to around 282 pages. The rebuild had to meet four requirements at once.
The content team needed to ship without developers
In WordPress, any change, from a new landing page to a reworked service page, went through a front-end developer or an agency. The team wanted day-to-day changes to be self-serve, with developers reserved for heavy lifting.
"With a WordPress site, you end up being really tied to having to keep pulling in those agency resources to build pages."
Tamara Ranahan, Fractional CMO, Finvisor
AI agents had to be able to build on the site
Finvisor made this a hard requirement from the first call, and it went into the contract as a set of deliverables. The team already worked in Claude, and the new site had to let them build with it safely.
The SEO equity couldn't be lost
The old site was earning around 164,000 search impressions and 420 organic clicks a month (Google Search Console). Its homepage had 509 referring domains and 885 backlinks, including links from sites with a domain rating as high as 93. That visibility had been built since 2020 across 282 pages, including a 190-article accounting glossary, so every URL had to survive the move.
Mobile performance had to improve
Real-user data from Chrome (CrUX) in June 2026 showed the site failing Core Web Vitals on mobile: pages loaded slowly (LCP 3.5 s) and the layout shifted heavily while loading (CLS 0.29).
Moving from WordPress to Next.js & Sanity?
We’ll map every URL, keep your SEO intact, and hand over a site your team can run on its own.
Solution
We rebuilt the site on Nexity, our ready-made Next.js + Sanity setup that every project starts from, with shadcn/ui components. The code lives in Finvisor's own repository and runs on Finvisor's own Vercel account.
What Finvisor got
AI-ready: rules and Markdown files in the repository give AI agents the project context they need
A Next.js monorepo in strict TypeScript, with types generated from the Sanity schemas
SEO basics: metadata, OG images, sitemap, robots, and redirect handling that collapses chains (x → y → z becomes x → z)
Finvisor's own section designs, connected to Sanity, alongside 20+ ready content blocks
Global sections and settings, defined once and reused across pages
Separate staging and production datasets, so the team can practice editing without touching the live site
Content revalidated on publish, so changes go live immediately
Section thumbnails in Sanity Studio, so editors can see each block before adding it
Cookie consent connected to Google Tag Manager, with Global Privacy Control support
"Pagepro set us up on Nexity, their Next.js and Sanity setup. It’s a modern tech stack, very customizable, and very compatible with AI. Our developer was able to jump in and run with it from there. For businesses that don’t have a lot of internal bandwidth, this setup is really great."
Tamara Ranahan, Fractional CMO, Finvisor
A page builder that removes the developer bottleneck
The Sanity Page Builder gives the team 23 responsive, configurable sections, each with Light, Muted, and Dark variants. It also includes 17 page templates: homepage, services and service detail, industries, pricing, about, careers, FAQ, blog, legal, partnership, and two resource pages. Every template has a live preview and an SEO tab that shows how the page will appear in Google search results. We also built a custom interactive burn-rate calculator as a lead-generation block.
The split of work matches what the client described on our first call. Editors build and change pages from the sections on their own, and each section can be filled by hand or set to pull in existing content, such as testimonials and team members. Developers handle the heavy lifting, such as new section types, forms, and the interactive quizzes Finvisor is planning next.
Editing the Finvisor homepage in Sanity Studio: changes appear in the live preview as you type, sections switch between Light, Muted and Dark, and the schema stops a comparison table at four columns.
Agent-native development with a human in the loop
The rule we agreed on: Claude works in the code, generating new sections in the repository, and every change goes through a pull request that a person approves. It's the same agent-native workflow we use in our own delivery. In practice, Finvisor's team can use Claude to:
Generate a new section, with its React component and Sanity schema, ready for a pull request
Create on-brand images and graphics for any page
Draft SEO-friendly blog posts with matching visuals
Design new layouts in Claude Design, using the site's imported design system
Plan a new page: Claude suggests which existing sections to use and returns a wireframe
What makes this work is the agent-native package, which gives Claude the project context it needs. It includes:
Sanity schemas with built-in limits, so no one editing a page can break the design.
Sections follow a fixed order (headline, content, call to action), and each part is optional
Column sections take two to four items, because more or fewer would break the layout
Colors come from the site’s palette, and buttons and CTAs from fixed, validated lists
Text inside a section can change heading levels but can’t take images; articles have their own, more flexible editor
)
Three Claude Code skills for building new sections, generating on-brand graphics, and writing blog posts. They live in the client's repository, and the sections skill runs as a slash command in Claude Code
design.md and a Tailwind style guide that encode the visual system
CLAUDE.md with project documentation, including verification and security steps
A section inventory, delivered both as Next.js/shadcn components and as an importable Claude Design system
)
Every commit runs linting, formatting, and type-checking. When the code is pushed, Vercel builds a preview deployment where the change is tested before it goes live. The build also runs an extra check for missing environment variables first, so no time is wasted on a build that can't work. Finvisor's own team then reviews and merges each change.
The graphics skill was in use before launch. In August, Finvisor's Fractional CMO started using it for the animated homepage elements, and by launch she had turned it into her own Claude skill and generated the rest of the site's images with it. She now plans new pages with Claude before building them in Sanity herself.
"Pagepro made our rebrand real. We left WordPress behind for Nexity, which was exactly what I was looking for: Next.js, Sanity, shadcn/ui, and good agent guidelines. Mike and Jacub kept a clear roadmap the whole time, so we went straight from idea to execution. Now Claude Code knows how the project is structured, so what it builds fits our components. I can ship small changes in a few minutes."
Fran Lozada, Head of Technology, Finvisor
Migration without losing SEO
We treated the existing URL structure as a contract:
185 articles moved over 1:1, keeping their original URLs, trailing slashes included. Finvisor chose to retire the other 5.
Changed URLs got permanent redirects (308, the modern equivalent of a 301) through a documented redirect map, including the redirects already set up in WordPress.
The build shipped with a sitemap, structured data and llms.txt.
We compared Search Console data before and after the move.
We migrated the content with scripts:
Exported everything from WordPress and rebuilt the content model as Sanity schemas
Mapped each WordPress content type to its new schema
Converted internal links to relative URLs
Uploaded images and files to Sanity first, so the content could reference them
Mapped each HTML element (headings, lists, images, quotes) to a matching Sanity component
Moved the content types one by one, keeping the articles' original copy and updating their SEO metadata from Finvisor's own spreadsheet
Before launch, we built a full inventory of every URL that had to survive: around 950 in total. A list taken from the sitemap alone would have missed 58 of them. Building the redirects surfaced WordPress's hidden fallbacks (it quietly served /accounting as /services/accounting) and old PDF links, which we re-uploaded to Sanity and redirected.
)
Every page was tracked individually. A testing sheet listed each page by old URL, new URL and source copy, with ‘done’ and ‘reviewed’ statuses. Our internal QA caught and fixed around 60 issues before client testing started. The client then tested against the same sheet.
The cutover was a DNS switch on a Sunday evening, timed for the quietest traffic of the week. Finvisor's Head of Technology made the switch himself, with a pre-release document covering backup and rollback; rolling back would only have meant pointing DNS back at the old site. There was no downtime, and both teams reviewed the live site first thing Monday morning.
For the first few weeks after launch we checked the site daily: 404s from real traffic in the hosting logs, real-user Core Web Vitals in Vercel Speed Insights, Sanity API usage for anything unusual, error logs, and Search Console. The 404s came mostly from bots probing old WordPress paths (wp-admin, wp-content) and from old images hot-linked by other sites, not from missing pages.
Finvisor's SEO agency reviewed the new site after launch and found no issues with the migration.
After launch, Search Console showed no new 404s or crawl errors: three before the move, three after.
Performance by default
Green Core Web Vitals were written into the contract as a deliverable. What made the difference:
Static rendering: pages are prerendered before anyone visits and cached until the next change in the CMS
Global CDN: Vercel serves every page from a location close to the visitor
Automatic image optimization: Next.js serves images in modern formats and at the correct size for each screen
Lazy loading of sections: sections load only when needed, which keeps bundle sizes small
Tree-shaking: unused code is removed from the bundles
Optimal third-party script loading: for example, Google Tag Manager loads only after a visitor's first scroll, click, or keypress, so tracking never delays the first view of the page on mobile
Layout stability: space is reserved for images and font loading is optimized, so the layout doesn't jump while the page loads (CLS)
After launch, real-user data shows both desktop and mobile passing Core Web Vitals (before: Chrome UX Report, June 2026; after: Chrome UX Report for desktop and Vercel Speed Insights for mobile, October 2026):
Metric | Before: WordPress (Jun 2026) | After: Next.js + Sanity (Oct 2026) |
Mobile: Largest Contentful Paint (LCP) | 3.5 s | 1.6 s |
Mobile: Interaction to Next Paint (INP) | 243 ms | 80 ms |
Mobile: Cumulative Layout Shift (CLS) | 0.29 | 0.01 |
Mobile: Core Web Vitals | FAIL | PASS |
Desktop: Largest Contentful Paint (LCP) | 2.3 s | 1.4 s |
Desktop: Interaction to Next Paint (INP) | 56 ms | 69 ms |
Desktop: Cumulative Layout Shift (CLS) | 0.12 | 0 |
Desktop: Core Web Vitals | PASS | PASS |
Core Web Vitals for finvisor.com on all devices (Chrome UX Report, 28-day windows up to 10 Oct 2026). After the 13 September launch, loading performance and visual stability moved into "good" and are still improving. Interactivity stayed good.
)
Google Search Console, desktop: before launch, around 80 URLs were rated "needs improvement". A week after launch, 91 URLs were rated "good", and none needed improvement.
)
Mobile, real users, after launch (Vercel Speed Insights): LCP 1.62 s, INP 80 ms, CLS 0.01, Real Experience Score 100. Google doesn't yet have enough mobile traffic to report on the new site, so mobile data comes from Vercel.
)
Desktop, PageSpeed Insights, 14 Oct 2026: the Core Web Vitals assessment passed, with a Lighthouse performance score of 98.
)
Results
2
Leads in the first 24 hours
One from paid search, one from organic, and every submission went straight into Finvisor’s CRM.
1.6 s
Mobile load time
Layout shift dropped from 0.29 to 0.01.
✅ Mobile: pass / Desktop: pass
0
New 404s across ~950 URLs
Every URL mapped. Search Console showed three crawl errors before the move and after.
Minutes
To ship a header or navigation change
The old agency quoted $750 for a persistent header, a navigation change and blog highlights. Finvisor’s developer now does changes like these in minutes.
1 week
To the first page built without a developer
The Fractional CMO built a complete case study page in Sanity herself, and the SEO agency now uploads blog posts on its own.
How We Worked
We ran a demo every week, eight sessions from kickoff to handover. Day-to-day communication went through Slack and ClickUp, and every page was tracked in the shared testing sheet. Finvisor’s Fractional CMO named that sheet as the biggest difference from previous projects: every page had its review status and a link to the team’s comments in one place.
DATE | MILESTONE |
8 July | Contract signed |
17 July | Kickoff |
13 August | Design sign-off |
27 August | Site handed to client for testing, CMS training |
13 September | Live |
22 September | Handover: delivery document, skills, documentation |
OUR TEAM
)
Jakub Dakowicz
CTO
(Lead Developer)
)
Mike Wigda
CDO
(Project Manager)
)
Rafał Mieczejko
QA
HAVE A PROJECT?
LET’S TALK ABOUT IT!
- THE FORM
- THE FORM
- THE FORM
- THE FORM
- THE FORM
- THE FORM
- THE FORM
- THE FORM
- THE FORM
Tell us more about your project
Please provide detailed information about your challenge, and our tech team will promptly review your submission. Expect to hear from us within 24 hours with tailored next steps and insights based on your request.
Book a Meeting With Our CEO
Upon receiving your form, we typically recommend a briefing meeting with our CEO to explore the specifics of your project. Schedule your meeting now to kickstart a tailored approach.
)
Chris Lojniewski
CEO