AI features users actually pay for (and the ones they do not)
After building AI features into a dozen products, a clear pattern emerged: users pay for AI that finishes a task they already had, not AI that starts a conversation they did not.
Emily Watson
AI/ML Engineer
June 20, 2026
8 min read
Every client meeting in 2024 had the same slide: "and then we add AI." Most of those features shipped. Some are now the headline of the product. Most are quietly behind a settings toggle. The difference was never model quality — it was whether the feature sat on a task the user already had to do.
The pattern: finishers win, chatters lose
Across the dozen products, the AI features that retained users all do the same structural thing: they take a task that already exists in the workflow and compress it. Draft the support reply. Extract the invoice fields. Score the lead. The user was going to do this anyway; the AI does the first 80% and the human keeps judgment.
- →PAID: "Draft the reply" — support copilots with citations, tone-matched to the brand. Users review, edit 20%, send.
- →PAID: "Extract the fields" — document intelligence. Boring, measurable, ROI calculable in one spreadsheet.
- →PAID: "Rank the queue" — lead scoring, ticket triage, alert prioritization. Saves attention, not just time.
- →NOT PAID: "Chat with your data" — without workflow integration, it is a demo with a text box. Usage decays in weeks.
- →NOT PAID: Generic chatbots — users detect the deflection and churns correlate. If the bot cannot resolve, do not deploy the bot.
Grounding is the product
The unglamorous engineering around the model is what users experience as "it works." Every feature users paid for has the same skeleton: a retrieval layer over clean, permissioned data; citations shown in the UI; an evaluation harness that scores outputs before they ship; and a fallback path when confidence is low. The model is a component. The skeleton is the product.
def answer(question: str, user: User) -> Answer:
# 1. Retrieve from permissioned, user-scoped data only
docs = retrieve(question, scope=user.org_scope)
# 2. Generate with citations enforced structurally
draft = generate(question, context=docs, require_citations=True)
# 3. Evaluate before the user sees it
if not harness.passes(draft, min_confidence=0.7):
return fallback_to_human(question, user)
return draftUnit economics, modeled before the roadmap slide
One number ends more AI features than any technical failure: cost per task. If the AI feature costs $0.40 per support ticket and saves 6 minutes of a $30/hour agent, it is a fantastic business. If it costs $4 per ticket, no amount of demo magic saves it. We model cost per task at three usage levels before any AI feature goes on a roadmap — and caching, smaller-model routing, and batch inference are design constraints from day one, not optimizations bolted on later.
Nobody ever churned because your feature used a smaller model. People churn when the feature costs more than it saves.
A practical test before you build
- →Does the user already have this task without AI? (If no, you are inventing work.)
- →Can you name the human who does this task today, and what it costs?
- →Is wrong output recoverable in one step? (If not, add the fallback first.)
- →Do you have the data it needs, permissioned and clean? (Retrieval quality is the ceiling.)
- →Can you price it against the saved time and still keep 10x margin?
If the answer to all five is yes, build it — and expect the boring parts (evaluation, grounding, fallbacks) to be 80% of the engineering. That 80% is what your users will experience as magic.
have-a-project-like-this
This is the kind of thinking we bring to client work. If it resonates, the discovery call is free.
Talk to uskeep-reading
Engineering · 8 min
Next.js 16 in production: what we learned shipping 12 apps
Turbopack is no longer optional, cache components change how you think about data, and partial prerendering quietly became the default. Our field notes from twelve production upgrades.
Design Systems · 7 min
Design tokens: the contract between design and code
Most token systems fail silently — a Figma variable nobody renames, a hex value pasted into a component at 11pm. Here is the token architecture we use to keep design and code honest.