From 9339bc3c6a57c2d18bbd2fc2f6ca14b739e39cc1 Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Fri, 10 Apr 2026 16:11:52 -0300 Subject: [PATCH 1/7] Offer the Scale-Up plan to self-serve customers Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/env/project_dev.js | 4 +-- frontend/env/project_local.js | 4 +-- frontend/env/project_prod.js | 2 +- .../web/components/modals/payment/Payment.tsx | 34 ++++++++++++++----- .../modals/payment/PricingPanel.tsx | 21 +++++++++++- .../modals/payment/pricingFeatures.tsx | 27 +++++++++++++++ .../organisation-settings/tabs/BillingTab.tsx | 4 +-- 7 files changed, 80 insertions(+), 16 deletions(-) diff --git a/frontend/env/project_dev.js b/frontend/env/project_dev.js index 0f5a5fc96b24..ee9cf04495ea 100644 --- a/frontend/env/project_dev.js +++ b/frontend/env/project_dev.js @@ -17,8 +17,8 @@ const Project = { // This is used for Sentry tracking maintenance: false, plans: { - scaleUp: { annual: 'scale-up-annual-v2', monthly: 'scale-up-v2' }, - startup: { annual: 'startup-annual-v2', monthly: 'startup-v2' }, + scaleUp: { annual: 'scale-up-12-months-v4', monthly: 'scale-up-v4' }, + startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, }, useSecureCookies: true, ...(_globalThis.projectOverrides || {}), diff --git a/frontend/env/project_local.js b/frontend/env/project_local.js index e36f3b68b199..7faab1efd182 100644 --- a/frontend/env/project_local.js +++ b/frontend/env/project_local.js @@ -17,8 +17,8 @@ const Project = { // This is used for Sentry tracking maintenance: false, plans: { - scaleUp: { annual: 'scale-up-annual-v2', monthly: 'scale-up-v2' }, - startup: { annual: 'startup-annual-v2', monthly: 'startup-v2' }, + scaleUp: { annual: 'scale-up-12-months-v4', monthly: 'scale-up-v4' }, + startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, }, useSecureCookies: false, ...(_globalThis.projectOverrides || {}), diff --git a/frontend/env/project_prod.js b/frontend/env/project_prod.js index 4747c51e9aa7..a24eddd5ec2c 100644 --- a/frontend/env/project_prod.js +++ b/frontend/env/project_prod.js @@ -27,7 +27,7 @@ const Project = { // This is used for Sentry tracking maintenance: false, plans: { - scaleUp: { annual: 'scale-up-12-months-v2', monthly: 'scale-up-v2' }, + scaleUp: { annual: 'scale-up-12-months-v4', monthly: 'scale-up-v4' }, startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, }, useSecureCookies: true, diff --git a/frontend/web/components/modals/payment/Payment.tsx b/frontend/web/components/modals/payment/Payment.tsx index 20eeb53cd049..9e914e620c69 100644 --- a/frontend/web/components/modals/payment/Payment.tsx +++ b/frontend/web/components/modals/payment/Payment.tsx @@ -5,7 +5,11 @@ import BlockedOrgInfo from 'components/BlockedOrgInfo' import { Organisation } from 'common/types/responses' import { PricingToggle } from './PricingToggle' import { PricingPanel } from './PricingPanel' -import { STARTUP_FEATURES, ENTERPRISE_FEATURES } from './pricingFeatures' +import { + STARTUP_FEATURES, + SCALE_UP_FEATURES, + ENTERPRISE_FEATURES, +} from './pricingFeatures' import { CHARGEBEE_SCRIPT_URL, CONTACT_US_URL, @@ -104,6 +108,27 @@ export const Payment: FC = ({ organisationId={organisation.id} /> + + = ({ } /> -
- *Need something in-between our Enterprise plan for users or API - limits? -
- Reach out to us and we'll help you out -
-
) diff --git a/frontend/web/components/modals/payment/PricingPanel.tsx b/frontend/web/components/modals/payment/PricingPanel.tsx index 8e8da888030f..f029f79cc951 100644 --- a/frontend/web/components/modals/payment/PricingPanel.tsx +++ b/frontend/web/components/modals/payment/PricingPanel.tsx @@ -11,6 +11,10 @@ export type PricingPanelProps = { title: string priceMonthly?: string priceYearly?: string + seatPriceMonthly?: string + seatPriceYearly?: string + includesFrom?: string + isFeatured?: boolean isYearly: boolean chargebeePlanId?: string isPurchased?: boolean @@ -27,13 +31,17 @@ export const PricingPanel = ({ features, hasActiveSubscription, headerContent, + includesFrom, isDisableAccount, isEnterprise, + isFeatured, isPurchased, isYearly, organisationId, priceMonthly, priceYearly, + seatPriceMonthly, + seatPriceYearly, title, }: PricingPanelProps) => { return ( @@ -46,6 +54,11 @@ export const PricingPanel = ({
+ {isFeatured && ( + + Most Popular + + )} {headerContent && ( )} + {(seatPriceMonthly || seatPriceYearly) && ( +
+ + ${isYearly ? seatPriceYearly : seatPriceMonthly}/seat +
+ )} + {isEnterprise && (
@@ -125,7 +144,7 @@ export const PricingPanel = ({ > All from{' '} - {isEnterprise ? 'Start-Up,' : 'Free,'} + {includesFrom ?? (isEnterprise ? 'Scale-Up' : 'Free')}, {' '} plus diff --git a/frontend/web/components/modals/payment/pricingFeatures.tsx b/frontend/web/components/modals/payment/pricingFeatures.tsx index b7e2a85b9719..c5193366fd39 100644 --- a/frontend/web/components/modals/payment/pricingFeatures.tsx +++ b/frontend/web/components/modals/payment/pricingFeatures.tsx @@ -30,6 +30,33 @@ export const STARTUP_FEATURES: PricingFeature[] = [ }, ] +export const SCALE_UP_FEATURES: PricingFeature[] = [ + { + text: ( + <> + Up to + 5,000,000 Requests per month + + ), + }, + { + text: ( + <> + 5+ Team members + + ), + }, + { + text: 'User roles and permissions', + }, + { + text: 'Change requests', + }, + { + text: 'Audit logs', + }, +] + export const ENTERPRISE_FEATURES: PricingFeature[] = [ { text: ( diff --git a/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx b/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx index a656e4f297a8..75b7e78002e8 100644 --- a/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx +++ b/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx @@ -2,8 +2,8 @@ import React from 'react' import { Organisation } from 'common/types/responses' import Icon from 'components/icons/Icon' import Utils from 'common/utils/utils' -import PaymentLegacy from 'components/modals/Payment' -import PaymentNew from 'components/modals/payment' +import PaymentLegacy from 'components/modals/Payment.js' +import { Payment as PaymentNew } from 'components/modals/payment/Payment' import { useGetSubscriptionMetadataQuery } from 'common/services/useSubscriptionMetadata' import StatItem, { StatItemProps } from 'components/StatItem' From 96e0cea9c5b96fda4f1f9d6c7e43d2e433b8f4ac Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Fri, 10 Apr 2026 17:03:15 -0300 Subject: [PATCH 2/7] Direct free-plan users to Startup as the first paid upgrade Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/common/utils/utils.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/common/utils/utils.tsx b/frontend/common/utils/utils.tsx index e6b8c79e4bd7..527ee34d1df9 100644 --- a/frontend/common/utils/utils.tsx +++ b/frontend/common/utils/utils.tsx @@ -397,17 +397,20 @@ const Utils = Object.assign({}, BaseUtils, { return EnvironmentPermissionDescriptions.UPDATE_FEATURE_STATE }, - getNextPlan: (skipFree?: boolean) => { + getNextPlan: () => { const currentPlan = Utils.getPlanName(AccountStore.getActiveOrgPlan()) if (currentPlan !== planNames.enterprise && !Utils.isSaas()) { return planNames.enterprise } switch (currentPlan) { case planNames.free: { - return skipFree ? planNames.startup : planNames.scaleUp + return planNames.startup } case planNames.startup: { - return planNames.startup + return planNames.scaleUp + } + case planNames.scaleUp: { + return planNames.enterprise } default: { return planNames.enterprise From 2fb0804027c6deb163462d44a0709e6949efe635 Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Fri, 10 Apr 2026 17:03:20 -0300 Subject: [PATCH 3/7] Reflect the current $60/seat cost in the auto-seat-upgrade message Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/web/components/pages/UsersAndPermissionsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/web/components/pages/UsersAndPermissionsPage.tsx b/frontend/web/components/pages/UsersAndPermissionsPage.tsx index 773238ce349a..e958bd489964 100644 --- a/frontend/web/components/pages/UsersAndPermissionsPage.tsx +++ b/frontend/web/components/pages/UsersAndPermissionsPage.tsx @@ -280,7 +280,7 @@ const UsersAndPermissionsInner: FC = ({ ) : ( You will automatically be charged - $20/month for each additional member that + $60/month for each additional member that joins your organisation. )} From 55970f334a773752e3f51600ff58804847843582 Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Fri, 10 Apr 2026 19:57:11 -0300 Subject: [PATCH 4/7] Communicate the 20-seat limit on the Scale-Up pricing tile Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/web/components/modals/payment/pricingFeatures.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/web/components/modals/payment/pricingFeatures.tsx b/frontend/web/components/modals/payment/pricingFeatures.tsx index c5193366fd39..a5259256bf86 100644 --- a/frontend/web/components/modals/payment/pricingFeatures.tsx +++ b/frontend/web/components/modals/payment/pricingFeatures.tsx @@ -42,7 +42,7 @@ export const SCALE_UP_FEATURES: PricingFeature[] = [ { text: ( <> - 5+ Team members + Up to 20 Team members ), }, From 35074984bd91c024d014f6974778c48ac6166660 Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Fri, 10 Apr 2026 20:49:00 -0300 Subject: [PATCH 5/7] Update Chargebee plan IDs --- frontend/env/project_dev.js | 2 +- frontend/env/project_local.js | 3 ++- frontend/env/project_prod.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/env/project_dev.js b/frontend/env/project_dev.js index ee9cf04495ea..e7274ff27f08 100644 --- a/frontend/env/project_dev.js +++ b/frontend/env/project_dev.js @@ -17,7 +17,7 @@ const Project = { // This is used for Sentry tracking maintenance: false, plans: { - scaleUp: { annual: 'scale-up-12-months-v4', monthly: 'scale-up-v4' }, + scaleUp: { annual: 'Scale-Up-v4-USD-Yearly', monthly: 'Scale-Up-v4-USD-Monthly' }, startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, }, useSecureCookies: true, diff --git a/frontend/env/project_local.js b/frontend/env/project_local.js index 7faab1efd182..ad5f40644487 100644 --- a/frontend/env/project_local.js +++ b/frontend/env/project_local.js @@ -17,9 +17,10 @@ const Project = { // This is used for Sentry tracking maintenance: false, plans: { - scaleUp: { annual: 'scale-up-12-months-v4', monthly: 'scale-up-v4' }, + scaleUp: { annual: 'Scale-Up-v4-USD-Yearly', monthly: 'Scale-Up-v4-USD-Monthly' }, startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, }, + cookieSameSite: 'lax', useSecureCookies: false, ...(_globalThis.projectOverrides || {}), } diff --git a/frontend/env/project_prod.js b/frontend/env/project_prod.js index a24eddd5ec2c..c1e3306f8103 100644 --- a/frontend/env/project_prod.js +++ b/frontend/env/project_prod.js @@ -27,7 +27,7 @@ const Project = { // This is used for Sentry tracking maintenance: false, plans: { - scaleUp: { annual: 'scale-up-12-months-v4', monthly: 'scale-up-v4' }, + scaleUp: { annual: 'Scale-Up-v4-USD-Yearly', monthly: 'Scale-Up-v4-USD-Monthly' }, startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, }, useSecureCookies: true, From da6302ada26671102720a82e294a88fc6d694b4f Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Mon, 13 Apr 2026 16:22:31 -0300 Subject: [PATCH 6/7] no laxing --- frontend/env/project_local.js | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/env/project_local.js b/frontend/env/project_local.js index ad5f40644487..2e2c78c62b90 100644 --- a/frontend/env/project_local.js +++ b/frontend/env/project_local.js @@ -20,7 +20,6 @@ const Project = { scaleUp: { annual: 'Scale-Up-v4-USD-Yearly', monthly: 'Scale-Up-v4-USD-Monthly' }, startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, }, - cookieSameSite: 'lax', useSecureCookies: false, ...(_globalThis.projectOverrides || {}), } From b1b2297fad7d7b7499d5b2d841df6c3cf70b4c4c Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Mon, 13 Apr 2026 17:29:49 -0300 Subject: [PATCH 7/7] Forget bias and retry --- frontend/env/project_dev.js | 2 +- frontend/env/project_local.js | 2 +- frontend/web/components/modals/Payment.js | 124 ++++++++++++++++-- .../web/components/modals/payment/Payment.tsx | 2 + .../modals/payment/PricingPanel.tsx | 4 +- .../organisation-settings/tabs/BillingTab.tsx | 4 +- 6 files changed, 121 insertions(+), 17 deletions(-) diff --git a/frontend/env/project_dev.js b/frontend/env/project_dev.js index e7274ff27f08..d69548f70853 100644 --- a/frontend/env/project_dev.js +++ b/frontend/env/project_dev.js @@ -18,7 +18,7 @@ const Project = { maintenance: false, plans: { scaleUp: { annual: 'Scale-Up-v4-USD-Yearly', monthly: 'Scale-Up-v4-USD-Monthly' }, - startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, + startup: { annual: 'startup-annual-v2', monthly: 'startup-v2' }, }, useSecureCookies: true, ...(_globalThis.projectOverrides || {}), diff --git a/frontend/env/project_local.js b/frontend/env/project_local.js index 2e2c78c62b90..cf36706e946d 100644 --- a/frontend/env/project_local.js +++ b/frontend/env/project_local.js @@ -18,7 +18,7 @@ const Project = { maintenance: false, plans: { scaleUp: { annual: 'Scale-Up-v4-USD-Yearly', monthly: 'Scale-Up-v4-USD-Monthly' }, - startup: { annual: 'start-up-12-months-v2', monthly: 'startup-v2' }, + startup: { annual: 'startup-annual-v2', monthly: 'startup-v2' }, }, useSecureCookies: false, ...(_globalThis.projectOverrides || {}), diff --git a/frontend/web/components/modals/Payment.js b/frontend/web/components/modals/Payment.js index ad13226a1fe9..bd8ae15b8633 100644 --- a/frontend/web/components/modals/Payment.js +++ b/frontend/web/components/modals/Payment.js @@ -268,6 +268,118 @@ const Payment = class extends Component {
+ +
+
+ + Most Popular + + + +

Scale-Up

+
+ +
$
+

+ {this.state.yearly ? '270' : '300'}{' '} +

/mo
+ +
+
+ + ${this.state.yearly ? '50' : '60'}/seat +
+ {!viewOnly ? ( + <> + + {plan.includes('scale-up') + ? 'Purchased' + : '14 Day Free Trial'} + + + {plan.includes('scale-up') + ? 'Purchased' + : '14 Day Free Trial'} + + + ) : null} +
+
+
+ All from{' '} + Start-Up, plus +
+
    +
  • + + + + +
    + Up to + 5,000,000 Requests per month +
    +
    +
  • +
  • + + + + +
    + Up to 20 Team members +
    +
    +
  • +
  • + + + + +
    + User roles and permissions +
    +
    +
  • +
  • + + + + +
    Change requests
    +
    +
  • +
  • + + + + +
    Audit logs
    +
    +
  • +
+
+
+
All from{' '} - Start-Up, plus + Scale-Up, plus
  • @@ -410,16 +522,6 @@ const Payment = class extends Component {
-
- *Need something in-between our Enterprise plan for users or - API limits? -
- - Reach out - {' '} - to us and we'll help you out -
-
) }} diff --git a/frontend/web/components/modals/payment/Payment.tsx b/frontend/web/components/modals/payment/Payment.tsx index 9e914e620c69..b3ef23204b72 100644 --- a/frontend/web/components/modals/payment/Payment.tsx +++ b/frontend/web/components/modals/payment/Payment.tsx @@ -106,6 +106,7 @@ export const Payment: FC = ({ features={STARTUP_FEATURES} hasActiveSubscription={hasActiveSubscription} organisationId={organisation.id} + includesFrom='Free' /> = ({ features={ENTERPRISE_FEATURES} hasActiveSubscription={hasActiveSubscription} organisationId={organisation.id} + includesFrom='Scale-Up' headerContent={ <> Optional{' '} diff --git a/frontend/web/components/modals/payment/PricingPanel.tsx b/frontend/web/components/modals/payment/PricingPanel.tsx index f029f79cc951..9f22f84b797c 100644 --- a/frontend/web/components/modals/payment/PricingPanel.tsx +++ b/frontend/web/components/modals/payment/PricingPanel.tsx @@ -13,7 +13,7 @@ export type PricingPanelProps = { priceYearly?: string seatPriceMonthly?: string seatPriceYearly?: string - includesFrom?: string + includesFrom: string isFeatured?: boolean isYearly: boolean chargebeePlanId?: string @@ -144,7 +144,7 @@ export const PricingPanel = ({ > All from{' '} - {includesFrom ?? (isEnterprise ? 'Scale-Up' : 'Free')}, + {includesFrom}, {' '} plus diff --git a/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx b/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx index 75b7e78002e8..a656e4f297a8 100644 --- a/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx +++ b/frontend/web/components/pages/organisation-settings/tabs/BillingTab.tsx @@ -2,8 +2,8 @@ import React from 'react' import { Organisation } from 'common/types/responses' import Icon from 'components/icons/Icon' import Utils from 'common/utils/utils' -import PaymentLegacy from 'components/modals/Payment.js' -import { Payment as PaymentNew } from 'components/modals/payment/Payment' +import PaymentLegacy from 'components/modals/Payment' +import PaymentNew from 'components/modals/payment' import { useGetSubscriptionMetadataQuery } from 'common/services/useSubscriptionMetadata' import StatItem, { StatItemProps } from 'components/StatItem'