diff --git a/packages/builder/src/components/billing/Usage.svelte b/packages/builder/src/components/billing/Usage.svelte
new file mode 100644
index 0000000000..b3777007c6
--- /dev/null
+++ b/packages/builder/src/components/billing/Usage.svelte
@@ -0,0 +1,55 @@
+
+
+
+
+
+ {#if unlimited}
+ {usage.used}
+ {:else}
+ {usage.used} / {usage.total}
+ {/if}
+
+
+ {#if unlimited}
+ Unlimited
+ {:else}
+
+ {/if}
+
+
+
+
diff --git a/packages/builder/src/pages/builder/portal/_layout.svelte b/packages/builder/src/pages/builder/portal/_layout.svelte
index 39a5def7d6..99cf84e912 100644
--- a/packages/builder/src/pages/builder/portal/_layout.svelte
+++ b/packages/builder/src/pages/builder/portal/_layout.svelte
@@ -61,6 +61,10 @@
])
if (isEnabled(FEATURE_FLAGS.LICENSING)) {
+ menu = menu.concat({
+ title: "Billing",
+ href: "/builder/portal/settings/billing",
+ })
menu = menu.concat({
title: "Upgrade",
href: "/builder/portal/settings/upgrade",
diff --git a/packages/builder/src/pages/builder/portal/settings/billing.svelte b/packages/builder/src/pages/builder/portal/settings/billing.svelte
new file mode 100644
index 0000000000..12d4a587e7
--- /dev/null
+++ b/packages/builder/src/pages/builder/portal/settings/billing.svelte
@@ -0,0 +1,127 @@
+
+
+
+ {#if loaded}
+
+ Billing
+ Get information about your current usage and manage your plan
+
+
+
+
+
+
+ Your plan
+ {capitalise(license?.plan.type)}
+
+
+ Usage
+
+ {#each staticUsage as usage}
+
+
+
+ {/each}
+
+
+ {#if monthlyUsage.length}
+
+ Monthly
+
+ {#each monthlyUsage as usage}
+
+
+
+ {/each}
+
+
+
+ {/if}
+
+ {/if}
+
+
+
diff --git a/packages/builder/src/stores/portal/index.js b/packages/builder/src/stores/portal/index.js
index a5d33b3b15..8810ce6b74 100644
--- a/packages/builder/src/stores/portal/index.js
+++ b/packages/builder/src/stores/portal/index.js
@@ -6,3 +6,4 @@ export { email } from "./email"
export { auth } from "./auth"
export { oidc } from "./oidc"
export { templates } from "./templates"
+export { licensing } from "./licensing"
diff --git a/packages/builder/src/stores/portal/licensing.js b/packages/builder/src/stores/portal/licensing.js
new file mode 100644
index 0000000000..653dab52ed
--- /dev/null
+++ b/packages/builder/src/stores/portal/licensing.js
@@ -0,0 +1,29 @@
+import { writable } from "svelte/store"
+import { API } from "api"
+
+export const createLicensingStore = () => {
+ const DEFAULT = {
+ plans: {},
+ }
+
+ const store = writable(DEFAULT)
+
+ const actions = {
+ getQuotaUsage: async () => {
+ const quotaUsage = await API.getQuotaUsage()
+ store.update(state => {
+ return {
+ ...state,
+ quotaUsage,
+ }
+ })
+ },
+ }
+
+ return {
+ subscribe: store.subscribe,
+ ...actions,
+ }
+}
+
+export const licensing = createLicensingStore()
diff --git a/packages/frontend-core/src/api/licensing.js b/packages/frontend-core/src/api/licensing.js
index a3e5583325..0ee04fbc0b 100644
--- a/packages/frontend-core/src/api/licensing.js
+++ b/packages/frontend-core/src/api/licensing.js
@@ -27,4 +27,10 @@ export const buildLicensingEndpoints = API => ({
url: "/api/global/license/refresh",
})
},
+
+ getQuotaUsage: async () => {
+ return API.get({
+ url: "/api/license/usage",
+ })
+ },
})