# 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 |