diff --git a/apps/operator/components/InviteTenantAdminModal.vue b/apps/operator/components/InviteTenantAdminModal.vue
new file mode 100644
index 0000000..2253fe3
--- /dev/null
+++ b/apps/operator/components/InviteTenantAdminModal.vue
@@ -0,0 +1,311 @@
+
+
+
+ {{ error }}
+
+ {{ name }} (
+ {{ name }} (
+ This only records the intent on the tenant. The customer admin adds and
+ verifies the domain on the portal's Domains page, which hands them the
+ exact MX/SPF/DKIM/DMARC records to publish.
+
+ Optional — creates (or attaches) this person as the tenant's first admin and
+ returns a single-use credential to share. Skip it to invite someone later.
+
+
+ On confirm the tenant is created and provisioned (Authentik group, Stalwart
+ service domain; OCIS once the files tier is live), the subscription is
+ spun up from the price catalog, and the first admin is invited.
+ {{ submitError }}
+
+ Share this single-use link with the admin — they'll set their own
+ password and enroll MFA.
+
+ Authentik has no recovery flow configured, so a temporary password was
+ set — share it with the admin; they'll change it on first login.
+
+ Tenant was created, but the admin invite failed:
+
+ No first-admin info was provided. Invite an admin from the tenant page
+ whenever you're ready.
+ Invite admin
+ Provision new tenant
+
+
+ {{ result.tenantName }} is live
+
+
+
+
{{ dangerError }}
+ +{{ createError }}
-