Admin GuidesWhite-Label & Branding

White-Label Branding

Who this guide is for: Organization Owners (or members holding a custom role that grants Branding) who want to customize the EmbayLMS platform with their organization’s brand identity.


Overview

EmbayLMS supports full white-label branding. You can replace the default EmbayLMS colors, logo, and favicon with your organization’s brand assets. The branding is applied globally across the entire platform — every page your learners and instructors see.

What you can customize:

ElementDescriptionPlan
LogoShown in the sidebar, on the sign-in pages and in emailsEvery plan (including Free)
FaviconBrowser tab iconEvery plan (including Free)
ThemePrimary color, page background, card surface, body text, link color and corner style — a live preview and an automatic readability checkStarter and up
FontsA heading face and a text face from eight built-in open-license fonts, or your own .woff2Starter and up
Login pageA background image, a bilingual welcome headline and sub-line, and where the logo sits — on the login, registration and password pagesStarter and up
Learner home heroA banner at the top of the learner home: image, bilingual headline and sub-line, one button to a page or an https addressStarter and up
Public catalogThe storefront visitors see before they have an account: your logo and footer, its own banner, and an editable title and introStarter and up
Custom domainServe the platform from an address you own (e.g., learn.acme.com) — one DNS record, HTTPS automaticStarter and up
Footer and legal pagesYour own footer links, legal line and social icons; your own Terms of Service and Privacy PolicyStarter and up
Custom CSSAdvanced: a stylesheet targeting stable hooks, with live preview and version historyGrowth and up
Platform name and badgeYour own name in place of “EmbayLMS”, and the “Powered by EmbayLMS” badge hiddenGrowth and up

Plan gating (2026-07-23): logo and favicon upload are free on every plan — every organization can put its identity on the portal. The deeper options (theme, fonts, custom domain, pages, footer and legal pages) require the Starter plan or higher; raw custom CSS, the platform name and the badge removal require the Growth plan. On a plan without them, those tabs carry a padlock with “Requires the Starter plan” (or Growth) and open on an upgrade prompt, while the Identity tab keeps working: only its White-label section shows an upgrade banner below Growth.

Where things are (2026-09-18): the Branding page is organized in tabs. Identity (logo, favicon, platform name, badge) · Theme (colors, fonts) · Domain (custom domain) · Pages (login page, learner home hero, public catalog) · Footer & Legal (footer links, legal line, terms and privacy) · Custom CSS. Each tab saves on its own with its Save changes button; leaving a tab with unsaved edits asks you to confirm first.


Prerequisites

  • The Owner role in your organization. Branding is an Owner-level setting: Admins do not see it, and an Owner can grant it to a custom role.
  • A logo file in PNG, SVG or JPG, up to 2 MB (recommended: 200 × 48 px, transparent background)
  • A favicon in ICO or PNG, up to 2 MB (recommended: 32 × 32 px)
  • Your brand color hex codes — at least the primary; background, surface, text and link if your site defines them

Step 1 — Set brand colors

  1. Navigate to Settings → Branding → Theme.
  2. Set each value as a 6-digit hex code, or pick it with the swatch:
    • Primary colour — buttons, active navigation, links’ focus ring. The color of the text on your buttons is chosen for you (white or near-black, whichever reads).
    • Page background — the color behind everything.
    • Card surface — cards, panels and inputs sit on this.
    • Body text — headings and paragraphs.
    • Link colour — text links on the page background and on cards.
    • Corner style — Sharp, Standard or Rounded; applies to buttons, inputs, cards and course covers together.
  3. The preview on the right repaints as you type. It is a miniature of the learner portal (top bar, a course card, a link, an input, a button) rendered from exactly the values the portal will use.
  4. Click Save changes. Reset to platform defaults puts every value back to EmbayLMS navy on warm white.

Readability is enforced, not advised. Every pair a learner reads — body text and links on the page background and on cards, and the button label on the primary — is measured against WCAG 2.2 AA (4.5:1). A pair that fails is listed under the preview with its measured ratio, and Save changes stays disabled until every pair passes. The server applies the same check, so a theme that cannot be read can never reach your learners.

What is not themeable. The teal accent (progress bars, focus rings, the single key action) and the status colors (success, warning, danger, info) are fixed system signals; they stay the same on every theme so their meaning does not drift.

Fonts

