3.1 KiB
3.1 KiB
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
- Custom domain - Primary trigger, most valuable to users
- Remove badge - Secondary, vanity upgrade
- Analytics depth - 7 days feels limiting for serious bloggers
- 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
// 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:
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 |