diff --git a/lib/plausible/billing/billing.ex b/lib/plausible/billing/billing.ex
index e754b5adaaad2bd021678361d99c29f8cd454dff..f61919d29c4757256fdad878b0985d8f4ef3bc92 100644
--- a/lib/plausible/billing/billing.ex
+++ b/lib/plausible/billing/billing.ex
@@ -18,14 +18,18 @@ defmodule Plausible.Billing do
 
     changeset = Subscription.changeset(%Subscription{}, format_subscription(params))
 
-    Repo.insert(changeset) |> check_lock_status
+    Repo.insert(changeset)
+    |> check_lock_status
+    |> maybe_adjust_api_key_limits
   end
 
   def subscription_updated(params) do
     subscription = Repo.get_by!(Subscription, paddle_subscription_id: params["subscription_id"])
     changeset = Subscription.changeset(subscription, format_subscription(params))
 
-    Repo.update(changeset) |> check_lock_status
+    Repo.update(changeset)
+    |> check_lock_status
+    |> maybe_adjust_api_key_limits
   end
 
   def subscription_cancelled(params) do
@@ -236,5 +240,23 @@ defmodule Plausible.Billing do
 
   defp check_lock_status(err), do: err
 
+  defp maybe_adjust_api_key_limits({:ok, subscription}) do
+    plan =
+      Repo.get_by(Plausible.Billing.EnterprisePlan,
+        user_id: subscription.user_id,
+        paddle_plan_id: subscription.paddle_plan_id
+      )
+
+    if plan do
+      user_id = subscription.user_id
+      api_keys = from(key in Plausible.Auth.ApiKey, where: key.user_id == ^user_id)
+      Repo.update_all(api_keys, set: [hourly_request_limit: plan.hourly_api_request_limit])
+    end
+
+    {:ok, subscription}
+  end
+
+  defp maybe_adjust_api_key_limits(err), do: err
+
   defp paddle_api(), do: Application.fetch_env!(:plausible, :paddle_api)
 end
diff --git a/test/plausible/billing/billing_test.exs b/test/plausible/billing/billing_test.exs
index 86d9e084b3033d16df944a33935b7ed571c88ce4..b079c0b79a7888b12f66a04a21bb156f87d507cf 100644
--- a/test/plausible/billing/billing_test.exs
+++ b/test/plausible/billing/billing_test.exs
@@ -286,6 +286,34 @@ defmodule Plausible.BillingTest do
 
       refute Repo.reload!(site).locked
     end
+
+    test "if user upgraded to an enterprise plan, their API key limits are automatically adjusted" do
+      user = insert(:user)
+
+      plan =
+        insert(:enterprise_plan,
+          user: user,
+          paddle_plan_id: @plan_id,
+          hourly_api_request_limit: 10_000
+        )
+
+      api_key = insert(:api_key, user: user, hourly_request_limit: 1)
+
+      Billing.subscription_created(%{
+        "alert_name" => "subscription_created",
+        "subscription_id" => @subscription_id,
+        "subscription_plan_id" => @plan_id,
+        "update_url" => "update_url.com",
+        "cancel_url" => "cancel_url.com",
+        "passthrough" => user.id,
+        "status" => "active",
+        "next_bill_date" => "2019-06-01",
+        "unit_price" => "6.00",
+        "currency" => "EUR"
+      })
+
+      assert Repo.reload!(api_key).hourly_request_limit == plan.hourly_api_request_limit
+    end
   end
 
   describe "subscription_updated" do
@@ -332,6 +360,36 @@ defmodule Plausible.BillingTest do
 
       refute Repo.reload!(site).locked
     end
+
+    test "if user upgraded to an enterprise plan, their API key limits are automatically adjusted" do
+      user = insert(:user)
+      subscription = insert(:subscription, user: user)
+
+      plan =
+        insert(:enterprise_plan,
+          user: user,
+          paddle_plan_id: "new-plan-id",
+          hourly_api_request_limit: 10_000
+        )
+
+      api_key = insert(:api_key, user: user, hourly_request_limit: 1)
+
+      Billing.subscription_updated(%{
+        "alert_name" => "subscription_updated",
+        "subscription_id" => subscription.paddle_subscription_id,
+        "subscription_plan_id" => "new-plan-id",
+        "update_url" => "update_url.com",
+        "cancel_url" => "cancel_url.com",
+        "passthrough" => user.id,
+        "old_status" => "past_due",
+        "status" => "active",
+        "next_bill_date" => "2019-06-01",
+        "new_unit_price" => "12.00",
+        "currency" => "EUR"
+      })
+
+      assert Repo.reload!(api_key).hourly_request_limit == plan.hourly_api_request_limit
+    end
   end
 
   describe "subscription_cancelled" do