Collect conversion reasons where users hesitate

Identify the user on your side. Track a moment. They pick one reason.

Install

Identify the user on your side. Track a moment. They pick one reason.

Open playground
<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
  }
})

The paywall conversion loop

Stop collecting reasons that never become revenue work.

Run the demo, leave one objection, and watch it enter the closed loop.

Free · no card · one script · no Stripe secret