BlogAnalytics

Your users are telling you your roadmap, in writing, every day. It's in your prompt logs

Founders pay for interviews and beg for survey responses to learn what people are actually trying to do. Meanwhile, your users type their intent into your product, in their own words, hundreds of times a day - and nobody performs for a prompt box.

The largest research corpus you own

Founders pay for user interviews, beg for survey responses, and squint at session recordings - all to answer one question: what are people actually trying to do with my product? Meanwhile, if your product is AI-powered, users type their intent into it, in their own words, hundreds of times a day. The prompt log is the largest user-research corpus you own, and it's the only one with zero observer bias: nobody performs for a prompt box. The reason nobody mines it: reading ten thousand prompts is a job. Summarizing one user's prompts into "what is this person trying to accomplish" used to be an intern-week. Now it's an API call.

The per-user research memo

My app meters AI usage through Vevee (@vevee/sdk) with prompt logging enabled. compose() can use those prompts as a data source, which makes per-user intent analysis one call:

This whole setup requires prompt logging, which is opt-in per app. When enabled, track and reserve calls carry the prompt and Vevee stores it alongside the event; compose() can then use those prompts as a data source. No opt-in, no corpus.
import { createClient } from "@vevee/sdk";

const vevee = createClient({ apiKey: process.env.VEVEE_SECRET_KEY! });

interface IntentMemo {
  jobToBeDone: string;       // what they're actually trying to accomplish
  workarounds: string[];     // signs they're fighting the product
  unmetNeeds: string[];      // things they ask for that we don't do
  vocabulary: string[];      // THEIR words for what we call our features
  fitVerdict: "core" | "adjacent" | "wrong_tool";
}

const memo = await vevee.compose<IntentMemo>(
  "user-intent-memo",
  userId
);

if (memo.status === "generated") {
  await appendToResearchDoc(userId, memo.output);
}

What it surfaces that interviews don't

The compose type's prompt: "From this user's recent prompts and usage, describe the job they are hiring this product to do - in their framing, not ours. List workarounds (repeated rephrasing, manual chaining, fighting defaults). List asks the product doesn't support. Quote their actual vocabulary. Verdict: is this our core use case, an adjacent one, or the wrong tool?" Data sources: user prompts, user events, user usage. Run it weekly over your 30 most active users and you have a standing research panel that never gets interview fatigue. A real memo from my batch:

  • Job to be done: staging real-estate photos for rental listings - every prompt is "empty room, scandinavian furniture, bright" variants.
  • Workarounds: runs the same prompt 4-6 times and keeps one - no way to lock a style and batch. Manually numbers outputs ("listing 23 bedroom") - using prompts as a filing system.
  • Unmet needs: asked twice for "same furniture as last image, different angle" - we don't do consistency across generations.
  • Vocabulary: says "staging," never "generation." Calls presets "my setups."
  • Verdict: core.

Three roadmap items and a landing-page rewrite

That's three roadmap items and a landing-page rewrite in one memo. The vocabulary line alone is worth the setup: my pricing page said "AI image generation," my best users say "staging." Guess whose words convert better - and a compose-personalized paywall can now speak in the user's own terms. Aggregate the memos and the founder questions answer themselves: when five heavy users share an unmet need, that's a roadmap with receipts. When fitVerdict says "wrong_tool" for a loud feature-requester, that's a no you can say with confidence. When churned users' memos show workarounds piling up in week 3, you've found the leak.

The part you must not skip

Prompts are the most sensitive data you hold. The setup only works inside the consent and hygiene the platform enforces - and they're load-bearing, not legal garnish:

  • Prompt logging is opt-in per app, fields are capped and truncated server-side, and retention is short by design - days, not forever; logs are purged on a schedule.
  • Users who opted out of AI personalization come back as opted_out: no memo, no prompt assembled into anything. The discriminated-union return type makes the branch unskippable.
  • The memos describe use cases; treat them as research artifacts, not surveillance. Quote vocabulary, not paragraphs.

The corpus that was there all along

User interviews tell you what people say they do, analytics tell you that they did something, and prompts tell you what they were trying to do - including every attempt that failed. That third corpus has been sitting in your logs the whole time. The only thing that changed is that reading it now costs a fraction of a cent per user (usage.costMicroUsd, capped by a monthly budget) instead of a week.

See your own numbers in two minutes.Add the SDK and your users, costs and revenue fill in on the next request.
Join waitlist

Keep reading

ShareCopy a link to this post.

Set your first limit in about five minutes.

50k operations free every month. No card required.
Join waitlist