Last Updated: January 20, 2026 For: Admins, Product Managers, Quick Implementation Reference
| Plan | Price | Who Can See | Who Can Subscribe |
|---|---|---|---|
| Builder | €1.99/mo | Admin only | Admin assigns manually |
| Beta Tester | €2.99/mo | Admin only | Admin assigns manually |
| Early Access | €99/mo | Everyone (registration page) | Anyone can self-register |
✅ Unlimited video uploads ✅ 4K quality ✅ No watermarks ✅ Full AI features ✅ Priority support
🔧 Database prepared but NO UI in MVP 📅 Future use: Add-on features only (not core platform)
WordPress Admin → AuraReels → Plans → Add New
Basic Info Tab:
Pricing Tab:
Visibility Tab ⭐:
Create in Stripe:
price_xxx_professional_monthly)Back to WordPress:
✅ Result: Plan immediately shows on registration page
WordPress Admin → AuraReels → Users → Select User
✅ Result: User has immediate access
Alternative (Stripe):
Duplicate existing plan:
WordPress Admin → AuraReels → Plans → Early Access → Duplicate
Basic Info:
Pricing:
Availability Tab:
Create Stripe price for tracking:
Publish
✅ Result:
Scenario: Replace "Early Access" but keep current €99 subscribers
WordPress Admin → Plans → Edit "Early Access"
Visibility Tab:
Save
Create replacement plan (e.g., "Premium" at €149)
✅ Result:
For specific client (e.g., Acme Corp):
WordPress Admin → Plans → Add New
Basic Info:
Pricing:
Visibility Tab ⭐:
Targeting Tab (JSON):
{
"specific_users": [123]
}
Create Stripe price, add to plan, Publish
Assign to user:
✅ Result: Plan never appears publicly, only User #123 has it
| Visibility | Registration Page | Admin Can Assign | Existing Users Keep |
|---|---|---|---|
| public | ✅ Shows | ✅ Yes | ✅ Yes |
| admin_only | ❌ Hidden | ✅ Yes | ✅ Yes |
| legacy | ❌ Hidden | ❌ No | ✅ Yes (grandfathered) |
| hidden | ❌ Hidden | ✅ Yes (manual only) | ✅ Yes |
| Status | User Access | What It Means |
|---|---|---|
| active | ✅ Full access | Payment successful, subscription active |
| past_due | ⚠️ 7-day grace | Payment failed, Stripe retrying |
| canceled | ✅ Until end date | User canceled, access until period ends |
| incomplete | ❌ No access | Payment never succeeded |
| trialing | ✅ Full access | Free trial period (not used in MVP) |
Users are validated at 4 points:
Grace Period: 7 days for past_due status (payment failures)
GET /wp-json/aurareels/v1/subscriptions/available-plans
→ Get plans for registration page (public only)
POST /wp-json/aurareels/v1/subscriptions/create-checkout-session
→ Create Stripe Checkout session
GET /wp-json/aurareels/v1/subscriptions/validate-subscription
→ Validate current user's subscription
POST /wp-json/aurareels/v1/subscriptions/create-portal-session
→ Get Stripe Customer Portal URL
GET /wp-json/aurareels/v1/admin/plans
→ List all plans (with filters)
POST /wp-json/aurareels/v1/admin/plans
→ Create plan
PUT /wp-json/aurareels/v1/admin/plans/{id}
→ Update plan
DELETE /wp-json/aurareels/v1/admin/plans/{id}
→ Delete plan (soft delete)
POST /wp-json/aurareels/v1/admin/plans/{id}/duplicate
→ Duplicate plan
PUT /wp-json/aurareels/v1/admin/users/{id}/subscription
→ Manually assign subscription to user
SELECT plan_slug, plan_name, price, current_subscribers
FROM wp_aurareels_subscription_plans
WHERE status = 'active'
AND visibility = 'public'
AND allow_self_registration = 1
ORDER BY display_order ASC;
SELECT u.user_email, s.subscription_status, s.subscription_plan, s.subscription_ends_at
FROM wp_core_chavetas_shorts_helper_users s
JOIN wp_users u ON u.ID = s.wp_user_id
WHERE s.subscription_status = 'active';
SELECT subscription_plan, COUNT(*) as total
FROM wp_core_chavetas_shorts_helper_users
WHERE subscription_status = 'active'
GROUP BY subscription_plan;
Check:
subscription_status in databaseFix:
Checklist:
Possible causes:
past_due (beyond 7-day grace)Fix:
validation_failures counter1. AuraReels Builder
Price: €1.99/month
Price ID: price_xxx_builder_monthly
2. AuraReels Beta Tester
Price: €2.99/month
Price ID: price_xxx_beta_tester_monthly
3. AuraReels Early Access
Price: €99/month
Price ID: price_xxx_early_access_monthly
Endpoint: https://yourdomain.com/wp-json/aurareels/v1/subscriptions/webhook
Events to enable:
checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_succeededinvoice.payment_failedconst { data: plans } = await getAvailablePlans();
// Returns only public, active plans
const handleSubscribe = async (planSlug) => {
const { url } = await createCheckoutSession({
plan_slug: planSlug,
success_url: `${window.location.origin}/dashboard`,
cancel_url: `${window.location.origin}/register`
});
window.location.href = url;
};
import { useSubscriptionValidation } from '@/hooks/useSubscriptionValidation';
function Dashboard() {
const { isValid } = useSubscriptionValidation();
if (!isValid) {
return <SubscriptionExpiredBanner />;
}
return <DashboardContent />;
}
❌ Credit purchasing UI ❌ Feature restrictions (all plans = full access) ❌ Annual billing ❌ Free trials ❌ Team subscriptions
Database prepared for future credits but no UI.
Full Documentation: SUBSCRIPTION-SYSTEM-COMPLETE.md
Key Sections:
Last Updated: January 20, 2026