# IGNY8 Phase 4: Pricing & Launch (04C) ## Feature Gating, Plan Matrix, WP.org Submission, Go-to-Market, Migration **Document Version:** 1.0 **Date:** 2026-03-23 **Phase:** IGNY8 Phase 4 — Business Layer **Status:** Build Ready **Source of Truth:** Codebase at `/data/app/igny8/` **Audience:** Claude Code, Backend Developers, Frontend Developers, Product --- ## 1. CURRENT STATE ### Current Plan Structure - 4 plans live: Free ($0), Starter ($49), Growth ($149), Scale ($349) - Stripe + PayPal integrated for payment processing - Plan model exists in `billing` app with basic feature limits (sites, credits) - Feature gating is minimal — no granular per-feature capability matrix - No `plan_features` JSONField on Plan ### No WordPress.org Plugin Submission - WP plugin built in 03A but not submitted to WP.org directory - No SVN deploy pipeline configured - No readme.txt in WP.org format - No plugin banner/icon assets ### No Go-to-Market Strategy Implemented - Current clients are direct Alorig relationships - No organic acquisition funnel from WP.org - No marketing automation for plan upgrade nudges - No add-on purchase flow for managed services ### Phase 4A + 4B Complete - `ManagedServiceSubscription` model (04A) — tiers, pricing, monthly targets - `BacklinkServiceOrder` model (04A) — packages, pricing, margin tracking - `ServiceReport` model (04B) — automated reports with PDF generation - `AgencyBranding` model (04B) — white-label branding config - All Phase 2 features built — each needs plan-level gating --- ## 2. WHAT TO BUILD ### Updated Plan Feature Matrix Core SaaS plan prices unchanged. All V2 features gated by plan level: | Feature | Free | Starter ($49) | Growth ($149) | Scale ($349) | |---------|------|---------------|---------------|--------------| | Sites | 1 | 3 | 10 | Unlimited | | Credits/month | 100 | 1,000 | 5,000 | 25,000 | | SAG Blueprint | Quick mode only | Quick + Detailed | Full | Full | | Content Types | Post only | Post + Page | All types | All types | | Taxonomy Content (02B) | — | — | Yes | Yes | | GSC Integration (02C) | — | Basic (analytics) | Full (+ indexing) | Full | | Internal Linker (02D) | — | Audit only | Audit + auto-insert | Full + remediation | | External Backlinks (02E) | — | — | Self-service | Self-service + API | | Optimizer (02F) | — | Basic analysis | Full rewrite | Full + batch | | Rich Schema (02G) | Basic (Article) | 5 types | All 10 types | All + retroactive | | Socializer (02H) | — | 2 platforms | All platforms | All + auto-schedule | | Video Creator (02I) | — | — | Short-form only | All formats | | Ahrefs Integration (04A) | — | — | Read-only metrics | Full (verify + prospect) | | Backlink Indexing (04A) | — | — | — | Included | | Reports (04B) | — | — | Monthly PDF | Weekly + custom | | White-Label (04B) | — | — | — | Yes | | API Access | — | — | Read-only | Full CRUD | | Managed Services (04A) | — | — | Can purchase Lite | Can purchase Lite/Pro | ### Feature Flag System **Approach:** Add `plan_features` JSONField on existing `Plan` model. **JSON structure per plan:** ```json { "sag_mode": "quick", "content_types": ["post"], "taxonomy_content": false, "gsc_level": "none", "linker_level": "none", "backlinks_level": "none", "optimizer_level": "none", "schema_types": 0, "socializer_platforms": 0, "video_level": "none", "ahrefs_level": "none", "backlink_indexing": false, "report_level": "none", "white_label": false, "api_access": "none", "managed_services": "none" } ``` **Feature level hierarchies:** ```python LEVEL_HIERARCHY = { "sag_mode": ["quick", "detailed", "full"], "gsc_level": ["none", "basic", "full"], "linker_level": ["none", "audit", "auto", "full"], "backlinks_level": ["none", "self_service", "self_service_api"], "optimizer_level": ["none", "basic", "full", "batch"], "video_level": ["none", "short", "all"], "ahrefs_level": ["none", "readonly", "full"], "report_level": ["none", "monthly", "weekly_custom"], "api_access": ["none", "readonly", "full"], "managed_services": ["none", "lite", "lite_pro"], } ``` **Feature gate checking pattern:** ```python class FeatureGateService: @staticmethod def check_feature(account, feature, required_level): plan = account.subscription.plan features = plan.plan_features or {} current = features.get(feature, "none") hierarchy = LEVEL_HIERARCHY.get(feature) if hierarchy is None: # Boolean or list feature — direct comparison return bool(current) return hierarchy.index(current) >= hierarchy.index(required_level) ``` **Decorator for ViewSets:** ```python def require_feature(feature, required_level): def decorator(view_func): @wraps(view_func) def wrapper(self, request, *args, **kwargs): account = request.user.account if not FeatureGateService.check_feature(account, feature, required_level): return Response( {"detail": f"Feature '{feature}' requires plan upgrade."}, status=403 ) FeatureGateService.log_usage(account, feature, required_level, True, request.path) return view_func(self, request, *args, **kwargs) return wrapper return decorator ``` **Usage example:** ```python class InternalLinkViewSet(viewsets.ModelViewSet): @require_feature('linker_level', 'auto') def auto_insert(self, request): ... ``` ### Managed Services Add-On Pricing (in Billing Flow) | Add-On | Price | Available To | |--------|-------|-------------| | Managed Lite | $100/site/month | Growth + Scale plans | | Managed Pro | $399/site/month | Scale plan only | | Backlink Package (Starter) | $800–$1,500/month | Growth + Scale | | Backlink Package (Growth) | $2,000–$4,000/month | Growth + Scale | | Backlink Package (Authority) | $4,000–$8,000/month | Scale only | | Indexing Boost (standalone) | $0.15/URL | Growth + Scale | Add-ons are purchased via existing Stripe/PayPal subscription modification. Each add-on creates related model records: - Managed services → `ManagedServiceSubscription` (04A) - Backlink packages → `BacklinkServiceOrder` (04A) - Indexing boost → credit balance increase for indexing operations ### WordPress.org Plugin Submission **Plugin identity:** `igny8-seo` (standalone plugin from 03A, rebranded for WP.org) **Version:** 2.0.0 **License:** GPL v2+ **Submission checklist (10 items):** | # | Requirement | Details | |---|------------|---------| | 1 | Input sanitization | All user inputs sanitized with `sanitize_text_field()`, `intval()`, `wp_kses_post()` | | 2 | Output escaping | All outputs escaped with `esc_html()`, `esc_attr()`, `esc_url()`, `wp_kses_post()` | | 3 | Nonce verification | All form submissions verified with `wp_verify_nonce()` / `check_admin_referer()` | | 4 | No unauthorized external calls | Phone-home disabled by default, Settings API toggle for optional usage analytics | | 5 | GPL v2+ license | `LICENSE` file in plugin root, `License: GPLv2 or later` in plugin header | | 6 | `readme.txt` | WP.org formatted: short description, installation, FAQ, changelog, screenshots | | 7 | Assets | Banner 1544×500 + 772×250, icon 256×256 + 128×128, 8+ screenshots | | 8 | Translation-ready | All strings in `__()`, `_e()`, `esc_html__()` with `igny8` text domain | | 9 | No minified JS without source | Unminified versions included alongside minified | | 10 | Security hardening | `ABSPATH` check at top of every PHP file, no `eval()`, no `file_get_contents()` for remote | **Privacy compliance:** - No tracking without consent - No storing user IPs (hash only if needed) - Privacy policy section in readme.txt **Post-approval setup:** - SVN deploy pipeline: GitHub tag → GitHub Actions → WP.org SVN - Auto-deploy on version tag push - Update checker: `/api/v1/plugins/igny8-seo/check-update/` for connected users **Review timeline:** Typically 1–4 weeks for initial WP.org review. ### Go-to-Market Strategy **5 Target Audiences:** | # | Audience | How They Find Us | Conversion Path | |---|----------|-----------------|----------------| | 1 | WordPress site owners | WP.org plugin directory search | Free plugin → Setup Wizard → Free Plan → Upgrade | | 2 | SEO agencies | Direct outreach, white-label pitch | Demo → Managed Pro → Backlink packages | | 3 | Content creators/bloggers | WP.org + SEO community + content about SAG | Free → Growth for full content pipeline | | 4 | eCommerce stores | WP.org (WooCommerce integration mention) | Free → Growth for product schema + services | | 5 | Local businesses | WP.org (LocalBusiness schema, service areas) | Free → Starter for GSC + schema | **Acquisition Funnel:** ``` WP.org Plugin (free) → Install → Setup Wizard → → Free Plan (100 credits) → Experience value → → Upgrade to Starter/Growth/Scale → → Optional: Purchase Managed Services add-on → → Optional: Purchase Backlink Packages ``` ### Launch Sequence | Step | Action | Timing | |------|--------|--------| | 1 | Enable `managed_services_enabled` flag in staging | Week 1 | | 2 | Onboard 2–3 existing Alorig clients as beta managed service subscribers | Week 1–2 | | 3 | Test full cycle: onboarding → content → backlinks → indexing → reporting | Week 2–3 | | 4 | Fix issues from beta testing | Week 3 | | 5 | Submit WP.org plugin (parallel with beta testing) | Week 2 | | 6 | Enable feature flags in production | Week 3–4 | | 7 | Update pricing page on marketing site | Week 4 | | 8 | Send announcement email to existing users | Week 4 | | 9 | Begin WP.org organic acquisition (post-approval) | Ongoing | ### Existing User Migration **Principle:** Nothing existing breaks. New feature gates apply to new features only. **Migration steps:** 1. Run one-time `migrate_plan_features` Celery task 2. Populate `plan_features` JSONField on all 4 existing Plan records with appropriate values 3. Existing users retain current plan pricing (grandfathered) 4. Existing credits + billing cycles unchanged 5. Users gain access to new V2 features according to their plan level **Migration data per plan:** ```python PLAN_FEATURE_DEFAULTS = { "free": { "sag_mode": "quick", "content_types": ["post"], "taxonomy_content": False, "gsc_level": "none", "linker_level": "none", "backlinks_level": "none", "optimizer_level": "none", "schema_types": 0, "socializer_platforms": 0, "video_level": "none", "ahrefs_level": "none", "backlink_indexing": False, "report_level": "none", "white_label": False, "api_access": "none", "managed_services": "none", }, "starter": { "sag_mode": "detailed", "content_types": ["post", "page"], "taxonomy_content": False, "gsc_level": "basic", "linker_level": "audit", "backlinks_level": "none", "optimizer_level": "basic", "schema_types": 5, "socializer_platforms": 2, "video_level": "none", "ahrefs_level": "none", "backlink_indexing": False, "report_level": "none", "white_label": False, "api_access": "none", "managed_services": "none", }, "growth": { "sag_mode": "full", "content_types": "all", "taxonomy_content": True, "gsc_level": "full", "linker_level": "auto", "backlinks_level": "self_service", "optimizer_level": "full", "schema_types": 10, "socializer_platforms": "all", "video_level": "short", "ahrefs_level": "readonly", "backlink_indexing": False, "report_level": "monthly", "white_label": False, "api_access": "readonly", "managed_services": "lite", }, "scale": { "sag_mode": "full", "content_types": "all", "taxonomy_content": True, "gsc_level": "full", "linker_level": "full", "backlinks_level": "self_service_api", "optimizer_level": "batch", "schema_types": "all_retroactive", "socializer_platforms": "all_auto", "video_level": "all", "ahrefs_level": "full", "backlink_indexing": True, "report_level": "weekly_custom", "white_label": True, "api_access": "full", "managed_services": "lite_pro", }, } ``` --- ## 3. DATA MODELS & APIS ### Modified Models **`Plan` (billing app)** — add field: | Field | Type | Description | |-------|------|-------------| | `plan_features` | JSONField(default=dict) | Feature capability matrix per plan | No new table — existing `igny8_plans` table gets new column. ### New Models **`FeatureUsageLog`** (extends `AccountBaseModel`, billing app) | Field | Type | Description | |-------|------|-------------| | `feature` | CharField(max_length=50) | Feature key checked (e.g., `linker_level`) | | `required_level` | CharField(max_length=30) | Level that was required | | `current_level` | CharField(max_length=30) | Level user's plan has | | `was_allowed` | BooleanField | Whether access was granted | | `endpoint` | CharField(max_length=200) | API endpoint that triggered the check | | `timestamp` | DateTimeField(auto_now_add=True) | When the check happened | Table: `igny8_feature_usage_log` Purpose: Track which features users hit gates on → inform pricing decisions and identify upgrade opportunities. ### API Endpoints All under `/api/v1/`: **Feature Gates:** | Method | Endpoint | Purpose | |--------|----------|---------| | GET | `/billing/features/` | Current account's available features | | GET | `/billing/features/check/{feature}/` | Check specific feature access | **Plan Management (admin only):** | Method | Endpoint | Purpose | |--------|----------|---------| | GET | `/billing/plans/` | List all plans with features | | PUT | `/billing/plans/{id}/features/` | Update plan feature matrix | **Add-On Purchases:** | Method | Endpoint | Purpose | |--------|----------|---------| | GET | `/billing/add-ons/` | List available add-ons for current plan | | POST | `/billing/add-ons/managed-service/` | Purchase managed service add-on | | POST | `/billing/add-ons/backlink-package/` | Purchase backlink package | | POST | `/billing/add-ons/indexing-boost/` | Purchase indexing credits | **WP.org Plugin (public, no auth required):** | Method | Endpoint | Purpose | |--------|----------|---------| | GET | `/plugins/igny8-seo/info/` | Plugin info for WP update checker | | GET | `/plugins/igny8-seo/download/` | Download latest ZIP | | GET | `/plugins/igny8-seo/check-update/` | Version check endpoint | ### Celery Tasks | Task | Schedule | Purpose | |------|----------|---------| | `migrate_plan_features` | One-time | Populate `plan_features` on existing Plan records | | `sync_wporg_stats` | Daily | Fetch WP.org download/rating stats | | `feature_usage_report` | Weekly | Aggregate FeatureUsageLog for product decisions | ### Services | Service | Purpose | |---------|---------| | `FeatureGateService` | `check_feature()`, `get_plan_features()`, `log_usage()` | | `AddOnPurchaseService` | Process add-on purchases via existing Stripe/PayPal integration | | `WPOrgDeployService` | SVN deploy pipeline config for WP.org (GitHub Actions) | --- ## 4. IMPLEMENTATION STEPS ### Build Sequence **Week 1: Feature Gate System** 1. Add `plan_features` JSONField to `Plan` model + migration 2. Create `FeatureUsageLog` model + migration 3. Build `FeatureGateService` with `check_feature()`, `log_usage()` 4. Build `@require_feature()` decorator 5. Create feature check API endpoints (`/billing/features/`) 6. Write `migrate_plan_features` one-time task with `PLAN_FEATURE_DEFAULTS` **Week 2: Plan Feature Integration** 1. Apply `@require_feature()` decorator to all Phase 2 module ViewSets: - 02B taxonomy content endpoints → `taxonomy_content` - 02C GSC endpoints → `gsc_level` - 02D internal linker endpoints → `linker_level` - 02E external backlinks endpoints → `backlinks_level` - 02F optimizer endpoints → `optimizer_level` - 02G schema endpoints → `schema_types` - 02H socializer endpoints → `socializer_platforms` - 02I video endpoints → `video_level` - 04A Ahrefs endpoints → `ahrefs_level` - 04A indexing endpoints → `backlink_indexing` - 04B report endpoints → `report_level` - 04B white-label endpoints → `white_label` 2. Build add-on purchase endpoints using existing Stripe/PayPal 3. Build plan admin feature update endpoint **Week 3: WP.org Submission + Launch** 1. Build WP.org plugin info/download/check-update public endpoints 2. Prepare plugin for WP.org: readme.txt, assets, security audit 3. Set up GitHub Actions → WP.org SVN deploy pipeline 4. Submit plugin to WP.org review queue 5. Run `migrate_plan_features` on production 6. Update marketing site pricing page ### Frontend Changes **Billing pages (existing):** - Update plan comparison table to show all V2 features - Add "Feature Unavailable" overlay when gated feature accessed on lower plan - Add upgrade CTA buttons inline with gated features **Add-on purchase flow:** ``` frontend/src/pages/Billing/ ├── AddOns.tsx # Available add-ons for current plan │ ├── ManagedServiceCard.tsx # Lite/Pro tier selection → purchase │ ├── BacklinkPackageCard.tsx # Package selection → purchase │ └── IndexingBoostCard.tsx # Quantity slider → purchase └── PlanComparison.tsx # Updated with all V2 features ``` **Zustand store addition:** ```typescript // Extend existing billing store interface BillingState { // ... existing fields planFeatures: PlanFeatures | null addOns: AddOn[] fetchPlanFeatures: () => Promise purchaseAddOn: (type: string, params: AddOnParams) => Promise checkFeature: (feature: string) => boolean } ``` **Feature gate UI pattern:** ```tsx // Reusable component for gated features const FeatureGate: React.FC<{ feature: string; requiredLevel: string }> = ({ feature, requiredLevel, children }) => { const { checkFeature } = useBillingStore() if (!checkFeature(feature)) { return } return <>{children} } ``` --- ## 5. ACCEPTANCE CRITERIA ### Feature Gate System - [ ] `plan_features` JSONField added to `Plan` model - [ ] `FeatureGateService.check_feature()` correctly evaluates level hierarchy - [ ] `@require_feature()` decorator returns 403 with upgrade message for insufficient plan - [ ] `FeatureUsageLog` records all gate checks (allowed and denied) - [ ] All Phase 2 module ViewSets decorated with appropriate feature gates - [ ] `/billing/features/` returns current account's feature matrix - [ ] `/billing/features/check/{feature}/` returns allowed/denied for specific feature ### Plan Feature Defaults - [ ] Free plan: quick SAG, post only, no V2 features - [ ] Starter plan: detailed SAG, post + page, basic GSC, audit linker, basic optimizer, 5 schema types, 2 social platforms - [ ] Growth plan: full SAG, all content types, full GSC, auto linker, full optimizer, all schema, all social, short video, readonly Ahrefs, monthly reports, readonly API, can purchase Lite managed - [ ] Scale plan: everything at maximum level including white-label, weekly reports, full API, both managed tiers ### Add-On Purchases - [ ] Add-on availability respects plan level (e.g., Authority package only for Scale) - [ ] Purchase creates appropriate model records (ManagedServiceSubscription, BacklinkServiceOrder) - [ ] Stripe/PayPal subscription modification works for recurring add-ons - [ ] One-time purchases (indexing boost) add credits correctly ### Migration - [ ] `migrate_plan_features` task populates all 4 existing plans correctly - [ ] Existing users see no change in accessible features they already had - [ ] New V2 features available according to plan level after migration ### WP.org Plugin - [ ] `/plugins/igny8-seo/info/` returns valid plugin info JSON - [ ] `/plugins/igny8-seo/check-update/` returns latest version for WP update checker - [ ] `/plugins/igny8-seo/download/` serves latest plugin ZIP - [ ] readme.txt passes WP.org validator - [ ] All 10 submission checklist items verified ### Frontend - [ ] Plan comparison page shows all V2 features by plan - [ ] `FeatureGate` component shows upgrade prompt for gated features - [ ] Add-on purchase flow completes end-to-end - [ ] Feature denied state shows clear upgrade path --- ## 6. CLAUDE CODE INSTRUCTIONS ### Context Requirements 1. Read existing `Plan` model in billing app — understand current fields before adding `plan_features` 2. Read existing billing ViewSets — understand current plan/subscription endpoints 3. Read all Phase 2 execution docs (02B–02I) — identify every ViewSet that needs `@require_feature()` 4. Read 04A (Managed Services) — subscription + order models for add-on purchase integration 5. Read 04B (Whitelabel Reporting) — report + branding endpoints to gate by plan 6. Read 03A (WP Plugin Standalone) — plugin structure for WP.org submission preparation ### Execution Order ``` plan_features migration → FeatureGateService → @require_feature decorator → Apply to all Phase 2 ViewSets → Add-on purchase endpoints → WP.org public endpoints → Frontend feature gate component → migrate_plan_features task → Launch checklist ``` ### Critical Rules 1. **All IDs are integers** — BigAutoField PKs 2. **Model names PLURAL** — consistent with existing codebase 3. **Table prefix** — `igny8_` for all tables 4. **Billing app** — `Plan` modification and `FeatureUsageLog` go in existing billing app 5. **Frontend** — `.tsx` files, Zustand stores 6. **Decorator stacks** — `@require_feature()` stacks with existing `@permission_classes` and DRF auth 7. **No breaking changes** — existing Plan records must work before and after migration 8. **Celery app** — `igny8_core` for all tasks 9. **Add-on pricing** — use existing Stripe Product/Price objects, create new ones only for new add-ons 10. **WP.org endpoints** — public (no auth), rate-limited, no sensitive data exposed ### Cross-References | Doc | Relationship | |-----|-------------| | 04A Managed Services | Add-on purchase creates ManagedServiceSubscription + BacklinkServiceOrder | | 04B Whitelabel Reporting | Report + white-label features gated by plan level | | 02B Taxonomy Content | Gated by `taxonomy_content` boolean | | 02C GSC Integration | Gated by `gsc_level` (none/basic/full) | | 02D Linker Internal | Gated by `linker_level` (none/audit/auto/full) | | 02E Linker External | Gated by `backlinks_level` (none/self_service/self_service_api) | | 02F Optimizer | Gated by `optimizer_level` (none/basic/full/batch) | | 02G Rich Schema | Gated by `schema_types` (0/5/10/all_retroactive) | | 02H Socializer | Gated by `socializer_platforms` (0/2/all/all_auto) | | 02I Video Creator | Gated by `video_level` (none/short/all) | | 03A WP Plugin Standalone | Plugin submitted to WP.org, update checker endpoints | | Billing App (existing) | Plan model modified, Stripe/PayPal integration for add-ons |