Healthcare WordPress to Next.js + Payload CMS (HIPAA-Safe)
Seu paciente clica em 'Formulários para Novos Pacientes' no seu site WordPress. Seis segundos se passam. O PDF finalmente carrega. Ele imprime, preenche à mão, depois envia por fax de volta—porque seu sistema de admissão foi construído em 2014. Enquanto isso, seu oficial de conformidade em TI acabou de descobrir dados de pacientes fluindo através de três plugins desprotegidos, e sua pontuação de Lighthouse móvel é 34. Uma clínica ortopédica de médio porte no Sudeste enfrentou exatamente esse cenário. Seis meses depois: frontend Next.js, backend Payload CMS, formulários de admissão seguros para HIPAA, e pontuações de Lighthouse 94/99. Mas a verdadeira vitória não foi a velocidade—foi os quatro pontos de exposição HIPAA que fechamos antes de sua auditoria.
Índice
- O Ponto de Partida: Com o Que Estávamos Trabalhando
- Por Que Next.js e Payload CMS
- Considerações HIPAA em uma Arquitetura Headless
- O Redesenho da Admissão de Pacientes
- Resultados de Performance e Pontuações de Lighthouse
- Estratégia de Migração: Zero Downtime, Zero Rankings Perdidos
- Mergulho Profundo na Arquitetura Técnica
- Lições Aprendidas
- FAQ

