Skip to content

Commit

Permalink
Bring back premium feature notices in tiles (#4742)
Browse files Browse the repository at this point in the history
* Lost tapes: bring back premium feature notices in tiles

* Ensure that e-mail CTA is only presented to business/enterprise customers

* Format

* Fix typespecs

* Add t() type to EnterprisePlan

* Reduce Plan.t() definition

Found no reason for it to be there.
  • Loading branch information
aerosol authored Oct 28, 2024
1 parent 0404522 commit 8bd32b6
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 24 deletions.
2 changes: 2 additions & 0 deletions lib/plausible/billing/enterprise_plan.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ defmodule Plausible.Billing.EnterprisePlan do
use Ecto.Schema
import Ecto.Changeset

@type t() :: %__MODULE__{}

@required_fields [
:user_id,
:paddle_plan_id,
Expand Down
2 changes: 1 addition & 1 deletion lib/plausible/billing/plan.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Plausible.Billing.Plan do
use Ecto.Schema
import Ecto.Changeset

@type t() :: %__MODULE__{} | :enterprise
@type t() :: %__MODULE__{}

embedded_schema do
# Due to grandfathering, we sometimes need to check the "generation" (e.g.
Expand Down
2 changes: 2 additions & 0 deletions lib/plausible/billing/plans.ex
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ defmodule Plausible.Billing.Plans do
end)
end

@spec get_subscription_plan(nil | Subscription.t()) ::
nil | :free_10k | Plan.t() | EnterprisePlan.t()
def get_subscription_plan(nil), do: nil

def get_subscription_plan(subscription) do
Expand Down
25 changes: 13 additions & 12 deletions lib/plausible_web/components/billing/notice.ex
Original file line number Diff line number Diff line change
Expand Up @@ -302,17 +302,24 @@ defmodule PlausibleWeb.Components.Billing.Notice do
defp upgrade_call_to_action(assigns) do
billable_user = Plausible.Users.with_subscription(assigns.billable_user)

plan =
Plans.get_regular_plan(billable_user.subscription, only_non_expired: true)

trial? = Plausible.Users.on_trial?(assigns.billable_user)
growth? = plan && plan.kind == :growth
upgrade_assistance_required? =
case Plans.get_subscription_plan(billable_user.subscription) do
%Plausible.Billing.Plan{kind: :business} -> true
%Plausible.Billing.EnterprisePlan{} -> true
_ -> false
end

cond do
assigns.billable_user.id !== assigns.current_user.id ->
~H"please reach out to the site owner to upgrade their subscription"

growth? || trial? ->
upgrade_assistance_required? ->
~H"""
please contact <a href="mailto:[email protected]" class="underline">[email protected]</a>
to upgrade your subscription
"""

true ->
~H"""
please
<.link
Expand All @@ -322,12 +329,6 @@ defmodule PlausibleWeb.Components.Billing.Notice do
upgrade your subscription
</.link>
"""

true ->
~H"""
please contact <a href="mailto:[email protected]" class="underline">[email protected]</a>
to upgrade your subscription
"""
end
end

Expand Down
11 changes: 6 additions & 5 deletions lib/plausible_web/templates/site/settings_funnels.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@
Compose Goals into Funnels
</:subtitle>

<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Funnels}
/>

<div :if={Plausible.Billing.Feature.Funnels.enabled?(@site)}>
<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Funnels}
/>
<%= live_render(@conn, PlausibleWeb.Live.FunnelSettings,
session: %{"site_id" => @site.id, "domain" => @site.domain}
) %>
Expand Down
13 changes: 7 additions & 6 deletions lib/plausible_web/templates/site/settings_props.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@
create custom metrics.
</:subtitle>

<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Props}
grandfathered?
/>

<div :if={Plausible.Billing.Feature.Props.enabled?(@site)}>
<PlausibleWeb.Components.Billing.Notice.premium_feature
billable_user={@site.owner}
current_user={@current_user}
feature_mod={Plausible.Billing.Feature.Props}
grandfathered?
/>
<%= live_render(@conn, PlausibleWeb.Live.PropsSettings,
id: "props-form",
session: %{"site_id" => @site.id, "domain" => @site.domain}
Expand Down
14 changes: 14 additions & 0 deletions test/plausible_web/live/funnel_settings_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ defmodule PlausibleWeb.Live.FunnelSettingsTest do
describe "GET /:domain/settings/funnels" do
setup [:create_user, :log_in, :create_site]

@tag :ee_only
test "premium feature notice renders", %{conn: conn, site: site, user: user} do
user
|> Plausible.Auth.User.end_trial()
|> Plausible.Repo.update!()

conn = get(conn, "/#{site.domain}/settings/funnels")
resp = conn |> html_response(200) |> text()

assert resp =~ "please upgrade your subscription"
end

test "lists funnels for the site and renders help link", %{conn: conn, site: site} do
{:ok, _} = setup_funnels(site)
conn = get(conn, "/#{site.domain}/settings/funnels")
Expand All @@ -18,6 +30,8 @@ defmodule PlausibleWeb.Live.FunnelSettingsTest do
assert resp =~ "Compose Goals into Funnels"
assert resp =~ "From blog to signup"
assert resp =~ "From signup to blog"
refute resp =~ "Your account does not have access"
refute resp =~ "please upgrade your subscription"
assert element_exists?(resp, "a[href=\"https://plausible.io/docs/funnel-analysis\"]")
end

Expand Down
13 changes: 13 additions & 0 deletions test/plausible_web/live/props_settings_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ defmodule PlausibleWeb.Live.PropsSettingsTest do
describe "GET /:domain/settings/properties" do
setup [:create_user, :log_in, :create_site]

@tag :ee_only
test "premium feature notice renders", %{conn: conn, site: site, user: user} do
user
|> Plausible.Auth.User.end_trial()
|> Plausible.Repo.update!()

conn = get(conn, "/#{site.domain}/settings/properties")
resp = conn |> html_response(200) |> text()

assert resp =~ "please upgrade your subscription"
end

test "lists props for the site and renders links", %{conn: conn, site: site} do
{:ok, site} = Plausible.Props.allow(site, ["amount", "logged_in", "is_customer"])
conn = get(conn, "/#{site.domain}/settings/properties")
Expand All @@ -21,6 +33,7 @@ defmodule PlausibleWeb.Live.PropsSettingsTest do
assert resp =~ "amount"
assert resp =~ "logged_in"
assert resp =~ "is_customer"
refute resp =~ "please upgrade your subscription"
end

test "lists props with disallow actions", %{conn: conn, site: site} do
Expand Down

0 comments on commit 8bd32b6

Please sign in to comment.