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
| Campo | Descrição |
|---|---|
name | Nome do respondente |
email | E-mail do respondente |
phone | Telefone do respondente |
company | Nome da empresa vinculada ao contato. String vazia se não houver |
customerId | Seu identificador externo do contato, se informado na criação |
custom_fields | Campos customizados do contato |
_business | ID 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
| Campo | Descrição |
|---|---|
responses | Array com todas as perguntas da pesquisa (veja abaixo) |
finalized | true neste evento |
finalized_at | Quando a resposta foi concluída e enviada |
last_interaction_at | Última interação do respondente |
created_at | Quando a solicitação foi criada |
sent_at | Quando a pesquisa foi enviada ao respondente |
opened_at | Quando o respondente abriu a pesquisa |
channel | Canal pelo qual a resposta chegou |
origin | Origem da resposta: nome do link/QR Code, In-App ou API |
_survey | ID da pesquisa |
surveyName | Título da pesquisa |
internalId | Seu identificador externo da resposta, se informado |
custom_fields | Campos customizados da resposta. Se vazios, caem para os do contato |
ai | Análise por IA — veja a ressalva abaixo |
_id | ID ú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:
| Campo | Descrição |
|---|---|
internal_name | Identificador da pergunta. Use este campo para mapear no seu sistema — é estável |
question | Texto da pergunta como foi exibido ao respondente |
type | Tipo da pergunta |
answer | Resposta dada. String, exceto em matriz |
matrixData | Presente 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
type | Tipo | Formato de answer |
|---|---|---|
nps | Net Promoter Score | "0" a "10" |
csat | Customer Satisfaction Score | "1" a "5" |
ces | Customer Effort Score | "1" a "7" |
likert | Escala Likert | Número conforme a escala configurada |
like | Like / Dislike | Valor booleano em texto |
text | Pergunta aberta | Texto livre |
unique | Escolha única | Texto da opção escolhida |
multiple | Múltipla escolha | Opções separadas por vírgula |
select | Lista suspensa | Texto da opção escolhida |
matrix | Matriz de opções | Objeto, 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
| Valor | Significado |
|---|---|
SMS | Envio por SMS |
E-mail | Envio por e-mail |
Link Identificado | Link com o contato já identificado — inclui o envio manual via WhatsApp |
Link/QRCode | Link público, QR Code ou totem |
In-App | Pop-up exibido dentro do seu sistema |
WhatsApp API | WhatsApp Oficial (API da Meta) |
WhatsApp Flows | Pesquisa nativa dentro do WhatsApp |
Importação | Resposta 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
Visão geral dos Webhooks
Assinatura HMAC, retentativas com backoff e desativação automática de endpoints.
Resposta não finalizada
O evento cf_response_incomplete, para quem começou a responder e parou.
Como configurar um webhook?
Passo a passo para criar e habilitar eventos no seu endpoint.