tom
reinert

digital
product
design
AI-Powered User Onboarding

AI-Powered User Onboarding
The fast path to first value

My exploration on how to build a smooth onboarding flow by adding a couple of tricks to a chat agent.

Last edit:
tl;dr: We're building a chat-based onboarding that collects structured data and shows immediate value within the onboarding flow.
Writing in progress – feedback welcome! hello@tomreinert.de

Designing user onboarding flows has always been one of my favorite parts of Product Design (I used to get excited when a new teardown from Sam Hullick at useronboard.com dropped).

I've been playing with a new approach to onboarding lately. Instead of those standard dropdown menus and checkboxes, I'm using AI to create conversational onboarding that feels natural while still collecting the structured data we need.

The approach isn't overly complex, but combines a few techniques that might not be obvious at first: Structured Output, Prompt Engineering, and a dynamic chat UI. I'll break these down further below.

The results have been pretty interesting, especially in how quickly users are seeing the actual value of the product.

But first: Why is onboarding so important?

Onboarding might seem simple, but there's a lot to unpack. It combines many core aspects of product design: attention to detail, captivating writing, communicating value, and simplifying the complex.

You're dealing with a fragile moment in the user journey where first impressions matter. The challenge is finding the right balance—getting necessary data without being pushy, pacing the onboarding while getting users to experience core value quickly.

Despite its importance, I've often seen it treated as an afterthought. And I've been guilty of it too. It's tempting to focus on building core functionality instead, especially with internal bias (we know our products well and rarely experience the journey from signup to blank state).

By addressing onboarding properly, you automatically unlock several critical aspects of your product:

  1. Core value clarity - You need a precise understanding of your product's main value. This must be communicated early in the flow. Ideally, users don't just understand this value—they actually experience it through an immediate benefit.

  2. Product positioning check - When it's hard to communicate that value or you're stuck designing the onboarding, it might be a symptom that your product's USP isn't crystal clear yet. This is a great indicator to take your product team to the whiteboard and chisel out that core value.

  3. Avoiding UI-focused approaches - One bad practice is UI tooltip tours. These focus on explaining the UI rather than providing quick value to users. If your onboarding has a "Skip" button, why show it in the first place?

  4. Creating seamless experiences - The best onboarding flows don't feel like onboarding at all—they feel like actually using the app, showing how it works along the way and providing instant value. Users quickly understand: "I need this app, I get how my life will get better when I use it."

  5. Shortening time to value - Optimizing for this moment of understanding as quickly as possible is key in today's saturated market, where signing up is low effort but abandoning after three clicks is too easy. I call this "Time to First Benefit."

The Old Compromise: Form-Based Onboarding

Before AI, we had to compromise with predefined questions using dropdowns and checkboxes.

A classic static onboarding flow with predefined questions
A classic static onboarding flow with predefined questions. It kind of works, but it's too rigid and not very engaging. What if my options don't fit the user?

Countless times I've scanned these lists for the relevant option and had to choose the next best thing, often without understanding why this information mattered at that moment. I just wanted to get through the flow to try the product.

This form of collecting information is always a compromise—general enough to match most users, but specific enough to gather relevant data.

I remember wishing for some magical way to collect unstructured, free-form input during onboarding and turn it into usable data.

AI: The Magical Solution

Now we have this magical tool in the form of AI.

While we talk a lot about AI's ability to provide information, explain things, or troubleshoot problems, a more understated but extremely powerful aspect is its ability to turn unstructured data into structured data.

With this in mind, I'm currently exploring a hybrid approach to onboarding, where users engage in a conversation with an onboarding AI prompted to collect profile data.

Of course, this is a simplified example. But we can easily imagine how this can be applied to more complex cases.

The Hybrid Approach

This idea isn't new, but when combined with structured output (I'm using Vercel's AI SDK which streamlines this), we get a powerful interaction model.

  message: z.string().describe('Main response message from the AI'),
  possibleInputs: z.array(
    z.string().describe('Answer options for the user to choose from.')
  ).max(5),
  profile: z.string().describe('A user profile based on the users input. This should be a concise description of the user\'s personality, interests, and preferences.'),
  profileComplete: z.boolean().describe('Whether the profile is complete or not.'),

We tell our AI to return several outputs:

  • The message itself to the user
  • A set of answer options to choose from (when applicable)
  • A user profile based on the current conversation (in a format we define)
  • A boolean flag: Profile Complete that's set to true when the AI has gathered all necessary information

Let's break these down:

The message:

Nice to meet you, Tom! Which language would you like to learn?

The AI asks the next question, customized to the user's previous input. In my example, the first question is about native language, so whatever the user picks, the agent continues the conversation in that language and uses the name the user provided.

Answer options:

The AI generates clickable suggestions, making the interaction feel more personal than a typical list or dropdown. Users can either select an option or type their own response — even when choices are provided.

This hybrid approach handles both quick selections (e.g. language, level) and open-ended input (e.g. interests, goals). As the conversation continues, the options become more tailored based on previous answers — while always leaving room for custom input.

Profile complete:

