White-Label Customization Guide for AcelleMail

AcelleMail's Extended License allows full re-branding — every "AcelleMail" reference can be replaced with your brand name, every screen recoloured, every customer email sent from your domain. This guide walks every customisation point: branding settings, custom CSS, custom domain + TLS, transactional email templates, and the upgrade-safe pattern for layout/Blade overrides.

What this is for

AcelleMail's Extended License allows full re-branding — every "AcelleMail" reference can be replaced with your brand name, every screen recoloured, every customer email sent from your domain. The Regular License doesn't allow this.

This guide walks every customisation point in the order you'd typically apply them, ending with the upgrade-safe pattern for deeper Blade/CSS overrides.

Before you start: make a clone of your install (rsync to a staging server) and run customisations against the clone first. Some changes are subtle enough that you'll want to compare side-by-side with the original to confirm nothing broke.

Prerequisite: the SaaS setup guide is the typical context for white-labelling. You can also white-label a single-tenant install if you want a custom internal tool.

Step 1 — Branding settings (covers ~80% of the work)

These four settings cascade to every screen + every system email:

In Admin → Settings → General → Branding:

Field Format Where it shows
App Name Plain text, ≤ 60 chars Browser tab, navbar logo (if no logo image), email subject prefixes, "Powered by..." in system emails
Logo PNG or SVG, recommended ≤ 200×60px transparent Top-left of every authenticated page; in email headers (if email template references it)
Logo Light (for dark backgrounds) PNG or SVG Email header on dark themes; login page if dark mode
Favicon 32×32 ICO or PNG Browser tab icon
Primary Color Hex (e.g. #0066CC) Button backgrounds, link color, active-state highlights, email CTA button color
Secondary Color Hex Sub-actions, secondary buttons
Email Footer Text Plain text Bottom of every customer-facing system email (welcome, password reset, billing receipt, campaign-status notifications)

Save → reload the admin to confirm. Then log in as a test customer to verify the customer-facing screens picked up the changes (some are cached for 5 min).

Logo tips:

  • Use SVG when possible — scales perfectly at every resolution.
  • For PNG, export at 2× the displayed size (e.g. 400×120 for a 200×60 slot) to look crisp on retina displays.
  • Light variant: needed if your primary logo is a dark color and your email templates use a dark header.
  • Test the favicon at small size — letterforms that look fine at 200px can be illegible at 32×32.

Step 2 — System emails (transactional)

The system-email templates control what your customers see when AcelleMail sends them welcome / password-reset / verification / billing emails. These are seen by every paying customer in their first 5 minutes — they're the highest-leverage white-label work.

In Admin → System Emails:

Template When sent Customisation priority
Welcome After successful signup + email verification High — first impression
Email Verification Right after signup High — must look legit, not phishy
Password Reset On "forgot password" Medium
Subscription Created After Stripe checkout success High — confirms billing worked
Subscription Cancelled On cancellation Medium — opportunity for re-engagement
Payment Failed After failed renewal attempt High — dunning
Plan Upgrade / Downgrade On plan change Medium
Campaign Status (Sent / Paused / etc.) When customer's campaign changes status Low

For each template:

  • Subject line: write in your brand voice; mention your app name explicitly
  • Body: use the WYSIWYG to set header logo + footer
  • Test by sending to yourself. Most issues are visible only in the rendered email, not the editor preview.

The system emails support these merge tags (insert at appropriate spots):

{NAME}              — customer's name
{EMAIL}             — customer's email
{APP_NAME}          — your branded app name (from Step 1)
{ADMIN_EMAIL}       — your admin email
{LOGIN_URL}         — link to login page
{VERIFICATION_URL}  — for the verification email
{RESET_URL}         — for the password-reset email
{PLAN_NAME}         — current plan name
{CANCEL_URL}        — link to cancel subscription

Step 3 — Custom domain (per-tenant or app-wide)

There are two distinct custom-domain features in AcelleMail. Don't mix them up:

3a. Your white-label app domain (you operate)

Your SaaS app should live on your domain, not app.acellemail.com. If you've followed the Ubuntu install guide, your domain is already configured (the server_name in the nginx vhost). Verify it shows correctly in every email — Acelle uses APP_URL from .env for absolute links:

grep -E '^APP_URL' /var/www/acellemail/.env
# Should show: APP_URL=https://your-brand.com

If wrong, edit it and run php artisan config:clear.

3b. Per-customer custom domain (their customers)

Each paying customer can set up their own custom tracking domain (e.g. click.theircompany.com) — so tracking links in their campaigns show their brand, not yours. Enabled per plan via the custom_domain_enabled option (see SaaS setup Step 3).

The customer-facing flow:

  1. Customer enters their desired subdomain in Settings → Custom Tracking Domain
  2. AcelleMail tells them: "Add a CNAME from click.theircompany.com to track.your-brand.com"
  3. Customer does it at their DNS provider; clicks Verify
  4. AcelleMail attempts to provision a Let's Encrypt TLS cert (auto, via certbot)
  5. On success, their campaign tracking links use click.theircompany.com

Operational caveats:

  • Let's Encrypt rate-limits — at scale (100s of new custom domains/day) you may need a DNS-challenge setup or a wildcard. For Pro tier, single-domain HTTP-challenge is usually fine.
  • If certbot fails (DNS not propagated, port 80 blocked), the customer sees a "Verifying..." spinner indefinitely. Add a status page or admin notification for this.

Step 4 — Custom CSS (visual polish beyond Branding)

The Branding settings cover most visual customisation, but Acelle's Blade templates also support a custom CSS file for finer control.

Drop a custom.css file in /var/www/acellemail/public/css/custom.css. AcelleMail automatically loads it on every page (search app.blade.php for the <link> include). Target Acelle's existing classes:

/* Tighter navbar */
.navbar-main { padding: 8px 16px; }

/* Custom button shape */
.btn-primary { border-radius: 24px; }

/* Hide "Powered by AcelleMail" text in footer (Extended License only) */
.app-footer .powered-by { display: none; }

/* Email preview header — match your brand */
.email-preview-header { background: linear-gradient(135deg, #0066CC, #6633CC); }

After editing, hard-refresh the admin (Ctrl+Shift+R / Cmd+Shift+R) to bypass browser cache.

For email-template CSS (different from app CSS), edit the system-email templates directly in Admin → System Emails — inline styles per the email-rendering rules in Understanding Email Client Rendering Differences.

Step 5 — Upgrade-safe Blade overrides

When the Branding settings + custom.css + system-email templates aren't enough, you can override Acelle's Blade views. The trick is doing it in a way that survives patch-x.x.x.bin upgrades.

Wrong way (will get overwritten by every upgrade):

# Don't do this:
vi /var/www/acellemail/resources/views/auth/login.blade.php

Right way — publish to a vendor-specific override directory:

mkdir -p /var/www/acellemail/resources/views/vendor/overrides
# Copy the file you want to override
cp /var/www/acellemail/resources/views/auth/login.blade.php \
   /var/www/acellemail/resources/views/vendor/overrides/auth-login.blade.php
# Edit the copy
vi /var/www/acellemail/resources/views/vendor/overrides/auth-login.blade.php

Then in your custom AppServiceProvider (or by patching the views finder), tell Laravel to look at the overrides directory first:

// In a custom service provider's boot()
$this->loadViewsFrom(
    resource_path('views/vendor/overrides'),
    'overrides'
);

// And then in routes/web.php (or a router override), point the login route at:
Route::get('/login', fn () => view('overrides::auth-login'));

Document every override in a OVERRIDES.md file at the repo root:

- /resources/views/vendor/overrides/auth-login.blade.php
  - Replaces /resources/views/auth/login.blade.php
  - Changes: removed "AcelleMail" wordmark, added custom social-proof block
  - Last reviewed against Acelle vN.N.N: 2026-05-16

When AcelleMail releases a new version, diff auth/login.blade.php against your override and re-apply any structural changes. Painful but unavoidable for deep customisations.

Step 6 — Removing "Powered by AcelleMail" mentions

Under the Extended License, you can remove every reference. The places to check:

  • ✅ App footer — Branding setting (Step 1)
  • ✅ Email footer — Branding setting (Step 1) + System Email templates (Step 2)
  • ✅ Page titles — Branding's App Name
  • ⚠️ HTML <meta name="generator"> — search resources/views/layouts/app.blade.php
  • ⚠️ Email X-Mailer header — search config/mail.php and app/Library/Mailer/
  • ⚠️ .htaccess / robots.txt comments — search for "AcelleMail"
  • ⚠️ Any inline help links pointing to acellemail.com/docs — replace with your own KB

The ⚠️ items aren't user-visible to your customers but show up in source-view / email-headers / WHOIS-style checks. Audit twice if you're competing with AcelleMail-flavoured competitors.

# Quick audit grep:
sudo grep -rEi "acelle[a-z]*\\.com|powered.by.acelle" /var/www/acellemail/{resources,config,public,app} \
  | grep -v '/vendor/' | head -40

Step 7 — Browser tests

After all of the above, run through this checklist:

  • Open an incognito window → does the login page show your brand only?
  • Sign up as a test customer → does the welcome email look like it came from your company?
  • Verify the email → does the verification email look right?
  • Log in → does the dashboard navbar / footer / colors all match?
  • Trigger a password reset → does the reset email look right?
  • Cancel the test subscription → does the cancellation email look right?
  • View page source on dashboard → search for "acelle" — nothing should appear in user-visible text
  • View email headers — X-Mailer should not say AcelleMail

Common issues

What you see Likely cause Fix
New logo not appearing Browser cache Hard-refresh (Ctrl+Shift+R); also clear AcelleMail cache: php artisan cache:clear
Email logo broken / shows alt text Logo URL is relative; emails need absolute URL Ensure APP_URL in .env is set to https://your-brand.com; re-clear config cache
Custom domain TLS provisioning hangs Customer's DNS not propagated, or port 80 blocked Check DNS: dig +short click.theircompany.com; check certbot logs at /var/log/letsencrypt/letsencrypt.log
Blade override not taking effect loadViewsFrom not registered, or wrong namespace Verify by php artisan view:cache and re-test; check resource_path('views/vendor/overrides') exists
Brand color not applied to buttons Primary Color setting cached Clear cache + hard-refresh; check the rendered <button> for the inline style
Email subject still shows "AcelleMail" System email template not edited Admin → System Emails → edit each template's subject line
php artisan after override changes fails Custom service provider has a syntax error Run php -l on the provider file; fix and re-run

FAQ

Can I sell AcelleMail-derived code (not the SaaS) under my own license? No. The Extended License lets you operate AcelleMail as a SaaS under your brand — it does not grant redistribution rights for the source code. If a customer wants on-prem, they buy their own AcelleMail license.

Can I remove the AcelleMail footer entirely? Yes — per the Extended License terms. The Regular License requires a "Powered by AcelleMail" link in the footer.

What about the Acelle logo in marketing emails sent via my SaaS? Customer-facing marketing emails (campaigns your customers send to their subscribers) don't have any AcelleMail branding by default — they're rendered from the customer's chosen template. No action needed unless the customer's template references AcelleMail.

How do I theme dark mode? AcelleMail's admin has a dark-mode toggle. Custom CSS can target .theme-dark .your-class for dark-mode-only rules. The Logo Light setting (Step 1) is for the dark theme.

Can I use a Tailwind-style design system? Yes via the custom.css route — but be aware that AcelleMail's existing Blade markup uses Bootstrap-flavoured class names. You'll either layer Tailwind alongside (cohabitation is fine) or replace existing classes via Blade overrides (Step 5). For most SaaS operators, the cohabitation route is enough.

What about right-to-left (RTL) language support? AcelleMail's UI has RTL support built-in. Set the language in Admin → Languages, and the layout flips. Custom CSS may need [dir="rtl"] selectors for any layout tweaks you've added.

How often does the underlying AcelleMail UI change? Minor (point) releases rarely touch user-visible HTML; major releases (e.g. v4 → v5) may. Plan to re-test your white-label after every major upgrade — budget 2–4 hours.

Multi-brand from a single install? Acelle doesn't natively support per-tenant theming (only per-customer custom domain). For multi-brand SaaS (you run two separate brands off one install), you'll need either separate AcelleMail installs (cleaner) or a Blade override that switches branding based on the requesting hostname (hacky, harder to upgrade).

Related articles

10 コメント

コメント 4 件

  1. lucas.bernard.…
    Running ~140 customer tenants on a single AcelleMail install. Resource usage scales reasonably with subscriber count, not tenant count, which is nice...
  2. v.petrova.ru
    the white-label setup walkthrough is exactly what we needed. Most SaaS-on-Acelle guides assume you've already figured this out
    1. admin
      thanks for the kind words. We try to keep these source-grounded so they age well.
  3. bos.devops
    Tip for multi-tenant operators: enforce per-tenant rate limits at the queue layer, not just the API layer. One tenant's bad import shouldn't slow the others
    1. admin (編集済み)
      Good tip. The Cloudflare-outbound-rate-limit case is something we hadn't documented
  4. nadia.r.cl
    How do you handle per-tenant DNS? Each customer's domain needs SPF/DKIM — do you walk them through it manually or have an automated DNS-checker?
    1. admin
      Yes, that pattern is supported. The undocumented bit is the order — config:cache MUST come after the migration, not before. Updating the docs to make that explicit.
    2. admin (編集済み)
      Good question. The campaign:rerun audit writes to laravel.log only when the audit decides to force-resume — pure noop runs are silent. We'll add an info-level heartbeat in a future Acelle release to make it easier to monitor.
    3. admin (編集済み)
      for your specific case, I'd recommend testing with `--dry-run` first. The behavior under high load isn't 100% deterministic and we want you to see your own pattern before committing.
    4. admin (編集済み)
      Good question — and one that comes up often enough we should add an FAQ section. Short answer: yes for the common case; the exception is when you're running custom plugins that override the default behavior.

More in SaaS & Multi-tenant