Como funciona o MULTICASE

Ferramenta que permite disponibilizar ao cliente diferentes tipos de informações — como produtos, contratos ou comunicados — a partir dos textos definidos nos scripts


Antes de tudo:

Imagine uma linha principal de conversa (o script jornada). Em certos momentos, em vez de seguir só essa linha, você pode abrir outros roteiros — por exemplo, um texto só para quem escolheu “cartão” e outro só para “empréstimo”. O Multi Case existe para isso: um convite pode carregar a jornada e vários roteiros auxiliares (casos), e o sistema decide qual trecho faz sentido naquele atendimento.

  • O que o usuário final percebe: uma conversa guiada; em alguns pontos o conteúdo pode mudar conforme dados da proposta ou do cliente.
  • O que a empresa configura uma vez (no script): mensagens, transições entre mensagens e, onde precisar, caminhos alternativos (alternativePaths) com ou sem condições.
  • O que muda a cada convite: quais roteiros entram naquele link (script.cases), valores de variáveis (fields) e dados do cliente — é isso que personaliza a experiência sem reescrever o roteiro inteiro.

Analogia: a jornada é a trilha principal; os casos são blocos de conteúdo que só entram quando o convite e as regras permitem.


Mini-glossário

TermoSignificado
Script jornadaRoteiro principal por onde a experiência começa. Um script vira jornada quando ao menos uma transição tem alternativePaths.
Script de caso (ou filho)Outro roteiro (produto, proposta, comunicado) ligado ao convite e acionado nas transições. É um script sem alternativePaths.
Convite (invite)Registro criado pela API que gera o link da experiência e carrega jornada + casos + dados.
Campo / variávelPar chave-valor usado nas mensagens como {{label}} (ex.: {{nome}}, {{product}}).
alternativePathsConfiguração na transição entre duas mensagens: permite desviar para mensagens de outros scripts definidos no convite.
conditionsRegras (caminho, operador, valor) que decidem para qual script seguir, quando há condições.
scriptReferenceIdentificador do script (UUID ou reference cadastrada). Aparece nas condições do script e nos itens do convite.
identifierRótulo de cada caso dentro do convite (ex.: Proposta 4547). Use um valor único por caso. Não é usado nas condições: elas usam scriptReference.

O que é Multi Case (conceito)

O Multi Case permite que a partir de uma mensagem da jornada o sistema redirecione o fluxo para mensagens de outros scripts. Isso se liga em dois lugares:

  1. Na criação do script: em uma message transition, o campo alternativePaths indica que, saindo da mensagem pai (parentId), o fluxo pode entrar em outros roteiros antes de seguir para a mensagem destino (messageId), conforme as regras. Ao terminar um caso, o fluxo volta para essa mesma transição e, quando não há mais casos a abrir, segue para a mensagem destino.
  2. Na criação do convite multicase: você informa a jornada (script.journey) e a lista de casos (script.cases) — cada item aponta para um scriptReference e traz fields usados nas condições e nos textos.

Sem o convite multicase, os “outros scripts” não estão disponíveis naquela sessão da forma descrita aqui.


Como Script e Convite se encaixam

OndeO que você define
Script (API de criação de script)Mensagens, transições, alternativePaths com ou sem conditions.
Convite multicase (API de invite)script.journey (qual jornada + fields da jornada), script.cases (lista ordenada: cada caso com scriptReference, identifier, fields), customer, datas, etc.

Lembrete: o roteiro diz em que ponto pode haver desvio; o convite diz quais roteiros e quais valores entram naquela sessão.

Ordem de criação: crie primeiro os scripts de caso e depois a jornada. Ao criar a jornada, cada scriptReference usado nas condições precisa apontar para um script de caso já existente, habilitado e diferente da própria jornada.

Nomes nos scripts vs nomes no JSON do convite (importante)

Nas condições do script, o campo path usa textos fixos do tipo invite.scripts.fields... e invite.customer.fields.... No JSON real do convite, os valores vêm de outras chaves. Use a tabela abaixo para não misturar.

path na condição (exemplo)De onde vem o valor no convite
invite.scripts.fields.productscript.cases[].fields do próprio caso avaliado, com label = product. Os fields da jornada (script.journey.fields) não entram nas condições.
invite.customer.fields.agecustomer.fields com label = age.
invite.customer.affirmative_answerResposta do cliente que causou uma interrupção (afirmativa ou não). Veja Resposta afirmativa após interrupção.

Erro comum: copiar o texto invite.scripts.fields para o JSON do convite. No payload, use script.journey e script.cases como na documentação da API.


Fluxo do usuário (visão geral)

O que este desenho mostra: o cliente entra pela jornada; num ponto com alternativePaths, o sistema avalia regras e/ou percorre os casos do convite; depois a linha continua na jornada (próxima mensagem).

Na transição, quando há condições, o sistema compara path, operator e value com os dados do convite. Quando não há lista de conditions, o comportamento é outro (veja a próxima seção).


Convite multicase: o que enviar e o que pode dar erro

