Skip to content

White Label Dashboard

Available in: Total CMS Pro only

The white label feature allows you to customize the Total CMS admin dashboard with your own branding, making it appear as your own custom CMS solution for clients.

White label templates let you inject custom content into specific areas of the admin dashboard, including custom logos, login page content, download authentication pages, and the admin home page.

Total CMS provides white label template locations for content and form customization:

  • whitelabel/login-above
  • whitelabel/login-below
  • whitelabel/forgot-password-above
  • whitelabel/forgot-password-below
  • whitelabel/reset-password-above
  • whitelabel/reset-password-below
  • whitelabel/download-auth-above
  • whitelabel/download-auth-below
  • whitelabel/admin-logo
  • whitelabel/admin-welcome
  • whitelabel/admin-home
  • whitelabel/admin-head
  • whitelabel/admin-body-below

JSON templates for customizing form labels:

  • whitelabel/login-options
  • whitelabel/forgot-password-options
  • whitelabel/reset-password-options
  • whitelabel/download-auth-options

Templates marked with ⭐ are also available in the Standard edition. For Standard edition, save these templates without the whitelabel/ folder prefix:

  • login-above
  • login-options
  • forgot-password-above
  • forgot-password-options
  • reset-password-above
  • reset-password-options
  • download-auth-above
  • download-auth-options
  • admin-welcome

Using the Dashboard (Recommended)

  1. Navigate to /admin/templates in the Total CMS dashboard
  2. Click “New Template”
  3. Enter the template path including the folder prefix, for example: whitelabel/login-above
  4. Add your custom content and save

The whitelabel/ folder structure is created automatically when you save templates with that path prefix. You don’t need to create the folder separately.

Example template names:

  • whitelabel/admin-logo
  • whitelabel/login-above
  • whitelabel/admin-welcome

Manually via File System

If you prefer to create files directly, place them in your templates directory:

tcms-data/
templates/
whitelabel/
admin-logo.twig
login-above.twig
...

Only create the templates you want to customize. If a white label template doesn’t exist, Total CMS will use its default content.

You can create templates either through the dashboard’s template manager at /admin/templates or by manually creating .twig files in the whitelabel folder.

File: whitelabel/admin-logo.twig

The custom logo must be wrapped in a link with the class custom-logo:

<a class="custom-logo" href="" title="Dashboard Home">
<img src="/path/to/your-logo.png" alt="Your Company" style="max-height: 32px;">
</a>
<a class="custom-logo" href="" title="Dashboard Home">
{{ cms.render.image("logo") }}
</a>

Or with an SVG:

<a class="custom-logo" href="" title="Dashboard Home">
<svg width="24" height="24" viewBox="0 0 24 24">
<!-- Your SVG content -->
</svg>
</a>
<a class="custom-logo" href="" title="Home">
{{ cms.svg("logo") }}
</a>

Important: The <a class="custom-logo"> wrapper is required for proper styling and layout. Set the href to blank if you want it to go to the Dashboard homepage. If you want to link outside the Dashboard, you must provide the full URL, not just the path.

File: whitelabel/admin-welcome.twig

Customize just the welcome message at the top of the admin dashboard (lighter alternative to replacing the entire home page):

<div class="dashboard-welcome">
<h1>Welcome to {{ cms.config('siteName') ?: 'Your CMS' }}! 👋</h1>
<p class="dashboard-subtitle">
Manage your website content with ease.
</p>
</div>

With Personalized Greeting:

<div class="dashboard-welcome">
<h1>
{% if cms.user %}
Hello {{ cms.user.name }}, welcome back! 🎉
{% else %}
Welcome to Your Custom CMS! 👋
{% endif %}
</h1>
<p class="dashboard-subtitle">
{% set hour = "now"|date("H") %}
{% if hour >= 5 and hour < 12 %}
Good morning! Ready to create something amazing?
{% elseif hour >= 12 and hour < 17 %}
Good afternoon! Let's get some work done.
{% else %}
Good evening! Time to wrap up the day.
{% endif %}
</p>
</div>

