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 byhas_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
Legal texts
Markdown editor + live preview for:
- Imprint (
/impressumpublic) - Terms (
/agbpublic) - Privacy (
/datenschutzpublic)
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:
- Connect Stripe →
/settings/stripe - Add legal texts →
/settings/legal - Set up invoicing →
/settings/billing - Create landing page →
/settings/landing-page - Create first product →
/products/new - 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.slugPOST /api/landing-page: saves to the draft, live stays untouchedPOST /api/landing-page/publish: copies draft → livePOST /api/landing-page/default: loads the 3-section default template (Hero + Packages + CTA) withbranding.company_nameas 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:3001overrides - 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/maintenancepage)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).
Related
- Getting started: onboarding order
- Packages · Branding · Invoicing