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:
| Element | Description | Plan |
|---|---|---|
| Logo | Shown in the sidebar, on the sign-in pages and in emails | Every plan (including Free) |
| Favicon | Browser tab icon | Every plan (including Free) |
| Theme | Primary color, page background, card surface, body text, link color and corner style — a live preview and an automatic readability check | Starter and up |
| Fonts | A heading face and a text face from eight built-in open-license fonts, or your own .woff2 | Starter and up |
| Login page | A background image, a bilingual welcome headline and sub-line, and where the logo sits — on the login, registration and password pages | Starter and up |
| Learner home hero | A banner at the top of the learner home: image, bilingual headline and sub-line, one button to a page or an https address | Starter and up |
| Public catalog | The storefront visitors see before they have an account: your logo and footer, its own banner, and an editable title and intro | Starter and up |
| Custom domain | Serve the platform from an address you own (e.g., learn.acme.com) — one DNS record, HTTPS automatic | Starter and up |
| Footer and legal pages | Your own footer links, legal line and social icons; your own Terms of Service and Privacy Policy | Starter and up |
| Custom CSS | Advanced: a stylesheet targeting stable hooks, with live preview and version history | Growth and up |
| Platform name and badge | Your own name in place of “EmbayLMS”, and the “Powered by EmbayLMS” badge hidden | Growth 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
- Navigate to Settings → Branding → Theme.
- 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.
- 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.
- 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
.woff2file 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.
- Navigate to Settings → Branding → Pages → Login page.
- Background image — click Upload, pick a PNG or JPG up to 2 MB. Landscape (about 3:2) works best. Remove takes it away again.
- 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.
- 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.
- 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.
- 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.
- Navigate to Settings → Branding → Pages → Learner home hero.
- Tick Show a hero banner on the learner home.
- 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.
- 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.
- Button link (optional) — where the button goes: a page in this platform,
written as a path starting with
/(for example/coursesor/learning-paths), or a securehttps://address on your own site. Anything else is refused, includinghttp://and links that start with//. - 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.
- 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:
- Navigate to Settings → Branding → Pages → Public catalog.
- 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.
- Catalog title and Catalog intro line — replace “Course catalog” and its default sentence, per language. Leave either empty to keep the default.
- Click Save changes, then open
/browsein 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.
Step 2 — Upload logo
Logo and favicon upload work on every plan, including Free.
- Navigate to Settings → Branding → Identity. The Logo & Favicon section is at the top.
- 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.
- The thumbnail next to the button shows the new logo, and the button now reads Replace. The upload alone does not apply it.
- 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
- Navigate to Settings → Branding → Identity.
- 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
- 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 is | What happens | Records you will add |
|---|---|---|---|
learn.acme.com | A subdomain of your domain | Only that address goes to the LMS. Your website at acme.com is untouched. | One CNAME record |
acme.com | Your root (or “apex”) domain | The 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.comalready hosts your company website. Any label works (learn,lms,academy,formation,training).
Why the records differ: DNS does not allow a
CNAMErecord on a root domain, and every provider (GoDaddy, Cloudflare, Route 53…) refuses to create one. A root domain therefore uses anArecord. EmbayLMS detects which case you are in and shows the right records; the panel also offers a one-clicklearn.alternative if you would rather keep your current website.
4.2 Save the address in EmbayLMS
-
Go to Settings → Branding → Domain.
-
Type the address only —
learn.acme.comoracme.com, neverhttps://…/. For a root domain the panel confirms what that means and, in case you would rather keep your website there, offerslearn.acme.comwith one click. -
Click Save changes at the bottom of the page.
-
The panel now shows Step 2 — Add this record, with the exact record(s) in the columns your provider uses.
Subdomain:
Type Name / Host Value / Points to TTL CNAMElearncname.vercel-dns.comdefault (1 hour) Root domain:
Type Name / Host Value / Points to TTL A@76.76.21.21default (1 hour) required CNAMEwwwcname.vercel-dns.comdefault (1 hour) recommended — makes www.acme.comredirect 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, notlearn.acme.com. The provider adds.acme.comitself; typing the full address silently createslearn.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
Arecord and sends visitors elsewhere. Remove it. - Edit
www, do not duplicate it. Most providers pre-create awwwrecord (GoDaddy’s points at the parked site). Change its value tocname.vercel-dns.cominstead of adding a secondwww. - If your provider offers ALIAS / ANAME / CNAME flattening at the root
(Cloudflare does this automatically; Route 53 “Alias”; DNSimple “ALIAS”),
a
CNAME-style record tocname.vercel-dns.comat@also works and Check DNS recognizes it.
GoDaddy
- My Products → Domains →
acme.com→ DNS (or Manage DNS). - Subdomain — click Add New Record: Type CNAME, Name
learn, Valuecname.vercel-dns.com, TTL 1 Hour. Save. - Root domain — three edits in the same list:
- Find the existing
Arecord whose Name is@(GoDaddy labels its value “Parked” or shows an IP such as3.33.130.190). Click the pencil, change the Value to76.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.) - Find the existing
CNAMErecord whose Name iswww(it points atacme.comor the parked site). Edit its Value tocname.vercel-dns.com, Save. - Scroll to Forwarding (same page, bottom, or Domain settings → Forwarding). If a forward is configured for the domain, delete it.
- Find the existing
- GoDaddy typically publishes within 10 minutes.
Cloudflare
- Websites →
acme.com→ DNS → Records → Add record. - Subdomain: Type CNAME, Name
learn, Targetcname.vercel-dns.com. Root domain: Type A, Name@, IPv4 address76.76.21.21— or Type CNAME, Name@, Targetcname.vercel-dns.com(Cloudflare flattens it; either is fine) — plus Type CNAME, Namewww, Targetcname.vercel-dns.com. Delete or edit any existing@/wwwrecords first. - Set Proxy status to DNS only (grey cloud) on each record. This is the step most often missed.
- Save. Cloudflare publishes almost immediately.
Amazon Route 53
- Hosted zones →
acme.com→ Create record. - Subdomain: Record name
learn, Record type CNAME, Valuecname.vercel-dns.com. Root domain: leave the name blank, Record type A, Value76.76.21.21; then a second record, namewww, type CNAME, valuecname.vercel-dns.com. - Routing policy Simple, then Create records.
Squarespace Domains / Google Domains
- Domains →
acme.com→ DNS → Custom records. - Subdomain: Host name
learn, Type CNAME, Datacname.vercel-dns.com. Root domain: Host name@, Type A, Data76.76.21.21; plus Host namewww, Type CNAME, Datacname.vercel-dns.com. Remove any Squarespace/Google website records for@andwwwfirst, and turn off Forwarding for the domain. - 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
-
Back in Settings → Branding → Domain, click Check DNS.
-
The panel tells you exactly what it sees:
Message Meaning What 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 issued The record is right; HTTPS is being provisioned. Check again in a few minutes. Your DNS record is correct — our team activates it The 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 account Rare: the domain was previously connected to another site on the same hosting network. Add the extra TXTrecord shown, then check again.Your custom domain is live Done. 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 yet Whether the optional wwwrecord is in place. It never blocks the address above.Add or fix the wwwrecord if you wantwww.acme.comto work too. -
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.
- Navigate to Settings → Branding → Custom CSS.
- Write your CSS in the editor (syntax highlighting, line numbers; syntax errors are underlined). The sheet may be up to 32 KB.
- 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).
- 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.
- 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.
- 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 anyurl()that is nothttps:,data:or a relative path. It deliberately keepshttps://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 anhttps://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, pointurl()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.
| Hook | Where |
|---|---|
topbar | The top bar of the learner and instructor areas |
topbar-brand | The logo / platform name link in the top bar |
topbar-nav | The primary navigation inside the top bar |
launchpad | The learner home page container |
home-hero | The hero banner at the top of the learner home (when enabled) |
home-hero-headline | The hero headline |
home-hero-subline | The hero sub-line |
home-hero-cta | The hero button |
continue-hero | The “continue learning” card on the learner home |
catalog-grid | The course grid on the learner catalog (Explore) |
course-card | One course tile in the catalog and on the home page |
course-page | A course’s detail page |
player-chrome | The course player’s top bar |
footer | The tenant footer |
auth-brand | The logo on the sign-in pages |
auth-card | The sign-in / registration / password card |
auth-hero | The image pane on the sign-in pages (when an image is set) |
auth-headline | The welcome headline on the sign-in pages |
auth-subline | The welcome sub-line on the sign-in pages |
storefront-header | The public catalog’s top bar |
storefront-auth-strip | On phones, the row under the public catalog’s top bar that holds Sign in and Register |
storefront-hero | The banner at the top of the public catalog (when enabled) |
storefront-hero-headline | The public catalog banner’s headline |
storefront-hero-subline | The public catalog banner’s sub-line |
storefront-hero-cta | The public catalog banner’s button |
storefront-grid | The public catalog’s course grid |
storefront-card | One 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:
| Removed | Why |
|---|---|
| Comments | Not stored — they are the one place a blocked directive could hide from the filter |
@import | Loads 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 path | Blocks http: and javascript: resources |
</style and <script | The 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.
| Variable | Set by | Default | Used for |
|---|---|---|---|
--color-brand-primary | Theme → Primary | #0F2A5A | buttons, active nav, focus |
--color-brand-primary-hover | derived | darker primary | hover / pressed |
--color-brand-primary-fg | derived | #FFFFFF | text on the primary |
--color-brand-subtle | derived | primary at 12 % | chips, selected rows |
--color-brand-ring | derived | lighter primary | focus ring |
--color-surface-canvas | Theme → Page background | #FAFAF7 | page background |
--color-surface | Theme → Card surface | #FFFFFF | cards, panels, inputs |
--color-text-primary | Theme → Body text | #0F1115 | headings, body |
--color-text-link | Theme → Link color | #48719C | text links |
--radius-xs … --radius-xl | Theme → Corner style | 2 / 4 / 6 / 10 / 14 px | chips → covers |
--color-accent | fixed | #3AB3A6 | progress, focus, the key action |
--color-text-secondary, --color-text-muted | fixed | grey scale | secondary text |
--color-border-subtle, --color-border-strong | fixed | hairlines | card and field borders |
--color-success, --color-warning, --color-danger, --color-info (+ -subtle, -text) | fixed | semantic | status |
--font-display, --font-body | Theme → Fonts | Schibsted Grotesk / Inter | headings / text |
--font-mono | fixed | JetBrains Mono | code |
--shadow-card, --shadow-raised, --shadow-float | fixed | elevation |
--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.
- Navigate to Settings → Branding → Identity, to the White-label section.
- 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.
- 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.
- Navigate to Settings → Branding → Identity, to the White-label section.
- Check Hide the “Powered by EmbayLMS” badge.
- 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.
Step 8 — Configurable Footer
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).
- Navigate to Settings → Branding → Footer & Legal, to the Footer section.
- 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/termsto link your hosted legal pages (Step 9). - Legal line: enter a short copyright or legal notice (e.g., ”© 2026 Acme Corp. All rights reserved.”).
- 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.
- Click Save changes.
Step 9 — Custom Legal Pages
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.
- Navigate to Settings → Branding → Footer & Legal, to the Legal pages section.
- 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/termsare 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.
- The redirect field (Redirect to your own page): an external URL where the page is hosted (e.g.,
- 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:
- Navigate to Settings → Notifications.
- Set a Sender name (the display name learners see in their inbox) and a Reply-to address (where a learner’s reply is delivered).
- 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
| Setting | Description | Default |
|---|---|---|
| Logo | PNG, SVG or JPG up to 2 MB, recommended 200 × 48 px | None (platform wordmark) |
| Favicon | ICO or PNG up to 2 MB, recommended 32 × 32 px | None (platform icon) |
| Theme — Primary color | Buttons, active navigation, focus (hex) | #0F2A5A (EmbayLMS navy) |
| Theme — Page background | The color behind everything (hex) | #FAFAF7 |
| Theme — Card surface | Cards, panels, inputs (hex) | #FFFFFF |
| Theme — Body text | Headings and paragraphs (hex) | #0F1115 |
| Theme — Link color | Text links (hex) | #48719C |
| Theme — Corner style | Sharp / Standard / Rounded | Standard |
| Fonts — Headings | Built-in face or uploaded .woff2 (up to 2 MB) | Schibsted Grotesk |
| Fonts — Text | Built-in face or uploaded .woff2 (up to 2 MB) | Inter |
| Login page — Background image | PNG/JPG up to 2 MB | None (centered card) |
| Login page — Headline / Sub-line | EN + FR-CA, up to 120 characters each | None |
| Login page — Logo placement | Above the card / Top-left corner | Above the card |
| Login page — Text on the image | Auto / Light / Dark | Auto |
| Learner home — Hero banner | On / Off | Off (nothing added) |
| Learner home — Hero image | PNG/JPG up to 2 MB, wide (about 3:1) | None (banner in your primary color) |
| Learner home — Headline / Sub-line / Button label | EN + FR-CA; 120 / 200 / 40 characters | None (a headline is required to show the banner) |
| Learner home — Button link | A page path starting with / or an https:// address | None (button hidden until label + link are set) |
| Learner home — Text on the image | Auto / Light / Dark | Auto |
| Public catalog — Banner | On / Off; image (PNG/JPG up to 2 MB), tone, button link; EN + FR-CA headline / sub-line / button label | Off; button defaults to Register while self-registration is on |
| Public catalog — Title / Intro line | EN + FR-CA; 120 / 200 characters | ”Course catalog” and its default sentence |
| Custom domain | Your 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 — Scope | Learner-facing pages / Every page | Learner-facing pages |
| Platform name (Growth+) | Replaces “EmbayLMS” in titles, wordmarks, and the installed app; up to 60 characters | EmbayLMS |
| Powered by badge | Show or hide the EmbayLMS badge | Visible (Growth+ to remove) |
| Footer links | Up to 6 custom footer links | None (no footer rendered) |
| Footer legal line | Copyright or legal notice, up to 300 characters | None |
| Footer social icons | LinkedIn, X, Facebook, Instagram, YouTube URLs + show/hide toggle | None |
| Terms of Service | Redirect URL or hosted sanitized HTML at /legal/terms | 404 (nothing configured) |
| Privacy Policy | Redirect URL or hosted sanitized HTML at /legal/privacy | 404 (nothing configured) |
| Email sender name | From display name on notification emails (Settings → Notifications) | Platform default |
| Email reply-to address | Where 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.