付费自定义

第一笔收入 💰

收到第一笔 ¥99 的付款时,我激动得截了屏。

终于不再只是烧钱了。

那天是周二的晚上,我正在看服务器账单——每个月 ¥5000 的成本像一块石头压在胸口。突然手机震动了一下,支付宝到账提醒:¥99。

我赶紧打开后台,看到是一个深圳的用户,购买了”专业套餐”,订阅了 3 个自定义别名。他在备注里写道:“太需要这个功能了,公司品牌推广必备!”

那一刻我意识到:这不是玩具,是生意。


套餐设计 📊

为什么收费?

先看看当时的数据:

优质别名申请统计(2026年2月):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
"apple"   申请次数:128次
"shop"    申请次数:256次  
"go"      申请次数:189次
"news"    申请次数:167次
"vip"     申请次数:143次

3字符短别名:100%被占用
4字符好记词:87%被占用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

用户留言精选:
• "我愿意付钱买'apple'这个别名!"
• "能不能租给我?我用一个月就行"
• "我们公司需要这个品牌名,价格好商量"
• "求转让'go',¥100/月可以接受"

需求明确,供给稀缺——完美的定价场景。

三档套餐

我设计了三个套餐,定价逻辑是:

class PricingModel:
    """定价模型"""
    
    def __init__(self):
        self.tiers = {
            'free': {
                'name': '免费版',
                'price': 0,
                'custom_aliases': 0,
                'alias_length': 6,  # 自动生成,6位以上
                'statistics': False,
                'priority': 0,
                'target': '个人尝鲜用户'
            },
            'basic': {
                'name': '基础版',
                'price': 29,
                'custom_aliases': 5,
                'alias_length': 4,  # 最短4位
                'statistics': True,
                'priority': 1,
                'target': '小团队/个人品牌'
            },
            'pro': {
                'name': '专业版',
                'price': 99,
                'custom_aliases': -1,  # 无限
                'alias_length': 3,  # 最短3位
                'statistics': True,
                'priority': 2,
                'target': '企业用户/重度使用者'
            }
        }
    
    def get_recommended_tier(self, user):
        """根据用户情况推荐套餐"""
        # 新用户:推荐免费版
        if user['created_days'] < 7:
            return 'free'
        
        # 使用量大的用户:推荐专业版
        if user['total_links'] > 50:
            return 'pro'
        
        # 有自定义需求的:推荐基础版
        if user['alias_applications'] > 0:
            return 'basic'
        
        return 'free'
    
    def calculate_annual_discount(self, monthly_price, months):
        """年付折扣"""
        if months >= 12:
            return monthly_price * 12 * 0.7  # 年付7折
        elif months >= 6:
            return monthly_price * months * 0.85  # 半年付85折
        else:
            return monthly_price * months  # 月付无折扣

# 定价展示
pricing = PricingModel()

print("=== 短链接服务套餐 ===\n")
for tier_id, tier in pricing.tiers.items():
    print(f"【{tier['name']}】")
    print(f"价格:¥{tier['price']}/月")
    print(f"自定义别名:{'无限' if tier['custom_aliases'] == -1 else tier['custom_aliases']}个")
    print(f"最短长度:{tier['alias_length']}位")
    print(f"数据统计:{'✓' if tier['statistics'] else '✗'}")
    print(f"适用:{tier['target']}")
    print()

输出:

=== 短链接服务套餐 ===

【免费版】
价格:¥0/月
自定义别名:0个
最短长度:6位
数据统计:✗
适用:个人尝鲜用户

【基础版】
价格:¥29/月
自定义别名:5个
最短长度:4位
数据统计:✓
适用:小团队/个人品牌

【专业版】
价格:¥99/月
自定义别名:无限
最短长度:3位
数据统计:✓
适用:企业用户/重度使用者

定价逻辑

为什么是 ¥29 和 ¥99?

  1. 心理定价

    • ¥29:低于 ¥30,感觉”不到30块”
    • ¥99:低于三位数,感觉”不到100块”
  2. 锚定效应

    • 免费版作为锚点,让基础版显得很便宜
    • 专业版¥99与基础版¥29对比,¥70差价换无限别名,值得
  3. 成本覆盖

    • 单个用户服务器成本:¥5/月
    • ¥29 套餐毛利:83%
    • ¥99 套餐毛利:95%
  4. 转化漏斗

    100个免费用户
       ↓ 2%转化
    2个付费用户
       ↓ 分配
    1.5个基础版(¥29) + 0.5个专业版(¥99)
    
    平均客单价:¥46.5

支付接入 💳

为什么选择支付宝+微信支付?

我当时考虑了三个因素:

  1. 用户习惯:国内用户习惯支付宝/微信
  2. 接入难度:官方SDK文档完善
  3. 费率:0.6%交易费,可接受

支付流程

用户选择套餐 → 创建订阅订单 → 调用支付接口 → 跳转支付页面

                                     用户完成支付

                                     支付平台回调通知

                                     验证签名 → 激活订阅 → 创建别名

代码实现

from datetime import datetime, timedelta
import hashlib
import hmac
import json

class PaymentService:
    """支付服务"""
    
    def __init__(self):
        self.alipay_config = {
            'app_id': '2022xxxxxxxx',
            'private_key': open('alipay_private_key.pem').read(),
            'public_key': open('alipay_public_key.pem').read(),
            'gateway': 'https://openapi.alipay.com/gateway.do'
        }
        self.wechat_config = {
            'appid': 'wxXXXXXXXX',
            'mch_id': '1XXXXXXXX',
            'api_key': 'xxxxxxxxxxxxxxxx',
            'gateway': 'https://api.mch.weixin.qq.com/pay/unifiedorder'
        }
    
    def create_payment(self, user_id, tier, months, payment_method):
        """创建支付订单"""
        # 1. 创建订阅记录
        subscription = self._create_subscription(user_id, tier, months)
        
        # 2. 创建支付订单
        order = {
            'order_id': self._generate_order_id(),
            'subscription_id': subscription['id'],
            'amount': subscription['total_price'],
            'subject': f"短链接{subscription['tier_name']} - {months}个月",
            'user_id': user_id
        }
        
        # 3. 调用对应支付接口
        if payment_method == 'alipay':
            payment_url = self._create_alipay_payment(order)
        elif payment_method == 'wechat':
            payment_url = self._create_wechat_payment(order)
        else:
            return {'error': '不支持的支付方式'}
        
        # 4. 保存订单
        db.execute("""
            INSERT INTO payment_orders 
            (order_id, subscription_id, user_id, amount, 
             payment_method, status, created_at)
            VALUES (?, ?, ?, ?, ?, 'pending', ?)
        """, (
            order['order_id'], subscription['id'], user_id,
            order['amount'], payment_method, datetime.now()
        ))
        
        return {
            'order_id': order['order_id'],
            'payment_url': payment_url,
            'amount': order['amount'],
            'qr_code': self._generate_qr_code(payment_url)
        }
    
    def _create_subscription(self, user_id, tier, months):
        """创建订阅记录"""
        pricing = PricingModel()
        tier_config = pricing.tiers[tier]
        
        # 计算折扣
        monthly_price = tier_config['price']
        total_price = pricing.calculate_annual_discount(monthly_price, months)
        
        subscription = {
            'id': generate_id(),
            'user_id': user_id,
            'tier': tier,
            'tier_name': tier_config['name'],
            'months': months,
            'monthly_price': monthly_price,
            'total_price': total_price,
            'start_date': datetime.now(),
            'end_date': datetime.now() + timedelta(days=30*months),
            'status': 'pending_payment'
        }
        
        db.execute("""
            INSERT INTO subscriptions 
            (id, user_id, tier, tier_name, months, 
             monthly_price, total_price, start_date, end_date, status)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        """, (
            subscription['id'], subscription['user_id'], subscription['tier'],
            subscription['tier_name'], subscription['months'], 
            subscription['monthly_price'], subscription['total_price'],
            subscription['start_date'], subscription['end_date'],
            subscription['status']
        ))
        
        return subscription
    
    def _create_alipay_payment(self, order):
        """创建支付宝支付"""
        import urllib.parse
        
        # 构造请求参数
        biz_content = {
            'out_trade_no': order['order_id'],
            'product_code': 'FAST_INSTANT_TRADE_PAY',
            'total_amount': str(order['amount']),
            'subject': order['subject']
        }
        
        # 生成签名
        params = {
            'app_id': self.alipay_config['app_id'],
            'method': 'alipay.trade.page.pay',
            'charset': 'utf-8',
            'sign_type': 'RSA2',
            'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            'version': '1.0',
            'biz_content': json.dumps(biz_content)
        }
        
        # 签名
        sign = self._sign_params(params, self.alipay_config['private_key'])
        params['sign'] = sign
        
        # 生成支付URL
        url = self.alipay_config['gateway'] + '?' + urllib.parse.urlencode(params)
        
        return url
    
    def _sign_params(self, params, private_key):
        """签名参数"""
        from cryptography.hazmat.primitives import hashes
        from cryptography.hazat.primitives.asymmetric import padding
        from cryptography.hazmat.backends import default_backend
        
        # 排序参数
        sorted_params = sorted(params.items())
        query_string = '&'.join([f"{k}={v}" for k, v in sorted_params if k != 'sign'])
        
        # RSA签名
        private_key_obj = load_pem_private_key(
            private_key.encode(),
            password=None,
            backend=default_backend()
        )
        
        signature = private_key_obj.sign(
            query_string.encode('utf-8'),
            padding.PKCS1v15(),
            hashes.SHA256()
        )
        
        return base64.b64encode(signature).decode('utf-8')
    
    def verify_alipay_callback(self, params):
        """验证支付宝回调"""
        # 提取签名
        sign = params.pop('sign')
        sign_type = params.pop('sign_type')
        
        # 重新签名
        expected_sign = self._sign_params(params, self.alipay_config['public_key'])
        
        return sign == expected_sign

支付回调处理

这是最关键的部分——要确保回调的真实性:

from flask import Flask, request

app = Flask(__name__)

@app.route('/payment/alipay/callback', methods=['POST'])
def alipay_callback():
    """支付宝支付回调"""
    params = request.form.to_dict()
    
    # 1. 验证签名
    if not payment_service.verify_alipay_callback(params.copy()):
        app.logger.error(f"Invalid signature: {params}")
        return 'fail', 400
    
    # 2. 验证订单状态
    order_id = params.get('out_trade_no')
    trade_status = params.get('trade_status')
    
    if trade_status != 'TRADE_SUCCESS':
        app.logger.info(f"Trade not success: {trade_status}")
        return 'success'  # 返回success避免重复通知
    
    # 3. 检查订单是否已处理
    order = db.query(
        "SELECT * FROM payment_orders WHERE order_id = ?",
        (order_id,)
    )
    
    if not order:
        app.logger.error(f"Order not found: {order_id}")
        return 'fail', 400
    
    if order[0]['status'] == 'paid':
        app.logger.info(f"Order already paid: {order_id}")
        return 'success'  # 重复通知
    
    # 4. 更新订单状态
    db.execute("""
        UPDATE payment_orders 
        SET status = 'paid', paid_at = ?, 
            trade_no = ?, total_amount = ?
        WHERE order_id = ?
    """, (
        datetime.now(),
        params.get('trade_no'),
        params.get('total_amount'),
        order_id
    ))
    
    # 5. 激活订阅
    db.execute("""
        UPDATE subscriptions 
        SET status = 'active', activated_at = ?
        WHERE id = ?
    """, (datetime.now(), order[0]['subscription_id']))
    
    # 6. 通知用户
    subscription = db.query(
        "SELECT * FROM subscriptions WHERE id = ?",
        (order[0]['subscription_id'],)
    )[0]
    
    notify_subscription_active(subscription)
    
    app.logger.info(f"Payment success: {order_id}")
    
    return 'success'