When the AI has collected all necessary information, it sets the onboarding flag to "complete" or "true." We can use this to move to the next step or have another agent take over. Of course, if the user says "Wait, I have more," the AI can set the flag back to false and collect additional information.

Users can also skip parts or the entire onboarding, or have different conversations. Through the prompt, we can define how much flexibility we want in the conversation—whether our onboarding agent can engage in small talk or explain different parts of our app or company.

Profile:

With every interaction, the AI builds a profile according to our defined schema. This could be a written text like a short bio or structured JSON with keys we'll reuse later in our app.

After collecting basic information (3-4 questions), we might have a profile like:

"Tom is a German-speaking user who wants to learn Spanish,
is a complete beginner, and is interested in photography and cooking.
He's also preparing for a trip to Bolivia."

or, structured JSON:

{
  "name": "Tom",
  "nativeLanguage": "German",
  "learningLanguage": "Spanish",
  "level": "beginner",
  "interests": ["photography", "cooking"],
  "goals": ["Prepare for trip to Bolivia"]
}

The Best Part: Immediate Personalized Value

This profile allows our app to provide a real, customized learning moment—a benefit—to the user. In my example, users get a mini-lesson tailored to their profile.

A mini-lesson tailored to the user's profile
A mini-lesson tailored to the user's profile

This is where we measure time to first benefit.

As users, we now understand: The app is customizing its behavior for us. Everyone likes being listened to. We see how the app will teach us things. We've actually learned something while still in onboarding. This is fun!

Now the "real" app experience can begin, taking into account the custom onboarding. The follow-up email can use this info: "Hey, when is your trip to Bolivia? Tell us, and we'll create a learning plan matching your timeline." The possibilities are endless.

Ongoing Onboarding

Onboarding doesn't end after the initial welcome sequence. You could say it never ends and continues while your user is active and even beyond. But the core onboarding happens until your user is converted or retained, possibly becoming a fan and ambassador of your product.

My language chat example is simple, but we can easily imagine how every subsequent interaction and user input (text-based or interaction-based) can be processed by an AI and converted into usable data points.

Example: If we see minimal input from users after onboarding, or their answers are short "testing" phrases, the AI can detect this and conclude that they may need more guidance or aren't fully convinced yet.

Notes

This article was written in collaboration with ChatGPT, Claude and MacWhisper. I first spoke my thoughts into MacWhisper as a brain-dump and fed the raw transcript to ChatGPT to structure and refine it. I then used Claude to write and edit the article. Not happy with the result, I re-wrote the article myself, using the structure and some of the initial writing. Claude was so kind to edit my re-write. It didn't take it too personal that I didn't use its first draft.

The code for the demo was written in collaboration with Cursor.

Screen recording was done with Cursorful – which works brilliantly.

Prompt

This is the prompt I used for the demo.

You are the onboarding assistant for a language learning app. Your goals are:

1. To help new users set up their profile so the assistant can provie personalized teaching.
2. To make the user feel welcome and excited about learning a new language.
3. To show a benefit of using the app early on and provide a learning moment that excites the user.


First you will collect the following information, step by step:
0. ** Their native language** (Use this as your language)
1. **Name** (No suggestions)
2. **Language**
3. **Current Level**
4. ** Some hobby or thing that they are excited about** (No suggestions)

Your first message is already visible in the conversation:  
**"Whats your native language?"**  
So expect a language as the first input.
During the onboarding, match that language of the user.


When you got all the information, show the final profile to the user and ask them if they are happy with it.
If the user is happy, set the profileComplete to true.
If they want to change something, set the profileComplete to false and ask them which information they want to change or add.

When the profile is complete, provide a fun mini lesson to the user, based on the information they provided adequate to their level. Integrate their hobby or thing that they are excited about, so the lesson is personalized and emtional. You know who we learn better when we talk about something we can connect to emotionally. You can make that fun and engaging. Match the level of the user. For Beginners, you can provide some basic vocabulary. For advanced, you can start a conversation about the hobby or thing that they are excited about in the language they are learning. For experts, you can start with a more complex question or learning prompt.

When the profile is complete, don't add suggestions anymore.

---

Answer suggestions:
When a question is not free form, suggest up to 5 possible answers for the user to choose from.
When they select something like "Other" ask them to specify.

---

**Personalization Rules:**

- Always use the name the user provides in your messages.
- If it fits naturally, reuse previous answers in later questions to make the experience feel more personal.

---
Handling Off-Topic or Unexpected Input:

If the user provides input that doesn’t answer the current question (e.g., tells a story, asks a different question, or skips ahead), gently guide them back to the onboarding flow without being too robotic.

Politely refocus the conversation, using their name if you have it.
If needed, briefly remind them why the info is important.
Do not skip steps or move to the next question until the current one is answered clearly.

If a user explicitly wants to skip or cancel the onboarding, let them. They can always start over later.

---

**Profile Generation Rules:**

1. Generate or update the profile after each user input.
2. The profile should be concise (1–2 lines max), focusing on name, budget, shopping frequency, and preferences.
3. If any info is missing, generate a **partial profile** with what you have so far.