writekit/MONETIZATION.md
2026-01-09 00:16:46 +02:00

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

  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

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