@app.route('/payment/wechat/callback', methods=['POST'])
def wechat_callback():
    """微信支付回调"""
    xml_data = request.data
    data = xml_to_dict(xml_data)
    
    # 1. 验证签名
    if not payment_service.verify_wechat_callback(data):
        app.logger.error(f"Invalid signature: {data}")
        return dict_to_xml({'return_code': 'FAIL', 'return_msg': '签名失败'})
    
    # 2. 验证订单
    if data.get('result_code') != 'SUCCESS':
        return dict_to_xml({'return_code': 'SUCCESS', 'return_msg': 'OK'})
    
    out_trade_no = data.get('out_trade_no')
    
    # 3-6. 处理订单(同支付宝)
    process_payment_success(out_trade_no, data.get('transaction_id'))
    
    return dict_to_xml({'return_code': 'SUCCESS', 'return_msg': 'OK'})

订阅管理 📋

用户取消订阅怎么办?

这是我当时最纠结的问题:

场景A:立即回收

  • 优点:节省资源
  • 缺点:用户体验差,已分享的链接会失效

场景B:保留到月底

  • 优点:用户友好
  • 缺点:浪费资源

我的方案:30天宽限期

class SubscriptionManager:
    """订阅管理系统"""
    
    def __init__(self):
        self.grace_period_days = 30
    
    def cancel_subscription(self, subscription_id):
        """取消订阅"""
        subscription = db.query(
            "SELECT * FROM subscriptions WHERE id = ?",
            (subscription_id,)
        )[0]
        
        # 检查是否在宽限期内
        if subscription['status'] == 'active':
            # 设置为取消状态,但保留到订阅期结束
            db.execute("""
                UPDATE subscriptions 
                SET status = 'cancelled',
                    cancelled_at = ?,
                    auto_renew = FALSE
                WHERE id = ?
            """, (datetime.now(), subscription_id))
            
            # 计算实际失效时间
            expiry_date = subscription['end_date']
            grace_expiry = expiry_date + timedelta(days=self.grace_period_days)
            
            return {
                'success': True,
                'message': f'您的别名将保留至 {grace_expiry.strftime("%Y-%m-%d")}'
            }
        
        return {'error': '订阅状态无效'}
    
    def check_alias_valid(self, alias):
        """检查别名是否有效"""
        # 1. 检查是否有活跃订阅
        active = db.query("""
            SELECT * FROM subscriptions s
            JOIN custom_aliases a ON s.id = a.subscription_id
            WHERE a.alias = ? 
            AND s.status = 'active'
            AND s.end_date > ?
        """, (alias, datetime.now()))
        
        if active:
            return {'valid': True, 'reason': 'active_subscription'}
        
        # 2. 检查是否在宽限期内
        in_grace = db.query("""
            SELECT * FROM subscriptions s
            JOIN custom_aliases a ON s.id = a.subscription_id
            WHERE a.alias = ?
            AND s.status = 'cancelled'
            AND s.end_date > ?
        """, (alias, datetime.now() - timedelta(days=self.grace_period_days)))
        
        if in_grace:
            subscription = in_grace[0]
            grace_end = subscription['end_date'] + timedelta(days=self.grace_period_days)
            
            return {
                'valid': True,
                'reason': 'grace_period',
                'expires_at': grace_end,
                'warning': f'此别名将于 {grace_end.strftime("%Y-%m-%d")} 失效'
            }
        
        # 3. 已失效
        return {'valid': False, 'reason': 'expired'}
    
    def auto_renew_subscription(self, subscription_id):
        """自动续费"""
        subscription = db.query(
            "SELECT * FROM subscriptions WHERE id = ?",
            (subscription_id,)
        )[0]
        
        if not subscription['auto_renew']:
            return None
        
        # 创建续费订单
        new_order = payment_service.create_payment(
            subscription['user_id'],
            subscription['tier'],
            subscription['months'],
            subscription['default_payment_method']
        )
        
        # 自动扣款(需要用户授权免密支付)
        try:
            payment_service.execute_payment(new_order['order_id'])
            return {'success': True}
        except Exception as e:
            app.logger.error(f"Auto renew failed: {e}")
            # 通知用户续费失败
            notify_renewal_failed(subscription)
            return {'error': str(e)}
    
    def cleanup_expired_aliases(self):
        """清理过期别名(定时任务)"""
        # 每天执行一次
        expired = db.query("""
            SELECT a.* FROM custom_aliases a
            LEFT JOIN subscriptions s ON s.id = a.subscription_id
            WHERE (s.status = 'expired' OR s.status = 'cancelled')
            AND s.end_date < ?
        """, (datetime.now() - timedelta(days=self.grace_period_days),))
        
        for alias in expired:
            # 标记为可回收
            db.execute("""
                UPDATE custom_aliases 
                SET status = 'recyclable',
                    recycled_at = ?
                WHERE id = ?
            """, (datetime.now(), alias['id']))
            
            app.logger.info(f"Alias recycled: {alias['alias']}")
        
        return {'recycled': len(expired)}

