Feedback conversations

Support tickets tell you what is broken. Feedback conversations tell you how customers actually feel. Ask a customer for feedback (a feedback request), or record feedback your app collected — either way you get an ongoing conversation with an optional 1–5 rating and explanation, kept separate from your support queue. Available on Pro and above.

Request feedback (the "tickle")

A feedback request emails the customer a built-in, project-branded message with a one-click respond link — no form, no login. The request tracks its funnel: sent opened (they clicked the link) → responded(they answered), so you always know whether a nudge landed. Perfect for "you signed up but never created a project — what stopped you?" automations driven from your own app.

import { HelmdeskClient } from '@helmdesk/sdk'

const helmdesk = new HelmdeskClient({ apiKey: process.env.HELMDESK_API_KEY! })

// e.g. from a lifecycle job: user signed up 3 days ago, no project yet
await helmdesk.feedback.requests.create({
  title: 'How is your FireScraper setup going?',
  message:
    'Hi! We noticed you signed up but have not created a scraping session yet. ' +
    'Did something get in the way? Reply and tell us — we read every answer.',
  customerEmail: 'jane@example.com',
  customerName: 'Jane',
})

// Later: check the funnel
const { requests } = await helmdesk.feedback.requests.list({ status: 'sent,opened' })

The email subject is the request title. When the customer responds, a conversation is created from their answer and linked back to the request.

Record feedback from your app

If you collect feedback inside your own product (an in-app form, an NPS widget), push it to Helmdesk so everything lives in one place:

const conversation = await helmdesk.feedback.conversations.create({
  title: 'In-app feedback',
  body: 'Love the new export feature, but PDF rendering is slow on big jobs.',
  customerEmail: 'jane@example.com',
  rating: 4,
  ratingComment: 'Great overall, exports need work',
})

Reply and close

Conversations are two-way. When you reply — from the dashboard, API, or an AI assistant via MCP — the customer gets an email with a link back to the thread. A customer reply to a closed conversation reopens it.

// List open conversations with low ratings — who is unhappy?
const { conversations } = await helmdesk.feedback.conversations.list({
  status: 'open',
  rating: '1,2,3',
})

// Read the full thread
const thread = await helmdesk.feedback.conversations.get(conversations[0].id)

// Reply (the customer is emailed) and close
await helmdesk.feedback.conversations.reply(thread.id, 'Thanks — PDF speedup ships next week!')
await helmdesk.feedback.conversations.update(thread.id, { status: 'closed' })

Scopes & environments

  • feedback:read — list and view conversations and requests.
  • feedback:write — create requests, create conversations, reply, close/reopen, set ratings.
  • Requests created with an sk_sandbox_… key are sandbox data: no real email is sent, and the data stays in the sandbox plane — ideal for integration tests. See Sandbox.

Endpoints

EndpointPurpose
GET/POST /v1/feedback/conversationsList (filter by status, rating, customer, date) / create
GET/PATCH /v1/feedback/conversations/:idFull thread / close, reopen, set rating
POST /v1/feedback/conversations/:id/messagesReply (emails the customer)
GET/POST /v1/feedback/requestsList with funnel status / create + send the email
GET /v1/feedback/requests/:idOne request incl. opened/responded timestamps

The MCP server exposes the same surface as tools (request_feedback, list_feedback_conversations, reply_to_feedback, …) — see MCP Server.