Below the colors on the same tab, pick a Headings face and a Text face. Each list shows the face rendered in itself.

  • Built-in faces — Inter and Schibsted Grotesk (the platform defaults), Source Sans 3, Work Sans, Nunito, IBM Plex Sans, Lora and Playfair Display. All are open-source under the SIL Open Font License and are served from EmbayLMS, so no learner request goes to a third-party font service.
  • Upload my own font — one .woff2 file per slot, up to 2 MB. Give it a name, set the weight range the file covers (a variable font spans a range; a static file is one weight — enter it twice), and tick the license confirmation. The confirmation is recorded in the audit log with the save. The file is checked to be a real WOFF2 regardless of its extension.

Uploaded fonts are served from your portal’s own address, so they work on a custom domain without any extra setup. Fonts apply to the portal only: certificates and email keep their own type for print and inbox compatibility.

Why not “enter a Google Fonts name”? Every learner’s browser would fetch the font from Google on every page — a third-party request we would rather not make on your behalf. The built-in set covers the common choices, and any font you are licensed to self-host can be uploaded.


Step 1b — Customize the login page

What learners see before they sign in — the same frame renders on the login, registration, forgot-password, reset-password and verify-email pages.

  1. Navigate to Settings → Branding → Pages → Login page.
  2. Background image — click Upload, pick a PNG or JPG up to 2 MB. Landscape (about 3:2) works best. Remove takes it away again.
  3. Logo placement — Above the card (the default) or Top-left corner. Applies only when an image is set. The logo you uploaded on the Identity tab is the one shown; without one, the platform mark and your platform name appear instead. In the top-left corner your logo sits on a small white chip, so a logo drawn for a light background stays readable on a dark image.
  4. Text on the image — Auto picks light or dark copy from the image’s overall brightness (measured in your browser when you upload). Choose Light or Dark yourself if the text lands on a bright or dark patch.
  5. Welcome headline and Sub-line sit beneath the preview, full width — one field per language. A language left empty falls back to the other, so you can start with one.
  6. The preview on the right is the same layout the page renders. Click Save changes.

With an image, the page splits: image and welcome copy on the left, the sign-in card on the right; on phones the image becomes a band above the card. Without an image, nothing changes — learners see the centered card as today.

The platform console’s own sign-in (/platform/login) is Embay’s and is not affected by any of this.


Step 1c — Add a hero banner to the learner home

The learner home opens on the learner’s next course. A hero banner sits above it — the block your own website opens with — so the portal reads as yours the moment someone signs in. Off by default; nothing is added until you turn it on.

  1. Navigate to Settings → Branding → Pages → Learner home hero.
  2. Tick Show a hero banner on the learner home.
  3. Background image (optional) — click Upload, pick a PNG or JPG up to 2 MB. Wide images (about 3:1) work best. Without one, the banner takes your primary color from the Theme tab.
  4. Text on the image — Auto reads the image’s overall brightness; choose Light or Dark if the text lands on a bright or dark patch. Ignored when there is no image.
  5. Button link (optional) — where the button goes: a page in this platform, written as a path starting with / (for example /courses or /learning-paths), or a secure https:// address on your own site. Anything else is refused, including http:// and links that start with //.
  6. Beneath the preview: Headline (required — the banner will not show without one in at least one language), Sub-line and Button label, one field per language. The button appears only when both a label and a link are set. A language left empty falls back to the other.
  7. The preview shows the banner above a sketch of the learner home. Click Save changes.

Learners see the banner as the first block of their home page, in their own language, above the greeting and the continue-learning card. On phones it stacks the same way. A path link opens inside the platform; an https:// link opens the address as given.


Step 1c′ — Brand the public catalog

The public catalog (/browse) is what a visitor sees before they have an account — the tenant’s landing page while self-registration is on. It now wears your brand the way the learner home does: your logo or platform name in the same top bar, Sign in and Register on the right (on a phone, in a row just under the bar; Register only while self-registration is on), your footer, and your custom CSS. Two things are yours to write:

  1. Navigate to Settings → Branding → Pages → Public catalog.
  2. Banner — tick Show a banner on the public catalog; the controls are the same as the learner home banner (image, text tone, button link) and the copy rows sit beneath the preview — one full-width field per language the platform offers. This banner has its own content: it speaks to people who have not joined yet, so write it for them. Leave the button link empty to send visitors to Register while self-registration is on; leave the label empty and it reads Register. Each defaults on its own, so your own label on the Register button is fine.
  3. Catalog title and Catalog intro line — replace “Course catalog” and its default sentence, per language. Leave either empty to keep the default.
  4. Click Save changes, then open /browse in a private window to see it as a visitor would.

Only courses with the Public catalog option turned on in their catalog settings are listed. The banner and the copy render even when the list is empty.


