From beedf01e2b43de41a299c5bb6e36339c19189cb6 Mon Sep 17 00:00:00 2001 From: Siddharth Ganesan Date: Mon, 4 Aug 2025 12:18:16 -0700 Subject: [PATCH 1/2] Update free tier to 10 --- .../components/subscription/subscription.tsx | 3 ++- apps/sim/db/schema.ts | 3 ++- apps/sim/hooks/use-subscription-state.ts | 7 ++--- apps/sim/lib/auth.ts | 3 ++- apps/sim/lib/billing/constants.ts | 5 ++++ apps/sim/lib/billing/core/billing.ts | 5 ++-- .../lib/billing/core/organization-billing.ts | 9 ++++--- apps/sim/lib/billing/core/subscription.ts | 5 ++-- apps/sim/lib/billing/core/usage.ts | 27 ++++++++++--------- .../lib/billing/subscriptions/utils.test.ts | 8 +++--- apps/sim/lib/billing/subscriptions/utils.ts | 5 ++-- apps/sim/scripts/test-billing-suite.ts | 2 +- apps/sim/stores/subscription/store.ts | 3 ++- 13 files changed, 50 insertions(+), 35 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx index b5ef3652630..9f515ba3770 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx @@ -13,6 +13,7 @@ import { } from '@/components/ui' import { useSession, useSubscription } from '@/lib/auth-client' import { createLogger } from '@/lib/logs/console/logger' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { BillingSummary, CancelSubscription, @@ -227,7 +228,7 @@ export function Subscription({ onOpenChange }: SubscriptionProps) { subscription.isEnterprise || (subscription.isTeam && isTeamAdmin) } - minimumLimit={usageLimitData?.minimumLimit ?? 5} + minimumLimit={usageLimitData?.minimumLimit ?? DEFAULT_FREE_CREDITS} /> )} diff --git a/apps/sim/db/schema.ts b/apps/sim/db/schema.ts index c77d55cd8a3..f2b88c1a192 100644 --- a/apps/sim/db/schema.ts +++ b/apps/sim/db/schema.ts @@ -17,6 +17,7 @@ import { vector, } from 'drizzle-orm/pg-core' import { TAG_SLOTS } from '@/lib/constants/knowledge' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' // Custom tsvector type for full-text search export const tsvector = customType<{ @@ -451,7 +452,7 @@ export const userStats = pgTable('user_stats', { totalChatExecutions: integer('total_chat_executions').notNull().default(0), totalTokensUsed: integer('total_tokens_used').notNull().default(0), totalCost: decimal('total_cost').notNull().default('0'), - currentUsageLimit: decimal('current_usage_limit').notNull().default('5'), // Default $5 for free plan + currentUsageLimit: decimal('current_usage_limit').notNull().default(DEFAULT_FREE_CREDITS.toString()), // Default $10 for free plan usageLimitSetBy: text('usage_limit_set_by'), // User ID who set the limit (for team admin tracking) usageLimitUpdatedAt: timestamp('usage_limit_updated_at').defaultNow(), // Billing period tracking diff --git a/apps/sim/hooks/use-subscription-state.ts b/apps/sim/hooks/use-subscription-state.ts index 873fd4825e0..8a2eaf92c25 100644 --- a/apps/sim/hooks/use-subscription-state.ts +++ b/apps/sim/hooks/use-subscription-state.ts @@ -1,6 +1,7 @@ import { useCallback, useEffect, useState } from 'react' import type { SubscriptionFeatures } from '@/lib/billing/types' import { createLogger } from '@/lib/logs/console/logger' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' const logger = createLogger('useSubscriptionState') @@ -89,7 +90,7 @@ export function useSubscriptionState() { usage: { current: data?.usage?.current ?? 0, - limit: data?.usage?.limit ?? 5, + limit: data?.usage?.limit ?? DEFAULT_FREE_CREDITS, percentUsed: data?.usage?.percentUsed ?? 0, isWarning: data?.usage?.isWarning ?? false, isExceeded: data?.usage?.isExceeded ?? false, @@ -214,9 +215,9 @@ export function useUsageLimit() { } return { - currentLimit: data?.currentLimit ?? 5, + currentLimit: data?.currentLimit ?? DEFAULT_FREE_CREDITS, canEdit: data?.canEdit ?? false, - minimumLimit: data?.minimumLimit ?? 5, + minimumLimit: data?.minimumLimit ?? DEFAULT_FREE_CREDITS, plan: data?.plan ?? 'free', setBy: data?.setBy, updatedAt: data?.updatedAt ? new Date(data.updatedAt) : null, diff --git a/apps/sim/lib/auth.ts b/apps/sim/lib/auth.ts index 20ffbeb2dc4..44929cf8353 100644 --- a/apps/sim/lib/auth.ts +++ b/apps/sim/lib/auth.ts @@ -22,6 +22,7 @@ import { import { getBaseURL } from '@/lib/auth-client' import { env, isTruthy } from '@/lib/env' import { isProd } from '@/lib/environment' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { getEmailDomain } from '@/lib/urls/utils' import { db } from '@/db' @@ -1080,7 +1081,7 @@ export const auth = betterAuth({ name: 'free', priceId: env.STRIPE_FREE_PRICE_ID || '', limits: { - cost: env.FREE_TIER_COST_LIMIT ?? 5, + cost: env.FREE_TIER_COST_LIMIT ?? DEFAULT_FREE_CREDITS, sharingEnabled: 0, multiplayerEnabled: 0, workspaceCollaborationEnabled: 0, diff --git a/apps/sim/lib/billing/constants.ts b/apps/sim/lib/billing/constants.ts index 33c3e8b3c1b..cc9c1b50ab5 100644 --- a/apps/sim/lib/billing/constants.ts +++ b/apps/sim/lib/billing/constants.ts @@ -2,6 +2,11 @@ * Billing and cost constants shared between client and server code */ +/** + * Default free credits (in dollars) for new users + */ +export const DEFAULT_FREE_CREDITS = 10 + /** * Base charge applied to every workflow execution * This charge is applied regardless of whether the workflow uses AI models diff --git a/apps/sim/lib/billing/core/billing.ts b/apps/sim/lib/billing/core/billing.ts index 4de81e0d307..070e56e77ab 100644 --- a/apps/sim/lib/billing/core/billing.ts +++ b/apps/sim/lib/billing/core/billing.ts @@ -6,6 +6,7 @@ import { import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { getUserUsageData } from '@/lib/billing/core/usage' import { requireStripeClient } from '@/lib/billing/stripe-client' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, organization, subscription, user, userStats } from '@/db/schema' @@ -917,7 +918,7 @@ function getDefaultBillingSummary(type: 'individual' | 'organization') { currentUsage: 0, overageAmount: 0, totalProjected: 0, - usageLimit: 5, + usageLimit: DEFAULT_FREE_CREDITS, percentUsed: 0, isWarning: false, isExceeded: false, @@ -935,7 +936,7 @@ function getDefaultBillingSummary(type: 'individual' | 'organization') { // Usage details usage: { current: 0, - limit: 5, + limit: DEFAULT_FREE_CREDITS, percentUsed: 0, isWarning: false, isExceeded: false, diff --git a/apps/sim/lib/billing/core/organization-billing.ts b/apps/sim/lib/billing/core/organization-billing.ts index 5f10877365b..f5169b50556 100644 --- a/apps/sim/lib/billing/core/organization-billing.ts +++ b/apps/sim/lib/billing/core/organization-billing.ts @@ -1,6 +1,7 @@ import { and, eq } from 'drizzle-orm' import { getPlanPricing } from '@/lib/billing/core/billing' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, organization, user, userStats } from '@/db/schema' @@ -87,7 +88,7 @@ export async function getOrganizationBillingData( // Process member data const members: MemberUsageData[] = membersWithUsage.map((memberRecord) => { const currentUsage = Number(memberRecord.currentPeriodCost || 0) - const usageLimit = Number(memberRecord.currentUsageLimit || 5) + const usageLimit = Number(memberRecord.currentUsageLimit || DEFAULT_FREE_CREDITS) const percentUsed = usageLimit > 0 ? (currentUsage / usageLimit) * 100 : 0 return { @@ -196,14 +197,14 @@ export async function updateMemberUsageLimit( } // Validate minimum limit based on plan - const planLimits = { - free: 5, + const planLimits = { + free: DEFAULT_FREE_CREDITS, pro: 20, team: 40, enterprise: 100, // Default, can be overridden by metadata } - let minimumLimit = planLimits[subscription.plan as keyof typeof planLimits] || 5 + let minimumLimit = planLimits[subscription.plan as keyof typeof planLimits] || DEFAULT_FREE_CREDITS // For enterprise, check metadata for custom limits if (subscription.plan === 'enterprise' && subscription.metadata) { diff --git a/apps/sim/lib/billing/core/subscription.ts b/apps/sim/lib/billing/core/subscription.ts index f1bfa10065a..9eab0267350 100644 --- a/apps/sim/lib/billing/core/subscription.ts +++ b/apps/sim/lib/billing/core/subscription.ts @@ -11,6 +11,7 @@ import { isProd } from '@/lib/environment' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, subscription, userStats } from '@/db/schema' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' const logger = createLogger('SubscriptionCore') @@ -156,7 +157,7 @@ export async function hasExceededCostLimit(userId: string): Promise { const subscription = await getHighestPrioritySubscription(userId) // Calculate usage limit - let limit = 5 // Default free tier limit + let limit = DEFAULT_FREE_CREDITS // Default free tier limit if (subscription) { limit = calculateDefaultUsageLimit(subscription) logger.info('Using subscription-based limit', { @@ -338,7 +339,7 @@ export async function getUserSubscriptionState(userId: string): Promise 0) { - let limit = 5 // Default free tier limit + let limit = DEFAULT_FREE_CREDITS // Default free tier limit if (subscription) { limit = calculateDefaultUsageLimit(subscription) } diff --git a/apps/sim/lib/billing/core/usage.ts b/apps/sim/lib/billing/core/usage.ts index 25e11e98693..1bc7584251a 100644 --- a/apps/sim/lib/billing/core/usage.ts +++ b/apps/sim/lib/billing/core/usage.ts @@ -2,6 +2,7 @@ import { and, eq } from 'drizzle-orm' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { calculateDefaultUsageLimit, canEditUsageLimit } from '@/lib/billing/subscriptions/utils' import type { BillingData, UsageData, UsageLimitInfo } from '@/lib/billing/types' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, user, userStats } from '@/db/schema' @@ -29,7 +30,7 @@ export async function getUserUsageData(userId: string): Promise { await initializeUserUsageLimit(userId) return { currentUsage: 0, - limit: 5, + limit: DEFAULT_FREE_CREDITS, percentUsed: 0, isWarning: false, isExceeded: false, @@ -98,7 +99,7 @@ export async function getUserUsageLimitInfo(userId: string): Promise { return // User already has usage stats, don't override } - // Create initial usage stats with default $5 limit + // Create initial usage stats with default free credits limit await db.insert(userStats).values({ id: crypto.randomUUID(), userId, - currentUsageLimit: '5', // Default $5 for new users + currentUsageLimit: DEFAULT_FREE_CREDITS.toString(), // Default free credits for new users usageLimitUpdatedAt: new Date(), billingPeriodStart: new Date(), // Start billing period immediately }) - logger.info('Initialized usage limit for new user', { userId, limit: 5 }) + logger.info('Initialized usage limit for new user', { userId, limit: DEFAULT_FREE_CREDITS }) } catch (error) { logger.error('Failed to initialize usage limit', { userId, error }) throw error @@ -233,7 +234,7 @@ export async function updateUserUsageLimit( if (!subscription || subscription.status !== 'active') { // Free plan users (shouldn't reach here due to canEditUsageLimit check above) - minimumLimit = 5 + minimumLimit = DEFAULT_FREE_CREDITS } else if (subscription.plan === 'pro') { // Pro plan users: $20 minimum minimumLimit = 20 @@ -311,7 +312,7 @@ export async function getUserUsageLimit(userId: string): Promise { if (userStatsQuery.length === 0) { // User doesn't have stats yet, initialize and return default await initializeUserUsageLimit(userId) - return 5 // Default free plan limit + return DEFAULT_FREE_CREDITS // Default free plan limit } return Number.parseFloat(userStatsQuery[0].currentUsageLimit) @@ -380,16 +381,16 @@ export async function syncUsageLimitsFromSubscription(userId: string): Promise ({ env: { - FREE_TIER_COST_LIMIT: 5, + FREE_TIER_COST_LIMIT: 10, PRO_TIER_COST_LIMIT: 20, TEAM_TIER_COST_LIMIT: 40, ENTERPRISE_TIER_COST_LIMIT: 200, @@ -27,15 +27,15 @@ describe('Subscription Utilities', () => { describe('calculateDefaultUsageLimit', () => { it.concurrent('returns free-tier limit when subscription is null', () => { - expect(calculateDefaultUsageLimit(null)).toBe(5) + expect(calculateDefaultUsageLimit(null)).toBe(10) }) it.concurrent('returns free-tier limit when subscription is undefined', () => { - expect(calculateDefaultUsageLimit(undefined)).toBe(5) + expect(calculateDefaultUsageLimit(undefined)).toBe(10) }) it.concurrent('returns free-tier limit when subscription is not active', () => { - expect(calculateDefaultUsageLimit({ plan: 'pro', status: 'canceled', seats: 1 })).toBe(5) + expect(calculateDefaultUsageLimit({ plan: 'pro', status: 'canceled', seats: 1 })).toBe(10) }) it.concurrent('returns pro limit for active pro plan', () => { diff --git a/apps/sim/lib/billing/subscriptions/utils.ts b/apps/sim/lib/billing/subscriptions/utils.ts index 2143f5499d8..5fd4c1f8dd7 100644 --- a/apps/sim/lib/billing/subscriptions/utils.ts +++ b/apps/sim/lib/billing/subscriptions/utils.ts @@ -1,4 +1,5 @@ import { env } from '@/lib/env' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' export function checkEnterprisePlan(subscription: any): boolean { return subscription?.plan === 'enterprise' && subscription?.status === 'active' @@ -20,7 +21,7 @@ export function checkTeamPlan(subscription: any): boolean { */ export function calculateDefaultUsageLimit(subscription: any): number { if (!subscription || subscription.status !== 'active') { - return env.FREE_TIER_COST_LIMIT || 0 + return env.FREE_TIER_COST_LIMIT || DEFAULT_FREE_CREDITS } const seats = subscription.seats || 1 @@ -45,7 +46,7 @@ export function calculateDefaultUsageLimit(subscription: any): number { return seats * (env.ENTERPRISE_TIER_COST_LIMIT || 0) } - return env.FREE_TIER_COST_LIMIT || 0 + return env.FREE_TIER_COST_LIMIT || DEFAULT_FREE_CREDITS } /** diff --git a/apps/sim/scripts/test-billing-suite.ts b/apps/sim/scripts/test-billing-suite.ts index 763016d4754..78fce1738bd 100644 --- a/apps/sim/scripts/test-billing-suite.ts +++ b/apps/sim/scripts/test-billing-suite.ts @@ -56,7 +56,7 @@ async function runBillingTestSuite(): Promise { logger.info('\nšŸ“‹ Creating test users...') // Free user (no overage billing) - const freeUser = await createTestUser('free', 5) // $5 usage on free plan + const freeUser = await createTestUser('free', 10) // $10 usage on free plan results.users.push(freeUser) // Pro user with no overage diff --git a/apps/sim/stores/subscription/store.ts b/apps/sim/stores/subscription/store.ts index aebb53b8d04..616d5af7bbb 100644 --- a/apps/sim/stores/subscription/store.ts +++ b/apps/sim/stores/subscription/store.ts @@ -1,6 +1,7 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { createLogger } from '@/lib/logs/console/logger' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import type { BillingStatus, SubscriptionData, @@ -22,7 +23,7 @@ const defaultFeatures: SubscriptionFeatures = { const defaultUsage: UsageData = { current: 0, - limit: 5, + limit: DEFAULT_FREE_CREDITS, percentUsed: 0, isWarning: false, isExceeded: false, From eadf4b25cb57484cc86845bf29c43cd25866f3c4 Mon Sep 17 00:00:00 2001 From: Siddharth Ganesan Date: Mon, 4 Aug 2025 12:20:00 -0700 Subject: [PATCH 2/2] Lint --- .../components/subscription/subscription.tsx | 4 ++-- apps/sim/db/schema.ts | 6 ++++-- apps/sim/hooks/use-subscription-state.ts | 6 +++--- apps/sim/lib/auth.ts | 2 +- apps/sim/lib/billing/core/billing.ts | 2 +- apps/sim/lib/billing/core/organization-billing.ts | 9 +++++---- apps/sim/lib/billing/core/subscription.ts | 2 +- apps/sim/lib/billing/core/usage.ts | 2 +- apps/sim/lib/billing/subscriptions/utils.ts | 2 +- apps/sim/stores/subscription/store.ts | 2 +- 10 files changed, 20 insertions(+), 17 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx index 9f515ba3770..3c47e7f55cc 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx @@ -12,8 +12,8 @@ import { Skeleton, } from '@/components/ui' import { useSession, useSubscription } from '@/lib/auth-client' -import { createLogger } from '@/lib/logs/console/logger' import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' +import { createLogger } from '@/lib/logs/console/logger' import { BillingSummary, CancelSubscription, @@ -228,7 +228,7 @@ export function Subscription({ onOpenChange }: SubscriptionProps) { subscription.isEnterprise || (subscription.isTeam && isTeamAdmin) } - minimumLimit={usageLimitData?.minimumLimit ?? DEFAULT_FREE_CREDITS} + minimumLimit={usageLimitData?.minimumLimit ?? DEFAULT_FREE_CREDITS} /> )} diff --git a/apps/sim/db/schema.ts b/apps/sim/db/schema.ts index f2b88c1a192..6b6c2342680 100644 --- a/apps/sim/db/schema.ts +++ b/apps/sim/db/schema.ts @@ -16,8 +16,8 @@ import { uuid, vector, } from 'drizzle-orm/pg-core' -import { TAG_SLOTS } from '@/lib/constants/knowledge' import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' +import { TAG_SLOTS } from '@/lib/constants/knowledge' // Custom tsvector type for full-text search export const tsvector = customType<{ @@ -452,7 +452,9 @@ export const userStats = pgTable('user_stats', { totalChatExecutions: integer('total_chat_executions').notNull().default(0), totalTokensUsed: integer('total_tokens_used').notNull().default(0), totalCost: decimal('total_cost').notNull().default('0'), - currentUsageLimit: decimal('current_usage_limit').notNull().default(DEFAULT_FREE_CREDITS.toString()), // Default $10 for free plan + currentUsageLimit: decimal('current_usage_limit') + .notNull() + .default(DEFAULT_FREE_CREDITS.toString()), // Default $10 for free plan usageLimitSetBy: text('usage_limit_set_by'), // User ID who set the limit (for team admin tracking) usageLimitUpdatedAt: timestamp('usage_limit_updated_at').defaultNow(), // Billing period tracking diff --git a/apps/sim/hooks/use-subscription-state.ts b/apps/sim/hooks/use-subscription-state.ts index 8a2eaf92c25..93dffb0045b 100644 --- a/apps/sim/hooks/use-subscription-state.ts +++ b/apps/sim/hooks/use-subscription-state.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useState } from 'react' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import type { SubscriptionFeatures } from '@/lib/billing/types' import { createLogger } from '@/lib/logs/console/logger' -import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' const logger = createLogger('useSubscriptionState') @@ -215,9 +215,9 @@ export function useUsageLimit() { } return { - currentLimit: data?.currentLimit ?? DEFAULT_FREE_CREDITS, + currentLimit: data?.currentLimit ?? DEFAULT_FREE_CREDITS, canEdit: data?.canEdit ?? false, - minimumLimit: data?.minimumLimit ?? DEFAULT_FREE_CREDITS, + minimumLimit: data?.minimumLimit ?? DEFAULT_FREE_CREDITS, plan: data?.plan ?? 'free', setBy: data?.setBy, updatedAt: data?.updatedAt ? new Date(data.updatedAt) : null, diff --git a/apps/sim/lib/auth.ts b/apps/sim/lib/auth.ts index 44929cf8353..14760e71686 100644 --- a/apps/sim/lib/auth.ts +++ b/apps/sim/lib/auth.ts @@ -20,9 +20,9 @@ import { renderPasswordResetEmail, } from '@/components/emails/render-email' import { getBaseURL } from '@/lib/auth-client' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { env, isTruthy } from '@/lib/env' import { isProd } from '@/lib/environment' -import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { getEmailDomain } from '@/lib/urls/utils' import { db } from '@/db' diff --git a/apps/sim/lib/billing/core/billing.ts b/apps/sim/lib/billing/core/billing.ts index 070e56e77ab..728575658bf 100644 --- a/apps/sim/lib/billing/core/billing.ts +++ b/apps/sim/lib/billing/core/billing.ts @@ -1,4 +1,5 @@ import { and, eq } from 'drizzle-orm' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { resetOrganizationBillingPeriod, resetUserBillingPeriod, @@ -6,7 +7,6 @@ import { import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { getUserUsageData } from '@/lib/billing/core/usage' import { requireStripeClient } from '@/lib/billing/stripe-client' -import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, organization, subscription, user, userStats } from '@/db/schema' diff --git a/apps/sim/lib/billing/core/organization-billing.ts b/apps/sim/lib/billing/core/organization-billing.ts index f5169b50556..d47c4d95590 100644 --- a/apps/sim/lib/billing/core/organization-billing.ts +++ b/apps/sim/lib/billing/core/organization-billing.ts @@ -1,7 +1,7 @@ import { and, eq } from 'drizzle-orm' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { getPlanPricing } from '@/lib/billing/core/billing' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' -import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, organization, user, userStats } from '@/db/schema' @@ -197,14 +197,15 @@ export async function updateMemberUsageLimit( } // Validate minimum limit based on plan - const planLimits = { - free: DEFAULT_FREE_CREDITS, + const planLimits = { + free: DEFAULT_FREE_CREDITS, pro: 20, team: 40, enterprise: 100, // Default, can be overridden by metadata } - let minimumLimit = planLimits[subscription.plan as keyof typeof planLimits] || DEFAULT_FREE_CREDITS + let minimumLimit = + planLimits[subscription.plan as keyof typeof planLimits] || DEFAULT_FREE_CREDITS // For enterprise, check metadata for custom limits if (subscription.plan === 'enterprise' && subscription.metadata) { diff --git a/apps/sim/lib/billing/core/subscription.ts b/apps/sim/lib/billing/core/subscription.ts index 9eab0267350..369013031d3 100644 --- a/apps/sim/lib/billing/core/subscription.ts +++ b/apps/sim/lib/billing/core/subscription.ts @@ -1,5 +1,6 @@ import { and, eq, inArray } from 'drizzle-orm' import { client } from '@/lib/auth-client' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { calculateDefaultUsageLimit, checkEnterprisePlan, @@ -11,7 +12,6 @@ import { isProd } from '@/lib/environment' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, subscription, userStats } from '@/db/schema' -import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' const logger = createLogger('SubscriptionCore') diff --git a/apps/sim/lib/billing/core/usage.ts b/apps/sim/lib/billing/core/usage.ts index 1bc7584251a..657aa2d7f3c 100644 --- a/apps/sim/lib/billing/core/usage.ts +++ b/apps/sim/lib/billing/core/usage.ts @@ -1,8 +1,8 @@ import { and, eq } from 'drizzle-orm' +import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { calculateDefaultUsageLimit, canEditUsageLimit } from '@/lib/billing/subscriptions/utils' import type { BillingData, UsageData, UsageLimitInfo } from '@/lib/billing/types' -import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/db' import { member, user, userStats } from '@/db/schema' diff --git a/apps/sim/lib/billing/subscriptions/utils.ts b/apps/sim/lib/billing/subscriptions/utils.ts index 5fd4c1f8dd7..f33f68d2561 100644 --- a/apps/sim/lib/billing/subscriptions/utils.ts +++ b/apps/sim/lib/billing/subscriptions/utils.ts @@ -1,5 +1,5 @@ -import { env } from '@/lib/env' import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' +import { env } from '@/lib/env' export function checkEnterprisePlan(subscription: any): boolean { return subscription?.plan === 'enterprise' && subscription?.status === 'active' diff --git a/apps/sim/stores/subscription/store.ts b/apps/sim/stores/subscription/store.ts index 616d5af7bbb..7620327ebaf 100644 --- a/apps/sim/stores/subscription/store.ts +++ b/apps/sim/stores/subscription/store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' -import { createLogger } from '@/lib/logs/console/logger' import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' +import { createLogger } from '@/lib/logs/console/logger' import type { BillingStatus, SubscriptionData,