PostHog / posthog

🦔 PostHog provides open-source product analytics, session recording, feature flagging and A/B testing that you can self-host.
https://posthog.com
Other
21.18k stars 1.25k forks source link

Group Analytics - upsell prompts #7491

Closed clarkus closed 1 year ago

clarkus commented 2 years ago

It takes two things to use group analytics:

1) You have to pay for it 2) You have to update your instrumentation to send group data

Depending on the state of the account plan and instrumentation, we will prompt with different content to pull users towards the goal of using group analytics. Upsell prompts are positioned based on priority / importance and context.

Components:

Upsell content - We will show varying content based on the status of the account. The upgrade action takes you to billing workflow, learn more takes you to instrumentation doc. See detailed scenarios below:

Site banner site banner - upgrade + instrument Page banner page banner - upgrade + instrument Empty state empty state - upsell -upgrade + instrument

Site banner site banner - instrument

Page banner page banner - instrument

Empty state empty state - upsell - instrument

Site banner site banner - upgrade

Page banner page banner - upgrade

Empty state empty state - upsell - upgrade

Figma assets - https://www.figma.com/file/gQBj9YnNgD8YW4nBwCVLZf/PostHog-App?node-id=5506%3A29828

clarkus commented 2 years ago

@macobo here are three examples showing upsell content in context:

Persons and groups - the idea here is an always-empty "groups" tab that contains the upsell prompt. persons and groups

Prominent site banner - the most prominent upsell that appears on every page until dismissed schenanigans header tan

Feature flags - page level banner that restates groups are available for use. ff listing - resizable table

macobo commented 2 years ago

Thanks, this is great! Follow-up questions:

  1. To verify, we won't show any empty states in any of the insight components themselves, right?
    • What's the "empty" state for them? Don't show dropdowns in funnels/retention/stickiness unless there's a group type sent?
    • For context this is the oddest thing for me - insights is the place where 90% of value from groups is derived. What's the argument for not including it there? Extra effort?
  2. What is the behavior of the banner dismissal? Do we already have an existing example of the desired behavior?
    • Does it dismiss for this "page view"? Or for this user completely? For a given period? For this organization/project?
  3. Do we have a "Upgrade" page already? Do we lead to the billing page with some extra information (e.g. highlighting groups)? What about self-hosted?
  4. Do we expect for the banner and upsell pages to stay around forever? What about new users/deploys?

It's okay if you don't have answers for some of these - just say so, will work out an answer for them.

clarkus commented 2 years ago
  1. To verify, we won't show any empty states in any of the insight components themselves, right?
    • What's the "empty" state for them? Don't show dropdowns in funnels/retention/stickiness unless there's a group type sent?
    • For context this is the oddest thing for me - insights is the place where 90% of value from groups is derived. What's the argument for not including it there? Extra effort?

I don't think we can include upsells within components without disrupting the use of those components. I'd rather rely on the page and site banners for those contexts. The list of screens above isn't complete.

Pages to expose upsells

I am not 100% sure how prominent the group analytics upsells should be and therefore and not certain about when to use the site banner. @paolodamico or @marcushyett-ph do you have any preference here? The concern is that we'll be showing multiple upsells simultaneously and it'll come across as spammy.

  1. What is the behavior of the banner dismissal? Do we already have an existing example of the desired behavior?
    • Does it dismiss for this "page view"? Or for this user completely? For a given period? For this organization/project?

We do have page and site banners available. There is a page banner in use for correlation analysis. Generally, once dismissed, they are dismissed forever. The exception would be the empty state for lists... there isn't a dismiss action there.

  1. Do we have a "Upgrade" page already? Do we lead to the billing page with some extra information (e.g. highlighting groups)? What about self-hosted?

Upgrade would just take the user into the current billing page. Specifically, they need to have a card on file and be paying. So that's scale or above. Your point is a good one about setting context once the user is into billing. @paolodamico or @marcushyett-ph can you support here? How much should be done to drive the user into a specific plan versus just telling them which plans offer groups?

  1. Do we expect for the banner and upsell pages to stay around forever? What about new users/deploys? It's okay if you don't have answers for some of these - just say so, will work out an answer for them.

I do not think they should stay around forever. Eventually, we'll have more components that can inform users of new offerings / changes. I see these as mostly a short term way to introduce a significant change to our existing users.

macobo commented 2 years ago

Thanks again.

There's a lot of tricky semantics here since we've already introduced upselling elsewhere and the context for how to do things properly that isn't available for me right now. Let me try dig into the things that are needed to make this successful.

