Skip to main content

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.

5 min de leituraAltaPreços desatualizados visíveis para leadsResolvido pelo CauseFlow em 3 min

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.

11h20 UTC — publicação no CMS11h45 UTC — primeiro relato

Quadro de Evidências

DynamoDB · Job de Revalidação
tag: "revalidate"
path: "/pricing"
status: "pending"
retries: 3
error: "TypeError: Cannot read properties
of 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"
DynamoDB · Entradas em Cache (71 registros)
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.
CloudWatch · Seeder Lambda
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"}
Rotas Afetadas
  • /
  • /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.

CMSContentfulWebhookHTTP POSTSeederLambdaDynamoDBTableSubscriberLambdaNext.jsBug 1: Missing tag mapping"pricing-page" → no paths registeredSeeder skips — pathCount: 0Bug 2: TypeError at handler:23record.dynamodb.NewImage undefinedon DELETE events → retries: 3 → stuckworking pathblocked pathfailure point (hover for details)

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. 1

    Sintoma: /pricing exibe preços desatualizados

    Lead reporta valores antigos; a publicação no CMS foi há 25 minutos.

  2. 2

    Job do DynamoDB travado em retries: 3

    TypeError em NewImage bloqueia todos os jobs — qualquer evento DELETE derruba o handler.

  3. 3

    Seeder ignora /pricing completamente

    A tag 'pricing-page' não tem nenhum path registrado na tabela de revalidação; pathCount: 0.

  4. 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.

Antes — handler falha em eventos DELETEjavascript
// handler (/var/task/index.js:23)
const newImage = record.dynamodb.NewImage; // crashes on DELETE events
await revalidatePath(newImage.path.S);
Depois — handler com guardajavascript
// 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.