Skip to main content
Add a webhook under Project settings → Integrations → Webhooks and pick the survey events you need. Responses no longer create tickets, so survey integrations use these events instead of ticket.created.

Events

A response sends survey.response.partial at most once. If the person comes back and finishes, survey.response.completed follows.

Payload

Answers are keyed by each question’s answer key, so payloads stay stable when you reword or reorder questions.
  • survey.id is the survey’s SDK id — the value you pass to Gleap.showSurvey.
  • contact is null for anonymous respondents.
  • Answer values: numbers for scales and number, the choice id for single, an array of choice ids for multi, true / false for yesno, strings for text inputs and YYYY-MM-DD for dates. “Other” answers are { "other": "…" }. See Survey definition.
  • survey.response.answered carries the response as it is at that moment (status: "in_progress"), including all answers so far.

Migrating from ticket webhooks

Before Surveys 2.0, every survey response created a ticket of type Survey, and integrations listened to ticket.created filtered to surveys.
Legacy compatibility until January 5, 2027. Webhooks on ticket.created that received survey tickets before — filtered to the Survey type, or without a type filter — keep receiving a ticket-shaped payload for every completed response: formData keyed by the old question names (migrated surveys) or answer keys with choices as their label text, session with the same contact fields as before, and surveyResponse with the response id. Move those integrations to survey.response.completed before then.
The ticket-type filter of a webhook only narrows ticket and message events, so a webhook filtered to Survey also receives the survey.response.* events you add to it. To act on responses inside Gleap — email the respondent, open a ticket, notify a teammate — use a survey automation. Mapping from the old payload: