Skip to main content

Support – Every complaint gets handled automatically: turn unhappy survey responses into tickets

Ask for feedback after every purchase and turn each unhappy Survio response into a ticket in Freshdesk or Intercom with the order number, so your support team can follow up. Guide with n8n and ready-made workflows.

Written by Success Team Survio

Which case is for you?

Case A – for a small e-shop with a simple helpdesk: every complaint becomes a ticket in Freshdesk.

Case B – for support teams in Intercom: every complaint becomes an internal ticket in Intercom.

Send a short survey after every purchase, and let every unhappy answer open a ticket for your support team on its own, with the order number and the customer's e-mail already filled in. Nobody has to read through responses to find the complaints.
​

This is the ticket your team gets in Freshdesk in Case A:
​

Unhappy customer ticket in Freshdesk with the rating, comment and order


​

And this is the internal ticket your team gets in Intercom in Case B:
​

Back-office ticket Survey feedback in Intercom with the rating, comment and order

How this works. Your order confirmation e-mail links to a Survio survey with the order number and the customer's e-mail in the link. Survio sends each completed response to a webhook URL. An automation tool (we use n8n in this guide) checks whether the customer is unhappy and, if so, creates a ticket in your helpdesk.

New to webhooks in Survio? Start with Webhooks: send responses to your other tools in real time, then come back here.
​

What you'll build

In both cases, an unhappy response means a rating of 1 or 2 out of 5, or the answer Rather dissatisfied or Dissatisfied.

At a glance

Case A: Freshdesk

Case B: Intercom

Result

A new ticket in Freshdesk

An internal back-office ticket in Intercom

Tools

Survio, n8n, Freshdesk

Survio, n8n, Intercom

Best for

A small e-shop with a simple helpdesk

A support team that already works in Intercom

Before you start

  • A Survio survey on a paid plan. Webhooks and URL parameters aren't available on the Free plan, and each plan allows a set number of webhooks per survey (see the webhooks article).

  • An n8n account, n8n Cloud or self-hosted.

  • Your helpdesk: for Case A, a Freshdesk account; for Case B, an Intercom workspace where you can manage ticket types and create an app in the Developer Hub.

In this guide we use a short customer satisfaction survey: a star rating, an "Overall, how satisfied are you?" choice question, a "How did you shop with us this time?" choice question and an open comment.
​

Step 1 — Put the order and the e-mail into the survey link

  1. Open your survey, go to Get responses → URL parameters and create two parameters: email and order-id. Parameter names can't contain underscores. See URL parameters.

  2. Add the survey link to your order confirmation e-mail and let your e-shop fill in both values for each customer.

URL parameters email and order-id in Survio
Survey link with the email and order-id parameters

The ticket needs the customer's e-mail. A helpdesk ticket always belongs to a customer, and the workflow takes the e-mail from the email parameter. Responses that arrive without it can't become tickets.

Step 2 — Create the webhook in n8n

  1. In n8n, create a new workflow and add a Webhook node as the trigger.

  2. Set HTTP Method to POST.

  3. Switch to the Production URL tab and copy the address.

  4. Click Publish. The production URL only accepts deliveries once the workflow is published.

n8n Webhook node with HTTP Method POST and the Production URL tab
Published button in the n8n editor

Use the Production URL, not the Test URL. The Test URL only listens while the editor is waiting for a test event, so Survio's deliveries fail as soon as you close it. Survio retries a failed delivery for about a day, and after 5 days of failures it switches the webhook off.

Step 3 — Connect the survey in Survio

  1. Open your survey and go to Get responses.

  2. In the left sidebar under Automations & Integrations, select Webhooks and click + Add a webhook.

  3. Paste the n8n Production URL into Webhook URL and click Save webhook. The webhook is switched on straight away.

Add a webhook dialog in Survio with the n8n Production URL filled in
Saved webhook in Survio, switched on


​

Step 4 — Send a test response and find your question ids

  1. Open your survey through a link with both parameters filled in and submit one complete response with a low rating.

  2. In n8n, open the Executions tab. The delivery arrives within a few seconds.

  3. Open the execution and click the Webhook node. Expand body, then data. The order and the e-mail are in parameters; under answers, write down the id of each question.

Executions tab in n8n with successful runs
Webhook node output in n8n: body, data, answers


​

Case A — Open a ticket in Freshdesk

Prepare Freshdesk

In Freshdesk, click your profile picture in the top right corner, choose Profile Settings and click View API key. Treat the key like a password. You'll also need your Freshdesk domain: the part of your helpdesk address before .freshdesk.com.
​

Build the workflow

Three steps follow the webhook: Unhappy? lets only unhappy responses through, Prepare ticket writes the subject and description, and Create ticket in Freshdesk opens the ticket.

  1. Add an If node, rename it to Unhappy?, and add three conditions combined with OR: the rating is less than or equal to 2, the satisfaction answer is equal to Rather dissatisfied, or it's equal to Dissatisfied. Pick the answers by question id, as in the table below.

  2. On the true output, add an Edit Fields (Set) node named Prepare ticket with three String fields: E-mail, Title and Description.

  3. After it, add a Freshdesk node named Create ticket in Freshdesk and choose the resource Ticket and the operation Create. Create a Freshdesk credential with your API key, and enter only your domain, for example yourshop for https://yourshop.freshdesk.com.

Where

What to enter

Unhappy?: rating

{{ $json.body.data.answers.find(a => a.question.id === 90403153)?.answer ?? 99 }}, Number: is less than or equal to 2

Unhappy?: satisfaction

{{ $json.body.data.answers.find(a => a.question.id === 90403151)?.answer?.labels?.[0] ?? "" }}, String: is equal to Rather dissatisfied (and a second condition for Dissatisfied)

Prepare ticket: E-mail

{{ $json.body.data.parameters?.email || "" }}

Prepare ticket: Title

Unhappy customer: {{ $json.body.data.answers.find(a => a.question.id === 90403153)?.answer }}/5, order {{ $json.body.data.parameters?.['order-id'] }}

Prepare ticket: Description

The rating, satisfaction, channel, comment, order and time, separated by <br> so that each one is on its own line in Freshdesk (see the ready-made workflow)

Create ticket: requester

Requester Identification: Email, and in Value: {{ $json['E-mail'] }}

Create ticket: status and priority

Status: Open, Priority: High, Source: keep Portal

Create ticket: options

Under Options, click Add option and add Description {{ $json.Description }}, Subject {{ $json.Title }} and Tags survio,unhappy-response

Freshdesk node Create ticket in Freshdesk with the requester e-mail, status, priority, subject, description and tags

If the e-mail doesn't belong to any contact in Freshdesk yet, Freshdesk creates the contact. Click Publish again; changes you make after publishing go live only when you publish again.

Freshdesk e-mails the customer about the new ticket. By default, Freshdesk sends the requester a "Ticket Received" e-mail with the ticket subject in it, so the customer would see "Unhappy customer: …". Either turn off New Ticket Created under Admin → Email Notifications → Requester Notifications, or change the Title in Prepare ticket to something you're happy for the customer to read.

n8n workflow: Survio Webhook, Unhappy?, Prepare ticket, Create ticket in Freshdesk


​

Case B — Open a ticket in Intercom

Prepare Intercom

  1. In Intercom, go to Settings → Inbox → Tickets and create a new ticket type, for example Survey feedback, in the Back-office category. Back-office tickets are internal: the customer doesn't see them. See Intercom's guide How to set up ticket types.

  2. Find the ticket type's id: in Settings → Inbox → Tickets, open the Ticket types tab, find your type under Back-office ticket types and click the pencil icon. The id is the number at the end of the page address, for example …/ticket-types/1234567. You'll paste it into the workflow.

  3. Create an access token: in the Intercom Developer Hub, open your app and go to Configure → Authentication. See Intercom's authentication guide. Treat the token like a password.

Survey feedback ticket type in Intercom settings

Build the workflow

Three steps follow the webhook: Unhappy? lets only unhappy responses through, Prepare ticket writes the title and description, and Create ticket in Intercom sends them to Intercom.

  1. Add an If node, rename it to Unhappy?, and add three conditions combined with OR: the rating is less than or equal to 2, the satisfaction answer is equal to Rather dissatisfied, or it's equal to Dissatisfied. Pick the answers by question id, as in the table below.

  2. On the true output, add an Edit Fields (Set) node named Prepare ticket with three String fields: E-mail, Title and Description.

  3. After it, add an HTTP Request node named Create ticket in Intercom.

Where

What to enter

Unhappy?: rating

{{ $json.body.data.answers.find(a => a.question.id === 90403153)?.answer ?? 99 }}, Number: is less than or equal to 2

Unhappy?: satisfaction

{{ $json.body.data.answers.find(a => a.question.id === 90403151)?.answer?.labels?.[0] ?? "" }}, String: is equal to Rather dissatisfied (and a second condition for Dissatisfied)

Prepare ticket: E-mail

{{ $json.body.data.parameters?.email || "" }}

Prepare ticket: Title

Unhappy customer: {{ $json.body.data.answers.find(a => a.question.id === 90403153)?.answer }}/5, order {{ $json.body.data.parameters?.['order-id'] }}

