121 lines
3.1 KiB
Markdown
121 lines
3.1 KiB
Markdown
# 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 |
|