The easiest AI product to build is a demo. A user provides input, a model returns something surprising, and for a moment the experience feels like magic. The difficult part begins after that moment: why should the user return tomorrow?
Consumer mobile products operate under a harsh constraint. They compete for a small amount of attention against mature products that already own a habit. Adding a model does not remove that constraint. It raises the user’s expectations while introducing latency, uncertainty, cost, and new ways to break trust.
I use the following framework to move from a raw model capability to a product that can earn repeated use.
1. Start with the recurring job, not the model
A new model release naturally creates solution-first thinking: it can see images, reason over documents, generate audio, or hold a longer conversation. These capabilities are useful ingredients, but they are not a product definition.
The stronger starting point is a recurring situation in a user’s life. What happens often enough to justify an app? What is frustrating, emotionally important, expensive, or slow? What does the user want to feel or accomplish when the session ends?
Define the product in terms of a repeated user outcome. Choose the model only after the outcome is clear.
This changes the first version. Instead of exposing every capability, it narrows the interface around one job. Inputs become easier to understand, outputs become easier to evaluate, and the product has a clearer reason to exist.
A useful test is to complete this sentence without mentioning AI: “When ___ happens, this product helps me ___.” If the sentence is vague, more model features will not fix the positioning.
2. Design the return loop before the feature list
A habit is not the same as a notification schedule. It is a loop in which a real trigger leads to an action, the product delivers value, and previous use makes the next session better or easier.
For an AI consumer app, the loop often has four parts:
- Trigger: a recurring question, task, emotion, or piece of new information.
- Low-friction input: the smallest amount of context needed to begin.
- Useful resolution: an answer, creation, recommendation, or completed task that feels specific to the user.
- Accumulated value: history, preferences, saved work, progress, or personal context that improves the next session.
The fourth part matters most. If every session starts from zero, the app is easy to replace. When the product remembers appropriately, preserves useful work, and reduces repeated setup, continued use becomes rational rather than artificially forced.
Accumulated value must remain under user control. Memory should be visible enough to understand, editable where practical, and removable. Retention built on hidden data practices eventually becomes a trust problem.
3. Treat the AI as a system, not a single API call
In production, output quality is shaped by far more than the model name. The complete path includes input validation, context assembly, prompt or instruction management, model routing, tool calls, timeouts, retries, moderation, output parsing, caching, analytics, and fallback behaviour.
This is why a product can become less reliable even after moving to a more capable model. A larger context can introduce irrelevant information. An unconstrained output can break the interface. A retry can duplicate a paid action. A remote prompt change can improve one language and damage another.
I prefer to make these layers explicit. Prompts and model configuration should be versioned. Structured outputs should be validated. Expensive or risky operations should be idempotent. Timeouts need a useful recovery path. Analytics should identify the configuration that produced an outcome without collecting unnecessary private content.
The goal is not to eliminate uncertainty; generative systems are probabilistic. The goal is to place boundaries around that uncertainty so the rest of the product behaves predictably.
4. Build trust visibly
AI products ask users to tolerate two kinds of uncertainty: what the system will produce and what happens to the information they provide. Product design must address both.
Trust is built through small, concrete behaviours:
- Explain what input is needed and why.
- Show progress when generation takes time.
- Preserve user input when a request fails.
- Distinguish generated suggestions from verified facts.
- Provide a path to retry, edit, report, or delete.
- Set clear boundaries for sensitive or high-stakes use cases.
A confident interface should not pretend the model is infallible. The strongest experience tells the user what the system can do, gives them control when it cannot, and avoids making certainty part of the visual style.
5. Measure behaviour across the whole loop
Generation count is an operational metric, not a product outcome. It says that the system ran. It does not say whether the result helped.
I separate measurement into four layers:
| Layer | Question | Example signals |
|---|---|---|
| Activation | Did the user reach useful value? | Completed first result, time to value, setup abandonment |
| Quality | Was the result usable? | Save, share, edit, regenerate, report, explicit feedback |
| Reliability | Did the system behave correctly? | Latency, timeout rate, parsing failure, fallback rate |
| Retention | Did value create a reason to return? | Return by use case, repeat completion, accumulated artefacts |
The useful unit of analysis is a user journey, not an isolated screen event. A paywall conversion can look positive while long-term retention declines. A cheaper model can reduce cost while increasing regenerations. A faster onboarding can attract more users who never reach the core value.
Good instrumentation keeps these trade-offs visible. It also records experiment exposure so a team can connect behaviour to the exact product and model configuration a user experienced.
6. Make every release improve the system
Small teams cannot win by treating every app, locale, experiment, and release as a separate operation. The advantage comes from turning repeated work into shared infrastructure and reusable judgment.
That can mean a common layer for model configuration, analytics conventions, subscription state, localisation checks, release automation, prompt evaluation, or failure reporting. The exact abstraction matters less than the discipline: when a problem appears twice, ask whether the solution should become part of the operating system.
A portfolio becomes smarter when lessons move between products faster than mistakes repeat.
There is a danger here. Shared systems can spread a bad assumption just as efficiently as a good one. Reuse should therefore include versioning, controlled rollout, observability, and a way for individual products to opt out when their context differs.
A practical release gate
Before shipping an AI-powered consumer feature, I want clear answers to these questions:
- What recurring user job does this feature complete?
- What makes the second session better than the first?
- What happens on timeout, invalid output, or model refusal?
- Which information is stored, for how long, and under whose control?
- How will we distinguish novelty from useful value?
- Can we identify the prompt, model, and configuration behind an outcome?
- What part of this implementation should become reusable infrastructure?
If those answers are missing, the feature may still make a good demo. It is not yet a dependable product.
The real product is the loop
Models will keep changing. Costs will fall, context windows will grow, and today’s impressive capability will become a commodity. A durable consumer product cannot depend on permanent access to surprise.
Its advantage is the loop around the model: a sharply defined job, low-friction interaction, accumulated value, visible trust, reliable infrastructure, and a measurement system that helps the team learn. That is the distance between an AI capability someone tries and a product they choose to keep.