Note: Use whitelabel/admin-welcome.twig when you only want to customize the welcome message. Use whitelabel/admin-home.twig (shown below) when you need to replace the entire dashboard home page.

File: whitelabel/login-above.twig

<div class="login-branding">
<img src="/images/company-logo.png" alt="Your Company" style="max-width: 200px; margin-bottom: 2rem;">
<h2>Client Portal Login</h2>
<p>Welcome to your content management system.</p>
</div>

To customize login form labels for localization, create a separate options template with JSON content.

File: whitelabel/login-options.twig

{
"emailLabel": "Correo Electrónico",
"passwordLabel": "Contraseña",
"rememberLabel": "Mantenerme conectado",
"submitLabel": "Iniciar sesión",
"forgotPasswordLabel": "¿Olvidó su contraseña?"
}

Available Options:

OptionDefaultDescription
emailLabelEmailLabel for the email input field
passwordLabelPasswordLabel for the password input field
rememberLabelKeep me signed inLabel for the persistent login checkbox
submitLabelSign inText for the submit button
forgotPasswordLabelForgot Password?Text for the forgot password link
showForgotPasswordtrueWhether to show the forgot password link

File: whitelabel/login-below.twig

<div class="login-footer">
<p>Need help? Contact us at <a href="mailto:support@yourcompany.com">support@yourcompany.com</a></p>
<p class="copyright">&copy; {{ "now"|date("Y") }} Your Company. All rights reserved.</p>
</div>

File: whitelabel/download-auth-above.twig

<div class="download-header">
<h2>Secure File Access</h2>
<p>Enter the password to access this file.</p>
</div>

To customize download authentication form labels, create a separate options template with JSON content.

File: whitelabel/download-auth-options.twig

{
"passwordLabel": "Contraseña",
"submitLabel": "Descargar"
}

Available Options:

OptionDefaultDescription
passwordLabelPasswordLabel for the password input field
submitLabelDownloadText for the submit button

File: whitelabel/download-auth-below.twig

<div class="download-footer">
<p class="help-text">
Files are protected and require authentication.
If you need assistance, please contact support.
</p>
</div>

File: whitelabel/forgot-password-above.twig

<div class="forgot-password-header">
<h2>Forgot Your Password?</h2>
<p>Enter your email address and we'll send you a reset link.</p>
</div>

To customize forgot password form labels, create a separate options template with JSON content.

File: whitelabel/forgot-password-options.twig

{
"emailLabel": "Correo Electrónico",
"submitLabel": "Enviar Enlace de Restablecimiento",
"backToLoginLabel": "&larr; Volver al Inicio de Sesión"
}

Available Options:

OptionDefaultDescription
emailLabelEmailLabel for the email input field
submitLabelSend Reset LinkText for the submit button
backToLoginLabel← Back to LoginText for the back to login link

File: whitelabel/reset-password-above.twig

<div class="reset-password-header">
<h2>Reset Your Password</h2>
<p>Enter your new password below.</p>
</div>

To customize reset password form labels, create a separate options template with JSON content.

File: whitelabel/reset-password-options.twig

{
"passwordLabel": "Nueva Contraseña",
"confirmPasswordLabel": "Confirmar Contraseña",
"submitLabel": "Restablecer Contraseña"
}

Available Options:

OptionDefaultDescription
passwordLabelNew PasswordLabel for the new password input field
confirmPasswordLabelConfirm PasswordLabel for the confirm password input field
submitLabelReset PasswordText for the submit button

File: whitelabel/admin-head.twig

Inject custom content into the <head> section of all admin pages. Perfect for custom CSS, analytics, or meta tags:

