别人要怎么用 MorePaying
把组件指到 MorePaying。先在试用页看见第一张每周判断,再付费。
永远不要把 Stripe 密钥发给 MorePaying。只同步总额和 customer id。
第 1
永远不要把 Stripe 密钥发给我们
钱只只读。sk_live / webhook 密钥留在你们自己的服务器。我们只存总额和 customer id。
第 2
在付费墙 identify
带上用户、渠道/UTM、套餐、注册时间、生成次数、是否第一次成功、剩余额度、价格页停留、Stripe 金额。顾客只选一个原因。
第 3
在产品里问,不要发邮件
邮件问卷没人回。identify 之后,track("pricing_exit") 或 track("paid") 会弹出一题。那就是框。不要再接邮件服务商。
第 4
把漏斗数上
打开定价页就 track("pricing_view")。离开或付钱再 track("pricing_exit") / track("paid")。327 / 84 / 31 就是这样来的。
第 5
用你们自己的 Stripe 对上 paying
在你们服务器列订阅或收 webhook。POST /api/stripe/sync,带 currentAmountCents、currentCustomers,以及 { stripeCustomerId, amountCents, status, userId }。计分板来源变成 stripe。
第 6
上线之后 more paid 要动
代理 pick → ready(提交要有 MorePaying-Ready: <id>)→ release --through <线上 SHA>。发布会拍下当前 paying,并把挡住的收入记到计分板上。之后 Stripe 同步填 7 / 14 / 30 天窗口。
第 7
每周打开一页
周一打开 /report:原因、渠道、三个合并后的失败模式、该做的实验、挡住的收入。CSV 已经有。Slack 等有了真客户再接。不要发邮件问卷。
怎么工作
- 1
捕捉
identify 之后,track(pricing_exit) 或 track(paid) 在产品里弹出一题。不要发邮件问卷。
- 2
对照
选项汇总成挡住的收入。用户原话只是假说,要对上用量。
- 3
代理领走
MCP / CLI / /morepaying pick。发布后可以通知那个人。
- 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 folderMorePaying.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" }
]
}每周判断可以直接分享。开始用不需要另买主机。