From 26ef85dc2a6a0c86bcfbdfa2151df9907e7ba5a6 Mon Sep 17 00:00:00 2001 From: Theodore Li Date: Thu, 18 Jun 2026 17:22:08 -0700 Subject: [PATCH] feat(tables): raise per-plan table limits (free 5/50k, pro 100/100k, max 1k/500k) Co-Authored-By: Claude Opus 4.8 (1M context) --- .../app/(landing)/components/pricing/pricing.tsx | 8 ++++---- apps/sim/lib/core/config/env.ts | 12 ++++++------ apps/sim/lib/table/constants.ts | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/sim/app/(landing)/components/pricing/pricing.tsx b/apps/sim/app/(landing)/components/pricing/pricing.tsx index d989f714167..b3d417ffba0 100644 --- a/apps/sim/app/(landing)/components/pricing/pricing.tsx +++ b/apps/sim/app/(landing)/components/pricing/pricing.tsx @@ -38,7 +38,7 @@ const PRICING_TIERS: PricingTier[] = [ features: [ '1,000 credits (trial)', '5GB file storage', - '3 tables · 1,000 rows each', + '5 tables · 50,000 rows each', '1 personal workspace', '5 min execution limit', '7-day log retention', @@ -56,7 +56,7 @@ const PRICING_TIERS: PricingTier[] = [ features: [ '6,000 credits/mo · +50/day', '50GB file storage', - '25 tables · 5,000 rows each', + '100 tables · 100,000 rows each', 'Up to 3 personal workspaces', '50 min execution · 150 runs/min', 'Unlimited log retention', @@ -74,7 +74,7 @@ const PRICING_TIERS: PricingTier[] = [ features: [ '25,000 credits/mo · +200/day', '500GB file storage', - '25 tables · 5,000 rows each', + '1,000 tables · 500,000 rows each', 'Up to 10 personal workspaces', '50 min execution · 300 runs/min', 'Unlimited log retention', @@ -91,7 +91,7 @@ const PRICING_TIERS: PricingTier[] = [ features: [ 'Custom credits & infra limits', 'Custom file storage', - '10,000 tables · 1M rows each', + 'Custom tables & rows', 'Unlimited shared workspaces', 'Custom execution limits', 'Unlimited log retention', diff --git a/apps/sim/lib/core/config/env.ts b/apps/sim/lib/core/config/env.ts index 5888e8d537f..27d810ed73b 100644 --- a/apps/sim/lib/core/config/env.ts +++ b/apps/sim/lib/core/config/env.ts @@ -75,12 +75,12 @@ export const env = createEnv({ TABLE_SNAPSHOT_CACHE: z.boolean().optional(), // Mount tables into sandboxes by reference via a version-keyed CSV snapshot in object storage instead of draining the whole table into web-process heap // Table feature limits (per plan). Apply when billing is disabled (free tier defaults) or for billed plans. - FREE_TABLES_LIMIT: z.number().optional(), // Max user tables per workspace on free tier (default: 3) - FREE_TABLE_ROWS_LIMIT: z.number().optional(), // Max rows per table on free tier (default: 1000) - PRO_TABLES_LIMIT: z.number().optional(), // Max user tables per workspace on pro tier (default: 25) - PRO_TABLE_ROWS_LIMIT: z.number().optional(), // Max rows per table on pro tier (default: 5000) - TEAM_TABLES_LIMIT: z.number().optional(), // Max user tables per workspace on team tier (default: 100) - TEAM_TABLE_ROWS_LIMIT: z.number().optional(), // Max rows per table on team tier (default: 10000) + FREE_TABLES_LIMIT: z.number().optional(), // Max user tables per workspace on free tier (default: 5) + FREE_TABLE_ROWS_LIMIT: z.number().optional(), // Max rows per table on free tier (default: 50000) + PRO_TABLES_LIMIT: z.number().optional(), // Max user tables per workspace on pro tier (default: 100) + PRO_TABLE_ROWS_LIMIT: z.number().optional(), // Max rows per table on pro tier (default: 100000) + TEAM_TABLES_LIMIT: z.number().optional(), // Max user tables per workspace on team tier (default: 1000) + TEAM_TABLE_ROWS_LIMIT: z.number().optional(), // Max rows per table on team tier (default: 500000) ENTERPRISE_TABLES_LIMIT: z.number().optional(), // Max user tables per workspace on enterprise tier (default: 10000) ENTERPRISE_TABLE_ROWS_LIMIT: z.number().optional(), // Max rows per table on enterprise tier (default: 1000000) diff --git a/apps/sim/lib/table/constants.ts b/apps/sim/lib/table/constants.ts index 0a276f68a41..22a3bd9a595 100644 --- a/apps/sim/lib/table/constants.ts +++ b/apps/sim/lib/table/constants.ts @@ -31,7 +31,7 @@ export const TABLE_LIMITS = { * keyset-select and cancel/ownership-check granularity. */ DELETE_PAGE_SIZE: 10000, /** Row count above which an export runs as a background job instead of a synchronous stream. - * Matches the default per-table row cap, so non-enterprise tables keep instant downloads. */ + * Tables at or under this stream instantly; larger ones fall back to an async export job. */ EXPORT_ASYNC_THRESHOLD_ROWS: 10000, /** Cap on the exclusion set ("select all, minus these") sent to an async delete job. */ MAX_EXCLUDE_ROW_IDS: 10000, @@ -44,16 +44,16 @@ export const TABLE_LIMITS = { */ export const DEFAULT_TABLE_PLAN_LIMITS = { free: { - maxTables: 3, - maxRowsPerTable: 1000, + maxTables: 5, + maxRowsPerTable: 50000, }, pro: { - maxTables: 25, - maxRowsPerTable: 5000, + maxTables: 100, + maxRowsPerTable: 100000, }, team: { - maxTables: 100, - maxRowsPerTable: 10000, + maxTables: 1000, + maxRowsPerTable: 500000, }, enterprise: { maxTables: 10000,