UserReason

Please visit this site
on desktop.

Our mobile site is still under construction. For the full experience, open UserReason on your desktop or laptop.

Use cases

Understand why users leave onboarding unfinished

A short survey after an explicit pause can tell you what that person needed at that moment. Ask one neutral question, offer an optional follow-up where it helps, and use the answers to choose what to investigate next. A pause is an observed action; it is not proof of abandonment or its cause.

Updated · Read as Markdown

Start with a moment the person actually chose

This recipe listens for an explicit Pause setup action. Keep the action useful on its own: someone may need information from a teammate, want to return later or decide the product is not right for them. The survey should not block leaving or require an explanation.

Scroll horizontally to see all columns.

ObservationWhat it tells you
The person chooses Pause setupThey chose to pause at this step. You can offer a question while they are still present.
The person closes a tab or becomes inactiveYou have no answer about their reason. A missing later event can have several explanations.
The person submits a survey answerYou have their reported reason, from a self-selected respondent at this moment.

If your product has no explicit pause action, choose another real, appropriate point in its flow before using this recipe. Do not name an inactivity timer onboarding_paused and interpret it as the same evidence.

Ask one reason, with an optional follow-up

The recipe asks “What led you to pause setup?” as a single-choice question. It keeps the question about the person’s current decision, without assuming the product was confusing or that they have abandoned it. It offers practical constraints as well as product problems; the person can close the survey without answering.

Scroll horizontally to see all columns.

Answer optionShow the optional follow-up?
I don’t have time right nowNo
I need more informationYes
Something didn’t work as expectedYes
I’m not ready to continueNo
Something elseYes

The optional follow-up is “Is there anything else you’d like us to know?” It appears only for the three answers marked Yes. The recipe’s stable question IDs are pause_reason and pause_details. Review the wording and choices for your own flow before publishing; a person may have several reasons, even though this question asks them to select one.

Save the complete definition below as survey.json and create a draft with the public CLI, following the paired Next.js guide. Alternatively, recreate its questions and conditions in the dashboard. This JSON is a survey definition for the CLI, not SDK initialization options or a dashboard import.

survey.json — complete onboarding pause recipe
{
  "schema_version": 1,
  "name": "Onboarding pause feedback",
  "content": {
    "schema_version": 1,
    "title": "Before you pause setup",
    "description": null,
    "language": "en",
    "collect_partial_responses": true,
    "questions": [
      {
        "id": "pause_reason",
        "kind": "single_choice",
        "prompt": "What led you to pause setup?",
        "required": true,
        "options": [
          {
            "id": "time_now",
            "label": "I don't have time right now"
          },
          {
            "id": "need_information",
            "label": "I need more information"
          },
          {
            "id": "setup_problem",
            "label": "Something didn't work as expected"
          },
          {
            "id": "not_ready",
            "label": "I'm not ready to continue"
          },
          {
            "id": "other",
            "label": "Something else"
          }
        ]
      },
      {
        "id": "pause_details",
        "kind": "text",
        "prompt": "Is there anything else you'd like us to know?",
        "required": false,
        "max_length": 2000,
        "logic": {
          "show_when": {
            "type": "answer",
            "question_id": "pause_reason",
            "comparison": {
              "operator": "one_of",
              "value": [
                "need_information",
                "setup_problem",
                "other"
              ]
            }
          }
        }
      }
    ],
    "thank_you": "Thank you for sharing your feedback."
  },
  "rules": {
    "schema_version": 1,
    "audience": {
      "type": "field",
      "source": "event_property",
      "key": "flow_version",
      "comparison": {
        "operator": "eq",
        "value": "nextjs-onboarding-v1"
      }
    },
    "triggers": [
      {
        "type": "event",
        "event_key": "onboarding_paused"
      }
    ],
    "frequency": {
      "mode": "custom",
      "max_shown": "1",
      "after_seen_seconds": 604800,
      "after_dismissed_seconds": 604800,
      "after_completed": {
        "type": "never"
      },
      "after_screen_out": {
        "type": "never"
      }
    }
  },
  "sampling_percent": 100,
  "priority": 0,
  "enrollment_epoch": "onboarding-pause-v1"
}

Report the pause with only the context you need

After the explicit Pause setup action
import userreason from '@userreason/js';

await userreason.event('onboarding_paused', {
  step: 'invite',
  flow_version: 'nextjs-onboarding-v1',
});

The example sends a step category and a stable flow version. These help you distinguish the workspace step from the invite step and avoid mixing answers from different onboarding designs. They do not need the person’s email, workspace name, invitation text, authentication token or full page URL.

Browser-reported context is not a trusted account fact. Use it to describe this feedback opportunity, not to establish identity, billing eligibility or access. Warn people against including sensitive information in optional free text, and keep access to responses appropriate for their contents.

The downloadable app uses memory storage and no visitor identification. Memory storage still permits network requests; choose the storage and consent behavior appropriate to your production app rather than assuming that this example settles those decisions.

Review the audience, frequency and published version

  • Use onboarding_paused as the trigger and the recipe’s flow_version = nextjs-onboarding-v1 event-property audience. Do not also show the same question on every onboarding page load.
  • Ask at a point where an interruption is acceptable, after the pause action has already succeeded.
  • Keep the event-property audience flow_version equal to nextjs-onboarding-v1 while testing this recipe, with 100% sampling on a development site.
  • Keep the recipe’s one-display limit per tracked visitor in this enrollment. Site-wide limits still apply, and a reload in memory mode creates a fresh visitor.
  • Preview every answer path and optional follow-up, then review and publish the intended version.

Keep feedback optional. If the person dismisses it, let their pause stand. If you change the wording or targeting later, publish the reviewed revision; editing a draft does not change the survey already live.

Check which answers were actually saved

Verify one complete response in the dashboard before using the answers to guide a decision. If partial collection is enabled, a visitor who advances past the reason question can leave a saved reason without completing the optional follow-up.

Typing without advancing does not save the current answer. An open partial response means no close was recorded; it does not establish that the person is still in the survey. Keep partial and completed counts visible when reviewing results.

Use reported reasons to choose the next investigation

Scroll horizontally to see all columns.

Pattern in the answersA practical next check
People need something they do not have yetCheck whether prerequisites are clear before setup begins and whether progress can be resumed.
A step or instruction is unclearWatch someone attempt that step and compare their explanation with the current interface.
Something did not workTry to reproduce the reported problem and review relevant product errors without treating survey text as a diagnosis.
People are only exploring or plan to returnCheck whether the flow supports that intent before classifying the pause as failure.

Read counts alongside the survey version, time period and step. Respondents are a subset of people who chose to pause and then answer. Their choices are not the abandonment rate for everyone who started onboarding, and a small set of answers cannot establish the prevalence or cause of a problem.

Use recurring answers to prioritize a usability check, error investigation or small design change. To evaluate that change, define a separate behavioral outcome and compare the relevant groups or periods carefully. A better survey score alone does not prove that onboarding improved.

Test the full path before asking customers

The recipe’s schema and all five answer paths were checked on 18 October 2026. The paired example now pins SDK 0.5.0. Start with a development site, publish the recipe, choose Pause setup and check the saved response. Then adapt the moment and wording to your own product.

The free allowance is 10,000 responses per workspace per UTC calendar month, across all its sites. A response counts once when its first answer is saved, including an unfinished response; later answers do not count again. The allowance resets at 00:00 UTC on the first day of the next month. At the limit, new responses are not recorded, while already-counted responses can still finish.