Endpoint (referência): criação de convite multicase na API pública da NuVidio (veja Criar invite multicase). Base de exemplo: https://apigw.nuvidio.com/video-agreement.

Lembrete: no schema público, expiresAt é obrigatório no corpo da criação; customer costuma exigir cpf e fields (com label e value em cada item). Confira a referência OpenAPI para o contrato exato.

Jornada e casos

  • O script informado em script.journey precisa ser uma jornada com customerJourneyType agreement.
  • Cada item de script.cases precisa ser um script de caso, habilitado e diferente da jornada.

Datas

Use ISO 8601 com milissegundos, no formato:

YYYY-MM-DDTHH:mm:ss.SSS

Exemplo de parte da data: 2025-03-29 (ano-mês-dia), depois T, depois hora 17:21:00.000.

Campos script.journey.fields (jornada)

  • Toda variável usada nas mensagens da jornada precisa ter valor coberto aqui (labels/values correspondentes). Se faltar, a criação do convite falha.
  • CPF nas mensagens: recomenda-se formato legível para leitura por IA, por exemplo 111.222.333-44.

Campos script.cases[].fields (cada caso)

  • Se uma variável aparece no texto do caso e não veio em script.cases[].fields, o sistema usa o valor de script.journey.fields.
  • Se ainda assim não houver valor, a criação do convite falha.
  • Esse aproveitamento vale só para os textos. Condições com invite.scripts.fields.{nome} olham apenas os fields do próprio caso.

Resposta de sucesso (resumo)

Em caso de sucesso (201), você recebe dados como inviteId, inviteUrl, janelas availableAt / expiresAt e outras URLs úteis ao fluxo. O detalhe completo dos campos está na referência OpenAPI oficial.


Condicionais: com e sem conditions

As condições só se aplicam ao modelo em que customerJourneyType do script é agreement.

Modo multicase

Informar alternativePaths na transição ativa o script em modo multicase naquele ponto: a partir da mensagem pai, o fluxo pode ir para mensagens de outros scripts que você associou ao convite multicase.

Sem lista de conditions

Se existir alternativePaths mas não houver condições configuradas, o fluxo percorre todos os casos informados em script.cases, um de cada vez, na ordem em que aparecem no convite. Depois do último caso, segue para a mensagem destino da transição.

Com lista de conditions

Cada item costuma ter:

  • path: onde buscar o valor (veja tabela de paths na próxima subseção).
  • operator: como comparar (veja tabela de operadores).
  • value: valor esperado na comparação (quando o operador exige).
  • scriptReference: para qual roteiro ir se a condição for atendida. Se você omitir scriptReference, o fluxo segue para todos os casos do convite que atendem à condição.

As condições são avaliadas na ordem em que aparecem em conditions. Cada condição abre os casos que ela seleciona, um de cada vez; quando eles terminam, o fluxo volta para a transição e passa para a próxima condição. Cada condição é avaliada uma única vez por atendimento. Depois da última, o fluxo segue para a mensagem destino da transição.

Paths permitidos em path

pathUso
invite.scripts.fields.{nome}Valores enviados nos fields de cada caso no convite (script.cases[].fields), por exemplo product.
invite.customer.fields.{nome}Campos do cliente no convite, por exemplo age.
invite.customer.affirmative_answerResposta afirmativa ou não após interrupção; veja Resposta afirmativa após interrupção.

Operadores (referência rápida)

OperadorIdeia
equal / not_equalIgual ou diferente ao valor.
greater / less / greater_or_equal / less_or_equalComparações. Funcionam como número quando o value é numérico (ex.: idade) e como data quando o value é uma data.
inValor está em uma lista. Envie a lista em uma única string, separada por vírgula (ex.: "São Paulo,Rio de Janeiro").
not_inValor não pode estar na lista (mesmo formato do in).
likeCorrespondência por padrão, usando % como curinga (ex.: %vidio casa com “Nuvidio”). Diferencia maiúsculas de minúsculas.
not_likeExclui valores que casam com o padrão, no mesmo formato do like.
is_null / is_not_nullValor ausente ou presente; não envie value nesses casos.

Para o path invite.customer.affirmative_answer, o único operador aceito é equal, com value "true" ou "false".


Exemplo mínimo: condição em campo de script (product)

Propósito: no roteiro, ao ir da mensagem A para a B, se o campo de script product for “emprestimo”, desviar para o roteiro referenciado.

Trecho da criação do script (transição):

{
  "parentId": "mensagem_a",
  "messageId": "mensagem_b",
  "alternativePaths": {
    "conditions": [
      {
        "path": "invite.scripts.fields.product",
        "operator": "equal",
        "value": "emprestimo",
        "scriptReference": "script_emprestimo"
      }
    ]
  }
}

Propósito do convite: enviar product nos fields do caso correspondente em script.cases, de forma consistente com o que as condições esperam:

"cases": [
  {
    "identifier": "Proposta 4547",
    "scriptReference": "script_emprestimo",
    "fields": [
      { "label": "product", "value": "emprestimo" }
    ]
  }
]

