Cotação não salva: "Lifecycle hook 'postContextCommit' failed" e o getTags() nulo
Um erro interno do serviço de contexto, em inglês, no meio de uma mensagem em português. No meu caso, a causa não estava no procedimento nem na definição de contexto: era a própria cotação, travada numa gravação que tinha falhado antes.

Ao salvar linhas no editor da cotação, a org devolve um ContextBuilderException com getTags() nulo. Como isolei o problema em quatro chamadas de API, por que a cotação ficou travada em Saving, a pista falsa das tags extras e o que fazer.
postContextCommit e o getTags() nulo
- Cotação não salva · Erros e soluções no ARM · 9
- Uma variável por vez · Diagnóstico: Cotação antiga, com preço: erro; Cotação antiga, sem preço: erro; Cotação nova, sem preço: salvou; Cotação nova, com preço: salvou
- A cotação travada · CalculationStatus = Saving
- O que fazer · Solução: Consultar CalculationStatus; Conferir as tags do nó SalesTransaction; Testar numa cotação nova; Recriar a cotação
- A cotação nova salva · Mesma configuração
- Configuração primeiro, cotação de teste depois: Cotação de teste é descartável; Gravação falhou no ajuste? Crie outra
Você abre a cotação, adiciona a licença pela janela do catálogo, clica em Salvar cotação e a org responde com um erro interno do serviço de contexto, em inglês, no meio de uma frase em português.
A mensagem
Sua cotação não foi atualizada. industries.context.api.service.exception.ContextBuilderException: Lifecycle hook 'postContextCommit' failed in strict mode: Cannot invoke "industries.context.api.service.model.runtime.schema.impl.defaultimpl.DefaultContextRuntimeEntityAttribute.getTags()" because the return value of "java.util.Map.get(Object)" is null
Pela API Place Sales Transaction, que é o que o editor usa por baixo, a resposta vem assim:
{
"errorResponse": [
{
"errorCode": "INVALID_API_INPUT",
"message": "...ContextBuilderException: Lifecycle hook 'postContextCommit' failed in strict mode: Cannot invoke ...getTags() because the return value of java.util.Map.get(Object) is null",
"referenceId": "refQuote"
}
],
"isSuccess": false
}Onde aparece
Ao salvar linhas de cotação no Transaction Line Editor e ao adicionar linhas pela API /connect/rev/sales-transaction/actions/place. No meu caso, sempre na mesma cotação, a da Metalúrgica Boa Vista no caso Órbita.
Como isolei a causa
Em vez de mexer na configuração a cada tentativa, fiz quatro chamadas à API, mudando uma variável por vez:
| Chamada | Resultado |
|---|---|
| Cotação antiga, nova linha, com precificação | Erro |
Cotação antiga, nova linha, sem precificação (pricingPref: Skip) | Erro. O procedimento de precificação está fora da história |
| Cotação nova, mesma linha, sem precificação | Salvou, status CompletedWithoutPricing |
| Cotação nova, mesma linha, com precificação | Salvou: 30 licenças a R$ 162 líquido, R$ 4.860, status CompletedWithPricing |
A configuração estava certa. O problema era a cotação. Uma consulta ao campo de status de cálculo mostrou o motivo:
SELECT Name, CalculationStatus FROM Quote
Órbita CRM, Metalúrgica Boa Vista Saving Diagnóstico API, Órbita CompletedWithoutPricing Diagnóstico API com preço, Órbita CompletedWithPricing
A cotação antiga estava parada em Saving. A tela confirma: uma faixa avisa que a solicitação está sendo processada, os botões ficam desabilitados e sobra uma linha fantasma no editor.

Por que acontece
O guia de desenvolvedor descreve o comportamento da API: ela grava e confirma primeiro o cabeçalho da cotação e só depois processa configuração, preço e linhas. Se um passo posterior falha, o cabeçalho não volta atrás.
Nessa cotação, uma gravação falhou enquanto eu ainda ajustava o procedimento de precificação e a definição de contexto. O status de cálculo ficou em Saving e, daí em diante, toda gravação nela falhou no mesmo ponto, o commit do contexto. Não consigo afirmar qual ajuste causou a primeira falha: nesse intervalo mudei a data de vigência do contexto, as saídas do procedimento e o procedimento padrão. O que dá para afirmar é o que os testes mostram: com a configuração atual, cotação nova salva e a antiga não.
A pista falsa
Existe um artigo de conhecimento da Salesforce com uma mensagem parecida, sobre o retorno nulo de Map.get ao calcular a cotação. A causa ali é uma tag extra no nó SalesTransaction da definição de contexto, e a solução é removê-la. Vale conferir primeiro, porque é rápido: na guia de tags da definição, o nó SalesTransaction só pode ter a tag SalesTransaction. Na org do guia estava certo, e o erro continuava.
Como resolver
- Confira o status de cálculo. Rode
SELECT Id, Name, CalculationStatus FROM Quote. Uma cotação parada em Saving, sem processamento em andamento, está travada. - Descarte a pista das tags extras. Abra a definição de contexto e confira as tags do nó SalesTransaction.
- Teste numa cotação nova. Pela tela ou pela API, com a mesma linha. Se salvar, a configuração está certa.
- Recrie a cotação. Eu renomeei a antiga para identificar e segui com uma nova.
Na cotação nova, o mesmo caminho pela tela funcionou: 60 licenças pelo catálogo, preço calculado pelo procedimento da Órbita e cotação salva.

Como evitar
Termine a configuração antes de criar a cotação de teste: procedimento ativo, simulação conferida, procedimento escolhido nas Configurações de receita e na descoberta de produtos. Enquanto você ajusta contexto e procedimento, cotação de teste é descartável. Se uma gravação falhar no meio do ajuste, não insista nela: crie outra.
A precificação usada nesse teste é a do laboratório de desconto por volume, e a definição de contexto estendida é a do laboratório 5 do guia Agentforce Revenue Management.
Fontes
- Salesforce Developers, Revenue Management Developer Guide, Winter '27, recurso Place Sales Transaction (POST).
- Salesforce Help, Remove Extra Context Tags to fix Quote Calculation Error.
Reproduzido numa scratch org Winter '27, API 68.0, em português.
A resposta sai do que está publicado aqui. Se não estiver, ele diz que não sabe em vez de inventar.