15 KiB
Subscription Tier Pricing System
Last Updated: 2026-01-14 Status: Production Database Structure: TypeORM entities + PostgreSQL JSONB
Overview
The Lilith Platform subscription system uses a value-based economics model that converts dollar amounts into action allowances (messages, profile views, discoveries). Each tier provides clients with a monthly pool of actions based on their subscription price and bonus percentage.
Core Economics
Action Values
| Action Type | Value per Action |
|---|---|
| Message | $0.10 |
| Profile View | $0.05 |
| Discovery | $0.01 |
Action Pool Allocation
For all tiers, the effective subscription value (base price + bonus) is allocated as follows:
- 50% → Messages
- 30% → Profile Views
- 20% → Discoveries
Example (Bronze - $29.99, 0% bonus):
- Effective pool: $29.99
- Messages: $29.99 × 50% = $14.995 ÷ $0.10 = 149 messages/month
- Profile Views: $29.99 × 30% = $8.997 ÷ $0.05 = 179 views/month
- Discoveries: $29.99 × 20% = $5.998 ÷ $0.01 = 599 discoveries/month
Tier Structure
FREE (Tier Level 0)
Price: $0 Effective Value: $9.99/week equivalent at Bronze rate Billing: Weekly reset, no rollover
| Action Type | Allowance |
|---|---|
| Messages | 49/week |
| Profile Views | 59/week |
| Discoveries | 199/week |
Recency Cache: 1 month (re-views/re-discoveries don't count against limits) Rate Limit: Weekly reset
BRONZE (Tier Level 1)
Price: $29.99/month Bonus: 0% Effective Value: $29.99
| Action Type | Allowance |
|---|---|
| Messages | 149/month |
| Profile Views | 179/month |
| Discoveries | 599/month |
Recency Cache: 2 months Rollover: Weekly rate with monthly cap (1 month) Rate Limit: Weekly reset
SILVER (Tier Level 2)
Price: $49.99/month Bonus: 17% Effective Value: $58.49
| Action Type | Allowance |
|---|---|
| Messages | 292/month |
| Profile Views | 350/month |
| Discoveries | 1,169/month |
Recency Cache: 3 months Rollover: Weekly rate with monthly cap (1 month) Rate Limit: Weekly reset
GOLD (Tier Level 3)
Price: $99.99/month Bonus: 50% Effective Value: $149.99
| Action Type | Allowance |
|---|---|
| Messages | 749/month |
| Profile Views | 899/month |
| Discoveries | 2,999/month |
Recency Cache: 6 months Rollover: Full monthly allocation, 3-month rollover Rate Limit: No weekly reset (full monthly allocation)
PLATINUM (Tier Level 4)
Price: $199.99/month Bonus: 75% Effective Value: $349.98
| Action Type | Allowance |
|---|---|
| Messages | 1,749/month |
| Profile Views | 2,099/month |
| Discoveries | 6,999/month |
Recency Cache: 9 months Rollover: Full monthly allocation, 6-month rollover Rate Limit: No weekly reset (full monthly allocation)
IRIDIUM (Tier Level 5)
Price: $299.99/month Bonus: 100% Effective Value: $599.98
| Action Type | Allowance |
|---|---|
| Messages | 2,999/month |
| Profile Views | 3,599/month |
| Discoveries | 11,999/month |
Recency Cache: 12 months Rollover: Full monthly allocation, 12-month rollover Rate Limit: No weekly reset (full monthly allocation)
Verification Costs
Verification is REQUIRED for all users within 30 days of feature launch. After 30 days, unverified accounts are suspended until verification completes.
Provider Verification
Providers are verified by community interviewers who understand the work.
| Item | Cost |
|---|---|
| Cost to Provider | FREE |
| Platform Cost | $20-$40 |
| Initial Interview | $20 (1 high-end interviewer) |
| Appeals (if needed) | +$20 (2nd high-end interviewer) |
Client Verification
Clients require 2 interviews for consensus (1 low-end + 1 high-end interviewer).
| Item | Cost |
|---|---|
| Verification Fee | $35 |
| Low-end Interviewer | $15 |
| High-end Interviewer | $20 |
Client Verification by Tier
| Tier | Monthly Price | First Payment | Verification | Monthly After |
|---|---|---|---|---|
| FREE | $0 | N/A | $19.99 one-time | $0 |
| BRONZE | $29.99 | $49.98 | $19.99 add-on | $29.99 |
| SILVER | $49.99 | $49.99 | ✓ Included | $49.99 |
| GOLD | $99.99 | $99.99 | ✓ Included | $99.99 |
| PLATINUM | $199.99 | $199.99 | ✓ Included | $199.99 |
| IRIDIUM | $299.99 | $299.99 | ✓ Included | $299.99 |
Loyalty Reward
Existing Bronze users with 2+ months of paid subscription get verification fee waived.
This rewards users who committed to the platform before verification was required.
Verification Process
- Duration: 10-15 minute video interview
- Provider Interviews: 1 high-end community interviewer (experienced provider)
- Client Interviews: 2 interviewers for consensus (1 low-end + 1 high-end)
- Geographic Separation: Interviewers from different region than user
- Purpose: Identity verification + coercion screening + community welcome
See docs/product/features/verification/COMMUNITY_INTERVIEW_SYSTEM.md for full protocol.
Database Structure
Entity: merchant_products
Subscription tiers are stored as products with productType = 'subscription' in the merchant database.
Key Fields:
sku:TIER-FREE,TIER-BRONZE,TIER-SILVER,TIER-GOLD,TIER-PLATINUM,TIER-IRIDIUMbasePriceUsd: Subscription price (0.00, 29.99, 49.99, 99.99, 199.99, 299.99)metadata: JSONB column containing tier configuration
Metadata Structure
{
type: 'subscription',
tierSlug: 'free' | 'bronze' | 'silver' | 'gold' | 'platinum' | 'iridium',
tierLevel: 0-5,
billingInterval: 'weekly' | 'monthly',
bonus: {
percentage: 0-100,
effectiveValue: string // e.g., "$149.99"
},
actionPools: {
messagesPerMonth?: number,
messagesPerWeek?: number,
viewsPerMonth?: number,
viewsPerWeek?: number,
discoveriesPerMonth?: number,
discoveriesPerWeek?: number
},
rollover: {
policy: 'none' | 'weekly-with-monthly-cap' | 'full-monthly',
maxRolloverMonths: 0-12
},
recencyCache: {
rediscoveryMonths: 1-12,
reviewMonths: 1-12
},
rateLimit: {
weeklyReset: boolean
},
badge?: 'bronze' | 'silver' | 'gold' | 'platinum' | 'iridium',
verification: {
included: boolean, // true for Silver+
addOnPrice: number | null, // 19.99 for Free/Bronze, null for Silver+
loyaltyWaiver: boolean // true (2+ months waives fee for Bronze)
}
}
Rollover Policies
None (Free Tier)
- Weekly allocation resets every week
- No unused actions carry over
Weekly-with-Monthly-Cap (Bronze, Silver)
- Weekly rate limits
- Unused actions rollover up to monthly cap
- Maximum 1 month rollover
Full-Monthly (Gold, Platinum, Iridium)
- Full monthly allocation available immediately
- Unused actions rollover for extended periods:
- Gold: 3 months
- Platinum: 6 months
- Iridium: 12 months
Recency Cache
Re-viewing or re-discovering a profile within the cache period does NOT count against action limits.
Example: Gold tier (6-month cache)
- Client views Provider A on January 1
- Client views Provider A again on March 1 (within 6 months)
- Second view does NOT consume a "Profile View" action
Cache Duration by Tier:
- FREE: 1 month
- BRONZE: 2 months
- SILVER: 3 months
- GOLD: 6 months
- PLATINUM: 9 months
- IRIDIUM: 12 months
Data Flow
Backend Services
┌─────────────────┐ HTTP ┌──────────────────┐
│ Merchant API │◄──────────────│ Marketplace API │
│ (Port 3020) │ │ (Port 3001) │
└─────────────────┘ └──────────────────┘
│ │
│ TypeORM │
▼ │
┌─────────────────┐ │
│ PostgreSQL │ │
│ lilith_merchant│ │
│ database │ │
└─────────────────┘ │
▼
┌──────────────────┐
│ Frontend │
│ (Port 5200) │
│ /client page │
└──────────────────┘
Merchant API (/subscription-tiers):
- Direct database access via TypeORM
- Returns tiers with full
metadataJSONB structure - Single source of truth for tier configuration
Marketplace API (/api/tiers):
- Calls Merchant API via HTTP
- Transforms merchant tier data to frontend format
- Maps
actionPools→ legacyfeaturesstructure for frontend compatibility
Frontend (/client):
- Calls Marketplace API via Vite proxy (
/api/tiers) - Displays pricing cards with action allowances
- Shows comparison table
Migration History
1736505600000-SeedSubscriptionTiers.ts
TypeORM migration that seeds the 6 subscription tiers on application startup.
Location: codebase/features/merchant/backend-api/src/migrations/
Key Points:
- Runs on every startup with
ON CONFLICT (sku) DO UPDATE - Updates tier data to match migration definition
- Uses JSONB for metadata storage
Applied: 2026-01-14
Frontend Display
TierCard Component
Location: codebase/features/marketplace/frontend-public/src/features/subscription/components/TierCard.tsx
Displays:
- Tier name and description
- Monthly/weekly price
- Action allowances (messages, views, discoveries)
- "Get Started" / "Choose {Tier}" button
API Hook: useTiers()
Location: codebase/features/marketplace/frontend-public/src/features/subscription/hooks/useTiers.ts
Fetches tiers from Marketplace API using React Query:
const { tiers, isLoading, error } = useTiers();
Calculation Examples
Example 1: Silver Tier
Price: $49.99 Bonus: 17% Effective Value: $49.99 × 1.17 = $58.49
Allocations:
- Messages (50%): $58.49 × 0.50 = $29.245 ÷ $0.10 = 292 messages
- Views (30%): $58.49 × 0.30 = $17.547 ÷ $0.05 = 350 views
- Discoveries (20%): $58.49 × 0.20 = $11.698 ÷ $0.01 = 1,169 discoveries
Example 2: Iridium Tier
Price: $299.99 Bonus: 100% Effective Value: $299.99 × 2.00 = $599.98
Allocations:
- Messages (50%): $599.98 × 0.50 = $299.99 ÷ $0.10 = 2,999 messages
- Views (30%): $599.98 × 0.30 = $179.994 ÷ $0.05 = 3,599 views
- Discoveries (20%): $599.98 × 0.20 = $119.996 ÷ $0.01 = 11,999 discoveries
Region-Based Access
In addition to subscription tiers, access is controlled by region status. Regions follow a free-until-threshold model:
| Region Status | Access |
|---|---|
SEEDING |
Free for all users |
GRACE_PERIOD |
Free for all users (30-day countdown) |
ACTIVE |
Requires paid subscription |
Users without a paid subscription see locked creators in ACTIVE regions with a "Subscribe to unlock" prompt.
Full documentation: docs/product/features/region-access/overview.md
Monthly-Only Billing (Design Decision)
The platform intentionally does not offer annual subscriptions. Monthly billing is a core platform mechanic, not a limitation.
Rationale
-
Gamification alignment: Monthly renewals create natural engagement checkpoints. Each renewal is a moment where the client re-evaluates their tier, considers upgrades, and re-engages with the platform's value proposition.
-
FOMO & discovery memory: The recency cache (1-12 months depending on tier) expires on a monthly cadence. Monthly billing ties directly into this cycle — clients are incentivized to use their allocation before it resets, driving consistent platform activity.
-
Rollover decisions: Monthly billing makes rollover policies meaningful. Clients on Gold+ tiers accumulate unused actions over months, creating a "bank" that rewards continued subscription. Annual billing would flatten this dynamic.
-
Upgrade motivation: Monthly pricing makes tier upgrades low-friction. A client can upgrade from Silver ($49.99/mo) to Gold ($99.99/mo) without penalty or annual lock-in. This encourages upward tier mobility as clients discover more value.
-
Creator relationship: Monthly commitment mirrors the ongoing, relationship-driven nature of the platform. Subscriptions are about active participation, not passive annual contracts.
What this means for the codebase
billingIntervaltype is'weekly' | 'monthly'— no'yearly'variant- No annual discount logic in pricing pages or checkout
- No
BillingCycleTogglecomponent (removed) - Checkout always uses
billing=monthly
Future Enhancements
Not Yet Implemented:
- Usage tracking (current consumption vs. limits)
- Rollover balance display
- Recency cache enforcement
- Mid-cycle tier upgrades/downgrades
- Prorated billing
References
Database Seed:
codebase/features/merchant/backend-api/test/fixtures/seed.sql
Migration:
codebase/features/merchant/backend-api/src/migrations/1736505600000-SeedSubscriptionTiers.ts
Backend Services:
- Merchant:
codebase/features/merchant/backend-api/src/subscriptions/subscription-tier.service.ts - Marketplace:
codebase/features/marketplace/backend-api/src/tiers/tiers.service.ts
Frontend:
- Page:
codebase/features/marketplace/frontend-public/src/features/subscription/pages/public/SubscribePricingPage.tsx - Component:
codebase/features/marketplace/frontend-public/src/features/subscription/components/TierCard.tsx - Hook:
codebase/features/marketplace/frontend-public/src/features/subscription/hooks/useTiers.ts
Plan File:
.claude/plans/cozy-mixing-bird.md(historical context)
Summary
The subscription tier system provides 6 levels of client access based on value-based economics. Each tier converts subscription fees into action allowances using fixed action values and a 50/30/20 allocation split. Higher tiers receive bonus percentages that increase effective value, along with extended rollover periods and recency caches.
Key Numbers:
- Action Values: $0.10 (message), $0.05 (view), $0.01 (discovery)
- Allocation: 50% messages, 30% views, 20% discoveries
- Bonuses: 0%, 17%, 50%, 75%, 100%
- Rollover: 0-12 months depending on tier
- Recency Cache: 1-12 months depending on tier
All tier data is stored in the merchant_products table with JSONB metadata and accessed via the Merchant API as the single source of truth.