Update pricing: buttons aligned, competitive pricing (/), USD currency
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
This commit is contained in:
@ -149,7 +149,7 @@ async def get_subscription_tiers():
|
||||
"domain_limit": config["domain_limit"],
|
||||
"portfolio_limit": config.get("portfolio_limit", 0),
|
||||
"price": config["price"],
|
||||
"currency": config.get("currency", "EUR"),
|
||||
"currency": config.get("currency", "USD"),
|
||||
"check_frequency": config["check_frequency"],
|
||||
"features": feature_list,
|
||||
"feature_flags": config["features"],
|
||||
|
||||
@ -35,7 +35,7 @@ TIER_CONFIG = {
|
||||
SubscriptionTier.SCOUT: {
|
||||
"name": "Scout",
|
||||
"price": 0,
|
||||
"currency": "EUR",
|
||||
"currency": "USD",
|
||||
"domain_limit": 5,
|
||||
"portfolio_limit": 0,
|
||||
"check_frequency": "daily",
|
||||
@ -56,8 +56,8 @@ TIER_CONFIG = {
|
||||
},
|
||||
SubscriptionTier.TRADER: {
|
||||
"name": "Trader",
|
||||
"price": 19,
|
||||
"currency": "EUR",
|
||||
"price": 9,
|
||||
"currency": "USD",
|
||||
"domain_limit": 50,
|
||||
"portfolio_limit": 25,
|
||||
"check_frequency": "hourly",
|
||||
@ -78,8 +78,8 @@ TIER_CONFIG = {
|
||||
},
|
||||
SubscriptionTier.TYCOON: {
|
||||
"name": "Tycoon",
|
||||
"price": 49,
|
||||
"currency": "EUR",
|
||||
"price": 29,
|
||||
"currency": "USD",
|
||||
"domain_limit": 500,
|
||||
"portfolio_limit": -1, # Unlimited
|
||||
"check_frequency": "realtime", # Every 10 minutes
|
||||
|
||||
@ -42,7 +42,7 @@ TIER_FEATURES = {
|
||||
"scout": {
|
||||
"name": "Scout",
|
||||
"price": 0,
|
||||
"currency": "EUR",
|
||||
"currency": "USD",
|
||||
"max_domains": 5,
|
||||
"check_frequency": "daily",
|
||||
"portfolio_domains": 0,
|
||||
@ -50,8 +50,8 @@ TIER_FEATURES = {
|
||||
},
|
||||
"trader": {
|
||||
"name": "Trader",
|
||||
"price": 19,
|
||||
"currency": "EUR",
|
||||
"price": 9,
|
||||
"currency": "USD",
|
||||
"max_domains": 50,
|
||||
"check_frequency": "hourly",
|
||||
"portfolio_domains": 25,
|
||||
@ -66,8 +66,8 @@ TIER_FEATURES = {
|
||||
},
|
||||
"tycoon": {
|
||||
"name": "Tycoon",
|
||||
"price": 49,
|
||||
"currency": "EUR",
|
||||
"price": 29,
|
||||
"currency": "USD",
|
||||
"max_domains": 500,
|
||||
"check_frequency": "realtime",
|
||||
"portfolio_domains": -1, # Unlimited
|
||||
|
||||
@ -150,7 +150,7 @@ const jsonLd = {
|
||||
'@type': 'AggregateOffer',
|
||||
lowPrice: '0',
|
||||
highPrice: '49',
|
||||
priceCurrency: 'EUR',
|
||||
priceCurrency: 'USD',
|
||||
offerCount: '3',
|
||||
},
|
||||
featureList: [
|
||||
|
||||
@ -33,7 +33,7 @@ const tiers = [
|
||||
id: 'trader',
|
||||
name: 'Trader',
|
||||
icon: TrendingUp,
|
||||
price: '19',
|
||||
price: '9',
|
||||
period: '/mo',
|
||||
description: 'Hunt with precision. Daily intel.',
|
||||
features: [
|
||||
@ -55,7 +55,7 @@ const tiers = [
|
||||
id: 'tycoon',
|
||||
name: 'Tycoon',
|
||||
icon: Crown,
|
||||
price: '49',
|
||||
price: '29',
|
||||
period: '/mo',
|
||||
description: 'Dominate the market. No limits.',
|
||||
features: [
|
||||
@ -171,12 +171,12 @@ export default function PricingPage() {
|
||||
</div>
|
||||
|
||||
{/* Pricing Cards */}
|
||||
<div className="grid md:grid-cols-3 gap-6 mb-20 animate-slide-up">
|
||||
<div className="grid md:grid-cols-3 gap-6 mb-20 animate-slide-up items-stretch">
|
||||
{tiers.map((tier, index) => (
|
||||
<div
|
||||
key={tier.id}
|
||||
className={clsx(
|
||||
"group relative p-6 sm:p-8 rounded-2xl border transition-all duration-500",
|
||||
"group relative p-6 sm:p-8 rounded-2xl border transition-all duration-500 flex flex-col",
|
||||
tier.highlighted
|
||||
? "bg-background-secondary border-accent/30 shadow-lg shadow-accent/5"
|
||||
: "bg-background-secondary/50 border-border hover:border-accent/20 hover:bg-background-secondary"
|
||||
@ -196,7 +196,7 @@ export default function PricingPage() {
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="relative">
|
||||
<div className="relative flex-1 flex flex-col">
|
||||
{/* Header */}
|
||||
<div className="mb-6">
|
||||
<div className="flex items-center gap-3 mb-3">
|
||||
@ -226,8 +226,8 @@ export default function PricingPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Features */}
|
||||
<ul className="space-y-3 mb-8">
|
||||
{/* Features - flex-1 to push button to bottom */}
|
||||
<ul className="space-y-3 mb-8 flex-1">
|
||||
{tier.features.map((feature) => (
|
||||
<li key={feature.text} className="flex items-start gap-3">
|
||||
<Check className="w-4 h-4 mt-0.5 shrink-0 text-accent" strokeWidth={2.5} />
|
||||
@ -238,12 +238,12 @@ export default function PricingPage() {
|
||||
))}
|
||||
</ul>
|
||||
|
||||
{/* CTA */}
|
||||
{/* CTA - always at bottom */}
|
||||
<button
|
||||
onClick={() => handleSelectPlan(tier.id, tier.isPaid)}
|
||||
disabled={loadingPlan === tier.id}
|
||||
className={clsx(
|
||||
"w-full flex items-center justify-center gap-2 py-4 rounded-xl text-ui font-medium transition-all duration-300",
|
||||
"w-full flex items-center justify-center gap-2 py-4 rounded-xl text-ui font-medium transition-all duration-300 mt-auto",
|
||||
tier.highlighted
|
||||
? "bg-accent text-background hover:bg-accent-hover shadow-[0_0_20px_rgba(16,185,129,0.15)]"
|
||||
: "bg-foreground text-background hover:bg-foreground/90"
|
||||
|
||||
@ -483,7 +483,7 @@ export default function SettingsPage() {
|
||||
<div>
|
||||
<p className="text-xl font-semibold text-foreground">{tierName}</p>
|
||||
<p className="text-body-sm text-foreground-muted">
|
||||
{tierName === 'Scout' ? 'Free forever' : tierName === 'Trader' ? '$19/month' : '$49/month'}
|
||||
{tierName === 'Scout' ? 'Free forever' : tierName === 'Trader' ? '$9/month' : '$29/month'}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -617,8 +617,8 @@ export default function SettingsPage() {
|
||||
<tr className="border-b border-border/50">
|
||||
<td className="py-3 px-3 text-body-sm text-foreground">Price</td>
|
||||
<td className="py-3 px-3 text-center text-body-sm text-foreground">Free</td>
|
||||
<td className="py-3 px-3 text-center text-body-sm text-foreground">$19/mo</td>
|
||||
<td className="py-3 px-3 text-center text-body-sm text-foreground">$49/mo</td>
|
||||
<td className="py-3 px-3 text-center text-body-sm text-foreground">$9/mo</td>
|
||||
<td className="py-3 px-3 text-center text-body-sm text-foreground">$29/mo</td>
|
||||
</tr>
|
||||
<tr className="border-b border-border/50">
|
||||
<td className="py-3 px-3 text-body-sm text-foreground">Watchlist Domains</td>
|
||||
|
||||
@ -96,7 +96,7 @@ export const webAppSchema = generateStructuredData('WebApplication', {
|
||||
'@type': 'AggregateOffer',
|
||||
lowPrice: '0',
|
||||
highPrice: '99',
|
||||
priceCurrency: 'EUR',
|
||||
priceCurrency: 'USD',
|
||||
offerCount: '3',
|
||||
},
|
||||
featureList: [
|
||||
@ -154,18 +154,18 @@ export const serviceSchema = generateStructuredData('Service', {
|
||||
'@type': 'Offer',
|
||||
name: 'Scout (Free)',
|
||||
price: '0',
|
||||
priceCurrency: 'EUR',
|
||||
priceCurrency: 'USD',
|
||||
description: 'Basic domain monitoring with 5 domains, daily checks',
|
||||
},
|
||||
{
|
||||
'@type': 'Offer',
|
||||
name: 'Trader',
|
||||
price: '19',
|
||||
priceCurrency: 'EUR',
|
||||
priceCurrency: 'USD',
|
||||
priceSpecification: {
|
||||
'@type': 'UnitPriceSpecification',
|
||||
price: '19',
|
||||
priceCurrency: 'EUR',
|
||||
priceCurrency: 'USD',
|
||||
billingDuration: 'P1M',
|
||||
},
|
||||
description: '50 domains, hourly checks, market insights',
|
||||
@ -174,11 +174,11 @@ export const serviceSchema = generateStructuredData('Service', {
|
||||
'@type': 'Offer',
|
||||
name: 'Tycoon',
|
||||
price: '49',
|
||||
priceCurrency: 'EUR',
|
||||
priceCurrency: 'USD',
|
||||
priceSpecification: {
|
||||
'@type': 'UnitPriceSpecification',
|
||||
price: '49',
|
||||
priceCurrency: 'EUR',
|
||||
priceCurrency: 'USD',
|
||||
billingDuration: 'P1M',
|
||||
},
|
||||
description: '500+ domains, 10-min checks, API access, bulk tools',
|
||||
|
||||
Reference in New Issue
Block a user