# Production Readiness Plan
**Created:** December 25, 2025
**Last Updated:** December 25, 2025
**Goal:** Ship to production with simplified UI while keeping backend unchanged
**Status:** ✅ CORE CHANGES COMPLETE
---
## Implementation Status
### ✅ Completed Changes
| File | Change | Status |
|------|--------|--------|
| `layout/AppLayout.tsx` | Header shows "Content: X/Y" | ✅ Done |
| `pages/Dashboard/Home.tsx` | Credit widget → "Content This Month" | ✅ Done |
| `pages/Help/Help.tsx` | FAQ updated | ✅ Done |
| `pages/Automation/AutomationPage.tsx` | Error messages updated | ✅ Done |
| `components/auth/SignUpForm*.tsx` | 3 files - removed credit text | ✅ Done |
| `pages/Settings/Plans.tsx` | Shows "Pages/Articles per month" | ✅ Done |
| `pages/account/PlansAndBillingPage.tsx` | Tabs simplified, Purchase Credits hidden | ✅ Done |
| `pages/Payment.tsx` | Updated pricing display | ✅ Done |
| `pages/Optimizer/Dashboard.tsx` | Removed credits card | ✅ Done |
| `pages/Settings/CreditsAndBilling.tsx` | Renamed to "Usage & Billing" | ✅ Done |
| `pages/Billing/Credits.tsx` | Renamed to "Content Usage" | ✅ Done |
| `components/billing/BillingBalancePanel.tsx` | "Usage Overview" | ✅ Done |
| `components/dashboard/CreditBalanceWidget.tsx` | "Content Usage" | ✅ Done |
| `components/dashboard/UsageChartWidget.tsx` | "Content Created" | ✅ Done |
| `components/ui/pricing-table/index.tsx` | "Content pieces/month" | ✅ Done |
| `marketing/pages/Pricing.tsx` | "Usage Dashboard" | ✅ Done |
| `docs/40-WORKFLOWS/CREDIT-SYSTEM.md` | Updated docs | ✅ Done |
### Hidden from Regular Users
| Feature | Status |
|---------|--------|
| Purchase Credits page | Hidden (commented out) |
| Credit Cost Breakdown | Hidden |
| Credit Packages grid | Hidden |
| Detailed credit analytics | Hidden |
---
## The Strategy: Abstraction Layer
```
┌─────────────────────────────────────────────────────────────────┐
│ WHAT CHANGES │
├─────────────────────────────────────────────────────────────────┤
│ │
│ BACKEND (NO CHANGES) FRONTEND (CHANGES) │
│ ────────────────────── ────────────────── │
│ • Credit deduction ✓ • Hide credit numbers ✅ │
│ • Usage tracking ✓ • Show "Content Pieces" ✅ │
│ • Plan limits ✓ • Simplify terminology ✅ │
│ • API responses ✓ • Remove purchase credits ✅ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
**Key Insight:** Backend tracks `content_credits`. User sees this as "Content Pieces".
No conversion needed - just rename the display.
---
## Phase 1: Core Abstraction (billingStore)
### File: `frontend/src/store/billingStore.ts`
Add computed properties that translate credits → content pieces:
```typescript
// Add to BillingState interface
interface BillingState {
// ... existing ...
// Computed for simple UI
getContentPiecesRemaining: () => number;
getContentPiecesUsed: () => number;
getContentPiecesTotal: () => number;
}
// In the store
getContentPiecesRemaining: () => {
const balance = get().balance;
// content_credits = content pieces (1:1 mapping)
return balance?.credits_remaining ?? 0;
},
getContentPiecesUsed: () => {
const balance = get().balance;
return balance?.credits_used_this_month ?? 0;
},
getContentPiecesTotal: () => {
const balance = get().balance;
return balance?.plan_credits_per_month ?? 0;
},
```
---
## Phase 2: Header Metrics Update
### File: `frontend/src/layout/AppLayout.tsx`
**Current (line ~138):**
```typescript
{
label: 'Credits',
value: balance.credits.toLocaleString(),
// ...
}
```
**Change to:**
```typescript
{
label: 'Content',
value: `${balance.credits_remaining}/${balance.plan_credits_per_month}`,
tooltip: 'Content pieces remaining this month'
}
```
---
## Phase 3: Pages to Update
### Priority 1: Remove/Hide These Pages
| Page | File | Action |
|------|------|--------|
| Purchase Credits | `pages/account/PurchaseCreditsPage.tsx` | Hide from nav, keep for admin |
| Credits Tab | `pages/Billing/Credits.tsx` | Remove tab from billing |
| Credits & Billing | `pages/Settings/CreditsAndBilling.tsx` | Rename to "Usage" |
### Priority 2: Update Text/Labels
| Page | File | Changes |
|------|------|---------|
| Dashboard | `pages/Dashboard/Home.tsx` | "Credits" → "Content Pieces" |
| Plans & Billing | `pages/account/PlansAndBillingPage.tsx` | Remove Credits tab, simplify |
| Usage Analytics | `pages/account/UsageAnalyticsPage.tsx` | "Credits" → "Content" |
| Automation | `pages/Automation/AutomationPage.tsx` | "credits" → "content pieces" |
| Help | `pages/Help/Help.tsx` | Update FAQ text |
### Priority 3: Marketing Pages
| Page | File | Changes |
|------|------|---------|
| Pricing | `marketing/pages/Pricing.tsx` | Already updated per session |
| Waitlist | `marketing/pages/Waitlist.tsx` | Update copy |
---
## Phase 4: Components to Update
### High Priority
| Component | File | Changes |
|-----------|------|---------|
| CreditBalanceWidget | `components/dashboard/CreditBalanceWidget.tsx` | Rename to ContentBalanceWidget |
| BillingBalancePanel | `components/billing/BillingBalancePanel.tsx` | Remove "Purchase Credits" link |
| BillingUsagePanel | `components/billing/BillingUsagePanel.tsx` | Simplify display |
| CurrentProcessingCard | `components/Automation/CurrentProcessingCard.tsx` | "Credits Used" → "Content Generated" |
| RunHistory | `components/Automation/RunHistory.tsx` | Same |
### Medium Priority (Can ship with these unchanged)
| Component | File | Notes |
|-----------|------|-------|
| CreditCostBreakdownPanel | `components/billing/CreditCostBreakdownPanel.tsx` | Admin only, keep |
| CreditCostsPanel | `components/billing/CreditCostsPanel.tsx` | Admin only, keep |
| UsageChartWidget | `components/dashboard/UsageChartWidget.tsx` | Keep for analytics |
---
## Phase 5: Routes to Update
### File: `frontend/src/App.tsx`
**Remove from user routes:**
```typescript
// Remove or hide:
} />
} />
```
**Keep for admin access only** (add admin check)
---
## Phase 6: Terminology Mapping
Use this mapping consistently:
| OLD (Backend/Internal) | NEW (User-Facing) |
|------------------------|-------------------|
| credits | content pieces |
| credit balance | content remaining |
| credits used | content generated |
| plan_credits_per_month | monthly content limit |
| credits_remaining | content pieces left |
| insufficient credits | content limit reached |
| purchase credits | upgrade plan |
---
## Phase 7: Error Messages
### File: Create `frontend/src/utils/userFriendlyMessages.ts`
```typescript
export const USER_MESSAGES = {
INSUFFICIENT_CREDITS: "You've reached your content limit for this month. Upgrade your plan for more.",
CREDIT_DEDUCTED: "Content piece generated successfully",
LOW_BALANCE: "You're running low on content pieces this month",
// Operation-specific
CLUSTERING_SUCCESS: "Keywords organized into topics",
IDEAS_SUCCESS: "Content ideas generated",
CONTENT_SUCCESS: "Article draft created",
IMAGES_SUCCESS: "Images generated",
};
```
---
## Implementation Order
### Day 1: Core Changes (Ship Blocker)
1. [ ] Update `billingStore.ts` with computed properties
2. [ ] Update `AppLayout.tsx` header metric
3. [ ] Update `PlansAndBillingPage.tsx` - remove Credits tab
4. [ ] Hide Purchase Credits route (don't delete)
### Day 2: Dashboard & Key Pages
5. [ ] Update `Dashboard/Home.tsx` labels
6. [ ] Update `UsageAnalyticsPage.tsx` labels
7. [ ] Update `AutomationPage.tsx` labels
8. [ ] Update `Help.tsx` FAQ content
### Day 3: Components & Polish
9. [ ] Rename CreditBalanceWidget → ContentBalanceWidget
10. [ ] Update BillingBalancePanel
11. [ ] Update CurrentProcessingCard
12. [ ] Update RunHistory
### Day 4: Marketing & Final
13. [ ] Verify Pricing page is correct
14. [ ] Update Waitlist/Tour pages
15. [ ] Update SignUp form text
16. [ ] Final QA pass
---
## What NOT to Change
Keep these exactly as-is:
1. **Backend API endpoints** - All `/v1/billing/*` endpoints
2. **Database models** - CreditBalance, CreditUsage, etc.
3. **Credit deduction logic** - In business services
4. **Admin pages** - Keep full credit visibility for admins
5. **API responses** - Backend still returns `credits`, frontend translates
---
## Backend Soft Limits (Already Implemented)
Per the pricing session, backend should enforce:
| Limit | Starter | Growth | Scale |
|-------|---------|--------|-------|
| Content pieces/mo | 50 | 200 | 500 |
| Keyword imports/mo | 500 | 2,000 | 5,000 |
| Clustering ops/mo | 100 | 400 | 1,000 |
| Idea generations/mo | 150 | 600 | 1,500 |
**If not implemented:** These are hidden from user but prevent abuse. Add backend validation in:
- `backend/igny8_core/business/billing/services.py`
---
## Quick Wins (Can Do Now)
### 1. Header Metric (5 min)
In `AppLayout.tsx`, change:
```typescript
label: 'Credits',
```
to:
```typescript
label: 'Content',
```
### 2. Help FAQ (5 min)
In `Help.tsx`, update the credits question to:
```
question: "How does content usage work?"
answer: "Each plan includes a monthly content allowance. Creating articles, generating ideas, and producing images all count toward your monthly limit. View your usage in Settings > Usage."
```
### 3. Hide Purchase Credits Link (5 min)
In `BillingBalancePanel.tsx`, remove or conditionally hide:
```typescript
Purchase Credits
```
---
## Testing Checklist
Before production:
- [ ] User can see "47/50 Content" in header (not "835 Credits")
- [ ] Plans page shows content pieces, not credits
- [ ] No "Purchase Credits" visible to regular users
- [ ] Automation shows "Content Generated: 5" not "Credits Used: 5"
- [ ] Error on limit shows "Content limit reached" not "Insufficient credits"
- [ ] Dashboard shows simple progress bar with content count
- [ ] Help/FAQ explains content pieces, not credits
---
## Summary
**Total effort:** ~2-3 days of frontend work
**Backend changes:** Zero
**Risk:** Low (display-only changes)
**Rollback:** Easy (revert frontend only)
The system still tracks everything internally with credits. Users just see a simpler "content pieces" model that maps 1:1 to content credits.