Collect conversion reasons where users hesitate
Identify the user on your side. Track a moment. They pick one reason.
<script src="/widget.js"></script>
<script>
MorePaying.init({
projectKey: "mp_proj_YOUR_KEY",
locale: "en",
tabText: "One question",
brandColors: {
primary: "#10b981",
hover: "#059669",
active: "#047857",
onPrimary: "#ffffff"
}
})
</script>What it captures
- Moments — signup, first result, pricing exit, checkout, upgrade, paid, cancel
- One fixed reason. Optional sentence only if they pick Other
- Plan, usage, user id, channel/UTM, signed-up-at, generations, first success, remaining credits, pricing dwell, Stripe amount from identify()
- URL, title, viewport, user agent, console errors
- Optional element pin (CSS selector) plus a truncated DOM snapshot of that node
- Short-lived user token from userTokenFn — minted on your server
Ask at a moment
MorePaying.identify({
userId: "usr_123",
plan: "free",
usage: "12/50",
signedUpAt: "2026-08-01T00:00:00.000Z",
generations: 12,
firstSuccess: true,
creditsRemaining: 38,
creditsLimit: 50,
channel: "twitter",
stripeCustomerId: "cus_123",
stripeAmountCents: 0,
stripeStatus: "none"
})
MorePaying.track("pricing_view")
MorePaying.track("pricing_exit")
MorePaying.track("paid")Reporter identity
For signed-in users, mint a short-lived token on your server. Never put the signing secret in browser code.
MorePaying.init({
projectKey: "mp_proj_YOUR_KEY",
locale: "en",
userTokenFn: async () => {
const response = await fetch("/api/identity-token", {
method: "POST",
headers: { "Content-Type": "application/json", "X-Project-Key": "mp_proj_YOUR_KEY" },
body: JSON.stringify({ userId: currentUser.id })
})
return (await response.json()).token
}
})