数据库设计

-- 订阅表
CREATE TABLE subscriptions (
    id VARCHAR(50) PRIMARY KEY,
    user_id INTEGER NOT NULL,
    tier VARCHAR(20) NOT NULL,
    tier_name VARCHAR(50) NOT NULL,
    months INTEGER NOT NULL,
    monthly_price DECIMAL(10,2) NOT NULL,
    total_price DECIMAL(10,2) NOT NULL,
    start_date TIMESTAMP NOT NULL,
    end_date TIMESTAMP NOT NULL,
    status VARCHAR(20) NOT NULL,  -- pending_payment, active, cancelled, expired
    auto_renew BOOLEAN DEFAULT FALSE,
    default_payment_method VARCHAR(20),
    cancelled_at TIMESTAMP,
    activated_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_user_id (user_id),
    INDEX idx_status (status),
    INDEX idx_end_date (end_date)
);

-- 支付订单表
CREATE TABLE payment_orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    order_id VARCHAR(50) UNIQUE NOT NULL,
    subscription_id VARCHAR(50) NOT NULL,
    user_id INTEGER NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    payment_method VARCHAR(20) NOT NULL,
    status VARCHAR(20) NOT NULL,  -- pending, paid, failed, refunded
    trade_no VARCHAR(100),
    paid_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (subscription_id) REFERENCES subscriptions(id),
    INDEX idx_order_id (order_id),
    INDEX idx_status (status)
);

-- 自定义别名表
CREATE TABLE custom_aliases (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    subscription_id VARCHAR(50),
    alias VARCHAR(50) UNIQUE NOT NULL,
    target_url VARCHAR(500) NOT NULL,
    status VARCHAR(20) NOT NULL,  -- active, recyclable, deleted
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    recycled_at TIMESTAMP,
    
    FOREIGN KEY (subscription_id) REFERENCES subscriptions(id),
    INDEX idx_alias (alias),
    INDEX idx_status (status),
    INDEX idx_user_id (user_id)
);

收入数据 📈

第一个月的惊喜

付费功能上线一个月后,我做了个统计:

import pandas as pd
import matplotlib.pyplot as plt

# 查询订阅数据
subscriptions = db.query("""
    SELECT tier, COUNT(*) as count, total_price
    FROM subscriptions
    WHERE status IN ('active', 'cancelled')
    AND created_at >= '2026-02-01'
    AND created_at < '2026-03-01'
    GROUP BY tier
""")

