diff --git a/pcweb/pages/pricing/header.py b/pcweb/pages/pricing/header.py index 28085dfe5..7fd23e83e 100644 --- a/pcweb/pages/pricing/header.py +++ b/pcweb/pages/pricing/header.py @@ -8,9 +8,17 @@ def header() -> rx.Component: "Pricing that scales with you", class_name="gradient-heading font-semibold text-4xl xl:text-5xl text-center", ), - rx.el.h2( - "Start for free using the open-source and scale as you grow.", - class_name="font-medium text-slate-9 text-lg text-center text-wrap", + rx.hstack( + rx.el.a( + rx.badge("Build with AI", class_name="text-lg text-center text-wrap rounded-md bg-[--violet-9] flex items-center justify-center text-[#FCFCFD]"), + href="https://reflex.build", + ), + rx.el.a( + rx.badge("Deploy with Cloud", class_name="text-lg text-center text-wrap rounded-md bg-[--violet-9] flex items-center justify-center text-[#FCFCFD]"), + href="https://cloud.reflex.dev", + ), + rx.badge("Scale with Enterprise", class_name="text-lg text-center text-wrap rounded-md bg-[--violet-9] flex items-center justify-center text-[#FCFCFD]"), + gap="2rem", ), class_name="flex flex-col gap-4 justify-center items-center max-w-[64.19rem] 2xl:border-x border-slate-4 w-full pb-16 " + rx.cond(HostingBannerState.show_banner, "pt-[13rem]", "pt-[10rem]"), diff --git a/pcweb/pages/pricing/plan_cards.py b/pcweb/pages/pricing/plan_cards.py index 64455f1dc..67dd3df8d 100644 --- a/pcweb/pages/pricing/plan_cards.py +++ b/pcweb/pages/pricing/plan_cards.py @@ -247,15 +247,14 @@ def plan_cards() -> rx.Component: "Hobby", "Everything you need to get started.", [ - ("heart-handshake", "Community support"), + ("brain", "AI App Builder (Limited Access)"), ( "app-window", - "Unlimited apps", + "Cloud Unlimited Apps", "Free users are limited to 20 hours of 1 vCPU, 1 GB RAM machines per month.", ), - ("clock", "1 day log retention"), - ("code", "Open Source Framework"), - ("file-code", "Starter Templates"), + ("code", "Reflex Open Source"), + ("heart-handshake", "Discord/Github Support") ], "Start building for free", price="Free", @@ -265,18 +264,9 @@ def plan_cards() -> rx.Component: "Pro", "For professional projects and startups.", [ - ("heart-handshake", "Priority Community support"), - ("users", "1 seat incl. (additional seats at $20/mo)"), - ("credit-card", "$10 / month free compute credits"), - ("server", "Customize machine sizes"), - ("clock", "30 days log retention"), - ("globe", "Multi-region"), + ("brain", "AI App Builder (Free $20 credits / month)"), + ("credit-card", "Cloud (Free $10 credits / month)"), ("brush", "Custom domains"), - ( - "file-badge", - "Remove Branding", - "Check out the Reflex Branding doc page to learn how to remove the 'Built with Reflex' badge from your app.", - ), ("circle-plus", "Everything in Hobby"), ], "Start with Pro plan", @@ -286,34 +276,27 @@ def plan_cards() -> rx.Component: "Team", "For teams looking to scale their applications.", [ - ("mail", "Email/Slack support"), - ("users", "5 seat incl. (additional seats available)"), - ("credit-card", "Monthly free compute credits"), - ("git-branch", "Create multiple projects"), - ("signal", "Full Website Analytics"), + ("users", "Invite your team mates"), + ("cable", "Connect AI Builder to your Data", "Integrations include Databricks, Snowflake, etc."), ("lock-keyhole", "One Click Auth"), - ( - "file-badge", - "Remove Branding Everywhere", - "Check out the Remove Reflex Branding section in the Self Hosting doc page to learn how to remove the 'Built with Reflex' badge from your app.", - ), + ("file-badge", "AG Grid with no Reflex Branding"), + ("mail", "Email support"), ("circle-plus", "Everything in Pro"), ], "Contact sales", + price="$49/user/mo + compute", redirect_url=REFLEX_DEV_WEB_LANDING_FORM_URL_GET_DEMO, ), card( "Enterprise", "Get a plan tailored to your business needs.", [ - ("headset", "Dedicated Support"), - ("users", "Customized seat amount"), + ("hand-helping", "White Glove Onboarding"), ("user-round-plus", "Personalized integration help"), ("hard-drive", "On Premise Deployment"), - ("clock", "Unlimited log retention"), - ("activity", "Error Monitoring and Observability"), + ("key", "Bring your own AI API keys"), + ("headset", "Dedicated Support Channel"), ("git-pull-request", "Influence Reflex Roadmap"), - ("shield-check", "Audit logs, SSO, SOC2 Reports"), ("circle-plus", "Everything in Team"), ], "Contact sales", diff --git a/pcweb/pages/pricing/pricing.py b/pcweb/pages/pricing/pricing.py index 863fb1025..e56c9d1cc 100644 --- a/pcweb/pages/pricing/pricing.py +++ b/pcweb/pages/pricing/pricing.py @@ -4,7 +4,7 @@ from pcweb.pages.index.views.footer_index import footer_index from pcweb.pages.pricing.header import header from pcweb.pages.pricing.plan_cards import plan_cards -from pcweb.pages.pricing.table import comparison_table_hosting, comparison_table_oss +from pcweb.pages.pricing.table import comparison_table_hosting, comparison_table_ai_and_oss from pcweb.pages.pricing.faq import faq from pcweb.pages.pricing.calculator import calculator_section from pcweb.meta.meta import hosting_meta_tags @@ -24,9 +24,9 @@ def pricing() -> rx.Component: rx.box( header(), plan_cards(), - calculator_section(), + comparison_table_ai_and_oss(), comparison_table_hosting(), - comparison_table_oss(), + calculator_section(), faq(), class_name="flex flex-col relative justify-center items-center w-full", ), diff --git a/pcweb/pages/pricing/table.py b/pcweb/pages/pricing/table.py index 7d9af7ce1..3bb31e5b2 100644 --- a/pcweb/pages/pricing/table.py +++ b/pcweb/pages/pricing/table.py @@ -33,49 +33,76 @@ } """ +PRICE_SECTION = [ + ("Per Seat Price", "FREE", "$20/month", "$49/month", "Custom"), + ("Team Size", "1", "1", "< 25", "Unlimited"), +] + FRAMEWORK_SECTION = [ ("Open Source Framework", True, True, True, True), + ("AG Grid *", True, True, True, True), ("One Click Auth", False, False, True, True), - ("Embed Reflex Apps", False, False, True, True), + ("Single Port Deploy", False, False, True, True), + ("HTTP Fallback for Websockets", False, False, True, True), + ("Custom NPM Registry", False, False, True, True), ] -REFLEX_BRANDING_SECTION = [ - ("Remove Branding", "", "On Cloud", "Everywhere*", "Everywhere*"), +AI_TEXT_SECTION = [ + ("AI App Building", "Limited Access", "$20 credits/month", "$40 credits/user/month", "Custom"), ] -REFLEX_AI_SECTION = [] +AI_BOOLEAN_SECTION = [ + ("Purchase Extra AI Credits", False, True, True, True), + ("One Click Cloud Deploy", True, True, True, True), + ("Github Integration", True, True, True, True), + ("Database Integration", True, True, True, True), + ("Secrets Integration", True, True, True, True), + ("Web IDE", True, True, True, True), + ("Private Apps", False, True, True, True), + ("Connect AI Builder to your Data Sources", False, False, True, True), + ("Bring your own API Keys", False, False, False, True), +] + + + HOSTING_TEXT_SECTION = [ + ("Compute", "20 hours/month", "$10 compute credits/month", "$20 compute credits/user/month", "Custom"), ("Regions", "Single", "Multiple", "Multiple", "Multiple"), - ("Logs", "1 day", "30 days", "90 days", "Custom"), + ("Build Logs", "1 day", "30 days", "90 days", "Custom"), + ("Runtime Logs", "1 hour", "1 day", "1 week", "Custom"), ] HOSTING_BOOLEAN_SECTION = [ + ("CPU / Memory Metrics", True, True, True, True), ("CLI Deployments", True, True, True, True), ("CI/CD Deploy Tokens", True, True, True, True), ("Set Billing Limits", True, True, True, True), ("Custom Domains", False, True, True, True), ("Secret Manager", False, True, True, True), - ("App Analytics", False, True, True, True), - ("On Prem Hosting", False, False, False, True), + ("User Analytics", False, False, True, True), + ("Custom Alerts", False, False, True, True), + ("Rollbacks", False, False, True, True), + ("Audit Log", False, False, True, True), + ("On Prem Deployments", False, False, False, True), ] SECURITY_SECTION = [ ("Web App Firewall", True, True, True, True), ("HTTP/SSL", True, True, True, True), ("DDos Protection", True, True, True, True), - ("2 Factor Auth", True, True, True, True), - ("Audit Logs", False, False, False, True), + ("Automatic CI/CD", False, True, True, True), + ("Security Audit Reports", False, False, True, True), ("SSO", False, False, False, True), ] SUPPORT_TEXT_SECTION = [ - ("Support", "Community", "Community", "Email/Slack", "Dedicated Support") + ("Support", "Community", "Community", "Email Support", "Dedicated Support") ] SUPPORT_BOOLEAN_SECTION = [ + ("White Glove Onboarding", False, False, False, True), ("SLAs Available", False, False, False, True), - ("Personalized Onboarding", False, False, False, True), ("", "", "", "", ""), ] @@ -88,7 +115,7 @@ ASTERIX_SECTION = [ ( - "* Everywhere: This includes removing the 'Built with Reflex' badge for self hosted apps.", + "* AG Grid comes with a 'Built with Reflex' badge for Hobby and Pro tier.", "", "", "", @@ -194,34 +221,72 @@ def create_checkmark_row(feature: str, checks: tuple[bool, ...]) -> rx.Component return create_table_row(cells) -def header_hosting() -> rx.Component: + + +def header_oss() -> rx.Component: return rx.box( rx.el.h3( - "Secure and Scalable Hosting", + "Supercharged Features to Build Faster", class_name="text-slate-12 text-3xl font-semibold text-center", ), rx.el.p( - "Compare features across plans.", + "Premium Features to help you get the most out of Reflex", class_name="text-slate-9 text-2xl font-semibold text-center", ), class_name="flex items-center justify-between text-slate-11 flex-col py-[5rem] 2xl:border-x border-slate-4 max-w-[64.19rem] mx-auto w-full", ) +def table_body_oss() -> rx.Component: + return rx.table.root( + rx.table.header( + create_table_row_header("Pricing"), + class_name="relative", + ), + create_table_body( + *[create_table_row(row) for row in PRICE_SECTION], + ), + rx.table.header( + create_table_row_header("AI"), + class_name="relative", + ), + create_table_body( + *[create_table_row(row) for row in AI_TEXT_SECTION], + *[ + create_checkmark_row(feature, checks) + for feature, *checks in AI_BOOLEAN_SECTION + ], + ), + rx.table.header( + create_table_row_header("FRAMEWORK"), + class_name="relative", + ), + create_table_body( + *[ + create_checkmark_row(feature, checks) + for feature, *checks in FRAMEWORK_SECTION + ], + ), + create_table_body( + *[create_table_row(row) for row in ASTERIX_SECTION], + ), + class_name="w-full overflow-x-auto max-w-[69.125rem] -mt-[2rem]", + ) + -def header_oss() -> rx.Component: + +def header_hosting() -> rx.Component: return rx.box( rx.el.h3( - "Supercharged Features to Build Faster", + "Secure and Scalable Hosting", class_name="text-slate-12 text-3xl font-semibold text-center", ), rx.el.p( - "Premium Features to help you get the most out of Reflex", + "Compare features across plans.", class_name="text-slate-9 text-2xl font-semibold text-center", ), class_name="flex items-center justify-between text-slate-11 flex-col py-[5rem] 2xl:border-x border-slate-4 max-w-[64.19rem] mx-auto w-full", ) - def table_body_hosting() -> rx.Component: return rx.table.root( rx.el.style(TABLE_STYLE), @@ -262,24 +327,6 @@ def table_body_hosting() -> rx.Component: ) -def table_body_oss() -> rx.Component: - return rx.table.root( - rx.table.header( - create_table_row_header("Framework"), - class_name="relative", - ), - create_table_body( - *[ - create_checkmark_row(feature, checks) - for feature, *checks in FRAMEWORK_SECTION - ], - *[create_table_row(row) for row in REFLEX_BRANDING_SECTION], - ), - create_table_body( - *[create_table_row(row) for row in ASTERIX_SECTION], - ), - class_name="w-full overflow-x-auto max-w-[69.125rem] -mt-[2rem]", - ) def comparison_table_hosting() -> rx.Component: @@ -290,7 +337,7 @@ def comparison_table_hosting() -> rx.Component: ) -def comparison_table_oss() -> rx.Component: +def comparison_table_ai_and_oss() -> rx.Component: return rx.box( header_oss(), table_body_oss(),