Arquivo de Caso · INV-0051
Página de preços congelada 25 minutos após uma atualização no CMS
Um mapeamento de tag ausente e um TypeError silencioso combinaram para bloquear todos os jobs de revalidação — deixando a página de preços da SimUser AI com dados antigos exatamente quando um reposicionamento de 15% entrou em vigor.
O Sintoma
Em 16 de abril de 2026, Felipe Aguiar (Head of Marketing, SimUser AI) publicou uma atualização de 15% em todos os planos via Contentful às 11h20 UTC. Às 11h45 UTC um lead confirmou que a página /pricing ainda exibia os valores antigos. A equipe de marketing já havia compartilhado os novos preços por e-mail — visitantes que clicavam nos links viam dados desatualizados.
Quadro de Evidências
tag: "revalidate"path: "/pricing"status: "pending"retries: 3error: "TypeError: Cannot read propertiesof undefined (reading NewImage)at handler (/var/task/index.js:23:45)"deployId: "deploy-20260416-030158"deployVersion:"v2.4.0"timestamp: "2026-04-16T03:02:14Z"
71 rows returned — all paths containing "/pricing"tag: "{deployId}/_N_T_/[locale]/pricing/page"path: "{deployId}/en/pricing"revalidatedAt:"1" ← never revalidated since deploy→ No cache invalidation reached any /pricing variant.
Log group: /aws/lambda/simuser-ai-production-WebsiteRevalidationSeederFunction{"level":"warn","msg":"Tag not found in revalidation table","tag":"pricing-page","pathCount":0,"note":"No paths registered for this tag — skipping"}
- /
- /pricing
- /features
- /blog/simuser-ai-v2-launch
- /blog/…
Onde o Pipeline Quebrou
Dois bugs sobrepostos bloquearam todas as tentativas de revalidação. Passe o cursor sobre cada X para ver o código com falha.
Raio de Impacto Sistêmico
O TypeError no handler do Subscriber afetou todas as rotas com um job de revalidação pendente — não apenas /pricing. Qualquer página atingida por um evento do DynamoDB Streams nessa janela ficou silenciosamente bloqueada.
- /
- /pricing
- /features
- /blog/simuser-ai-v2-launch
- /blog/…
Sintoma → Causa Raiz
- 1
Sintoma: /pricing exibe preços desatualizados
↳ Lead reporta valores antigos; a publicação no CMS foi há 25 minutos.
- 2
Job do DynamoDB travado em retries: 3
↳ TypeError em NewImage bloqueia todos os jobs — qualquer evento DELETE derruba o handler.
- 3
Seeder ignora /pricing completamente
↳ A tag 'pricing-page' não tem nenhum path registrado na tabela de revalidação; pathCount: 0.
- 4
Causa raiz: dois bugs sobrepostos
↳ Mapeamento de tag ausente + acesso não guardado a NewImage = nenhuma revalidação chega ao Next.js.
Causa Raiz e Correção
Bug 1 — Mapeamento de tag ausente
O webhook do CMS envia a tag pricing-page, mas nenhuma entrada na tabela DynamoDB mapeia essa tag para o path /pricing. O Seeder registra um aviso e encerra sem enfileirar nenhuma invalidação.
Bug 2 — Acesso não guardado a NewImage
O RevalidationEventsSubscriber lê event.Records[i].dynamodb.NewImage sem verificação. Eventos DELETE do DynamoDB Streams omitem NewImage, causando um TypeError que coloca todos os jobs afetados em um estado irrecuperável de retries: 3 / status: pending.
// handler (/var/task/index.js:23)
const newImage = record.dynamodb.NewImage; // crashes on DELETE events
await revalidatePath(newImage.path.S);// handler (/var/task/index.js:23)
const newImage = record.dynamodb?.NewImage;
if (!newImage) return; // guard: DELETE
await revalidatePath(newImage.path.S);Adicionalmente: registre a tag pricing-page → /pricing na tabela de revalidação e audite todos os outros mapeamentos de tags do CMS para garantir que correspondam às rotas corretas do Next.js.
Resultado
Sem o CauseFlow: ~3 horas de depuração entre equipes no CloudWatch, console do DynamoDB e logs do Lambda — com o custo reputacional de preços desatualizados visíveis para leads durante um reposicionamento de preços ao vivo.
Com o CauseFlow: causa raiz identificada em 25 minutos, correção aplicada antes de mais leads acessarem a página.
Pare de caçar logs.
Comece a construir produto.
Conecte sua stack em minutos e investigue incidentes reais na sua infraestrutura. Sem contrato, sem cartão.