Zum Hauptinhalt springen

Creator-Registrierung

[admin] [signup]

Self-Service-Registrierung unter https://admin.licensio.io/register. Neue Creators können ihren Account und ihr Portal in unter 2 Minuten anlegen — ohne Kreditkarte für den Free-Plan.

Hinweis: Die öffentliche Marketing-Seite unter https://licensio.io (eigene Next.js-App apps/marketing, separates Vercel-Deployment, i18n EN/DE mit Flaggen-Dropdown im Header) verlinkt aus Header (Sign up) + Hero (Start for free →) + Pricing-Cards direkt auf https://admin.licensio.io/register?plan=<key>&lang=<locale>. Plan-Param + Sprache werden im Register-Form übernommen. Scale-Karte und Contact-Section unten öffnen mailto:malte@licensio.io.

Sprache auf der Register-Seite: Resolution-Reihenfolge ist ?lang=en|de (URL-Param) > LocalStorage licensio_locale > Default en. Flag-Dropdown rechts oben erlaubt manuellen Wechsel; Auswahl wird in admin-LocalStorage persistiert (cross-domain ist licensio.ioadmin.licensio.io getrennt). Form-Labels, Plan-Features, Buttons, Error-Messages alles übersetzt. Phase 2: gleiche i18n-Logik im Admin-Dashboard.

Lifecycle nach Registrierung

  1. Tenant + Auth-User + tenant_users-Verknüpfung werden in /api/register erzeugt (Self-Service-Signup, direkt bestätigte Email).
  2. Vercel-Subdomain-Provisioning: <slug>.licensio.io wird automatisch beim Vercel-Portal-Projekt registriert (best-effort — Fehler logged, Registrierung selbst bricht nicht ab; siehe apps/admin/lib/vercel-domain.ts).
  3. Welcome-Email an die Registrier-Adresse (Resend, from: noreply@licensio.io): "Welcome to licensio.io 🎉" + CTA zu https://${slug}.licensio.io + Hinweis auf admin.licensio.io. Best-effort.
  4. Free-Plan: redirect zu /onboarding. Basic/Pro: redirect zu Stripe-Checkout-Session (mode: 'subscription', Price-ID aus LICENSIO_BASIC_PRICE_ID / LICENSIO_PRO_PRICE_ID). Metadata: tenant_id, tenant_slug, plan, licensio_subscription: 'true'.
  5. Stripe-Webhook (/api/stripe/licensio-webhook) verarbeitet checkout.session.completed → updated tenants.plan, plan_started_at, licensio_stripe_customer_id, licensio_subscription_id. Spätere subscription.updated/deleted/payment_failed Events updaten den Plan-Status weiter (Cancel → 'free', Plan-Wechsel → Price-ID-Mapping).

Forgot-Password / Reset-Password

  • /forgot-password (maintenance-exempt): Email-Input → POST /api/auth/forgot-password ruft supabase.auth.resetPasswordForEmail(email, { redirectTo: '/reset-password' }). Antwort immer { success: true } (kein Info-Leak).
  • /reset-password (maintenance-exempt): wartet auf Supabase-PASSWORD_RECOVERY Event, ruft dann clientseitig updateUser({ password }). Recovery-Session kommt automatisch über den Email-Link; kein separater Server-Endpoint nötig.

Für wen

Neue Creators (Tenants), die mit licensio starten wollen.

Schritt für Schritt

1. Plan wählen

Auf /register vier Karten:

  • Free (0€/Monat, 15% Provision) — keine Kreditkarte nötig
  • Basic (19,99€/Monat, 5% Provision) — ⭐ Empfohlen-Badge, Stripe-Checkout direkt nach Registrierung
  • Pro (49,99€/Monat, 2% Provision) — Stripe-Checkout direkt nach Registrierung
  • Scale (Auf Anfrage, 1% Provision) — 🏢 Enterprise-Badge, kein Self-Service-Checkout: Klick öffnet mailto:hello@licensio.io?subject=Scale Plan

Mehr Details: Plans.

2. Account-Felder ausfüllen

  • Shop / Portal-Name — wird zu Subdomain konvertiert. Live-Preview zeigt <slug>.licensio.io während du tippst. Nur a-z, 0-9, Bindestriche; 3–30 Zeichen
  • E-Mail — primäres Login + Stripe-Customer-Mail
  • Passwort — min. 8 Zeichen
  • Passwort bestätigen
  • AGB + Datenschutz akzeptieren (Pflicht)

Reservierte Subdomains (admin, www, api, wiki, app, docs, mail, support, etc.) werden abgelehnt.

