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

This commit is contained in:
yves.gugger
2025-12-09 17:35:59 +01:00
parent 772dd4a5af
commit f7e4c8e6a4
7 changed files with 30 additions and 30 deletions

View File

@ -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"],

View File

@ -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

View File

@ -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

View File

@ -150,7 +150,7 @@ const jsonLd = {
'@type': 'AggregateOffer',
lowPrice: '0',
highPrice: '49',
priceCurrency: 'EUR',
priceCurrency: 'USD',
offerCount: '3',
},
featureList: [

View File

@ -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"

View File

@ -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>

View File

@ -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',