202 lines
5.7 KiB
TypeScript
202 lines
5.7 KiB
TypeScript
// Route Commerce Platform — Pricing Configuration
|
|
// All pricing constants used across billing UI, server actions, and webhooks
|
|
|
|
export const PLAN_TIERS = {
|
|
starter: {
|
|
label: "Starter",
|
|
color: "bg-slate-100 text-slate-700",
|
|
badge: null,
|
|
monthlyPrice: 49,
|
|
annualPrice: 441, // ~25% off
|
|
description: "Everything you need to get started",
|
|
highlighted: false,
|
|
features: [
|
|
"Products catalog",
|
|
"Stops management (up to 10/month)",
|
|
"Orders processing",
|
|
"Basic Pickup",
|
|
"1 admin user",
|
|
"Up to 25 products",
|
|
"Email support",
|
|
],
|
|
limits: { max_users: 1, max_stops_monthly: 10, max_products: 25 },
|
|
},
|
|
farm: {
|
|
label: "Farm",
|
|
color: "bg-blue-100 text-blue-700",
|
|
badge: "Most Popular",
|
|
monthlyPrice: 149,
|
|
annualPrice: 1341,
|
|
description: "For growing farm businesses",
|
|
highlighted: true,
|
|
features: [
|
|
"Everything in Starter",
|
|
"Wholesale Portal",
|
|
"Harvest Reach (Email & SMS)",
|
|
"Unlimited stops",
|
|
"Unlimited products",
|
|
"Multi-user (up to 5)",
|
|
"Priority support",
|
|
"Advanced reporting",
|
|
],
|
|
limits: { max_users: 5, max_stops_monthly: -1, max_products: -1 },
|
|
},
|
|
enterprise: {
|
|
label: "Enterprise",
|
|
color: "bg-violet-100 text-violet-700",
|
|
badge: null,
|
|
monthlyPrice: 399,
|
|
annualPrice: 3591, // $399/mo * 12 * 0.75
|
|
description: "For established operations that need more",
|
|
highlighted: false,
|
|
features: [
|
|
"Everything in Farm",
|
|
"AI Intelligence Pack",
|
|
"SMS Campaigns",
|
|
"Square Inventory Sync",
|
|
"Water Log",
|
|
"Unlimited users",
|
|
"Unlimited brands",
|
|
"Custom development",
|
|
"Dedicated support",
|
|
"SLA guarantee",
|
|
"Advanced reporting",
|
|
],
|
|
limits: { max_users: -1, max_stops_monthly: -1, max_products: -1 },
|
|
},
|
|
} as const;
|
|
|
|
export type PlanTierKey = keyof typeof PLAN_TIERS;
|
|
|
|
// ── Add-ons ──────────────────────────────────────────────────────────────────
|
|
|
|
export const ADDONS = {
|
|
harvest_reach: {
|
|
label: "Harvest Reach",
|
|
icon: "📧",
|
|
description: "Email & SMS marketing campaigns",
|
|
monthlyPrice: 79,
|
|
annualPrice: 711,
|
|
featureKey: "harvest_reach",
|
|
stripePriceEnv: "STRIPE_PRICE_HARVEST_REACH",
|
|
},
|
|
wholesale_portal: {
|
|
label: "Wholesale Portal",
|
|
icon: "🏪",
|
|
description: "B2B buyer portal with custom pricing",
|
|
monthlyPrice: 99,
|
|
annualPrice: 891,
|
|
featureKey: "wholesale_portal",
|
|
stripePriceEnv: "STRIPE_PRICE_WHOLESALE_PORTAL",
|
|
},
|
|
water_log: {
|
|
label: "Water Log",
|
|
icon: "💧",
|
|
description: "Irrigation tracking & water usage",
|
|
monthlyPrice: 39,
|
|
annualPrice: 351,
|
|
featureKey: "water_log",
|
|
stripePriceEnv: "STRIPE_PRICE_WATER_LOG",
|
|
},
|
|
ai_tools: {
|
|
label: "AI Intelligence Pack",
|
|
icon: "🤖",
|
|
description: "Campaign writer, pricing advisor, forecasting",
|
|
monthlyPrice: 59,
|
|
annualPrice: 531,
|
|
featureKey: "ai_tools",
|
|
stripePriceEnv: "STRIPE_PRICE_AI_TOOLS",
|
|
},
|
|
square_sync: {
|
|
label: "Square Inventory Sync",
|
|
icon: "◼️",
|
|
description: "Sync products, orders, inventory with Square",
|
|
monthlyPrice: 39,
|
|
annualPrice: 351,
|
|
featureKey: "square_sync",
|
|
stripePriceEnv: "STRIPE_PRICE_SQUARE_SYNC",
|
|
},
|
|
sms_campaigns: {
|
|
label: "SMS Campaigns",
|
|
icon: "💬",
|
|
description: "Text message marketing & notifications",
|
|
monthlyPrice: 29,
|
|
annualPrice: 261,
|
|
featureKey: "sms_campaigns",
|
|
stripePriceEnv: "STRIPE_PRICE_SMS_CAMPAIGNS",
|
|
},
|
|
} as const;
|
|
|
|
export type AddonKey = keyof typeof ADDONS;
|
|
|
|
// ── Feature list per tier (for comparison table) ────────────────────────────
|
|
|
|
const TIER_FEATURE_MATRIX: Record<PlanTierKey, string[]> = {
|
|
starter: [
|
|
"Products catalog",
|
|
"Stops management (10/mo)",
|
|
"Orders processing",
|
|
"Basic Pickup",
|
|
"1 admin user",
|
|
"Up to 25 products",
|
|
"Email support",
|
|
"Standard reporting",
|
|
],
|
|
farm: [
|
|
"Everything in Starter",
|
|
"Wholesale Portal",
|
|
"Harvest Reach (Email & SMS)",
|
|
"Unlimited stops",
|
|
"Unlimited products",
|
|
"Multi-user (5)",
|
|
"Priority support",
|
|
"Advanced reporting",
|
|
],
|
|
enterprise: [
|
|
"Everything in Farm",
|
|
"AI Intelligence Pack",
|
|
"SMS Campaigns",
|
|
"Square Inventory Sync",
|
|
"Water Log",
|
|
"Unlimited users",
|
|
"Unlimited brands",
|
|
"Custom development",
|
|
"SLA guarantee",
|
|
"Dedicated support",
|
|
],
|
|
};
|
|
|
|
// ── Utility functions ────────────────────────────────────────────────────────
|
|
|
|
function formatPrice(amount: number | null): string {
|
|
if (amount === null) return "Custom";
|
|
return `$${amount.toFixed(0)}`;
|
|
}
|
|
|
|
function formatPricePerMonth(amount: number | null): string {
|
|
if (amount === null) return "Custom";
|
|
return `$${amount}/mo`;
|
|
}
|
|
|
|
function getPlanMonthlyPrice(tier: PlanTierKey): number | null {
|
|
return PLAN_TIERS[tier]?.monthlyPrice ?? null;
|
|
}
|
|
|
|
function getPlanAnnualPrice(tier: PlanTierKey): number | null {
|
|
return PLAN_TIERS[tier]?.annualPrice ?? null;
|
|
}
|
|
|
|
function getAddonMonthlyPrice(addon: AddonKey): number {
|
|
return ADDONS[addon]?.monthlyPrice ?? 0;
|
|
}
|
|
|
|
function getAddonAnnualPrice(addon: AddonKey): number {
|
|
return ADDONS[addon]?.annualPrice ?? 0;
|
|
}
|
|
|
|
function calculateAnnualSavings(monthlyTotal: number): number {
|
|
return Math.round(monthlyTotal * 0.25); // 25% annual discount
|
|
}
|
|
|
|
const BILLING_COMPANY_NAME = "Cielo Hermosa, LLC";
|
|
const BILLING_EMAIL = "billing@cielohermosa.com"; |