Webhookscf_response (Nova Resposta)

Nova Resposta

Nome do evento: cf_response. Notifica cada resposta de pesquisa finalizada pelo respondente, com todas as perguntas, dados do contato e metadados de envio.

O evento cf_response é enviado toda vez que um respondente finaliza uma pesquisa — quando ele conclui e envia. É o evento principal de Webhooks da Amplifique.me.

Se você também precisa saber de quem começou e não terminou, veja o cf_response_incomplete.


Quando é disparado

Uma única vez por resposta, no momento em que ela é finalizada. Vale para todos os canais (E-mail, SMS, WhatsApp, Link/QR Code, In-App) e todas as metodologias (NPS, CSAT, CES, Likert, customizadas).

Respostas importadas pelo importador de planilhas não geram este evento — apenas respostas coletadas pelos canais da plataforma.


Payload

{
  "event": {
    "event_type": "cf_response",
    "customer": {
      "name": "João da Silva",
      "email": "joao@empresa.com",
      "phone": "5511999999999",
      "company": "Empresa do Contato",
      "customerId": "ID-EXTERNO-DO-CONTATO",
      "custom_fields": {
        "cpf": "00000000000"
      },
      "_business": "ID_DA_UNIDADE"
    },
    "cf_response": {
      "responses": [
        {
          "answer": "10",
          "question": "Em uma escala de 0 a 10, qual é a probabilidade de você recomendar a Empresa para um amigo?",
          "type": "nps",
          "internal_name": "nps_1"
        },
        {
          "answer": "4",
          "question": "O quão satisfeito você está com o serviço prestado?",
          "type": "csat",
          "internal_name": "csat_2"
        },
        {
          "answer": "7",
          "question": "A empresa facilitou a resolução do meu problema?",
          "type": "ces",
          "internal_name": "ces_3"
        },
        {
          "answer": "Opção 1",
          "question": "Qual opção descreve melhor sua experiência?",
          "type": "unique",
          "internal_name": "unique_4"
        },
        {
          "answer": "Opção 1,Opção 2",
          "question": "Quais pontos foram positivos?",
          "type": "multiple",
          "internal_name": "multiple_5"
        },
        {
          "answer": "O atendimento foi excelente",
          "question": "Quer deixar um comentário?",
          "type": "text",
          "internal_name": "text_6"
        }
      ],
      "finalized": true,
      "finalized_at": "2026-08-11T17:49:07.410Z",
      "last_interaction_at": "2026-08-11T17:49:07.410Z",
      "created_at": "2026-08-11T17:48:50.035Z",
      "sent_at": "2026-08-11T17:48:50.033Z",
      "opened_at": "2026-08-11T17:48:50.667Z",
      "channel": "Link/QRCode",
      "origin": "Link1",
      "_survey": "ID_DA_PESQUISA",
      "surveyName": "NPS Agosto",
      "internalId": "ID-EXTERNO-DA-RESPOSTA",
      "custom_fields": {
        "loja": "Filial SP"
      },
      "ai": {},
      "_id": "ID_UNICO_DA_RESPOSTA"
    }
  }
}

Campos de customer

CampoDescrição
nameNome do respondente
emailE-mail do respondente
phoneTelefone do respondente
companyNome da empresa vinculada ao contato. String vazia se não houver
customerIdSeu identificador externo do contato, se informado na criação
custom_fieldsCampos customizados do contato
_businessID da unidade a que o contato pertence

Em pesquisas anônimas, os campos de identificação vêm vazios. Os dados são registrados no momento do envio — alterações posteriores no cadastro do contato não mudam o que já foi entregue.


Campos de cf_response

CampoDescrição
responsesArray com todas as perguntas da pesquisa (veja abaixo)
finalizedtrue neste evento
finalized_atQuando a resposta foi concluída e enviada
last_interaction_atÚltima interação do respondente
created_atQuando a solicitação foi criada
sent_atQuando a pesquisa foi enviada ao respondente
opened_atQuando o respondente abriu a pesquisa
channelCanal pelo qual a resposta chegou
originOrigem da resposta: nome do link/QR Code, In-App ou API
_surveyID da pesquisa
surveyNameTítulo da pesquisa
internalIdSeu identificador externo da resposta, se informado
custom_fieldsCampos customizados da resposta. Se vazios, caem para os do contato
aiAnálise por IA — veja a ressalva abaixo
_idID único da resposta. Use como chave de deduplicação

O campo ai geralmente chega vazio. O webhook é disparado assim que a resposta é finalizada, enquanto a análise por IA roda em segundo plano e leva mais alguns instantes. Como o evento não é reenviado quando a análise conclui, não dependa deste campo. Para obter sentimento, tópicos e resumo, consulte a resposta via API de Listar Respostas depois.


Estrutura de responses

Cada item do array representa uma pergunta da pesquisa:

CampoDescrição
internal_nameIdentificador da pergunta. Use este campo para mapear no seu sistema — é estável
questionTexto da pergunta como foi exibido ao respondente
typeTipo da pergunta
answerResposta dada. String, exceto em matriz
matrixDataPresente apenas em perguntas do tipo matrix, com a estrutura completa da matriz

Mapeie sempre pelo internal_name, nunca pelo texto de question nem pela posição no array. O texto da pergunta pode ser editado na plataforma e varia quando a pesquisa usa múltiplos idiomas ou variáveis de personalização.

Tipos de pergunta

typeTipoFormato de answer
npsNet Promoter Score"0" a "10"
csatCustomer Satisfaction Score"1" a "5"
cesCustomer Effort Score"1" a "7"
likertEscala LikertNúmero conforme a escala configurada
likeLike / DislikeValor booleano em texto
textPergunta abertaTexto livre
uniqueEscolha únicaTexto da opção escolhida
multipleMúltipla escolhaOpções separadas por vírgula
selectLista suspensaTexto da opção escolhida
matrixMatriz de opçõesObjeto, também disponível em matrixData

Em múltipla escolha, as opções vêm concatenadas numa única string separada por vírgula ("Opção 1,Opção 2"), não como array. Se o texto de alguma opção contiver vírgula, o split simples produz resultado incorreto — evite vírgulas nos rótulos das opções.

Respostas por áudio

Quando o respondente grava um áudio numa pergunta aberta, o campo answer traz a transcrição automática em texto, como qualquer resposta escrita. O arquivo de áudio em si não vai no payload — ele fica disponível na resposta dentro da plataforma.


Valores de channel

ValorSignificado
SMSEnvio por SMS
E-mailEnvio por e-mail
Link IdentificadoLink com o contato já identificado — inclui o envio manual via WhatsApp
Link/QRCodeLink público, QR Code ou totem
In-AppPop-up exibido dentro do seu sistema
WhatsApp APIWhatsApp Oficial (API da Meta)
WhatsApp FlowsPesquisa nativa dentro do WhatsApp
ImportaçãoResposta trazida pelo importador de planilhas

O valor Importação não aparece em fluxo normal, já que respostas importadas não disparam webhook. Ele só surge se um evento for reenviado manualmente para uma resposta que veio de importação.

Trate channel de forma tolerante. Os rótulos acompanham a nomenclatura da plataforma e podem ser ajustados quando um canal é renomeado, além de novos canais surgirem com o tempo. Se a sua integração precisa de estabilidade absoluta, prefira derivar a lógica de origin ou dos seus próprios campos customizados, e nunca use channel num switch sem caso padrão.


Boas práticas


Próximos passos

Como configurar um webhook?

Passo a passo para criar e habilitar eventos no seu endpoint.