UUserSay
MyMap.ai
V

Setup

Configure how your AI researcher works. Changes apply to new conversations.

PRODUCT
We'll read your homepage to pre-fill product context.
Imported from https://mymap.ai — review and edit below.
The more context, the sharper Sarah's questions.
Sarah knows these exist but won't mention them — she'll let users surface them naturally.
RESEARCH
Sarah's north star. She'll build every conversation around this.
Sarah weaves this in if the conversation allows.
Sarah weaves these into the conversation naturally. More topics = longer interviews.
Sarah will work these in when the moment is right.
CONVERSATION
Claude Sonnet 4.6RECOMMENDED~$0.02 / interview
Best balance of insight quality and cost
Claude Opus 4.6~$0.08 / interview
Deepest reasoning for nuanced, complex research
Credits exhaustedRECOMMENDED
Highest signal — they just hit the paywall
Day 7 of paid plan
They know enough to have real opinions
7 days inactive
Catch them before they ghost
Visited /pricing
They're already thinking about money
Custom trigger
Fire from your own code when the moment is right
// Call from anywhere in your app UserSay.trigger({ event: "cancelled_subscription", user: { id: user.id, plan: "pro" }, meta: { reason: "too_expensive" } }) // More examples: // UserSay.trigger({ event: "completed_onboarding" }) // UserSay.trigger({ event: "hit_api_limit" })
These become structured fields in your Library. Sarah shapes the interview to collect them.
A small incentive boosts completion from ~30% to ~70%.
GENERATED SYSTEM PROMPT
This is the system prompt Sarah uses in every interview. It's auto-generated from your config above. Review it to make sure Sarah sounds right.
INSTALL
Add the SDK to your app — one script tag + trigger calls
<!-- Step 1: Add SDK (once, in your <head> or before </body>) --> <script src="https://usersay.ai/usersay-sdk.js" data-project="mymap" async></script> <!-- Step 2: Identify user after login --> <script> UserSay.identify({ uid: user.id, // your user's ID plan: user.plan, // optional: 'free', 'pro', etc. credits: user.credits // optional: current credit balance }); </script> <!-- Step 3: Trigger when the moment is right --> <script> // Credits exhausted if (user.credits <= 0) { UserSay.trigger('credits_exhausted'); } // Day 7 of paid plan if (daysSinceUpgrade(user) === 7) { UserSay.trigger('day_7_paid'); } // Visited /pricing if (location.pathname === '/pricing') { UserSay.trigger('pricing'); } // Handle completion (optional) UserSay.onComplete(function() { addCredits(user.id, 50); showToast('Thanks! 50 credits added.'); }); </script>
The SDK handles the modal, iframe, dedup (won't re-show after dismiss/complete), and postMessage. You just call UserSay.trigger() at the right moment.
Try the embed demo →
Interactive mock of how the SDK works inside MyMap.