<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Thanh Nguyen on Medium]]></title>
        <description><![CDATA[Stories by Thanh Nguyen on Medium]]></description>
        <link>https://medium.com/@designedbythanh?source=rss-cf281cdbf27c------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*HGj1c7h5t5mNloTcJhPr1g.jpeg</url>
            <title>Stories by Thanh Nguyen on Medium</title>
            <link>https://medium.com/@designedbythanh?source=rss-cf281cdbf27c------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 13:49:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@designedbythanh/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Reading your product data when you don’t have a data analyst]]></title>
            <link>https://medium.com/design-bootcamp/reading-your-product-data-when-you-dont-have-a-data-analyst-ad026aa1fc7e?source=rss-cf281cdbf27c------2</link>
            <guid isPermaLink="false">https://medium.com/p/ad026aa1fc7e</guid>
            <category><![CDATA[user-research]]></category>
            <category><![CDATA[ai-tools]]></category>
            <category><![CDATA[product-design]]></category>
            <category><![CDATA[product-analytics]]></category>
            <category><![CDATA[product-management]]></category>
            <dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
            <pubDate>Tue, 19 May 2026 07:24:03 GMT</pubDate>
            <atom:updated>2026-05-19T07:24:03.417Z</atom:updated>
            <content:encoded><![CDATA[<h4>How behavioral data changed who I talk to, what I ask, and what I don’t.</h4><p>A few weeks ago I was preparing for user interviews on a product I’m working on. Before talking to anyone, I wanted to know which questions were worth asking and which ones the data could already answer.</p><p>That meant reading the product analytics first. Replays, events, errors, funnels — months of data sitting there with no analyst on the team. I started with the metrics that looked important, retention dipping here, feature adoption low there, and spent a while staring at numbers that described what happened but gave me no real direction on what to ask next.</p><p>The risk of skipping this step is real. Without it, you walk into interviews asking questions the data already answered, and spend 45 minutes confirming things you could have known beforehand. That’s time the user gave you that you didn’t need to ask for.</p><p>This is what helped. Most of it applies whether or not you use the same tool.</p><h3>How I explored the data</h3><p>I started with where users were frustrated: rage-clicks, repeated failed actions, dead ends, rather than metrics. <em>Metrics tell you what happened. Behavior tells you where to look.</em></p><p>At this scale, doing it manually wasn’t realistic. I was using PostHog, which has an AI layer that reads session event streams and summarizes behavior without watching recordings one by one. It also wrote the SQL queries I needed. I read and verified them.</p><p>Before touching the data, it created a form, asking how I define discovery, who the analysis should cover, whether I had a hypothesis. Only after that did it run the queries.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AbUIsxiM7VLgqaqa1WaVAw.png" /></figure><h3>176 days. Wrong number. Didn’t know it yet.</h3><p>First investigation: are users finding the new features?</p><p>First finding: 176 days from signup to first use. Looks like slow discovery. So the next question: messaging problem? Feature doesn’t fit the workflow? I asked the AI, got reasonable answers both ways, went back and forth for a while, nothing landed.</p><p><strong>The tool flagged it before I did.</strong> Before touching the data, it came back with one more question: when did each feature actually launch?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*k7q2oLd66c2yK9y8sZCQvw.png" /></figure><p>I gave it the dates. Turns out they went live a few months back. Maximum possible lag: around three months, not 176 days. That figure was measuring signup-to-now, not launch-to-first-use. Most users signed up before the features existed.</p><p>The tool was confident. It had no reason not to be. I hadn’t given it the one fact that would have changed everything.</p><h3>83% never tried it. Two completely different reasons why.</h3><p>When the framing changed, the picture changed. 72% of users who try the main feature come back, averaging 17.8 uses. The product works. But 83% never try it at all.</p><p>A feature that delivers real value once discovered is not reaching the people it was built for.</p><p>“Users don’t like it” and “users can’t find it” look the same in aggregate but don’t have the same fix. Getting this wrong means redesigning a feature that didn’t need redesigning, or running a messaging campaign when the problem was always placement.</p><p>The discovery path made it more specific: 60% of users rage-clicked right before finding the feature, stuck somewhere else, clicking around in frustration, stumbling on it by accident. Suggestive, not certain. But it shows the feature isn’t findable through normal use. You have to stumble on it.</p><p>The structural reason is placement. The feature lives behind a tab that isn’t open by default. You could use the product a hundred times and never see it. Not a user behavior problem. A placement decision that was never questioned, and one that’s suppressing adoption of something that already works.</p><h3>Three pieces of context shifted the entire analysis</h3><p>When I fed PostHog AI actual documentation and product specs, the analysis changed. Not because the data changed because the AI understood what the feature was supposed to do and how the user flow was designed to work.</p><p>In practice: before asking anything about the feature, I pasted in the product spec, the user flow description, and the design guidelines. <em>Not summarized. The actual text.</em> That’s when the output stopped being generic.</p><p>Without that context, it was pattern-matching against generic behavior. With it, it could tell whether what users were actually doing matched what the feature intended. That gap is where the real diagnosis lives.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hyLnzogftDmegCZH45OnBw.png" /></figure><p>Launch date changed the measurement. Placement changed the hypothesis. Product specs made the output specific enough to act on. That’s the part I’d do first next time.</p><h3>What the data decided, and what it left open</h3><p>By the end I had two very different types of findings.</p><p>The first: users can’t find the feature. <strong>Placement, rage-click path, limited newsletter reach all point the same way.</strong> No interview needed. It’s a placement fix.</p><p>The second: 28% of first-time users don’t return. Quality problem or trust problem, the data can’t tell which. A placement fix and a quality fix are not the same investment, not the same timeline, not the same team. One of them is the wrong answer.</p><p>That’s what shaped the interview plan. Who could actually answer the questions still open.</p><p>One target: the power user who started on day five, uses the feature hundreds of times, likely got colleagues to try it. The interview goes straight to: walk me through the first time you tried it. What were you doing. What did the output look like. What did you do with it. Data confirmed this person exists, the interview reconstructs why it worked.</p><p>Another target: the user with the most rage-clicks in the entire base, over a thousand, who has never touched the feature. The question isn’t “did you know this existed.” It’s “when something isn’t working, what do you do.” Watch where they go. Don’t point to the feature first.</p><p>Interview design follows from the hypothesis. Specific moments, not general impressions. “Have you ever sent an AI-generated analysis directly to a client?” tells you more than “what do you think of the quality.”</p><h3>Before you talk to anyone</h3><p>Without the data work, interviews confirm things you already know. I could have spent 45 minutes with a user finding out the feature is hard to discover — the rage-click data had already shown that.</p><p>Rank your hypotheses by evidence strength before talking to anyone. What’s confirmed doesn’t need interview time. What’s only suggested, a pattern that could mean two different things, that’s where interviews earn their place. Design questions specific enough to tell the two interpretations apart. <em>If the answer would be the same either way, it’s the wrong question.</em></p><p>Match who you talk to with what you’re testing. A power user and a frustrated non-user aren’t just two data points. One shows what worked. The other shows what failed.</p><p>The split looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UufBSGAMjphjaO3F.png" /></figure><p>For each hypothesis: if this were true, what else in the data would also be true? If you can confirm it without talking to anyone, confirm it first.</p><p>The data told me where to look and who to talk to. Interviews show what it felt like from the inside. That’s what I’m doing next.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ad026aa1fc7e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/design-bootcamp/reading-your-product-data-when-you-dont-have-a-data-analyst-ad026aa1fc7e">Reading your product data when you don’t have a data analyst</a> was originally published in <a href="https://medium.com/design-bootcamp">Bootcamp</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nobody renames layers. Here’s how I automated it.]]></title>
            <link>https://medium.com/@designedbythanh/nobody-renames-layers-heres-how-i-automated-it-4d97b861cc26?source=rss-cf281cdbf27c------2</link>
            <guid isPermaLink="false">https://medium.com/p/4d97b861cc26</guid>
            <category><![CDATA[figma]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[ux-ui-design-thinking]]></category>
            <category><![CDATA[product-design]]></category>
            <dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
            <pubDate>Fri, 17 Apr 2026 20:38:10 GMT</pubDate>
            <atom:updated>2026-04-17T20:38:10.761Z</atom:updated>
            <content:encoded><![CDATA[<h4>Layer names carry more than you think. Most files ship without them. Here’s a workflow using Claude Code and Figma MCP to fix that in minutes.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_cmRoNYjFV_53zz6lAoreQ.png" /></figure><p><em>Title. Frame 10. Container. Options.</em></p><p>That’s what a Figma file looks like mid-exploration, and usually what it still looks like at handoff.</p><p>Not because designers are careless. Because during exploration, that’s not the work. You’re figuring out structure, flow, what fits. Naming is for later.</p><p>Later doesn’t happen. And it matters more than it looks.</p><p>A developer building from a file with semantic names doesn’t have to invent naming. The system is already there, consistent between design and code. And if you’re using AI to generate code directly from Figma, clean layer names aren’t optional. <strong>They’re the input.</strong></p><p>I’ve told myself “I’ll rename before handoff.” The honest reason it doesn’t happen: the cost is too high for something that feels like cleanup. The effort of encoding what you already know, layer by layer, matching domain language, matching the tech stack, never quite feels worth it.</p><h3>What Figma’s AI rename actually does</h3><p>Figma recently improved AI-powered rename. I tested it on a scheduling form. Figma flagged no layers as needing renaming. I forced it anyway, hoping it would fix the wrong existing names.</p><p>It didn’t. <em>Input container</em> appeared three times in a row for three completely different fields. Layers already named, even wrongly, were left untouched. Figma’s AI won’t question a name that looks intentional.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YU3gHdD9ClJUssHv4gnzGg.gif" /></figure><p><strong>The reason is context</strong>. Figma’s AI sees shapes. It doesn’t know the feature, the domain, or what the developer expects. That context is what turns <em>Recipient email</em> container into <em>Form.RecipientsField</em>, a name that tells a developer what the component does, and tells a code generator what to reach for.</p><p>So I tried delegating it.</p><h3>The workflow</h3><p>The workflow: paste a Figma link into Claude Code. It reads the full layer tree via Figma MCP, structured data not a screenshot. Then it proposes a mapping:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*LdjqmqNgVHDEqRxA.png" /></figure><p>I review, type <strong>apply</strong>, and Claude Code renames everything directly in the file.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HO5g3GCvi0DPt_ym4uu8Fg.gif" /></figure><p>But metadata alone isn’t enough. Without seeing the actual design, some fields come back wrong — a layer named <em>Form.ScheduledDateField</em> when it was actually the Dimension field. Link plus screenshot fixes that. Claude reconciles against the real label text and corrects what the metadata got wrong.</p><p>There’s a second gap: layers with names that already exist but are wrong. Claude won’t question them. A manual pass on those is still necessary, but it’s a targeted check, not a full rename from scratch.</p><p>After that, naming accuracy is significantly higher. <strong>Not perfect, but precise enough that a developer can read the file without asking, and a code generator has enough signal to work with.</strong></p><h3>How to try it</h3><p>If you want to try this:</p><p><strong>Prerequisites:</strong> Claude Code with Figma MCP connected.</p><p><strong>Start with this prompt:</strong></p><p><em>“Here is my Figma link: [link]. Tech stack: [React]. Feature: [feature name]. Propose a rename mapping.”</em></p><p>Tech stack is enough. Claude will apply the appropriate naming convention automatically. No need to define format, prefix, or granularity yourself.</p><p><strong>1. Review the mapping.</strong> Claude proposes names for the full layer tree. Read through before applying.</p><p><strong>2. Add a screenshot if labels are ambiguous.</strong> Link plus screenshot from the start, not after you spot errors.</p><p><strong>3. Type </strong>apply<strong>.</strong> Claude Code renames directly in the file. No copy-paste. No manual panel work.</p><p><strong>4. Quick manual pass</strong> on layers that already had names. Wrong ones won’t be caught automatically.</p><blockquote>The same approach works for variable values, color tokens, spacing, anything that lives in the file as structured data.</blockquote><p>Renaming layers isn’t judgment work. It’s translation work, taking what you already know about a screen and encoding it somewhere the file can carry it forward without you.</p><p>Before, that translation was expensive enough to skip. Now it isn’t. That’s what changes the file, not discipline, just cost.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4d97b861cc26" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[20 mins of arguing, 2 mins of clicking]]></title>
            <link>https://medium.com/design-bootcamp/20-mins-of-arguing-2-mins-of-clicking-88f3ba6bb699?source=rss-cf281cdbf27c------2</link>
            <guid isPermaLink="false">https://medium.com/p/88f3ba6bb699</guid>
            <category><![CDATA[design-thinking]]></category>
            <category><![CDATA[prototyping]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[product-design]]></category>
            <dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 22:29:34 GMT</pubDate>
            <atom:updated>2026-03-31T22:29:34.406Z</atom:updated>
            <content:encoded><![CDATA[<h4>The prototype didn’t settle the argument. It just made it stop mattering.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kLb2lRYxcxx5TC3LmrJSIw.png" /></figure><p>We were trying to decide between two versions of a permission screen.</p><p>Same model, two different layouts. Both made sense.</p><p>But we were deciding on a static frame — and a static frame can only show you layout, copy, structure. Not how something actually behaves when you use it.</p><p>The obvious fix would be to wire it up in Figma. But the problem is what happens next: every change means going back in, reconnecting frames, updating interactions one by one. It adds up.</p><p>For flows like this, I’d rather have a small artifact in the browser instead. By “<em>artifact</em>” I mean <strong>a throwaway prototype that runs in a tab, takes real input, and shows state changes</strong>. Not something for handoff or production, just enough to feel how the behavior works.</p><p>So I just built both versions in the browser.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qM3CXKzB29E1Fw31TU_wBA.png" /><figcaption>Version A: two columns. Version B: single column with convertible team access.</figcaption></figure><p>I started with a screenshot and wrote a prompt. The structure I keep coming back to is simple:</p><ul><li>write the actual job first, not the spec</li><li>then spell out the logic — rules, edge cases, states that branch</li><li>close with “if anything is unclear, ask before assuming”</li></ul><p>With that “<strong>ask before assuming</strong>” at the end, gaps turn into questions instead of guesses. And with the design system in the mix, the prototype already feels like the product instead of a random demo.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F3VTAmNxwczY%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D3VTAmNxwczY&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F3VTAmNxwczY%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/f80b0cbdac4f53eb5e4c61a24efcf83a/href">https://medium.com/media/f80b0cbdac4f53eb5e4c61a24efcf83a/href</a></iframe><p>In the single‑column version, team‑granted permissions show up in light purple. Click one and it converts, and a tooltip appears explaining the consequence. I never wrote that copy. <em>It came entirely from the rules and context I’d described.</em></p><p>It doesn’t always land this well. When the interaction is less conventional, it fills gaps with patterns that don’t fit your product. The layout looks right but the interaction is off. The branching logic is wrong in ways you only catch when you click through.</p><p>A few minutes later, I shared the link. The dev clicked around, tried both, then came back. We landed on the same one.</p><p>Prototyping often gets skipped because by the time anything is wired up, the decision has already been made in a meeting or a comment thread.</p><p>A throwaway artifact changes that. It’s fast enough to exist before the conversation, not after.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=88f3ba6bb699" width="1" height="1" alt=""><hr><p><a href="https://medium.com/design-bootcamp/20-mins-of-arguing-2-mins-of-clicking-88f3ba6bb699">20 mins of arguing, 2 mins of clicking</a> was originally published in <a href="https://medium.com/design-bootcamp">Bootcamp</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Before you ask AI, answer this first]]></title>
            <link>https://medium.com/design-bootcamp/before-you-ask-ai-answer-this-first-6a992db3c3a0?source=rss-cf281cdbf27c------2</link>
            <guid isPermaLink="false">https://medium.com/p/6a992db3c3a0</guid>
            <category><![CDATA[ai-for-designers]]></category>
            <category><![CDATA[ux]]></category>
            <category><![CDATA[design-thinking]]></category>
            <category><![CDATA[product-design]]></category>
            <category><![CDATA[writing-prompts]]></category>
            <dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
            <pubDate>Tue, 17 Mar 2026 09:23:53 GMT</pubDate>
            <atom:updated>2026-03-17T09:23:53.153Z</atom:updated>
            <content:encoded><![CDATA[<p>I asked AI to help me decide before I knew what I was deciding. Here’s what changed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HDPjOIYgPGXrIUSpF72W7w.png" /></figure><p><strong>Getting better answers from AI starts before you open the chat.</strong></p><p>You open a chat, describe the situation, ask for options.</p><p>AI gives you options. Good ones, even. You ask follow-up questions. More options. You go back and forth for a while, and at some point you realize you’re not closer to a decision.</p><p>You’re just deeper in.</p><p>The session felt like work. It wasn’t.</p><blockquote><em>AI did exactly what it’s good at, it gave me possibilities. The problem is that possibilities, when you don’t know what you’re optimizing for, are just noise with good formatting.</em></blockquote><p>I hit this working on a navigation problem. A screen with 20+ workspaces, each with 20+ dimensions, each dimension with 20+ values.</p><p>I asked AI for solutions. Got a list of options that all made sense. Spent thirty minutes asking follow-ups, trying to get one of them to feel obviously right.</p><p>None of them did.</p><p>At some point I closed the chat and went for a walk, which is usually a sign that something went wrong.</p><p>What went wrong was that I asked AI to help me decide before I knew what I was deciding.</p><p>The options AI gave me were answers to <em>“what navigation patterns exist for complex data structures.”</em> That’s a real question, and AI answered it well.</p><p>But the question I actually needed to answer was different: <em>what is the user trying to do, and when does the current pattern start to break for them?</em></p><p>Those two questions look similar. They’re not.</p><p>The first one AI can answer from training data. The second one requires knowing things that aren’t in the prompt: which workspaces users actually live in day-to-day, whether the primary action is searching or comparing or setting up, where the friction is right now.</p><p>I had some of that context. I just hadn’t written it down before asking.</p><p>After that I started doing something small before opening any AI chat for a design problem. Three things, in order.</p><p><strong>The first thing</strong> I write down is what the user is actually trying to do. Not the data shape, not the feature spec, but the job.</p><p>In this case: users primarily work inside two or three familiar workspaces. They rarely compare multiple workspaces at once. Main actions are within a workspace, not across them.</p><p>Three sentences. Five minutes, sometimes less. But it’s the difference between asking AI to evaluate options versus asking AI to evaluate options <em>for a specific user in a specific context</em>.</p><p><strong>Then</strong> which direction I’m already leaning, and why. Even if I’m not confident. Especially if I’m not confident.</p><p><em>“I’m thinking sidebar navigation with a workspace switcher at the top, because the mental model feels like being inside one workspace at a time.”</em></p><p>That’s enough. It’s not a decision, just a direction. But it gives AI something concrete to push back against instead of just generating variations — and honestly, writing it down sometimes tells me more about what I actually think than the AI’s response does.</p><p><strong>The third thing</strong> is the one that changed the most about what I got back. One specific thing I’m uncertain about, tied to a real constraint or failure mode.</p><p>There’s a difference between <em>“I’m not sure about the layout” </em>and <em>“I’m not sure if showing twenty dimensions in a sidebar creates cognitive overload, and I don’t know at what threshold that pattern starts to fail.”</em></p><p>Both are honest. Only one is useful to hand to AI.</p><blockquote>Vague uncertainty gives you more options. Specific uncertainty gives you something you can decide from.</blockquote><p>Here’s what the prompt looked like once I had all three:</p><ul><li><strong><em>Context</em></strong><em>: Screen has 20+ workspaces, each with 20+ dimensions, each dimension with 20+ values. Users primarily work in 2–3 familiar workspaces. They rarely compare multiple workspaces simultaneously. Main actions are within a workspace: viewing, filtering, setting up. Not across workspaces.</em></li><li><strong><em>My direction</em></strong><em>: Leaning toward sidebar navigation with a workspace switcher at the top. Mental model is “at any given time, I’m inside one workspace.”</em></li><li><strong><em>My uncertainty</em></strong><em>: Not sure if showing ~20 dimensions in a sidebar creates cognitive overload. Don’t know at what threshold this pattern starts to fail.</em></li><li><strong><em>Question</em></strong><em>: With this data shape and usage pattern, where does a sidebar dimension list start to break down, and what’s the first sign of failure?</em></li></ul><p>No preamble. No “can you help me with.” Just context, direction, uncertainty, one question.</p><p>The response came back about failure thresholds, not solution options. Which was what I needed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MJAdz7H8Ss3hyQOJ0YK4hg.png" /><figcaption><strong>Before:</strong> Vague prompt. AI gives you a list. Useful, but you still can’t decide.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NMArjmRFqDoUbraIdWSLsw.png" /><figcaption><strong>After:</strong> Context, direction, one specific uncertainty. AI tells you where it breaks and why.</figcaption></figure><p>The thirty-minute session wasn’t wasted. I needed to see all those options to understand that options weren’t my problem.</p><p>But I keep thinking about how long I sat there waiting for one of them to feel right. Like if I just asked the right follow-up, something would click.</p><p>It didn’t. It usually doesn’t.</p><p>The problem wasn’t the AI. It was that I showed up without having done the part only I could do.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6a992db3c3a0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/design-bootcamp/before-you-ask-ai-answer-this-first-6a992db3c3a0">Before you ask AI, answer this first</a> was originally published in <a href="https://medium.com/design-bootcamp">Bootcamp</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Your Figma file is not a database. It should be.]]></title>
            <link>https://medium.com/design-bootcamp/your-figma-file-is-not-a-database-it-should-be-figma-mcp-just-exposed-the-gap-7575d6f74688?source=rss-cf281cdbf27c------2</link>
            <guid isPermaLink="false">https://medium.com/p/7575d6f74688</guid>
            <category><![CDATA[figma]]></category>
            <category><![CDATA[product-development]]></category>
            <category><![CDATA[design-systems]]></category>
            <category><![CDATA[product-design]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
            <pubDate>Sat, 28 Feb 2026 10:02:01 GMT</pubDate>
            <atom:updated>2026-03-01T22:49:06.045Z</atom:updated>
            <content:encoded><![CDATA[<h4>How treating Figma like a UI database instead of an infinite canvas helps real teams and gives AI something solid to build on.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*moifDfO0_SthbBCWCQMLKQ.png" /></figure><p><strong>TL;DR</strong>: Figma MCP lets AI read your files the way a developer reads structured data, not screenshots. It works well when your UI is built from clear components, real variants, and shared styles. It tends to struggle when you try “full page from mockup”. The output can look right but be hard to trust or maintain. Even if you never use MCP, treating Figma less like a moodboard and more like a product database: files by domain, a real system library, product-level naming, explicit states, readable component internals, makes life easier for teams and AI tools you plug in later.</p><p>There’s a lot of noise right now about “AI for UI” and Figma MCP. Most of it is about slick demos: “look, we generated this whole page from a mockup.” Fun to watch, hard to trust.</p><p>Behind that, there’s a quieter question that feels more important for real product work:</p><blockquote>What if Figma behaved less like an infinite canvas, and more like a structured database of your product’s UI?</blockquote><p>Once you look at it that way, things start to shift. Life gets easier not just for designers, but also for developers, PMs, founders and, yes, for AI tools like MCP.</p><p>This is a tour of that idea, based on real experiments and a couple of failures worth sharing.</p><h3>1. Figma MCP in simple words</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SAaR6KPWJp6FX3Gn.png" /></figure><p>Before talking about “database”, it helps to be clear on MCP itself.</p><p><strong>What it is:</strong></p><p>MCP (Model Context Protocol) is a way for AI tools to <strong>talk directly to Figma via API</strong> instead of looking at screenshots.</p><p><strong>Without MCP:</strong></p><p>AI sees pictures and some text. It guesses spacing, colors, and states. It’s always a bit approximate.</p><p><strong>With Figma MCP:</strong></p><p>AI can ask questions like:</p><ul><li>“Give me this component and all its states.”</li><li>“What styles and variables are used here?”</li><li>“What happens on hover/click for this element?”</li></ul><p>Figma returns JSON data with that structure.</p><p><strong>What you can do with that data:</strong></p><ul><li>Generate a <strong>spec</strong> for a component straight from the source.</li><li>Draft or refactor <strong>implementation code</strong>, in whatever tech stack you use.</li><li>Build <strong>docs or playgrounds</strong> that show all states of a component.</li></ul><p>There’s one catch: MCP can only use what is <strong>actually encoded</strong> in your Figma file. Anything that lives only in people’s heads or Slack is invisible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/862/0*rc7vaJYcTy16O3ZR.png" /><figcaption>Figma personal access token, with selected scopes. Tools like Cursor or Claude Code use it to call the Figma API.</figcaption></figure><h3>2. Figma as a canvas vs Figma as a database</h3><p>Up to this point, I had mostly used Figma like many teams do:</p><ul><li>a canvas with screens</li><li>a place to show flows</li><li>a board to “handoff” to devs</li><li>a bit of “we just know this” logic in the team: which button is the real primary, which version of a flow is actually live, which state “obviously” means error, etc.</li></ul><p>When you connect MCP, the way Figma is used starts to matter more.</p><p><strong>MCP doesn’t see a pretty canvas. It sees data:</strong></p><ul><li>a tree of nodes (components, frames, groups)</li><li>component names</li><li>frame names</li><li>variant options</li><li>styles and variables</li><li>defined interactions</li><li>any written notes or guidelines in the file</li></ul><p>Anything that lives only in people’s heads, Slack, or verbal agreements is invisible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*LIzBHdD0LGG4oNax.png" /></figure><h3>3. Where MCP really helps (and where it doesn’t)</h3><p>After a few experiments, some patterns became clearer.</p><p><strong>MCP is good at…</strong></p><p><strong>Components and patterns that are already clear.</strong></p><blockquote>Show me exactly how this component works and help me keep its code, docs, and spec in sync.</blockquote><p>For example:</p><ul><li>a well‑defined Button, Tag, Dialog, Table row, etc.</li><li>flows that use these components consistently</li></ul><p>MCP can:</p><ul><li>extract a spec</li><li>help generate or refactor the implementation</li><li>generate simple docs or playgrounds for testing</li></ul><p>This is useful whether you’re a designer, dev, PM, or founder. You get:</p><ul><li>a shared, concrete description of a component,</li><li>less guesswork when implementing or reviewing.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*sjWsk6H9T5ZfgIIj.png" /><figcaption>An excerpt from button.md showing variants and Figma node mapping, generated from Figma via MCP.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*te3px0wwGRaT8QtJ.png" /><figcaption>An excerpt from ‎button.md showing the Button component props and how Figma design states map to runtime behavior.</figcaption></figure><p><strong>MCP is not so good at…</strong></p><p><strong>Generating full production screens from mockups.</strong></p><p>You can ask an AI connected to MCP:</p><p><em>“Here’s a complex screen in Figma, generate the whole page code.”</em></p><p>I tried it. It looked great in a demo, but here is where it hurt in code review:</p><ul><li>a big chunk of code that technically matched the layout</li><li>lots of one‑off components created on the fly</li><li>huge files mixing layout, UI, and mock logic</li><li>behaviour that didn’t match how our product actually works</li><li>something that would be painful to maintain</li></ul><p>That’s when I stopped thinking “one click from Figma to full app” was interesting for serious products.</p><p>For a quick demo? Sure.</p><p>For a product that will evolve for years? Probably not worth it.</p><h3>4. Clean Figma helps MCP</h3><p><em>These are not magic checklists that make AI “fully understand” your Figma file. But when files use real components, product‑level names, and explicit variants, designers and engineers spend less time debating what’s real and MCP has fewer chances to guess or hallucinate.</em></p><p><em>The trade‑off is real: making every frame and layer perfectly structured is slow and doesn’t scale. Figma isn’t a real database with schemas and constraints, discipline still comes from people and process.</em></p><p>Because of that, I aim for <strong>baseline structure</strong>:</p><ul><li>structured enough that someone who wasn’t in the original context (or an AI) can read it.</li><li>light enough that designers are not spending their whole week cleaning up layers instead of designing.</li></ul><p>With that in mind, here are five habits that have actually helped in my own work.</p><h4>Let Figma reflect the product, not the project history</h4><p>Instead of a pile of files named after sprints or experiments (‎dashboard_v2_final, ‎new-idea-jan), it helps to organise around real product areas:</p><ul><li>Navigation / workspace</li><li>User management</li><li>Billing</li><li>…</li></ul><p>Inside those files, people (and tools) can answer basic questions like “Which screens belong to Billing?” or “What’s the current user management flow?”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7poBiuiHKq7j46HUxpcBaw.png" /></figure><h4>Make it obvious what is “system” and what is “one‑off”</h4><p>MCP has more to work with when designs use <strong>reusable components</strong>, variables, and styles instead of one‑off frames.</p><p>In practice:</p><ul><li>Keep system pieces (buttons, inputs, cards, table rows, banners) in clearly marked component pages or libraries.</li><li>Use those components in screens and flows, instead of redrawing similar UI over and over.</li><li>Reserve “raw frames” for true one‑offs or early sketches.</li></ul><p>For MCP, this is the difference between:</p><ul><li>“Here is a ‎Button that’s part of the design system” vs</li><li>“Here is a blue rectangle with text that kind of looks like a button.”</li></ul><p>The first can be tied to actual implementations. The second is just pixels.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kBo2eiB9NeuYJawHUHjJcQ.png" /></figure><h4>Use product language in names, not visual nicknames</h4><p>Names carry most of the meaning in a file.</p><p>Good names:</p><ul><li>match the domain and product language (‎UserTable, ‎WorkspaceSidebar, ‎ReportFilters, ‎BillingSummaryCard),</li><li>stay stable even if the visual styling changes,</li><li>can be recognised by anyone reading a spec, PRD, or codebase.</li></ul><p>This is helpful for devs and PMs, and it’s also exactly what MCP tools read: <strong>component names, page names, descriptions</strong>.</p><blockquote>Clear names give AI a much better chance of choosing the right building blocks instead of inventing new ones.</blockquote><h4>Turn options and states into real properties</h4><p>Figma and MCP both treat variants, variables, and styles as meaningful.</p><p>For key components, it helps to explicitly model:</p><ul><li>options (different tones, sizes, layouts),</li><li>states (default, hover, pressed, disabled, loading, empty, error).</li></ul><p>When these are set up as component properties and variants (instead of a bunch of unlabeled duplicates), MCP can:</p><ul><li>tell which states exist,</li><li>understand how they relate,</li><li>use that information when generating code or docs.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qHI5_ZqudoYCcWj1eLj9dg.png" /></figure><h4>Keep the internal structure legible</h4><p>When MCP extracts node information, it’s effectively reading your component tree the way a developer reads a DOM or component hierarchy.</p><p>It helps if that tree:</p><ul><li>uses semantic names inside components (‎Avatar, ‎Title, ‎Meta, ‎Actions),</li><li>avoids very deep, unnecessary nesting (‎Group 23 / Frame 17 / Group 42),</li><li>keeps decorative wrappers obvious (‎Background, ‎Divider) and separate from content.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*inUJf3ErKwBG3AeDiUEFcQ.png" /></figure><p>This doesn’t change how the UI looks, but it makes it much easier to understand for people, and for MCP when it’s trying to turn that structure into code.</p><p>None of these habits require a specific stack (React, Vue, etc.) or even MCP itself. They’re the same foundations Figma pushes: strong design systems, consistent use of components, variables, and styles, and clear structure.</p><p>With MCP in the mix, these details don’t just help humans, they directly affect how well AI tools can read and build on top of your designs.</p><h3>5. Why this still matters without MCP</h3><p>It’s possible to ignore MCP and still benefit from this shift in perspective.</p><p>Seeing Figma as a kind of product database quietly improves a lot of day‑to‑day work:</p><ul><li>New designers understand the product faster without a guided tour.</li><li>Developers spend less time translating vague frames into real behaviour.</li><li>PMs and founders can browse designs and flows without constantly asking “which of these is real?”.</li><li>Design decisions become easier to reuse, not reinvent.</li></ul><p>If MCP enters the picture later, it simply becomes another consumer of the same clarity.</p><p>In the end, the question is not “How do we make Figma ready for AI?” but:</p><blockquote>How do we make Figma a place where the product is described clearly enough that anyone — human or machine — can build on it without guessing?</blockquote><p>Figma as a canvas is great for exploring ideas.</p><p>Figma as a database is what lets those ideas turn into a real, working product.</p><p>Most teams need both. MCP just makes the gap between them impossible to ignore.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7575d6f74688" width="1" height="1" alt=""><hr><p><a href="https://medium.com/design-bootcamp/your-figma-file-is-not-a-database-it-should-be-figma-mcp-just-exposed-the-gap-7575d6f74688">Your Figma file is not a database. It should be.</a> was originally published in <a href="https://medium.com/design-bootcamp">Bootcamp</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Product Case Study: Duolingo (Part 2)]]></title>
            <link>https://medium.com/@designedbythanh/product-case-study-duolingo-part-2-33d41a970eee?source=rss-cf281cdbf27c------2</link>
            <guid isPermaLink="false">https://medium.com/p/33d41a970eee</guid>
            <category><![CDATA[product-design]]></category>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[case-study]]></category>
            <dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
            <pubDate>Sun, 21 Jul 2024 12:40:20 GMT</pubDate>
            <atom:updated>2024-07-21T22:17:45.445Z</atom:updated>
            <content:encoded><![CDATA[<h3>Product Case Study Duolingo (Part 2)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9a2A_PMTa3iR2FZlXpjNnQ.png" /></figure><p>In <a href="https://medium.com/@thanh2.nguyen/product-case-study-duolingo-part-1-185331e12b06">Part 1</a>, we get started with the analysis of the Job-to-be-done, as well as the company’s values and its test-driven culture. Then, we delved into Duolingo Product Metrics, and how they balanced three goals User Growth, Monetization, and Educational Value to ride an incredible growth trajectory.</p><p>Part 2 will focus on Product Stickiness, and how Duolingo helps its users be motivated and form a habit of language learning.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Y2jBD-IP-rgWedfT" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_WfXwQ1FvI4BEw9I" /></figure><h3>Product Stickiness</h3><p>Games are a great example of sticky products. Many product designers try to “gamify” their apps by adding badges, rewards, and scoreboards.</p><p>But it isn’t that simple. Most people don’t play games just to earn virtual points and badges.</p><p><a href="https://medium.com/startup-grind/do-this-one-thing-to-make-your-product-sticky-aa8ed6d55797">The key here is the “core loop”.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZZS6syk8wjmVjwNh" /></figure><p>Duolingo does this in many ways to help users be motivated and form a habit of language learning.</p><p>Here are three worth highlighting:</p><p>(i) Streaks</p><p>(ii) Duolingo Plus Feature: Learning from Mistakes</p><p>(iii) Encouragements</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*h8SQyGO3y14EVKzt" /></figure><h3>(i) Streaks</h3><p>One of the product aspects the Duolingo team experimented with a lot, is the concept of the “streaks”, which is borrowed from the gaming industry.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*QZ2OnLhmc3dP0kEq" /></figure><p>Users start feeling invested and they try not to break this streak. The bigger it gets, the more they want to keep it. This feature plays a huge role in getting users hooked on learning.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UUX4RNS_VnvUm6b7" /></figure><p>Notification reminders to encourage users to come back…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wDRPYyLJh7YU6mKZ" /></figure><p>The Duolingo team knows how to make learners feel excited about their accomplishment milestones (one week, one month, one year streak, and beyond).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*SNNGcL4sIFfJSRo0" /></figure><p>… and make the streak sharable. This helps Duolingo grow super rapidly with better and more engaged users.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/961/0*P4iYWF9TWJGgVEVy" /></figure><p>🚀 The number of people with a streak of 7 days or longer, used to be about 20% of DAUs, and now it’s about 60%. Every day, thousands of people share their Duolingo streaks on <a href="https://twitter.com/duolingo/status/1480921168978878477">social media</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5xGdL-9B_bB8EGXa" /></figure><h3>(ii) Duolingo Plus Feature: Learning from Mistakes</h3><p>This is a new feature of the subscription service, Duolingo Plus, that engages and delights the subscribers on their language-learning journey. Learners love this feature because they can learn from their mistakes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UEQ9dCTIuUbjx74h" /></figure><p>The badge “broken heart” with the counter also motivates learners to practice their mistakes. Nothing feels more satisfying than turning their broken heart into a gold heart by correcting all their mistakes!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8RnsTrW8FoJ0btEO" /></figure><p>🔥 This feature generated very positive results for subscription growth and learner engagement, including a 5% increase in total subscription bookings.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*L6BKMLpkJwB8wLyS" /></figure><h3>(iii) Encouragement</h3><p>Positive emotions make the interaction between a user and the digital product more delightful. There’s no denying that the cute animations of the mascot, Duo the owl, make the whole learning experience joyful.</p><p>As you’re doing lessons, he will sometimes pop up to do things like encouraging. Messages like these seem small but they can bring a smile to users’ day. 🤗</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*w3iPBRLB4bp6jwcg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jZMvIQz6JO1x-7a5" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*chBBBB3aZQ1XvBJL" /></figure><h3>Duolingo Community</h3><p>Besides Product Stickiness, Duoling borrowed from the gaming industry the powerful concept of community.</p><p>They have a large and active community where learners can ask questions, learn from other users, swap tips, and share resources. 18K+ members on Duolingo Discord. Every day, thousands of them are enthusiastic fans of Duolingo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nbFE-_X9f7ybj77p" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zZODfXCq-qqd5dCc" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6J71dYkjNeumnZPA" /></figure><p>Hope you found some bits of this useful.</p><p>I’ll be doing product case studies to help us learn about best practices. Stay tuned!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hkc5A2peayYEr46B" /></figure><p>References</p><p><a href="https://medium.com/startup-grind/do-this-one-thing-to-make-your-product-sticky-aa8ed6d55797">Do this one thing to make your product sticky</a> ▪ <a href="https://www.youtube.com/watch?v=7kEW88V6hrM">Interview with Duolingo’s Chief Product Officer Jorge Mazal</a> ▪ <a href="https://startup.fiu.edu/gina-gotthilf-on-growing-duolingo-to-200-million-users/">Gina Gotthilf, VP of Marketing and Growth on growing Duolingo to 200 million users</a> ▪ <a href="https://blog.duolingo.com/streak-milestone-design-animation/">How we brought the streak milestone to life.</a> ▪ <a href="https://blog.duolingo.com/creating-a-new-plus-feature-helping-you-learn-from-your-mistakes/">New Plus feature: helping you learn from your mistakes.</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hkc5A2peayYEr46B" /></figure><p><em>Note: This is the next part of the product case study: Duolingo. I did write it on April 28, 2022 and shared it on my Linkedin profile.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=33d41a970eee" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Product Case Study Duolingo ( Part 1)]]></title>
            <link>https://medium.com/@designedbythanh/product-case-study-duolingo-part-1-185331e12b06?source=rss-cf281cdbf27c------2</link>
            <guid isPermaLink="false">https://medium.com/p/185331e12b06</guid>
            <category><![CDATA[edtech]]></category>
            <category><![CDATA[product-design]]></category>
            <category><![CDATA[saas]]></category>
            <category><![CDATA[product]]></category>
            <category><![CDATA[product-management]]></category>
            <dc:creator><![CDATA[Thanh Nguyen]]></dc:creator>
            <pubDate>Fri, 22 Apr 2022 22:56:45 GMT</pubDate>
            <atom:updated>2025-01-12T08:56:21.314Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Product Case Study Duolingo (Part 1)</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gFcSzZIAECPZpmXn" /></figure><p>Don’t make the mistake of going to Paris without knowing the language. 😜</p><p><a href="https://www.youtube.com/watch?v=C49RvmggF-g?rel=0&amp;start=74&amp;end=130&amp;autoplay=0.">Don&#39;t Be *That* Kind of Emily in Paris-Learn Some French, First</a></p><p>You’ve probably heard of Duolingo, an app where you can learn languages through super-fun gamification.</p><p>Recently I installed Duolingo. Impressed by the learning experience, I tried to dig deeper into how Duolingo nailed its product and became the №1 education app.</p><p><strong>Some key statistics</strong></p><ul><li>Duolingo has over 500 million registered users and 42 million monthly active users.</li><li>The company experienced a huge surge during the pandemic but carried substantial gains through 2021. In 2020, $161 million in revenue, an increase of 129% year-on-year. In 2021, $294 million in revenue, an increase of 55% over the prior year.</li><li>In July 2021, Duolingo became one of the few Ed-Tech companies that entered IPO.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ONP6i36IMQV_pbQW" /></figure><p>With a fantastic growth trajectory, Duolingo has demonstrated how technology has changed education.</p><p>How is that possible?</p><p>In this product case study, I will cover the following sections.</p><p>(a) Analysis of the Job-to-be-done</p><p>(b) Product Metrics</p><p>(c) Product Tradeoff Triangle</p><p>(d) 1% improvement every week</p><p>(e) Product Stickiness</p><p>(f) Monetization</p><h3><strong>(a) Analysis of the Job-to-be-done</strong></h3><p>The <strong>job</strong> that Duolingo’s users are <strong>hiring</strong> the product for is:</p><p><strong>Help me learn a new language in a fun, effective, and accessible way. I don’t want to spend too much time, money, or effort on learning a new language.</strong></p><p>Founded in 2011 by Luis Von Ahn (known for his work in re-CAPTCHA) and Severin Hacker, Duolingo started with a question: What if education can be free and high-quality for everyone?</p><p>Over the past decade, Duolingo has re-invented the way we learn and do business</p><ol><li><strong><em>Give the product away for free.</em></strong><em> They have a principle to never change: all of Duolingo’s 100+ language courses in 40+ languages are fully accessible to users for free.</em></li><li><strong><em>Make learning fun</em></strong><em>. Learning a language is really hard work, and the hardest part is staying motivated. Gamification is the key to getting learners to stick with it. - </em><a href="https://blog.duolingo.com/duolingos-values-a-letter-from-the-ceo/"><em>Luis Von Ahn, CEO of Duoling</em>o</a></li></ol><h3><strong>(b) Product Metrics</strong></h3><p>Duolingo is a consumer subscription product. It works on the freemium model with the free model having ads and online-only access.</p><p>The team cares about:</p><ul><li>Engagement Growth</li><li>Revenue Growth</li><li>Learning Experience</li></ul><p><strong>The company chooses DAUs (Daily Active Users) as their </strong><a href="https://future.a16z.com/north-star-metrics/"><strong>North Star Metric</strong></a><strong>.</strong></p><blockquote><em>North Star Metric is a guiding metric, all energy and brainpower will flow in that direction. It gives the company a sense of whether what is going or isn’t working out.</em></blockquote><p>The Duolingo team also invests in other metrics which help leverage their North Star Metric.</p><p>For example, number of lessons completed, lessons completed per session, number of minutes spent on Duolingo per session, and number of average total minutes per day per user. They also look at the number of people who get from a certain part in the learning tree to another part.</p><p><a href="https://www.youtube.com/watch?v=7kEW88V6hrM">Jorge Mazal</a>, Chief Product Officer at Duolingo, said that they run modeling on different metrics, and identified a metric that turned out to be super high leverage, which was <strong>CRR (Retention Rate)</strong>. They put a team just to optimize that metric. The more they can keep users engaged, the more they’ll add paid users.</p><h3>(c)<strong> Product Tradeoff Triangle</strong></h3><p>The team cares about Engagement, Monetization, and Educational Value. That’s why they create 3 teams to work on these 3 goals. Each team is responsible to improve the metrics linked to its specific goals.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TrJTmsvBLANIrnIP1ll7-w.png" /></figure><p>There are synergies between these goals but also many tensions between them.</p><p>How does the Duolingo team find a balance?</p><p><strong>They stick to their guardrail metrics that never change.</strong></p><p>At Duolingo, these guardrail metrics are engagement and retention, and not monetization. They have taken the long view of the business and do not sacrifice long-term usage for short-term gain.</p><blockquote>G<em>uardrail metrics keep organizations and product teams on the right track and aligned with business goals and values.</em></blockquote><h3><strong>(d) 1% improvement every week</strong></h3><p>Duolingo is one of the best examples of product-led growth. They use their product as a primary driver of customer acquisition, conversion, expansion, and retention.</p><p>The company has built a strong test-driven culture.</p><p><strong>“Test everything”</strong>, they rely on experiments and data to make decisions from small ones like updating a single button in the app to launching a new major feature like Leaderboards.</p><p>Any team member is empowered to propose and run experiments. It’s common to have 100s experiments running simultaneously in a week. Duolingo team members believe that they are improving their app by 1 percent each week.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BGvqbxHoRYEFi8NM" /></figure><p>If you enjoy this post, check out the exciting continuation of Part 2 (<a href="https://medium.com/@thanh2.nguyen/product-case-study-duolingo-part-2-33d41a970eee">Link here</a>).</p><p>You will learn some Product Stickiness Ideas and how Duolingo helps its users be motivated and form a habit of language learning. 😉</p><p><strong>References:</strong></p><p><a href="https://blog.duolingo.com/duolingos-values-a-letter-from-the-ceo/"><em>Duolingo’s values: a letter from the CEO</em></a></p><p><a href="https://capital.com/exclusive-how-duolingo-duol-educates-the-world-and-rewards-investors"><em>How Duolingo (DUOL) educates the world and rewards investors</em></a></p><p><a href="https://future.a16z.com/north-star-metrics/"><em>Choosing Your North Star Metric</em></a></p><p><a href="https://www.youtube.com/watch?v=7kEW88V6hrM"><em>Interview with Duolingo’s Chief Product Officer Jorge Mazal</em></a></p><p><a href="https://startup.fiu.edu/gina-gotthilf-on-growing-duolingo-to-200-million-users/"><em>Gina Gotthilf, VP of Marketing and Growth on growing Duolingo to 200 million users</em></a></p><p><a href="https://medium.com/geekculture/how-duolingo-runs-experiments-at-scale-426ad8351d97"><em>How Duolingo Runs Experiments at Scale</em></a></p><p><a href="https://growrevenue.io/duolingo-ab-testing-process/"><em>Duolingo A/B testing process: 1% improvement every week</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=185331e12b06" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>