Logo and favicon upload work on every plan, including Free.

  1. Navigate to Settings → Branding → Identity. The Logo & Favicon section is at the top.
  2. Under Logo, click Upload and select your file.
    • Accepted formats: PNG, SVG, JPG (the picker also takes ICO)
    • Recommended: 200 × 48 px, transparent background
    • Maximum file size: 2 MB
    • An SVG that contains scripts or references to outside files is refused.
  3. The thumbnail next to the button shows the new logo, and the button now reads Replace. The upload alone does not apply it.
  4. Click Save changes at the bottom of the tab.

The logo is shown in the sidebar, on the sign-in pages and in emails.

To take the logo away, click Remove, then Save changes. Without a logo the portal shows the platform wordmark instead (your platform name, if you set one in Step 6).


Step 3 — Upload favicon

  1. Navigate to Settings → Branding → Identity.
  2. Under Favicon, click Upload and select your file.
    • Recommended: 32 × 32 px, ICO or PNG (the picker also takes SVG and JPG)
    • Maximum file size: 2 MB
  3. Click Save changes.

The favicon appears in browser tabs. Remove, then Save changes, puts the default icon back.


Step 4 — Set up a custom domain (optional)

A custom domain lets your learners reach the platform at an address you own — for example learn.acme.com — instead of acme.embaylms.com. Your default acme.embaylms.com address keeps working alongside it, and HTTPS is issued automatically: there is no certificate to buy or install.

The whole setup is three steps: save the name in EmbayLMS, add the record(s) at the company that manages your domain’s DNS, then press Check DNS.

4.1 Choose the address — subdomain or root domain?

Both are fully supported. The choice is about what else lives on the domain:

You enter…What it isWhat happensRecords you will add
learn.acme.comA subdomain of your domainOnly that address goes to the LMS. Your website at acme.com is untouched.One CNAME record
acme.comYour root (or “apex”) domainThe LMS becomes the site at acme.com: every visitor to acme.com — and to www.acme.com, which we redirect for you — lands on it. If a website lives there today, it is replaced.One A record + one www CNAME (recommended)
  • Use the root domain when the domain exists for the LMS — a training brand, an academy, a domain bought for the purpose.
  • Use a subdomain when acme.com already hosts your company website. Any label works (learn, lms, academy, formation, training).

Why the records differ: DNS does not allow a CNAME record on a root domain, and every provider (GoDaddy, Cloudflare, Route 53…) refuses to create one. A root domain therefore uses an A record. EmbayLMS detects which case you are in and shows the right records; the panel also offers a one-click learn. alternative if you would rather keep your current website.

4.2 Save the address in EmbayLMS

  1. Go to Settings → Branding → Domain.

  2. Type the address only — learn.acme.com or acme.com, never https://…/. For a root domain the panel confirms what that means and, in case you would rather keep your website there, offers learn.acme.com with one click.

  3. Click Save changes at the bottom of the page.

  4. The panel now shows Step 2 — Add this record, with the exact record(s) in the columns your provider uses.

    Subdomain:

    TypeName / HostValue / Points toTTL
    CNAMElearncname.vercel-dns.comdefault (1 hour)

    Root domain:

    TypeName / HostValue / Points toTTL
    A@76.76.21.21default (1 hour)required
    CNAMEwwwcname.vercel-dns.comdefault (1 hour)recommended — makes www.acme.com redirect to the LMS

Keep this page open — you will come back to it for step 4.4.

4.3 Add the record at your DNS provider

Sign in wherever you manage the domain (the registrar or DNS host — the place you would go to change email or website settings for acme.com). Open its DNS records for the domain and add the record from 4.2.

Three rules apply everywhere:

  • Name / Host holds only the label — learn, not learn.acme.com. The provider adds .acme.com itself; typing the full address silently creates learn.acme.com.acme.com, which is wrong. For a root domain the name is @ (some providers show it as blank, or as the domain itself).
  • One record per name. If a record with the same name already exists — a parking page, website builder, “forwarding”, or an old A/CNAME — delete or edit it. Two records with the same name will not work, and your provider may refuse to save the second one.
  • No proxying. If your DNS host offers a proxy/CDN toggle (Cloudflare’s orange cloud), turn it off for this record (“DNS only”). EmbayLMS issues the certificate itself and cannot do so behind another proxy.

Two more apply to a root domain:

  • Turn off domain forwarding. Registrars often have a “Forwarding” / “Redirect” feature separate from DNS (GoDaddy: Domain settings → Forwarding). If it is on, it overrides your A record and sends visitors elsewhere. Remove it.
  • Edit www, do not duplicate it. Most providers pre-create a www record (GoDaddy’s points at the parked site). Change its value to cname.vercel-dns.com instead of adding a second www.
  • If your provider offers ALIAS / ANAME / CNAME flattening at the root (Cloudflare does this automatically; Route 53 “Alias”; DNSimple “ALIAS”), a CNAME-style record to cname.vercel-dns.com at @ also works and Check DNS recognizes it.