O Ponto de Partida: Com o Que Estávamos Trabalhando
A clínica—vamos chamá-la de Southeastern Ortho (NDA, você sabe como é)—vinha rodando WordPress desde 2017. Sua configuração era típica de uma clínica de saúde que cresceu organicamente sem muito cuidado técnico:
- WordPress 6.2 com 34 plugins (11 deles não atualizados há mais de um ano)
- Hospedagem compartilhada em um plano que custava $29/mês
- Contact Form 7 lidando com consultas de pacientes—sem criptografia, sem BAA com o provedor de hospedagem
- Formulários de admissão em PDF que os pacientes precisavam baixar, imprimir, preencher à mão, e enviar por fax ou trazer para consultas
- Tempos de carregamento de página média de 6,8 segundos em mobile
- Pontuação de Lighthouse mobile: 38
Essa pontuação de Lighthouse não é um erro de digitação. Trinta e oito. O site tinha imagens de herói não otimizadas (uma era um PNG de 4,2MB), CSS bloqueador de renderização de cinco plugins diferentes, e jQuery carregando três vezes por causa de conflitos de plugins.
Mas o problema real não era performance. Era risco.
Seus formulários de contato estavam coletando nomes de pacientes, números de telefone, e às vezes descrições de queixas médicas. Esses dados fluíam através de um plugin de formulário não criptografado, armazenado em um banco de dados WordPress em hospedagem compartilhada, e com backup em um serviço sem Business Associate Agreement (BAA). Seu oficial de conformidade havia sinalizado isso, e sua operadora de seguro de responsabilidade profissional estava fazendo perguntas pontuais.
O Briefing
A clínica precisava de:
- Um site rápido e moderno que refletisse a qualidade de seus cuidados
- Formulários de admissão de pacientes seguros para HIPAA que substituíssem o processo em papel
- Um CMS que seu gerente de escritório pudesse atualizar sem ligar para um desenvolvedor
- Melhor performance de SEO (eles estavam perdendo rankings de busca local para clínicas mais novas)
- Tudo isso sem quebrar o banco—eles são uma clínica médica, não uma startup de tecnologia
Por Que Next.js e Payload CMS
Avaliamos várias opções de arquitetura. Aqui está a comparação honesta que apresentamos ao cliente:
| Opção | Prós | Contras | Custo Est. |
|---|---|---|---|
| Rebuild WordPress (novo tema + plugins) | Familiar para a equipe, custo inicial menor | Mesmos riscos HIPAA, teto de performance, dependência de plugins | $15-25K |
| Webflow + formulários de terceiros | Rápido de construir, boa performance | Opções limitadas de conformidade HIPAA, custos por assento contínuos, vendor lock-in | $20-30K |
| Next.js + Payload CMS | Controle total, arquitetura segura para HIPAA, melhor performance | Investimento inicial mais alto, requer gerenciamento de hospedagem | $35-50K |
| Next.js + Sanity | Excelente experiência de edição, bom ecossistema | Preços do Sanity aumentam com o uso, preocupações com manipulação de PHI com CMS hospedado em nuvem | $30-45K |
Recomendamos Next.js com Payload CMS, e aqui está o porquê.
Next.js Foi o Frontend Certo
Next.js 14 (este projeto começou no final de 2024, e desde então rodamos na versão 15) nos deu exatamente o que um site de saúde precisa:
- Geração estática para páginas de conteúdo — bios de médicos, descrições de serviços, informações de localização. Essas páginas raramente mudam, então as pré-renderizamos em tempo de construção. Zero computação de servidor em tempo de solicitação significa TTFB rápido.
- Componentes de Servidor para conteúdo dinâmico — disponibilidade de compromissos, posts de blog, e a lógica do formulário de admissão se beneficiam todos da renderização no lado do servidor sem enviar JavaScript desnecessário ao cliente.
- Otimização de imagem pronta para usar —
next/imagecom conversão automática WebP/AVIF substituiu esses PNGs de 4MB por imagens adequadamente dimensionadas e lazy-loaded. - Middleware para cabeçalhos de segurança — usamos middleware Next.js para definir CSP rígidos, HSTS, e outros cabeçalhos de segurança que auditores HIPAA adoram ver.
Se você está curioso sobre nossa abordagem, documentamos nossas capacidades de desenvolvimento Next.js em mais detalhes.
Payload CMS Foi o Backend Certo
Escolhemos Payload CMS 3.0 sobre outras opções headless por várias razões específicas da saúde:
Auto-hospedado por design. Payload roda em sua própria infraestrutura. Isso é inegociável para HIPAA. Quando você está lidando com Informações Protegidas de Saúde (PHI), você precisa saber exatamente onde seus dados vivem, quem tem acesso, e ser capaz de assinar um BAA com seu provedor de infraestrutura. Plataformas CMS hospedadas em nuvem como Contentful ou Sanity armazenam dados em seus servidores—e enquanto algumas oferecem conformidade HIPAA em níveis empresariais, o custo é tipicamente 3-5x o que você pagaria para auto-hospedar Payload em um provedor elegível para HIPAA.
TypeScript nativo. A configuração do Payload é apenas TypeScript. Isso significa que nossos modelos de conteúdo, respostas da API, e tipos de frontend compartilham a mesma fonte de verdade. Quando o gerente de escritório adiciona um novo campo para "número de pré-autorização de seguro" ao formulário de admissão, nosso frontend sabe sobre isso imediatamente através de tipos gerados.
Controle de acesso integrado. O controle de acesso em nível de campo do Payload significou que pudemos criar papéis onde a pessoa de marketing pudesse editar posts de blog e páginas de serviço, mas não pudesse tocar em dados de admissão de pacientes. O gerente de escritório pudesse visualizar envios de admissão mas não pudesse modificar a estrutura do formulário. Essa granularidade importa quando você está documentando controles de acesso para conformidade.
Rich text feito direito. Payload usa Lexical (anteriormente Slate) para rich text, e a experiência de edição é genuinamente boa. O gerente de escritório do cliente, que usava WordPress há anos, estava confortável no painel admin do Payload em uma única sessão de treinamento de 45 minutos.
Trabalhamos regularmente com Payload e outras plataformas CMS headless—você pode ver mais sobre nossa abordagem de desenvolvimento de CMS headless.
Considerações HIPAA em uma Arquitetura Headless
Deixe-me ser claro sobre algo: nenhuma pilha de tecnologia é 'compatível com HIPAA' por si só. Conformidade com HIPAA é uma prática organizacional, não um recurso de software. O que uma pilha de tecnologia pode ser é "segura para HIPAA"—significando que não introduz risco desnecessário e suporta os salvaguardas administrativos, físicos e técnicos que HIPAA exige.
Aqui está o que implementamos:
Infraestrutura
- Hospedagem: AWS com BAA assinado. Usamos ECS Fargate para o contêiner Payload CMS e implantamos o frontend Next.js no Vercel (que não manipula PHI—distinção importante).
- Banco de dados: Amazon RDS PostgreSQL com criptografia em repouso (AES-256) e criptografia em trânsito (TLS 1.2+). Payload 3.0 suporta Postgres nativamente, que foi uma grande razão pela qual esperamos a v3.
- Armazenamento de arquivo: S3 com criptografia no lado do servidor, políticas de bucket restringindo acesso, e versionamento habilitado para trilhas de auditoria.
Fluxo de Dados para Admissão de Pacientes
É aqui que a arquitetura fica interessante. O formulário de admissão de pacientes vive no frontend Next.js, mas nós nunca enviamos PHI através da infraestrutura do Vercel.
Browser do Paciente → HTTPS → API Route (Next.js no Vercel) → NENHUM PHI armazenado aqui
↓
AWS API Gateway (com WAF)
↓
Função Lambda (valida, criptografa)
↓
Payload CMS API (em ECS Fargate)
↓
RDS PostgreSQL (criptografado em repouso)
A rota da API Next.js atua como um proxy fino. Valida a estrutura da solicitação (token CSRF, rate limiting, validação básica de campo) mas não registra ou armazena nenhum PHI. O processamento de dados real acontece totalmente dentro dos serviços elegíveis para HIPAA da AWS.
Detalhes de Criptografia
Implementamos criptografia em nível de campo para os dados mais sensíveis. Fragmentos de SSN de pacientes (últimos 4), IDs de seguro, e descrições de queixa médica são criptografados na camada de aplicativo usando AES-256-GCM antes de mesmo chegar ao banco de dados. Isso significa que mesmo se alguém obtivesse acesso ao banco de dados, veria blobs criptografados para campos sensíveis.
// Versão simplificada de nosso gancho de criptografia em nível de campo no Payload
import { encrypt } from '../lib/crypto';
const PatientIntake: CollectionConfig = {
slug: 'patient-intake',
hooks: {
beforeChange: [
async ({ data }) => {
if (data.ssnLastFour) {
data.ssnLastFour = await encrypt(data.ssnLastFour);
}
if (data.medicalComplaint) {
data.medicalComplaint = await encrypt(data.medicalComplaint);
}
return data;
},
],
},
access: {
read: ({ req: { user } }) => {
return user?.role === 'office-admin' || user?.role === 'provider';
},
create: () => true, // Envio de formulário público
update: ({ req: { user } }) => user?.role === 'office-admin',
delete: () => false, // Política de retenção - sem exclusões através do CMS
},
fields: [
// ... definições de campo
],
};
Auditoria de Logs
Cada acesso aos dados de admissão de pacientes é registrado—quem visualizou, quando, e de qual IP. Construímos um plugin Payload customizado que escreve para uma tabela de log de auditoria separada. Essa tabela é somente-append; nem mesmo usuários admin podem modificar ou deletar entradas. Durante a avaliação anual de risco HIPAA da clínica, essa trilha de auditoria foi especificamente chamada como um ponto forte.