3. Submit

Backend führt aus:

  1. Validation (Email-Format, Passwort-Länge, Slug-Pattern)
  2. Slug + Email Eindeutigkeits-Check
  3. auth.admin.createUser({ email_confirm: true }) — Account direkt aktiv ohne Mail-Bestätigung
  4. tenants INSERT mit Default-Branding (primary_color: #0070F3, button_style: rounded)
  5. tenant_users INSERT mit role='admin'
  6. Free → Redirect zu /onboarding
  7. Basic / Pro → Stripe Checkout-Session erstellen, Redirect zur Stripe-Checkout-URL. Scalemailto:hello@licensio.io?subject=Scale Plan (kein Self-Service-Checkout)

Bei Fehlern wird der Auth-User + Tenant-Eintrag rückgängig gemacht (Rollback).

4. Onboarding-Wizard

Nach erfolgreicher Registrierung führt ein 5-Schritte-Wizard durch:

  1. Willkommen — Portal-URL <slug>.licensio.io in einer prominenten Info-Box mit Hinweis "Dieser Name wurde bei der Registrierung festgelegt und kann nicht mehr geändert werden". Branding-Anpassungen sind weiterhin möglich.
  2. Branding — Firmenname + Primärfarbe (Logo + weitere Farben später im Dashboard)
  3. Stripe Connect — Klick auf "Stripe verbinden" startet Express-Onboarding via /api/stripe/connect/authorize?return=onboarding. Nach Stripe-Setup landest du wieder auf /onboarding?step=4&stripe=connected.
  4. Erstes Produkt — Direkt-Link zur Produkt-Anlage (oder skip)
  5. Fertig — Portal-URL mit Copy-Button, Übersicht "Was als nächstes", Link zum Dashboard

Progress-Bar oben (5 Punkte) + Step-Counter unten zeigen den Fortschritt. Slug wird in localStorage persistiert. URL-Parameter ?step=N springt zum entsprechenden Schritt (z.B. nach Stripe-Connect-Return).

5. Plan-Gates im Admin

Features, die nicht im aktuellen Plan enthalten sind, werden ausgeblendet statt gesperrt (seit 2026-05-29, kein Lock-Banner / 🔒-Badge / Upgrade-CTA mehr):

  • Widget- + Domain-Tab in Settings sowie die zugehörigen Advanced-Kacheln erscheinen nur, wenn der Plan das Feature hat
  • Bulk Import, API, PrintFarm analog — Nav-Eintrag fehlt komplett ohne das Feature
  • Direktaufruf einer Feature-Page ohne Berechtigung → 404 (notFound())
  • Feature-Promotion läuft über Newsletter + App-Store (Phase 4), nicht mehr über Lock-Hinweise

Sichtbarkeits-Logik in apps/admin/lib/plans.ts (isFeatureAvailable + has_*-Flags). apps/admin/components/PlanGate.tsx rendert bei fehlendem Feature null (defensive Content-Schicht, future-proof). Backend-API-Routes prüfen den Plan zusätzlich serverseitig (403).

Häufige Fragen

Was wenn der Shop-Name schon vergeben ist? Frontend bekommt 409 Conflict mit Fehlermeldung "Dieser Shop-Name ist bereits vergeben". Anderen Namen wählen.

Wie schnell ist mein Portal erreichbar? Sofort. <slug>.licensio.io zeigt direkt nach Registrierung dein Portal mit Default-Branding. SSL via Vercel-Wildcard automatisch.

Kann ich vom Free-Plan auf Basic/Pro upgraden? Bei der Erstregistrierung wählst du den Plan direkt — Basic/Pro gehen über Stripe Checkout, Scale per Mail an Sales. Wechsel eines bestehenden Plans (z. B. Free → Basic nach 3 Monaten) ist Phase 2; bis dahin: Mail an Support.

Was passiert bei abgebrochenem Stripe-Checkout (Basic / Pro)? Account ist bereits angelegt mit dem gewählten Plan. User landet zurück auf /register?cancelled=true mit Hinweis. Account kann später durch erneuten Checkout aktiviert werden — Plan-Status bleibt aber wie gewählt (zahlt nichts solange keine aktive Stripe-Subscription besteht).

Werden Daten beim Account-Löschen DSGVO-konform behandelt? Tenant-Löschung läuft über Support-Anfrage. DSGVO Art. 17 wird mit tenant_users + tenants gelöscht; Customer-Daten in deleted_customers archiviert (anonymisiert).

Verwandt