Your client wants a management tool with their logo, their colors, their domain. They don't want the software to look like a generic product. If the white-label platform you resell doesn't let you customize everything in a few clicks, you're losing margin and trust. We, at Meteora Web, have been building white-label solutions for years: we know how costly it is when the brand stays in the background. Let's start from the concrete problem: how do you deliver a cohesive experience without reinventing the architecture every time?
Why is brand customization a competitive advantage for your agency?
When you resell a white-label SaaS, the difference isn't the feature – it's perception. A client who sees their logo on the login page, their primary color in buttons, their domain in the URL perceives the software as theirs. Not as a third-party platform. This means lower onboarding friction and higher retention. Plus, you prevent the client from seeking the original producer (you) and bypassing your agency. Brand customization is a silent competitive barrier.
We built our proprietary platform with Laravel and Livewire precisely to give this full control – without touching code per client, but with the flexibility to do so if needed.
How to customize logo and colors in a white-label SaaS?
The point is: not every customization needs to be a fork. The platform should expose options at the database and theme level. Here's how it works in practice.
Sponsored Protocol
Logo: where to apply and how to scale it
The logo must appear in at least three critical places: dashboard header, login page, transactional emails (if sent by the system). The most robust solution is to save the logo as a file uploaded by the agency (or by the end client, if you allow it) into a dedicated directory, with standardized dimensions. We use a 2:1 ratio (width-height) with a maximum of 200x100px for the header, and a larger version for login (400x200). The backend (PHP/Laravel) uploads the file, resizes it with Intervention Image and associates it to the tenant.
Example code for resized save:
use Intervention\Image\Facades\Image;
$tenantId = auth()->user()->tenant_id;
$file = $request->file('logo');
$filename = 'logo_'.$tenantId.'.'.$file->getClientOriginalExtension();
$image = Image::make($file);
$image->resize(200, 100, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
$image->save(storage_path('app/public/logos/'.$filename));
// Associate to tenant
Tenant::where('id', $tenantId)->update(['logo' => $filename]);
CSS to display the logo dynamically:
.logo-header {
background-image: url('/storage/logos/{{ $tenant->logo }}');
width: 200px;
height: 100px;
background-size: contain;
background-repeat: no-repeat;
}
Actionable now: Add an uploader in your agency admin panel. Let the client (or you on their behalf) choose the file. Resize automatically and apply the logo to all public and dashboard views.
Sponsored Protocol
Colors: primary, secondary and accent palette
Colors should be managed with custom CSS variables. The platform must save (e.g. in a tenant_settings table) hex values for each key color: primary, secondary, background, text. Then inject these variables into the <head> or via a dynamic CSS file.
// Controller
$settings = TenantSetting::where('tenant_id', $tenantId)->first();
$primaryColor = $settings->primary_color ?? '#0066CC';
$secondaryColor = $settings->secondary_color ?? '#FF6600';
If the client also wants gradients or shadows, add extra variables. The key is never hardcode colors in components. We moved all fixed rules to CSS variables in an afternoon – then customization became instant for every new client.
Custom domain: why owning it beats lifetime fees?
A white-label domain (e.g., app.clientcompany.com instead of platform.agency.com/clients/clientcompany) conveys professionalism. But there's a more pragmatic reason: if the client owns the domain, they can redirect elsewhere if they want. If instead you use a subdomain of your platform, the client is tied to you – but you also have to manage DNS for each new entity.
Sponsored Protocol
We recommend that the client points their own domain via a CNAME record. Your platform only needs to accept it and automatically generate an SSL certificate with Let's Encrypt.
Domain configuration: CNAME, SSL certificate, automation
Step 1: The client creates a CNAME record from their domain (e.g. app.theircompany.com) to your base domain (e.g. app.my-whitelabel.com).
Step 2: Your platform detects the request based on the Host header. You can do this with a middleware in Laravel that identifies the tenant.
// Middleware TenancyByDomain
$host = $request->getHost();
$tenant = Tenant::where('domain', $host)->first();
if (!$tenant) {
abort(404);
}
// Set tenant in container
app()->instance('current_tenant', $tenant);
Step 3: SSL certificate. Automate with Certbot or a Laravel package like spatie/laravel-lets-encrypt. When a user adds a new domain, a job fires to issue the certificate. We do it with a scheduled Artisan command:
// App\Console\Commands\IssueSSL
foreach (Tenant::whereNotNull('domain')->where('ssl_issued', false)->get() as $tenant) {
$cert = LetsEncrypt::create()
->setDomain($tenant->domain)
->setEmail('admin@my-whitelabel.com')
->issue();
$tenant->update(['ssl_issued' => true, 'ssl_expires_at' => $cert->expiresAt()]);
}
Warning: Some providers (e.g. Cloudflare) offer SSL proxy, but if the client wants end-to-end SSL you still need the certificate on your server. Automation is mandatory: if renewal stalls, the site goes offline. We fixed a case where a server didn't renew automatically – we added a cron and a weekly check.
Sponsored Protocol
What are common mistakes to avoid in brand customization?
- Forking for every client. If you have to edit frontend code for each new color, setup time explodes. Use CSS variables and DB config.
- Not resizing logos. If the client uploads a 5 MB image, the page takes seconds to load. Optimize on save – we reduced weight by 60% for one of our e-commerce clients.
- Forgetting emails. Transactional emails (notifications, invoices) must use the client's logo and colors. Include a custom header in the HTML template.
- Not testing on mobile. Light colors on white background or poor contrast. Use tools like WebAIM Contrast Checker.
- Relying on third-party solutions with lifetime fees. If your white-label provider charges you for every custom domain or branding, you lose margin. Prefer proprietary stack or open source that gives you full control.
What to do now to offer a white label with your brand
- Audit your current white label: How long does it take to customize logo and colors for a new client? If more than 30 minutes, it's not scalable.
- Implement dynamic CSS variables and an admin panel where you or the client can set hex values. You'll reduce setup from hours to minutes.
- Automate domain and SSL: Create an interface to associate a custom domain and a job for the certificate. Test with a trial domain.
- Review transactional emails: Ensure the tenant's logo and colors are injected. Use a template system (e.g. Laravel Mailable with tenant variables).
- Read our full white label guide: SaaS White Label for Agencies – there you'll find the big picture, of which this customization is a fundamental piece.
Remember: a white label without brand customization is just a shallow reskin. The real value is making the client feel like that software was built for them. We work every day to make this process automatic and frictionless. If you want to dig deeper, get in touch – we talk numbers, not slides.
Sponsored Protocol
Zenith White Label is the all-in-one platform to run your business — clients, scheduling, deadlines, invoicing and WhatsApp reminders, all from your browser. No installation required.
Discover Zenith White Label →