Feedback

Feedback is userGist's one-question prompt channel. Use it for NPS, CSAT, star ratings, single-question multiple-choice, and short open-text — the moments where a five-step survey would be too much friction.

  1. 1 · Build
    Content & questions
  2. 2 · Design
    Theme & layout
  3. 3 · Target
    Audience · trigger · schedule · caps
  4. 4 · Analyze
    Performance & responses

Stage 1 — Build

Each prompt has one or more questions; most teams ship a single question.

Question types

The composer offers 4 types:

TypeReturnsNotes
rating1–5 or 1–10Scale picker + optional Low label and High label captions on the ends.
nps0–10Optional Follow-up prompt captured as free text after the score.
multiple_choiceoption ID(s)Add options 1-by-1. Toggle Multi-select to switch from radio to checkbox.
short_textstringPlaceholder + Max length (10–1000, default 280).

Per-question settings

For every question:

  • Title — the actual question your user reads.
  • Subtitle (optional) — secondary line beneath the title.
  • Type-specific fields from the table above.

That's the complete editor surface. There's no per-question "Required" toggle, no "Other" option on multiple-choice, and no branching UI today — prompts are meant to be quick and structurally simple. (Branching lives on Surveys.)

Prompt composer — Build stage.
Build stage: question list, per-question settings, live phone preview.

Stage 2 — Design

Pick a theme from the gallery, then optionally override individual tokens.

Theme tokens (custom palette)

TokenType
primaryhex
backgroundhex
texthex
subtexthex
borderhex
accenthex
buttonhex
borderRadiusnumber (px)
fontFamilystring

Same palette is used for surveys and in-app messages — change it once, it applies to all three.

Stage 3 — Target

Choose Audience, then Platforms, then Trigger. The platform section shows the app's configured iOS, Android and Web options. React Native, Expo and Flutter map to iOS and Android; select both for both app versions. Web covers browsers and appears only when enabled in app settings. See platform targeting.

Three concerns: who, when, and how often.

Audience

Use the Add criteria button to add audience conditions. The 8 condition kinds and operators are documented in Segments — same builder, same DSL.

Top-of-card Match selector chooses how rows compose:

SettingMeaning
All of these criteriaAND — every row must match.
Any of these criteriaOR — any row matches.

Live audience-size badge updates as you edit.

Trigger — when does it fire?

Prompts use the shared composer trigger builder. There are 3 kinds:

KindDashboard labelHint
app_openOn app open"Fire when the user opens the app."
eventWhen a user performs an event"Fire when the SDK records a specific event (with optional property filters)."
app_version_changedWhen the user updates the app"Fires on the first cold-start after the app version changes — perfect for "What's new"."
Audience join is push-only

The audience_join trigger from the data model is intentionally hidden in the prompt / survey / in-app composers; it's only exposed for push campaigns. The other three above are everything you'll see here.

Event trigger extras

When you pick event, three sub-controls appear:

  • Event name — choose from existing events (autocomplete) or type a new one.
  • Property filters — optional list of property + operator + value rows that constrain which events count (e.g. only checkout_completed where amountUsd >= 49).
  • Trigger occurrence — a dropdown:
ValueUI labelMeaning
everyEvery timeFire on every qualifying occurrence.
first_onlyFirst occurrenceFire only on the first qualifying occurrence per user.
after_nthAfter Nth occurrenceFire only on the Nth and subsequent occurrences. A numeric input appears for N.

Shared trigger options

For all three trigger kinds:

  • Delay — in minutes (the UI shows minutes; under the hood it's delaySeconds). Default 0.
  • Once only — checkbox. Fire just one time per user, ever.
  • Active window — toggle that reveals Start and End date/time inputs. Restricts firing to a date range.

Frequency caps

Two knobs:

UI labelFieldRangeWhat it does
Per-feedback cooldown (days)perPromptDays0+Don't show this prompt to the same user within N days.
Global per-user cooldown (days)perUserDays0+Any userGist prompt will not show within this window.
Sensible defaults

For NPS: perPromptDays = 90 (long cadence) and perUserDays = 14 (quiet two-week window after firing). For one-off CSAT: perPromptDays = 30.

Stage 4 — Analyze

After publish, the editor flips to a read-only Analyze view:

  • Response rateresponses / impressions.
  • Score distribution — bar / histogram for nps / rating.
  • Time series of daily responses (24h / 7d / 30d).
  • Raw responses — every submission with user, score, optional comment, and originating event.
Prompt Analyze view — distribution + raw responses.
Analyze stage: response distribution and raw responses for the active prompt.

Status lifecycle

StatusMeaning
draftNot shipping yet. Edits don't propagate to SDKs.
activeLive. SDKs pick up the trigger on the next sync (≤ 5 min).
pausedLive but temporarily not delivered.
archivedNot delivered; retained until an operator permanently deletes it.

SDK side

// Triggered prompts: just track the event
UserGist.track('checkout_completed', { amountUsd: 49 })
 
// Imperative open (e.g. from a “Give feedback” button)
const surveys = await UserGist.getAvailableSurveys()
if (surveys[0]) UserGist.openSurvey(surveys[0].id)
 
// React to a response
UserGist.onResponse((info) => {
  // info.surveyId, info.payload, info.userId, info.timestamp
})

API

  • GET /v1/apps/:appId/prompts — list
  • POST /v1/apps/:appId/prompts — create
  • PATCH /v1/apps/:appId/prompts/:promptId — update
  • DELETE /v1/apps/:appId/prompts/:promptId — permanently delete

Canonical schemas: apps/api/src/schemas/prompts.ts.

Personalized feedback

Use Insert field in supported prompt text to ask about the user's saved profile, latest matching activity or triggering event. Preview as user shows resolved text and missing fields without recording a response. See Personalize messages for setup and fallbacks.

The immediate-delivery API and SDK release returns authorized server-dependent feedback with event ingestion, avoiding the normal batch and next-poll waits. Eligible ordinary native prompts still use cached matching. Consent, audience, frequency and configured delay rules continue to apply.

What's next

Feedback on websites

Enable Web and allow your website origins in SDK setup, then include Web in the campaign's Target step. After explicit SDK activation, feedback consent enables display; analytics consent is also needed for tracked-event triggers. Configure browser layout under Design → Web presentation, below the theme controls. Use Web desktop or Web mobile to preview; Enlarge preview is available below desktop only.

Follow the Web SDK guide for automatic event-triggered delivery and openFeedback() from your own buttons. Existing campaigns retain native targeting until you add Web.