O Redesenho da Admissão de Pacientes
O processo antigo: Paciente baixa um PDF de 6 páginas, imprime, preenche com uma caneta (metade do tempo de forma ilegível), traz para o escritório, e um funcionário insere manualmente no sistema EHR. Tempo médio do download até entrada no EHR: 3-5 dias úteis.
O novo processo: Paciente recebe uma mensagem de texto ou link de email 48 horas antes de sua consulta, completa o formulário multi-etapas no telefone em cerca de 8 minutos, e os dados estão disponíveis no sistema da clínica antes dele entrar pela porta.
Decisões de UX do Formulário
Quebrou o formulário de admissão em 7 etapas:
- Verificação de identidade (nome, data de nascimento, informações de contato)
- Informações de seguro (operadora, ID, número do grupo, upload de foto do cartão)
- Histórico médico (checklist de condições, histórico cirúrgico)
- Medicamentos atuais (com autocompletar de um banco de dados de formulário aberto)
- Motivo da consulta (texto livre + diagrama de corpo para localização da dor)
- Consentimento e acordos (captura de assinatura eletrônica)
- Revisão e envio
Alguns detalhes de UX que fizeram uma verdadeira diferença:
- Indicador de progresso mostrando "Etapa 3 de 7" reduziu abandono em aproximadamente 40% comparado ao nosso protótipo inicial que mostrava todos os campos de uma vez. Fizemos testes A/B disso durante um lançamento suave.
- Upload de foto do cartão de seguro com recorte automático e uma visualização. Pacientes fotografam a frente e verso do cartão. Isso sozinho eliminou aproximadamente 60% da entrada de dados de recepção.
- Autocompletar de medicamento usando a API RxNorm. Em vez de pacientes tentarem soletrar "hydroxychloroquine," eles digitam "hydro" e selecionam de uma lista filtrada. Isso reduziu significativamente erros de entrada de medicamento.
- Persistência de sessão — se um paciente inicia o formulário e é interrompido, seu progresso é salvo (criptografado em sessionStorage, nunca localStorage) por 30 minutos. Ele pode retomar onde parou.
// Autocompletar de medicamento usando API RxNorm
const useMedicationSearch = (query: string) => {
return useQuery({
queryKey: ['medications', query],
queryFn: async () => {
if (query.length < 3) return [];
const res = await fetch(
`/api/medications/search?q=${encodeURIComponent(query)}`
);
return res.json();
},
staleTime: 1000 * 60 * 5, // Cache por 5 minutos
enabled: query.length >= 3,
});
};
O endpoint de busca de medicamento no lado do servidor consulta RxNorm através de nosso backend AWS, mantendo a chamada de API externa longe do cliente e permitindo que façamos cache de resultados.
Resultados de Performance e Pontuações de Lighthouse
Aqui está o antes e depois:
| Métrica | WordPress (Antes) | Next.js + Payload (Depois) | Melhoria |
|---|---|---|---|
| Lighthouse Mobile | 38 | 94 | +147% |
| Lighthouse Desktop | 61 | 99 | +62% |
| First Contentful Paint (Mobile) | 4,2s | 0,8s | -81% |
| Largest Contentful Paint (Mobile) | 8,1s | 1,4s | -83% |
| Total Blocking Time | 1.840ms | 45ms | -98% |
| Cumulative Layout Shift | 0,34 | 0,01 | -97% |
| Time to Interactive | 9,3s | 1,2s | -87% |
| Peso da Página (Homepage) | 4,8MB | 340KB | -93% |
| Core Web Vitals Pass | Não | Sim (todas verdes) | — |
A pontuação mobile de Lighthouse de 94 (não 100, e vou explicar por que em um momento) foi medida na página de admissão de pacientes, que é a página mais pesada em JavaScript no site. Páginas de conteúdo como a homepage e páginas de serviço consistentemente marcam 98-100 em mobile e desktop.
Por que não um perfeito 100 em mobile? Duas razões:
- O widget de autocompletar de medicamento requer JavaScript no lado do cliente que adiciona cerca de 12KB gzip à página do formulário de admissão.
- Usamos reCAPTCHA v3 no formulário de admissão como uma camada de prevenção de bots, e o script reCAPTCHA do Google não é exatamente leve. Fazemos lazy-load, mas ainda custa alguns pontos.
Consideramos remover reCAPTCHA para atingir 100, mas o benefício de segurança supera a métrica de vaidade. Um formulário de admissão de saúde sem proteção contra bots está pedindo envios de spam misturados com dados de pacientes reais.
Estratégia de Migração: Zero Downtime, Zero Rankings Perdidos
Migrar um site de clínica médica é estressante porque downtime literalmente significa consultas perdidas de pacientes. Aqui está como lidamos:
Migração de Conteúdo
Escrevemos um script de migração que puxou conteúdo da API REST do WordPress e o transformou em documentos Payload CMS. O script lidou com:
- 47 páginas de serviço
- 12 perfis de médico/provedor
- 89 posts de blog (com re-hospedagem de imagem)
- 6 páginas de localização
- Todos os metadados de SEO (títulos, descrições, URLs canônicas)
Mapeamento de URL
Cada URL do WordPress foi mapeada para seu equivalente Next.js. Mantemos a mesma estrutura de URL onde possível e configuramos redirecionamentos 301 em next.config.js para o punhado de URLs que mudaram:
// next.config.js
const redirects = async () => [
{
source: '/services/:slug',
destination: '/orthopedic-services/:slug',
permanent: true,
},
{
source: '/team/:slug',
destination: '/providers/:slug',
permanent: true,
},
// ... 23 mais redirecionamentos
];
Cutover de DNS
Usamos uma estratégia de implantação blue-green. O novo site rodou em paralelo por duas semanas enquanto testávamos. No dia do cutover, atualizamos registros de DNS durante uma janela de manutenção domingo à noite. Downtime visível total: cerca de 3 minutos (a propagação de DNS foi rápida porque havíamos pré-diminuído TTLs para 60 segundos uma semana antes).
Resultados de SEO
Três meses pós-lançamento:
- Tráfego orgânico aumentou 34%
- Posição média para "ortopedista perto de mim" melhorou de posição 14 para posição 5
- Taxa de clique de Google aumentou 28% (melhores Core Web Vitals = melhor experiência móvel SERP)
- Zero erros 404 na Search Console para URLs previamente indexadas
Mergulho Profundo na Arquitetura Técnica
Para aqueles que querem a imagem completa:
┌─────────────────────────────────────────────┐
│ Vercel │
│ ┌─────────────────────────────────────────┐ │
│ │ Next.js 15 App Router │ │
│ │ - Páginas estáticas (ISR, 60s revalidação) │ │
│ │ - Server Components │ │
│ │ - API routes (proxy apenas, sem PHI) │ │
│ └─────────────────────────────────────────┘ │
└──────────────────┬──────────────────────────┘
│ HTTPS
┌──────────────────▼──────────────────────────┐
│ AWS (HIPAA BAA) │
│ ┌──────────────┐ ┌─────────────────────┐ │
│ │ API Gateway │ │ CloudFront (assets)│ │
│ │ + WAF │ └─────────────────────┘ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────▼───────┐ ┌─────────────────────┐ │
│ │ ECS Fargate │──│ RDS PostgreSQL │ │
│ │ (Payload 3) │ │ (criptografado) │ │
│ └──────┬───────┘ └─────────────────────┘ │
│ │ │
│ ┌──────▼───────┐ ┌─────────────────────┐ │
│ │ S3 (uploads) │ │ CloudWatch (logs) │ │
│ │ (criptografado) │ (trilha de auditoria) │ │
│ └──────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────┘
Custo de infraestrutura mensal: aproximadamente $180-220/mês na AWS (ECS Fargate é surpreendentemente acessível nesta escala) mais $20/mês para Vercel Pro. Compare com os $29/mês da hospedagem compartilhada que tinham antes—sim, é mais caro, mas estão recebendo infraestrutura elegível para HIPAA, scaling automático, e segurança genuína.
Lições Aprendidas
1. Comece conversas HIPAA cedo. Gastos três semanas no planejamento de arquitetura antes de escrever uma única linha de código. Isso nos salvou de pelo menos dois redesenhos potenciais.
2. Payload CMS v3 valia a pena esperar. Começamos este projeto quando Payload 3.0 estava em beta. Havia arestas ásperas—docs de migração foram incompletos, e alguns plugins não foram atualizados. Mas suporte nativo a Postgres e a UI de admin melhorada o tornaram a escolha correta.
3. Não sobre-engendre o formulário de admissão. Nosso primeiro protótipo tinha lógica condicional seis níveis de profundidade. O gerente de escritório olhou e disse, "Não podemos apenas fazer as perguntas em ordem?" Ela estava certa. Simplificamos, e as taxas de conclusão subiram.
4. Clientes de saúde precisam de acompanhamento na treinamento do CMS. Fornecemos três sessões de treinamento em vez de uma, mais vídeos Loom gravados para tarefas comuns. O investimento em treinamento se pagou no primeiro mês quando o gerente de escritório foi capaz de adicionar uma página de novo provedor sem abrir um ticket de suporte.
5. Orçamentos de performance são inegociáveis. Estabelecemos um orçamento de performance de <400KB peso de página e <100ms Total Blocking Time no início do projeto. Cada PR foi verificado contra este orçamento em CI. A única vez que tentamos adicionar uma biblioteca de ilustração animada, ela estourou o orçamento, e pegamos antes de ser implantada.
Se você está considerando uma migração similar para um site de saúde ou de indústria regulada, adoraríamos conversar sobre os detalhes específicos. Você pode nos contatar diretamente ou verificar nossa página de preços para intervalos de projeto.
FAQ
Usar Next.js e Payload CMS automaticamente torna um site compatível com HIPAA?
Não. Nenhuma pilha de tecnologia é inerentemente compatível com HIPAA. Conformidade com HIPAA requer salvaguardas administrativos (políticas, treinamento, avaliações de risco), salvaguardas físicos (controles de acesso à facilidade), e salvaguardas técnicos (criptografia, controles de acesso, logs de auditoria). O que Next.js e Payload CMS dão a você é uma arquitetura flexível onde você pode implementar os salvaguardas técnicos adequadamente—especialmente a natureza auto-hospedada do Payload, que deixa você controlar onde PHI vive.
Por que não apenas usar um serviço de formulário compatível com HIPAA como Jotform ou FormStack?
Você absolutamente pode, e para casos de uso mais simples, essa é uma escolha razoável. Avaliamos o plano HIPAA do Jotform ($99/mês) e FormStack ($83/mês). A questão para este cliente era profundidade de integração—eles queriam que os dados de admissão fluíssem em um fluxo de trabalho customizado que verificasse elegibilidade de seguro em tempo real e pré-populasse seu sistema EHR. Ferramentas de formulário prontas não conseguem lidar com isso sem middleware significativo, em cujo ponto você está construindo infraestrutura customizada mesmo assim.
Qual foi o custo total do projeto e linha do tempo?
O projeto chegou em aproximadamente $42.000 em 14 semanas. Isso incluiu descoberta e planejamento de arquitetura (3 semanas), design (2 semanas), desenvolvimento (7 semanas), e teste/migração (2 semanas). Hospedagem e manutenção contínuos rodam cerca de $250/mês incluindo custos de infraestrutura e um pequeno suporte de retenção.
Payload CMS consegue lidar com múltiplas localizações para um grupo de saúde?
Sim. Construímos uma coleção "Locations" em Payload com campos para endereço, horários, provedores, seguro aceito, e conteúdo específico de localização. Cada localização recebe sua própria página gerada por Next.js com marcação de dados estruturados (esquema LocalBusiness) para SEO local. Adicionar uma nova localização é tão simples quanto criar uma nova entrada no painel admin do Payload.
Como você lida com retenção de dados de pacientes e requisitos de deleção?
Implementamos políticas de ciclo de vida de dados automatizadas. Envios de formulário de admissão são retidos por 7 anos (combinando com o requisito de retenção de registros médicos do estado da prática), após o qual são automaticamente arquivados para S3 Glacier e eventualmente deletados. Pacientes também podem solicitar acesso a dados ou deleção sob leis de privacidade do estado—construímos um fluxo de trabalho admin em Payload onde a equipe pode processar essas solicitações com uma trilha de auditoria completa.
O que acontece se o servidor Payload CMS cair?
O frontend Next.js serve páginas estaticamente geradas do CDN Vercel, então o site principal fica em pé mesmo se o backend Payload está completamente offline. O formulário de admissão de pacientes não estaria disponível durante um outage de backend, mas configuramos ECS com políticas de auto-restart, health checks a cada 30 segundos, e alarmes CloudWatch que alertam tanto nossa equipe quanto o contato de TI da prática. Em 6 meses de produção, temos zero downtime não planejado.
Essa arquitetura é excessiva para uma pequena clínica com uma localização?
Depende do que você está fazendo com dados de pacientes. Se você apenas precisa de um site de brochura com um número de telefone e endereço, WordPress com um bom tema é bom—você não precisa de nada disso. Mas no momento em que você está coletando PHI através do seu site (formulários de admissão, questionários médicos, solicitações de consulta com detalhes médicos), você precisa de infraestrutura que suporte controles de segurança adequados. A arquitetura que construímos escala bem para baixo—uma clínica de uma localização custaria menos em infraestrutura por causa do tráfego menor.
Como a migração afetou rankings do Google?
Vimos uma breve flutuação de ranking (cerca de 10 dias) imediatamente após a migração, o que é normal. Por semana três, rankings haviam se estabilizado e estavam tendendo para cima. Por mês três, tráfego orgânico estava em +34% e as palavras-chave primárias da prática tiveram melhoria em média de 4 posições. A melhoria do Core Web Vitals foi o maior fator—Google havia estado penalizando seu site antigo pela performance móvel ruim nos resultados de busca.