Migração de WordPress para Next.js: SaaS Financeira Economiza $420K ARR
Seu oficial de conformidade envia um email às 21h47: os carregamentos de página estão atingindo 4,2 segundos, e isso é uma exposição regulatória. Seu CFO encaminha a renovação anual do CMS de $420K uma hora depois com uma palavra: 'Por quê?' Ambos os tópicos apontam para o mesmo monólito WordPress — um site de marketing, portal de clientes e hub de documentação mantidos juntos por 19 plugins premium e uma pilha de licenciamento que custa mais do que dois engenheiros. A SaaS financeira Series C por trás desses emails precisava de uma migração Next.js headless que eliminasse tempo de inatividade, porque em fintech, cada segundo offline dispara escrutínio de reguladores e chamadas zangadas de clientes empresariais. Eles também precisavam que a estrutura de custos fizesse sentido antes da próxima reunião do conselho. Construímos a migração em 90 dias e cortamos o gasto de infraestrutura em 73% enquanto triplicamos a velocidade da página — mas a parte mais difícil não era o código.
Esta é a história completa de como conseguimos.
Índice
- O Ponto de Partida: Um Monólito WordPress Sob Pressão
- Por Que Next.js Headless Foi a Escolha Certa
- A Arquitetura de Migração
- Estratégia de Zero Downtime: A Execução Paralela
- Resultados de Performance: 3x Mais Rápido e Mais
- O Detalhamento da Economia de $420K em Licenças
- Mergulho Técnico Profundo: Detalhes Chave de Implementação
- Lições Aprendidas da Maneira Difícil
- Timeline e Estrutura de Equipe
- FAQ

O Ponto de Partida: Um Monólito WordPress Sob Pressão
Deixe-me pintar o quadro. Esta empresa — vamos chamá-la FinEdge (NDA, você entende) — tinha aproximadamente 12.000 páginas de conteúdo em três propriedades web distintas:
- Site de marketing — Páginas de produtos, landing pages, blog com 2.400+ posts
- Portal de clientes — Painéis de contas, fluxos de onboarding, gerenciamento de documentos
- Hub de documentação — Documentação de API, guias de conformidade, tutoriais de integração
Todas as três rodavam em uma única instalação WordPress multisite hospedada no tier empresarial do WP Engine. A situação dos plugins era... algo. Eles estavam executando 47 plugins ativos, incluindo WPGraphQL, Advanced Custom Fields Pro, Yoast SEO Premium, WP Rocket, Gravity Forms e um plugin customizado que sua agência anterior construiu que manipulava logging de conformidade SOC 2 para alterações de conteúdo.
Os pontos de dor reais:
- Tempos de carregamento de página em média de 4,2 segundos em mobile (dados Google CrUX)
- Core Web Vitals falhando em 68% das páginas — LCP era brutal com 5,1s mediano
- $420K/ano em licenças entre hospedagem empresarial WP Engine, plugins premium, WAF, CDN e um ambiente de staging separado
- Editores de conteúdo esperando 8-12 segundos para o WordPress admin responder durante horários de pico
- Patches de segurança exigindo tempo dedicado de DevOps a cada duas semanas — reguladores de serviços financeiros não brincam
- Sem preview deployments — a equipe de conteúdo tinha que fazer push para staging e esperar 4 minutos pela invalidação de cache
Seu VP of Engineering nos disse durante a chamada de discovery: "Estamos gastando mais em nossa infraestrutura de website do que em dois engenheiros sênior. E ainda é lento."
Por Que Next.js Headless Foi a Escolha Certa
Avaliamos várias opções durante a fase de arquitetura. Aqui está o que estava na mesa:
| Opção | Prós | Contras | Custo Anual Estimado |
|---|---|---|---|
| WordPress (otimizado) | Familiar à equipe, sem migração necessária | Ainda lento, licenças inalteradas | $420K |
| Webflow Enterprise | Edição visual, deployment rápido | Limitado para necessidades de portal/app, vendor lock-in | $180K |
| Next.js + Sanity | Extremamente rápido, flexível, preview em tempo real | Esforço de migração, ramp-up da equipe | $38K |
| Next.js + Contentful | Recursos empresariais fortes, boa DX | Preço por usuário escala mal | $95K |
| Astro + Storyblok | Ótimo para conteúdo estático, leve | Menos maduro para necessidades de portal dinâmico | $42K |
Caímos em Next.js 14 (App Router) com Sanity como o CMS headless. Aqui está o porquê:
- O portal da FinEdge tinha rotas autenticadas dinâmicas que precisavam de renderização server-side. Next.js lida com isso nativamente com React Server Components.
- A linguagem de query GROQ da Sanity e sua colaboração em tempo real deram uma experiência dramaticamente melhor aos editores de conteúdo do que WordPress.
- O modelo de preço (plano Growth da Sanity em $99/mês + Vercel Pro) significava que os custos de infraestrutura caíram de $420K para aproximadamente $38K anuais.
- Sua equipe de engenharia já conhecia React. O ramp-up para Next.js foi medido em dias, não meses.
Consideramos seriamente Astro para o hub de documentação já que é principalmente conteúdo estático, mas a simplicidade operacional de manter tudo em um framework venceu. Se o site de docs fosse um projeto autônomo, Astro teria sido a escolha.
A Arquitetura de Migração
Aqui está a arquitetura de alto nível que projetamos:
┌─────────────────┐ ┌──────────────────┐
│ Sanity CMS │────▶│ Next.js on │
│ (Conteúdo) │ │ Vercel (Edge) │
└─────────────────┘ └──────────────────┘
│ │
│ ▼
│ ┌──────────────────┐
│ │ Cloudflare │
│ │ (DNS + WAF) │
│ └──────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ Media Pipeline │ │ Usuários Finais │
│ (Cloudinary) │ └──────────────────┘
└─────────────────┘
Os componentes chave:
Camada de Conteúdo
- Sanity como CMS primário para conteúdo de marketing, posts do blog e documentação
- Schemas Sanity customizados que mapearam para seus tipos de conteúdo WordPress existentes
- Portable Text para conteúdo rico (substituindo blocos Gutenberg do WordPress)
Camada de Aplicação
- Next.js 14 com App Router, implantado no plano Pro do Vercel
- React Server Components para o site de marketing e docs
- Componentes cliente apenas onde a interatividade era genuinamente necessária (formulários, painéis, gráficos interativos)
- Middleware para autenticação em rotas de portal, integrado com sua configuração existente de Auth0
Camada de Infraestrutura
- Vercel para hospedagem e edge functions
- Cloudflare para gerenciamento de DNS e regras WAF adicionais (requisito de conformidade de serviços financeiros)
- Cloudinary para otimização e transformação de imagens — substituiu 3 plugins de imagem WordPress