GoDaddy

  1. My Products → Domains → acme.com → DNS (or Manage DNS).
  2. Subdomain — click Add New Record: Type CNAME, Name learn, Value cname.vercel-dns.com, TTL 1 Hour. Save.
  3. Root domain — three edits in the same list:
    1. Find the existing A record whose Name is @ (GoDaddy labels its value “Parked” or shows an IP such as 3.33.130.190). Click the pencil, change the Value to 76.76.21.21, TTL 1 Hour, Save. (If there is no @ A record, Add New Record with those values instead. GoDaddy refuses a second @ A record, so always edit rather than add when one exists.)
    2. Find the existing CNAME record whose Name is www (it points at acme.com or the parked site). Edit its Value to cname.vercel-dns.com, Save.
    3. Scroll to Forwarding (same page, bottom, or Domain settings → Forwarding). If a forward is configured for the domain, delete it.
  4. GoDaddy typically publishes within 10 minutes.

Cloudflare

  1. Websites → acme.com → DNS → Records → Add record.
  2. Subdomain: Type CNAME, Name learn, Target cname.vercel-dns.com. Root domain: Type A, Name @, IPv4 address 76.76.21.21 — or Type CNAME, Name @, Target cname.vercel-dns.com (Cloudflare flattens it; either is fine) — plus Type CNAME, Name www, Target cname.vercel-dns.com. Delete or edit any existing @ / www records first.
  3. Set Proxy status to DNS only (grey cloud) on each record. This is the step most often missed.
  4. Save. Cloudflare publishes almost immediately.

Amazon Route 53

  1. Hosted zones → acme.com → Create record.
  2. Subdomain: Record name learn, Record type CNAME, Value cname.vercel-dns.com. Root domain: leave the name blank, Record type A, Value 76.76.21.21; then a second record, name www, type CNAME, value cname.vercel-dns.com.
  3. Routing policy Simple, then Create records.

Squarespace Domains / Google Domains

  1. Domains → acme.com → DNS → Custom records.
  2. Subdomain: Host name learn, Type CNAME, Data cname.vercel-dns.com. Root domain: Host name @, Type A, Data 76.76.21.21; plus Host name www, Type CNAME, Data cname.vercel-dns.com. Remove any Squarespace/Google website records for @ and www first, and turn off Forwarding for the domain.
  3. Add / Save.

Other providers use the same four fields under slightly different labels (“Host”, “Alias”, “Target”, “Points to”). If yours asks for a trailing dot on the value (cname.vercel-dns.com.), that is fine.

4.4 Check the record and go live

  1. Back in Settings → Branding → Domain, click Check DNS.

  2. The panel tells you exactly what it sees:

    MessageMeaningWhat to do
    Not pointing at EmbayLMS yet — We currently see: …The public DNS still returns the old value (or nothing).If you added the record in the last 30 minutes, wait and check again. Otherwise compare the record with 4.2 — the “we see” line usually names the culprit (a parking page, the wrong name, an old record).
    Your DNS record is correct — certificate being issuedThe record is right; HTTPS is being provisioned.Check again in a few minutes.
    Your DNS record is correct — our team activates itThe record is right; a final activation on our side is pending.Nothing. It is normally done within one business day; contact support if not.
    Your record is correct, but this domain is registered to another hosting accountRare: the domain was previously connected to another site on the same hosting network.Add the extra TXT record shown, then check again.
    Your custom domain is liveDone.Open the link. Tell your learners the new address; the old one keeps working.
    (root domains) www.acme.com also points here / is not set up yetWhether the optional www record is in place. It never blocks the address above.Add or fix the www record if you want www.acme.com to work too.
  3. DNS changes are usually visible within 5–30 minutes. In rare cases (a very long TTL on the record you replaced) it can take up to 48 hours. You do not need to keep the page open — come back and check whenever you like.

4.5 Changing or removing the domain

Enter a new address and click Save changes to switch; the previous domain stops serving the LMS as soon as you save. Clear the field and click Save changes to go back to acme.embaylms.com only. In both cases you can delete the DNS record at your provider afterwards — leaving it in place is harmless.


Step 5 — Custom CSS (advanced, Growth and up)

Custom CSS is the escape hatch under the structured settings. Use the Theme, Fonts and Pages tabs first: they are checked for readability and reach every screen. Reach for CSS only for what those tabs do not cover.

