From 9d78dad91b403e2ab583a3bbf8e17868ffaf3929 Mon Sep 17 00:00:00 2001 From: Bianca Yang Date: Thu, 29 Feb 2024 11:44:35 -0800 Subject: [PATCH 01/49] wip --- cypress/e2e/onboarding.cy.ts | 93 +++++++++++++++---- .../onboarding/OnboardingBillingStep.tsx | 6 +- .../src/scenes/onboarding/OnboardingStep.tsx | 1 + frontend/src/scenes/onboarding/sdks/SDKs.tsx | 1 + frontend/src/scenes/userLogic.ts | 3 + 5 files changed, 84 insertions(+), 20 deletions(-) diff --git a/cypress/e2e/onboarding.cy.ts b/cypress/e2e/onboarding.cy.ts index c6e44e3d59331..ded7233ba4457 100644 --- a/cypress/e2e/onboarding.cy.ts +++ b/cypress/e2e/onboarding.cy.ts @@ -3,7 +3,7 @@ import { decideResponse } from '../fixtures/api/decide' describe('Onboarding', () => { beforeEach(() => { - cy.intercept('**/decide/*', (req) => + cy.intercept('https://app.posthog.com/decide/*', (req) => req.reply( decideResponse({ 'product-intro-pages': 'test', @@ -12,31 +12,86 @@ describe('Onboarding', () => { ) }) - it('Navigate between /products to /onboarding to a product intro page', () => { - cy.visit('/products') + // it('Navigate between /products to /onboarding to a product intro page', () => { + // cy.visit('/products') - // Get started on product analytics onboarding - cy.get('[data-attr=product_analytics-onboarding-card]').click() + // Get started on product analytics onboarding + // cy.get('[data-attr=product_analytics-onboarding-card]').click() - // Confirm product intro is not included as the first step in the upper right breadcrumbs - cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').should('not.contain', 'Product Intro') + // // Confirm product intro is not included as the first step in the upper right breadcrumbs + // cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').should('not.contain', 'Product Intro') - // Navigate to the product intro page by clicking the left side bar - cy.get('[data-attr=menu-item-replay').click() + // // Navigate to the product intro page by clicking the left side bar + // cy.get('[data-attr=menu-item-replay').click() - // Confirm we're on the product_intro page - cy.get('[data-attr=top-bar-name] > span').contains('Product intro') + // // Confirm we're on the product_intro page + // cy.get('[data-attr=top-bar-name] > span').contains('Product intro') - // Go back to /products - cy.visit('/products') + // // Go back to /products + // cy.visit('/products') - // Again get started on product analytics onboarding - cy.get('[data-attr=product_analytics-onboarding-card]').click() + // // Again get started on product analytics onboarding + // cy.get('[data-attr=product_analytics-get-started-button]').click() - // Navigate to the product intro page by changing the url - cy.visit(urls.onboarding('session_replay', 'product_intro')) + // // Navigate to the product intro page by changing the url + // cy.visit(urls.onboarding('session_replay', 'product_intro')) - // Confirm we're on the product intro page - cy.get('[data-attr=top-bar-name] > span').contains('Product intro') + // // Confirm we're on the product intro page + // cy.get('[data-attr=top-bar-name] > span').contains('Product intro') + // }) + + // it('Step through PA onboarding', () => { + // cy.visit('/products') + + // Get started on product analytics onboarding + // cy.get('[data-attr=product_analytics-onboarding-card]').click() + + // // Installation should be complete + // cy.get('svg.LemonIcon.text-success').should('exist') + // cy.get('svg.LemonIcon.text-success').parent().should('contain', 'Installation complete') + + // // Continue to configuration step + // cy.get('[data-attr=sdk-continue]').click() + + // // Confirm the appropriate breadcrumb is highlighted + // cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(3) > * span').should('contain', 'Configure') + // cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(3) > * span').should('not.have.css', 'text-muted') + + // // Continue to plans + // cy.get('[data-attr=onboarding-continue]').click() + + // // Click show plans + // cy.get('[data-attr=show-plans').click() + + // // Verify pricing table visible + // cy.get('.BillingHero').should('be.visible') + // cy.get('table.PlanComparison').should('be.visible') + + // // Continue + // cy.get('[data-attr=onboarding-continue]').click() + + // // Click back to Install step + // cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').click() + + // // Continue through to finish + // cy.get('[data-attr=sdk-continue]').click() + // cy.get('[data-attr=onboarding-continue]').click() + // cy.get('[data-attr=onboarding-continue]').click() + // cy.get('[data-attr=onboarding-continue]').click() + + // // Confirm we're on the insights list page + // cy.url().should('eq', 'https://localhost:8080/project/1/insights') + // }) + + it('Step through SR onboarding', () => { + cy.visit('/replay') }) + + // it('Step through FF onboarding', () => {}) + + // it('Step through Surveys onboarding', () => {}) + + // it('Click through product intro pages', () => {}) + + // it('Product intro pages to onboarding flow', () => {}) }) diff --git a/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx b/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx index be78629f06f26..23087dc6010d2 100644 --- a/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx +++ b/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx @@ -71,7 +71,11 @@ export const OnboardingBillingStep = ({ - setShowPlanComp(!showPlanComp)}> + setShowPlanComp(!showPlanComp)} + > {showPlanComp ? 'Hide' : 'Show'} plans {currentPlan?.initial_billing_limit && ( diff --git a/frontend/src/scenes/onboarding/OnboardingStep.tsx b/frontend/src/scenes/onboarding/OnboardingStep.tsx index 9a380cc5f678a..205b6a00de575 100644 --- a/frontend/src/scenes/onboarding/OnboardingStep.tsx +++ b/frontend/src/scenes/onboarding/OnboardingStep.tsx @@ -107,6 +107,7 @@ export const OnboardingStep = ({ { continueAction && continueAction() !hasNextStep ? completeOnboarding() : goToNextStep() diff --git a/frontend/src/scenes/onboarding/sdks/SDKs.tsx b/frontend/src/scenes/onboarding/sdks/SDKs.tsx index 89b424fd9bae7..f9e6c048777ab 100644 --- a/frontend/src/scenes/onboarding/sdks/SDKs.tsx +++ b/frontend/src/scenes/onboarding/sdks/SDKs.tsx @@ -86,6 +86,7 @@ export function SDKs({ ) : ( <> : null} type="primary" status="alt" diff --git a/frontend/src/scenes/userLogic.ts b/frontend/src/scenes/userLogic.ts index 1dfd3390dc87f..c2f2896405657 100644 --- a/frontend/src/scenes/userLogic.ts +++ b/frontend/src/scenes/userLogic.ts @@ -204,6 +204,9 @@ export const userLogic = kea([ const availableProductFeatures = user?.organization?.available_product_features if (availableProductFeatures && availableProductFeatures.length > 0) { const availableFeature = availableProductFeatures.find((obj) => obj.key === feature) + if (feature == AvailableFeature.TWOFA_ENFORCEMENT) { + console.log(availableProductFeatures) + } return availableFeature ? currentUsage ? availableFeature?.limit From a6763a6253cb0a348b40576b31177afabcef3a3b Mon Sep 17 00:00:00 2001 From: Bianca Yang Date: Fri, 1 Mar 2024 18:00:42 -0800 Subject: [PATCH 02/49] iteration 1 --- cypress/e2e/onboarding.cy.ts | 170 ++++++++++++------ .../OnboardingProductIntroduction.tsx | 2 +- .../androidRecordingPromptBannerLogic.ts | 99 ++++++++++ 3 files changed, 214 insertions(+), 57 deletions(-) create mode 100644 frontend/src/scenes/session-recordings/mobile-replay/androidRecordingPromptBannerLogic.ts diff --git a/cypress/e2e/onboarding.cy.ts b/cypress/e2e/onboarding.cy.ts index ded7233ba4457..fd183986c2ee8 100644 --- a/cypress/e2e/onboarding.cy.ts +++ b/cypress/e2e/onboarding.cy.ts @@ -1,8 +1,14 @@ -import { urls } from 'scenes/urls' import { decideResponse } from '../fixtures/api/decide' describe('Onboarding', () => { beforeEach(() => { + cy.intercept('https://us.i.posthog.com/decide/*', (req) => + req.reply( + decideResponse({ + 'product-intro-pages': 'test', + }) + ) + ) cy.intercept('https://app.posthog.com/decide/*', (req) => req.reply( decideResponse({ @@ -12,86 +18,138 @@ describe('Onboarding', () => { ) }) - // it('Navigate between /products to /onboarding to a product intro page', () => { - // cy.visit('/products') + it('Navigate between /products to /onboarding to a product intro page', () => { + cy.visit('/products') + + // Get started on product analytics onboarding + cy.get('[data-attr=product_analytics-onboarding-card]').click() + + // Confirm product intro is not included as the first step in the upper right breadcrumbs + cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').should('not.contain', 'Product Intro') - // Get started on product analytics onboarding - // cy.get('[data-attr=product_analytics-onboarding-card]').click() + // Navigate to the product intro page by clicking the left side bar + cy.get('[data-attr=menu-item-replay').click() - // // Confirm product intro is not included as the first step in the upper right breadcrumbs - // cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').should('not.contain', 'Product Intro') + // Confirm we're on the product_intro page + cy.get('[data-attr=top-bar-name] > span').contains('Product intro') - // // Navigate to the product intro page by clicking the left side bar - // cy.get('[data-attr=menu-item-replay').click() + // Go back to /products + cy.visit('/products') - // // Confirm we're on the product_intro page - // cy.get('[data-attr=top-bar-name] > span').contains('Product intro') + // Again get started on product analytics onboarding + cy.get('[data-attr=product_analytics-get-started-button]').click() - // // Go back to /products - // cy.visit('/products') + // Navigate to the product intro page by changing the url + cy.visit(urls.onboarding('session_replay', 'product_intro')) - // // Again get started on product analytics onboarding - // cy.get('[data-attr=product_analytics-get-started-button]').click() + // Confirm we're on the product intro page + cy.get('[data-attr=top-bar-name] > span').contains('Product intro') + }) + + it('Step through PA onboarding', () => { + cy.visit('/products') - // // Navigate to the product intro page by changing the url - // cy.visit(urls.onboarding('session_replay', 'product_intro')) + // Get started on product analytics onboarding + cy.get('[data-attr=product_analytics-onboarding-card]').click() - // // Confirm we're on the product intro page - // cy.get('[data-attr=top-bar-name] > span').contains('Product intro') - // }) + // Installation should be complete + cy.get('svg.LemonIcon.text-success').should('exist') + cy.get('svg.LemonIcon.text-success').parent().should('contain', 'Installation complete') - // it('Step through PA onboarding', () => { - // cy.visit('/products') + // Continue to configuration step + cy.get('[data-attr=sdk-continue]').click() - // Get started on product analytics onboarding - // cy.get('[data-attr=product_analytics-onboarding-card]').click() + // Confirm the appropriate breadcrumb is highlighted + cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(3) > * span').should('contain', 'Configure') + cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(3) > * span').should('not.have.css', 'text-muted') - // // Installation should be complete - // cy.get('svg.LemonIcon.text-success').should('exist') - // cy.get('svg.LemonIcon.text-success').parent().should('contain', 'Installation complete') + // Continue to plans + cy.get('[data-attr=onboarding-continue]').click() - // // Continue to configuration step - // cy.get('[data-attr=sdk-continue]').click() + // Click show plans + cy.get('[data-attr=show-plans]').click() - // // Confirm the appropriate breadcrumb is highlighted - // cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(3) > * span').should('contain', 'Configure') - // cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(3) > * span').should('not.have.css', 'text-muted') + // Verify pricing table visible + cy.get('.BillingHero').should('be.visible') + cy.get('table.PlanComparison').should('be.visible') - // // Continue to plans - // cy.get('[data-attr=onboarding-continue]').click() + // Continue + cy.get('[data-attr=onboarding-continue]').click() - // // Click show plans - // cy.get('[data-attr=show-plans').click() + // Click back to Install step + cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').click() - // // Verify pricing table visible - // cy.get('.BillingHero').should('be.visible') - // cy.get('table.PlanComparison').should('be.visible') + // Continue through to finish + cy.get('[data-attr=sdk-continue]').click() + cy.get('[data-attr=onboarding-continue]').click() + cy.get('[data-attr=onboarding-continue]').click() + cy.get('[data-attr=onboarding-continue]').click() - // // Continue - // cy.get('[data-attr=onboarding-continue]').click() + // Confirm we're on the insights list page + cy.url().should('contain', 'http://localhost:8080/project/1/insights') - // // Click back to Install step - // cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').click() + cy.visit('/onboarding/product_analytics?step=product_intro') - // // Continue through to finish - // cy.get('[data-attr=sdk-continue]').click() - // cy.get('[data-attr=onboarding-continue]').click() - // cy.get('[data-attr=onboarding-continue]').click() - // cy.get('[data-attr=onboarding-continue]').click() + // Should see both an option to skip onboarding and an option to see the sdk instructions + cy.get('[data-attr=skip-onboarding]').should('be.visible') + cy.get('[data-attr=start-onboarding-sdk]').should('be.visible') - // // Confirm we're on the insights list page - // cy.url().should('eq', 'https://localhost:8080/project/1/insights') - // }) + cy.get('[data-attr=skip-onboarding]').first().click() + cy.url().should('contain', 'http://localhost:8080/project/1/insights') + + cy.visit('/onboarding/product_analytics?step=product_intro') + cy.get('[data-attr=start-onboarding-sdk]').first().click() + cy.url().should('contain', 'http://localhost:8080/project/1/onboarding/product_analytics?step=install') + }) it('Step through SR onboarding', () => { - cy.visit('/replay') + cy.get('[data-attr=menu-item-replay]').click() + cy.get('[data-attr=start-onboarding]').first().click() + // Installation should be complete + cy.get('svg.LemonIcon.text-success').should('exist') + cy.get('svg.LemonIcon.text-success').parent().should('contain', 'Installation complete') + // Continue to configuration step + cy.get('[data-attr=sdk-continue]').click() + // Continue to plans + cy.get('[data-attr=onboarding-continue]').click() + // Go back to intro page + cy.visit('/onboarding/session_replay?step=product_intro') + // Continue through to finish + cy.get('[data-attr=start-onboarding]').first().click() + cy.get('[data-attr=sdk-continue]').click() + cy.get('[data-attr=onboarding-continue]').click() + cy.get('[data-attr=onboarding-continue]').click() + // Confirm we're on the recordings list page + cy.url().should('eq', 'https://localhost:8080/project/1/replay/recent') + + cy.visit('/onboarding/session_replay?step=product_intro') + cy.get('[data-attr=skip-onboarding]').should('be.visible') + cy.get('[data-attr=start-onboarding-sdk]').should('not.exist') }) - // it('Step through FF onboarding', () => {}) + it('Step through FF onboarding', () => { + cy.visit('/onboarding/feature_flags?step=product_intro') + cy.get('[data-attr=menu-item-featureflags]').click() + cy.get('[data-attr=start-onboarding-sdk]').first().click() + cy.get('[data-attr=sdk-continue]').click() - // it('Step through Surveys onboarding', () => {}) + // Confirm the appropriate breadcrumb is highlighted + cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(5) > * span').should('contain', 'Invite teammates') - // it('Click through product intro pages', () => {}) + cy.visit('/onboarding/feature_flags?step=product_intro') - // it('Product intro pages to onboarding flow', () => {}) + cy.get('[data-attr=skip-onboarding]').should('be.visible') + cy.get('[data-attr=start-onboarding-sdk]').should('be.visible') + + cy.get('[data-attr=skip-onboarding]').click() + cy.url().should('contain', 'feature_flags/new') + }) + + it('Step through Surveys onboarding', () => { + cy.visit('/onboarding/surveys?step=product_intro') + cy.get('[data-attr=skip-onboarding]').should('be.visible') + cy.get('[data-attr=start-onboarding-sdk]').should('not.exist') + cy.get('[data-attr=skip-onboarding]').first().click() + cy.url().should('contain', 'survey_templates') + }) }) diff --git a/frontend/src/scenes/onboarding/OnboardingProductIntroduction.tsx b/frontend/src/scenes/onboarding/OnboardingProductIntroduction.tsx index 03eaec32cd9b8..76c5fef0d539f 100644 --- a/frontend/src/scenes/onboarding/OnboardingProductIntroduction.tsx +++ b/frontend/src/scenes/onboarding/OnboardingProductIntroduction.tsx @@ -95,7 +95,7 @@ const GetStartedButton = ({ product }: { product: BillingProductV2Type }): JSX.E {(!hasSnippetEvents || multiInstallProducts.includes(product.type as ProductKey)) && ( { setTeamPropertiesForProduct(product.type as ProductKey) reportOnboardingProductSelected( diff --git a/frontend/src/scenes/session-recordings/mobile-replay/androidRecordingPromptBannerLogic.ts b/frontend/src/scenes/session-recordings/mobile-replay/androidRecordingPromptBannerLogic.ts new file mode 100644 index 0000000000000..038963b9a277a --- /dev/null +++ b/frontend/src/scenes/session-recordings/mobile-replay/androidRecordingPromptBannerLogic.ts @@ -0,0 +1,99 @@ +import { afterMount, kea, key, path, props, reducers, selectors } from 'kea' +import { loaders } from 'kea-loaders' +import { subscriptions } from 'kea-subscriptions' +import api from 'lib/api' +import posthog from 'posthog-js' + +import { HogQLQuery, NodeKind } from '~/queries/schema' +import { hogql } from '~/queries/utils' + +import type { androidRecordingPromptBannerLogicType } from './androidRecordingPromptBannerLogicType' + +export interface AndroidRecordingPromptBannerLogicProps { + context: 'home' | 'events' | 'replay' +} + +export type AndroidEventCount = { + version: string + count?: number +} + +export const androidRecordingPromptBannerLogic = kea([ + path(['scenes', 'session-recordings', 'SessionRecordings']), + key((props) => props.context), + props({} as AndroidRecordingPromptBannerLogicProps), + loaders(({ values }) => ({ + androidVersions: [ + [] as AndroidEventCount[], + { + loadAndroidLibVersions: async () => { + if (values.androidVersions && values.androidVersions.length > 0) { + // if we know they ever had android events, don't check again + return values.androidVersions + } + + const query: HogQLQuery = { + kind: NodeKind.HogQLQuery, + query: hogql`SELECT properties.$lib_version AS lib_version, + max(timestamp) AS latest_timestamp, + count(lib_version) as count + FROM events + WHERE timestamp >= now() - INTERVAL 30 DAY + AND timestamp <= now() + AND properties.$lib = 'posthog-android' + GROUP BY lib_version + ORDER BY latest_timestamp DESC + limit 10`, + } + + const res = await api.query(query) + + return ( + res.results?.map((x) => ({ + version: x[0], + count: x[2], + })) ?? [] + ) + }, + }, + ], + })), + reducers({ + androidVersions: [ + // as a reducer only so we can persist it + [] as AndroidEventCount[], + { persist: true }, + { + loadAndroidLibVersionsSuccess: (_, { androidVersions }) => { + return androidVersions ?? [] + }, + }, + ], + }), + + selectors({ + shouldPromptUser: [ + (s) => [s.androidVersions], + (androidVersions) => { + return (androidVersions?.length || 0) > 0 + }, + ], + }), + + subscriptions(({ values, props }) => ({ + shouldPromptUser: (value, oldvalue) => { + // not a falsy check since we don't care when oldvalue is undefined + // we don't need multiple copies of this event so try to only emit it when `shouldPromptUser` changes to true + if (value === true && oldvalue === false) { + posthog.capture('visitor has android events', { + androidVersions: values.androidVersions, + scene: props.context, + }) + } + }, + })), + + afterMount(({ actions }) => { + actions.loadAndroidLibVersions() + }), +]) From bec0c8b01bfaec2f65061f6b374854fd6422d6f1 Mon Sep 17 00:00:00 2001 From: Bianca Yang Date: Fri, 1 Mar 2024 18:13:58 -0800 Subject: [PATCH 03/49] some small fixes --- cypress/e2e/onboarding.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cypress/e2e/onboarding.cy.ts b/cypress/e2e/onboarding.cy.ts index fd183986c2ee8..cfe06eefe55ba 100644 --- a/cypress/e2e/onboarding.cy.ts +++ b/cypress/e2e/onboarding.cy.ts @@ -1,3 +1,4 @@ +import { urls } from 'scenes/urls' import { decideResponse } from '../fixtures/api/decide' describe('Onboarding', () => { @@ -141,7 +142,7 @@ describe('Onboarding', () => { cy.get('[data-attr=skip-onboarding]').should('be.visible') cy.get('[data-attr=start-onboarding-sdk]').should('be.visible') - cy.get('[data-attr=skip-onboarding]').click() + cy.get('[data-attr=skip-onboarding]').first().click() cy.url().should('contain', 'feature_flags/new') }) From 6bb8c5c5d834234c8cbf0588964758608a57745e Mon Sep 17 00:00:00 2001 From: Bianca Yang Date: Thu, 7 Mar 2024 16:07:41 -0800 Subject: [PATCH 04/49] update --- cypress/e2e/onboarding.cy.ts | 93 +- .../billing-v2/billing-v2-unsubscribed.json | 871 ++++- .../fixtures/api/billing-v2/billing-v2.json | 3159 +++++++++++++---- frontend/src/mocks/fixtures/_billing_v2.tsx | 1100 ++++-- .../src/scenes/billing/PlanComparison.tsx | 1 + .../onboarding/OnboardingBillingStep.tsx | 1 + .../src/scenes/onboarding/OnboardingStep.tsx | 1 + frontend/src/scenes/products/Products.tsx | 1 + frontend/src/types.ts | 12 +- 9 files changed, 3985 insertions(+), 1254 deletions(-) diff --git a/cypress/e2e/onboarding.cy.ts b/cypress/e2e/onboarding.cy.ts index cfe06eefe55ba..931164ee39f47 100644 --- a/cypress/e2e/onboarding.cy.ts +++ b/cypress/e2e/onboarding.cy.ts @@ -10,13 +10,8 @@ describe('Onboarding', () => { }) ) ) - cy.intercept('https://app.posthog.com/decide/*', (req) => - req.reply( - decideResponse({ - 'product-intro-pages': 'test', - }) - ) - ) + + cy.intercept('/api/billing-v2/', { fixture: 'api/billing-v2/billing-v2-unsubscribed.json' }) }) it('Navigate between /products to /onboarding to a product intro page', () => { @@ -28,23 +23,11 @@ describe('Onboarding', () => { // Confirm product intro is not included as the first step in the upper right breadcrumbs cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').should('not.contain', 'Product Intro') - // Navigate to the product intro page by clicking the left side bar - cy.get('[data-attr=menu-item-replay').click() + // Navigate to the product intro page + cy.visit('/onboarding/session_replay?step=product_intro') // Confirm we're on the product_intro page cy.get('[data-attr=top-bar-name] > span').contains('Product intro') - - // Go back to /products - cy.visit('/products') - - // Again get started on product analytics onboarding - cy.get('[data-attr=product_analytics-get-started-button]').click() - - // Navigate to the product intro page by changing the url - cy.visit(urls.onboarding('session_replay', 'product_intro')) - - // Confirm we're on the product intro page - cy.get('[data-attr=top-bar-name] > span').contains('Product intro') }) it('Step through PA onboarding', () => { @@ -67,15 +50,16 @@ describe('Onboarding', () => { // Continue to plans cy.get('[data-attr=onboarding-continue]').click() - // Click show plans - cy.get('[data-attr=show-plans]').click() - // Verify pricing table visible cy.get('.BillingHero').should('be.visible') cy.get('table.PlanComparison').should('be.visible') + // Confirm buttons on pricing comparison + cy.get('[data-attr=upgrade-Paid] .LemonButton__content').should('have.text', 'Subscribe') + cy.get('[data-attr=upgrade-Free] .LemonButton__content').should('have.text', 'Current plan') + // Continue - cy.get('[data-attr=onboarding-continue]').click() + cy.get('[data-attr=onboarding-skip-button]').click() // Click back to Install step cy.get('[data-attr=onboarding-breadcrumbs] > :first-child > * span').click() @@ -83,7 +67,7 @@ describe('Onboarding', () => { // Continue through to finish cy.get('[data-attr=sdk-continue]').click() cy.get('[data-attr=onboarding-continue]').click() - cy.get('[data-attr=onboarding-continue]').click() + cy.get('[data-attr=onboarding-skip-button]').click() cy.get('[data-attr=onboarding-continue]').click() // Confirm we're on the insights list page @@ -101,11 +85,16 @@ describe('Onboarding', () => { cy.visit('/onboarding/product_analytics?step=product_intro') cy.get('[data-attr=start-onboarding-sdk]').first().click() cy.url().should('contain', 'http://localhost:8080/project/1/onboarding/product_analytics?step=install') + + cy.visit('/products') + cy.get('[data-attr=return-to-product_analytics] > svg').click() + cy.url().should('contain', 'http://localhost:8080/project/1/insights') }) it('Step through SR onboarding', () => { - cy.get('[data-attr=menu-item-replay]').click() - cy.get('[data-attr=start-onboarding]').first().click() + cy.visit('/products') + cy.get('[data-attr=session_replay-onboarding-card]').click() + // Installation should be complete cy.get('svg.LemonIcon.text-success').should('exist') cy.get('svg.LemonIcon.text-success').parent().should('contain', 'Installation complete') @@ -113,16 +102,17 @@ describe('Onboarding', () => { cy.get('[data-attr=sdk-continue]').click() // Continue to plans cy.get('[data-attr=onboarding-continue]').click() - // Go back to intro page - cy.visit('/onboarding/session_replay?step=product_intro') + // Verify pricing table visible + cy.get('.BillingHero').should('be.visible') + cy.get('table.PlanComparison').should('be.visible') + // Confirm buttons on pricing comparison + cy.get('[data-attr=upgrade-Paid] .LemonButton__content').should('have.text', 'Subscribe') + cy.get('[data-attr=upgrade-Free] .LemonButton__content').should('have.text', 'Current plan') // Continue through to finish - cy.get('[data-attr=start-onboarding]').first().click() - cy.get('[data-attr=sdk-continue]').click() - cy.get('[data-attr=onboarding-continue]').click() + cy.get('[data-attr=onboarding-skip-button]').click() cy.get('[data-attr=onboarding-continue]').click() // Confirm we're on the recordings list page - cy.url().should('eq', 'https://localhost:8080/project/1/replay/recent') - + cy.url().should('eq', 'http://localhost:8080/project/1/replay/recent') cy.visit('/onboarding/session_replay?step=product_intro') cy.get('[data-attr=skip-onboarding]').should('be.visible') cy.get('[data-attr=start-onboarding-sdk]').should('not.exist') @@ -130,12 +120,17 @@ describe('Onboarding', () => { it('Step through FF onboarding', () => { cy.visit('/onboarding/feature_flags?step=product_intro') - cy.get('[data-attr=menu-item-featureflags]').click() cy.get('[data-attr=start-onboarding-sdk]').first().click() cy.get('[data-attr=sdk-continue]').click() // Confirm the appropriate breadcrumb is highlighted - cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(5) > * span').should('contain', 'Invite teammates') + cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(5) > * span').should('contain', 'Plans') + cy.get('[data-attr=onboarding-breadcrumbs] > :nth-child(3) > * span').should('not.have.css', 'text-muted') + + cy.get('[data-attr=onboarding-skip-button]').click() + cy.get('[data-attr=onboarding-continue]').click() + + cy.url().should('contain', '/feature_flags') cy.visit('/onboarding/feature_flags?step=product_intro') @@ -143,7 +138,6 @@ describe('Onboarding', () => { cy.get('[data-attr=start-onboarding-sdk]').should('be.visible') cy.get('[data-attr=skip-onboarding]').first().click() - cy.url().should('contain', 'feature_flags/new') }) it('Step through Surveys onboarding', () => { @@ -152,5 +146,28 @@ describe('Onboarding', () => { cy.get('[data-attr=start-onboarding-sdk]').should('not.exist') cy.get('[data-attr=skip-onboarding]').first().click() cy.url().should('contain', 'survey_templates') + + cy.visit('/products') + cy.get('[data-attr=surveys-onboarding-card]').click() + // Installation should be complete + cy.get('svg.LemonIcon.text-success').should('exist') + cy.get('svg.LemonIcon.text-success').parent().should('contain', 'Installation complete') + + // Continue to configuration step + cy.get('[data-attr=sdk-continue]').click() + + // Verify pricing table visible + cy.get('.BillingHero').should('be.visible') + cy.get('table.PlanComparison').should('be.visible') + + // Confirm buttons on pricing comparison + cy.get('[data-attr=upgrade-Paid] .LemonButton__content').should('have.text', 'Subscribe') + cy.get('[data-attr=upgrade-Free] .LemonButton__content').should('have.text', 'Current plan') + + // Continue + cy.get('[data-attr=onboarding-skip-button]').click() + cy.get('[data-attr=onboarding-continue]').click() + + cy.url().should('contain', '/survey_templates') }) }) diff --git a/cypress/fixtures/api/billing-v2/billing-v2-unsubscribed.json b/cypress/fixtures/api/billing-v2/billing-v2-unsubscribed.json index 60aed5c9693c4..32e1268032d34 100644 --- a/cypress/fixtures/api/billing-v2/billing-v2-unsubscribed.json +++ b/cypress/fixtures/api/billing-v2/billing-v2-unsubscribed.json @@ -14,6 +14,7 @@ "discord_integration", "apps", "boolean_flags", + "multivariate_flags", "persist_flags_cross_authentication", "feature_flag_payloads", "multiple_release_conditions", @@ -21,6 +22,10 @@ "targeting_by_group", "local_evaluation_and_bootstrapping", "flag_usage_stats", + "experimentation", + "funnel_experiments", + "secondary_metrics", + "statistical_analysis", "feature_flags_data_retention", "console_logs", "recordings_performance", @@ -47,17 +52,17 @@ "api_access", "social_sso", "community_support", - "terms_and_conditions" + "2fa" ], "license": { - "plan": "cloud" + "plan": "dev" }, - "customer_id": null, + "customer_id": "cus_Pg7PIL8MsKi6bx", "deactivated": false, "has_active_subscription": false, "billing_period": { - "current_period_start": "2024-02-06T19:37:14.843Z", - "current_period_end": "2024-03-07T19:37:14.843Z", + "current_period_start": "2024-03-04T23:43:35.772Z", + "current_period_end": "2024-04-03T23:43:35.772Z", "interval": "month" }, "available_product_features": [ @@ -173,6 +178,14 @@ "limit": null, "note": null }, + { + "key": "multivariate_flags", + "name": "Multivariate feature flags & experiments", + "description": "Create three or more variants of a feature flag to test or release different versions of a feature.", + "unit": null, + "limit": null, + "note": null + }, { "key": "persist_flags_cross_authentication", "name": "Persist flags across authentication", @@ -229,6 +242,38 @@ "limit": null, "note": null }, + { + "key": "experimentation", + "name": "A/B testing", + "description": "Test changes to your product and evaluate the impacts those changes make.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "funnel_experiments", + "name": "Funnel & trend experiments", + "description": "Measure the impact of a change on a aggregate values or a series of events, like a signup flow.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "secondary_metrics", + "name": "Secondary experiment metrics", + "description": "Track additional metrics to see how your experiment affects other parts of your app or different flows.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "statistical_analysis", + "name": "Statistical analysis", + "description": "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", + "unit": null, + "limit": null, + "note": null + }, { "key": "feature_flags_data_retention", "name": "Data retention", @@ -438,12 +483,12 @@ "note": null }, { - "key": "terms_and_conditions", - "name": "Terms and conditions", - "description": "Terms and conditions", + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", "unit": null, "limit": null, - "note": "Standard" + "note": null } ], "current_total_amount_usd": null, @@ -464,7 +509,7 @@ { "plan_key": "free-20230117", "product_key": "product_analytics", - "name": "Product analytics", + "name": "Free", "description": "A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.", "image_url": "https://posthog.com/images/products/product-analytics/product-analytics.png", "docs_url": "https://posthog.com/docs/product-analytics", @@ -515,12 +560,14 @@ ], "tiers": null, "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { "plan_key": "paid-20240111", "product_key": "product_analytics", - "name": "Product analytics", + "name": "Paid", "description": "A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.", "image_url": "https://posthog.com/images/products/product-analytics/product-analytics.png", "docs_url": "https://posthog.com/docs/product-analytics", @@ -576,30 +623,6 @@ "limit": null, "note": null }, - { - "key": "dashboard_permissioning", - "name": "Dashboard permissions", - "description": "Restrict access to dashboards within the organization to only those who need it.", - "unit": null, - "limit": null, - "note": null - }, - { - "key": "dashboard_collaboration", - "name": "Tags & text cards", - "description": "Keep organized by adding tags to your dashboards, cohorts and more. Add text cards and descriptions to your dashboards to provide context to your team.", - "unit": null, - "limit": null, - "note": null - }, - { - "key": "ingestion_taxonomy", - "name": "Ingestion taxonomy", - "description": "Ingestion taxonomy", - "unit": null, - "limit": null, - "note": null - }, { "key": "correlation_analysis", "name": "Correlation analysis", @@ -608,14 +631,6 @@ "limit": null, "note": null }, - { - "key": "tagging", - "name": "Dashboard tags", - "description": "Organize dashboards with tags.", - "unit": null, - "limit": null, - "note": null - }, { "key": "behavioral_cohort_filtering", "name": "Lifecycle", @@ -645,7 +660,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000248", + "unit_amount_usd": "0.00031", "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -654,7 +669,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000104", + "unit_amount_usd": "0.00013", "up_to": 15000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -663,7 +678,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000655", + "unit_amount_usd": "0.0000819", "up_to": 50000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -672,7 +687,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000364", + "unit_amount_usd": "0.0000455", "up_to": 100000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -681,7 +696,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000187", + "unit_amount_usd": "0.0000234", "up_to": 250000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -690,7 +705,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000042", + "unit_amount_usd": "0.0000052", "up_to": null, "current_amount_usd": "0.00", "current_usage": 0, @@ -699,7 +714,9 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], "type": "product_analytics", @@ -737,7 +754,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000071", + "unit_amount_usd": "0.0000708", "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -803,7 +820,7 @@ { "plan_key": "addon-20230509", "product_key": "group_analytics", - "name": "Group analytics", + "name": "Addon", "description": "Associate events with a group or entity - such as a company, community, or project. Analyze these events as if they were sent by that entity itself. Great for B2B, marketplaces, and more.", "image_url": "https://posthog.com/images/product/product-icons/group-analytics.svg", "docs_url": "https://posthog.com/docs/product-analytics/group-analytics", @@ -832,7 +849,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000071", + "unit_amount_usd": "0.0000708", "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -886,10 +903,12 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], - "contact_support": false + "contact_support": null }, { "name": "Data pipelines", @@ -911,7 +930,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000062", + "unit_amount_usd": "0.000248", "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -920,7 +939,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000026", + "unit_amount_usd": "0.000104", "up_to": 15000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -929,7 +948,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000164", + "unit_amount_usd": "0.0000655", "up_to": 50000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -938,7 +957,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000091", + "unit_amount_usd": "0.0000364", "up_to": 100000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -947,7 +966,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000047", + "unit_amount_usd": "0.0000187", "up_to": 250000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -956,7 +975,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000001", + "unit_amount_usd": "0.0000042", "up_to": null, "current_amount_usd": "0.00", "current_usage": 0, @@ -977,7 +996,7 @@ { "plan_key": "addon-20240111", "product_key": "data_pipelines", - "name": "Data pipelines", + "name": "Addon", "description": "Get your PostHog data into your data warehouse or other tools like BigQuery, Redshift, Customer.io, and more.", "image_url": null, "docs_url": "https://posthog.com/docs/cdp/batch-exports", @@ -1006,7 +1025,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000062", + "unit_amount_usd": "0.000248", "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -1015,7 +1034,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000026", + "unit_amount_usd": "0.000104", "up_to": 15000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -1024,7 +1043,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000164", + "unit_amount_usd": "0.0000655", "up_to": 50000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -1033,7 +1052,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000091", + "unit_amount_usd": "0.0000364", "up_to": 100000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -1042,7 +1061,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0000047", + "unit_amount_usd": "0.0000187", "up_to": 250000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -1051,7 +1070,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000001", + "unit_amount_usd": "0.0000042", "up_to": null, "current_amount_usd": "0.00", "current_usage": 0, @@ -1060,10 +1079,12 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], - "contact_support": false + "contact_support": null } ], "contact_support": false, @@ -1131,30 +1152,6 @@ "icon_key": "IconNotification", "type": "secondary" }, - { - "key": "dashboard_collaboration", - "name": "Tags & text cards", - "description": "Keep organized by adding tags to your dashboards, cohorts and more. Add text cards and descriptions to your dashboards to provide context to your team.", - "images": null, - "icon_key": null, - "type": null - }, - { - "key": "dashboard_permissioning", - "name": "Dashboard permissions", - "description": "Restrict access to dashboards within the organization to only those who need it.", - "images": null, - "icon_key": null, - "type": null - }, - { - "key": "ingestion_taxonomy", - "name": "Ingestion taxonomy", - "description": "Ingestion taxonomy", - "images": null, - "icon_key": null, - "type": null - }, { "key": "paths_advanced", "name": "Advanced paths", @@ -1174,14 +1171,6 @@ "icon_key": null, "type": "primary" }, - { - "key": "tagging", - "name": "Dashboard tags", - "description": "Organize dashboards with tags.", - "images": null, - "icon_key": null, - "type": null - }, { "key": "behavioral_cohort_filtering", "name": "Lifecycle", @@ -1256,7 +1245,7 @@ { "plan_key": "free-20231218", "product_key": "session_replay", - "name": "Session replay", + "name": "Free", "description": "Session replay helps you diagnose issues and understand user behavior in your product or website.", "image_url": "https://posthog.com/images/products/session-replay/session-replay.png", "docs_url": "https://posthog.com/docs/session-replay", @@ -1379,12 +1368,14 @@ ], "tiers": null, "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { "plan_key": "paid-20231218", "product_key": "session_replay", - "name": "Session replay", + "name": "Paid", "description": "Session replay helps you diagnose issues and understand user behavior in your product or website.", "image_url": "https://posthog.com/images/products/session-replay/session-replay.png", "docs_url": "https://posthog.com/docs/session-replay", @@ -1570,7 +1561,9 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], "type": "session_replay", @@ -1753,7 +1746,7 @@ { "plan_key": "free-20230117", "product_key": "feature_flags", - "name": "Feature flags & A/B testing", + "name": "Free", "description": "Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.", "image_url": "https://posthog.com/images/products/feature-flags/feature-flags.png", "docs_url": "https://posthog.com/docs/feature-flags", @@ -1769,6 +1762,14 @@ "limit": null, "note": null }, + { + "key": "multivariate_flags", + "name": "Multivariate feature flags & experiments", + "description": "Create three or more variants of a feature flag to test or release different versions of a feature.", + "unit": null, + "limit": null, + "note": null + }, { "key": "persist_flags_cross_authentication", "name": "Persist flags across authentication", @@ -1825,6 +1826,38 @@ "limit": null, "note": null }, + { + "key": "experimentation", + "name": "A/B testing", + "description": "Test changes to your product and evaluate the impacts those changes make.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "funnel_experiments", + "name": "Funnel & trend experiments", + "description": "Measure the impact of a change on a aggregate values or a series of events, like a signup flow.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "secondary_metrics", + "name": "Secondary experiment metrics", + "description": "Track additional metrics to see how your experiment affects other parts of your app or different flows.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "statistical_analysis", + "name": "Statistical analysis", + "description": "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", + "unit": null, + "limit": null, + "note": null + }, { "key": "feature_flags_data_retention", "name": "Data retention", @@ -1836,12 +1869,14 @@ ], "tiers": null, "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { "plan_key": "paid-20230623", "product_key": "feature_flags", - "name": "Feature flags & A/B testing", + "name": "Paid", "description": "Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.", "image_url": "https://posthog.com/images/products/feature-flags/feature-flags.png", "docs_url": "https://posthog.com/docs/feature-flags", @@ -1929,14 +1964,6 @@ "limit": null, "note": null }, - { - "key": "group_experiments", - "name": "Group experiments", - "description": "Target experiments to specific groups of users so everyone in the same group gets the same variant.", - "unit": null, - "limit": null, - "note": null - }, { "key": "funnel_experiments", "name": "Funnel & trend experiments", @@ -1961,6 +1988,22 @@ "limit": null, "note": null }, + { + "key": "group_experiments", + "name": "Group experiments", + "description": "Target experiments to specific groups of users so everyone in the same group gets the same variant.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "multiple_environments", + "name": "Multi-environment support", + "description": "Test flags in local development or staging by using the same flag key across PostHog projects.", + "unit": null, + "limit": null, + "note": null + }, { "key": "feature_flags_data_retention", "name": "Data retention", @@ -2018,7 +2061,9 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], "type": "feature_flags", @@ -2215,7 +2260,7 @@ { "plan_key": "free-20230928", "product_key": "surveys", - "name": "Surveys", + "name": "Free", "description": "Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.", "image_url": "https://posthog.com/images/products/surveys/surveys.png", "docs_url": "https://posthog.com/docs/surveys", @@ -2290,12 +2335,14 @@ ], "tiers": null, "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { "plan_key": "paid-20230928", "product_key": "surveys", - "name": "Surveys", + "name": "Paid", "description": "Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.", "image_url": "https://posthog.com/images/products/surveys/surveys.png", "docs_url": "https://posthog.com/docs/surveys", @@ -2449,7 +2496,9 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], "type": "surveys", @@ -2617,7 +2666,7 @@ { "plan_key": "free-20230117", "product_key": "integrations", - "name": "Integrations", + "name": "Free", "description": "Connect PostHog to your favorite tools.", "image_url": "https://posthog.com/images/product/product-icons/integrations.svg", "docs_url": "https://posthog.com/docs/apps", @@ -2668,12 +2717,14 @@ ], "tiers": null, "current_plan": true, - "included_if": "no_active_subscription" + "included_if": "no_active_subscription", + "contact_support": null, + "unit_amount_usd": null }, { "plan_key": "paid-20230117", "product_key": "integrations", - "name": "Integrations", + "name": "Paid", "description": "Connect PostHog to your favorite tools.", "image_url": "https://posthog.com/images/product/product-icons/integrations.svg", "docs_url": "https://posthog.com/docs/apps", @@ -2732,7 +2783,9 @@ ], "tiers": null, "current_plan": false, - "included_if": "has_subscription" + "included_if": "has_subscription", + "contact_support": null, + "unit_amount_usd": null } ], "type": "integrations", @@ -2818,7 +2871,7 @@ { "plan_key": "free-20230117", "product_key": "platform_and_support", - "name": "Platform and support", + "name": "Totally free", "description": "SSO, permission management, and support.", "image_url": "https://posthog.com/images/product/product-icons/platform.svg", "docs_url": "https://posthog.com/docs", @@ -2875,22 +2928,114 @@ "note": null }, { - "key": "terms_and_conditions", - "name": "Terms and conditions", - "description": "Terms and conditions", + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", "unit": null, "limit": null, - "note": "Standard" + "note": null } ], "tiers": null, "current_plan": true, - "included_if": "no_active_subscription" + "included_if": "no_active_subscription", + "contact_support": null, + "unit_amount_usd": null + }, + { + "plan_key": "paid-20240208", + "product_key": "platform_and_support", + "name": "With subscription", + "description": "SSO, permission management, and support.", + "image_url": "https://posthog.com/images/product/product-icons/platform.svg", + "docs_url": "https://posthog.com/docs", + "note": null, + "unit": null, + "free_allocation": null, + "features": [ + { + "key": "tracked_users", + "name": "Tracked users", + "description": "Track users across devices and sessions.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "team_members", + "name": "Team members", + "description": "PostHog doesn't charge per seat add your entire team!", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "organizations_projects", + "name": "Projects", + "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "unit": "projects", + "limit": 2, + "note": null + }, + { + "key": "api_access", + "name": "API access", + "description": "Access your data via our developer-friendly API.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "social_sso", + "name": "SSO via Google, Github, or Gitlab", + "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "community_support", + "name": "Community support", + "description": "Get help from other users and PostHog team members in our Community forums.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "dedicated_support", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", + "unit": null, + "limit": null, + "note": "$2k+/month spend" + }, + { + "key": "email_support", + "name": "Email support", + "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "unit": null, + "limit": null, + "note": null + } + ], + "tiers": null, + "current_plan": false, + "included_if": "has_subscription", + "contact_support": null, + "unit_amount_usd": null }, { - "plan_key": "paid-20230926", + "plan_key": "teams-20240208", "product_key": "platform_and_support", - "name": "Platform and support", + "name": "Teams", "description": "SSO, permission management, and support.", "image_url": "https://posthog.com/images/product/product-icons/platform.svg", "docs_url": "https://posthog.com/docs", @@ -2939,17 +3084,25 @@ "note": null }, { - "key": "project_based_permissioning", - "name": "Project permissions", - "description": "Restrict access to data within the organization to only those who need it.", + "key": "sso_enforcement", + "name": "Enforce SSO login", + "description": "Users can only sign up and log in to your PostHog organization with your specified SSO provider.", "unit": null, "limit": null, "note": null }, { - "key": "white_labelling", - "name": "White labeling", - "description": "Use your own branding in your PostHog organization.", + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa_enforcement", + "name": "Enforce 2FA", + "description": "Require all users in your organization to enable two-factor authentication.", "unit": null, "limit": null, "note": null @@ -2962,42 +3115,334 @@ "limit": null, "note": null }, + { + "key": "email_support", + "name": "Email support", + "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "unit": null, + "limit": null, + "note": null + }, { "key": "dedicated_support", - "name": "Slack (dedicated channel)", - "description": "Get help directly from our support team in a dedicated Slack channel shared between you and the PostHog team.", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", "unit": null, "limit": null, - "note": "$2k/month spend or above" + "note": "$2k+/month spend" }, { - "key": "email_support", - "name": "Direct access to engineers", - "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "key": "priority_support", + "name": "Priority support", + "description": "Get help from our team faster than other customers.", "unit": null, "limit": null, "note": null }, { - "key": "terms_and_conditions", - "name": "Terms and conditions", - "description": "Terms and conditions", + "key": "white_labelling", + "name": "White labeling", + "description": "Use your own branding on surveys, shared dashboards, shared insights, and more.", "unit": null, "limit": null, - "note": "Standard" + "note": null }, { - "key": "security_assessment", - "name": "Security assessment", - "description": "Security assessment", + "key": "project_based_permissioning", + "name": "Project permissions", + "description": "Restrict access to data within the organization to only those who need it.", "unit": null, "limit": null, "note": null - } - ], + }, + { + "key": "advanced_permissions", + "name": "Advanced permissions", + "description": "Control who can access and modify data and features within your organization.", + "unit": null, + "limit": null, + "note": "Project-based only" + }, + { + "key": "audit_logs", + "name": "Audit logs", + "description": "See who in your organization has accessed or modified entities within PostHog.", + "unit": null, + "limit": null, + "note": "Basic" + }, + { + "key": "security_assessment", + "name": "Security assessment", + "description": "Security assessment", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "hipaa_baa", + "name": "HIPAA BAA", + "description": "Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "team_collaboration", + "name": "Team collaboration features", + "description": "Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "ingestion_taxonomy", + "name": "Ingestion taxonomy", + "description": "Mark events as verified or unverified to help you understand the quality of your data.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "tagging", + "name": "Dashboard tags", + "description": "Organize dashboards with tags.", + "unit": null, + "limit": null, + "note": null + } + ], + "tiers": [], + "current_plan": false, + "included_if": null, + "contact_support": null, + "unit_amount_usd": "450.00" + }, + { + "plan_key": "enterprise-20240208", + "product_key": "platform_and_support", + "name": "Enterprise", + "description": "SSO, permission management, and support.", + "image_url": "https://posthog.com/images/product/product-icons/platform.svg", + "docs_url": "https://posthog.com/docs", + "note": null, + "unit": null, + "free_allocation": null, + "features": [ + { + "key": "team_members", + "name": "Team members", + "description": "PostHog doesn't charge per seat add your entire team!", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "organizations_projects", + "name": "Projects", + "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "tracked_users", + "name": "Tracked users", + "description": "Track users across devices and sessions.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "api_access", + "name": "API access", + "description": "Access your data via our developer-friendly API.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "white_labelling", + "name": "White labeling", + "description": "Use your own branding on surveys, shared dashboards, shared insights, and more.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "team_collaboration", + "name": "Team collaboration features", + "description": "Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "ingestion_taxonomy", + "name": "Ingestion taxonomy", + "description": "Mark events as verified or unverified to help you understand the quality of your data.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "tagging", + "name": "Dashboard tags", + "description": "Organize dashboards with tags.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "social_sso", + "name": "SSO via Google, Github, or Gitlab", + "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "sso_enforcement", + "name": "Enforce SSO login", + "description": "Users can only sign up and log in to your PostHog organization with your specified SSO provider.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "saml", + "name": "SAML SSO", + "description": "Allow your organization's users to log in with SAML.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa_enforcement", + "name": "Enforce 2FA", + "description": "Require all users in your organization to enable two-factor authentication.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "project_based_permissioning", + "name": "Project permissions", + "description": "Restrict access to data within the organization to only those who need it.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "role_based_access", + "name": "Role-based access", + "description": "Control access to features like experiments, session recordings, and feature flags with custom roles.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "advanced_permissions", + "name": "Advanced permissions", + "description": "Control who can access and modify data and features within your organization.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "audit_logs", + "name": "Audit logs", + "description": "See who in your organization has accessed or modified entities within PostHog.", + "unit": null, + "limit": null, + "note": "Advanced" + }, + { + "key": "hipaa_baa", + "name": "HIPAA BAA", + "description": "Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "custom_msa", + "name": "Custom MSA", + "description": "Get a custom Master Services Agreement (MSA) to use PostHog in a way that fits your company's needs.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "community_support", + "name": "Community support", + "description": "Get help from other users and PostHog team members in our Community forums.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "email_support", + "name": "Email support", + "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "dedicated_support", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "priority_support", + "name": "Priority support", + "description": "Get help from our team faster than other customers.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "security_assessment", + "name": "Security assessment", + "description": "Security assessment", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "training", + "name": "Ongoing training", + "description": "Get training from our team to help you quickly get up and running with PostHog.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "configuration_support", + "name": "Personalized onboarding", + "description": "Get help from our team to create dashboards that will help you understand your data and your business.", + "unit": null, + "limit": null, + "note": null + } + ], "tiers": null, "current_plan": false, - "included_if": "has_subscription" + "included_if": null, + "contact_support": true, + "unit_amount_usd": null } ], "type": "platform_and_support", @@ -3015,7 +3460,7 @@ "projected_amount_usd": null, "unit": null, "addons": [], - "contact_support": true, + "contact_support": false, "inclusion_only": true, "features": [ { @@ -3051,17 +3496,17 @@ "type": null }, { - "key": "role_based_access", - "name": "Role-based access", - "description": "Control access to features like experiments, session recordings, and feature flags with custom roles.", + "key": "social_sso", + "name": "SSO via Google, Github, or Gitlab", + "description": "Log in to PostHog with your Google, Github, or Gitlab account.", "images": null, "icon_key": null, "type": null }, { - "key": "social_sso", - "name": "SSO via Google, Github, or Gitlab", - "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "key": "role_based_access", + "name": "Role-based access", + "description": "Control access to features like experiments, session recordings, and feature flags with custom roles.", "images": null, "icon_key": null, "type": null @@ -3074,6 +3519,14 @@ "icon_key": null, "type": null }, + { + "key": "advanced_permissions", + "name": "Advanced permissions", + "description": "Control who can access and modify data and features within your organization.", + "images": null, + "icon_key": null, + "type": null + }, { "key": "saml", "name": "SAML SSO", @@ -3090,10 +3543,26 @@ "icon_key": null, "type": null }, + { + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "2fa_enforcement", + "name": "Enforce 2FA", + "description": "Require all users in your organization to enable two-factor authentication.", + "images": null, + "icon_key": null, + "type": null + }, { "key": "white_labelling", "name": "White labeling", - "description": "Use your own branding in your PostHog organization.", + "description": "Use your own branding on surveys, shared dashboards, shared insights, and more.", "images": null, "icon_key": null, "type": null @@ -3108,31 +3577,31 @@ }, { "key": "dedicated_support", - "name": "Slack (dedicated channel)", - "description": "Get help directly from our support team in a dedicated Slack channel shared between you and the PostHog team.", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", "images": null, "icon_key": null, "type": null }, { "key": "email_support", - "name": "Direct access to engineers", + "name": "Email support", "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", "images": null, "icon_key": null, "type": null }, { - "key": "account_manager", - "name": "Account manager", - "description": "Work with a dedicated account manager to help you get the most out of PostHog.", + "key": "priority_support", + "name": "Priority support", + "description": "Get help from our team faster than other customers.", "images": null, "icon_key": null, "type": null }, { "key": "training", - "name": "Training sessions", + "name": "Ongoing training", "description": "Get training from our team to help you quickly get up and running with PostHog.", "images": null, "icon_key": null, @@ -3140,7 +3609,7 @@ }, { "key": "configuration_support", - "name": "Dashboard configuration support", + "name": "Personalized onboarding", "description": "Get help from our team to create dashboards that will help you understand your data and your business.", "images": null, "icon_key": null, @@ -3185,6 +3654,54 @@ "images": null, "icon_key": null, "type": null + }, + { + "key": "audit_logs", + "name": "Audit logs", + "description": "See who in your organization has accessed or modified entities within PostHog.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "hipaa_baa", + "name": "HIPAA BAA", + "description": "Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "custom_msa", + "name": "Custom MSA", + "description": "Get a custom Master Services Agreement (MSA) to use PostHog in a way that fits your company's needs.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "team_collaboration", + "name": "Team collaboration features", + "description": "Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "ingestion_taxonomy", + "name": "Ingestion taxonomy", + "description": "Mark events as verified or unverified to help you understand the quality of your data.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "tagging", + "name": "Dashboard tags", + "description": "Organize dashboards with tags.", + "images": null, + "icon_key": null, + "type": null } ] } @@ -3213,5 +3730,11 @@ "discount_amount_usd": null, "amount_off_expires_at": null, "never_drop_data": null, - "stripe_portal_url": null + "customer_trust_scores": { + "surveys": 0, + "feature_flags": 0, + "session_replay": 3, + "product_analytics": 3 + }, + "stripe_portal_url": "https://billing.stripe.com/p/session/test_YWNjdF8xSElNRERFdUlhdFJYU2R6LF9QaEVaQ0hCTUE0aE8wUFhlVWVqd29MaElGd3lwRjFa010044U4IxJp" } diff --git a/cypress/fixtures/api/billing-v2/billing-v2.json b/cypress/fixtures/api/billing-v2/billing-v2.json index 605cbf2da1d86..f0e775ad17725 100644 --- a/cypress/fixtures/api/billing-v2/billing-v2.json +++ b/cypress/fixtures/api/billing-v2/billing-v2.json @@ -7,6 +7,7 @@ "surveys_api_mode", "surveys_results_analysis", "surveys_templates", + "surveys_data_retention", "zapier", "slack_integration", "microsoft_teams_integration", @@ -14,6 +15,7 @@ "apps", "app_metrics", "boolean_flags", + "multivariate_flags", "persist_flags_cross_authentication", "feature_flag_payloads", "multiple_release_conditions", @@ -21,46 +23,53 @@ "targeting_by_group", "local_evaluation_and_bootstrapping", "flag_usage_stats", - "data_warehouse_manual_sync", - "data_warehouse_unified_querying", - "data_warehouse_insights_visualization", + "experimentation", + "funnel_experiments", + "secondary_metrics", + "statistical_analysis", + "feature_flags_data_retention", "console_logs", + "recordings_performance", + "session_replay_network_payloads", "recordings_playlists", + "session_replay_data_retention", + "replay_mask_sensitive_data", + "replay_sharing_embedding", + "replay_product_analytics_integration", + "replay_filter_person_properties", + "replay_filter_events", + "replay_dom_explorer", + "session_replay_sampling", + "replay_recording_duration_minimum", + "replay_feature_flag_based_recording", "dashboards", "funnels", "graphs_trends", "paths", "subscriptions", "paths_advanced", - "advanced_permissions", - "team_collaboration", - "ingestion_taxonomy", "correlation_analysis", - "tagging", "behavioral_cohort_filtering", + "product_analytics_data_retention", "tracked_users", - "data_retention", "team_members", "organizations_projects", "api_access", "social_sso", - "project_based_permissioning", - "white_labelling", "community_support", "dedicated_support", "email_support", - "terms_and_conditions", - "security_assessment" + "2fa" ], "license": { "plan": "dev" }, - "customer_id": "cus_Ot0pdGiqNz8M9J", + "customer_id": "cus_Pg7PIL8MsKi6bx", "deactivated": false, "has_active_subscription": true, "billing_period": { - "current_period_start": "2023-10-31T00:08:23Z", - "current_period_end": "2023-11-30T00:08:23Z", + "current_period_start": "2024-03-07T23:21:20Z", + "current_period_end": "2024-04-07T23:21:20Z", "interval": "month" }, "available_product_features": [ @@ -82,8 +91,8 @@ }, { "key": "surveys_user_targeting", - "name": "User property targeting", - "description": "Target users based on any of their user properties.", + "name": "Advanced user targeting", + "description": "Target by URL, user property, or feature flag when used with Feature flags.", "unit": null, "limit": null, "note": null @@ -99,15 +108,15 @@ { "key": "surveys_api_mode", "name": "API mode", - "description": "Create surveys via the API.", + "description": "Using PostHog.js? No more code required. But if want to create your own UI, we have a full API.", "unit": null, "limit": null, "note": null }, { "key": "surveys_results_analysis", - "name": "Results analysis", - "description": "Analyze your survey results including completion rates and drop offs.", + "name": "Aggregated results", + "description": "See feedback summarized and broken down per response, plus completion rates and drop offs.", "unit": null, "limit": null, "note": null @@ -120,6 +129,14 @@ "limit": null, "note": null }, + { + "key": "surveys_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "year", + "limit": 1, + "note": null + }, { "key": "zapier", "name": "Zapier", @@ -154,8 +171,8 @@ }, { "key": "apps", - "name": "CDP + Apps library", - "description": "Connect your data with 50+ apps including BigQuery, Redshift, and more.", + "name": "Apps", + "description": "Use apps to transform, filter, and modify your incoming data. (Export apps not included, see the Data pipelines addon for product analytics.)", "unit": null, "limit": null, "note": null @@ -176,6 +193,14 @@ "limit": null, "note": null }, + { + "key": "multivariate_flags", + "name": "Multivariate feature flags & experiments", + "description": "Create three or more variants of a feature flag to test or release different versions of a feature.", + "unit": null, + "limit": null, + "note": null + }, { "key": "persist_flags_cross_authentication", "name": "Persist flags across authentication", @@ -186,8 +211,8 @@ }, { "key": "feature_flag_payloads", - "name": "Payloads", - "description": "Send additional pieces of information (any valid JSON) to your app when a flag is matched for a user.", + "name": "Test changes without code", + "description": "Use JSON payloads to change text, visuals, or entire blocks of code without subsequent deployments.", "unit": null, "limit": null, "note": null @@ -195,7 +220,7 @@ { "key": "multiple_release_conditions", "name": "Multiple release conditions", - "description": "Target multiple groups of users with different release conditions for the same feature flag.", + "description": "Customize your rollout strategy by user or group properties, cohort, or trafic percentage.", "unit": null, "limit": null, "note": null @@ -233,33 +258,65 @@ "note": null }, { - "key": "data_warehouse_manual_sync", - "name": "Manual sync", - "description": "Sync your data to the warehouse using your cloud storage provider.", + "key": "experimentation", + "name": "A/B testing", + "description": "Test changes to your product and evaluate the impacts those changes make.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "funnel_experiments", + "name": "Funnel & trend experiments", + "description": "Measure the impact of a change on a aggregate values or a series of events, like a signup flow.", "unit": null, "limit": null, "note": null }, { - "key": "data_warehouse_unified_querying", - "name": "Unified querying", - "description": "Query all your business and product data directly inside PostHog.", + "key": "secondary_metrics", + "name": "Secondary experiment metrics", + "description": "Track additional metrics to see how your experiment affects other parts of your app or different flows.", "unit": null, "limit": null, "note": null }, { - "key": "data_warehouse_insights_visualization", - "name": "Insights", - "description": "Create insights from the data you import and add them to your PostHog dashboards.", + "key": "statistical_analysis", + "name": "Statistical analysis", + "description": "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", "unit": null, "limit": null, "note": null }, + { + "key": "feature_flags_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "year", + "limit": 1, + "note": null + }, { "key": "console_logs", "name": "Console logs", - "description": "Diagnose issues by inspecting errors in the user's network console", + "description": "Debug issues faster by browsing the user's console.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "recordings_performance", + "name": "Network performance on recordings", + "description": "See your end-user's network performance and information alongside session recordings.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "session_replay_network_payloads", + "name": "Network monitor", + "description": "Analyze performance and network calls.", "unit": null, "limit": null, "note": null @@ -273,116 +330,164 @@ "note": null }, { - "key": "dashboards", - "name": "Dashboards", - "description": "Save trends, funnels, and other insights for easy reference by your whole team.", + "key": "session_replay_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "month", + "limit": 1, + "note": null + }, + { + "key": "replay_mask_sensitive_data", + "name": "Block sensitive data", + "description": "Disable capturing data from any DOM element with HTML attributes or a customizable config.", "unit": null, "limit": null, "note": null }, { - "key": "funnels", - "name": "Funnels", - "description": "Visualize user dropoff between a sequence of events.", + "key": "replay_sharing_embedding", + "name": "Share and embed", + "description": "Share replays directly via URL or embed via iframe.", "unit": null, "limit": null, "note": null }, { - "key": "graphs_trends", - "name": "Graphs & trends", - "description": "Plot any number of events or actions over time.", + "key": "replay_product_analytics_integration", + "name": "Event timeline", + "description": "See a history of everything that happened in a user's session.", "unit": null, "limit": null, "note": null }, { - "key": "paths", - "name": "Paths", - "description": "Limited paths excludes: customizing path insights by setting the maximum number of paths, number of people on each path, how path names appear", + "key": "replay_filter_person_properties", + "name": "Filter person properties", + "description": "Filter by person properties to quickly find relevant recordings.", "unit": null, "limit": null, "note": null }, { - "key": "subscriptions", - "name": "Insight & dashboard subscriptions", - "description": "Create a subscription for any insight or dashboard in PostHog to receive regular reports with their updates.", + "key": "replay_filter_events", + "name": "Filter events", + "description": "Filter by events to quickly find relevant recordings.", "unit": null, "limit": null, "note": null }, { - "key": "paths_advanced", - "name": "Advanced paths", - "description": "Customize your path insights by setting the maximum number of paths, number of people on each path, and how path names should appear.", + "key": "replay_dom_explorer", + "name": "DOM Explorer", + "description": "Freeze snapshots of recordings and explore the DOM with your browser dev tools.", "unit": null, "limit": null, "note": null }, { - "key": "advanced_permissions", - "name": "Dashboard permissions", - "description": "Restrict access to dashboards within the organization to only those who need it.", + "key": "session_replay_sampling", + "name": "Sample recorded sessions", + "description": "Restrict the percentage of sessions that will be recorded.", "unit": null, "limit": null, "note": null }, { - "key": "team_collaboration", - "name": "Tags & text cards", - "description": "Keep organized by adding tags to your dashboards, cohorts and more. Add text cards and descriptions to your dashboards to provide context to your team.", + "key": "replay_recording_duration_minimum", + "name": "Minimum duration", + "description": "Only record sessions longer than the minimum duration.", "unit": null, "limit": null, "note": null }, { - "key": "ingestion_taxonomy", - "name": "Ingestion taxonomy", - "description": "Ingestion taxonomy", + "key": "replay_feature_flag_based_recording", + "name": "Record via feature flag", + "description": "Only record sessions for users that have the flag enabled.", "unit": null, "limit": null, "note": null }, { - "key": "correlation_analysis", - "name": "Correlation analysis", - "description": "Automatically highlight significant factors that affect the conversion rate of users within a funnel.", + "key": "dashboards", + "name": "Dashboards", + "description": "Save trends, funnels, and other insights for easy reference by your whole team.", "unit": null, "limit": null, "note": null }, { - "key": "tagging", - "name": "Dashboard tags", - "description": "Organize dashboards with tags.", + "key": "funnels", + "name": "Funnels", + "description": "Visualize user dropoff between a sequence of events. See conversion rate over time, use flexible step ordering, set exclusion steps, and more.", "unit": null, "limit": null, "note": null }, { - "key": "behavioral_cohort_filtering", - "name": "Lifecycle cohorts", - "description": "Group users based on their long term behavior, such as whether they frequently performed an event, or have recently stopped performing an event.", + "key": "graphs_trends", + "name": "Graphs & trends", + "description": "Plot any number of events or actions over time.", "unit": null, "limit": null, "note": null }, { - "key": "tracked_users", - "name": "Tracked users", - "description": "Track users across devices and sessions.", + "key": "paths", + "name": "User paths", + "description": "Limited paths excludes: customizing path insights by setting the maximum number of paths, number of people on each path, how path names appear", "unit": null, "limit": null, - "note": "Unlimited" + "note": null + }, + { + "key": "subscriptions", + "name": "Insight & dashboard subscriptions", + "description": "Create a subscription for any insight or dashboard in PostHog to receive regular reports with their updates.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "paths_advanced", + "name": "Advanced paths", + "description": "Customize your path insights by setting the maximum number of paths, number of people on each path, and how path names should appear.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "correlation_analysis", + "name": "Correlation analysis", + "description": "Automatically highlight significant factors that affect the conversion rate of users within a funnel.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "behavioral_cohort_filtering", + "name": "Lifecycle", + "description": "Discover how your active users break down, highlighting those who have recently stopped being active or those who have just become active for the first time.", + "unit": null, + "limit": null, + "note": null }, { - "key": "data_retention", + "key": "product_analytics_data_retention", "name": "Data retention", "description": "Keep a historical record of your data.", + "unit": "years", + "limit": 7, + "note": null + }, + { + "key": "tracked_users", + "name": "Tracked users", + "description": "Track users across devices and sessions.", "unit": null, "limit": null, - "note": "7 years" + "note": "Unlimited" }, { "key": "team_members", @@ -396,9 +501,9 @@ "key": "organizations_projects", "name": "Projects", "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", - "unit": null, - "limit": null, - "note": "Unlimited" + "unit": "projects", + "limit": 2, + "note": null }, { "key": "api_access", @@ -416,22 +521,6 @@ "limit": null, "note": null }, - { - "key": "project_based_permissioning", - "name": "Project permissions", - "description": "Restrict access to data within the organization to only those who need it.", - "unit": null, - "limit": null, - "note": null - }, - { - "key": "white_labelling", - "name": "White labeling", - "description": "Use your own branding in your PostHog organization.", - "unit": null, - "limit": null, - "note": null - }, { "key": "community_support", "name": "Community support", @@ -442,32 +531,24 @@ }, { "key": "dedicated_support", - "name": "Slack (dedicated channel)", - "description": "Get help directly from our support team in a dedicated Slack channel shared between you and the PostHog team.", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", "unit": null, "limit": null, - "note": "$2k/month spend or above" + "note": "$2k+/month spend" }, { "key": "email_support", - "name": "Direct access to engineers", + "name": "Email support", "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", "unit": null, "limit": null, "note": null }, { - "key": "terms_and_conditions", - "name": "Terms and conditions", - "description": "Terms and conditions", - "unit": null, - "limit": null, - "note": "Standard" - }, - { - "key": "security_assessment", - "name": "Security assessment", - "description": "Security assessment", + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", "unit": null, "limit": null, "note": null @@ -477,11 +558,13 @@ "current_total_amount_usd_after_discount": "0.00", "products": [ { - "name": "Product analytics + data stack", - "description": "Trends, funnels, path analysis, CDP + more.", + "name": "Product analytics", + "headline": "Product analytics with autocapture", + "description": "A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.", "price_description": null, "usage_key": "events", - "image_url": "https://posthog.com/images/product/product-icons/product-analytics.svg", + "image_url": "https://posthog.com/images/products/product-analytics/product-analytics.png", + "screenshot_url": "https://posthog.com/images/products/product-analytics/screenshot-product-analytics.png", "icon_key": "IconGraph", "docs_url": "https://posthog.com/docs/product-analytics", "subscribed": true, @@ -489,9 +572,9 @@ { "plan_key": "free-20230117", "product_key": "product_analytics", - "name": "Product analytics + data stack", - "description": "Trends, funnels, path analysis, CDP + more.", - "image_url": "https://posthog.com/images/product/product-icons/product-analytics.svg", + "name": "Free", + "description": "A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.", + "image_url": "https://posthog.com/images/products/product-analytics/product-analytics.png", "docs_url": "https://posthog.com/docs/product-analytics", "note": null, "unit": "event", @@ -508,7 +591,7 @@ { "key": "funnels", "name": "Funnels", - "description": "Visualize user dropoff between a sequence of events.", + "description": "Visualize user dropoff between a sequence of events. See conversion rate over time, use flexible step ordering, set exclusion steps, and more.", "unit": null, "limit": null, "note": null @@ -523,23 +606,33 @@ }, { "key": "paths", - "name": "Paths", + "name": "User paths", "description": "Limited paths excludes: customizing path insights by setting the maximum number of paths, number of people on each path, how path names appear", "unit": null, "limit": null, "note": "Limited" + }, + { + "key": "product_analytics_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "year", + "limit": 1, + "note": null } ], "tiers": null, "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { - "plan_key": "paid-20230509", + "plan_key": "paid-20240111", "product_key": "product_analytics", - "name": "Product analytics + data stack", - "description": "Trends, funnels, path analysis, CDP + more.", - "image_url": "https://posthog.com/images/product/product-icons/product-analytics.svg", + "name": "Paid", + "description": "A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.", + "image_url": "https://posthog.com/images/products/product-analytics/product-analytics.png", "docs_url": "https://posthog.com/docs/product-analytics", "note": null, "unit": "event", @@ -556,7 +649,7 @@ { "key": "funnels", "name": "Funnels", - "description": "Visualize user dropoff between a sequence of events.", + "description": "Visualize user dropoff between a sequence of events. See conversion rate over time, use flexible step ordering, set exclusion steps, and more.", "unit": null, "limit": null, "note": null @@ -571,7 +664,7 @@ }, { "key": "paths", - "name": "Paths", + "name": "User paths", "description": "Limited paths excludes: customizing path insights by setting the maximum number of paths, number of people on each path, how path names appear", "unit": null, "limit": null, @@ -593,30 +686,6 @@ "limit": null, "note": null }, - { - "key": "advanced_permissions", - "name": "Dashboard permissions", - "description": "Restrict access to dashboards within the organization to only those who need it.", - "unit": null, - "limit": null, - "note": null - }, - { - "key": "team_collaboration", - "name": "Tags & text cards", - "description": "Keep organized by adding tags to your dashboards, cohorts and more. Add text cards and descriptions to your dashboards to provide context to your team.", - "unit": null, - "limit": null, - "note": null - }, - { - "key": "ingestion_taxonomy", - "name": "Ingestion taxonomy", - "description": "Ingestion taxonomy", - "unit": null, - "limit": null, - "note": null - }, { "key": "correlation_analysis", "name": "Correlation analysis", @@ -626,19 +695,19 @@ "note": null }, { - "key": "tagging", - "name": "Dashboard tags", - "description": "Organize dashboards with tags.", + "key": "behavioral_cohort_filtering", + "name": "Lifecycle", + "description": "Discover how your active users break down, highlighting those who have recently stopped being active or those who have just become active for the first time.", "unit": null, "limit": null, "note": null }, { - "key": "behavioral_cohort_filtering", - "name": "Lifecycle cohorts", - "description": "Group users based on their long term behavior, such as whether they frequently performed an event, or have recently stopped performing an event.", - "unit": null, - "limit": null, + "key": "product_analytics_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "years", + "limit": 7, "note": null } ], @@ -654,7 +723,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0003068", + "unit_amount_usd": "0.00031", "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -708,7 +777,9 @@ } ], "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], "type": "product_analytics", @@ -725,7 +796,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0003068", + "unit_amount_usd": "0.00031", "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, @@ -782,7 +853,7 @@ "unit_amount_usd": null, "current_amount_usd_before_addons": "0.00", "current_amount_usd": "0.00", - "current_usage": 35, + "current_usage": 0, "usage_limit": null, "has_exceeded_limit": false, "percentage_usage": 0, @@ -876,7 +947,7 @@ { "plan_key": "addon-20230509", "product_key": "group_analytics", - "name": "Group analytics", + "name": "Addon", "description": "Associate events with a group or entity - such as a company, community, or project. Analyze these events as if they were sent by that entity itself. Great for B2B, marketplaces, and more.", "image_url": "https://posthog.com/images/product/product-icons/group-analytics.svg", "docs_url": "https://posthog.com/docs/product-analytics/group-analytics", @@ -959,106 +1030,44 @@ } ], "current_plan": false, - "included_if": null - } - ], - "contact_support": false - } - ], - "contact_support": false, - "inclusion_only": false - }, - { - "name": "Session replay", - "description": "Searchable recordings of people using your app or website with console logs and behavioral bucketing.", - "price_description": null, - "usage_key": "recordings", - "image_url": "https://posthog.com/images/product/product-icons/session-replay.svg", - "icon_key": "IconRewindPlay", - "docs_url": "https://posthog.com/docs/session-replay", - "subscribed": true, - "plans": [ - { - "plan_key": "free-20230117", - "product_key": "session_replay", - "name": "Session replay", - "description": "Searchable recordings of people using your app or website with console logs and behavioral bucketing.", - "image_url": "https://posthog.com/images/product/product-icons/session-replay.svg", - "docs_url": "https://posthog.com/docs/session-replay", - "note": null, - "unit": "recording", - "free_allocation": 15000, - "features": [ - { - "key": "console_logs", - "name": "Console logs", - "description": "Diagnose issues by inspecting errors in the user's network console", - "unit": null, - "limit": null, - "note": null - }, - { - "key": "recordings_playlists", - "name": "Recording playlists", - "description": "Create playlists of certain session recordings to easily find and watch them again in the future.", - "unit": "playlists", - "limit": 5, - "note": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], - "tiers": null, - "current_plan": true, - "included_if": null + "contact_support": null }, { - "plan_key": "paid-20230117", - "product_key": "session_replay", - "name": "Session replay", - "description": "Searchable recordings of people using your app or website with console logs and behavioral bucketing.", - "image_url": "https://posthog.com/images/product/product-icons/session-replay.svg", - "docs_url": "https://posthog.com/docs/session-replay", - "note": null, - "unit": "recording", - "free_allocation": null, - "features": [ - { - "key": "console_logs", - "name": "Console logs", - "description": "Diagnose issues by inspecting errors in the user's network console", - "unit": null, - "limit": null, - "note": null - }, + "name": "Data pipelines", + "description": "Get your PostHog data into your data warehouse or other tools like BigQuery, Redshift, Customer.io, and more.", + "price_description": null, + "image_url": "None", + "icon_key": "IconDecisionTree", + "docs_url": "https://posthog.com/docs/cdp/batch-exports", + "type": "data_pipelines", + "tiers": [ { - "key": "recordings_playlists", - "name": "Recording playlists", - "description": "Create playlists of certain session recordings to easily find and watch them again in the future.", - "unit": null, - "limit": null, - "note": null + "flat_amount_usd": "0", + "unit_amount_usd": "0", + "up_to": 1000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null }, { - "key": "recordings_performance", - "name": "Network performance on recordings", - "description": "See your end-user's network performance and information alongside session recordings.", - "unit": null, - "limit": null, - "note": null + "flat_amount_usd": "0", + "unit_amount_usd": "0.000248", + "up_to": 2000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null }, - { - "key": "recordings_file_export", - "name": "Recordings file export", - "description": "Save session recordings as a file to your local filesystem.", - "unit": null, - "limit": null, - "note": null - } - ], - "tiers": [ { "flat_amount_usd": "0", - "unit_amount_usd": "0", - "up_to": 15000, + "unit_amount_usd": "0.000104", + "up_to": 15000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1066,8 +1075,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.005", - "up_to": 50000, + "unit_amount_usd": "0.0000655", + "up_to": 50000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1075,8 +1084,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0045", - "up_to": 150000, + "unit_amount_usd": "0.0000364", + "up_to": 100000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1084,8 +1093,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.004", - "up_to": 500000, + "unit_amount_usd": "0.0000187", + "up_to": 250000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1093,7 +1102,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0035", + "unit_amount_usd": "0.0000042", "up_to": null, "current_amount_usd": "0.00", "current_usage": 0, @@ -1101,109 +1110,384 @@ "projected_amount_usd": null } ], - "current_plan": false, - "included_if": null + "tiered": true, + "included_with_main_product": false, + "subscribed": false, + "unit": "event", + "unit_amount_usd": null, + "current_amount_usd": null, + "current_usage": 0, + "projected_usage": 0, + "projected_amount_usd": "0.00", + "plans": [ + { + "plan_key": "addon-20240111", + "product_key": "data_pipelines", + "name": "Addon", + "description": "Get your PostHog data into your data warehouse or other tools like BigQuery, Redshift, Customer.io, and more.", + "image_url": null, + "docs_url": "https://posthog.com/docs/cdp/batch-exports", + "note": null, + "unit": "event", + "free_allocation": null, + "features": [ + { + "key": "data_pipelines", + "name": "Data pipelines", + "description": "Get your PostHog data into your data warehouse or other tools like BigQuery, Redshift, Customer.io, and more.", + "unit": null, + "limit": null, + "note": null + } + ], + "tiers": [ + { + "flat_amount_usd": "0", + "unit_amount_usd": "0", + "up_to": 1000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.000248", + "up_to": 2000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.000104", + "up_to": 15000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.0000655", + "up_to": 50000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.0000364", + "up_to": 100000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.0000187", + "up_to": 250000000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.0000042", + "up_to": null, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + } + ], + "current_plan": false, + "included_if": null, + "contact_support": null, + "unit_amount_usd": null + } + ], + "contact_support": null } ], - "type": "session_replay", - "free_allocation": 15000, - "tiers": null, - "tiered": true, - "unit_amount_usd": null, - "current_amount_usd_before_addons": null, - "current_amount_usd": null, - "current_usage": 0, - "usage_limit": 15000, - "has_exceeded_limit": false, - "percentage_usage": 0, - "projected_usage": 0, - "projected_amount_usd": null, - "unit": "recording", - "addons": [], "contact_support": false, - "inclusion_only": false + "inclusion_only": false, + "features": [ + { + "key": "product_analytics_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "dashboards", + "name": "Dashboards", + "description": "Save trends, funnels, and other insights for easy reference by your whole team.", + "images": { + "light": "https://posthog.com/images/products/product-analytics/screenshot-dashboards.png", + "dark": "https://posthog.com/images/products/product-analytics/screenshot-dashboards-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "funnels", + "name": "Funnels", + "description": "Visualize user dropoff between a sequence of events. See conversion rate over time, use flexible step ordering, set exclusion steps, and more.", + "images": { + "light": "https://posthog.com/images/products/product-analytics/screenshot-funnels.png", + "dark": "https://posthog.com/images/products/product-analytics/screenshot-funnels-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "graphs_trends", + "name": "Graphs & trends", + "description": "Plot any number of events or actions over time.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "paths", + "name": "User paths", + "description": "Limited paths excludes: customizing path insights by setting the maximum number of paths, number of people on each path, how path names appear", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "insights", + "name": "Unlimited Insights", + "description": "Trends, funnels, retention, user paths, stickiness, and lifecycle insights to visualize your data.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "subscriptions", + "name": "Insight & dashboard subscriptions", + "description": "Create a subscription for any insight or dashboard in PostHog to receive regular reports with their updates.", + "images": null, + "icon_key": "IconNotification", + "type": "secondary" + }, + { + "key": "paths_advanced", + "name": "Advanced paths", + "description": "Customize your path insights by setting the maximum number of paths, number of people on each path, and how path names should appear.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "correlation_analysis", + "name": "Correlation analysis", + "description": "Automatically highlight significant factors that affect the conversion rate of users within a funnel.", + "images": { + "light": "https://posthog.com/images/products/product-analytics/screenshot-correlation-analysis.png", + "dark": "https://posthog.com/images/products/product-analytics/screenshot-correlation-analysis-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "behavioral_cohort_filtering", + "name": "Lifecycle", + "description": "Discover how your active users break down, highlighting those who have recently stopped being active or those who have just become active for the first time.", + "images": { + "light": "https://posthog.com/images/products/product-analytics/screenshot-lifecycle.png", + "dark": "https://posthog.com/images/products/product-analytics/screenshot-lifecycle-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "product_analytics_retention", + "name": "Retention", + "description": "See how many users return on subsequent days after performing an event the first time, or recurrently.", + "images": { + "light": "https://posthog.com/images/products/product-analytics/screenshot-retention.png", + "dark": "https://posthog.com/images/products/product-analytics/screenshot-retention-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "product_analytics_stickiness", + "name": "Stickiness", + "description": "Learn how many times users perform a specific event in a period of time.", + "images": { + "light": "https://posthog.com/images/products/product-analytics/screenshot-stickiness.png", + "dark": "https://posthog.com/images/products/product-analytics/screenshot-stickiness-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "autocapture", + "name": "Autocapture", + "description": "Add PostHog.js to your website or web app to track all event data and retroactively define events.", + "images": null, + "icon_key": "IconBolt", + "type": "secondary" + }, + { + "key": "data_visualization", + "name": "Data visualization", + "description": "Filter data by user property, group data, and use formulas in queries.", + "images": null, + "icon_key": "IconPieChart", + "type": "secondary" + }, + { + "key": "product_analytics_sql_queries", + "name": "Query with SQL", + "description": "Use PostHog’s filtering interface or switch into SQL mode for more powerful querying.", + "images": null, + "icon_key": "IconTerminal", + "type": "secondary" + } + ] }, { - "name": "Feature flags & A/B testing", - "description": "Safely roll out new features and run experiments on changes.", + "name": "Session replay", + "headline": "Watch how users experience your app", + "description": "Session replay helps you diagnose issues and understand user behavior in your product or website.", "price_description": null, - "usage_key": "feature_flag_requests", - "image_url": "https://posthog.com/images/product/product-icons/feature-flags.svg", - "icon_key": "IconToggle", - "docs_url": "https://posthog.com/docs/feature-flags", + "usage_key": "recordings", + "image_url": "https://posthog.com/images/products/session-replay/session-replay.png", + "screenshot_url": "https://posthog.com/images/products/session-replay/screenshot-session-replay.png", + "icon_key": "IconRewindPlay", + "docs_url": "https://posthog.com/docs/session-replay", "subscribed": false, "plans": [ { - "plan_key": "free-20230117", - "product_key": "feature_flags", - "name": "Feature flags & A/B testing", - "description": "Safely roll out new features and run experiments on changes.", - "image_url": "https://posthog.com/images/product/product-icons/feature-flags.svg", - "docs_url": "https://posthog.com/docs/feature-flags", + "plan_key": "free-20231218", + "product_key": "session_replay", + "name": "Free", + "description": "Session replay helps you diagnose issues and understand user behavior in your product or website.", + "image_url": "https://posthog.com/images/products/session-replay/session-replay.png", + "docs_url": "https://posthog.com/docs/session-replay", "note": null, - "unit": "request", - "free_allocation": 1000000, + "unit": "recording", + "free_allocation": 5000, "features": [ { - "key": "boolean_flags", - "name": "Boolean feature flags", - "description": "Turn features on and off for specific users.", + "key": "console_logs", + "name": "Console logs", + "description": "Debug issues faster by browsing the user's console.", "unit": null, "limit": null, "note": null }, { - "key": "persist_flags_cross_authentication", - "name": "Persist flags across authentication", - "description": "Persist feature flags across authentication events so that flag values don't change when an anonymous user logs in and becomes identified.", + "key": "recordings_performance", + "name": "Network performance on recordings", + "description": "See your end-user's network performance and information alongside session recordings.", "unit": null, "limit": null, "note": null }, { - "key": "feature_flag_payloads", - "name": "Payloads", - "description": "Send additional pieces of information (any valid JSON) to your app when a flag is matched for a user.", + "key": "session_replay_network_payloads", + "name": "Network monitor", + "description": "Analyze performance and network calls.", "unit": null, "limit": null, "note": null }, { - "key": "multiple_release_conditions", - "name": "Multiple release conditions", - "description": "Target multiple groups of users with different release conditions for the same feature flag.", + "key": "recordings_playlists", + "name": "Recording playlists", + "description": "Create playlists of certain session recordings to easily find and watch them again in the future.", + "unit": "playlists", + "limit": 5, + "note": null + }, + { + "key": "session_replay_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "month", + "limit": 1, + "note": null + }, + { + "key": "replay_mask_sensitive_data", + "name": "Block sensitive data", + "description": "Disable capturing data from any DOM element with HTML attributes or a customizable config.", "unit": null, "limit": null, "note": null }, { - "key": "release_condition_overrides", - "name": "Release condition overrides", - "description": "For any release condition, specify which flag value the users or groups in that condition should receive.", + "key": "replay_sharing_embedding", + "name": "Share and embed", + "description": "Share replays directly via URL or embed via iframe.", "unit": null, "limit": null, "note": null }, { - "key": "targeting_by_group", - "name": "Flag targeting by groups", - "description": "Target feature flag release conditions by group properties, not just user properties.", + "key": "replay_product_analytics_integration", + "name": "Event timeline", + "description": "See a history of everything that happened in a user's session.", "unit": null, "limit": null, "note": null }, { - "key": "local_evaluation_and_bootstrapping", - "name": "Local evaluation & bootstrapping", - "description": "Bootstrap flags on initialization so all flags are available immediately, without having to make extra network requests.", + "key": "replay_filter_person_properties", + "name": "Filter person properties", + "description": "Filter by person properties to quickly find relevant recordings.", "unit": null, "limit": null, "note": null }, { - "key": "flag_usage_stats", - "name": "Flag usage stats", - "description": "See how many times a flag has been evaluated, how many times each variant has been returned, and what values users received.", + "key": "replay_filter_events", + "name": "Filter events", + "description": "Filter by events to quickly find relevant recordings.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "replay_dom_explorer", + "name": "DOM Explorer", + "description": "Freeze snapshots of recordings and explore the DOM with your browser dev tools.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "session_replay_sampling", + "name": "Sample recorded sessions", + "description": "Restrict the percentage of sessions that will be recorded.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "replay_recording_duration_minimum", + "name": "Minimum duration", + "description": "Only record sessions longer than the minimum duration.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "replay_feature_flag_based_recording", + "name": "Record via feature flag", + "description": "Only record sessions for users that have the flag enabled.", "unit": null, "limit": null, "note": null @@ -1211,127 +1495,137 @@ ], "tiers": null, "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { - "plan_key": "paid-20230623", - "product_key": "feature_flags", - "name": "Feature flags & A/B testing", - "description": "Safely roll out new features and run experiments on changes.", - "image_url": "https://posthog.com/images/product/product-icons/feature-flags.svg", - "docs_url": "https://posthog.com/docs/feature-flags", + "plan_key": "paid-20231218", + "product_key": "session_replay", + "name": "Paid", + "description": "Session replay helps you diagnose issues and understand user behavior in your product or website.", + "image_url": "https://posthog.com/images/products/session-replay/session-replay.png", + "docs_url": "https://posthog.com/docs/session-replay", "note": null, - "unit": "request", + "unit": "recording", "free_allocation": null, "features": [ { - "key": "boolean_flags", - "name": "Boolean feature flags", - "description": "Turn features on and off for specific users.", + "key": "console_logs", + "name": "Console logs", + "description": "Debug issues faster by browsing the user's console.", "unit": null, "limit": null, "note": null }, { - "key": "multivariate_flags", - "name": "Multivariate feature flags & experiments", - "description": "Create three or more variants of a feature flag to test or release different versions of a feature.", + "key": "recordings_playlists", + "name": "Recording playlists", + "description": "Create playlists of certain session recordings to easily find and watch them again in the future.", "unit": null, "limit": null, "note": null }, { - "key": "persist_flags_cross_authentication", - "name": "Persist flags across authentication", - "description": "Persist feature flags across authentication events so that flag values don't change when an anonymous user logs in and becomes identified.", + "key": "recordings_performance", + "name": "Network performance on recordings", + "description": "See your end-user's network performance and information alongside session recordings.", "unit": null, "limit": null, "note": null }, { - "key": "feature_flag_payloads", - "name": "Payloads", - "description": "Send additional pieces of information (any valid JSON) to your app when a flag is matched for a user.", + "key": "session_replay_network_payloads", + "name": "Network monitor", + "description": "Analyze performance and network calls.", "unit": null, "limit": null, "note": null }, { - "key": "multiple_release_conditions", - "name": "Multiple release conditions", - "description": "Target multiple groups of users with different release conditions for the same feature flag.", + "key": "recordings_file_export", + "name": "Download recordings", + "description": "Retain recordings beyond data retention limits.", "unit": null, "limit": null, "note": null }, { - "key": "release_condition_overrides", - "name": "Release condition overrides", - "description": "For any release condition, specify which flag value the users or groups in that condition should receive.", - "unit": null, - "limit": null, + "key": "session_replay_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "months", + "limit": 3, "note": null }, { - "key": "targeting_by_group", - "name": "Flag targeting by groups", - "description": "Target feature flag release conditions by group properties, not just user properties.", + "key": "replay_mask_sensitive_data", + "name": "Block sensitive data", + "description": "Disable capturing data from any DOM element with HTML attributes or a customizable config.", "unit": null, "limit": null, "note": null }, { - "key": "local_evaluation_and_bootstrapping", - "name": "Local evaluation & bootstrapping", - "description": "Bootstrap flags on initialization so all flags are available immediately, without having to make extra network requests.", + "key": "replay_sharing_embedding", + "name": "Share and embed", + "description": "Share replays directly via URL or embed via iframe.", "unit": null, "limit": null, "note": null }, { - "key": "flag_usage_stats", - "name": "Flag usage stats", - "description": "See how many times a flag has been evaluated, how many times each variant has been returned, and what values users received.", + "key": "replay_product_analytics_integration", + "name": "Event timeline", + "description": "See a history of everything that happened in a user's session.", "unit": null, "limit": null, "note": null }, { - "key": "experimentation", - "name": "A/B testing", - "description": "Test changes to your product and evaluate the impacts those changes make.", + "key": "replay_filter_person_properties", + "name": "Filter person properties", + "description": "Filter by person properties to quickly find relevant recordings.", "unit": null, "limit": null, "note": null }, { - "key": "group_experiments", - "name": "Group experiments", - "description": "Target experiments to specific groups of users so everyone in the same group gets the same variant.", + "key": "replay_filter_events", + "name": "Filter events", + "description": "Filter by events to quickly find relevant recordings.", "unit": null, "limit": null, "note": null }, { - "key": "funnel_experiments", - "name": "Funnel & trend experiments", - "description": "Measure the impact of a change on a aggregate values or a series of events, like a signup flow.", + "key": "replay_dom_explorer", + "name": "DOM Explorer", + "description": "Freeze snapshots of recordings and explore the DOM with your browser dev tools.", "unit": null, "limit": null, "note": null }, { - "key": "secondary_metrics", - "name": "Secondary experiment metrics", - "description": "Track additional metrics to see how your experiment affects other parts of your app or different flows.", + "key": "session_replay_sampling", + "name": "Sample recorded sessions", + "description": "Restrict the percentage of sessions that will be recorded.", "unit": null, "limit": null, "note": null }, { - "key": "statistical_analysis", - "name": "Statistical analysis", - "description": "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", + "key": "replay_recording_duration_minimum", + "name": "Minimum duration", + "description": "Only record sessions longer than the minimum duration.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "replay_feature_flag_based_recording", + "name": "Record via feature flag", + "description": "Only record sessions for users that have the flag enabled.", "unit": null, "limit": null, "note": null @@ -1341,7 +1635,7 @@ { "flat_amount_usd": "0", "unit_amount_usd": "0", - "up_to": 1000000, + "up_to": 5000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1349,8 +1643,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.0001", - "up_to": 2000000, + "unit_amount_usd": "0.04", + "up_to": 15000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1358,8 +1652,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000045", - "up_to": 10000000, + "unit_amount_usd": "0.003", + "up_to": 50000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1367,8 +1661,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.000025", - "up_to": 50000000, + "unit_amount_usd": "0.0027", + "up_to": 150000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1376,7 +1670,16 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.00001", + "unit_amount_usd": "0.0025", + "up_to": 500000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.002", "up_to": null, "current_amount_usd": "0.00", "current_usage": 0, @@ -1385,215 +1688,463 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], - "type": "feature_flags", - "free_allocation": 1000000, + "type": "session_replay", + "free_allocation": 5000, "tiers": null, "tiered": true, "unit_amount_usd": null, "current_amount_usd_before_addons": null, "current_amount_usd": null, "current_usage": 0, - "usage_limit": 1000000, + "usage_limit": 5000, "has_exceeded_limit": false, - "percentage_usage": 0, + "percentage_usage": 0.0, "projected_usage": 0, "projected_amount_usd": null, - "unit": "request", + "unit": "recording", "addons": [], "contact_support": false, - "inclusion_only": false + "inclusion_only": false, + "features": [ + { + "key": "recordings_playlists", + "name": "Recording playlists", + "description": "Create playlists of certain session recordings to easily find and watch them again in the future.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "session_replay_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "console_logs", + "name": "Console logs", + "description": "Debug issues faster by browsing the user's console.", + "images": { + "light": "https://posthog.com/images/products/session-replay/console.png", + "dark": "https://posthog.com/images/products/session-replay/console-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "recordings_performance", + "name": "Network performance on recordings", + "description": "See your end-user's network performance and information alongside session recordings.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "session_replay_network_payloads", + "name": "Network monitor", + "description": "Analyze performance and network calls.", + "images": { + "light": "https://posthog.com/images/products/session-replay/network.png", + "dark": "https://posthog.com/images/products/session-replay/network-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "recordings_file_export", + "name": "Download recordings", + "description": "Retain recordings beyond data retention limits.", + "images": null, + "icon_key": "IconDownload", + "type": "secondary" + }, + { + "key": "session_replay_sampling", + "name": "Sample recorded sessions", + "description": "Restrict the percentage of sessions that will be recorded.", + "images": null, + "icon_key": "IconSampling", + "type": "secondary" + }, + { + "key": "replay_recording_duration_minimum", + "name": "Minimum duration", + "description": "Only record sessions longer than the minimum duration.", + "images": null, + "icon_key": "IconClock", + "type": "secondary" + }, + { + "key": "replay_feature_flag_based_recording", + "name": "Record via feature flag", + "description": "Only record sessions for users that have the flag enabled.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "replay_mask_sensitive_data", + "name": "Block sensitive data", + "description": "Disable capturing data from any DOM element with HTML attributes or a customizable config.", + "images": null, + "icon_key": "IconPassword", + "type": "secondary" + }, + { + "key": "replay_sharing_embedding", + "name": "Share and embed", + "description": "Share replays directly via URL or embed via iframe.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "replay_product_analytics_integration", + "name": "Event timeline", + "description": "See a history of everything that happened in a user's session.", + "images": { + "light": "https://posthog.com/images/products/session-replay/timeline.png", + "dark": "https://posthog.com/images/products/session-replay/timeline-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "replay_filter_person_properties", + "name": "Filter person properties", + "description": "Filter by person properties to quickly find relevant recordings.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "replay_filter_events", + "name": "Filter events", + "description": "Filter by events to quickly find relevant recordings.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "replay_dom_explorer", + "name": "DOM Explorer", + "description": "Freeze snapshots of recordings and explore the DOM with your browser dev tools.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "works_with_posthog_js", + "name": "Capture sessions without extra code", + "description": "Works with PostHog.js", + "images": null, + "icon_key": "IconBolt", + "type": "secondary" + }, + { + "key": "replay_automatic_playlists", + "name": "Automatic playlists", + "description": "Filter by user behavior, user properties, or time.", + "images": null, + "icon_key": "IconPlaylist", + "type": "secondary" + } + ] }, { - "name": "Surveys", - "description": "Collect feedback from your users. Multiple choice, rating, open text, and more.", + "name": "Feature flags & A/B testing", + "headline": "Safely roll out features and A/B tests to specific users or groups", + "description": "Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.", "price_description": null, - "usage_key": "survey_responses", - "image_url": "https://posthog.com/images/product/product-icons/surveys.svg", - "icon_key": "IconMessage", - "docs_url": "https://posthog.com/docs/surveys", + "usage_key": "feature_flag_requests", + "image_url": "https://posthog.com/images/products/feature-flags/feature-flags.png", + "screenshot_url": "https://posthog.com/images/products/feature-flags/screenshot-feature-flags.png", + "icon_key": "IconToggle", + "docs_url": "https://posthog.com/docs/feature-flags", "subscribed": false, "plans": [ { - "plan_key": "free-20230928", - "product_key": "surveys", - "name": "Surveys", - "description": "Collect feedback from your users. Multiple choice, rating, open text, and more.", - "image_url": "https://posthog.com/images/product/product-icons/surveys.svg", - "docs_url": "https://posthog.com/docs/surveys", + "plan_key": "free-20230117", + "product_key": "feature_flags", + "name": "Free", + "description": "Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.", + "image_url": "https://posthog.com/images/products/feature-flags/feature-flags.png", + "docs_url": "https://posthog.com/docs/feature-flags", "note": null, - "unit": "survey response", - "free_allocation": 250, + "unit": "request", + "free_allocation": 1000000, "features": [ { - "key": "surveys_unlimited_surveys", - "name": "Unlimited surveys", - "description": "Create as many surveys as you want.", + "key": "boolean_flags", + "name": "Boolean feature flags", + "description": "Turn features on and off for specific users.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_all_question_types", - "name": "All question types", - "description": "Rating scale (for NPS and the like), multiple choice, single choice, emoji rating, link, free text.", + "key": "multivariate_flags", + "name": "Multivariate feature flags & experiments", + "description": "Create three or more variants of a feature flag to test or release different versions of a feature.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_user_targeting", - "name": "User property targeting", - "description": "Target users based on any of their user properties.", + "key": "persist_flags_cross_authentication", + "name": "Persist flags across authentication", + "description": "Persist feature flags across authentication events so that flag values don't change when an anonymous user logs in and becomes identified.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_user_sampling", - "name": "User sampling", - "description": "Sample users to only survey a portion of the users who match the criteria.", + "key": "feature_flag_payloads", + "name": "Test changes without code", + "description": "Use JSON payloads to change text, visuals, or entire blocks of code without subsequent deployments.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_api_mode", - "name": "API mode", - "description": "Create surveys via the API.", + "key": "multiple_release_conditions", + "name": "Multiple release conditions", + "description": "Customize your rollout strategy by user or group properties, cohort, or trafic percentage.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_results_analysis", - "name": "Results analysis", - "description": "Analyze your survey results including completion rates and drop offs.", + "key": "release_condition_overrides", + "name": "Release condition overrides", + "description": "For any release condition, specify which flag value the users or groups in that condition should receive.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_templates", - "name": "Templates", - "description": "Use our templates to get started quickly with NPS, customer satisfaction surveys, user interviews, and more.", + "key": "targeting_by_group", + "name": "Flag targeting by groups", + "description": "Target feature flag release conditions by group properties, not just user properties.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "local_evaluation_and_bootstrapping", + "name": "Local evaluation & bootstrapping", + "description": "Bootstrap flags on initialization so all flags are available immediately, without having to make extra network requests.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "flag_usage_stats", + "name": "Flag usage stats", + "description": "See how many times a flag has been evaluated, how many times each variant has been returned, and what values users received.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "experimentation", + "name": "A/B testing", + "description": "Test changes to your product and evaluate the impacts those changes make.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "funnel_experiments", + "name": "Funnel & trend experiments", + "description": "Measure the impact of a change on a aggregate values or a series of events, like a signup flow.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "secondary_metrics", + "name": "Secondary experiment metrics", + "description": "Track additional metrics to see how your experiment affects other parts of your app or different flows.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "statistical_analysis", + "name": "Statistical analysis", + "description": "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", "unit": null, "limit": null, "note": null + }, + { + "key": "feature_flags_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "year", + "limit": 1, + "note": null } ], "tiers": null, "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { - "plan_key": "paid-20230928", - "product_key": "surveys", - "name": "Surveys", - "description": "Collect feedback from your users. Multiple choice, rating, open text, and more.", - "image_url": "https://posthog.com/images/product/product-icons/surveys.svg", - "docs_url": "https://posthog.com/docs/surveys", + "plan_key": "paid-20230623", + "product_key": "feature_flags", + "name": "Paid", + "description": "Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.", + "image_url": "https://posthog.com/images/products/feature-flags/feature-flags.png", + "docs_url": "https://posthog.com/docs/feature-flags", "note": null, - "unit": "survey response", + "unit": "request", "free_allocation": null, "features": [ { - "key": "surveys_unlimited_surveys", - "name": "Unlimited surveys", - "description": "Create as many surveys as you want.", + "key": "boolean_flags", + "name": "Boolean feature flags", + "description": "Turn features on and off for specific users.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_all_question_types", - "name": "All question types", - "description": "Rating scale (for NPS and the like), multiple choice, single choice, emoji rating, link, free text.", + "key": "multivariate_flags", + "name": "Multivariate feature flags & experiments", + "description": "Create three or more variants of a feature flag to test or release different versions of a feature.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_multiple_questions", - "name": "Multiple questions", - "description": "Create multiple questions in a single survey.", + "key": "persist_flags_cross_authentication", + "name": "Persist flags across authentication", + "description": "Persist feature flags across authentication events so that flag values don't change when an anonymous user logs in and becomes identified.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_user_targeting", - "name": "User property targeting", - "description": "Target users based on any of their user properties.", + "key": "feature_flag_payloads", + "name": "Test changes without code", + "description": "Use JSON payloads to change text, visuals, or entire blocks of code without subsequent deployments.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_user_sampling", - "name": "User sampling", - "description": "Sample users to only survey a portion of the users who match the criteria.", + "key": "multiple_release_conditions", + "name": "Multiple release conditions", + "description": "Customize your rollout strategy by user or group properties, cohort, or trafic percentage.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_styling", - "name": "Custom colors & positioning", - "description": "Customize the colors of your surveys to match your brand and set survey position.", + "key": "release_condition_overrides", + "name": "Release condition overrides", + "description": "For any release condition, specify which flag value the users or groups in that condition should receive.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_text_html", - "name": "Custom HTML text", - "description": "Add custom HTML to your survey text.", + "key": "targeting_by_group", + "name": "Flag targeting by groups", + "description": "Target feature flag release conditions by group properties, not just user properties.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_api_mode", - "name": "API mode", - "description": "Create surveys via the API.", + "key": "local_evaluation_and_bootstrapping", + "name": "Local evaluation & bootstrapping", + "description": "Bootstrap flags on initialization so all flags are available immediately, without having to make extra network requests.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_results_analysis", - "name": "Results analysis", - "description": "Analyze your survey results including completion rates and drop offs.", + "key": "flag_usage_stats", + "name": "Flag usage stats", + "description": "See how many times a flag has been evaluated, how many times each variant has been returned, and what values users received.", "unit": null, "limit": null, "note": null }, { - "key": "surveys_templates", - "name": "Templates", - "description": "Use our templates to get started quickly with NPS, customer satisfaction surveys, user interviews, and more.", + "key": "experimentation", + "name": "A/B testing", + "description": "Test changes to your product and evaluate the impacts those changes make.", "unit": null, "limit": null, "note": null - } - ], - "tiers": [ + }, { - "flat_amount_usd": "0", - "unit_amount_usd": "0", - "up_to": 250, - "current_amount_usd": "0.00", - "current_usage": 0, - "projected_usage": null, - "projected_amount_usd": null + "key": "funnel_experiments", + "name": "Funnel & trend experiments", + "description": "Measure the impact of a change on a aggregate values or a series of events, like a signup flow.", + "unit": null, + "limit": null, + "note": null }, { - "flat_amount_usd": "0", - "unit_amount_usd": "0.2", - "up_to": 500, + "key": "secondary_metrics", + "name": "Secondary experiment metrics", + "description": "Track additional metrics to see how your experiment affects other parts of your app or different flows.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "statistical_analysis", + "name": "Statistical analysis", + "description": "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "group_experiments", + "name": "Group experiments", + "description": "Target experiments to specific groups of users so everyone in the same group gets the same variant.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "multiple_environments", + "name": "Multi-environment support", + "description": "Test flags in local development or staging by using the same flag key across PostHog projects.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "feature_flags_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "years", + "limit": 7, + "note": null + } + ], + "tiers": [ + { + "flat_amount_usd": "0", + "unit_amount_usd": "0", + "up_to": 1000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1601,8 +2152,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.1", - "up_to": 1000, + "unit_amount_usd": "0.0001", + "up_to": 2000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1610,8 +2161,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.035", - "up_to": 10000, + "unit_amount_usd": "0.000045", + "up_to": 10000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1619,8 +2170,8 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.015", - "up_to": 20000, + "unit_amount_usd": "0.000025", + "up_to": 50000000, "current_amount_usd": "0.00", "current_usage": 0, "projected_usage": null, @@ -1628,7 +2179,7 @@ }, { "flat_amount_usd": "0", - "unit_amount_usd": "0.01", + "unit_amount_usd": "0.00001", "up_to": null, "current_amount_usd": "0.00", "current_usage": 0, @@ -1637,224 +2188,612 @@ } ], "current_plan": false, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null } ], - "type": "surveys", - "free_allocation": 250, + "type": "feature_flags", + "free_allocation": 1000000, "tiers": null, "tiered": true, "unit_amount_usd": null, "current_amount_usd_before_addons": null, "current_amount_usd": null, "current_usage": 0, - "usage_limit": 250, + "usage_limit": 1000000, "has_exceeded_limit": false, - "percentage_usage": 0, + "percentage_usage": 0.0, "projected_usage": 0, "projected_amount_usd": null, - "unit": "survey response", + "unit": "request", "addons": [], "contact_support": false, - "inclusion_only": false + "inclusion_only": false, + "features": [ + { + "key": "boolean_flags", + "name": "Boolean feature flags", + "description": "Turn features on and off for specific users.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "feature_flags_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "multivariate_flags", + "name": "Multivariate feature flags & experiments", + "description": "Create three or more variants of a feature flag to test or release different versions of a feature.", + "images": { + "light": "https://posthog.com/images/products/feature-flags/multivariate.png", + "dark": "https://posthog.com/images/products/feature-flags/multivariate-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "persist_flags_cross_authentication", + "name": "Persist flags across authentication", + "description": "Persist feature flags across authentication events so that flag values don't change when an anonymous user logs in and becomes identified.", + "images": null, + "icon_key": "IconUnlock", + "type": "secondary" + }, + { + "key": "feature_flag_payloads", + "name": "Test changes without code", + "description": "Use JSON payloads to change text, visuals, or entire blocks of code without subsequent deployments.", + "images": { + "light": "https://posthog.com/images/products/feature-flags/payloads.png", + "dark": "https://posthog.com/images/products/feature-flags/payloads-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "multiple_release_conditions", + "name": "Multiple release conditions", + "description": "Customize your rollout strategy by user or group properties, cohort, or trafic percentage.", + "images": { + "light": "https://posthog.com/images/products/feature-flags/release-conditions.png", + "dark": "https://posthog.com/images/products/feature-flags/release-conditions-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "release_condition_overrides", + "name": "Release condition overrides", + "description": "For any release condition, specify which flag value the users or groups in that condition should receive.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "targeting_by_group", + "name": "Flag targeting by groups", + "description": "Target feature flag release conditions by group properties, not just user properties.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "local_evaluation_and_bootstrapping", + "name": "Local evaluation & bootstrapping", + "description": "Bootstrap flags on initialization so all flags are available immediately, without having to make extra network requests.", + "images": null, + "icon_key": "IconDecisionTree", + "type": "secondary" + }, + { + "key": "flag_usage_stats", + "name": "Flag usage stats", + "description": "See how many times a flag has been evaluated, how many times each variant has been returned, and what values users received.", + "images": { + "light": "https://posthog.com/images/products/feature-flags/reports.png", + "dark": "https://posthog.com/images/products/feature-flags/reports-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "multiple_environments", + "name": "Multi-environment support", + "description": "Test flags in local development or staging by using the same flag key across PostHog projects.", + "images": null, + "icon_key": "IconStack", + "type": "secondary" + }, + { + "key": "user_opt_in", + "name": "Early access feature opt-in widget", + "description": "Allow users to opt in to (or out of) specified features. Or use the API to build your own UI.", + "images": { + "light": "https://posthog.com/images/products/feature-flags/early-access.png", + "dark": "https://posthog.com/images/products/feature-flags/early-access-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "instant_rollbacks", + "name": "Instant rollbacks", + "description": "Disable a feature without touching your codebase.", + "images": null, + "icon_key": "IconRevert", + "type": "secondary" + }, + { + "key": "experimentation", + "name": "A/B testing", + "description": "Test changes to your product and evaluate the impacts those changes make.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "group_experiments", + "name": "Group experiments", + "description": "Target experiments to specific groups of users so everyone in the same group gets the same variant.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "funnel_experiments", + "name": "Funnel & trend experiments", + "description": "Measure the impact of a change on a aggregate values or a series of events, like a signup flow.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "secondary_metrics", + "name": "Secondary experiment metrics", + "description": "Track additional metrics to see how your experiment affects other parts of your app or different flows.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "statistical_analysis", + "name": "Statistical analysis", + "description": "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", + "images": null, + "icon_key": null, + "type": null + } + ] }, { - "name": "Data warehouse", - "description": "A single source for all your important data. This product is in beta. Pricing will be changing.", + "name": "Surveys", + "headline": "Ask anything with no-code surveys", + "description": "Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.", "price_description": null, - "usage_key": "synced_rows", - "image_url": "https://posthog.com/images/product/product-icons/data-warehouse.svg", - "icon_key": "IconServer", - "docs_url": "https://posthog.com/docs/data-warehouse", + "usage_key": "survey_responses", + "image_url": "https://posthog.com/images/products/surveys/surveys.png", + "screenshot_url": "https://posthog.com/images/products/surveys/screenshot-surveys.png", + "icon_key": "IconMessage", + "docs_url": "https://posthog.com/docs/surveys", "subscribed": false, "plans": [ { - "plan_key": "free-20231026", - "product_key": "data_warehouse", - "name": "Data warehouse", - "description": "A single source for all your important data. This product is in beta. Pricing will be changing.", - "image_url": "https://posthog.com/images/product/product-icons/data-warehouse.svg", - "docs_url": "https://posthog.com/docs/data-warehouse", + "plan_key": "free-20230928", + "product_key": "surveys", + "name": "Free", + "description": "Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.", + "image_url": "https://posthog.com/images/products/surveys/surveys.png", + "docs_url": "https://posthog.com/docs/surveys", "note": null, - "unit": "row", - "free_allocation": null, + "unit": "survey response", + "free_allocation": 250, "features": [ { - "key": "data_warehouse_manual_sync", - "name": "Manual sync", - "description": "Sync your data to the warehouse using your cloud storage provider.", + "key": "surveys_unlimited_surveys", + "name": "Unlimited surveys", + "description": "Create as many surveys as you want.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "surveys_all_question_types", + "name": "All question types", + "description": "Rating scale (for NPS and the like), multiple choice, single choice, emoji rating, link, free text.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "surveys_user_targeting", + "name": "Advanced user targeting", + "description": "Target by URL, user property, or feature flag when used with Feature flags.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "surveys_user_sampling", + "name": "User sampling", + "description": "Sample users to only survey a portion of the users who match the criteria.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "surveys_api_mode", + "name": "API mode", + "description": "Using PostHog.js? No more code required. But if want to create your own UI, we have a full API.", "unit": null, "limit": null, "note": null }, { - "key": "data_warehouse_unified_querying", - "name": "Unified querying", - "description": "Query all your business and product data directly inside PostHog.", + "key": "surveys_results_analysis", + "name": "Aggregated results", + "description": "See feedback summarized and broken down per response, plus completion rates and drop offs.", "unit": null, "limit": null, "note": null }, { - "key": "data_warehouse_insights_visualization", - "name": "Insights", - "description": "Create insights from the data you import and add them to your PostHog dashboards.", + "key": "surveys_templates", + "name": "Templates", + "description": "Use our templates to get started quickly with NPS, customer satisfaction surveys, user interviews, and more.", "unit": null, "limit": null, "note": null + }, + { + "key": "surveys_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "year", + "limit": 1, + "note": null } ], "tiers": null, "current_plan": true, - "included_if": null + "included_if": null, + "contact_support": null, + "unit_amount_usd": null }, { - "plan_key": "paid-20231026", - "product_key": "data_warehouse", - "name": "Data warehouse", - "description": "A single source for all your important data. This product is in beta. Pricing will be changing.", - "image_url": "https://posthog.com/images/product/product-icons/data-warehouse.svg", - "docs_url": "https://posthog.com/docs/data-warehouse", + "plan_key": "paid-20230928", + "product_key": "surveys", + "name": "Paid", + "description": "Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.", + "image_url": "https://posthog.com/images/products/surveys/surveys.png", + "docs_url": "https://posthog.com/docs/surveys", "note": null, - "unit": "row", + "unit": "survey response", "free_allocation": null, "features": [ { - "key": "data_warehouse_manual_sync", - "name": "Manual sync", - "description": "Sync your data to the warehouse using your cloud storage provider.", + "key": "surveys_unlimited_surveys", + "name": "Unlimited surveys", + "description": "Create as many surveys as you want.", "unit": null, "limit": null, "note": null }, { - "key": "data_warehouse_one_click_sync", - "name": "One-Click sync", - "description": "Sync your data to the warehouse with one click.", + "key": "surveys_all_question_types", + "name": "All question types", + "description": "Rating scale (for NPS and the like), multiple choice, single choice, emoji rating, link, free text.", "unit": null, "limit": null, "note": null }, { - "key": "data_warehouse_unified_querying", - "name": "Unified querying", - "description": "Query all your business and product data directly inside PostHog.", + "key": "surveys_multiple_questions", + "name": "Multiple questions", + "description": "Ask up to 10 questions in a single survey.", "unit": null, "limit": null, "note": null }, { - "key": "data_warehouse_insights_visualization", - "name": "Insights", - "description": "Create insights from the data you import and add them to your PostHog dashboards.", + "key": "surveys_user_targeting", + "name": "Advanced user targeting", + "description": "Target by URL, user property, or feature flag when used with Feature flags.", "unit": null, "limit": null, "note": null - } - ], - "tiers": [ + }, { - "flat_amount_usd": "0", - "unit_amount_usd": "0.000015", - "up_to": null, - "current_amount_usd": "0.00", - "current_usage": 0, - "projected_usage": null, - "projected_amount_usd": null - } - ], - "current_plan": false, - "included_if": null - } - ], - "type": "data_warehouse", - "free_allocation": 0, - "tiers": null, - "tiered": false, - "unit_amount_usd": null, - "current_amount_usd_before_addons": null, - "current_amount_usd": null, - "current_usage": 0, - "usage_limit": 0, - "has_exceeded_limit": false, - "percentage_usage": 0, - "projected_usage": 0, - "projected_amount_usd": null, - "unit": "row", - "addons": [], - "contact_support": false, - "inclusion_only": false - }, - { - "name": "Integrations + CDP", - "description": "Connect PostHog to your favorite tools.", - "price_description": null, - "usage_key": null, - "image_url": "https://posthog.com/images/product/product-icons/integrations.svg", - "icon_key": "IconBolt", - "docs_url": "https://posthog.com/docs/apps", - "subscribed": null, - "plans": [ - { - "plan_key": "free-20230117", - "product_key": "integrations", - "name": "Integrations + CDP", - "description": "Connect PostHog to your favorite tools.", - "image_url": "https://posthog.com/images/product/product-icons/integrations.svg", - "docs_url": "https://posthog.com/docs/apps", - "note": null, - "unit": null, - "free_allocation": null, - "features": [ + "key": "surveys_user_sampling", + "name": "User sampling", + "description": "Sample users to only survey a portion of the users who match the criteria.", + "unit": null, + "limit": null, + "note": null + }, { - "key": "zapier", - "name": "Zapier", - "description": "Zapier lets you connect PostHog with thousands of the most popular apps, so you can automate your work and have more time for what matters most—no code required.", + "key": "surveys_styling", + "name": "Custom colors & positioning", + "description": "Customize the colors of your surveys to match your brand and set survey position.", "unit": null, "limit": null, "note": null }, { - "key": "slack_integration", - "name": "Slack", - "description": "Get notified about new actions in Slack.", + "key": "surveys_text_html", + "name": "Custom HTML text", + "description": "Add custom HTML to your survey text.", "unit": null, "limit": null, "note": null }, { - "key": "microsoft_teams_integration", - "name": "Microsoft Teams", - "description": "Get notified about new actions in Microsoft Teams.", + "key": "surveys_api_mode", + "name": "API mode", + "description": "Using PostHog.js? No more code required. But if want to create your own UI, we have a full API.", "unit": null, "limit": null, "note": null }, { - "key": "discord_integration", - "name": "Discord", - "description": "Get notified about new actions in Discord.", + "key": "surveys_results_analysis", + "name": "Aggregated results", + "description": "See feedback summarized and broken down per response, plus completion rates and drop offs.", "unit": null, "limit": null, "note": null }, { - "key": "apps", - "name": "CDP + Apps library", - "description": "Connect your data with 50+ apps including BigQuery, Redshift, and more.", + "key": "surveys_templates", + "name": "Templates", + "description": "Use our templates to get started quickly with NPS, customer satisfaction surveys, user interviews, and more.", "unit": null, "limit": null, "note": null + }, + { + "key": "surveys_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "unit": "years", + "limit": 7, + "note": null } ], - "tiers": null, - "current_plan": false, - "included_if": "no_active_subscription" - }, - { - "plan_key": "paid-20230117", + "tiers": [ + { + "flat_amount_usd": "0", + "unit_amount_usd": "0", + "up_to": 250, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.2", + "up_to": 500, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.1", + "up_to": 1000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.035", + "up_to": 10000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.015", + "up_to": 20000, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + }, + { + "flat_amount_usd": "0", + "unit_amount_usd": "0.01", + "up_to": null, + "current_amount_usd": "0.00", + "current_usage": 0, + "projected_usage": null, + "projected_amount_usd": null + } + ], + "current_plan": false, + "included_if": null, + "contact_support": null, + "unit_amount_usd": null + } + ], + "type": "surveys", + "free_allocation": 250, + "tiers": null, + "tiered": true, + "unit_amount_usd": null, + "current_amount_usd_before_addons": null, + "current_amount_usd": null, + "current_usage": 0, + "usage_limit": 250, + "has_exceeded_limit": false, + "percentage_usage": 0.0, + "projected_usage": 0, + "projected_amount_usd": null, + "unit": "survey response", + "addons": [], + "contact_support": false, + "inclusion_only": false, + "features": [ + { + "key": "surveys_unlimited_surveys", + "name": "Unlimited surveys", + "description": "Create as many surveys as you want.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "surveys_all_question_types", + "name": "All question types", + "description": "Rating scale (for NPS and the like), multiple choice, single choice, emoji rating, link, free text.", + "images": { + "light": "https://posthog.com/images/products/surveys/question-types.png", + "dark": "https://posthog.com/images/products/surveys/question-types-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "surveys_multiple_questions", + "name": "Multiple questions", + "description": "Ask up to 10 questions in a single survey.", + "images": { + "light": "https://posthog.com/images/products/surveys/steps.png", + "dark": "https://posthog.com/images/products/surveys/steps-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "surveys_user_targeting", + "name": "Advanced user targeting", + "description": "Target by URL, user property, or feature flag when used with Feature flags.", + "images": { + "light": "https://posthog.com/images/products/surveys/targeting.png", + "dark": "https://posthog.com/images/products/surveys/targeting-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "surveys_user_sampling", + "name": "User sampling", + "description": "Sample users to only survey a portion of the users who match the criteria.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "surveys_styling", + "name": "Custom colors & positioning", + "description": "Customize the colors of your surveys to match your brand and set survey position.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "surveys_text_html", + "name": "Custom HTML text", + "description": "Add custom HTML to your survey text.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "surveys_api_mode", + "name": "API mode", + "description": "Using PostHog.js? No more code required. But if want to create your own UI, we have a full API.", + "images": { + "light": "https://posthog.com/images/products/surveys/api.png", + "dark": "https://posthog.com/images/products/surveys/api-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "surveys_results_analysis", + "name": "Aggregated results", + "description": "See feedback summarized and broken down per response, plus completion rates and drop offs.", + "images": null, + "icon_key": "IconPieChart", + "type": "secondary" + }, + { + "key": "surveys_templates", + "name": "Templates", + "description": "Use our templates to get started quickly with NPS, customer satisfaction surveys, user interviews, and more.", + "images": { + "light": "https://posthog.com/images/products/surveys/templates.png", + "dark": "https://posthog.com/images/products/surveys/templates-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "surveys_data_retention", + "name": "Data retention", + "description": "Keep a historical record of your data.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "surveys_link_question_type", + "name": "Link somewhere", + "description": "Send users to a webpage or invite them to book a meeting with a calendar invite.", + "images": { + "light": "https://posthog.com/images/products/surveys/link-scheduler.png", + "dark": "https://posthog.com/images/products/surveys/link-scheduler-dark.png" + }, + "icon_key": null, + "type": "primary" + }, + { + "key": "surveys_slack_notifications", + "name": "Slack notifications", + "description": "Send realtime survey responses to a Slack channel.", + "images": null, + "icon_key": "IconNotification", + "type": "secondary" + }, + { + "key": "surveys_wait_periods", + "name": "Customizable wait periods", + "description": "Set a delay before a survey opens.", + "images": null, + "icon_key": "IconClock", + "type": "secondary" + } + ] + }, + { + "name": "Integrations", + "headline": null, + "description": "Connect PostHog to your favorite tools.", + "price_description": null, + "usage_key": null, + "image_url": "https://posthog.com/images/product/product-icons/integrations.svg", + "screenshot_url": null, + "icon_key": "IconBolt", + "docs_url": "https://posthog.com/docs/apps", + "subscribed": null, + "plans": [ + { + "plan_key": "free-20230117", "product_key": "integrations", - "name": "Integrations + CDP", + "name": "Free", "description": "Connect PostHog to your favorite tools.", "image_url": "https://posthog.com/images/product/product-icons/integrations.svg", "docs_url": "https://posthog.com/docs/apps", @@ -1871,83 +2810,545 @@ "note": null }, { - "key": "slack_integration", - "name": "Slack", - "description": "Get notified about new actions in Slack.", + "key": "slack_integration", + "name": "Slack", + "description": "Get notified about new actions in Slack.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "microsoft_teams_integration", + "name": "Microsoft Teams", + "description": "Get notified about new actions in Microsoft Teams.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "discord_integration", + "name": "Discord", + "description": "Get notified about new actions in Discord.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "apps", + "name": "Apps", + "description": "Use apps to transform, filter, and modify your incoming data. (Export apps not included, see the Data pipelines addon for product analytics.)", + "unit": null, + "limit": null, + "note": null + } + ], + "tiers": null, + "current_plan": false, + "included_if": "no_active_subscription", + "contact_support": null, + "unit_amount_usd": null + }, + { + "plan_key": "paid-20230117", + "product_key": "integrations", + "name": "Paid", + "description": "Connect PostHog to your favorite tools.", + "image_url": "https://posthog.com/images/product/product-icons/integrations.svg", + "docs_url": "https://posthog.com/docs/apps", + "note": null, + "unit": null, + "free_allocation": null, + "features": [ + { + "key": "zapier", + "name": "Zapier", + "description": "Zapier lets you connect PostHog with thousands of the most popular apps, so you can automate your work and have more time for what matters most—no code required.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "slack_integration", + "name": "Slack", + "description": "Get notified about new actions in Slack.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "microsoft_teams_integration", + "name": "Microsoft Teams", + "description": "Get notified about new actions in Microsoft Teams.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "discord_integration", + "name": "Discord", + "description": "Get notified about new actions in Discord.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "apps", + "name": "Apps", + "description": "Use apps to transform, filter, and modify your incoming data. (Export apps not included, see the Data pipelines addon for product analytics.)", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "app_metrics", + "name": "App metrics", + "description": "Get metrics on your apps to see their usage, reliability, and more.", + "unit": null, + "limit": null, + "note": null + } + ], + "tiers": null, + "current_plan": true, + "included_if": "has_subscription", + "contact_support": null, + "unit_amount_usd": null + } + ], + "type": "integrations", + "free_allocation": 0, + "tiers": null, + "tiered": false, + "unit_amount_usd": null, + "current_amount_usd_before_addons": null, + "current_amount_usd": null, + "current_usage": 0, + "usage_limit": 0, + "has_exceeded_limit": false, + "percentage_usage": 0, + "projected_usage": 0, + "projected_amount_usd": null, + "unit": null, + "addons": [], + "contact_support": false, + "inclusion_only": true, + "features": [ + { + "key": "apps", + "name": "Apps", + "description": "Use apps to transform, filter, and modify your incoming data. (Export apps not included, see the Data pipelines addon for product analytics.)", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "slack_integration", + "name": "Slack", + "description": "Get notified about new actions in Slack.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "microsoft_teams_integration", + "name": "Microsoft Teams", + "description": "Get notified about new actions in Microsoft Teams.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "discord_integration", + "name": "Discord", + "description": "Get notified about new actions in Discord.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "zapier", + "name": "Zapier", + "description": "Zapier lets you connect PostHog with thousands of the most popular apps, so you can automate your work and have more time for what matters most—no code required.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "app_metrics", + "name": "App metrics", + "description": "Get metrics on your apps to see their usage, reliability, and more.", + "images": null, + "icon_key": null, + "type": null + } + ] + }, + { + "name": "Platform and support", + "headline": null, + "description": "SSO, permission management, and support.", + "price_description": null, + "usage_key": null, + "image_url": "https://posthog.com/images/product/product-icons/platform.svg", + "screenshot_url": null, + "icon_key": "IconStack", + "docs_url": "https://posthog.com/docs", + "subscribed": null, + "plans": [ + { + "plan_key": "free-20230117", + "product_key": "platform_and_support", + "name": "Totally free", + "description": "SSO, permission management, and support.", + "image_url": "https://posthog.com/images/product/product-icons/platform.svg", + "docs_url": "https://posthog.com/docs", + "note": null, + "unit": null, + "free_allocation": null, + "features": [ + { + "key": "tracked_users", + "name": "Tracked users", + "description": "Track users across devices and sessions.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "team_members", + "name": "Team members", + "description": "PostHog doesn't charge per seat add your entire team!", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "organizations_projects", + "name": "Projects", + "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "unit": "project", + "limit": 1, + "note": null + }, + { + "key": "api_access", + "name": "API access", + "description": "Access your data via our developer-friendly API.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "social_sso", + "name": "SSO via Google, Github, or Gitlab", + "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "community_support", + "name": "Community support", + "description": "Get help from other users and PostHog team members in our Community forums.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "unit": null, + "limit": null, + "note": null + } + ], + "tiers": null, + "current_plan": false, + "included_if": "no_active_subscription", + "contact_support": null, + "unit_amount_usd": null + }, + { + "plan_key": "paid-20240208", + "product_key": "platform_and_support", + "name": "With subscription", + "description": "SSO, permission management, and support.", + "image_url": "https://posthog.com/images/product/product-icons/platform.svg", + "docs_url": "https://posthog.com/docs", + "note": null, + "unit": null, + "free_allocation": null, + "features": [ + { + "key": "tracked_users", + "name": "Tracked users", + "description": "Track users across devices and sessions.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "team_members", + "name": "Team members", + "description": "PostHog doesn't charge per seat add your entire team!", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "organizations_projects", + "name": "Projects", + "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "unit": "projects", + "limit": 2, + "note": null + }, + { + "key": "api_access", + "name": "API access", + "description": "Access your data via our developer-friendly API.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "social_sso", + "name": "SSO via Google, Github, or Gitlab", + "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "community_support", + "name": "Community support", + "description": "Get help from other users and PostHog team members in our Community forums.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "dedicated_support", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", + "unit": null, + "limit": null, + "note": "$2k+/month spend" + }, + { + "key": "email_support", + "name": "Email support", + "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "unit": null, + "limit": null, + "note": null + } + ], + "tiers": null, + "current_plan": true, + "included_if": "has_subscription", + "contact_support": null, + "unit_amount_usd": null + }, + { + "plan_key": "teams-20240208", + "product_key": "platform_and_support", + "name": "Teams", + "description": "SSO, permission management, and support.", + "image_url": "https://posthog.com/images/product/product-icons/platform.svg", + "docs_url": "https://posthog.com/docs", + "note": null, + "unit": null, + "free_allocation": null, + "features": [ + { + "key": "tracked_users", + "name": "Tracked users", + "description": "Track users across devices and sessions.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "team_members", + "name": "Team members", + "description": "PostHog doesn't charge per seat add your entire team!", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "organizations_projects", + "name": "Projects", + "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "api_access", + "name": "API access", + "description": "Access your data via our developer-friendly API.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "social_sso", + "name": "SSO via Google, Github, or Gitlab", + "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "sso_enforcement", + "name": "Enforce SSO login", + "description": "Users can only sign up and log in to your PostHog organization with your specified SSO provider.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "2fa_enforcement", + "name": "Enforce 2FA", + "description": "Require all users in your organization to enable two-factor authentication.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "community_support", + "name": "Community support", + "description": "Get help from other users and PostHog team members in our Community forums.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "email_support", + "name": "Email support", + "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "dedicated_support", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", + "unit": null, + "limit": null, + "note": "$2k+/month spend" + }, + { + "key": "priority_support", + "name": "Priority support", + "description": "Get help from our team faster than other customers.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "white_labelling", + "name": "White labeling", + "description": "Use your own branding on surveys, shared dashboards, shared insights, and more.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "project_based_permissioning", + "name": "Project permissions", + "description": "Restrict access to data within the organization to only those who need it.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "advanced_permissions", + "name": "Advanced permissions", + "description": "Control who can access and modify data and features within your organization.", + "unit": null, + "limit": null, + "note": "Project-based only" + }, + { + "key": "audit_logs", + "name": "Audit logs", + "description": "See who in your organization has accessed or modified entities within PostHog.", + "unit": null, + "limit": null, + "note": "Basic" + }, + { + "key": "security_assessment", + "name": "Security assessment", + "description": "Security assessment", "unit": null, "limit": null, "note": null }, { - "key": "microsoft_teams_integration", - "name": "Microsoft Teams", - "description": "Get notified about new actions in Microsoft Teams.", + "key": "hipaa_baa", + "name": "HIPAA BAA", + "description": "Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.", "unit": null, "limit": null, "note": null }, { - "key": "discord_integration", - "name": "Discord", - "description": "Get notified about new actions in Discord.", + "key": "team_collaboration", + "name": "Team collaboration features", + "description": "Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.", "unit": null, "limit": null, "note": null }, { - "key": "apps", - "name": "CDP + Apps library", - "description": "Connect your data with 50+ apps including BigQuery, Redshift, and more.", + "key": "ingestion_taxonomy", + "name": "Ingestion taxonomy", + "description": "Mark events as verified or unverified to help you understand the quality of your data.", "unit": null, "limit": null, "note": null }, { - "key": "app_metrics", - "name": "App metrics", - "description": "Get metrics on your apps to see their usage, reliability, and more.", + "key": "tagging", + "name": "Dashboard tags", + "description": "Organize dashboards with tags.", "unit": null, "limit": null, "note": null } ], - "tiers": null, - "current_plan": true, - "included_if": "has_subscription" - } - ], - "type": "integrations", - "free_allocation": 0, - "tiers": null, - "tiered": false, - "unit_amount_usd": null, - "current_amount_usd_before_addons": null, - "current_amount_usd": null, - "current_usage": 0, - "usage_limit": 0, - "has_exceeded_limit": false, - "percentage_usage": 0, - "projected_usage": 0, - "projected_amount_usd": null, - "unit": null, - "addons": [], - "contact_support": false, - "inclusion_only": true - }, - { - "name": "Platform and support", - "description": "SSO, permission management, and support.", - "price_description": null, - "usage_key": null, - "image_url": "https://posthog.com/images/product/product-icons/platform.svg", - "icon_key": "IconStack", - "docs_url": "https://posthog.com/docs", - "subscribed": null, - "plans": [ + "tiers": [], + "current_plan": false, + "included_if": null, + "contact_support": null, + "unit_amount_usd": "450.00" + }, { - "plan_key": "free-20230117", + "plan_key": "enterprise-20240208", "product_key": "platform_and_support", - "name": "Platform and support", + "name": "Enterprise", "description": "SSO, permission management, and support.", "image_url": "https://posthog.com/images/product/product-icons/platform.svg", "docs_url": "https://posthog.com/docs", @@ -1955,6 +3356,22 @@ "unit": null, "free_allocation": null, "features": [ + { + "key": "team_members", + "name": "Team members", + "description": "PostHog doesn't charge per seat add your entire team!", + "unit": null, + "limit": null, + "note": "Unlimited" + }, + { + "key": "organizations_projects", + "name": "Projects", + "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "unit": null, + "limit": null, + "note": "Unlimited" + }, { "key": "tracked_users", "name": "Tracked users", @@ -1964,33 +3381,41 @@ "note": "Unlimited" }, { - "key": "data_retention", - "name": "Data retention", - "description": "Keep a historical record of your data.", - "unit": "year", - "limit": 1, + "key": "api_access", + "name": "API access", + "description": "Access your data via our developer-friendly API.", + "unit": null, + "limit": null, "note": null }, { - "key": "team_members", - "name": "Team members", - "description": "PostHog doesn't charge per seat add your entire team!", + "key": "white_labelling", + "name": "White labeling", + "description": "Use your own branding on surveys, shared dashboards, shared insights, and more.", "unit": null, "limit": null, - "note": "Unlimited" + "note": null }, { - "key": "organizations_projects", - "name": "Projects", - "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", - "unit": "project", - "limit": 1, + "key": "team_collaboration", + "name": "Team collaboration features", + "description": "Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.", + "unit": null, + "limit": null, "note": null }, { - "key": "api_access", - "name": "API access", - "description": "Access your data via our developer-friendly API.", + "key": "ingestion_taxonomy", + "name": "Ingestion taxonomy", + "description": "Mark events as verified or unverified to help you understand the quality of your data.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "tagging", + "name": "Dashboard tags", + "description": "Organize dashboards with tags.", "unit": null, "limit": null, "note": null @@ -2004,97 +3429,81 @@ "note": null }, { - "key": "community_support", - "name": "Community support", - "description": "Get help from other users and PostHog team members in our Community forums.", + "key": "sso_enforcement", + "name": "Enforce SSO login", + "description": "Users can only sign up and log in to your PostHog organization with your specified SSO provider.", "unit": null, "limit": null, "note": null }, { - "key": "terms_and_conditions", - "name": "Terms and conditions", - "description": "Terms and conditions", + "key": "saml", + "name": "SAML SSO", + "description": "Allow your organization's users to log in with SAML.", "unit": null, "limit": null, - "note": "Standard" - } - ], - "tiers": null, - "current_plan": false, - "included_if": "no_active_subscription" - }, - { - "plan_key": "paid-20230926", - "product_key": "platform_and_support", - "name": "Platform and support", - "description": "SSO, permission management, and support.", - "image_url": "https://posthog.com/images/product/product-icons/platform.svg", - "docs_url": "https://posthog.com/docs", - "note": null, - "unit": null, - "free_allocation": null, - "features": [ + "note": null + }, { - "key": "tracked_users", - "name": "Tracked users", - "description": "Track users across devices and sessions.", + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", "unit": null, "limit": null, - "note": "Unlimited" + "note": null }, { - "key": "data_retention", - "name": "Data retention", - "description": "Keep a historical record of your data.", + "key": "2fa_enforcement", + "name": "Enforce 2FA", + "description": "Require all users in your organization to enable two-factor authentication.", "unit": null, "limit": null, - "note": "7 years" + "note": null }, { - "key": "team_members", - "name": "Team members", - "description": "PostHog doesn't charge per seat add your entire team!", + "key": "project_based_permissioning", + "name": "Project permissions", + "description": "Restrict access to data within the organization to only those who need it.", "unit": null, "limit": null, - "note": "Unlimited" + "note": null }, { - "key": "organizations_projects", - "name": "Projects", - "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "key": "role_based_access", + "name": "Role-based access", + "description": "Control access to features like experiments, session recordings, and feature flags with custom roles.", "unit": null, "limit": null, - "note": "Unlimited" + "note": null }, { - "key": "api_access", - "name": "API access", - "description": "Access your data via our developer-friendly API.", + "key": "advanced_permissions", + "name": "Advanced permissions", + "description": "Control who can access and modify data and features within your organization.", "unit": null, "limit": null, "note": null }, { - "key": "social_sso", - "name": "SSO via Google, Github, or Gitlab", - "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "key": "audit_logs", + "name": "Audit logs", + "description": "See who in your organization has accessed or modified entities within PostHog.", "unit": null, "limit": null, - "note": null + "note": "Advanced" }, { - "key": "project_based_permissioning", - "name": "Project permissions", - "description": "Restrict access to data within the organization to only those who need it.", + "key": "hipaa_baa", + "name": "HIPAA BAA", + "description": "Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.", "unit": null, "limit": null, "note": null }, { - "key": "white_labelling", - "name": "White labeling", - "description": "Use your own branding in your PostHog organization.", + "key": "custom_msa", + "name": "Custom MSA", + "description": "Get a custom Master Services Agreement (MSA) to use PostHog in a way that fits your company's needs.", "unit": null, "limit": null, "note": null @@ -2108,28 +3517,28 @@ "note": null }, { - "key": "dedicated_support", - "name": "Slack (dedicated channel)", - "description": "Get help directly from our support team in a dedicated Slack channel shared between you and the PostHog team.", + "key": "email_support", + "name": "Email support", + "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", "unit": null, "limit": null, - "note": "$2k/month spend or above" + "note": null }, { - "key": "email_support", - "name": "Direct access to engineers", - "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "key": "dedicated_support", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", "unit": null, "limit": null, "note": null }, { - "key": "terms_and_conditions", - "name": "Terms and conditions", - "description": "Terms and conditions", + "key": "priority_support", + "name": "Priority support", + "description": "Get help from our team faster than other customers.", "unit": null, "limit": null, - "note": "Standard" + "note": null }, { "key": "security_assessment", @@ -2138,11 +3547,29 @@ "unit": null, "limit": null, "note": null + }, + { + "key": "training", + "name": "Ongoing training", + "description": "Get training from our team to help you quickly get up and running with PostHog.", + "unit": null, + "limit": null, + "note": null + }, + { + "key": "configuration_support", + "name": "Personalized onboarding", + "description": "Get help from our team to create dashboards that will help you understand your data and your business.", + "unit": null, + "limit": null, + "note": null } ], "tiers": null, - "current_plan": true, - "included_if": "has_subscription" + "current_plan": false, + "included_if": null, + "contact_support": true, + "unit_amount_usd": null } ], "type": "platform_and_support", @@ -2160,8 +3587,250 @@ "projected_amount_usd": null, "unit": null, "addons": [], - "contact_support": true, - "inclusion_only": true + "contact_support": false, + "inclusion_only": true, + "features": [ + { + "key": "tracked_users", + "name": "Tracked users", + "description": "Track users across devices and sessions.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "team_members", + "name": "Team members", + "description": "PostHog doesn't charge per seat add your entire team!", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "api_access", + "name": "API access", + "description": "Access your data via our developer-friendly API.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "organizations_projects", + "name": "Projects", + "description": "Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "social_sso", + "name": "SSO via Google, Github, or Gitlab", + "description": "Log in to PostHog with your Google, Github, or Gitlab account.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "role_based_access", + "name": "Role-based access", + "description": "Control access to features like experiments, session recordings, and feature flags with custom roles.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "project_based_permissioning", + "name": "Project permissions", + "description": "Restrict access to data within the organization to only those who need it.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "advanced_permissions", + "name": "Advanced permissions", + "description": "Control who can access and modify data and features within your organization.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "saml", + "name": "SAML SSO", + "description": "Allow your organization's users to log in with SAML.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "sso_enforcement", + "name": "Enforce SSO login", + "description": "Users can only sign up and log in to your PostHog organization with your specified SSO provider.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "2fa", + "name": "2FA", + "description": "Secure your PostHog account with two-factor authentication.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "2fa_enforcement", + "name": "Enforce 2FA", + "description": "Require all users in your organization to enable two-factor authentication.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "white_labelling", + "name": "White labeling", + "description": "Use your own branding on surveys, shared dashboards, shared insights, and more.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "community_support", + "name": "Community support", + "description": "Get help from other users and PostHog team members in our Community forums.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "dedicated_support", + "name": "Dedicated account manager", + "description": "Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "email_support", + "name": "Email support", + "description": "Get help directly from our product engineers via email. No wading through multiple support people before you get help.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "priority_support", + "name": "Priority support", + "description": "Get help from our team faster than other customers.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "training", + "name": "Ongoing training", + "description": "Get training from our team to help you quickly get up and running with PostHog.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "configuration_support", + "name": "Personalized onboarding", + "description": "Get help from our team to create dashboards that will help you understand your data and your business.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "terms_and_conditions", + "name": "Terms and conditions", + "description": "Terms and conditions", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "security_assessment", + "name": "Security assessment", + "description": "Security assessment", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "bespoke_pricing", + "name": "Bespoke pricing", + "description": "Custom pricing to fit your company's needs.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "invoice_payments", + "name": "Payment via invoicing", + "description": "Pay for your PostHog subscription via invoice.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "support_slas", + "name": "Support SLAs", + "description": "Support SLAs", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "audit_logs", + "name": "Audit logs", + "description": "See who in your organization has accessed or modified entities within PostHog.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "hipaa_baa", + "name": "HIPAA BAA", + "description": "Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "custom_msa", + "name": "Custom MSA", + "description": "Get a custom Master Services Agreement (MSA) to use PostHog in a way that fits your company's needs.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "team_collaboration", + "name": "Team collaboration features", + "description": "Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "ingestion_taxonomy", + "name": "Ingestion taxonomy", + "description": "Mark events as verified or unverified to help you understand the quality of your data.", + "images": null, + "icon_key": null, + "type": null + }, + { + "key": "tagging", + "name": "Dashboard tags", + "description": "Organize dashboards with tags.", + "images": null, + "icon_key": null, + "type": null + } + ] } ], "custom_limits_usd": {}, @@ -2172,7 +3841,7 @@ }, "recordings": { "usage": 0, - "limit": 15000 + "limit": 5000 }, "feature_flag_requests": { "usage": 0, @@ -2181,10 +3850,6 @@ "survey_responses": { "usage": 0, "limit": 250 - }, - "synced_rows": { - "usage": 0, - "limit": 0 } }, "free_trial_until": null, @@ -2192,5 +3857,11 @@ "discount_amount_usd": null, "amount_off_expires_at": null, "never_drop_data": null, - "stripe_portal_url": "https://billing.stripe.com/p/session/test_YWNjdF8xSElNRERFdUlhdFJYU2R6LF9PdXdxeDNqcktEWWdEM1FhalNRNmNCdTZCaUJsVVBi01006f6sniQg" + "customer_trust_scores": { + "surveys": 0, + "feature_flags": 0, + "session_replay": 3, + "product_analytics": 3 + }, + "stripe_portal_url": "https://billing.stripe.com/p/session/test_YWNjdF8xSElNRERFdUlhdFJYU2R6LF9QaEVpVHFJNXdKYk9DaG04SVhMaUV4TDlxOTR1WEZi0100SMJCDr2e" } diff --git a/frontend/src/mocks/fixtures/_billing_v2.tsx b/frontend/src/mocks/fixtures/_billing_v2.tsx index 017c2ed16bc6b..4c4ee10716fbc 100644 --- a/frontend/src/mocks/fixtures/_billing_v2.tsx +++ b/frontend/src/mocks/fixtures/_billing_v2.tsx @@ -3,25 +3,26 @@ import { dayjs } from 'lib/dayjs' import { BillingV2Type } from '~/types' export const billingJson: BillingV2Type = { - customer_id: 'cus_PRQtW3VM1Kiw7e', + customer_id: 'cus_Pg7PIL8MsKi6bx', deactivated: false, has_active_subscription: true, billing_period: { - current_period_start: dayjs('2023-05-01T23:59:59Z'), - current_period_end: dayjs('2023-06-01T23:59:59Z'), + current_period_start: dayjs('2024-03-07T22:54:32Z'), + current_period_end: dayjs('2024-04-07T22:54:32Z'), interval: 'month', }, - current_total_amount_usd: '403.07', - current_total_amount_usd_after_discount: '403.07', + current_total_amount_usd: '0.00', + current_total_amount_usd_after_discount: '0.00', products: [ { name: 'Product analytics', - headline: null, - description: 'Trends, funnels, path analysis, CDP + more.', + headline: 'Product analytics with autocapture', + description: + 'A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.', price_description: null, usage_key: 'events', image_url: 'https://posthog.com/images/products/product-analytics/product-analytics.png', - screenshot_url: null, + screenshot_url: 'https://posthog.com/images/products/product-analytics/screenshot-product-analytics.png', icon_key: 'IconGraph', docs_url: 'https://posthog.com/docs/product-analytics', subscribed: true, @@ -29,9 +30,10 @@ export const billingJson: BillingV2Type = { { plan_key: 'free-20230117', product_key: 'product_analytics', - name: 'Product analytics', - description: 'Trends, funnels, path analysis, CDP + more.', - image_url: 'https://posthog.com/images/product/product-icons/product-analytics.svg', + name: 'Free', + description: + 'A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.', + image_url: 'https://posthog.com/images/products/product-analytics/product-analytics.png', docs_url: 'https://posthog.com/docs/product-analytics', note: null, unit: 'event', @@ -49,7 +51,8 @@ export const billingJson: BillingV2Type = { { key: 'funnels', name: 'Funnels', - description: 'Visualize user dropoff between a sequence of events.', + description: + 'Visualize user dropoff between a sequence of events. See conversion rate over time, use flexible step ordering, set exclusion steps, and more.', unit: null, limit: null, note: null, @@ -64,7 +67,7 @@ export const billingJson: BillingV2Type = { }, { key: 'paths', - name: 'Paths', + name: 'User paths', description: 'Limited paths excludes: customizing path insights by setting the maximum number of paths, number of people on each path, how path names appear', unit: null, @@ -83,13 +86,16 @@ export const billingJson: BillingV2Type = { tiers: null, current_plan: false, included_if: null, + contact_support: null, + unit_amount_usd: null, }, { plan_key: 'paid-20240111', product_key: 'product_analytics', - name: 'Product analytics', - description: 'Trends, funnels, path analysis, CDP + more.', - image_url: 'https://posthog.com/images/product/product-icons/product-analytics.svg', + name: 'Paid', + description: + 'A comprehensive product analytics platform built to natively work with session replay, feature flags, A/B testing, and surveys.', + image_url: 'https://posthog.com/images/products/product-analytics/product-analytics.png', docs_url: 'https://posthog.com/docs/product-analytics', note: null, unit: 'event', @@ -107,7 +113,8 @@ export const billingJson: BillingV2Type = { { key: 'funnels', name: 'Funnels', - description: 'Visualize user dropoff between a sequence of events.', + description: + 'Visualize user dropoff between a sequence of events. See conversion rate over time, use flexible step ordering, set exclusion steps, and more.', unit: null, limit: null, note: null, @@ -122,7 +129,7 @@ export const billingJson: BillingV2Type = { }, { key: 'paths', - name: 'Paths', + name: 'User paths', description: 'Limited paths excludes: customizing path insights by setting the maximum number of paths, number of people on each path, how path names appear', unit: null, @@ -147,32 +154,6 @@ export const billingJson: BillingV2Type = { limit: null, note: null, }, - { - key: 'advanced_permissions', - name: 'Dashboard permissions', - description: - 'Restrict access to dashboards within the organization to only those who need it.', - unit: null, - limit: null, - note: null, - }, - { - key: 'team_collaboration', - name: 'Tags & text cards', - description: - 'Keep organized by adding tags to your dashboards, cohorts and more. Add text cards and descriptions to your dashboards to provide context to your team.', - unit: null, - limit: null, - note: null, - }, - { - key: 'ingestion_taxonomy', - name: 'Ingestion taxonomy', - description: 'Ingestion taxonomy', - unit: null, - limit: null, - note: null, - }, { key: 'correlation_analysis', name: 'Correlation analysis', @@ -182,19 +163,11 @@ export const billingJson: BillingV2Type = { limit: null, note: null, }, - { - key: 'tagging', - name: 'Dashboard tags', - description: 'Organize dashboards with tags.', - unit: null, - limit: null, - note: null, - }, { key: 'behavioral_cohort_filtering', - name: 'Lifecycle cohorts', + name: 'Lifecycle', description: - 'Group users based on their long term behavior, such as whether they frequently performed an event, or have recently stopped performing an event.', + 'Discover how your active users break down, highlighting those who have recently stopped being active or those who have just become active for the first time.', unit: null, limit: null, note: null, @@ -275,6 +248,8 @@ export const billingJson: BillingV2Type = { ], current_plan: true, included_if: null, + contact_support: null, + unit_amount_usd: null, }, ], type: 'product_analytics', @@ -285,9 +260,9 @@ export const billingJson: BillingV2Type = { unit_amount_usd: '0', up_to: 1000000, current_amount_usd: '0.00', - current_usage: 882128, - projected_usage: 1000000, - projected_amount_usd: '0.00', + current_usage: 0, + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -295,8 +270,8 @@ export const billingJson: BillingV2Type = { up_to: 2000000, current_amount_usd: '0.00', current_usage: 0, - projected_usage: 1000000, - projected_amount_usd: '310.00', + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -304,8 +279,8 @@ export const billingJson: BillingV2Type = { up_to: 15000000, current_amount_usd: '0.00', current_usage: 0, - projected_usage: 5000000, - projected_amount_usd: '650.00', + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -348,12 +323,12 @@ export const billingJson: BillingV2Type = { unit_amount_usd: null, current_amount_usd_before_addons: '0.00', current_amount_usd: '0.00', - current_usage: 882128, - usage_limit: 3624548, + current_usage: 0, + usage_limit: null, has_exceeded_limit: false, - percentage_usage: 0.4423939206, - projected_usage: 7000000, - projected_amount_usd: '960.00', + percentage_usage: 0, + projected_usage: 0, + projected_amount_usd: '0.00', unit: 'event', addons: [ { @@ -371,9 +346,9 @@ export const billingJson: BillingV2Type = { unit_amount_usd: '0', up_to: 1000000, current_amount_usd: '0.00', - current_usage: 882128, - projected_usage: 1000000, - projected_amount_usd: '0.00', + current_usage: 0, + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -381,8 +356,8 @@ export const billingJson: BillingV2Type = { up_to: 2000000, current_amount_usd: '0.00', current_usage: 0, - projected_usage: 1000000, - projected_amount_usd: '70.8', + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -390,8 +365,8 @@ export const billingJson: BillingV2Type = { up_to: 15000000, current_amount_usd: '0.00', current_usage: 0, - projected_usage: 1910636, - projected_amount_usd: '57.32', + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -436,14 +411,14 @@ export const billingJson: BillingV2Type = { unit: 'event', unit_amount_usd: null, current_amount_usd: null, - current_usage: 882128, - projected_usage: 3910636, - projected_amount_usd: '128.12', + current_usage: 0, + projected_usage: 0, + projected_amount_usd: '0.00', plans: [ { plan_key: 'addon-20230509', product_key: 'group_analytics', - name: 'Group analytics', + name: 'Addon', description: 'Associate events with a group or entity - such as a company, community, or project. Analyze these events as if they were sent by that entity itself. Great for B2B, marketplaces, and more.', image_url: 'https://posthog.com/images/product/product-icons/group-analytics.svg', @@ -527,11 +502,13 @@ export const billingJson: BillingV2Type = { projected_amount_usd: null, }, ], - current_plan: false, + current_plan: true, included_if: null, + contact_support: null, + unit_amount_usd: null, }, ], - contact_support: false, + contact_support: null, }, { name: 'Data pipelines', @@ -620,7 +597,7 @@ export const billingJson: BillingV2Type = { { plan_key: 'addon-20240111', product_key: 'data_pipelines', - name: 'Data pipelines', + name: 'Addon', description: 'Get your PostHog data into your data warehouse or other tools like BigQuery, Redshift, Customer.io, and more.', image_url: null, @@ -706,9 +683,11 @@ export const billingJson: BillingV2Type = { ], current_plan: false, included_if: null, + contact_support: null, + unit_amount_usd: null, }, ], - contact_support: false, + contact_support: null, }, ], contact_support: false, @@ -780,31 +759,6 @@ export const billingJson: BillingV2Type = { icon_key: 'IconNotification', type: 'secondary', }, - { - key: 'team_collaboration', - name: 'Tags & text cards', - description: - 'Keep organized by adding tags to your dashboards, cohorts and more. Add text cards and descriptions to your dashboards to provide context to your team.', - images: null, - icon_key: null, - type: null, - }, - { - key: 'advanced_permissions', - name: 'Dashboard permissions', - description: 'Restrict access to dashboards within the organization to only those who need it.', - images: null, - icon_key: null, - type: null, - }, - { - key: 'ingestion_taxonomy', - name: 'Ingestion taxonomy', - description: 'Ingestion taxonomy', - images: null, - icon_key: null, - type: null, - }, { key: 'paths_advanced', name: 'Advanced paths', @@ -826,14 +780,6 @@ export const billingJson: BillingV2Type = { icon_key: null, type: 'primary', }, - { - key: 'tagging', - name: 'Dashboard tags', - description: 'Organize dashboards with tags.', - images: null, - icon_key: null, - type: null, - }, { key: 'behavioral_cohort_filtering', name: 'Lifecycle', @@ -899,13 +845,13 @@ export const billingJson: BillingV2Type = { }, { name: 'Session replay', - headline: null, + headline: 'Watch how users experience your app', description: - 'Searchable recordings of people using your app or website with console logs and behavioral bucketing.', + 'Session replay helps you diagnose issues and understand user behavior in your product or website.', price_description: null, usage_key: 'recordings', - image_url: 'https://posthog.com/images/product/product-icons/session-replay.svg', - screenshot_url: null, + image_url: 'https://posthog.com/images/products/session-replay/session-replay.png', + screenshot_url: 'https://posthog.com/images/products/session-replay/screenshot-session-replay.png', icon_key: 'IconRewindPlay', docs_url: 'https://posthog.com/docs/session-replay', subscribed: true, @@ -913,10 +859,10 @@ export const billingJson: BillingV2Type = { { plan_key: 'free-20231218', product_key: 'session_replay', - name: 'Session replay', + name: 'Free', description: - 'Searchable recordings of people using your app or website with console logs and behavioral bucketing.', - image_url: 'https://posthog.com/images/product/product-icons/session-replay.svg', + 'Session replay helps you diagnose issues and understand user behavior in your product or website.', + image_url: 'https://posthog.com/images/products/session-replay/session-replay.png', docs_url: 'https://posthog.com/docs/session-replay', note: null, unit: 'recording', @@ -925,7 +871,7 @@ export const billingJson: BillingV2Type = { { key: 'console_logs', name: 'Console logs', - description: "Diagnose issues by inspecting errors in the user's network console", + description: "Debug issues faster by browsing the user's console.", unit: null, limit: null, note: null, @@ -941,9 +887,8 @@ export const billingJson: BillingV2Type = { }, { key: 'session_replay_network_payloads', - name: 'Network payload capture', - description: - 'Capture and analyze network requests and response payloads and headers for each session recording.', + name: 'Network monitor', + description: 'Analyze performance and network calls.', unit: null, limit: null, note: null, @@ -967,7 +912,7 @@ export const billingJson: BillingV2Type = { }, { key: 'replay_mask_sensitive_data', - name: 'Mask sensitive data', + name: 'Block sensitive data', description: 'Disable capturing data from any DOM element with HTML attributes or a customizable config.', unit: null, @@ -984,9 +929,8 @@ export const billingJson: BillingV2Type = { }, { key: 'replay_product_analytics_integration', - name: 'Product analytics integration', - description: - 'Jump into a playlist of session recordings directly from any time series in a graph. See when events happen in your recording timeline.', + name: 'Event timeline', + description: "See a history of everything that happened in a user's session.", unit: null, limit: null, note: null, @@ -1044,14 +988,16 @@ export const billingJson: BillingV2Type = { tiers: null, current_plan: false, included_if: null, + contact_support: null, + unit_amount_usd: null, }, { plan_key: 'paid-20231218', product_key: 'session_replay', - name: 'Session replay', + name: 'Paid', description: - 'Searchable recordings of people using your app or website with console logs and behavioral bucketing.', - image_url: 'https://posthog.com/images/product/product-icons/session-replay.svg', + 'Session replay helps you diagnose issues and understand user behavior in your product or website.', + image_url: 'https://posthog.com/images/products/session-replay/session-replay.png', docs_url: 'https://posthog.com/docs/session-replay', note: null, unit: 'recording', @@ -1060,7 +1006,7 @@ export const billingJson: BillingV2Type = { { key: 'console_logs', name: 'Console logs', - description: "Diagnose issues by inspecting errors in the user's network console", + description: "Debug issues faster by browsing the user's console.", unit: null, limit: null, note: null, @@ -1085,17 +1031,16 @@ export const billingJson: BillingV2Type = { }, { key: 'session_replay_network_payloads', - name: 'Network payload capture', - description: - 'Capture and analyze network requests and response payloads and headers for each session recording.', + name: 'Network monitor', + description: 'Analyze performance and network calls.', unit: null, limit: null, note: null, }, { key: 'recordings_file_export', - name: 'Recordings file export', - description: 'Save session recordings as a file to your local filesystem.', + name: 'Download recordings', + description: 'Retain recordings beyond data retention limits.', unit: null, limit: null, note: null, @@ -1110,7 +1055,7 @@ export const billingJson: BillingV2Type = { }, { key: 'replay_mask_sensitive_data', - name: 'Mask sensitive data', + name: 'Block sensitive data', description: 'Disable capturing data from any DOM element with HTML attributes or a customizable config.', unit: null, @@ -1127,9 +1072,8 @@ export const billingJson: BillingV2Type = { }, { key: 'replay_product_analytics_integration', - name: 'Product analytics integration', - description: - 'Jump into a playlist of session recordings directly from any time series in a graph. See when events happen in your recording timeline.', + name: 'Event timeline', + description: "See a history of everything that happened in a user's session.", unit: null, limit: null, note: null, @@ -1191,7 +1135,7 @@ export const billingJson: BillingV2Type = { up_to: 5000, current_amount_usd: '0.00', current_usage: 0, - projected_usage: 0, + projected_usage: null, projected_amount_usd: null, }, { @@ -1242,37 +1186,39 @@ export const billingJson: BillingV2Type = { ], current_plan: true, included_if: null, + contact_support: null, + unit_amount_usd: null, }, ], type: 'session_replay', - free_allocation: 5000, + free_allocation: 0, tiers: [ { flat_amount_usd: '0', unit_amount_usd: '0', up_to: 5000, current_amount_usd: '0.00', - current_usage: 5000, - projected_usage: 5000, - projected_amount_usd: '0.00', + current_usage: 0, + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', unit_amount_usd: '0.04', up_to: 15000, current_amount_usd: '0.00', - current_usage: 10000, - projected_usage: 10000, - projected_amount_usd: '400.00', + current_usage: 0, + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', unit_amount_usd: '0.003', up_to: 50000, current_amount_usd: '0.00', - current_usage: 1022, - projected_usage: 35000, - projected_amount_usd: '105', + current_usage: 0, + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -1280,8 +1226,8 @@ export const billingJson: BillingV2Type = { up_to: 150000, current_amount_usd: '0.00', current_usage: 0, - projected_usage: 100000, - projected_amount_usd: '270.00', + projected_usage: null, + projected_amount_usd: null, }, { flat_amount_usd: '0', @@ -1304,14 +1250,14 @@ export const billingJson: BillingV2Type = { ], tiered: true, unit_amount_usd: null, - current_amount_usd_before_addons: null, - current_amount_usd: '403.07', - current_usage: 16022, - usage_limit: 100000, + current_amount_usd_before_addons: '0.00', + current_amount_usd: '0.00', + current_usage: 0, + usage_limit: null, has_exceeded_limit: false, - percentage_usage: 0.16022, - projected_usage: 50000, - projected_amount_usd: '775.00', + percentage_usage: 0, + projected_usage: 0, + projected_amount_usd: '0.00', unit: 'recording', addons: [], contact_support: false, @@ -1469,12 +1415,13 @@ export const billingJson: BillingV2Type = { }, { name: 'Feature flags & A/B testing', - headline: null, - description: 'Safely roll out new features and run experiments on changes.', + headline: 'Safely roll out features and A/B tests to specific users or groups', + description: + 'Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.', price_description: null, usage_key: 'feature_flag_requests', - image_url: 'https://posthog.com/images/product/product-icons/feature-flags.svg', - screenshot_url: null, + image_url: 'https://posthog.com/images/products/feature-flags/feature-flags.png', + screenshot_url: 'https://posthog.com/images/products/feature-flags/screenshot-feature-flags.png', icon_key: 'IconToggle', docs_url: 'https://posthog.com/docs/feature-flags', subscribed: false, @@ -1482,9 +1429,10 @@ export const billingJson: BillingV2Type = { { plan_key: 'free-20230117', product_key: 'feature_flags', - name: 'Feature flags & A/B testing', - description: 'Safely roll out new features and run experiments on changes.', - image_url: 'https://posthog.com/images/product/product-icons/feature-flags.svg', + name: 'Free', + description: + 'Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.', + image_url: 'https://posthog.com/images/products/feature-flags/feature-flags.png', docs_url: 'https://posthog.com/docs/feature-flags', note: null, unit: 'request', @@ -1498,6 +1446,15 @@ export const billingJson: BillingV2Type = { limit: null, note: null, }, + { + key: 'multivariate_flags', + name: 'Multivariate feature flags & experiments', + description: + 'Create three or more variants of a feature flag to test or release different versions of a feature.', + unit: null, + limit: null, + note: null, + }, { key: 'persist_flags_cross_authentication', name: 'Persist flags across authentication', @@ -1509,9 +1466,9 @@ export const billingJson: BillingV2Type = { }, { key: 'feature_flag_payloads', - name: 'Payloads', + name: 'Test changes without code', description: - 'Send additional pieces of information (any valid JSON) to your app when a flag is matched for a user.', + 'Use JSON payloads to change text, visuals, or entire blocks of code without subsequent deployments.', unit: null, limit: null, note: null, @@ -1520,7 +1477,7 @@ export const billingJson: BillingV2Type = { key: 'multiple_release_conditions', name: 'Multiple release conditions', description: - 'Target multiple groups of users with different release conditions for the same feature flag.', + 'Customize your rollout strategy by user or group properties, cohort, or trafic percentage.', unit: null, limit: null, note: null, @@ -1561,6 +1518,41 @@ export const billingJson: BillingV2Type = { limit: null, note: null, }, + { + key: 'experimentation', + name: 'A/B testing', + description: 'Test changes to your product and evaluate the impacts those changes make.', + unit: null, + limit: null, + note: null, + }, + { + key: 'funnel_experiments', + name: 'Funnel & trend experiments', + description: + 'Measure the impact of a change on a aggregate values or a series of events, like a signup flow.', + unit: null, + limit: null, + note: null, + }, + { + key: 'secondary_metrics', + name: 'Secondary experiment metrics', + description: + 'Track additional metrics to see how your experiment affects other parts of your app or different flows.', + unit: null, + limit: null, + note: null, + }, + { + key: 'statistical_analysis', + name: 'Statistical analysis', + description: + "Get a statistical analysis of your experiment results to see if the results are significant, or if they're likely just due to chance.", + unit: null, + limit: null, + note: null, + }, { key: 'feature_flags_data_retention', name: 'Data retention', @@ -1573,13 +1565,16 @@ export const billingJson: BillingV2Type = { tiers: null, current_plan: true, included_if: null, + contact_support: null, + unit_amount_usd: null, }, { plan_key: 'paid-20230623', product_key: 'feature_flags', - name: 'Feature flags & A/B testing', - description: 'Safely roll out new features and run experiments on changes.', - image_url: 'https://posthog.com/images/product/product-icons/feature-flags.svg', + name: 'Paid', + description: + 'Test changes with small groups of users before rolling out wider. Analyze usage with product analytics and session replay.', + image_url: 'https://posthog.com/images/products/feature-flags/feature-flags.png', docs_url: 'https://posthog.com/docs/feature-flags', note: null, unit: 'request', @@ -1613,9 +1608,9 @@ export const billingJson: BillingV2Type = { }, { key: 'feature_flag_payloads', - name: 'Payloads', + name: 'Test changes without code', description: - 'Send additional pieces of information (any valid JSON) to your app when a flag is matched for a user.', + 'Use JSON payloads to change text, visuals, or entire blocks of code without subsequent deployments.', unit: null, limit: null, note: null, @@ -1624,7 +1619,7 @@ export const billingJson: BillingV2Type = { key: 'multiple_release_conditions', name: 'Multiple release conditions', description: - 'Target multiple groups of users with different release conditions for the same feature flag.', + 'Customize your rollout strategy by user or group properties, cohort, or trafic percentage.', unit: null, limit: null, note: null, @@ -1673,15 +1668,6 @@ export const billingJson: BillingV2Type = { limit: null, note: null, }, - { - key: 'group_experiments', - name: 'Group experiments', - description: - 'Target experiments to specific groups of users so everyone in the same group gets the same variant.', - unit: null, - limit: null, - note: null, - }, { key: 'funnel_experiments', name: 'Funnel & trend experiments', @@ -1709,6 +1695,24 @@ export const billingJson: BillingV2Type = { limit: null, note: null, }, + { + key: 'group_experiments', + name: 'Group experiments', + description: + 'Target experiments to specific groups of users so everyone in the same group gets the same variant.', + unit: null, + limit: null, + note: null, + }, + { + key: 'multiple_environments', + name: 'Multi-environment support', + description: + 'Test flags in local development or staging by using the same flag key across PostHog projects.', + unit: null, + limit: null, + note: null, + }, { key: 'feature_flags_data_retention', name: 'Data retention', @@ -1767,6 +1771,8 @@ export const billingJson: BillingV2Type = { ], current_plan: false, included_if: null, + contact_support: null, + unit_amount_usd: null, }, ], type: 'feature_flags', @@ -1964,12 +1970,13 @@ export const billingJson: BillingV2Type = { }, { name: 'Surveys', - headline: null, - description: 'Collect feedback from your users. Multiple choice, rating, open text, and more.', + headline: 'Ask anything with no-code surveys', + description: + 'Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.', price_description: null, usage_key: 'survey_responses', - image_url: 'https://posthog.com/images/product/product-icons/surveys.svg', - screenshot_url: null, + image_url: 'https://posthog.com/images/products/surveys/surveys.png', + screenshot_url: 'https://posthog.com/images/products/surveys/screenshot-surveys.png', icon_key: 'IconMessage', docs_url: 'https://posthog.com/docs/surveys', subscribed: false, @@ -1977,9 +1984,10 @@ export const billingJson: BillingV2Type = { { plan_key: 'free-20230928', product_key: 'surveys', - name: 'Surveys', - description: 'Collect feedback from your users. Multiple choice, rating, open text, and more.', - image_url: 'https://posthog.com/images/product/product-icons/surveys.svg', + name: 'Free', + description: + 'Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.', + image_url: 'https://posthog.com/images/products/surveys/surveys.png', docs_url: 'https://posthog.com/docs/surveys', note: null, unit: 'survey response', @@ -2004,8 +2012,8 @@ export const billingJson: BillingV2Type = { }, { key: 'surveys_user_targeting', - name: 'User property targeting', - description: 'Target users based on any of their user properties.', + name: 'Advanced user targeting', + description: 'Target by URL, user property, or feature flag when used with Feature flags.', unit: null, limit: null, note: null, @@ -2021,15 +2029,17 @@ export const billingJson: BillingV2Type = { { key: 'surveys_api_mode', name: 'API mode', - description: 'Create surveys via the API.', + description: + 'Using PostHog.js? No more code required. But if want to create your own UI, we have a full API.', unit: null, limit: null, note: null, }, { key: 'surveys_results_analysis', - name: 'Results analysis', - description: 'Analyze your survey results including completion rates and drop offs.', + name: 'Aggregated results', + description: + 'See feedback summarized and broken down per response, plus completion rates and drop offs.', unit: null, limit: null, note: null, @@ -2055,13 +2065,16 @@ export const billingJson: BillingV2Type = { tiers: null, current_plan: true, included_if: null, + contact_support: null, + unit_amount_usd: null, }, { plan_key: 'paid-20230928', product_key: 'surveys', - name: 'Surveys', - description: 'Collect feedback from your users. Multiple choice, rating, open text, and more.', - image_url: 'https://posthog.com/images/product/product-icons/surveys.svg', + name: 'Paid', + description: + 'Build in-app popups with freeform text responses, multiple choice, NPS, ratings, and emoji reactions. Or use the API for complete control.', + image_url: 'https://posthog.com/images/products/surveys/surveys.png', docs_url: 'https://posthog.com/docs/surveys', note: null, unit: 'survey response', @@ -2087,15 +2100,15 @@ export const billingJson: BillingV2Type = { { key: 'surveys_multiple_questions', name: 'Multiple questions', - description: 'Create multiple questions in a single survey.', + description: 'Ask up to 10 questions in a single survey.', unit: null, limit: null, note: null, }, { key: 'surveys_user_targeting', - name: 'User property targeting', - description: 'Target users based on any of their user properties.', + name: 'Advanced user targeting', + description: 'Target by URL, user property, or feature flag when used with Feature flags.', unit: null, limit: null, note: null, @@ -2128,15 +2141,17 @@ export const billingJson: BillingV2Type = { { key: 'surveys_api_mode', name: 'API mode', - description: 'Create surveys via the API.', + description: + 'Using PostHog.js? No more code required. But if want to create your own UI, we have a full API.', unit: null, limit: null, note: null, }, { key: 'surveys_results_analysis', - name: 'Results analysis', - description: 'Analyze your survey results including completion rates and drop offs.', + name: 'Aggregated results', + description: + 'See feedback summarized and broken down per response, plus completion rates and drop offs.', unit: null, limit: null, note: null, @@ -2217,6 +2232,8 @@ export const billingJson: BillingV2Type = { ], current_plan: false, included_if: null, + contact_support: null, + unit_amount_usd: null, }, ], type: 'surveys', @@ -2388,7 +2405,7 @@ export const billingJson: BillingV2Type = { { plan_key: 'free-20230117', product_key: 'integrations', - name: 'Integrations', + name: 'Free', description: 'Connect PostHog to your favorite tools.', image_url: 'https://posthog.com/images/product/product-icons/integrations.svg', docs_url: 'https://posthog.com/docs/apps', @@ -2442,11 +2459,13 @@ export const billingJson: BillingV2Type = { tiers: null, current_plan: false, included_if: 'no_active_subscription', + contact_support: null, + unit_amount_usd: null, }, { plan_key: 'paid-20230117', product_key: 'integrations', - name: 'Integrations', + name: 'Paid', description: 'Connect PostHog to your favorite tools.', image_url: 'https://posthog.com/images/product/product-icons/integrations.svg', docs_url: 'https://posthog.com/docs/apps', @@ -2508,6 +2527,8 @@ export const billingJson: BillingV2Type = { tiers: null, current_plan: true, included_if: 'has_subscription', + contact_support: null, + unit_amount_usd: null, }, ], type: 'integrations', @@ -2595,7 +2616,7 @@ export const billingJson: BillingV2Type = { { plan_key: 'free-20230117', product_key: 'platform_and_support', - name: 'Platform and support', + name: 'Totally free', description: 'SSO, permission management, and support.', image_url: 'https://posthog.com/images/product/product-icons/platform.svg', docs_url: 'https://posthog.com/docs', @@ -2653,22 +2674,24 @@ export const billingJson: BillingV2Type = { note: null, }, { - key: 'terms_and_conditions', - name: 'Terms and conditions', - description: 'Terms and conditions', + key: '2fa', + name: '2FA', + description: 'Secure your PostHog account with two-factor authentication.', unit: null, limit: null, - note: 'Standard', + note: null, }, ], tiers: null, current_plan: false, included_if: 'no_active_subscription', + contact_support: null, + unit_amount_usd: null, }, { - plan_key: 'paid-20230926', + plan_key: 'paid-20240208', product_key: 'platform_and_support', - name: 'Platform and support', + name: 'With subscription', description: 'SSO, permission management, and support.', image_url: 'https://posthog.com/images/product/product-icons/platform.svg', docs_url: 'https://posthog.com/docs', @@ -2697,9 +2720,9 @@ export const billingJson: BillingV2Type = { name: 'Projects', description: 'Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.', - unit: null, - limit: null, - note: 'Unlimited', + unit: 'projects', + limit: 2, + note: null, }, { key: 'api_access', @@ -2717,22 +2740,6 @@ export const billingJson: BillingV2Type = { limit: null, note: null, }, - { - key: 'project_based_permissioning', - name: 'Project permissions', - description: 'Restrict access to data within the organization to only those who need it.', - unit: null, - limit: null, - note: null, - }, - { - key: 'white_labelling', - name: 'White labeling', - description: 'Use your own branding in your PostHog organization.', - unit: null, - limit: null, - note: null, - }, { key: 'community_support', name: 'Community support', @@ -2743,16 +2750,16 @@ export const billingJson: BillingV2Type = { }, { key: 'dedicated_support', - name: 'Slack (dedicated channel)', + name: 'Dedicated account manager', description: - 'Get help directly from our support team in a dedicated Slack channel shared between you and the PostHog team.', + 'Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.', unit: null, limit: null, - note: '$2k/month spend or above', + note: '$2k+/month spend', }, { key: 'email_support', - name: 'Direct access to engineers', + name: 'Email support', description: 'Get help directly from our product engineers via email. No wading through multiple support people before you get help.', unit: null, @@ -2760,17 +2767,9 @@ export const billingJson: BillingV2Type = { note: null, }, { - key: 'terms_and_conditions', - name: 'Terms and conditions', - description: 'Terms and conditions', - unit: null, - limit: null, - note: 'Standard', - }, - { - key: 'security_assessment', - name: 'Security assessment', - description: 'Security assessment', + key: '2fa', + name: '2FA', + description: 'Secure your PostHog account with two-factor authentication.', unit: null, limit: null, note: null, @@ -2779,32 +2778,470 @@ export const billingJson: BillingV2Type = { tiers: null, current_plan: true, included_if: 'has_subscription', + contact_support: null, + unit_amount_usd: null, }, - ], - type: 'platform_and_support', - free_allocation: 0, - tiers: null, - tiered: false, - unit_amount_usd: null, - current_amount_usd_before_addons: null, - current_amount_usd: null, - current_usage: 0, - usage_limit: 0, - has_exceeded_limit: false, - percentage_usage: 0, - projected_usage: 0, - projected_amount_usd: null, - unit: null, - addons: [], - contact_support: true, - inclusion_only: true, - features: [ { - key: 'tracked_users', - name: 'Tracked users', - description: 'Track users across devices and sessions.', - images: null, - icon_key: null, + plan_key: 'teams-20240208', + product_key: 'platform_and_support', + name: 'Teams', + description: 'SSO, permission management, and support.', + image_url: 'https://posthog.com/images/product/product-icons/platform.svg', + docs_url: 'https://posthog.com/docs', + note: null, + unit: null, + free_allocation: null, + features: [ + { + key: 'tracked_users', + name: 'Tracked users', + description: 'Track users across devices and sessions.', + unit: null, + limit: null, + note: 'Unlimited', + }, + { + key: 'team_members', + name: 'Team members', + description: "PostHog doesn't charge per seat add your entire team!", + unit: null, + limit: null, + note: 'Unlimited', + }, + { + key: 'organizations_projects', + name: 'Projects', + description: + 'Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.', + unit: null, + limit: null, + note: 'Unlimited', + }, + { + key: 'api_access', + name: 'API access', + description: 'Access your data via our developer-friendly API.', + unit: null, + limit: null, + note: null, + }, + { + key: 'social_sso', + name: 'SSO via Google, Github, or Gitlab', + description: 'Log in to PostHog with your Google, Github, or Gitlab account.', + unit: null, + limit: null, + note: null, + }, + { + key: 'sso_enforcement', + name: 'Enforce SSO login', + description: + 'Users can only sign up and log in to your PostHog organization with your specified SSO provider.', + unit: null, + limit: null, + note: null, + }, + { + key: '2fa', + name: '2FA', + description: 'Secure your PostHog account with two-factor authentication.', + unit: null, + limit: null, + note: null, + }, + { + key: '2fa_enforcement', + name: 'Enforce 2FA', + description: 'Require all users in your organization to enable two-factor authentication.', + unit: null, + limit: null, + note: null, + }, + { + key: 'community_support', + name: 'Community support', + description: 'Get help from other users and PostHog team members in our Community forums.', + unit: null, + limit: null, + note: null, + }, + { + key: 'email_support', + name: 'Email support', + description: + 'Get help directly from our product engineers via email. No wading through multiple support people before you get help.', + unit: null, + limit: null, + note: null, + }, + { + key: 'dedicated_support', + name: 'Dedicated account manager', + description: + 'Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.', + unit: null, + limit: null, + note: '$2k+/month spend', + }, + { + key: 'priority_support', + name: 'Priority support', + description: 'Get help from our team faster than other customers.', + unit: null, + limit: null, + note: null, + }, + { + key: 'white_labelling', + name: 'White labeling', + description: + 'Use your own branding on surveys, shared dashboards, shared insights, and more.', + unit: null, + limit: null, + note: null, + }, + { + key: 'project_based_permissioning', + name: 'Project permissions', + description: 'Restrict access to data within the organization to only those who need it.', + unit: null, + limit: null, + note: null, + }, + { + key: 'advanced_permissions', + name: 'Advanced permissions', + description: + 'Control who can access and modify data and features within your organization.', + unit: null, + limit: null, + note: 'Project-based only', + }, + { + key: 'audit_logs', + name: 'Audit logs', + description: + 'See who in your organization has accessed or modified entities within PostHog.', + unit: null, + limit: null, + note: 'Basic', + }, + { + key: 'security_assessment', + name: 'Security assessment', + description: 'Security assessment', + unit: null, + limit: null, + note: null, + }, + { + key: 'hipaa_baa', + name: 'HIPAA BAA', + description: + 'Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.', + unit: null, + limit: null, + note: null, + }, + { + key: 'team_collaboration', + name: 'Team collaboration features', + description: + 'Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.', + unit: null, + limit: null, + note: null, + }, + { + key: 'ingestion_taxonomy', + name: 'Ingestion taxonomy', + description: + 'Mark events as verified or unverified to help you understand the quality of your data.', + unit: null, + limit: null, + note: null, + }, + { + key: 'tagging', + name: 'Dashboard tags', + description: 'Organize dashboards with tags.', + unit: null, + limit: null, + note: null, + }, + ], + tiers: [], + current_plan: false, + included_if: null, + contact_support: null, + unit_amount_usd: '450.00', + }, + { + plan_key: 'enterprise-20240208', + product_key: 'platform_and_support', + name: 'Enterprise', + description: 'SSO, permission management, and support.', + image_url: 'https://posthog.com/images/product/product-icons/platform.svg', + docs_url: 'https://posthog.com/docs', + note: null, + unit: null, + free_allocation: null, + features: [ + { + key: 'team_members', + name: 'Team members', + description: "PostHog doesn't charge per seat add your entire team!", + unit: null, + limit: null, + note: 'Unlimited', + }, + { + key: 'organizations_projects', + name: 'Projects', + description: + 'Create silos of data within PostHog. All data belongs to a single project and all queries are project-specific.', + unit: null, + limit: null, + note: 'Unlimited', + }, + { + key: 'tracked_users', + name: 'Tracked users', + description: 'Track users across devices and sessions.', + unit: null, + limit: null, + note: 'Unlimited', + }, + { + key: 'api_access', + name: 'API access', + description: 'Access your data via our developer-friendly API.', + unit: null, + limit: null, + note: null, + }, + { + key: 'white_labelling', + name: 'White labeling', + description: + 'Use your own branding on surveys, shared dashboards, shared insights, and more.', + unit: null, + limit: null, + note: null, + }, + { + key: 'team_collaboration', + name: 'Team collaboration features', + description: + 'Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.', + unit: null, + limit: null, + note: null, + }, + { + key: 'ingestion_taxonomy', + name: 'Ingestion taxonomy', + description: + 'Mark events as verified or unverified to help you understand the quality of your data.', + unit: null, + limit: null, + note: null, + }, + { + key: 'tagging', + name: 'Dashboard tags', + description: 'Organize dashboards with tags.', + unit: null, + limit: null, + note: null, + }, + { + key: 'social_sso', + name: 'SSO via Google, Github, or Gitlab', + description: 'Log in to PostHog with your Google, Github, or Gitlab account.', + unit: null, + limit: null, + note: null, + }, + { + key: 'sso_enforcement', + name: 'Enforce SSO login', + description: + 'Users can only sign up and log in to your PostHog organization with your specified SSO provider.', + unit: null, + limit: null, + note: null, + }, + { + key: 'saml', + name: 'SAML SSO', + description: "Allow your organization's users to log in with SAML.", + unit: null, + limit: null, + note: null, + }, + { + key: '2fa', + name: '2FA', + description: 'Secure your PostHog account with two-factor authentication.', + unit: null, + limit: null, + note: null, + }, + { + key: '2fa_enforcement', + name: 'Enforce 2FA', + description: 'Require all users in your organization to enable two-factor authentication.', + unit: null, + limit: null, + note: null, + }, + { + key: 'project_based_permissioning', + name: 'Project permissions', + description: 'Restrict access to data within the organization to only those who need it.', + unit: null, + limit: null, + note: null, + }, + { + key: 'role_based_access', + name: 'Role-based access', + description: + 'Control access to features like experiments, session recordings, and feature flags with custom roles.', + unit: null, + limit: null, + note: null, + }, + { + key: 'advanced_permissions', + name: 'Advanced permissions', + description: + 'Control who can access and modify data and features within your organization.', + unit: null, + limit: null, + note: null, + }, + { + key: 'audit_logs', + name: 'Audit logs', + description: + 'See who in your organization has accessed or modified entities within PostHog.', + unit: null, + limit: null, + note: 'Advanced', + }, + { + key: 'hipaa_baa', + name: 'HIPAA BAA', + description: + 'Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.', + unit: null, + limit: null, + note: null, + }, + { + key: 'custom_msa', + name: 'Custom MSA', + description: + "Get a custom Master Services Agreement (MSA) to use PostHog in a way that fits your company's needs.", + unit: null, + limit: null, + note: null, + }, + { + key: 'community_support', + name: 'Community support', + description: 'Get help from other users and PostHog team members in our Community forums.', + unit: null, + limit: null, + note: null, + }, + { + key: 'email_support', + name: 'Email support', + description: + 'Get help directly from our product engineers via email. No wading through multiple support people before you get help.', + unit: null, + limit: null, + note: null, + }, + { + key: 'dedicated_support', + name: 'Dedicated account manager', + description: + 'Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.', + unit: null, + limit: null, + note: null, + }, + { + key: 'priority_support', + name: 'Priority support', + description: 'Get help from our team faster than other customers.', + unit: null, + limit: null, + note: null, + }, + { + key: 'security_assessment', + name: 'Security assessment', + description: 'Security assessment', + unit: null, + limit: null, + note: null, + }, + { + key: 'training', + name: 'Ongoing training', + description: + 'Get training from our team to help you quickly get up and running with PostHog.', + unit: null, + limit: null, + note: null, + }, + { + key: 'configuration_support', + name: 'Personalized onboarding', + description: + 'Get help from our team to create dashboards that will help you understand your data and your business.', + unit: null, + limit: null, + note: null, + }, + ], + tiers: null, + current_plan: false, + included_if: null, + contact_support: true, + unit_amount_usd: null, + }, + ], + type: 'platform_and_support', + free_allocation: 0, + tiers: null, + tiered: false, + unit_amount_usd: null, + current_amount_usd_before_addons: null, + current_amount_usd: null, + current_usage: 0, + usage_limit: 0, + has_exceeded_limit: false, + percentage_usage: 0, + projected_usage: 0, + projected_amount_usd: null, + unit: null, + addons: [], + contact_support: false, + inclusion_only: true, + features: [ + { + key: 'tracked_users', + name: 'Tracked users', + description: 'Track users across devices and sessions.', + images: null, + icon_key: null, type: null, }, { @@ -2832,6 +3269,14 @@ export const billingJson: BillingV2Type = { icon_key: null, type: null, }, + { + key: 'social_sso', + name: 'SSO via Google, Github, or Gitlab', + description: 'Log in to PostHog with your Google, Github, or Gitlab account.', + images: null, + icon_key: null, + type: null, + }, { key: 'role_based_access', name: 'Role-based access', @@ -2842,17 +3287,17 @@ export const billingJson: BillingV2Type = { type: null, }, { - key: 'social_sso', - name: 'SSO via Google, Github, or Gitlab', - description: 'Log in to PostHog with your Google, Github, or Gitlab account.', + key: 'project_based_permissioning', + name: 'Project permissions', + description: 'Restrict access to data within the organization to only those who need it.', images: null, icon_key: null, type: null, }, { - key: 'project_based_permissioning', - name: 'Project permissions', - description: 'Restrict access to data within the organization to only those who need it.', + key: 'advanced_permissions', + name: 'Advanced permissions', + description: 'Control who can access and modify data and features within your organization.', images: null, icon_key: null, type: null, @@ -2874,10 +3319,26 @@ export const billingJson: BillingV2Type = { icon_key: null, type: null, }, + { + key: '2fa', + name: '2FA', + description: 'Secure your PostHog account with two-factor authentication.', + images: null, + icon_key: null, + type: null, + }, + { + key: '2fa_enforcement', + name: 'Enforce 2FA', + description: 'Require all users in your organization to enable two-factor authentication.', + images: null, + icon_key: null, + type: null, + }, { key: 'white_labelling', name: 'White labeling', - description: 'Use your own branding in your PostHog organization.', + description: 'Use your own branding on surveys, shared dashboards, shared insights, and more.', images: null, icon_key: null, type: null, @@ -2892,16 +3353,16 @@ export const billingJson: BillingV2Type = { }, { key: 'dedicated_support', - name: 'Slack (dedicated channel)', + name: 'Dedicated account manager', description: - 'Get help directly from our support team in a dedicated Slack channel shared between you and the PostHog team.', + 'Work with a dedicated account manager via Slack or email to help you get the most out of PostHog.', images: null, icon_key: null, type: null, }, { key: 'email_support', - name: 'Direct access to engineers', + name: 'Email support', description: 'Get help directly from our product engineers via email. No wading through multiple support people before you get help.', images: null, @@ -2909,16 +3370,16 @@ export const billingJson: BillingV2Type = { type: null, }, { - key: 'account_manager', - name: 'Account manager', - description: 'Work with a dedicated account manager to help you get the most out of PostHog.', + key: 'priority_support', + name: 'Priority support', + description: 'Get help from our team faster than other customers.', images: null, icon_key: null, type: null, }, { key: 'training', - name: 'Training sessions', + name: 'Ongoing training', description: 'Get training from our team to help you quickly get up and running with PostHog.', images: null, icon_key: null, @@ -2926,7 +3387,7 @@ export const billingJson: BillingV2Type = { }, { key: 'configuration_support', - name: 'Dashboard configuration support', + name: 'Personalized onboarding', description: 'Get help from our team to create dashboards that will help you understand your data and your business.', images: null, @@ -2973,11 +3434,62 @@ export const billingJson: BillingV2Type = { icon_key: null, type: null, }, + { + key: 'audit_logs', + name: 'Audit logs', + description: 'See who in your organization has accessed or modified entities within PostHog.', + images: null, + icon_key: null, + type: null, + }, + { + key: 'hipaa_baa', + name: 'HIPAA BAA', + description: + 'Get a signed HIPAA Business Associate Agreement (BAA) to use PostHog in a HIPAA-compliant manner.', + images: null, + icon_key: null, + type: null, + }, + { + key: 'custom_msa', + name: 'Custom MSA', + description: + "Get a custom Master Services Agreement (MSA) to use PostHog in a way that fits your company's needs.", + images: null, + icon_key: null, + type: null, + }, + { + key: 'team_collaboration', + name: 'Team collaboration features', + description: + 'Work together better with tags on dashboards and insights; descriptions on insights, events, & properties; verified events; comments on almost anything.', + images: null, + icon_key: null, + type: null, + }, + { + key: 'ingestion_taxonomy', + name: 'Ingestion taxonomy', + description: + 'Mark events as verified or unverified to help you understand the quality of your data.', + images: null, + icon_key: null, + type: null, + }, + { + key: 'tagging', + name: 'Dashboard tags', + description: 'Organize dashboards with tags.', + images: null, + icon_key: null, + type: null, + }, ], }, ], - custom_limits_usd: { - session_replay: '700', - product_analytics: '550', - }, + custom_limits_usd: {}, + stripe_portal_url: + 'https://billing.stripe.com/p/session/test_YWNjdF8xSElNRERFdUlhdFJYU2R6LF9QaEVJR3VyemlvMDZzRzdiQXZrc1AxSjNXZk1BellP0100ZsforDQG', } diff --git a/frontend/src/scenes/billing/PlanComparison.tsx b/frontend/src/scenes/billing/PlanComparison.tsx index 4de8fcfce9d8d..4b96d5d3d63f6 100644 --- a/frontend/src/scenes/billing/PlanComparison.tsx +++ b/frontend/src/scenes/billing/PlanComparison.tsx @@ -165,6 +165,7 @@ export const PlanComparison = ({ reportSurveyShown(UNSUBSCRIBE_SURVEY_ID, product.type) } }} + data-attr={`upgrade-${plan.name}`} > {plan.current_plan ? 'Current plan' diff --git a/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx b/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx index 23087dc6010d2..cd1d1ad9423d8 100644 --- a/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx +++ b/frontend/src/scenes/onboarding/OnboardingBillingStep.tsx @@ -49,6 +49,7 @@ export const OnboardingBillingStep = ({ onClick={() => { reportBillingUpgradeClicked(product.type) }} + data-attr="onboarding-subscribe-button" > Subscribe to Paid Plan diff --git a/frontend/src/scenes/onboarding/OnboardingStep.tsx b/frontend/src/scenes/onboarding/OnboardingStep.tsx index 205b6a00de575..617e716524ecc 100644 --- a/frontend/src/scenes/onboarding/OnboardingStep.tsx +++ b/frontend/src/scenes/onboarding/OnboardingStep.tsx @@ -97,6 +97,7 @@ export const OnboardingStep = ({ onSkip && onSkip() !hasNextStep ? completeOnboarding() : goToNextStep() }} + data-attr="onboarding-skip-button" > Skip {!hasNextStep ? 'and finish' : 'for now'} diff --git a/frontend/src/scenes/products/Products.tsx b/frontend/src/scenes/products/Products.tsx index c1f7311425a05..b00389d9ab10e 100644 --- a/frontend/src/scenes/products/Products.tsx +++ b/frontend/src/scenes/products/Products.tsx @@ -79,6 +79,7 @@ export function ProductCard({ e.stopPropagation() router.actions.push(getProductUri(product.type as ProductKey, featureFlags)) }} + data-attr={`return-to-${product.type}`} > diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 511595e56a896..2cc12a0d024e5 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -143,6 +143,10 @@ export enum AvailableFeature { PRODUCT_ANALYTICS_SQL_QUERIES = 'product_analytics_sql_queries', TWOFA_ENFORCEMENT = '2fa_enforcement', AUDIT_LOGS = 'audit_logs', + HIPAA_BAA = 'hipaa_baa', + CUSTOMM_MSA = 'custom_msa', + TWOFA = '2fa', + PRIORITY_SUPPORT = 'priority_support', } type AvailableFeatureUnion = `${AvailableFeature}` @@ -1398,7 +1402,7 @@ export interface BillingProductV2Type { unit: string | null unit_amount_usd: string | null plans: BillingV2PlanType[] - contact_support: boolean + contact_support: boolean | null inclusion_only: any features: BillingV2FeatureType[] addons: BillingProductV2AddonType[] @@ -1419,7 +1423,7 @@ export interface BillingProductV2AddonType { subscribed: boolean // sometimes addons are included with the base product, but they aren't subscribed individually included_with_main_product?: boolean - contact_support?: boolean + contact_support: boolean | null unit: string | null unit_amount_usd: string | null current_amount_usd: string | null @@ -1472,10 +1476,10 @@ export interface BillingV2PlanType { product_key: ProductKeyUnion current_plan?: any tiers?: BillingV2TierType[] | null - unit_amount_usd?: string + unit_amount_usd: string | null included_if?: 'no_active_subscription' | 'has_subscription' | null initial_billing_limit?: number - contact_support?: boolean + contact_support: boolean | null } export interface PlanInterface { From 3422c6e9514c09f4043b8898e7d58602a70dd0a2 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 Mar 2024 00:19:56 +0000 Subject: [PATCH 05/49] Update UI snapshots for `chromium` (1) --- ...es-other-billing-v2--billing-v-2--dark.png | Bin 94006 -> 54725 bytes ...s-other-billing-v2--billing-v-2--light.png | Bin 94386 -> 54362 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/frontend/__snapshots__/scenes-other-billing-v2--billing-v-2--dark.png b/frontend/__snapshots__/scenes-other-billing-v2--billing-v-2--dark.png index f7ad86b89b22f4f5154564f38d8cbd3e64506fc9..9bf8874f42817fe97b168bf48dfe5e9d534ec463 100644 GIT binary patch literal 54725 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 CWqI`g literal 94006 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

rd#}ak15VQh+ZNn(0!lXc9*^K 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 diff --git a/frontend/__snapshots__/scenes-other-billing-v2--billing-v-2--light.png b/frontend/__snapshots__/scenes-other-billing-v2--billing-v-2--light.png index b558ba017ea2a1007fcfa26b02192c2e3e0f34a7..3036ea64722bef09b64de94351eeb84b780deb6f 100644 GIT binary patch literal 54362 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