23 KiB
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
billingapp with basic feature limits (sites, credits) - Feature gating is minimal — no granular per-feature capability matrix
- No
plan_featuresJSONField 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
ManagedServiceSubscriptionmodel (04A) — tiers, pricing, monthly targetsBacklinkServiceOrdermodel (04A) — packages, pricing, margin trackingServiceReportmodel (04B) — automated reports with PDF generationAgencyBrandingmodel (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:
{
"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:
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:
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:
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:
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:
- Run one-time
migrate_plan_featuresCelery task - Populate
plan_featuresJSONField on all 4 existing Plan records with appropriate values - Existing users retain current plan pricing (grandfathered)
- Existing credits + billing cycles unchanged
- Users gain access to new V2 features according to their plan level
Migration data per plan:
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
- Add
plan_featuresJSONField toPlanmodel + migration - Create
FeatureUsageLogmodel + migration - Build
FeatureGateServicewithcheck_feature(),log_usage() - Build
@require_feature()decorator - Create feature check API endpoints (
/billing/features/) - Write
migrate_plan_featuresone-time task withPLAN_FEATURE_DEFAULTS
Week 2: Plan Feature Integration
- 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
- 02B taxonomy content endpoints →
- Build add-on purchase endpoints using existing Stripe/PayPal
- Build plan admin feature update endpoint
Week 3: WP.org Submission + Launch
- Build WP.org plugin info/download/check-update public endpoints
- Prepare plugin for WP.org: readme.txt, assets, security audit
- Set up GitHub Actions → WP.org SVN deploy pipeline
- Submit plugin to WP.org review queue
- Run
migrate_plan_featureson production - 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:
// Extend existing billing store
interface BillingState {
// ... existing fields
planFeatures: PlanFeatures | null
addOns: AddOn[]
fetchPlanFeatures: () => Promise<void>
purchaseAddOn: (type: string, params: AddOnParams) => Promise<void>
checkFeature: (feature: string) => boolean
}
Feature gate UI pattern:
// Reusable component for gated features
const FeatureGate: React.FC<{ feature: string; requiredLevel: string }> = ({
feature, requiredLevel, children
}) => {
const { checkFeature } = useBillingStore()
if (!checkFeature(feature)) {
return <UpgradePrompt feature={feature} requiredLevel={requiredLevel} />
}
return <>{children}</>
}
5. ACCEPTANCE CRITERIA
Feature Gate System
plan_featuresJSONField added toPlanmodelFeatureGateService.check_feature()correctly evaluates level hierarchy@require_feature()decorator returns 403 with upgrade message for insufficient planFeatureUsageLogrecords 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_featurestask 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
FeatureGatecomponent 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
- Read existing
Planmodel in billing app — understand current fields before addingplan_features - Read existing billing ViewSets — understand current plan/subscription endpoints
- Read all Phase 2 execution docs (02B–02I) — identify every ViewSet that needs
@require_feature() - Read 04A (Managed Services) — subscription + order models for add-on purchase integration
- Read 04B (Whitelabel Reporting) — report + branding endpoints to gate by plan
- 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
- All IDs are integers — BigAutoField PKs
- Model names PLURAL — consistent with existing codebase
- Table prefix —
igny8_for all tables - Billing app —
Planmodification andFeatureUsageLoggo in existing billing app - Frontend —
.tsxfiles, Zustand stores - Decorator stacks —
@require_feature()stacks with existing@permission_classesand DRF auth - No breaking changes — existing Plan records must work before and after migration
- Celery app —
igny8_corefor all tasks - Add-on pricing — use existing Stripe Product/Price objects, create new ones only for new add-ons
- 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 |