Issue #543 — Validate Estimated Cost Accuracy (UI vs Backend) Backend: - cost_estimator.py uses pricing catalog (APIProviderPricing) as single source of truth - All 7 cost components: analysis, research (search+LLM), script, TTS, voice clone, avatar, video - initialize_default_pricing() runs on every app startup for auto-sync Frontend cost estimation fixes: - Added missing analysisCost, scriptCost, voiceCloneCost to PodcastEstimate type - toPodcastEstimate() now extracts all 7 backend fields (was dropping 3) - headerCostEst maps analysisCost->Analyze, scriptCost->Write, voiceCloneCost->Produce - EstimateCard shows 5 chips: Analysis, Research, Script, Voice(TTS+clone), Visuals(avatar+video) - Chip sum now equals backend total for all configurations Subscription & plan fixes: - Removed Stripe re-verification from checkSubscription() (downgrade regression fix #539) - Added verifyCheckoutRef pattern for reliable mount-time checkout polling - One-time Stripe sync effect with pending_subscription_change flag for Customer Portal returns - Free plan limits: stability_calls 3->10, audio_calls 5->10 (supports 2 podcasts) - Image enforcement uses actual provider (GPT_PROVIDER), not hardcoded Stability - Billing/pricing pages bypass onboarding check in ProtectedRoute - Gradient buttons + loading spinner on plan chip in UserBadge - Added metadata-based Stripe lookup fallback (Issue #538) Documentation: - TESTING_GUIDE.md: comprehensive testing instructions for non-technical testers - Free plan limits, usage tracking, cost estimation formulas - 10 test cases for UI verification - Troubleshooting guide - Quick-reference cost formulas with all default rates Cleanup: removed legacy ToBeMigrated directory (70+ files, ~22K LOC) GSC Brainstorm: service, hook, modal, and UI components for blog topic brainstorming
Subscription Services Package
Overview
This package consolidates all subscription, billing, and usage tracking related services and middleware into a single, well-organized module. This follows the same architectural pattern as the onboarding package for consistency and maintainability.
Package Structure
backend/services/subscription/
├── __init__.py # Package exports
├── pricing_service.py # API pricing and cost calculations
├── usage_tracking_service.py # Usage tracking and limits
├── exception_handler.py # Exception handling
├── monitoring_middleware.py # API monitoring with usage tracking
└── README.md # This documentation
Services
PricingService
- File:
pricing_service.py - Purpose: Manages API pricing, cost calculation, and subscription limits
- Key Features:
- Dynamic pricing based on API provider and model
- Cost calculation for input/output tokens
- Subscription limit enforcement
- Billing period management
UsageTrackingService
- File:
usage_tracking_service.py - Purpose: Comprehensive tracking of API usage, costs, and subscription limits
- Key Features:
- Real-time usage tracking
- Cost calculation and billing
- Usage limit enforcement with TTL caching
- Usage alerts and notifications
SubscriptionExceptionHandler
- File:
exception_handler.py - Purpose: Centralized exception handling for subscription-related errors
- Key Features:
- Custom exception types
- Error handling decorators
- Consistent error responses
Monitoring Middleware
- File:
monitoring_middleware.py - Purpose: FastAPI middleware for API monitoring and usage tracking
- Key Features:
- Request/response monitoring
- Usage tracking integration
- Performance metrics
- Database API monitoring
Usage
Import Pattern
Always use the consolidated package for subscription-related imports:
# ✅ Correct - Use consolidated package
from services.subscription import PricingService, UsageTrackingService
from services.subscription import SubscriptionExceptionHandler
from services.subscription import check_usage_limits_middleware
# ❌ Incorrect - Old scattered imports
from services.pricing_service import PricingService
from services.usage_tracking_service import UsageTrackingService
from middleware.monitoring_middleware import check_usage_limits_middleware
Service Initialization
from services.subscription import PricingService, UsageTrackingService
from services.database import get_db
# Get database session
db = next(get_db())
# Initialize services
pricing_service = PricingService(db)
usage_service = UsageTrackingService(db)
Middleware Registration
from services.subscription import monitoring_middleware
# Register middleware in FastAPI app
app.middleware("http")(monitoring_middleware)
Database Models
The subscription services use the following database models (defined in backend/models/subscription_models.py):
APIProvider- API provider enumerationSubscriptionPlan- Subscription plan definitionsUserSubscription- User subscription recordsUsageSummary- Usage summary by billing periodAPIUsageLog- Individual API usage logsAPIProviderPricing- Pricing configurationUsageAlert- Usage limit alertsSubscriptionTier- Subscription tier definitionsBillingCycle- Billing cycle enumerationUsageStatus- Usage status enumeration
Key Features
1. Database-Only Persistence
- All data stored in database tables
- No file-based storage
- User-isolated data access
2. TTL Caching
- In-memory caching for performance
- 30-second TTL for usage limit checks
- 10-minute TTL for dashboard data
3. Real-time Monitoring
- Live API usage tracking
- Performance metrics collection
- Error rate monitoring
4. Flexible Pricing
- Per-provider pricing configuration
- Model-specific pricing
- Dynamic cost calculation
Error Handling
The package provides comprehensive error handling:
from services.subscription import (
SubscriptionException,
UsageLimitExceededException,
PricingException,
TrackingException
)
try:
# Subscription operation
pass
except UsageLimitExceededException as e:
# Handle usage limit exceeded
pass
except PricingException as e:
# Handle pricing error
pass
Configuration
The services use environment variables for configuration:
SUBSCRIPTION_DASHBOARD_NOCACHE- Bypass dashboard cacheENABLE_ALPHA- Enable alpha features (default: false)
Migration from Old Structure
This package consolidates the following previously scattered files:
backend/services/pricing_service.py→subscription/pricing_service.pybackend/services/usage_tracking_service.py→subscription/usage_tracking_service.pybackend/services/subscription_exception_handler.py→subscription/exception_handler.pybackend/middleware/monitoring_middleware.py→subscription/monitoring_middleware.py
Benefits
- Single Package: All subscription logic in one location
- Clear Ownership: Easy to find subscription-related code
- Better Organization: Follows same pattern as onboarding
- Easier Maintenance: Single source of truth for billing logic
- Consistent Architecture: Matches onboarding consolidation
Related Packages
services.onboarding- Onboarding and user setupmodels.subscription_models- Database modelsapi.subscription- API endpoints (modular structure with routes inapi/subscription/routes/)