332 lines
10 KiB
Markdown
332 lines
10 KiB
Markdown
# Billing Module
|
||
|
||
**Last Verified:** January 8, 2026
|
||
**Status:** ✅ Active (Payment System Refactored January 2026)
|
||
**Backend Path:** `backend/igny8_core/modules/billing/` + `backend/igny8_core/business/billing/`
|
||
**Frontend Path:** `frontend/src/pages/Billing/` + `frontend/src/pages/Account/`
|
||
|
||
> **Payment System Reference:** For comprehensive payment gateway documentation (Stripe, PayPal, Bank Transfer), see [PAYMENT-SYSTEM.md](../90-REFERENCE/PAYMENT-SYSTEM.md)
|
||
|
||
---
|
||
|
||
## Quick Reference
|
||
|
||
| What | File | Key Items |
|
||
|------|------|-----------|
|
||
| Models | `business/billing/models.py` | `CreditTransaction`, `CreditUsageLog`, `CreditCostConfig`, `AIModelConfig` |
|
||
| Service | `business/billing/services/credit_service.py` | `CreditService` |
|
||
| Limit Service | `business/billing/services/limit_service.py` | `LimitService` (4 limits only) |
|
||
| Views | `modules/billing/views.py` | `CreditBalanceViewSet`, `CreditUsageViewSet` |
|
||
| Frontend | `pages/Account/PlansAndBillingPage.tsx` | Plans, credits, billing history |
|
||
| Store | `store/billingStore.ts` | `useBillingStore` |
|
||
|
||
---
|
||
|
||
## Purpose
|
||
|
||
The Billing module manages:
|
||
- Credit balance and transactions
|
||
- AI model pricing and credit configuration (v1.4.0)
|
||
- Usage tracking with 4 simplified limits (v1.5.0)
|
||
- Plan enforcement
|
||
- Payment processing
|
||
|
||
---
|
||
|
||
## Data Models
|
||
|
||
### AIModelConfig (NEW v1.4.0)
|
||
|
||
Single Source of Truth for all AI models with pricing.
|
||
|
||
| Field | Type | Purpose |
|
||
|-------|------|---------|
|
||
| model_name | CharField(100) | Model identifier (gpt-4o-mini, dall-e-3) |
|
||
| model_type | CharField(20) | text / image |
|
||
| provider | CharField(50) | openai, anthropic, runware |
|
||
| display_name | CharField(200) | Human-readable name |
|
||
| is_default | BooleanField | One default per type |
|
||
| is_active | BooleanField | Enable/disable |
|
||
| cost_per_1k_input | DecimalField | USD cost per 1K input tokens (text) |
|
||
| cost_per_1k_output | DecimalField | USD cost per 1K output tokens (text) |
|
||
| tokens_per_credit | IntegerField | Text: tokens per 1 credit (e.g., 1000) |
|
||
| credits_per_image | IntegerField | Image: credits per image (1, 5, 15) |
|
||
| quality_tier | CharField(20) | basic / quality / premium |
|
||
| max_tokens | IntegerField | Model token limit |
|
||
| context_window | IntegerField | Model context size |
|
||
| capabilities | JSONField | vision, function_calling, etc. |
|
||
|
||
**Credit Examples:**
|
||
|
||
| Model | tokens_per_credit | credits_per_image | quality_tier |
|
||
|-------|-------------------|-------------------|--------------|
|
||
| gpt-4o | 1000 | - | - |
|
||
| gpt-4o-mini | 10000 | - | - |
|
||
| runware:97@1 | - | 1 | basic |
|
||
| dall-e-3 | - | 5 | quality |
|
||
| google:4@2 | - | 15 | premium |
|
||
|
||
### CreditTransaction (Ledger)
|
||
|
||
| Field | Type | Purpose |
|
||
|-------|------|---------|
|
||
| account | FK | Owner account |
|
||
| transaction_type | CharField | purchase/subscription/refund/deduction/adjustment |
|
||
| amount | Decimal | Positive (add) or negative (deduct) |
|
||
| balance_after | Decimal | Balance after transaction |
|
||
| description | CharField | Transaction description |
|
||
| metadata | JSON | Additional data |
|
||
| payment | FK(Payment) | Payment that triggered this (v1.4.0) |
|
||
| reference_id | CharField | DEPRECATED: Use payment FK |
|
||
| created_at | DateTime | Transaction time |
|
||
|
||
### CreditUsageLog (Analytics)
|
||
|
||
| Field | Type | Purpose |
|
||
|-------|------|---------|
|
||
| account | FK | Owner account |
|
||
| operation_type | CharField | clustering/idea_generation/content_generation/image_generation |
|
||
| credits_used | Decimal | Credits consumed |
|
||
| cost_usd | Decimal | USD cost |
|
||
| model_used | CharField | AI model used |
|
||
| tokens_in | Integer | Input tokens |
|
||
| tokens_out | Integer | Output tokens |
|
||
| content_type | FK | Related content type |
|
||
| object_id | Integer | Related object ID |
|
||
| metadata | JSON | Additional data |
|
||
| created_at | DateTime | Usage time |
|
||
|
||
### CreditCostConfig (Updated v1.4.0)
|
||
|
||
| Field | Type | Purpose |
|
||
|-------|------|---------|
|
||
| operation_type | CharField(50) PK | Unique operation ID |
|
||
| display_name | CharField(100) | Human-readable name |
|
||
| base_credits | IntegerField | Fixed credits per operation |
|
||
| is_active | BooleanField | Enable/disable |
|
||
| description | TextField | Admin notes |
|
||
|
||
**Note:** `tokens_per_credit` moved to AIModelConfig in v1.4.0.
|
||
|
||
---
|
||
|
||
## Credit Calculation Methods
|
||
|
||
### Method 1: Token-Based (Text Models) - Updated v1.4.0
|
||
|
||
Used for: Clustering, Ideas, Content Generation, Optimization
|
||
|
||
**Flow:**
|
||
1. AI call completes
|
||
2. OpenAI returns actual token usage
|
||
3. Calculate: `total_tokens = input_tokens + output_tokens`
|
||
4. Look up `AIModelConfig.tokens_per_credit` for the model used
|
||
5. Calculate: `credits = ceil(total_tokens / tokens_per_credit)`
|
||
6. Deduct from balance
|
||
|
||
**Example:**
|
||
- Model: `gpt-4o-mini` (tokens_per_credit = 10000)
|
||
- Tokens used: 15000
|
||
- Credits: `ceil(15000 / 10000)` = 2 credits
|
||
|
||
### Method 2: Fixed Cost (Image Models) - Updated v1.4.0
|
||
|
||
Used for: Image Generation
|
||
|
||
**Flow:**
|
||
1. User selects quality tier (basic/quality/premium)
|
||
2. Look up `AIModelConfig.credits_per_image` for selected tier
|
||
3. Check balance sufficient: `balance >= num_images * credits_per_image`
|
||
4. Deduct credits
|
||
5. Make AI call
|
||
|
||
**Example:**
|
||
- Quality Tier: "quality" (dall-e-3, credits_per_image = 5)
|
||
- Images: 3
|
||
- Credits: 3 × 5 = 15 credits
|
||
2. Calculate: `credits = num_images * cost_per_image`
|
||
3. Check balance sufficient
|
||
4. Deduct credits
|
||
5. Then make AI call
|
||
|
||
---
|
||
|
||
## API Endpoints
|
||
|
||
| Method | Path | Handler | Purpose |
|
||
|--------|------|---------|---------|
|
||
| GET | `/api/v1/billing/balance/` | `CreditBalanceViewSet.list` | Current balance + monthly usage |
|
||
| GET | `/api/v1/billing/usage/` | `CreditUsageViewSet.list` | Usage log (paginated) |
|
||
| GET | `/api/v1/billing/usage/summary/` | `CreditUsageViewSet.summary` | Aggregated by operation |
|
||
| GET | `/api/v1/billing/usage/limits/` | `CreditUsageViewSet.limits` | Plan limits + current usage |
|
||
| GET | `/api/v1/billing/transactions/` | `TransactionViewSet.list` | Transaction history |
|
||
|
||
---
|
||
|
||
## Credit Service API
|
||
|
||
### Check Credits
|
||
|
||
```python
|
||
CreditService.check_credits(account, required_credits)
|
||
# Raises InsufficientCreditsError if balance < required
|
||
```
|
||
|
||
### Deduct Credits
|
||
|
||
```python
|
||
CreditService.deduct_credits_for_operation(
|
||
account=account,
|
||
operation_type='content_generation',
|
||
amount=word_count, # For per_word operations
|
||
model='gpt-4o-mini',
|
||
tokens_in=2500,
|
||
tokens_out=1500,
|
||
metadata={'content_id': 123}
|
||
)
|
||
```
|
||
|
||
### Add Credits
|
||
|
||
```python
|
||
CreditService.add_credits(
|
||
account=account,
|
||
amount=1000,
|
||
transaction_type='purchase',
|
||
description='Credit package purchase'
|
||
)
|
||
```
|
||
|
||
### Calculate Credits for Images (NEW v1.4.0)
|
||
|
||
```python
|
||
# Calculate credits needed for image generation based on model
|
||
credits = CreditService.calculate_credits_for_image(
|
||
model_name='dall-e-3', # Model with credits_per_image = 5
|
||
num_images=3
|
||
)
|
||
# Returns: 15 (3 images × 5 credits)
|
||
```
|
||
|
||
### Calculate Credits from Tokens by Model (NEW v1.4.0)
|
||
|
||
```python
|
||
# Calculate credits from token usage based on model's tokens_per_credit
|
||
credits = CreditService.calculate_credits_from_tokens_by_model(
|
||
model_name='gpt-4o-mini', # Model with tokens_per_credit = 10000
|
||
total_tokens=15000
|
||
)
|
||
# Returns: 2 (ceil(15000 / 10000))
|
||
```
|
||
|
||
---
|
||
|
||
## Plan Limits
|
||
|
||
### Hard Limits (Never Reset)
|
||
|
||
| Limit | Field | Description |
|
||
|-------|-------|-------------|
|
||
| Sites | `max_sites` | Maximum sites per account |
|
||
| Users | `max_users` | Maximum team members |
|
||
| Keywords | `max_keywords` | Total keywords allowed |
|
||
|
||
### Monthly Limits (Reset on Billing Cycle)
|
||
|
||
| Limit | Field | Description |
|
||
|-------|-------|-------------|
|
||
| Ahrefs Queries | `max_ahrefs_queries` | Live Ahrefs API queries per month |
|
||
|
||
**Note:** As of January 2026, the limit system was simplified from 10+ limits to just 4. Credits handle all AI operation costs (content generation, image generation, clustering, etc.) instead of separate per-operation limits.
|
||
|
||
---
|
||
|
||
## Usage Limits Panel
|
||
|
||
**Component:** `UsageLimitsPanel.tsx`
|
||
|
||
Displays:
|
||
- Progress bars for 4 limits only (Sites, Users, Keywords, Ahrefs Queries)
|
||
- Color coding: blue (safe), yellow (warning), red (critical)
|
||
- Days until reset for monthly limits (Ahrefs Queries)
|
||
- Upgrade CTA when approaching limits
|
||
|
||
---
|
||
|
||
## Credit Costs Reference (Updated v1.4.0)
|
||
|
||
**Text Model Credits** (from `AIModelConfig.tokens_per_credit`):
|
||
|
||
| Model | tokens_per_credit | Cost/Credit | Notes |
|
||
|-------|-------------------|-------------|-------|
|
||
| gpt-4o | 1000 | ~$0.015 | High quality, lower throughput |
|
||
| gpt-4o-mini | 10000 | ~$0.001 | Fast, cost-effective |
|
||
| gpt-4.5-preview | 500 | ~$0.05 | Highest quality |
|
||
|
||
**Image Model Credits** (from `AIModelConfig.credits_per_image`):
|
||
|
||
| Quality Tier | credits_per_image | Model Example | Notes |
|
||
|--------------|-------------------|---------------|-------|
|
||
| Basic | 1 | runware:97@1 | Fast generation |
|
||
| Quality | 5 | dall-e-3 | Balanced |
|
||
| Premium | 15 | google:4@2 | Best quality |
|
||
|
||
**Operation Base Costs** (from `CreditCostConfig.base_credits`):
|
||
|
||
| Operation | Base Credits | Notes |
|
||
|-----------|--------------|-------|
|
||
| Clustering | 10 | Per clustering request |
|
||
| Idea Generation | 2 | Per idea generated |
|
||
| Content Optimization | 5 | Per optimization run |
|
||
|
||
---
|
||
|
||
## Frontend Pages
|
||
|
||
### Plans & Billing (`/account/plans`)
|
||
|
||
**Tabs:**
|
||
1. **Current Plan** - Active plan details, renewal date, "View Usage" link
|
||
2. **Upgrade Plan** - Pricing table with plan comparison
|
||
3. **Billing History** - Invoices and payment history
|
||
|
||
### Usage Analytics (`/account/usage`)
|
||
|
||
**Tabs:**
|
||
1. **Limits & Usage** - Plan limits with progress bars (4 limits only)
|
||
2. **Credit History** - Credit transaction history
|
||
3. **Credit Insights** - Charts: credits by type, daily timeline, operations breakdown
|
||
4. **Activity Log** - API call statistics and operation details
|
||
|
||
---
|
||
|
||
## Integration Points
|
||
|
||
| From | To | Trigger |
|
||
|------|----|---------|
|
||
| AIEngine | CreditService | Pre-check and post-deduct |
|
||
| Automation | CreditService | Per-stage credit tracking |
|
||
| Subscription | Account | Credit allocation |
|
||
| Admin | CreditCostConfig | Price adjustments |
|
||
|
||
---
|
||
|
||
## Common Issues
|
||
|
||
| Issue | Cause | Fix |
|
||
|-------|-------|-----|
|
||
| 402 error | Insufficient credits | Add credits or reduce operation |
|
||
| Usage not showing | Log not created | Check CreditService called |
|
||
| Limits wrong | Cache stale | Clear cache, reload |
|
||
| Monthly usage high | Automation running | Pause automation |
|
||
|
||
---
|
||
|
||
## Planned Changes
|
||
|
||
| Feature | Status | Description |
|
||
|---------|--------|-------------|
|
||
| ~~AI Model Config database~~ | ✅ v1.4.0 | Model pricing moved to AIModelConfig |
|
||
| Image model quality tiers | ✅ v1.4.0 | credits_per_image per quality tier |
|
||
| Credit service enhancements | 🔄 v1.5.0 | Model-specific calculation methods |
|