Requires the Growth plan or higher. On a lower plan the tab shows the upgrade prompt. A stylesheet saved while on Growth keeps rendering after a downgrade — a plan change never breaks a live portal — and it can no longer be edited until the plan is restored. It can always be removed: the locked tab offers Remove the current stylesheet, and the removed version stays in History.

  1. Navigate to Settings → Branding → Custom CSS.
  2. Write your CSS in the editor (syntax highlighting, line numbers; syntax errors are underlined). The sheet may be up to 32 KB.
  3. Pick the scope: Learner-facing pages (the default — the learner home and catalog, the course pages, the player, the sign-in pages, the hosted terms and privacy pages and the public catalog) or Every page (adds the instructor and admin areas).
  4. Watch the preview on the right: it is the real learner home, repainted with your draft as you type. Nothing is saved until you click Save.
  5. Click Save changes. If the safety filter must remove anything, a dialog lists exactly what and why; confirm to save without it, or cancel and edit. Nothing is ever removed silently.
  6. Every save is kept in History (the last 20). Restore any earlier version in one click; the restore is itself a new entry, so nothing is lost.

What the safety filter allows, and what that means. The filter removes @import, script-in-CSS constructs, tag breakouts and any url() that is not https:, data: or a relative path. It deliberately keeps https:// URLs to any host, because branding CSS legitimately pulls fonts and images from your own site. That freedom cuts both ways: a stylesheet can make the browser fetch an https:// address whenever a learner types or hovers, which a third party could use to observe activity. Only the Owner role can write this sheet — treat it like code, point url() only at domains you control, and review the History entry when ownership changes hands.

Stable hooks — what to target

Class names on the platform change from release to release; do not target them. Every learner-facing region carries a stable data-slot attribute instead. These names are a contract: a test in the codebase fails the build if one is renamed or removed without this table being updated.

HookWhere
topbarThe top bar of the learner and instructor areas
topbar-brandThe logo / platform name link in the top bar
topbar-navThe primary navigation inside the top bar
launchpadThe learner home page container
home-heroThe hero banner at the top of the learner home (when enabled)
home-hero-headlineThe hero headline
home-hero-sublineThe hero sub-line
home-hero-ctaThe hero button
continue-heroThe “continue learning” card on the learner home
catalog-gridThe course grid on the learner catalog (Explore)
course-cardOne course tile in the catalog and on the home page
course-pageA course’s detail page
player-chromeThe course player’s top bar
footerThe tenant footer
auth-brandThe logo on the sign-in pages
auth-cardThe sign-in / registration / password card
auth-heroThe image pane on the sign-in pages (when an image is set)
auth-headlineThe welcome headline on the sign-in pages
auth-sublineThe welcome sub-line on the sign-in pages
storefront-headerThe public catalog’s top bar
storefront-auth-stripOn phones, the row under the public catalog’s top bar that holds Sign in and Register
storefront-heroThe banner at the top of the public catalog (when enabled)
storefront-hero-headlineThe public catalog banner’s headline
storefront-hero-sublineThe public catalog banner’s sub-line
storefront-hero-ctaThe public catalog banner’s button
storefront-gridThe public catalog’s course grid
storefront-cardOne course tile on the public catalog

Example — a taller, centered hero headline and rounder course tiles:

[data-slot="home-hero-headline"] {
  font-size: 2.5rem;
  text-align: center;
}
[data-slot="course-card"] {
  border-radius: 16px;
}

What the safety filter removes, and why

The sheet is scrubbed before it is stored, and the dialog shows you each removal before you confirm:

RemovedWhy
CommentsNot stored — they are the one place a blocked directive could hide from the filter
@importLoads a stylesheet from elsewhere that could change after review
expression(), behavior:, -moz-binding:Legacy ways to run script from CSS
url() that is not https:, data: or a relative pathBlocks http: and javascript: resources
</style and <scriptThe two sequences that could break out of the stylesheet into the page

CSS custom properties you can read or override

The Theme tab sets the first group; the rest are the platform design tokens every screen is built from (see docs/DESIGN.md). Override with care: the readability check does not run on custom CSS.

