返回顶部
s

subscription-revenue-tracker订阅收入追踪

>

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.1.0
安全检测
已通过
176
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

subscription-revenue-tracker

订阅收入追踪器

追踪SaaS和订阅业务的MRR/ARR、流失率、NRR、群组留存率和LTV。生成投资者级指标和清晰的会计分录。



核心指标定义


指标公式重要性
MRR所有活跃周期性月度收入之和业务脉搏
ARR
MRR × 12 | 面向投资者的年化规模指标 |
| 新增MRR | 本月新客户收入 | 增长引擎 |
| 扩展MRR | 现有客户升级/增购 | 效率信号 |
| 收缩MRR | 现有客户降级 | 负面信号 |
| 流失MRR | 取消导致的收入损失 | 留存健康度 |
| 净新增MRR | 新增 + 扩展 − 收缩 − 流失 | 净增长 |
| 总流失率 | 流失MRR / 期初MRR | 收入衰减率 |
| 净收入留存率(NRR) | (期初 + 扩展 − 收缩 − 流失) / 期初 | 现有客户基础增长 |
| LTV | ARPU / 总流失率 | 客户经济价值 |
| CAC | 销售+营销支出 / 新客户数 | 获客成本 |
| LTV:CAC | LTV / CAC | 单位经济健康度(目标: >3倍) |
| 回收期 | CAC / (ARPU × 毛利率) | 回收获客成本的月数 |


工作流

1. 从Stripe提取MRR

bash

列出所有活跃订阅及其金额


stripe subscriptions list \
--status=active \
--limit=100 \
--expand[]=data.items.data \
2>&1 | jq
.data[] | {
id: .id,
customer: .customer,
status: .status,
currentperiodstart: (.currentperiodstart | strftime(%Y-%m-%d)),
mrr: (.items.data[0].price.unit_amount / 100 *
(if .items.data[0].price.recurring.interval == year then 1/12 else 1 end))
}

通过Stripe API获取MRR摘要(无需CLI):
bash
curl https://api.stripe.com/v1/subscriptions?status=active&limit=100&expand[]=data.items.data \
-u skliveYOUR_KEY: | jq
[.data[] |
(.items.data[0].price.unit_amount / 100) *
(if .items.data[0].price.recurring.interval == year then 1/12 else 1 end)
] | add

Python: 基于Stripe事件的完整MRR瀑布图:
python
import stripe
from datetime import datetime, timezone
from collections import defaultdict
from dateutil.relativedelta import relativedelta

stripe.apikey = skliveYOURKEY

def getmrrwaterfall(year: int, month: int) -> dict:

计算指定月份的MRR瀑布图。
返回: 新增、扩展、收缩、流失、净新增MRR。

# 期间边界
period_start = datetime(year, month, 1, tzinfo=timezone.utc)
periodend = periodstart + relativedelta(months=1)
prevstart = periodstart - relativedelta(months=1)

# 获取期间开始时活跃的订阅(分母)
beginningsubs = getactivesubscriptionsat(prevstart)
endingsubs = getactivesubscriptionsat(periodend)

# 按客户分类
beginningcustomers = {s.customer: getmrr(s) for s in beginningsubs}
endingcustomers = {s.customer: getmrr(s) for s in endingsubs}

new_mrr = 0.0
expansion_mrr = 0.0
contraction_mrr = 0.0
churned_mrr = 0.0

allcustomers = set(beginningcustomers) | set(ending_customers)

for custid in allcustomers:
beginval = beginningcustomers.get(cust_id, 0.0)
endval = endingcustomers.get(cust_id, 0.0)
delta = endval - beginval

if beginval == 0 and endval > 0:
newmrr += endval
elif beginval > 0 and endval == 0:
churnedmrr += beginval
elif delta > 0:
expansion_mrr += delta
elif delta < 0:
contraction_mrr += abs(delta)

beginningmrr = sum(beginningcustomers.values())

return {
period: f{year}-{month:02d},
beginningmrr: beginningmrr,
newmrr: newmrr,
expansionmrr: expansionmrr,
contractionmrr: contractionmrr,
churnedmrr: churnedmrr,
netnewmrr: newmrr + expansionmrr - contractionmrr - churnedmrr,
endingmrr: beginningmrr + newmrr + expansionmrr - contractionmrr - churnedmrr,
grosschurnrate: churnedmrr / beginningmrr if beginning_mrr else 0,
nrr: (beginningmrr + expansionmrr - contractionmrr - churnedmrr) / beginningmrr if beginningmrr else 0,
}

def getmrr(subscription) -> float:
从Stripe订阅中提取标准化月度值。
item = subscription.get(items, {}).get(data, [{}])[0]
price = item.get(price, {})
amount = price.get(unit_amount, 0) / 100
qty = item.get(quantity, 1)
interval = price.get(recurring, {}).get(interval, month)

if interval == year:
return (amount * qty) / 12
elif interval == week:
return (amount qty) 4.333
return amount * qty

def getactivesubscriptionsat(timestamp: datetime) -> list:
获取在指定时间戳活跃的订阅。
ts = int(timestamp.timestamp())
subs = stripe.Subscription.list(
status=all,
created={lte: ts},
limit=100
)
return [
s for s in subs.autopagingiter()
if s.currentperiodstart <= ts <= (s.canceled_at or ts + 1)
]

2. 群组分析

按注册群组追踪留存率——理解留存质量的黄金标准:

python
import pandas as pd
import numpy as np

def buildcohorttable(subscription_events: pd.DataFrame) -> pd.DataFrame:

构建月度群组留存表。

输入列: customerid, eventtype (started/churned), event_month (YYYY-MM)
输出: 群组 × 起始后月数 → 留存率矩阵

输出示例:
cohort | M+0 | M+1 | M+2 | M+3 | M+6 | M+12
2025-01 | 100% | 87% | 79% | 74% | 65% | 54%
2025-02 | 100% | 91% | 83% | 78% | -- | --

# 分配群组(首次订阅月份)
firstsub = (subscriptionevents[subscriptionevents.eventtype == started]
.groupby(customerid)[eventmonth]
.min()
.reset_index()
.rename(columns={event_month: cohort}))

df = subscriptionevents.merge(firstsub, on=customer_id)
df[cohort] = pd.to_datetime(df[cohort])
df[eventmonth] = pd.todatetime(df[event_month])
df[monthssincestart] = (
(df[event_month].dt.year - df[cohort].dt.year) * 12 +
(df[event_month].dt.month - df[cohort].dt.month)
)

# 每个群组每月活跃客户数
active = (df[df.event_type != churned]
.groupby([cohort, monthssincestart])[customer_id]
.nunique()
.reset_index()
.rename(columns={customerid: activecustomers}))

cohort_table = active.pivot(
index=cohort,
columns=monthssincestart,
values=active_customers
)

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 subscription-revenue-tracker-1776279196 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 subscription-revenue-tracker-1776279196 技能

通过命令行安装

skillhub install subscription-revenue-tracker-1776279196

下载

⬇ 下载 subscription-revenue-tracker v1.1.0(免费)

文件大小: 7.2 KB | 发布时间: 2026-4-17 16:15

v1.1.0 最新 2026-4-17 16:15
Fix display name from slug to proper title

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部