# 统计数据
stats = {
    '总付费用户': sum(s['count'] for s in subscriptions),
    '月收入': sum(s['count'] * s['total_price'] for s in subscriptions),
    '客单价': sum(s['count'] * s['total_price'] for s in subscriptions) / sum(s['count'] for s in subscriptions),
    '付费转化率': '2.0%',  # 200付费 / 10000活跃
}

print("=== 2026年2月收入统计 ===\n")
for key, value in stats.items():
    print(f"{key}{value}")

print("\n=== 套餐分布 ===")
for sub in subscriptions:
    print(f"{sub['tier']}{sub['count']}人,收入 ¥{sub['count'] * sub['total_price']}")

输出:

=== 2026年2月收入统计 ===

总付费用户:200
月收入:¥15000
客单价:¥75
付费转化率:2.0%

=== 套餐分布 ===
basic:150人,收入 ¥7800
pro:50人,收入 ¥7200

收入分析

让我用代码做个详细分析:

class RevenueAnalyzer:
    """收入分析器"""
    
    def __init__(self):
        self.server_cost = 5000  # 月服务器成本
        self.payment_fee_rate = 0.006  # 0.6%支付手续费
    
    def analyze_month(self, year, month):
        """分析某月收入"""
        # 获取当月所有订阅
        subscriptions = db.query("""
            SELECT * FROM subscriptions
            WHERE strftime('%Y-%m', created_at) = ?
        """, (f"{year}-{month:02d}",))
        
        analysis = {
            'month': f"{year}-{month:02d}",
            'new_subscriptions': len(subscriptions),
            'gross_revenue': 0,
            'payment_fees': 0,
            'net_revenue': 0,
            'profit': 0,
            'tier_breakdown': {}
        }
        
        for sub in subscriptions:
            tier = sub['tier']
            amount = sub['total_price']
            
            # 套餐分组
            if tier not in analysis['tier_breakdown']:
                analysis['tier_breakdown'][tier] = {
                    'count': 0,
                    'revenue': 0
                }
            
            analysis['tier_breakdown'][tier]['count'] += 1
            analysis['tier_breakdown'][tier]['revenue'] += amount
            
            analysis['gross_revenue'] += amount
        
        # 计算费用和利润
        analysis['payment_fees'] = analysis['gross_revenue'] * self.payment_fee_rate
        analysis['net_revenue'] = analysis['gross_revenue'] - analysis['payment_fees']
        analysis['profit'] = analysis['net_revenue'] - self.server_cost
        
        return analysis
    
    def predict_mrr(self, current_month):
        """预测MRR(月度经常性收入)"""
        # 获取所有活跃订阅
        active = db.query("""
            SELECT tier, total_price, months, end_date
            FROM subscriptions
            WHERE status = 'active'
            AND end_date > ?
        """, (datetime.now(),))
        
        mrr = 0
        for sub in active:
            monthly_revenue = sub['total_price'] / sub['months']
            mrr += monthly_revenue
        
        return mrr
    
    def calculate_ltv(self, user_id):
        """计算用户生命周期价值"""
        user_subs = db.query("""
            SELECT total_price, months, start_date, end_date
            FROM subscriptions
            WHERE user_id = ?
            AND status IN ('active', 'cancelled', 'expired')
        """, (user_id,))
        
        if not user_subs:
            return 0
        
        total_revenue = sum(sub['total_price'] for sub in user_subs)
        
        # 计算用户生命周期
        first_sub = min(user_subs, key=lambda x: x['start_date'])
        last_sub = max(user_subs, key=lambda x: x['end_date'])
        
        lifespan = (last_sub['end_date'] - first_sub['start_date']).days / 30
        
        return {
            'total_revenue': total_revenue,
            'lifespan_months': round(lifespan, 1),
            'ltv': total_revenue
        }

# 分析2月数据
analyzer = RevenueAnalyzer()
feb_analysis = analyzer.analyze_month(2026, 2)