VariableSet byDefaultUsed for
--color-brand-primaryTheme → Primary#0F2A5Abuttons, active nav, focus
--color-brand-primary-hoverderiveddarker primaryhover / pressed
--color-brand-primary-fgderived#FFFFFFtext on the primary
--color-brand-subtlederivedprimary at 12 %chips, selected rows
--color-brand-ringderivedlighter primaryfocus ring
--color-surface-canvasTheme → Page background#FAFAF7page background
--color-surfaceTheme → Card surface#FFFFFFcards, panels, inputs
--color-text-primaryTheme → Body text#0F1115headings, body
--color-text-linkTheme → Link color#48719Ctext links
--radius-xs … --radius-xlTheme → Corner style2 / 4 / 6 / 10 / 14 pxchips → covers
--color-accentfixed#3AB3A6progress, focus, the key action
--color-text-secondary, --color-text-mutedfixedgrey scalesecondary text
--color-border-subtle, --color-border-strongfixedhairlinescard and field borders
--color-success, --color-warning, --color-danger, --color-info (+ -subtle, -text)fixedsemanticstatus
--font-display, --font-bodyTheme → FontsSchibsted Grotesk / Interheadings / text
--font-monofixedJetBrains Monocode
--shadow-card, --shadow-raised, --shadow-floatfixedelevation

--brand-primary and --brand-accent are legacy aliases of the first and the accent; prefer the --color-* names.


Step 6 — Platform Name Customization

By default, the platform identifies itself as “EmbayLMS” in browser tab titles, the app wordmark, and the installed (PWA) app name. You can replace this with your own brand name.

Plan: Requires the Growth plan or higher (the white-label entitlement). On a lower plan the section shows an inline upgrade banner and stays read-only.

  1. Navigate to Settings → Branding → Identity, to the White-label section.
  2. Enter your Platform name (e.g., “Acme Learning Hub”), up to 60 characters. One name is used for both languages. Leave it empty to keep the default.
  3. Click Save changes.

The name replacement applies to:

  • The browser tab title
  • The app wordmark in the sidebar, top bars, and sign-in pages (shown when no logo is uploaded)
  • The installed app name (PWA manifest)

Note: This replaces display text only. It does not change your organization’s slug or portal URL. If your plan later drops the white-label entitlement, the default name returns automatically — your saved name is kept and re-applies on upgrade.


Step 7 — Removing the “Powered by EmbayLMS” Badge

The “Powered by EmbayLMS” badge appears at the bottom right of the footer on every page — the learner, instructor and admin areas, the sign-in pages and the public catalog — by default. It can be removed on the Growth plan or higher.

  1. Navigate to Settings → Branding → Identity, to the White-label section.
  2. Check Hide the “Powered by EmbayLMS” badge.
  3. Click Save changes.

If the section shows an upgrade banner instead, your plan does not include white-labeling — it requires Growth or higher. Your choice is saved either way: if the entitlement lapses the badge returns automatically, and hides again when the plan is restored.


Add your own footer — links, a legal line, and social icons — to the bottom of the app (Manage, Teach and Learn areas, and the sign-in pages). If you configure nothing, no footer is shown at all.

Plan: Requires the Starter plan or higher (custom branding).

  1. Navigate to Settings → Branding → Footer & Legal, to the Footer section.
  2. Footer links: click Add a link for each one (up to 6), and fill in a label and a URL. Use full https:// addresses, or a site path such as /legal/terms to link your hosted legal pages (Step 9).
  3. Legal line: enter a short copyright or legal notice (e.g., ”© 2026 Acme Corp. All rights reserved.”).
  4. Social icons: enter profile URLs for LinkedIn, X, Facebook, Instagram, and/or YouTube. Only platforms with a URL show an icon. Uncheck Show social icons to hide them all without deleting the URLs.
  5. Click Save changes.

Serve your organization’s own Terms of Service and Privacy Policy at /legal/terms and /legal/privacy on your portal domain. The pages are public — no sign-in required.

