From dad97f951ef5e08059e1e958225a362691353beb Mon Sep 17 00:00:00 2001 From: Yves Gugger Date: Thu, 18 Dec 2025 14:47:25 +0100 Subject: [PATCH] fix: Scout tier restrictions - no listings, no sniper alerts Frontend: - Scout: Listings and Sniper marked as unavailable - Updated comparison table Backend TIER_CONFIG: - Scout: domain_limit=5, portfolio_limit=5, listing_limit=0, sniper_limit=0 - Trader: domain_limit=50, portfolio_limit=50 --- backend/app/models/subscription.py | 20 ++++++++++---------- frontend/src/app/pricing/page.tsx | 8 ++++---- frontend/src/app/terminal/listing/page.tsx | 4 ++-- frontend/src/app/terminal/sniper/page.tsx | 4 ++-- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/backend/app/models/subscription.py b/backend/app/models/subscription.py index dc960db..8b61d58 100644 --- a/backend/app/models/subscription.py +++ b/backend/app/models/subscription.py @@ -37,12 +37,12 @@ TIER_CONFIG = { "name": "Scout", "price": 0, "currency": "USD", - "domain_limit": 10, # Watchlist: 10 (was 5) - "portfolio_limit": 3, # Portfolio: 3 (was 0) - taste the feature - "listing_limit": 1, # Listings: 1 (was 0) - try selling - "sniper_limit": 2, # Sniper alerts + "domain_limit": 5, # Watchlist: 5 + "portfolio_limit": 5, # Portfolio: 5 + "listing_limit": 0, # Listings: 0 (Trader+ only) + "sniper_limit": 0, # Sniper alerts: 0 (Trader+ only) "check_frequency": "daily", - "history_days": 7, # 7 days history (was 0) + "history_days": 7, "features": { "email_alerts": True, "sms_alerts": False, @@ -63,10 +63,10 @@ TIER_CONFIG = { "name": "Trader", "price": 9, "currency": "USD", - "domain_limit": 100, # Watchlist: 100 (was 50) - "portfolio_limit": 50, # Portfolio: 50 (was 25) - "listing_limit": 10, # Listings: 10 (was 5) - "sniper_limit": 10, # Sniper alerts + "domain_limit": 50, # Watchlist: 50 + "portfolio_limit": 50, # Portfolio: 50 + "listing_limit": 10, # Listings: 10 + "sniper_limit": 10, # Sniper alerts: 10 "check_frequency": "hourly", "history_days": 90, "features": { @@ -81,7 +81,7 @@ TIER_CONFIG = { "webhooks": False, "bulk_tools": False, "seo_metrics": False, - # Yield (DNS routing + landing) is Tycoon-only. Trader can preview ideas in VISION. + # Yield Preview only - can see landing page but not activate routing "yield": False, "daily_drop_digest": False, } diff --git a/frontend/src/app/pricing/page.tsx b/frontend/src/app/pricing/page.tsx index 05594c2..974bfc9 100644 --- a/frontend/src/app/pricing/page.tsx +++ b/frontend/src/app/pricing/page.tsx @@ -23,8 +23,8 @@ const tiers = [ { text: 'Alert Speed', highlight: false, available: true, sublabel: 'Daily' }, { text: '5 Watchlist Domains', highlight: false, available: true }, { text: '5 Portfolio Domains', highlight: false, available: true }, - { text: '1 Listing', highlight: false, available: true, sublabel: 'Try it' }, - { text: '2 Sniper Alerts', highlight: false, available: true }, + { text: 'Listings', highlight: false, available: false }, + { text: 'Sniper Alerts', highlight: false, available: false }, { text: 'Pounce Score', highlight: false, available: true, sublabel: 'Basic' }, { text: 'TLD Intel', highlight: false, available: true, sublabel: 'Public' }, ], @@ -86,8 +86,8 @@ const comparisonFeatures = [ { name: 'Alert Speed', scout: 'Daily', trader: 'Hourly', tycoon: 'Every 5 min' }, { name: 'Watchlist', scout: '5 Domains', trader: '50 Domains', tycoon: 'Unlimited' }, { name: 'Portfolio', scout: '5 Domains', trader: '50 Domains', tycoon: 'Unlimited' }, - { name: 'Listings', scout: '1 (Try it)', trader: '10 (0% Fee)', tycoon: 'Unlimited + Featured' }, - { name: 'Sniper Alerts', scout: '2', trader: '10', tycoon: '50' }, + { name: 'Listings', scout: '—', trader: '10 (0% Fee)', tycoon: 'Unlimited + Featured' }, + { name: 'Sniper Alerts', scout: '—', trader: '10', tycoon: '50' }, { name: 'Valuation', scout: 'Basic Score', trader: 'Pounce Score', tycoon: 'Score + SEO' }, { name: 'TLD Intel', scout: 'Public', trader: 'Renewal Prices', tycoon: 'Full History' }, { name: 'Yield', scout: '—', trader: 'Preview', tycoon: 'Active Routing' }, diff --git a/frontend/src/app/terminal/listing/page.tsx b/frontend/src/app/terminal/listing/page.tsx index 0ff068f..9a5758c 100755 --- a/frontend/src/app/terminal/listing/page.tsx +++ b/frontend/src/app/terminal/listing/page.tsx @@ -75,8 +75,8 @@ export default function MyListingsPage() { const [menuOpen, setMenuOpen] = useState(false) const tier = subscription?.tier || 'scout' - const listingLimits: Record = { scout: 1, trader: 10, tycoon: Infinity } - const maxListings = listingLimits[tier] || 1 + const listingLimits: Record = { scout: 0, trader: 10, tycoon: Infinity } + const maxListings = listingLimits[tier] || 0 const canAddMore = listings.length < maxListings const isTycoon = tier === 'tycoon' const isUnlimited = tier === 'tycoon' diff --git a/frontend/src/app/terminal/sniper/page.tsx b/frontend/src/app/terminal/sniper/page.tsx index 2c96a26..081027e 100644 --- a/frontend/src/app/terminal/sniper/page.tsx +++ b/frontend/src/app/terminal/sniper/page.tsx @@ -82,8 +82,8 @@ export default function SniperAlertsPage() { const [menuOpen, setMenuOpen] = useState(false) const tier = subscription?.tier || 'scout' - const alertLimits: Record = { scout: 2, trader: 10, tycoon: 50 } - const maxAlerts = alertLimits[tier] || 2 + const alertLimits: Record = { scout: 0, trader: 10, tycoon: 50 } + const maxAlerts = alertLimits[tier] || 0 // Limits match backend TIER_CONFIG.sniper_limit const canAddMore = alerts.length < maxAlerts