print("=== 2026年2月收入分析 ===\n")
print(f"新订阅数:{feb_analysis['new_subscriptions']}")
print(f"总收入:¥{feb_analysis['gross_revenue']:.2f}")
print(f"支付手续费:¥{feb_analysis['payment_fees']:.2f}")
print(f"净收入:¥{feb_analysis['net_revenue']:.2f}")
print(f"服务器成本:¥{analyzer.server_cost}")
print(f"净利润:¥{feb_analysis['profit']:.2f}")
print(f"利润率:{feb_analysis['profit']/feb_analysis['gross_revenue']*100:.1f}%")

print("\n=== 套餐分布 ===")
for tier, data in feb_analysis['tier_breakdown'].items():
    print(f"{tier}{data['count']}人,收入 ¥{data['revenue']:.2f}")

# 预测MRR
mrr = analyzer.predict_mrr(2026)
print(f"\n当前MRR:¥{mrr:.2f}")

# 计算LTV
high_value_users = db.query("""
    SELECT user_id, SUM(total_price) as total
    FROM subscriptions
    GROUP BY user_id
    ORDER BY total DESC
    LIMIT 5
""")

print("\n=== 高价值用户TOP5 ===")
for user in high_value_users:
    ltv = analyzer.calculate_ltv(user['user_id'])
    print(f"用户{user['user_id']}:累计消费 ¥{ltv['total_revenue']},生命周期 {ltv['lifespan_months']}个月")

输出:

=== 2026年2月收入分析 ===

新订阅数:200
总收入:¥15000.00
支付手续费:¥90.00
净收入:¥14910.00
服务器成本:¥5000
净利润:¥9910.00
利润率:66.1%

=== 套餐分布 ===
basic:150人,收入 ¥7800.00
pro:50人,收入 ¥7200.00

当前MRR:¥18000.00

=== 高价值用户TOP5 ===
用户1024:累计消费 ¥1188.00,生命周期 12个月
用户2048:累计消费 ¥594.00,生命周期 6个月
用户3072:累计消费 ¥594.00,生命周期 6个月
用户4096:累计消费 ¥351.00,生命周期 3个月
用户5120:累计消费 ¥351.00,生命周期 3个月

关键发现:

  1. 首次盈利!净利润 ¥9910,终于覆盖了服务器成本
  2. 专业版用户ARPU更高:虽然人数少,但贡献了48%的收入
  3. MRR持续增长:当前MRR ¥18000 > 2月收入 ¥15000,说明续费情况良好
  4. 高价值用户明显:TOP5用户贡献了20%的收入

本节小结 📝

商业模式验证

指标目标实际状态
付费转化率1%2.0%✅ 超预期
月收入¥10000¥15000✅ 超预期
客单价¥50¥75✅ 超预期
利润率50%66%✅ 超预期

结论: 付费模式跑通了!

经验总结

  1. 定价策略

    • 免费版建立用户基础
    • 基础版满足轻度需求
    • 专业版捕获高价值用户
  2. 支付体验

    • 支付宝+微信双通道
    • 回调验证确保安全
    • 30天宽限期提升体验
  3. 数据驱动

    • MRR监控长期趋势
    • LTV识别高价值用户
    • 转化漏斗优化定价

下一步计划

赚钱了,但也有了新问题——

老链接堆积如山,需要管理……


练习题

练习1:防止退款滥用

如何防止用户通过退款来”免费试用”付费别名?

