init
This commit is contained in:
commit
d69342b2e9
160 changed files with 28681 additions and 0 deletions
121
MONETIZATION.md
Normal file
121
MONETIZATION.md
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
# 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 |
|
||||
Loading…
Add table
Add a link
Reference in a new issue