Events
Webhook event catalog.
Each event has id, type, created, organizationId, and data. Handle by type. Ignore unknown types so new events do not break your endpoint.
response.submitted
Fires when a respondent submits a survey.
{
"id": "evt_2Q8m0k1",
"type": "response.submitted",
"created": "2026-09-16T11:47:00.000Z",
"organizationId": "org_7c",
"data": {
"responseId": "res_91",
"surveyId": "survey_1N",
"stationId": "station_2K",
"locationId": "loc_4B",
"linkId": "link_8f",
"durationSeconds": 12,
"flagged": false,
"metadata": {
"callId": "c-8841",
"agentId": "agt_12",
"queue": "retention",
"client": {
"userAgent": "Mozilla/5.0 …",
"locale": "en"
}
}
}
}linkId and partner keys in metadata are present when the respondent used a Capture link. Direct /s/{surveyId} submits still fire this event; linkId is then omitted and metadata holds only client telemetry.
if (event.type === "response.submitted") {
await crm.note(event.data.responseId, event.data.metadata);
}response.flagged
Fires when quality filtering marks a speed trap or straight-lining.
{
"id": "evt_2Q8m0k2",
"type": "response.flagged",
"created": "2026-09-16T11:47:01.000Z",
"organizationId": "org_7c",
"data": {
"responseId": "res_91",
"surveyId": "survey_1N",
"reasons": ["speed_trap"]
}
}alert.triggered
Fires when a survey alert policy matches (low sentiment, NPS detractor, keyword, and so on).
{
"id": "evt_2Q8m0k3",
"type": "alert.triggered",
"created": "2026-09-16T11:47:04.000Z",
"organizationId": "org_7c",
"data": {
"policyId": "pol_3",
"surveyId": "survey_1N",
"responseId": "res_91",
"stationId": "station_2K",
"severity": "high"
}
}task.created / task.assigned / task.updated
Fires when a follow-up task is created, assigned, or updated in the organization.
{
"id": "evt_2Q8m0k4",
"type": "task.assigned",
"created": "2026-09-16T11:48:00.000Z",
"organizationId": "org_7c",
"data": {
"taskId": "task_12",
"assigneeUserId": "user_9",
"surveyId": "survey_1N",
"responseId": "res_91"
}
}loyalty.tokens_claimed
Fires when a participant verifies and claims tokens for a response.
{
"id": "evt_2Q8m0k5",
"type": "loyalty.tokens_claimed",
"created": "2026-09-16T11:50:00.000Z",
"organizationId": "org_7c",
"data": {
"participantId": "part_5",
"responseId": "res_91",
"tokens": 10
}
}loyalty.redemption.created / loyalty.redemption.fulfilled
Fires when a reward is redeemed, and again when staff mark it fulfilled (or cancelled — data.status is cancelled).
{
"id": "evt_2Q8m0k6",
"type": "loyalty.redemption.created",
"created": "2026-09-16T12:01:00.000Z",
"organizationId": "org_7c",
"data": {
"redemptionId": "red_8",
"rewardId": "rew_2",
"participantId": "part_5",
"status": "pending"
}
}menu.scanned
Fires when a public menu is opened from a QR or a direct link.
{
"id": "evt_2Q8m0k8",
"type": "menu.scanned",
"created": "2026-09-16T13:10:00.000Z",
"organizationId": "org_7c",
"data": {
"menuId": "menu_1",
"locationId": "loc_4B",
"source": "qr"
}
}report.ready
Fires when a generated report is ready to download.
{
"id": "evt_2Q8m0k9",
"type": "report.ready",
"created": "2026-09-16T13:20:00.000Z",
"organizationId": "org_7c",
"data": {
"reportId": "rep_6",
"template": "monthly_summary"
}
}