writekit/MONETIZATION.md

122 lines
3.1 KiB
Markdown
Raw Permalink Normal View History

2026-01-09 00:16:46 +02:00
# WriteKit Monetization
## Tiers
| Tier | Price | Billing |
|------|-------|---------|
| Free | $0 | - |
| Pro | $5/mo or $49/year | Lemon Squeezy |
## Feature Matrix
| Feature | Free | Pro |
|---------|------|-----|
| Subdomain (you.writekit.dev) | Yes | Yes |
| Custom domain | No | Yes |
| "Powered by WriteKit" badge | Required | Hidden |
| Analytics retention | 7 days | 90 days |
| API requests | 100/hour | 1000/hour |
| Webhooks | 3 endpoints | 10 endpoints |
| Webhook deliveries | 100/day | 1000/day |
| Plugins | 3 max | 10 max |
| Plugin executions | 1000/day | 10000/day |
| Posts | Unlimited | Unlimited |
| Assets | Unlimited | Unlimited |
| Comments/Reactions | Unlimited | Unlimited |
## Upgrade Triggers
1. **Custom domain** - Primary trigger, most valuable to users
2. **Remove badge** - Secondary, vanity upgrade
3. **Analytics depth** - 7 days feels limiting for serious bloggers
4. **Rate limits** - For power users/headless CMS use case
## Positioning
**Tagline:** "Your blog, your domain, your data."
**Key messages:**
- No paywalls, no algorithms, no surprises
- 70% cheaper than Ghost ($5 vs $18/mo)
- Own your content, export anytime
- API-first, developer-friendly
## Implementation
### Backend Config
```go
// internal/config/tiers.go
type Tier string
const (
TierFree Tier = "free"
TierPro Tier = "pro"
)
type TierConfig struct {
Price int // cents/month
AnnualPrice int // cents/year
CustomDomain bool
BadgeRequired bool
AnalyticsRetention int // days
APIRateLimit int // requests/hour
MaxWebhooks int
WebhookDeliveries int // per day
MaxPlugins int
PluginExecutions int // per day
}
var Tiers = map[Tier]TierConfig{
TierFree: {
Price: 0,
AnnualPrice: 0,
CustomDomain: false,
BadgeRequired: true,
AnalyticsRetention: 7,
APIRateLimit: 100,
MaxWebhooks: 3,
WebhookDeliveries: 100,
MaxPlugins: 3,
PluginExecutions: 1000,
},
TierPro: {
Price: 500, // $5
AnnualPrice: 4900, // $49
CustomDomain: true,
BadgeRequired: false,
AnalyticsRetention: 90,
APIRateLimit: 1000,
MaxWebhooks: 10,
WebhookDeliveries: 1000,
MaxPlugins: 10,
PluginExecutions: 10000,
},
}
```
### Database
Add to `tenants` table:
```sql
tier TEXT NOT NULL DEFAULT 'free'
```
### Frontend
Update `BillingPage.tsx` with:
- Current plan display
- Feature comparison
- Upgrade button → Lemon Squeezy checkout
### Enforcement Points
| Feature | File | Check |
|---------|------|-------|
| Custom domain | `server/domain.go` | Block if tier != pro |
| Badge | Blog templates | Show if tier == free |
| Analytics | `tenant/analytics.go` | Filter by retention days |
| API rate limit | `server/middleware.go` | Rate limiter per tier |
| Webhooks count | `tenant/webhooks.go` | Check on create |
| Plugins count | `tenant/plugins.go` | Check on create |