参考答案
class RefundProtection:
    """退款保护机制"""
    
    def __init__(self):
        self.trial_period_days = 7
        self.trial_click_limit = 100
        self.refund_reputation_penalty = 20
    
    def check_refund_eligibility(self, subscription_id):
        """检查是否可以退款"""
        subscription = db.query(
            "SELECT * FROM subscriptions WHERE id = ?",
            (subscription_id,)
        )[0]
        
        # 检查1:试用期已过
        days_used = (datetime.now() - subscription['activated_at']).days
        if days_used > self.trial_period_days:
            return {
                'eligible': False,
                'reason': f'使用超过{self.trial_period_days}天,不支持退款'
            }
        
        # 检查2:点击量超限
        alias_clicks = self._get_alias_clicks(subscription_id)
        if alias_clicks > self.trial_click_limit:
            # 部分退款
            refund_ratio = max(0.5, 1 - (alias_clicks / self.trial_click_limit))
            return {
                'eligible': True,
                'partial_refund': True,
                'refund_ratio': refund_ratio,
                'reason': f'使用{alias_clicks}次,可退{refund_ratio*100:.0f}%'
            }
        
        return {'eligible': True, 'partial_refund': False}
    
    def process_refund(self, user_id, subscription_id):
        """处理退款"""
        # 检查资格
        eligibility = self.check_refund_eligibility(subscription_id)
        
        if not eligibility['eligible']:
            return {'error': eligibility['reason']}
        
        # 执行退款
        if eligibility.get('partial_refund'):
            # 部分退款
            subscription = db.query(
                "SELECT * FROM subscriptions WHERE id = ?",
                (subscription_id,)
            )[0]
            refund_amount = subscription['total_price'] * eligibility['refund_ratio']
        else:
            # 全额退款
            refund_amount = subscription['total_price']
        
        # 调用支付平台退款接口
        payment_service.refund(subscription['order_id'], refund_amount)
        
        # 更新订阅状态
        db.execute("""
            UPDATE subscriptions 
            SET status = 'refunded'
            WHERE id = ?
        """, (subscription_id,))
        
        # 降低用户信誉
        reputation_system.reduce_score(user_id, self.refund_reputation_penalty)
        
        # 限制再次购买
        reputation_system.ban_user_from_trial(user_id, days=30)
        
        return {
            'success': True,
            'refund_amount': refund_amount,
            'message': '退款成功,账户信誉受到影响'
        }

策略总结:

  1. 时间限制:7天试用期内可退款
  2. 使用量限制:超过100次点击,部分退款
  3. 信誉机制:退款影响信誉分数
  4. 购买限制:退款用户30天内不能购买

练习2:提升付费转化率

当前转化率2%,如何提升到5%?

参考答案
class ConversionOptimizer:
    """转化率优化器"""
    
    def __init__(self):
        self.strategies = {
            '免费试用': {
                'description': '新用户7天免费试用专业版',
                'expected_lift': '1.5%'
            },
            '限时折扣': {
                'description': '首月5折优惠',
                'expected_lift': '1.0%'
            },
            '功能限制': {
                'description': '免费版每日创建10个链接上限',
                'expected_lift': '0.8%'
            },
            '智能推荐': {
                'description': '根据使用行为推荐合适套餐',
                'expected_lift': '0.5%'
            },
            '社交证明': {
                'description': '展示"XX公司正在使用"',
                'expected_lift': '0.3%'
            }
        }
    
    def recommend_upgrade(self, user_id):
        """智能推荐套餐"""
        user = db.query("""
            SELECT * FROM users WHERE id = ?
        """, (user_id,))[0]
        
        # 分析用户行为
        usage = db.query("""
            SELECT COUNT(*) as link_count,
                   MAX(created_at) as last_active
            FROM links
            WHERE user_id = ?
        """, (user_id,))[0]
        
        # 推荐1:重度使用者
        if usage['link_count'] > 50:
            return {
                'tier': 'pro',
                'reason': '您已创建50+链接,专业版更划算',
                'discount': '首月8折'
            }
        
        # 推荐2:活跃用户
        if usage['link_count'] > 10:
            return {
                'tier': 'basic',
                'reason': '升级基础版,解锁自定义别名',
                'discount': '首月5折'
            }
        
        # 推荐3:新用户
        return {
            'tier': 'trial',
            'reason': '7天免费试用专业版',
            'discount': '免费'
        }

优化策略:

  1. 免费试用:降低决策门槛
  2. 限时折扣:制造紧迫感
  3. 功能限制:提升免费版痛点
  4. 智能推荐:个性化触达
  5. 社交证明:建立信任

(下一节:链接管理)