We do have page and site banners available. There is a page banner in use for correlation analysis. Generally, once dismissed, they are dismissed forever. The exception would be the empty state for lists... there isn't a dismiss action there.

I couldn't find the page banner in correlation analysis, gonna try get @neilkakkar's help to find the relevant code here.

Dismissed for who though? For this user? For this org? For this user in this org? For this project?

Looking at the code for used in correlation analysis, it only uses localStorage, meaning that if using a different browser you will get the prompt again. I propose we continue using that solution?

Reason I'm digging deep here: This is a onboarding tutorial type situation where if specified well and kept consistent throughout the project, dozens of different "onboarding tutorial" solutions pop up, becoming a huge resource drain as everyone reinvents the wheel every project. Seen this happen at many different companies and it's a very common thing that designers overlook that causes a ton of work with at best zero user impact down the line.

I don't think we can include upsells within components without disrupting the use of those components. I'd rather rely on the page and site banners for those contexts. The list of screens above isn't complete. I do not think they [banners/upsell pages] should stay around forever.

This creates a problem though - there's no organic way to discover group analytics in the long-term in the place where it's most valuable - insights! In turn, this reduces the value of doing this project in the first place.

I do think we need some way for in-app discoverability that sticks around long-term within insights.


Other questions:

  1. Missed question from above: Where does the upgrade button lead on self-hosted users? License page?
  2. Missed question from above: What do we show in place of the "select thing to aggregate by" dropdown in funnels, retention, stickiness and feature flags? This needs a proper empty state.
  3. @paolodamico introduced DISABLE_PAID_FEATURE_SHOWCASING env variable recently. Should this hide the extra tab completely then or should we have a different empty state there?
  4. @paolodamico how does adding a new available feature work? Where can I modify existing licenses, etc.
paolodamico commented 2 years ago

Some notes from reading this:

  1. I would make sure we don't show both the page banner & the site banner at the same time.
  2. If a user dismisses any page/site banner related to groups, I would dismiss all of them (and just keep the empty components one). Dismissed for the user.
  3. What's our rollout plan for the page & site banners? These should be short-lived as @clarkus, as we'll want to free up the space for other features eventually. 2-4 weeks suggestion.
  4. I think the right move is taking the user to the billing page, and use that page (which really needs a makeover) to highlight which plans are available and which include groups (we could highlight it as we do when you click on a project settings link). In this case, I don't think it matters a lot as all plans include it.
  5. @macobo the upsell in correlation analysis is in FunnelCorrelation.tsx#L45)
  6. I think it's fine to rely on localStorage. As an improvement, you could set a person property on their PostHog tracked user and use that as a more persistent storage. We use it for a couple of other things (like NPS).
  7. Agreed with @macobo on having some place to discover group analytics long-term on insights, but I would do something that is less disruptive as the rest of the upsells.

Re other questions from @macobo

  1. Upgrade button on self-hosted. Right now we're taking them to the pricing page, self-hosted section.
  2. For @clarkus
  3. I think we should hide it completely. Even if we had a less "sales-y" empty state, it could still feel promotional, better to avoid that.
  4. You just declare the new feature in the AvailableFeature typing in TS & Python, and on ee/models/license.py add it to the SCALE_FEATURES (or ENTERPRISE_FEATURES if applicable) array. Cloud pulls from this too.
macobo commented 2 years ago

Thanks! Some follow-up comments.

  1. I would make sure we don't show both the page banner & the site banner at the same time.

Wouldn't that lead to a jumpy experience navigating around if the top bar comes-and-goes at random?

  1. If a user dismisses any page/site banner related to groups, I would dismiss all of them (and just keep the empty components one). Dismissed for the user.
  2. I think it's fine to rely on localStorage. As an improvement, you could set a person property on their PostHog tracked user and use that as a more persistent storage. We use it for a couple of other things (like NPS).

These kind of conflict with each other and the current implementation as the LS value is not tied to a logic and naively porting it would lose previously saved dismissals :sweat_smile:

Will figure something out though.

  1. @macobo the upsell in correlation analysis is in FunnelCorrelation.tsx#L45)

Ok, I got confused by the wording - there's no page/site banner for correlations, it's a different thing ()


EDIT:

Issue 1: The copy for when user is paying is distracting - we have no way to know if user paid because of groups or not, so the copy shouldn't be "one more step" if user didn't do the first one intentionally. Issue 2: Should we show site banner to organizations which already have groups in use since not all members will know about it? Current design doesn't specify this case.