Plan: Editing requires the Starter plan or higher (custom branding). Already-published pages keep serving even if the plan later changes.

  1. Navigate to Settings → Branding → Footer & Legal, to the Legal pages section.
  2. For Terms of Service and Privacy Policy, fill in one of the two fields:
    • The redirect field (Redirect to your own page): an external URL where the page is hosted (e.g., https://acme.com/terms). Visitors to /legal/terms are sent there. A redirect URL wins if both fields are filled in.
    • Hosted content (HTML): paste the page’s HTML. It is sanitized on save — document markup (headings, paragraphs, lists, tables) and links only; scripts, images, styles, and forms are stripped.
  3. Click Save changes.

To make the pages discoverable, add footer links pointing at /legal/terms and /legal/privacy (Step 8). A document with neither field filled in returns a 404 rather than an empty page.


Step 10 — Reword notification emails

Notification emails use the standard EmbayLMS layout with your logo and sender name applied. You can reword the subject and body of individual notification emails; see the Notifications admin guide, section 3.


Step 11 — Custom Email Sender Identity

Configure the display name your notification emails are sent from, and where replies land. This complements the logo and colors you set in steps 1–2.

For full instructions, see the Notifications admin guide, section 2.

Summary:

  1. Navigate to Settings → Notifications.
  2. Set a Sender name (the display name learners see in their inbox) and a Reply-to address (where a learner’s reply is delivered).
  3. The sending address itself stays on a domain EmbayLMS has verified — that is what keeps your mail passing SPF/DKIM/DMARC instead of landing in spam. Sending from your own domain is a separate capability; contact support if you need it.

What you cannot customize today

These are not available, so there is no setting for them:

  • Navigation — the sidebar cannot be reordered, hidden or extended with custom links. Navigation is fixed per role; each person sees only the items their role grants.
  • Dashboard layout — dashboard widgets cannot be reordered or hidden. The closest option is the learner home hero banner (Step 1c).
  • A full custom email template — you cannot upload your own HTML wrapper for outbound email (see Steps 10 and 11 for what you can change).
  • Error pages — the 404, 403 and maintenance pages cannot be customized, and there is no maintenance-mode switch for your organization.
  • Several portals under one account — each EmbayLMS organization is one portal with one set of branding. Audiences that need separate branding (for example employees and external partners) run as separate organizations; contact EmbayLMS support to discuss it.

Configuration Reference

SettingDescriptionDefault
LogoPNG, SVG or JPG up to 2 MB, recommended 200 × 48 pxNone (platform wordmark)
FaviconICO or PNG up to 2 MB, recommended 32 × 32 pxNone (platform icon)
Theme — Primary colorButtons, active navigation, focus (hex)#0F2A5A (EmbayLMS navy)
Theme — Page backgroundThe color behind everything (hex)#FAFAF7
Theme — Card surfaceCards, panels, inputs (hex)#FFFFFF
Theme — Body textHeadings and paragraphs (hex)#0F1115
Theme — Link colorText links (hex)#48719C
Theme — Corner styleSharp / Standard / RoundedStandard
Fonts — HeadingsBuilt-in face or uploaded .woff2 (up to 2 MB)Schibsted Grotesk
Fonts — TextBuilt-in face or uploaded .woff2 (up to 2 MB)Inter
Login page — Background imagePNG/JPG up to 2 MBNone (centered card)
Login page — Headline / Sub-lineEN + FR-CA, up to 120 characters eachNone
Login page — Logo placementAbove the card / Top-left cornerAbove the card
Login page — Text on the imageAuto / Light / DarkAuto
Learner home — Hero bannerOn / OffOff (nothing added)
Learner home — Hero imagePNG/JPG up to 2 MB, wide (about 3:1)None (banner in your primary color)
Learner home — Headline / Sub-line / Button labelEN + FR-CA; 120 / 200 / 40 charactersNone (a headline is required to show the banner)
Learner home — Button linkA page path starting with / or an https:// addressNone (button hidden until label + link are set)
Learner home — Text on the imageAuto / Light / DarkAuto
Public catalog — BannerOn / Off; image (PNG/JPG up to 2 MB), tone, button link; EN + FR-CA headline / sub-line / button labelOff; button defaults to Register while self-registration is on
Public catalog — Title / Intro lineEN + FR-CA; 120 / 200 characters”Course catalog” and its default sentence
Custom domainYour own address for the platform (subdomain recommended; root domains use an A record)None
Custom CSS (Growth+)Stylesheet up to 32 KB, targeting the stable data-slot hooks; every save kept in History (last 20)None
Custom CSS — ScopeLearner-facing pages / Every pageLearner-facing pages
Platform name (Growth+)Replaces “EmbayLMS” in titles, wordmarks, and the installed app; up to 60 charactersEmbayLMS
Powered by badgeShow or hide the EmbayLMS badgeVisible (Growth+ to remove)
Footer linksUp to 6 custom footer linksNone (no footer rendered)
Footer legal lineCopyright or legal notice, up to 300 charactersNone
Footer social iconsLinkedIn, X, Facebook, Instagram, YouTube URLs + show/hide toggleNone
Terms of ServiceRedirect URL or hosted sanitized HTML at /legal/terms404 (nothing configured)
Privacy PolicyRedirect URL or hosted sanitized HTML at /legal/privacy404 (nothing configured)
Email sender nameFrom display name on notification emails (Settings → Notifications)Platform default
Email reply-to addressWhere a learner’s reply is delivered (Settings → Notifications)None (replies go to an unmonitored address)

Troubleshooting

My custom CSS has no effect on the admin area

By default the sheet applies to learner-facing pages only. Switch Scope to Every page on the Custom CSS tab if it should also style the instructor and admin areas.

We downgraded and want the old stylesheet gone

Open Branding → Custom CSS. Editing is locked on your plan, but the tab still offers Remove the current stylesheet; the version stays in History and comes back if you upgrade and restore it.

A rule I wrote disappeared after saving

The safety filter removed it and told you so in the confirmation dialog (see What the safety filter removes). Open History to compare with the version you saved before.

The hero banner does not appear on the learner home

The banner needs three things: the Show a hero banner box ticked, a Headline in at least one language, and a saved change. Without a headline the page deliberately shows nothing rather than an empty band. If the banner shows for you but not for a learner, check that they are on the learner home (Learn → Home), not the admin dashboard.

The hero button is missing

The button renders only when both a Button label and a Button link are set. A link that is not a /path or an https:// address is refused on save with a message under the field.

Colors are not appearing after save

Clear your browser cache or open a private window. CSS variables are injected server-side and cache invalidation may take a few minutes after a change.

Save changes is disabled on the Theme tab

One or more pairs fail the readability check — they are listed under the preview with their measured ratio. Darken the text or lighten the background (or the reverse) until every line turns green; the button enables on its own. A half-typed color (fewer than 6 hex digits) also keeps it disabled.

My uploaded font was refused

Only .woff2 is accepted, and the file itself is checked for the WOFF2 signature — a renamed .ttf or .otf is refused. Convert the font to WOFF2 (most font tools and many free converters do this) and upload again. Keep it under 2 MB.

Save changes is disabled after I uploaded a font

Tick the license confirmation under the upload. It is required once per uploaded font.

My login page still shows the centered card

The split layout needs a background image. Copy, placement and tone are saved either way but only render once an image is set.

The welcome text is hard to read on my image

Switch Text on the image from Auto to Light or Dark. Auto uses the image’s average brightness; a photo can be dark overall with a bright patch exactly where the headline sits.

The teal accent did not change

It is not meant to: the accent is a fixed system signal (see “What is not themeable” in Step 1).

My logo or favicon upload is refused

The file must be PNG, SVG, JPG or ICO and at most 2 MB; otherwise the field says “PNG, SVG, JPG, or ICO only.” or “Max file size is 2 MB.”. An SVG that contains scripts or references to outside files (for example an external <image>) is refused with “Upload failed. Please try again.” — export a self-contained SVG, or use a PNG.

I uploaded a logo but the portal still shows the old one

The upload only fills the field. Click Save changes at the bottom of the Identity tab to apply it.

Custom domain: “Check DNS” says it still sees a parking page / website builder / old address

The old record for the same name is still there. Open your provider’s DNS records, find the record whose name matches (learn, or @ for a root domain), and delete or edit it so only the record from step 4.2 remains. Check again after a few minutes.

Custom domain: “Check DNS” says “no record yet” an hour after I added it

Almost always the Name field: you typed the full address (learn.acme.com) where the provider expected only learn, so the record was created as learn.acme.com.acme.com. Open the record, put only the label in Name, save. Second cause: the record was added at a different company than the one that actually serves the domain’s DNS (for example at the registrar while the website host manages the zone). Check where the domain’s name servers point.

My provider will not let me create a CNAME on the root domain

Correct — no provider will. Use the A record shown in the panel for a root domain, or (recommended) use a subdomain such as learn.acme.com, which the panel offers with one click.

The address opens but shows “404: NOT_FOUND” or a certificate warning

The DNS record is in place but the hosting edge is not serving the domain yet. Press Check DNS: the panel will show either “certificate being issued” (wait a few minutes) or “our team activates it” (allow one business day). If the warning persists beyond that, contact support with the domain name.

Cloudflare: the domain never becomes active / shows a Cloudflare error page

The record is proxied (orange cloud). Edit it and set Proxy status to DNS only (grey cloud).

The panel says the domain is “already connected to another EmbayLMS account”

A custom domain can serve one account. If you run several EmbayLMS accounts, give each its own subdomain (learn.acme.com, partners.acme.com). Otherwise contact support.

Root domain: acme.com works but www.acme.com does not

Add (or edit) the www record from step 4.2 — CNAME, name www, value cname.vercel-dns.com — then press Check DNS; the panel reports the www record on its own line. Once it is in place, www.acme.com redirects to acme.com automatically.

Root domain: visitors are sent to a completely different site

A domain forwarding rule at your registrar is overriding DNS (GoDaddy: Domain settings → Forwarding; Squarespace/Google: Website → Forwarding). Delete the forward; the A record then takes effect.

I connected my root domain and my website disappeared

That is what connecting a root domain does — every visitor now reaches the LMS. Restore the website’s original DNS record at your provider, then connect a subdomain (learn.acme.com) instead.