Prepare ticket: Description

The rating, satisfaction, channel, comment, order and time, one per line (see the ready-made workflow)

Create ticket: Method and URL

POST, https://api.intercom.io/tickets

Create ticket: Authentication

Authentication: Generic Credential Type, Generic Auth Type: Bearer Auth, then create a Bearer Auth credential with your Intercom access token

Create ticket: Header

Send Headers on, Intercom-Version with the value 2.11

Create ticket: Body

Send Body on, Body Content Type: JSON, Specify Body: Using JSON, and in JSON: {{ JSON.stringify({ ticket_type_id: 'YOUR-TICKET-TYPE-ID', contacts: [{ email: $json['E-mail'] }], ticket_attributes: { _default_title_: $json.Title, _default_description_: $json.Description } }) }}

If node Unhappy? with three conditions combined with OR
Prepare ticket node with the E-mail, Title and Description fields
HTTP Request node Create ticket in Intercom: POST, URL, Bearer Auth and the Intercom-Version header
HTTP Request node body: JSON with the ticket type, contact, title and description

If the e-mail doesn't belong to anyone in Intercom yet, Intercom creates the contact. Click Publish again; changes you make after publishing go live only when you publish again.

n8n workflow: Survio Webhook, Unhappy?, Prepare ticket, Create ticket in Intercom


​

Get the ready-made workflow

Instead of building Step 2 and your case by hand, start from our workflow. Download the file for your case from the attachments at the end of this article: survio-unhappy-responses-to-freshdesk-tickets.json for Case A, or survio-unhappy-responses-to-intercom-tickets.json for Case B. Then:

  1. In n8n, create an empty workflow. Open the menu (three dots) next to the workflow name and choose Import, then From file. Pick the file you downloaded.

  2. Open Unhappy? and Prepare ticket and replace the question ids with your own and Europe/Prague with your time zone.

  3. Case A: open Create ticket in Freshdesk and connect your Freshdesk account with your API key and domain.

  4. Case B: open Create ticket in Intercom, add your access token as a Bearer Auth credential and put your ticket type's id in place of YOUR-TICKET-TYPE-ID.

  5. Open Survio Webhook, copy the Production URL into Survio (Step 3) and click Publish.

n8n workflow menu with Import and From file

Test it end to end

  1. Open the survey through a link with your own e-mail and a test order number, and submit a rating of 2.

  2. Within seconds, a new ticket appears in Freshdesk (Case A) or a new back-office ticket in Intercom (Case B), with the order number in the subject.

  3. Submit a rating of 5. No ticket is created.

  4. Close the test ticket, and look at the Executions tab in n8n for both deliveries.

Troubleshooting

Symptom

Cause

Fix

Nothing arrives in n8n

The Test URL is in Survio, or the workflow isn't published

Copy the Production URL into Survio and click Publish

The Freshdesk credential doesn't connect

The domain is entered as the whole address, or the API key is wrong

Enter only the part before .freshdesk.com and copy the API key again from Profile Settings

The Freshdesk ticket shows the whole response on one line

The Description uses plain line breaks

Separate the lines with <br>

Create ticket in Intercom fails with 401

The access token is wrong or missing

Check the Bearer Auth credential in Create ticket in Intercom

Create ticket fails because of the ticket type

YOUR-TICKET-TYPE-ID wasn't replaced, or the id is wrong

Put your ticket type's id into the body

Create ticket fails because of the requester or contact

The response had no email parameter

Make sure your order e-mail fills in the parameter

Every response creates a ticket

Prepare ticket is on the false output, or the conditions are combined with AND

Connect it to the true output and combine the conditions with OR

Your latest change has no effect

The workflow is published, but the change isn't (the Publish button shows a dot)

Click Publish again

Survio switched the webhook off

The webhook URL failed for 5 days in a row

Fix the cause, then switch the webhook back on in Survio

Good to know

  • Survio sends only completed responses, one message per response, within seconds.

  • Nothing is sent retroactively: not responses from before the webhook existed, and not responses from while it was paused.

  • A failed delivery is retried up to 8 times over roughly 27 hours, and each attempt waits up to 30 seconds for a reply.

  • If deliveries fail for 5 days in a row, Survio switches the webhook off and you need to switch it back on.

  • Pausing a webhook keeps its slot; deleting it is permanent.

  • Survio doesn't keep a delivery history in the app. The Executions tab in n8n is your log.

  • Sending responses to webhooks doesn't use up any extra responses from your plan.

Rather have us set it up? On the Webhooks page in Survio, click Get expert setup, tell us what you'd like to happen, and our team will build it, test it and hand you a working webhook.

Did this answer your question?