cc @clarkus

paolodamico commented 2 years ago

Wouldn't that lead to a jumpy experience navigating around if the top bar comes-and-goes at random?

Yes, and after second thought maybe we don't really want to show the page banners at all as the site banner will always be there, thoughts @clarkus ?

Re Issue 2: I think the site banner should be enough for these users, plus whatever we come up with for ongoing upselling.

clarkus commented 2 years ago

Dismissed for who though? For this user? For this org? For this user in this org? For this project?

Dismissed forever for that person unless we identify some reason to prompt again. It's not a "remind me later" action, it's a "I don't want to see this again" action.

Reason I'm digging deep here: This is a onboarding tutorial type situation where if specified well and kept consistent throughout the project, dozens of different "onboarding tutorial" solutions pop up, becoming a huge resource drain as everyone reinvents the wheel every project. Seen this happen at many different companies and it's a very common thing that designers overlook that causes a ton of work with at best zero user impact down the line.

I 100% agree we need a strategy here. I've been pushing for this, but we're moving quickly and being a bit more reactive on this for now. Just wanted to say I am thinking about this and that we're aligned.

I do think we need some way for in-app discoverability that sticks around long-term within insights.

I'll take this as a high priority follow up task for today.

Issue 1: The copy for when user is paying is distracting - we have no way to know if user paid because of groups or not, so the copy shouldn't be "one more step" if user didn't do the first one intentionally.

Can we detect if the user has a CC on file? What can we derive from their account status to inform this?

Issue 2: Should we show site banner to organizations which already have groups in use since not all members will know about it? Current design doesn't specify this case.

Promotions are per user right now and I don't have anything that maps to an organization really. We don't necessarily know who the decision maker is for each org, so going more broad with promotion makes sense to me.

clarkus commented 2 years ago

Yes, and after second thought maybe we don't really want to show the page banners at all as the site banner will always be there, thoughts @clarkus ?

I'd argue for page banners over site banners just to reduce conflicts of showing multiple prompts simultaneously.

I think the right move is taking the user to the billing page, and use that page (which really needs a makeover) to highlight which plans are available and which include groups (we could highlight it as we do when you click on a project settings link). In this case, I don't think it matters a lot as all plans include it.

I think your point here is a strong one, @paolodamico. This would be the place to pull a user towards the plan that best fits their needs.

clarkus commented 2 years ago

I had a sync with @macobo to better understand the flags we have available to describe the current account states. The applicable states to these upsells are as follows:

Actions [Upgrade] takes the user to billing page [Learn more] takes the user to the group analytics alpha documentation

Upgrade and learn more content

🎉 Introducing Group Analytics! Analyze how groups interact with your product as a whole. [Upgrade] [Learn more]

Learn more content

🎉 Looks like you’re tracking groups! Upgrade today to use groups in Insights. [Upgrade]

Upgrade content same as upgrade and learn more without the second prompt

🎉 Introducing Group Analytics! Analyze how groups interact with your product as a whole. [Upgrade]

To simplify things, we're going to drop the page banners as they mostly overlap with the site banner. We'll show the site banner until dismissed. @macobo @paolodamico do you think we should re-prompt when the account state changes? What if the user starts sending group data (NoAccess > HasGroupTypes), do we prompt again to upgrade?

Outstanding todo: persistent prompt on aggregation method drop down (insights) and match by dropdown (feature flats)

posthog-contributions-bot[bot] commented 2 years ago

This issue has 2502 words at 10 comments. Issues this long are hard to read or contribute to, and tend to take very long to reach a conclusion. Instead, why not:

  1. Write some code and submit a pull request! Code wins arguments
  2. Have a sync meeting to reach a conclusion
  3. Create a Request for Comments and submit a PR with it to the meta repo or product internal repo

Is this issue intended to be sprawling? Consider adding label epic or sprint to indicate this.

macobo commented 2 years ago

Great! One addition - I'd still show the site banner if in AlreadyUsing state - this allows people in the same team to discover the feature after integrating. The copy can easily be derived from the above samples :)

@macobo @paolodamico do you think we should re-prompt when the account state changes?

I think it's fine not to, and would be annoying if we did.

clarkus commented 2 years ago