{# Custom CSS for branding #}
<style>
:root {
--totalform-accent: 45 0.15 220; /* Custom brand color in OKLCH */
}
.dash-sidebar {
background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%);
}
</style>
{# Custom fonts #}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
{# Analytics or tracking code #}
<script>
// Your analytics code here
</script>
{# Custom favicon #}
<link rel="icon" type="image/png" href="/images/custom-favicon.png">

Common Use Cases:

  • Custom CSS for dashboard theming
  • Web fonts for consistent branding
  • Analytics/tracking scripts
  • Custom favicons
  • Meta tags for internal tools
  • Third-party service integrations

File: whitelabel/admin-body-below.twig

Inject content before the closing </body> tag. Ideal for chat widgets, help systems, or custom JavaScript:

{# Customer support chat widget #}
<script>
(function() {
// Chat widget initialization
window.ChatWidget = {
apiKey: 'your-api-key',
position: 'bottom-right'
};
})();
</script>
<script src="https://chat.yourservice.com/widget.js" async></script>
{# Custom admin functionality #}
<script>
document.addEventListener('DOMContentLoaded', function() {
// Add custom keyboard shortcuts
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.key === 'k') {
// Open quick search
e.preventDefault();
// Your custom functionality
}
});
});
</script>

Common Use Cases:

  • Live chat widgets (Intercom, Drift, Help Scout)
  • Help documentation widgets
  • Custom JavaScript functionality
  • Keyboard shortcuts
  • Admin notifications system
  • Performance monitoring scripts

File: whitelabel/admin-home.twig

Replace the entire admin home page with custom content:

<div class="custom-dashboard">
<h1>Welcome to Your CMS</h1>
<div class="dashboard-grid">
<div class="dashboard-card">
<h3>Quick Start Guide</h3>
<ul>
<li><a href="/admin/collections/pages">Manage Pages</a></li>
<li><a href="/admin/collections/blog">Manage Blog Posts</a></li>
<li><a href="/admin/media">Media Library</a></li>
</ul>
</div>
<div class="dashboard-card">
<h3>Resources</h3>
<ul>
<li><a href="https://yourcompany.com/docs" target="_blank">Documentation</a></li>
<li><a href="https://yourcompany.com/support" target="_blank">Support</a></li>
<li><a href="https://yourcompany.com/training" target="_blank">Training Videos</a></li>
</ul>
</div>
<div class="dashboard-card">
<h3>Need Help?</h3>
<p>Contact our support team:</p>
<p><strong>Email:</strong> support@yourcompany.com<br>
<strong>Phone:</strong> (555) 123-4567</p>
</div>
</div>
</div>
<style>
.custom-dashboard {
padding: 2rem;
}
.dashboard-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.5rem;
margin-top: 2rem;
}
.dashboard-card {
background: white;
border: 1px solid oklch(var(--totalform-border-color));
border-radius: var(--totalform-radius);
padding: 1.5rem;
}
.dashboard-card h3 {
margin-top: 0;
color: oklch(var(--totalform-accent));
}
.dashboard-card ul {
list-style: none;
padding: 0;
}
.dashboard-card li {
margin: 0.5rem 0;
}
.dashboard-card a {
color: oklch(var(--totalform-accent));
text-decoration: none;
}
.dashboard-card a:hover {
text-decoration: underline;
}
</style>

When customizing the admin home page, you can use the built-in dashboard widgets macro for a consistent look. Import the widgets macro and use the available components:

{% import 'dashboard-widgets.twig' as dashboard %}
{# Get dashboard data #}
{% set stats = cms.admin.dashboardStats() %}
{% set collections = cms.admin.dashboardRecentCollections() %}
{% set emptyCollections = cms.admin.dashboardEmptyCollections() %}
{% set systemStatus = cms.admin.dashboardSystemStatus() %}
{# Display welcome message #}
{{ dashboard.welcomeMessage('Admin') }}
{# Display quick stats #}
{{ dashboard.statsCard(stats) }}
{# Display quick actions #}
{{ dashboard.quickActions() }}
{# Collections table #}
{{ dashboard.collectionsTable(collections) }}
{# Recent activity #}
{{ dashboard.recentActivity() }}
{# Empty collections alert #}
{{ dashboard.emptyCollectionsAlert(emptyCollections) }}
{# System status (admin only) #}
{% if cms.isAdmin() %}
{{ dashboard.systemStatus(systemStatus) }}
{% endif %}

Available Widgets:

WidgetDescription
dashboard.statsCard(stats)Quick statistics overview
dashboard.quickActions()Quick action buttons
dashboard.collectionsTable(collections)Collections table with recent activity
dashboard.recentActivity()Recent activity feed
dashboard.emptyCollectionsAlert(emptyCollections)Alert for collections without content
dashboard.systemStatus(systemStatus)System information (PHP version, cache status, etc.)
dashboard.welcomeMessage(name)Welcome message with optional name
dashboard.newUserWelcome()Welcome screen for new users

All white label templates have access to standard Twig functionality and Total CMS globals:

  • {{ cms.config('key') }} - Access configuration values
  • {{ cms.env }} - Current environment (development, production, etc.)
  • {{ "now"|date("Y") }} - Current year (useful for copyright notices)
  • All standard Twig filters and functions

White label content inherits the admin dashboard’s CSS variables for consistent theming:

/* Common CSS variables available */
--totalform-accent /* Primary accent color */
--totalform-border-color /* Border colors */
--totalform-text-color /* Text color */
--totalform-bg /* Background color */
--totalform-radius /* Border radius */
--totalform-nearwhite /* Light background */
--totalform-darkgray /* Dark text */

Example usage in inline styles:

<div style="border: 1px solid oklch(var(--totalform-border-color)); border-radius: var(--totalform-radius);">
<!-- Content -->
</div>

Don’t overcomplicate white label templates. Focus on essential branding elements.

Ensure your white label content looks good on desktop, tablet, and mobile devices.

When linking to assets, use relative paths or absolute URLs:

{# Good #}
<img src="/images/logo.png" alt="Logo">
<img src="https://yourcdn.com/logo.png" alt="Logo">
{# Avoid #}
<img src="images/logo.png" alt="Logo">

Include proper alt text for images, use semantic HTML, and ensure sufficient color contrast.

Remember that your white label templates will persist across Total CMS updates, so avoid relying on undocumented features.

  • Wrapper Required: Must be wrapped in <a class="custom-logo">
  • Recommended Height: 30-50px for optimal display
  • Format: PNG, SVG, or JPG
  • Background: Transparent backgrounds work best
  • File Size: Keep under 100KB for fast loading
<a class="custom-logo" href="/admin" title="Dashboard Home">
<img
src="/images/client-logo.svg"
alt="Client Name"
style="height: 40px; width: auto;"
>
</a>

To disable white label customization, simply delete or rename the white label template files. Total CMS will automatically revert to default content.

  • Verify the <a class="custom-logo"> wrapper is present
  • Check that the image path is correct
  • Ensure the image file exists and is accessible
  • Check browser console for 404 errors
  • Ensure you’re using CSS variables correctly: oklch(var(--variable-name))
  • Check for typos in CSS variable names
  • Verify inline styles use proper syntax
  • Confirm template file is in resources/templates/whitelabel/ directory
  • Check file naming matches exactly (case-sensitive)
  • Verify file extension is .twig
  • Clear Twig template cache if needed
  • Avoid extremely wide content (> 1200px)
  • Test responsive behavior on mobile devices
  • Use CSS Grid or Flexbox for responsive layouts
  • Don’t override core dashboard CSS classes

White label templates are rendered server-side with Twig. Follow these security guidelines:

  1. Never Include User Input: Don’t render unsanitized user-provided content
  2. Escape Output: Use Twig’s auto-escaping (enabled by default)
  3. Validate External Resources: Only link to trusted external resources
  4. Avoid JavaScript: Keep templates simple; avoid complex JavaScript
  5. Test Thoroughly: Review all custom content before deploying to production

White label features are Pro only. If a user downgrades from Pro to a lower edition:

  • White label templates will be ignored
  • Default Total CMS branding will be restored
  • Template files remain in place (not deleted)
  • Upgrading to Pro will automatically re-enable white label features

For questions or assistance with white labeling, please refer to the Total CMS documentation or contact support.