Estratégia de Zero Downtime: A Execução Paralela
Esta foi a parte que me manteve acordado à noite. FinEdge não podia se dar ao luxo nem de alguns minutos de tempo de inatividade. Seu portal de clientes processa transações financeiras, e qualquer interrupção dispara relatórios de incidente obrigatórios para reguladores.
Aqui está como fizemos:
Fase 1: Sincronização de Conteúdo (Semanas 1-3)
Construímos um pipeline de sincronização WordPress-para-Sanity customizado que rodava continuamente durante o período de migração:
// Versão simplificada do nosso worker de sincronização WP-para-Sanity
import { createClient } from '@sanity/client'
import WPGraphQL from './wp-graphql-client'
const sanity = createClient({
projectId: process.env.SANITY_PROJECT_ID,
dataset: 'production',
token: process.env.SANITY_WRITE_TOKEN,
apiVersion: '2024-10-01',
useCdn: false,
})
async function syncPosts(since: string) {
const posts = await WPGraphQL.getModifiedPosts(since)
const transaction = sanity.transaction()
for (const post of posts) {
const sanityDoc = transformWPToSanity(post)
transaction.createOrReplace(sanityDoc)
}
await transaction.commit()
console.log(`Sincronizados ${posts.length} posts`)
}
// Rodava a cada 5 minutos via cron
Isso significava que editores de conteúdo poderiam continuar trabalhando em WordPress durante toda a migração. Cada mudança que fizeram foi sincronizada automaticamente para Sanity em até 5 minutos.
Fase 2: Deployment Paralelo (Semanas 4-8)
Implantamos o site Next.js em um subdomínio (next.finedge.com) e rodamos ambos os sites simultaneamente. Nosso processo de QA comparou cada página individual:
- Testes de regressão visual com Playwright em 200+ páginas críticas
- Verificações de paridade SEO (meta tags, dados estruturados, URLs canônicas, sitemaps)
- Benchmarks de performance em cada template de página
- Auditorias de acessibilidade (WCAG 2.1 AA — necessário para serviços financeiros)
Fase 3: O Cutover (Semana 9)
O switch real foi anticlimático — que é exatamente o que você quer. Usamos balanceamento de carga da Cloudflare para gradualmente deslocar o tráfego:
- Hora 0: 5% do tráfego para Next.js, 95% para WordPress
- Hora 2: 25% / 75% (monitorando taxas de erro, Core Web Vitals)
- Hora 6: 50% / 50%
- Hora 12: 90% / 10%
- Hora 24: 100% Next.js, WordPress em modo somente leitura
- Semana 2: WordPress decomposto
Zero erros. Zero tempo de inatividade. Os dashboards de monitoramento eram entediantemente verdes.
Resultados de Performance: 3x Mais Rápido e Mais
Aqui estão os números reais, medidos 30 dias após a migração usando dados Google CrUX e Vercel Analytics:
| Métrica | WordPress (Antes) | Next.js (Depois) | Melhoria |
|---|---|---|---|
| LCP (p75) | 5,1s | 1,2s | 4,25x mais rápido |
| FID / INP (p75) | 280ms | 68ms | 4,1x mais rápido |
| CLS (p75) | 0,18 | 0,02 | 9x melhor |
| TTFB (p75) | 1,8s | 0,12s | 15x mais rápido |
| Performance Lighthouse | 34 | 96 | +62 pontos |
| Páginas passando CWV | 32% | 98% | +66% |
| Time to Interactive | 6,8s | 1,4s | 4,9x mais rápido |
O título "3x mais rápido" na verdade fica aquém. Na maioria das métricas, vimos melhorias de 4-5x. TTFB foi a estrela — indo de 1,8 segundos para 120 milissegundos graças ao Edge Network do Vercel e ISR (Incremental Static Regeneration).
O tráfego orgânico aumentou 31% nos primeiros 90 dias pós-migração. Sua equipe de SEO atribuiu isso principalmente a melhorias de Core Web Vitals e taxas de crawling mais rápidas do Googlebot.
O Detalhamento da Economia de $420K em Licenças
Vamos falar sobre dinheiro. Aqui está exatamente onde os $420K estavam indo e o que os substituiu:
| Item de Linha | Custo Anual WordPress | Custo Anual Next.js | Economias |
|---|---|---|---|
| Hospedagem WP Engine Enterprise | $150.000 | — | $150.000 |
| Vercel Pro (Team plan) | — | $2.400 | — |
| Licenças de plugin premium (47 plugins) | $28.000 | — | $28.000 |
| Plano Growth Sanity | — | $1.188 | — |
| Cloudinary Pro | — | $2.388 | — |
| WAF Enterprise (Sucuri) | $36.000 | — | $36.000 |
| Cloudflare Pro | — | $2.400 | — |
| Contrato de manutenção WordPress customizado | $96.000 | — | $96.000 |
| CDN (separado do WP Engine) | $24.000 | — | $24.000 |
| Hospedagem de ambiente staging | $18.000 | — | $18.000 |
| Auditorias de segurança WordPress (trimestral) | $48.000 | — | $48.000 |
| Tempo de equipe DevOps (FTE parcial) | $120.000 | $30.000 | $90.000 |
| Totais | $520.000 | $38.376 | $481.624 |
As economias reais acabaram sendo mais próximas de $482K, não $420K. A estimativa original de $420K da fase de discovery foi conservadora — não contabilizamos inicialmente a redução no tempo de DevOps ou a eliminação de auditorias de segurança trimestrais (Vercel e Cloudflare manipulam a maioria do que essas auditorias cobriam).
A matemática de ROI é direta. Nosso projeto de migração custou à FinEdge aproximadamente $185K em honorários de agência durante o engajamento de 10 semanas. Esse investimento se pagou em menos de 5 meses.
Mergulho Técnico Profundo: Detalhes Chave de Implementação
Manipulando 2.400 Posts de Blog com ISR
Não geramos estaticamente todos os 2.400 posts de blog no tempo de build. Isso teria tornado os deployments dolorosamente lentos. Em vez disso, usamos ISR com revalidação sob demanda:
// app/blog/[slug]/page.tsx
import { sanityFetch } from '@/lib/sanity'
import { postQuery } from '@/lib/queries'
export const revalidate = 3600 // Revalida a cada hora como fallback
export async function generateStaticParams() {
// Apenas pré-gera os top 100 posts por tráfego
const topPosts = await sanityFetch({
query: `*[_type == "post"] | order(pageViews desc) [0...100] { "slug": slug.current }`
})
return topPosts.map((post) => ({ slug: post.slug }))
}
export default async function BlogPost({ params }) {
const post = await sanityFetch({
query: postQuery,
params: { slug: params.slug },
tags: [`post:${params.slug}`]
})
// ... renderizar post
}
Quando editores de conteúdo publicam ou atualizam em Sanity, um webhook bate nosso endpoint de revalidação:
// app/api/revalidate/route.ts
import { revalidateTag } from 'next/cache'
import { NextRequest } from 'next/server'
export async function POST(req: NextRequest) {
const body = await req.json()
const secret = req.headers.get('x-sanity-webhook-secret')
if (secret !== process.env.SANITY_WEBHOOK_SECRET) {
return Response.json({ error: 'Não autorizado' }, { status: 401 })
}
// Revalida conteúdo específico
if (body._type === 'post') {
revalidateTag(`post:${body.slug.current}`)
revalidateTag('posts-list')
}
return Response.json({ revalidated: true })
}
Atualizações de conteúdo agora aparecem no site ao vivo em menos de 3 segundos. Compare com a invalidação de cache de 4 minutos que eles tinham com WordPress + WP Rocket.
Autenticação para o Portal de Clientes
As rotas do portal precisavam de autenticação server-side. Usamos middleware Next.js combinado com sua configuração existente de Auth0:
// middleware.ts
import { NextResponse } from 'next/server'
import { getSession } from '@auth0/nextjs-auth0/edge'
export async function middleware(req) {
if (req.nextUrl.pathname.startsWith('/portal')) {
const session = await getSession(req, NextResponse.next())
if (!session?.user) {
return NextResponse.redirect(new URL('/api/auth/login', req.url))
}
}
return NextResponse.next()
}
export const config = {
matcher: ['/portal/:path*']
}
Isso roda no edge, então requisições não autenticadas são redirecionadas antes mesmo de atingirem o servidor de aplicação. Rápido e seguro.
Mapa de Redirecionamento 301
Tínhamos aproximadamente 340 URLs que mudaram de estrutura durante a migração. Um site de serviços financeiros absolutamente não pode ter links quebrados — cada link de entrada de registros regulatórios, sites de parceiros e conteúdo histórico precisa resolver corretamente.
Construímos um mapa de redirecionamento em next.config.js e o complementamos com uma busca de redirecionamento dinâmico da Sanity para redirecionamentos gerenciados por editor:
// next.config.js (parcial)
module.exports = {
async redirects() {
return [
// Redirecionamentos estáticos para mudanças de URL conhecidas
...require('./redirects.json').map(r => ({
source: r.from,
destination: r.to,
permanent: true,
})),
]
},
}
Seis meses após o lançamento, Google Search Console mostra zero erros 404 da migração. Cada redirecionamento está funcionando.
Lições Aprendidas da Maneira Difícil
1. Blocos WordPress Gutenberg São Uma Dor Para Converter
Subestimamos o esforço para converter blocos Gutenberg para Portable Text da Sanity. FinEdge havia usado 23 tipos de blocos diferentes, incluindo blocos customizados que sua agência anterior construiu. Orçamente pelo menos 20% mais tempo do que você acha para transformação de conteúdo.
2. Treinamento de Editores de Conteúdo Não É Opcional
O Studio da Sanity é intuitivo, mas não é WordPress. Realizamos três sessões de 90 minutos de treinamento e criamos um Studio Sanity customizado com fluxos de trabalho orientados. A equipe de conteúdo foi de cética a entusiasmada em duas semanas, mas esse investimento em treinamento foi crítico.
3. Conformidade de Serviços Financeiros Adiciona Complexidade
Cada deployment precisava de um trail de auditoria. Cada mudança de conteúdo precisava ser registrada com timestamps e atribuição de usuário. Construímos um plugin Sanity customizado que registra todas as mutações de documento em uma tabela de auditoria append-only em seu banco de dados PostgreSQL existente. Essa migração sozinha levou uma semana extra que não estava no escopo original.
4. Não Esqueça de Formulários
Gravity Forms estava manipulando 14 tipos de formulário diferentes no site WordPress. Nós os substituímos com React Hook Form + Zod validation no frontend e server actions no backend, com submissions indo para seu CRM HubSpot existente. Essa migração sozinha levou uma semana cheia.
Timeline e Estrutura de Equipe
Duração total do projeto: 10 semanas
| Semana | Foco | Equipe |
|---|---|---|
| 1 | Arquitetura, design de schema Sanity, auditoria de conteúdo | 2 devs, 1 arquiteto |
| 2-3 | Pipeline de sincronização de conteúdo, customização de Studio Sanity | 2 devs, 1 estrategista de conteúdo |
| 4-5 | Build do site de marketing (Next.js) | 3 devs |
| 6-7 | Migração de portal, autenticação, formulários | 3 devs |
| 8 | Hub de documentação, auditoria de SEO, mapa de redirecionamento | 2 devs, 1 especialista em SEO |
| 9 | QA, regressão visual, testes de performance | 2 devs, 1 QA |
| 10 | Cutover gradual de tráfego, monitoramento, decommission de WordPress | 2 devs, 1 DevOps |
O tamanho máximo da equipe foi 4 pessoas. A maioria do projeto rodou com 2-3 desenvolvedores. Isso não é um engajamento de 15 pessoas, 6 meses — é uma equipe focada, experiente executando uma migração bem planejada.
Se você está considerando uma migração similar para sua organização, documentamos nossa abordagem de desenvolvimento CMS headless e nossa estrutura de preços é transparente. Também estamos felizes em pular para uma chamada para falar através de sua situação específica — contate-nos aqui.
FAQ
Quanto tempo normalmente uma migração WordPress para Next.js leva?
Para um site dessa complexidade (12.000 páginas, portal de clientes, hub de documentação), 10 semanas é realista com uma equipe experiente. Sites de marketing mais simples com 100-500 páginas podem ser migrados em 4-6 semanas. A maior variável é a complexidade de conteúdo — quantos tipos de post customizados, tipos de blocos e recursos dependentes de plugins você está rodando.
Você pode migrar WordPress para Next.js sem qualquer tempo de inatividade?
Sim, mas requer planejamento. A chave é rodando ambos os sistemas em paralelo com um pipeline de sincronização de conteúdo, então usando DNS-level traffic shifting para gradualmente mover usuários para o novo site. Fizemos isso com sucesso para múltiplos clientes. O requisito crítico é que seu conteúdo permaneça sincronizado entre ambos os sistemas durante o período de transição.
Quanto custa uma migração WordPress para CMS headless?
Depende muito do escopo. Uma migração de site de marketing direta pode custar $30K-$60K. Uma migração empresarial como a da FinEdge — com portal de clientes, requisitos de conformidade e 12.000 páginas — foi $185K. O cálculo de ROI importa mais do que o custo absoluto. O investimento da FinEdge se pagou em menos de 5 meses só com economias de licenciamento.
Next.js é realmente mais rápido que WordPress?
Em praticamente todos os casos, sim — significativamente mais rápido. WordPress gera HTML em cada requisição (a menos que altamente cacheado), e mesmo com plugins de cache como WP Rocket, você é limitado pelo tempo de resposta do PHP e pelo peso do ecossistema WordPress. Next.js com ISR ou geração estática serve páginas pré-construídas do edge. Tipicamente vemos melhorias de 3-5x em Core Web Vitals.
Qual CMS headless devo usar com Next.js?
Depende de sua equipe e requisitos. Sanity excela em modelagem de conteúdo customizada e colaboração em tempo real. Contentful é forte para equipes empresariais que querem uma abordagem mais estruturada e opinada, mas fica cara por assento. Storyblok é ótimo se edição visual é prioridade. Para sites mais simples, até arquivos Markdown em um repo Git podem funcionar. Avaliamos isso caso a caso — não há resposta universal.
Você perde SEO ao migrar de WordPress para Next.js?
Não se você fizer certo. As três coisas que importam: mapeamento abrangente de redirecionamento 301 para que nenhuma URL existente retorne 404s, preservação de todas as meta tags e dados estruturados e submissão de sitemaps atualizados ao Google Search Console imediatamente após cutover. FinEdge viu um aumento de 31% no tráfego orgânico em 90 dias, em grande parte impulsionado por melhorias de Core Web Vitals.
O que acontece com plugins WordPress após migração?
A funcionalidade de cada plugin precisa ser replicada ou substituída. Alguns são diretos — plugins de SEO são substituídos por metadados em seus componentes Next.js, plugins de cache se tornam desnecessários e plugins de formulário são substituídos por bibliotecas de formulário React. Outros, como plugins customizados de logging de conformidade, precisam de código de substituição bespoke. É por isso que uma auditoria de plugins completa durante discovery é essencial.
Editores de conteúdo ainda podem usar um editor visual após mover para headless?
Sim. Studio Sanity fornece uma interface de edição customizável com preview em tempo real. É diferente do editor de blocos do WordPress, mas a maioria das equipes de conteúdo o preferem após a curva de aprendizado inicial. A ferramenta Presentation da Sanity agora oferece edição visual verdadeira com funcionalidade click-to-edit no preview ao vivo. Também configuramos preview deployments no Vercel para que editores pudessem ver exatamente como seu conteúdo pareceria antes de publicar.