addon comin sonn adn pricign apge updates
This commit is contained in:
146
docs/90-REFERENCE/MANAGED-ADDON-PLAN.md
Normal file
146
docs/90-REFERENCE/MANAGED-ADDON-PLAN.md
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# Managed Add-on Plans (Marketing + App)
|
||||||
|
|
||||||
|
**Date:** 2026-01-20
|
||||||
|
|
||||||
|
## Goals
|
||||||
|
- Offer managed services as an optional add-on per site.
|
||||||
|
- Keep core SaaS plans unchanged while enabling add-on selection at pricing, signup, and billing.
|
||||||
|
- Provide clear separation between **Core Plans** and **Managed Add-ons** in backend, frontend, and billing UI.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Proposed Managed Add-on Tiers
|
||||||
|
- **Managed Lite** — **$100/site/month**
|
||||||
|
- **Managed Pro** — **$399/site/month**
|
||||||
|
|
||||||
|
### Managed Features (shared)
|
||||||
|
- Onboarding & setup: site integration, automation schedule, content settings.
|
||||||
|
- Monthly SEO content plan: keyword import from library/clustering, topic strategy, content calendar.
|
||||||
|
- Content QA & optimization: review queue checks, SEO meta validation, internal link suggestions.
|
||||||
|
- Publishing ops: scheduled publishing, status monitoring, retry/failure handling.
|
||||||
|
- Reporting: monthly performance + usage summary (credits, content velocity, publishing outcomes).
|
||||||
|
- Support & tuning: strategy optimization/tweaks, automation adjustments, issue triage.
|
||||||
|
|
||||||
|
### Pro extras
|
||||||
|
- Proactive monitoring and escalation.
|
||||||
|
- Priority response.
|
||||||
|
- Expanded strategy iteration (more frequent adjustments).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Marketing Site (https://igny8.com/pricing)
|
||||||
|
|
||||||
|
### Layout changes
|
||||||
|
1. **Keep Core Plans section unchanged**.
|
||||||
|
2. Add a **big + icon** directly below the pricing table.
|
||||||
|
3. Add **one single horizontal card** for Managed Add-on:
|
||||||
|
- Visible badge: **COMING SOON**
|
||||||
|
- Card title: “Managed Add-on (Per Site)”
|
||||||
|
- Short summary of major features (1 line)
|
||||||
|
- **Toggle switch** inside the card for **Managed Lite / Managed Pro**
|
||||||
|
- Show price per site for the selected toggle
|
||||||
|
4. No other sections or FAQs added.
|
||||||
|
|
||||||
|
### Suggested UX copy
|
||||||
|
- “Managed Add-on (Per Site) — Coming Soon”
|
||||||
|
- “Choose Lite or Pro”
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Signup Page (https://app.igny8.com/signup)
|
||||||
|
|
||||||
|
### Layout changes
|
||||||
|
Add **Step 2: Managed Add-ons (Optional)** after plan selection.
|
||||||
|
- Toggle per site: “Add managed services to selected site(s)”
|
||||||
|
- If user selects a plan with multiple sites:
|
||||||
|
- Show checkboxes for each site slot.
|
||||||
|
- Default: none selected.
|
||||||
|
- Inline price calculator:
|
||||||
|
- “Managed Lite x N sites = $X/mo”
|
||||||
|
- “Managed Pro x N sites = $X/mo”
|
||||||
|
|
||||||
|
### UX notes
|
||||||
|
- Keep signup friction low.
|
||||||
|
- If user skips add-on, allow adding later from Billing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## App Billing & Plans (Account → Plans & Billing)
|
||||||
|
|
||||||
|
### New UI sections
|
||||||
|
1. **Current Plan** remains unchanged.
|
||||||
|
2. Add **“Managed Add-ons”** section:
|
||||||
|
- Show current add-on tier (if any) and assigned sites.
|
||||||
|
- Show monthly add-on price and next renewal date.
|
||||||
|
3. Add **“Upgrade Add-ons”** tab or sub-panel:
|
||||||
|
- Choose Managed Lite/Pro.
|
||||||
|
- Assign to site(s).
|
||||||
|
- Update monthly total.
|
||||||
|
|
||||||
|
### Existing users
|
||||||
|
- If a user already subscribed to a managed add-on:
|
||||||
|
- Display in **Plan** tab summary.
|
||||||
|
- Include in billing history and invoice breakdown.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Backend Model Changes
|
||||||
|
|
||||||
|
### Option A (Minimal changes in Plan model)
|
||||||
|
Add fields to `Plan`:
|
||||||
|
- `plan_type` (choices: `core`, `managed`) — distinguishes SaaS vs add-on.
|
||||||
|
- `per_site` (bool, default false) — marks managed add-ons.
|
||||||
|
- `managed_tier` (optional slug: `lite`, `pro`).
|
||||||
|
|
||||||
|
Add optional relation to `Account` or `Site`:
|
||||||
|
- New model `SiteManagementAddon`:
|
||||||
|
- `site` (FK)
|
||||||
|
- `plan` (FK to Plan where `plan_type=managed`)
|
||||||
|
- `status`, `current_period_start`, `current_period_end`
|
||||||
|
- `external_subscription_id`
|
||||||
|
|
||||||
|
### Option B (Separate ManagedPlan model)
|
||||||
|
Create `ManagedPlan` model (clone of Plan fields needed for pricing + name).
|
||||||
|
Keep `Plan` for core SaaS only.
|
||||||
|
|
||||||
|
**Recommendation:** Option A (fewer tables, uses existing pricing pipeline).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Backend Billing Logic
|
||||||
|
- Managed add-ons are **per site**.
|
||||||
|
- Create separate Stripe subscription items per site, or a single subscription with quantity = number of managed sites.
|
||||||
|
- Billing summary should show:
|
||||||
|
- Core plan price
|
||||||
|
- Managed add-on subtotal (N sites x price)
|
||||||
|
- Total monthly
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frontend Data Contracts
|
||||||
|
|
||||||
|
### API additions
|
||||||
|
- `GET /api/v1/auth/plans/?type=core` (core plans only)
|
||||||
|
- `GET /api/v1/auth/plans/?type=managed` (managed add-ons)
|
||||||
|
- `GET /api/v1/account/managed-addons/` (current user add-ons + site assignments)
|
||||||
|
- `POST /api/v1/account/managed-addons/` (assign add-on to site(s))
|
||||||
|
- `PUT /api/v1/account/managed-addons/{id}/` (upgrade/downgrade add-on tier)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pricing Copy (Core Plans)
|
||||||
|
Suggested renames to keep consistency:
|
||||||
|
- Starter → **Launch**
|
||||||
|
- Growth → **Growth** (keep)
|
||||||
|
- Scale → **Scale** (keep)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rollout Checklist
|
||||||
|
- Add plan_type + per_site fields + migration.
|
||||||
|
- Add managed add-on seed data (Lite/Pro).
|
||||||
|
- Add managed add-on endpoints + serializer filtering.
|
||||||
|
- Update pricing page layout (marketing).
|
||||||
|
- Update signup flow (managed add-on step).
|
||||||
|
- Update billing page (Managed Add-ons section).
|
||||||
|
- Update invoices to show core + managed breakdown.
|
||||||
@@ -53,6 +53,10 @@ export default function PricingTable({
|
|||||||
className = '',
|
className = '',
|
||||||
}: PricingTableProps) {
|
}: PricingTableProps) {
|
||||||
const [billingPeriod, setBillingPeriod] = useState<'monthly' | 'annually'>('monthly');
|
const [billingPeriod, setBillingPeriod] = useState<'monthly' | 'annually'>('monthly');
|
||||||
|
const maxAnnualDiscount = Math.max(
|
||||||
|
0,
|
||||||
|
...plans.map((plan) => plan.annualDiscountPercent || 0)
|
||||||
|
);
|
||||||
|
|
||||||
const handlePlanClick = (plan: PricingPlan) => {
|
const handlePlanClick = (plan: PricingPlan) => {
|
||||||
if (plan.disabled) return;
|
if (plan.disabled) return;
|
||||||
@@ -117,7 +121,7 @@ export default function PricingTable({
|
|||||||
onClick={() => setBillingPeriod('monthly')}
|
onClick={() => setBillingPeriod('monthly')}
|
||||||
className={`relative z-10 flex h-11 w-[130px] items-center justify-center font-medium transition-all duration-200 rounded-full cursor-pointer ${
|
className={`relative z-10 flex h-11 w-[130px] items-center justify-center font-medium transition-all duration-200 rounded-full cursor-pointer ${
|
||||||
billingPeriod === 'monthly'
|
billingPeriod === 'monthly'
|
||||||
? 'text-white'
|
? 'text-white hover:text-white hover:bg-transparent'
|
||||||
: 'text-gray-500 hover:text-gray-700 dark:hover:text-white/80 dark:text-gray-400'
|
: 'text-gray-500 hover:text-gray-700 dark:hover:text-white/80 dark:text-gray-400'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
@@ -130,7 +134,7 @@ export default function PricingTable({
|
|||||||
onClick={() => setBillingPeriod('annually')}
|
onClick={() => setBillingPeriod('annually')}
|
||||||
className={`relative z-10 flex h-11 w-[130px] items-center justify-center font-medium transition-all duration-200 rounded-full cursor-pointer ${
|
className={`relative z-10 flex h-11 w-[130px] items-center justify-center font-medium transition-all duration-200 rounded-full cursor-pointer ${
|
||||||
billingPeriod === 'annually'
|
billingPeriod === 'annually'
|
||||||
? 'text-white'
|
? 'text-white hover:text-white hover:bg-transparent'
|
||||||
: 'text-gray-500 hover:text-gray-700 dark:hover:text-white/80 dark:text-gray-400'
|
: 'text-gray-500 hover:text-gray-700 dark:hover:text-white/80 dark:text-gray-400'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
@@ -147,7 +151,7 @@ export default function PricingTable({
|
|||||||
d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
|
d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
Save {Math.round(plans[0]?.annualDiscountPercent || 15)}% with annual billing
|
Save upto {Math.round(maxAnnualDiscount)}% with annual billing
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -166,6 +166,7 @@ export { EyeIcon as Maximize2Icon }; // Maximize alias
|
|||||||
export { AngleRightIcon as ChevronRightIcon }; // Chevron right alias
|
export { AngleRightIcon as ChevronRightIcon }; // Chevron right alias
|
||||||
export { BoxCubeIcon as Building2Icon }; // Building alias
|
export { BoxCubeIcon as Building2Icon }; // Building alias
|
||||||
export { BoxIcon as CreditCardIcon }; // Credit card alias
|
export { BoxIcon as CreditCardIcon }; // Credit card alias
|
||||||
|
export { BoxIconLine as CardIcon }; // Card icon alias
|
||||||
export { BoxIcon as WalletIcon }; // Wallet alias
|
export { BoxIcon as WalletIcon }; // Wallet alias
|
||||||
export { AlertIcon as BellIcon }; // Bell notification alias
|
export { AlertIcon as BellIcon }; // Bell notification alias
|
||||||
export { PlugInIcon as TestTubeIcon }; // Test tube alias
|
export { PlugInIcon as TestTubeIcon }; // Test tube alias
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ const Pricing: React.FC = () => {
|
|||||||
const [plans, setPlans] = useState<Plan[]>([]);
|
const [plans, setPlans] = useState<Plan[]>([]);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
|
const [managedTier, setManagedTier] = useState<'lite' | 'pro'>('lite');
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchPlans = async () => {
|
const fetchPlans = async () => {
|
||||||
@@ -301,7 +302,7 @@ const Pricing: React.FC = () => {
|
|||||||
Limited Time
|
Limited Time
|
||||||
</span>
|
</span>
|
||||||
<p className="text-base sm:text-lg font-bold text-transparent bg-clip-text bg-gradient-to-r from-warning-700 via-warning-700 to-error-700">
|
<p className="text-base sm:text-lg font-bold text-transparent bg-clip-text bg-gradient-to-r from-warning-700 via-warning-700 to-error-700">
|
||||||
Lifetime Discount on all Plans for First 100 Users!
|
Upto 33% Lifetime Discount on all Plans for First 25 Users!
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -354,12 +355,66 @@ const Pricing: React.FC = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* What's Included Explanation */}
|
<div className="max-w-5xl mx-auto mt-10">
|
||||||
<div className="max-w-5xl mx-auto mt-8 text-center">
|
<div className="flex justify-center">
|
||||||
<p className="text-gray-600 dark:text-gray-400 text-sm leading-relaxed">
|
<div className="flex items-center justify-center w-20 h-20 rounded-full bg-white shadow-md border border-gray-200 text-[var(--color-primary)] text-5xl">
|
||||||
Every content piece includes High-Opportunity Keywords, AI clustering, idea generation, standard/premium images, Automation, WP publishing, SEO optimization, and internal linking.
|
+
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="mt-6 rounded-2xl border border-brand-200 bg-brand-50 px-6 py-6 shadow-sm">
|
||||||
|
<div className="flex flex-col gap-6 md:flex-row md:items-center md:justify-between">
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<h3 className="text-lg font-semibold text-gray-900">
|
||||||
|
Managed Add-on (Per Site)
|
||||||
|
</h3>
|
||||||
|
<span className="inline-flex items-center rounded-full bg-warning-700 px-2.5 py-1 text-xs font-semibold text-white">
|
||||||
|
COMING SOON
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-gray-600">
|
||||||
|
Setup, monthly planning, QA, publishing ops, reporting, and tuning.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-col gap-3 sm:flex-row sm:items-center">
|
||||||
|
<div className="inline-flex rounded-full bg-white/80 p-1 border border-gray-200">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => setManagedTier('lite')}
|
||||||
|
className={`px-4 py-2 text-sm font-medium rounded-full transition ${
|
||||||
|
managedTier === 'lite'
|
||||||
|
? 'bg-[var(--color-success)] text-white shadow'
|
||||||
|
: 'text-gray-600 hover:text-gray-900'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
Managed Lite
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => setManagedTier('pro')}
|
||||||
|
className={`px-4 py-2 text-sm font-medium rounded-full transition ${
|
||||||
|
managedTier === 'pro'
|
||||||
|
? 'bg-[var(--color-success)] text-white shadow'
|
||||||
|
: 'text-gray-600 hover:text-gray-900'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
Managed Pro
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="text-right">
|
||||||
|
<div className="text-xl font-bold text-gray-900">
|
||||||
|
{managedTier === 'lite' ? '$100' : '$300'}
|
||||||
|
<span className="text-sm font-medium text-gray-500"> /site/month</span>
|
||||||
|
</div>
|
||||||
|
<div className="text-xs text-gray-500">Optional add-on</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
@@ -453,6 +508,30 @@ const Pricing: React.FC = () => {
|
|||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* AGENCY CTA */}
|
||||||
|
<section className="relative overflow-hidden bg-gradient-to-br from-[var(--color-success)] via-[var(--color-primary-dark)] to-[var(--color-primary)] mt-[30px]">
|
||||||
|
{/* Radial glow */}
|
||||||
|
<div className="absolute inset-0 bg-[radial-gradient(circle_at_50%_50%,rgba(255,255,255,0.1),transparent_70%)]" />
|
||||||
|
|
||||||
|
<div className="relative max-w-4xl mx-auto px-6 py-14 md:py-18 text-center z-10">
|
||||||
|
<h2 className="text-3xl md:text-4xl lg:text-5xl font-extrabold text-white mb-4 leading-tight max-w-none md:whitespace-nowrap">
|
||||||
|
Agency & enterprise plans built for scale.
|
||||||
|
</h2>
|
||||||
|
<p className="text-lg md:text-xl text-white/90 mb-8 max-w-2xl mx-auto font-medium">
|
||||||
|
Need more credits, more sites, and lower effective costs? We’ll tailor a plan that fits your volume and workflow.
|
||||||
|
</p>
|
||||||
|
<div className="flex flex-col sm:flex-row gap-5 justify-center">
|
||||||
|
<Link
|
||||||
|
to="/contact"
|
||||||
|
className="inline-flex items-center justify-center gap-2 rounded-xl border-2 border-white/30 bg-white/10 backdrop-blur-sm text-white px-10 py-5 text-lg font-bold hover:bg-white/20 hover:border-white/50 transition"
|
||||||
|
>
|
||||||
|
<ChatBubbleLeftRightIcon className="h-5 w-5" />
|
||||||
|
Talk to sales
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
{/* INFO BLOCKS SECTION */}
|
{/* INFO BLOCKS SECTION */}
|
||||||
<section className="bg-gradient-to-b from-white via-gray-50/30 to-white">
|
<section className="bg-gradient-to-b from-white via-gray-50/30 to-white">
|
||||||
<div className="max-w-6xl mx-auto px-6 py-24 grid grid-cols-1 md:grid-cols-2 gap-8">
|
<div className="max-w-6xl mx-auto px-6 py-24 grid grid-cols-1 md:grid-cols-2 gap-8">
|
||||||
@@ -487,39 +566,6 @@ const Pricing: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* FINAL CTA */}
|
|
||||||
<section className="relative overflow-hidden bg-gradient-to-br from-[var(--color-success)] via-[var(--color-primary-dark)] to-[var(--color-primary)]">
|
|
||||||
{/* Radial glow */}
|
|
||||||
<div className="absolute inset-0 bg-[radial-gradient(circle_at_50%_50%,rgba(255,255,255,0.1),transparent_70%)]" />
|
|
||||||
|
|
||||||
<div className="relative max-w-4xl mx-auto px-6 py-24 md:py-32 text-center z-10">
|
|
||||||
<h2 className="text-4xl md:text-5xl lg:text-6xl font-extrabold text-white mb-6 leading-tight">
|
|
||||||
Let's build a plan tailored to your growth.
|
|
||||||
</h2>
|
|
||||||
<p className="text-xl md:text-2xl text-white/90 mb-12 max-w-2xl mx-auto font-medium">
|
|
||||||
Get guidance for automation mapping, migration, and onboarding.
|
|
||||||
</p>
|
|
||||||
<div className="flex flex-col sm:flex-row gap-5 justify-center">
|
|
||||||
<Link
|
|
||||||
to="/contact"
|
|
||||||
className="inline-flex items-center justify-center gap-2 rounded-xl border-2 border-white/30 bg-white/10 backdrop-blur-sm text-white px-10 py-5 text-lg font-bold hover:bg-white/20 hover:border-white/50 transition"
|
|
||||||
>
|
|
||||||
<ChatBubbleLeftRightIcon className="h-5 w-5" />
|
|
||||||
Talk to sales
|
|
||||||
</Link>
|
|
||||||
<a
|
|
||||||
href="https://app.igny8.com/signup"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
className="inline-flex items-center justify-center gap-2 rounded-xl bg-white text-[var(--color-primary)] px-10 py-5 text-lg font-bold hover:bg-white/95 transition shadow-xl hover:shadow-2xl hover:-translate-y-0.5"
|
|
||||||
>
|
|
||||||
<RocketLaunchIcon className="h-5 w-5" />
|
|
||||||
Start free trial
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user