别人要怎么用 MorePaying

把组件指到 MorePaying。先在试用页看见第一张每周判断,再付费。

永远不要把 Stripe 密钥发给 MorePaying。只同步总额和 customer id。

  1. 1

    永远不要把 Stripe 密钥发给我们

    钱只只读。sk_live / webhook 密钥留在你们自己的服务器。我们只存总额和 customer id。

  2. 2

    在付费墙 identify

    带上用户、渠道/UTM、套餐、注册时间、生成次数、是否第一次成功、剩余额度、价格页停留、Stripe 金额。顾客只选一个原因。

  3. 3

    在产品里问,不要发邮件

    邮件问卷没人回。identify 之后,track("pricing_exit") 或 track("paid") 会弹出一题。那就是框。不要再接邮件服务商。

  4. 4

    把漏斗数上

    打开定价页就 track("pricing_view")。离开或付钱再 track("pricing_exit") / track("paid")。327 / 84 / 31 就是这样来的。

  5. 5

    用你们自己的 Stripe 对上 paying

    在你们服务器列订阅或收 webhook。POST /api/stripe/sync,带 currentAmountCents、currentCustomers,以及 { stripeCustomerId, amountCents, status, userId }。计分板来源变成 stripe。

  6. 6

    上线之后 more paid 要动

    代理 pick → ready(提交要有 MorePaying-Ready: <id>)→ release --through <线上 SHA>。发布会拍下当前 paying,并把挡住的收入记到计分板上。之后 Stripe 同步填 7 / 14 / 30 天窗口。

  7. 7

    每周打开一页

    周一打开 /report:原因、渠道、三个合并后的失败模式、该做的实验、挡住的收入。CSV 已经有。Slack 等有了真客户再接。不要发邮件问卷。

怎么工作

  1. 1

    捕捉

    identify 之后,track(pricing_exit) 或 track(paid) 在产品里弹出一题。不要发邮件问卷。

  2. 2

    对照

    选项汇总成挡住的收入。用户原话只是假说,要对上用量。

  3. 3

    代理领走

    MCP / CLI / /morepaying pick。发布后可以通知那个人。

  4. 4

    上线

    公开板:已收到 → 处理中 → 待发布 → 已上线。分数是 more paid this period。

为什么重要

  • 只问一句

    付钱/不付钱用固定选项。顾客看不到套餐和美分。

  • 也问为什么付

    支付成功是一等公民,不是附录。

  • 挡住的收入

    原因 × 人数 × 金额。先改这一件,别先降价。

  • 信任核对

    用户那句话只是假说。剩余额度和免费已够用会被标出来。

  • MCP + CLI + Skills

    list、pick、ready、release、notify、paying。

  • 更多实付计分板

    基线对当前 paying amount。座位是套餐,增量是分数。

  • 渠道 × 钱

    哪个来源付了钱,哪个只挡住收入。在产品里问,不要发邮件。

接到现有付费墙

先接有真实付费墙的站。Widget 已经允许跨域。不要把 sk_live 或用户邮箱写进浏览器。

MKSaaS 额度站(seedvr2 / plain / aiupscale / happyhorse)

<!-- layout: once -->
<script src="https://morepaying.charlie0simmon.workers.dev/widget.js"></script>
<script>
  MorePaying.init({
    projectKey: "mp_proj_YOUR_KEY",
    apiBase: "https://morepaying.charlie0simmon.workers.dev"
  })
</script>

// after session + credits load
MorePaying.identify({
  userId: session.user.id,          // hash if you do not want raw ids on the board
  plan: session.user.plan,
  creditsRemaining,
  creditsLimit,
  firstSuccess,
  generations,
  utmSource: url.searchParams.get("utm_source"),
  channel: session.user.channel
})

// PricingPopup open
MorePaying.track("pricing_view")

// PricingPopup closes without a purchase
// seedvr2: replace PricingDismissFeedback with this one question
// plain / aiupscale / happyhorse: hook onOpenChange(false)
MorePaying.track("pricing_exit")

// first paid-looking result
MorePaying.track("first_result")

// webhook / server only — totals, never sk_live
POST https://morepaying.charlie0simmon.workers.dev/api/stripe/sync
X-Project-Key: mp_proj_YOUR_KEY
{ "currentAmountCents": 315000, "currentCustomers": 24, "customers": [] }

ShipAny 额度站(hunyuan / longcat / lyria / trellis)

现在额度不够只 toast,人就走了。接上时要打开定价页,并弹出这一题。

<!-- layout: once -->
<script src="https://morepaying.charlie0simmon.workers.dev/widget.js"></script>
<script>
  MorePaying.init({
    projectKey: "mp_proj_YOUR_KEY",
    apiBase: "https://morepaying.charlie0simmon.workers.dev"
  })
</script>

MorePaying.identify({
  userId: user.id,
  plan: user.plan || "free",
  creditsRemaining: remainingCredits,
  creditsLimit
})

// today: toast.error(insufficient_credits) and the user leaves
// change: open /pricing AND ask
if (!hasEnoughCredits) {
  MorePaying.track("pricing_view")
  MorePaying.track("pricing_exit")
  router.push("/pricing")
  return
}

安装

Skill 给工作流,MCP/CLI 读写信号。发布仍留在 CLI,方便核对部署 SHA。

$ npx -y --package github:CharlieLZ/morepaying -- morepaying
$ npx -y --package github:CharlieLZ/morepaying -- morepaying-mcp
# copy packages/skills/morepaying/SKILL.md into your agent skills folder
MorePaying.init({
  projectKey: "mp_proj_YOUR_KEY",
  apiBase: "https://morepaying.com",
  userTokenFn: async () => {
    const res = 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 res.json()).token
  }
})

MorePaying.identify({
  userId: currentUser.id,
  plan: currentUser.plan,
  usage: currentUser.usageLabel,
  signedUpAt: currentUser.createdAt,
  generations: currentUser.generations,
  firstSuccess: currentUser.firstSuccess,
  creditsRemaining: currentUser.creditsRemaining,
  creditsLimit: currentUser.creditsLimit,
  utmSource: url.searchParams.get("utm_source"),
  channel: currentUser.channel,
  pricingDwellMs: dwellMs,
  stripeCustomerId: currentUser.stripeCustomerId,
  stripeAmountCents: currentUser.amountCents,
  stripeStatus: currentUser.stripeStatus
})

MorePaying.track("pricing_view")
// later
MorePaying.track("pricing_exit")

// on your server, never in the browser
POST /api/stripe/sync
X-Project-Key: mp_proj_YOUR_KEY
{
  "currentAmountCents": 315000,
  "currentCustomers": 24,
  "customers": [
    { "stripeCustomerId": "cus_123", "amountCents": 2000, "status": "active", "userId": "usr_123" }
  ]
}

每周判断可以直接分享。开始用不需要另买主机。

先看本周判断,再付费

别再猜他们为什么没付钱。

他们不升级时问一句。看着卡片出现在板上。

现在免费。Free 不用绑卡。付费方案走 pay.yito.ai。