I did some research and reworked our persistent groups prompt to be less intrusive. I think the places for persistent prompts are the aggregation method drop down on insights and the match by drop down on create feature flags. Essentially any place that exposes the list of instrumented groups, we'll show those groups disabled with a prompt above that describes why they're disabled and how to get access. If no groups exists, we'll only show the prompt. This prompt persists, so the content diverges from that used in other upsells.

Persistent prompt content:

Upgrade to one of our paid plans to use group analytics. [Upgrade] or [Learn more]

We might try to reduce this to a single prompt to shorten the message. Longer term, I'd like to pursue @paolodamico's idea to improve the billing page. That page is a prime target for upsells with more context, more prominent patterns, etc.

Screen Shot 2021-12-03 at 11 06 34 AM

https://www.figma.com/file/gQBj9YnNgD8YW4nBwCVLZf/PostHog-App?node-id=5650%3A32316

paolodamico commented 2 years ago

I really like these visuals a lot! My only suggestion would be to allow users to dismiss the prompt (so we don't remove too much discoverability from property aggregation) in one of two ways: a) completely get rid of that section b) leave that section but as a single line thing that says it's not available and click to learn more.

clarkus commented 2 years ago

I really like these visuals a lot! My only suggestion would be to allow users to dismiss the prompt (so we don't remove too much discoverability from property aggregation) in one of two ways: a) completely get rid of that section b) leave that section but as a single line thing that says it's not available and click to learn more.

I don't think we can get this to a single line without making the container really wide. I think the key decision to be made is if this is dismissible or if it persists. If it's dismissible, I'm not sure it makes sense to even have it here. The site banner will be more noticeable.

The key thing we're trying to solve for is @macobo's points above:

This creates a problem though - there's no organic way to discover group analytics in the long-term in the place where it's most valuable - insights! In turn, this reduces the value of doing this project in the first place. I do think we need some way for in-app discoverability that sticks around long-term within insights.

We really just need to decide if these persist or not. I also filed https://github.com/PostHog/posthog/issues/7513 to give us a more capable landing page for upsell links. A single CTA might give us the ability to constrain this to fewer lines, but I do think a multi-line component is going to be pretty common in this context.

paolodamico commented 2 years ago

Here's a proposal for a single line (icons are placeholders, and it's very basic, but should convey the gist). I think we should persist something like this (unless you hard disabled upsells with the env var).

macobo commented 2 years ago

Opened https://github.com/PostHog/posthog/pull/7520 and https://github.com/PostHog/posthog/pull/7521 with the implementation. @paolodamico the second PR might need some light editing from you to get live.

Would love to get these live under storybook as well, but we have no instructions how that's done so will leave figuring that out for later.

clarkus commented 2 years ago

Here's a proposal for a single line (icons are placeholders, and it's very basic, but should convey the gist). I think we should persist something like this (unless you hard disabled upsells with the env var).

I'd lean more towards the multiline example from the previous iteration. The icons could help with communicating that this is a restricted feature, but I feel like words win in this case. Any reason not to go with the multiline example? We'd be displacing at most one item in the list.

paolodamico commented 2 years ago

Well I don't think the extra text adds a lot of value. Perhaps the only thing I would keep is the "upgrade" and "learn more" links. The reason I'm advocating for keeping this as a single line is so that it clearly looks like another item, and less of an upsell thing.

macobo commented 2 years ago

Re insight dropdowns: There's already an implementation in https://github.com/PostHog/posthog/pull/7521 - any iteration on that pushes us further out from being able to ship groups within this release.

Let's close out this particular discussion for now and open a follow-up issue if we're finding it confusing!

I don't think there's much left to discuss here. Will close the ticket once the two PRs are merged.

clarkus commented 2 years ago

Well I don't think the extra text adds a lot of value. Perhaps the only thing I would keep is the "upgrade" and "learn more" links. The reason I'm advocating for keeping this as a single line is so that it clearly looks like another item, and less of an upsell thing.

I think it needs to look more like an upsell and less like an item in the list. I do think the text is helpful - it states what's offered, why it isn't available, how to get it and where to get it. It's direct and obvious. I don't know what some of the icons mean in the example above or honestly why they're applicable. While I don't want to push out release, I do feel that the multi-line design is going to be more successful. I think we should change it.

paolodamico commented 2 years ago

This has been implemented and shipped, closing.

clarkus commented 2 years ago

There is still an outstanding issue with the inline upsell prompt for aggregation options in insights. We're still using the icon version instead of the multiline design that originally provided. I've provided this feedback multiple times but we still haven't changed it. I'd like to reopen this until that upsell prompt is corrected to the intended design.