Exemplo mínimo: condição em campo do cliente (age)

Propósito: desviar para um roteiro se a idade do cliente for maior que 30.

Trecho da criação do script:

{
  "parentId": "mensagem_a",
  "messageId": "mensagem_b",
  "alternativePaths": {
    "conditions": [
      {
        "path": "invite.customer.fields.age",
        "operator": "greater",
        "value": "30",
        "scriptReference": "script_maior_30"
      }
    ]
  }
}

Propósito do convite: incluir em customer.fields um item com label age e o value desejado (ex.: "35").


Gatilho de interrupção

Em uma frase

Em uma jornada multicase, quando o cliente está dentro de um caso e dá uma resposta de voz ou texto diferente da esperada, o caso é encerrado e o fluxo volta para a transição da jornada que o abriu. A partir daí, segue para um caso selecionado por invite.customer.affirmative_answer ou para a próxima mensagem da jornada.

Onde isso aparece na API

Endpoint de recuperação de script do cliente (veja Links oficiais).

  • Convites multicase: a interrupção atua sempre nas mensagens dos casos, independente do campo interruptionTrigger, que é ignorado em multicase. Nas mensagens da jornada principal, a interrupção não se aplica.
  • Convites single case (o script do convite é um caso, não uma jornada): a interrupção só atua se o script tiver sido criado com interruptionTrigger: true. Nesse caso, o cliente é levado direto à mensagem final do script.

Quem decide se a resposta "bate" com o esperado

Nossa I.A compara o que o cliente disse com a lista expectedResponses da mensagem. Se não bater, o cliente envia isExpectedAnswer: false no payload da requisição de recuperação de script.

Lembrete: se isExpectedAnswer não vier (ausente), o sistema não trata a resposta como interrupção e o fluxo segue o padrão.

Cenários

SituaçãoO que acontece
Multicase: resposta inesperada numa mensagem da jornada principalInterrupção não se aplica; fluxo normal.
Multicase: resposta inesperada numa mensagem de um casoInterrupção dispara: as mensagens restantes do caso são puladas e o fluxo volta para a transição da jornada que abriu o caso.
Multicase: resposta inesperada na última mensagem de um casoNão interrompe, pois não há mensagens para pular; o caso termina normalmente.
Single case com interruptionTrigger: trueInterrupção dispara e leva à mensagem final do script, exceto quando a mensagem respondida já é a final ou a penúltima.
Single case sem interruptionTriggerNão interrompe; fluxo normal.
Resposta esperada (isExpectedAnswer: true)Transições normais; próximo nó.
isExpectedAnswer ausenteNão interrompe por esse mecanismo.

Resposta afirmativa após interrupção

Em uma frase

Quando um caso é interrompido, o fluxo volta para a transição da jornada que abriu esse caso e avalia as condições com o path invite.customer.affirmative_answer. Assim você direciona o cliente para outro caso conforme a resposta que causou a interrupção tenha sido afirmativa ou não. Os valores aceitos são "true" ou "false", em string, e o único operador permitido é equal.

Quem valida se a fala do cliente foi afirmativa é a nossa I.A. A informação é enviada no campo isAffirmativeAnswer, na mesma requisição que traz isExpectedAnswer: false.

Regras para funcionar

  1. A condição affirmative_answer deve ficar na mesma transição da jornada que abre o caso da pergunta. Em uma transição posterior ela não é avaliada.
  2. A condição que abre o caso da pergunta deve vir antes da condição affirmative_answer. Fora de uma interrupção, a condição affirmative_answer é ignorada e marcada como já avaliada. Se estiver primeiro, ela é descartada antes de a pergunta ser feita.
  3. A pergunta não pode ser a última mensagem do caso. Sem mensagens depois dela, não há interrupção e a condição não é avaliada.
  4. Em expectedResponses, mantenha apenas as respostas afirmativas (ex.: ["Sim"]).
  5. O scriptReference da condição é a reference (ou o UUID) do script do caso. O identifier usado no convite não serve aqui.

Com resposta afirmativa (esperada), não há interrupção e a condição affirmative_answer não é avaliada. O fluxo segue para a próxima mensagem da jornada.

Exemplo mínimo na transição (condição)

Propósito: abrir o caso da pergunta e, se o cliente responder de forma negativa, seguir para o roteiro script_emprestimo.

"alternativePaths": {
  "conditions": [
    {
      "path": "invite.customer.fields.destino",
      "operator": "equal",
      "value": "pergunta",
      "scriptReference": "script_pergunta"
    },
    {
      "path": "invite.customer.affirmative_answer",
      "operator": "equal",
      "value": "false",
      "scriptReference": "script_emprestimo"
    }
  ]
}

O convite multicase deve listar os casos (script.cases) com os scriptReference e fields coerentes com os roteiros que podem entrar após essa decisão. Neste exemplo, script_pergunta e script_emprestimo, além de customer.fields com label destino e value pergunta.


Links oficiais


Links oficiais