Skip to main content

Settings: overview

[admin]

All tabs under Sidebar → Settings at a glance. Click the respective link for details.

Advanced settings​

At the top right of the settings page you find the button "⚙️ Advanced settings" (/settings/advanced): a 3-column grid with all configuration areas at a glance. The quick tabs on /settings offer the same content for the frequently used areas.

Row 1: Branding · Invoicing · Legal texts Row 2: Widget · Custom Domain · Landing Page Row 3: Stripe · API & Integrations · Subscription & Plan Row 4: PrintFarm Settings · Danger Zone · Email Templates

Tiles for features that are not available for the current access are hidden: since 2026-05-29 there is no more 🔒 badge / lock banner / upgrade CTA (feature promotion via newsletter and app store, Phase 4). Directly opening a feature page that is not available → 404. Custom Domain and PrintFarm are in preparation and are not offered as available features yet (see the respective sections below).

Mobile (< 768px): 1-column stack. Tablet (< 1024px): 2 columns.

URL structure: every tab has its own URL​

Since the tab router refactor every settings tab has its own URL:

  • /settings → redirects to /settings/branding
  • /settings/branding: colors, font, logo, favicon, company name, support email
  • /settings/billing: legal form, address, tax ID, invoice logo
  • /settings/legal: imprint, terms, privacy (Markdown + live preview)
  • /settings/emails: email templates with template variables
  • /settings/stripe: Stripe Connect status + onboarding/dashboard links
  • /settings/landing-page: drag-and-drop landing page builder
  • /settings/widget: embed code generator (only when the widget feature is active; otherwise 404)
  • /settings/domain: custom domain setup — in preparation (gated by has_custom_domain; shown as available only once White-Label is signed off)
  • /settings/subscription: current access + upgrade options + invoice history

Direct bookmarks and browser history work as expected: no tab state bug.

Quick tabs vs. advanced settings​

The tab bar on /settings shows: Branding · Subscription · Email Templates · Landing Page · Invoicing · Legal texts · Stripe · Widget · Domain. Widget and Domain only appear when the respective feature is active, otherwise the tabs are hidden (no more 🔒). Domain is in preparation.

Tabs​

Branding​

Logo, 9 colors, font, login texts, button style. Applies to the portal, landing page and widget. → Branding

Invoicing​

Legal form, address, tax, invoice logo, Stripe Tax settings. → Invoicing

Packages​

Create license packages, prices, term, Stripe sync, restrictions. → Packages

Stripe​

Stripe Connect onboarding (Express account), flat application fee (10 % in the beta, see Access & terms).

  • New account → onboarding flow
  • Active account → Express dashboard login
  • Status indicator: pending / active / restricted

Important: in the Stripe dashboard also enable:

  • Tax → Automatic Tax ON
  • Add tax registration Germany
  • Complete company address

Markdown editor + live preview for:

  • Imprint (/impressum public)
  • Terms (/agb public)
  • Privacy (/datenschutz public)

Stored in the provider DB: a custom domain serves them under its own URL.

Landing Page​

Drag-and-drop builder with sections (Hero, Features, Packages, Carousel, FAQ, Footer CTA). → Landing Page Builder

Widget​

Embed code generator + live preview for the license portal button (Shopify, WordPress, others). → Widget

Domain​

Set up a custom domain (CNAME + TXT verification, Vercel auto-provisioning). In preparation — not offered as an available feature until White-Label is signed off. → Custom Domain

Email templates​

Mail templates for invitation, activation, cancellation, notifications. Dynamic placeholders like {{customer_name}}, {{tenant_name}}.

FAQs​

CRUD for provider-specific FAQs (the sidebar entry in the portal "FAQ & Support" shows these). Can be grouped by categories. A template library for a quick start.

Onboarding checklist (setup popup)​

At the bottom right of every admin page a dark popup "🚀 Setup (X/6)" appears that guides you through the first 6 onboarding steps:

  1. Connect Stripe → /settings/stripe
  2. Add legal texts → /settings/legal
  3. Set up invoicing → /settings/billing
  4. Create landing page → /settings/landing-page
  5. Create first product → /products/new
  6. Create first package → /payments

Click the popup → an expanded list with a status icon (✅/○), a → link to the respective page and a ✓ button to mark the step manually as done (e.g. when Stripe is already configured via test mode).

Auto-check per step: Stripe (tenants.stripe_account_id), Legal (settings.legal_imprint + legal_privacy + legal_terms), Billing (settings.billing.legal_name), Landing Page (landing_page.enabled), product count and package count via catalog_items / license_packages.

The manually-done state lives in tenants.settings.onboarding_manually_completed[]: steps can be made "undone" again at any time by having the auto-check fail and the step removed from the array.

The × button closes the popup permanently (LocalStorage key licensio_checklist_dismissed). When all 6 steps are done, the popup is no longer shown anyway.

Landing Page: draft/live system (like Shopify)​

Concept: the builder always edits the draft (landing_page.draft); customers see the live version (landing_page.live). Only when the provider explicitly clicks 🚀 Go live is the current draft taken over as the new live version.

Status indicator at the top of the builder:

  • 🟢 Live: draft = live, everything is published.
  • 🟠 Draft: unsaved changes compared to live; "Go live" is active.

Endpoints:

  • GET /api/landing-page: returns draft + live snapshot + tenant.slug
  • POST /api/landing-page: saves to the draft, live stays untouched
  • POST /api/landing-page/publish: copies draft → live
  • POST /api/landing-page/default: loads the 3-section default template (Hero + Packages + CTA) with branding.company_name as a substitution; initially sets live = draft

Auto-load of the template: if landing_page is still empty when first opened, the builder automatically calls /api/landing-page/default: no banner, no confirm dialog. The provider immediately sees a ready-made template to edit.

Preview URL uses tenant.slug dynamically:

  • Dev: NEXT_PUBLIC_PORTAL_URL=http://localhost:3001 overrides
  • Prod: https://${tenant.slug}.licensio.io/?preview=${token} (desktop) or &mobile=true (mobile)
  • The token-based preview shows the draft: normal visitors see live

Backwards compat (before migration 053): tenants with the old flat landing_page structure ({ enabled, sections, header, footer, preview_token }) still work: the portal reads with a fallback, and on the first save the API automatically migrates to the draft/live wrapped structure.

Maintenance mode (separate toggle)​

In Settings → General (or via the platform admin):

  • maintenance_mode: portal completely blocked (shows the /maintenance page)
  • admin_maintenance_mode: only the admin area blocked (Phase 2: separate toggle, migration 044)

During maintenance: login, the public legal texts and /api/* are exempt, everything else is blocked.

Frequently asked questions​

Where are the platform settings (for the licensio team)? internal.licensio.io (its own app) for platform admins. Provider settings are all in admin.licensio.io/settings.

Can the order of the tabs be changed? Currently hardwired (SettingsTabs.tsx). Phase 2 if needed.

Direct link to a tab? URL parameter: /settings?tab=stripe opens the Stripe tab immediately. Also used by the Stripe Connect OAuth return (?tab=stripe&connected=true).