Skip to content

Subscriptions ​

Softly uses RevenueCat for subscription management across iOS and Android. The backend syncs subscription state from RevenueCat via webhooks and on-demand sync.

Pricing ​

PlanPrice
Free$0 forever
Pro Monthly$4.99/month
Pro Annual$39.99/year (save 33%)
Lifetime$79.99 one-time
Family$7.99/month

Tiers ​

FeatureFreeProFamily
Tasks5 maxUnlimitedUnlimited
Recurring tasksNoYesYes
AI parses/month5200200 (shared pool)
Voice inputNative onlyDeepgram + nativeDeepgram + native
NL editing (QuickEditBar)NoYesYes
AI suggestionsStarter (hardcoded)AI-powered (Haiku)AI-powered (Haiku)
Streak freezeNoYes (1/week)Yes (1/week)
Celebrations (confetti)NoYesYes
Life admin scoreNoYesYes
Document vaultNoYesYes
Life templatesNoYesYes
Smart reschedulingNoYesYes
Household sharingNoNoYes
Family activity feedNoNoYes

RevenueCat Integration ​

RevenueCat handles all App Store and Play Store interactions. The mobile app uses the RevenueCat SDK (services/revenuecat.ts) to:

  1. Present the custom paywall
  2. Process purchases
  3. Restore previous purchases

After a successful purchase, the app calls POST /api/v1/subscriptions/sync to trigger a backend sync. The backend queues a SyncSubscriptionJob that calls the RevenueCat API to verify and update the user's tier.

Webhook Sync ​

RevenueCat sends webhook events for subscription changes (renewals, cancellations, billing issues). The backend receives these at:

POST /api/v1/webhooks/revenuecat

The webhook is verified using the REVENUECAT_WEBHOOK_SECRET environment variable. On receipt, it queues the same SyncSubscriptionJob for async processing.

Custom Paywall ​

The paywall screen (subscription/index.tsx) is a custom-built UI using Purchases.getOfferings() and Purchases.purchasePackage() directly — no RevenueCatUI templates needed. It shows:

  • Billing period toggle (Monthly / Annual / Lifetime)
  • Pro feature list with pricing
  • Free tier comparison
  • Restore purchases button
  • Apple legal text

Lifetime vs Recurring ​

Lifetime users have subscription_tier: "pro" with subscription_expires_at: null. The mobile app distinguishes them with a gold crown badge (vs sage for recurring Pro). Sustainability math: a lifetime purchase at $79.99 covers ~80 years of AI costs at Haiku pricing.

Tier Limits ​

Limits are enforced on the backend. When a free user hits a limit, the API returns a 403 with a message prompting upgrade:

  • Task limit: Free users cannot create more than 5 tasks
  • Recurring tasks: Free users cannot create recurring tasks
  • AI limit: Free users get 5 AI parses per month
  • Voice: Deepgram transcription tokens are only issued to Pro/Family users
  • AI suggestions: Free users see hardcoded starter suggestions only (no AI call)

Grandfathered Users ​

Users who signed up during beta are flagged with grandfathered_at and receive unlimited AI access and all Pro features regardless of their subscription tier.

AI Cost Per User ​

TierAI Cost/MonthRevenue/MonthMargin
Free$0.003$0-$0.003
Pro$0.02$4.9999.6%
Family$0.04$7.9999.5%

AI costs are negligible thanks to Claude Haiku (~10x cheaper than Sonnet). See Cost Analysis for full breakdown.

Internal documentation — not for public distribution