Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions apps/sim/app/(landing)/components/pricing/pricing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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',
Expand All @@ -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',
Expand All @@ -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',
Expand Down
12 changes: 6 additions & 6 deletions apps/sim/lib/core/config/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
14 changes: 7 additions & 7 deletions apps/sim/lib/table/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 EXPORT_ASYNC_THRESHOLD_ROWS now triggers async export for most tables on every plan

EXPORT_ASYNC_THRESHOLD_ROWS is kept at 10,000 while the minimum plan row cap has jumped to 50,000 (free). Any table that fills even 20% of its free-tier quota will silently switch from instant streaming to an async background job. The old comment explicitly noted this threshold was aligned with the per-plan row cap to preserve synchronous downloads for non-enterprise users — that guarantee no longer holds. This is likely intentional given the server-load implications of streaming large tables synchronously, but it's worth confirming the async export UX is ready to be the default experience for all plan tiers rather than an enterprise-only path.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Async-export threshold now triggers for nearly all real tables

EXPORT_ASYNC_THRESHOLD_ROWS stays at 10,000 while the smallest plan (free) now caps at 50,000 rows. Any free user who fills their table past 10k rows — and most pro users who would have been safely under 5k rows before — will now land on the async-export path instead of an instant download. The updated comment correctly documents the new reality, but since this is the first time regular (non-enterprise) users will routinely hit the async path, it may be worth a brief mention in release notes or in the UI (e.g., surfacing an "export started" notification proactively). No code change is strictly required, but wanted to flag the UX shift.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

/** Cap on the exclusion set ("select all, minus these") sent to an async delete job. */
MAX_EXCLUDE_ROW_IDS: 10000,
Expand All @@ -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,
Expand Down
Loading