Guides → CSS not applying — fix it in SGEN

CSS not applying — fix it in SGEN

How to fix CSS that isn't applying

CSS in SGEN can live in three places — Custom CSS, Custom Codes, and SGB Additional CSS — layered on top of your Theme and Styles and Layouts defaults. When something does not render the way you expect, the cause is almost always one of: the CSS is in the wrong layer for the specificity it needs, the snippet is Inactive, the save handler stripped something, or your browser is serving a cached stylesheet. This guide walks the diagnostic in order so you do not waste time poking at the wrong layer. Each check takes under two minutes and they are ordered from fastest to most involved — start at Check 1 and stop as soon as you find the cause.

What is this for?

This guide is a symptom-driven decision tree for the most common CSS question: I saved CSS, but the public site does not show it. It leads you through seven ordered checks — from the fastest (a hard-refresh in incognito) to the most deliberate (cascade specificity audits and layer conflicts) — so you find the real root cause without guessing. The guide covers CSS saved through any of the three SGEN surfaces: Appearance Custom CSS, Appearance Custom Codes (with a style block), and SG-Builder Additional CSS per component. All three surfaces render your CSS on the public site, but they have different scopes, different load orders, and different sanitizer rules — which is exactly why the same rule can behave differently depending on where it lives. Understanding which surface your rule lives in is the prerequisite for every check below.

Good use cases

You wrote a new CSS rule, clicked Save, hard-refreshed, and the style still is not showing on the public page.

A CSS rule that used to work stopped working after you changed your theme's Color Swatch.

Your override is applying on some pages but not others — a scope mismatch between surfaces.

A rule with HTML-like text in a content: value saved differently than what you typed.

Two snippets seem to be fighting each other and you cannot tell which one wins.

You activated a new snippet and the change appears on every page except the one you are targeting.

You made a change in Styles and Layouts but the button color or link color did not update on the public page.

What NOT to use this for

Debugging SG-Builder layout or spacing that is not controlled by CSS you wrote. If the section width or padding looks wrong in the Builder, the fix is usually the Builder's visual panel, not Custom CSS.

Debugging missing pages or 404s. This guide is CSS-specific. Content-not-showing issues have a separate workflow (see Related troubleshooting below).

Debugging custom fonts not loading. Font-loading involves network requests and file formats that Custom CSS does not control directly. See the related font-loading guide below.

Applying CSS to a third-party embed (a Typeform, a Calendly widget). CSS from Custom CSS does not reach into cross-origin iframes.

Before you start

Before running through the checks, confirm the following:

What you will need access to:

  • Admin access to Appearance Custom CSS and Appearance Custom Codes.
  • A browser with DevTools available (Chrome, Firefox, or Edge).
  • The public URL of the page where the CSS should be applied.

Where to go

The relevant admin panels for this workflow, in the order you will visit them:

  • Appearance Custom CSS — your first stop. Shows all CSS snippets with their Status pill (Active / Inactive / Trash) and Priority number.
  • Appearance Custom Codes — your second stop if Custom CSS checks out. Filter to Active to see only what is currently rendering.
  • SG-Builder editor — open any page in the Builder, select a component, look for the Additional CSS trait panel in the right sidebar.

Here is what the Custom CSS list looks like in the admin:

Steps

Work through these seven checks in order. Most issues resolve at Check 1 or Check 2.

1
Hard-refresh in an incognito window

Open a private or incognito browser window, paste your public site URL, and do a hard-refresh (Ctrl+Shift+R on Windows / Cmd+Shift+R on Mac).

If the CSS change appears in incognito but not in your normal window, the problem is browser cache. Clear your browser cache on the normal window and reload. You are done.

If the CSS change does not appear in incognito either, browser cache is ruled out. Continue to Check 2.

Also verify these things while you have the incognito window open:

  • You are looking at the right URL. A common mistake is saving Custom CSS targeting the homepage but opening a blog post URL to verify. Open the URL whose markup the CSS selector targets.
  • The change is saved. Open the snippet's edit form and verify the rule text is in the textarea. If you closed the tab without clicking Save, the rule was never persisted.
  • The snippet is not in Trash. A snippet in Trash status does not render even if you can still see it in the list under the All filter.
  • You are not behind a login wall on the public page. Some SGEN themes show different markup to logged-in versus logged-out visitors.

CSS also caches at the CDN layer if your site is behind Cloudflare or a similar service. If the change appears on a different network but not on your own network, the CDN may be serving a stale stylesheet — purge its cache from the CDN dashboard and retest.

On macOS Safari specifically, a system-level network cache can sometimes hold onto the old stylesheet even after a browser-level cache clear. If Safari is the browser you are testing in and other browsers show the change, restart Safari fully before re-testing.

2
Confirm the snippet is Active

Open Appearance then Custom CSS. Click the All filter tab. Find your snippet in the list. The Status pill must read Active (green) for the snippet to render in the page head on your public pages.

If the pill reads Inactive, click into the snippet, toggle Status to Active, click Save. Then hard-refresh the public page in incognito.

New snippets default to Inactive on first create. If you created a snippet and navigated away before toggling the Status field, the snippet is saved but dormant.

If the pill reads Trash, the snippet has been soft-deleted and will not render. Recover it by opening the Trash filter, clicking into the snippet, and restoring it to Active.

Source: Manage Custom CSS snippets — troubleshooting bullet: My edit saved but the page still looks the same. Hard-reload the public page. Browsers cache stylesheets aggressively.
3
Check whether the save handler stripped part of your rule

The Custom CSS save handler strips anything between angle brackets. If your CSS contains a content: value with embedded HTML-like text, that text is removed on save.

Example: you wrote:

.tooltip::before { content: "<help>"; }

The save handler removes the bracketed content. The stored CSS becomes:

.tooltip::before { content: ""; }

To preserve literal angle brackets in content: values, escape them as Unicode codepoints:

.tooltip::before { content: "\003Chelp\003E"; }

The \003C codepoint is the Unicode value for the less-than sign and \003E is the greater-than sign. Any Unicode escape in this format survives the save handler unmodified.

The same stripping applies to style and script wrapper tags. Custom CSS expects raw CSS only.

To check: open the snippet's edit form and compare what is in the textarea now to what you originally typed. Any angle-bracket sequences will be gone.

Source: Create a Custom CSS snippet, What NOT to use this for and What to do if it does not work.
4
Check whether your selector wins the cascade

The most subtle cause. CSS cascade depends on both priority and specificity:

  • Two rules with the same selector — the later-loading one wins. SGEN Custom CSS lets you set a per-snippet Priority (1 = loads first, 20 = loads last).
  • Two rules with different selectors — the more specific one wins, regardless of load order.

If your override is not winning, increase specificity by prefixing your selector with body. The standard SGEN escalation pattern:

Specificity bumpSelectorWhen to use
Default.btn-primaryTry this first
body prefixbody .btn-primaryWhen a framework rule with one class is winning
Cell-class chainbody .col-X .btn-primaryWhen even body prefix is not enough (rare)

To verify which rule is winning: right-click the styled element on the public page, choose Inspect, and open the Computed tab in DevTools. The Computed tab shows every CSS property on the element with the winning value and the exact selector that supplied it. If your rule appears in the Styles panel with a strikethrough, another rule with higher specificity or a later load order overrode it — the Computed tab names the winner.

Source: Create a Custom CSS snippet, troubleshooting: Priority isn't working the way I expect.
5
Check whether a theme swatch reset your global styles

If you recently switched the Color Swatch under Appearance then Themes, the swatch picker rewrites parts of your Styles and Layouts with the preset's defaults. Hand-tuned button colors, link colors, and body fonts can get reset without warning.

Styles and Layouts controls your site's global design tokens: primary button background, link color, heading font, body font, and base spacing. These values are applied sitewide by the theme framework and form the baseline that Custom CSS snippets override.

When a swatch swap rewrites those tokens, any value you had set by hand reverts to the preset — even if the Custom CSS snippet that overrides it is still Active, because the snippet targets the token's output class, not the token itself.

If you suspect this happened, two paths to fix:

  • Re-edit Styles and Layouts. Open Appearance then Styles and Layouts and re-set the values that got overwritten. Right path if the overwrite is a one-time event.
  • Move the overrides to a Custom CSS snippet. Future swatch swaps do not touch Custom CSS snippets. This is the more durable fix if you change themes or swatches regularly.
Sources: Pick a theme, Customize global styles
6
Confirm the rule is in the right CSS layer

SGEN has three CSS surfaces with different scopes:

SurfaceScopeBest for
Appearance Custom CSSSite-wide. Renders into the page head on every public page.Brand color overrides, global type changes, hide-a-widget rules.
Appearance Custom Codes with a style blockSite-wide, but also accepts HTML and scripts alongside CSS.Vendor scripts that include their own CSS.
SG-Builder Additional CSS traitPer-component, per-page only.A one-page tweak you do not want leaking sitewide.

Moving a rule from SGB Additional CSS to Custom CSS makes it sitewide — every page picks it up. Moving a rule from Custom CSS to SGB Additional CSS scopes it to one component on one page.

7
Check for a conflicting Custom Code

Open Appearance then Custom Codes. Filter to Active. Read each snippet's body. If any contains a style block whose selectors overlap with the rule you are trying to apply, that is a candidate conflict.

Custom Codes render in the page head by default. Two Active snippets can override each other if they target the same selectors with equal or higher specificity. The snippet that loads last wins when specificity is tied.

To resolve a conflict: either remove the duplicate selector from the conflicting Custom Code, or add a body prefix to your Custom CSS selector to gain one extra specificity point.

Source: Add custom HTML, scripts, and tracking code

CSS layer field reference

Each CSS surface in SGEN has its own set of fields. Knowing what each field does helps you spot the issue faster during the diagnostic.

Custom CSS snippet fields

  • Name — internal label only. Not rendered on the public site. Use it to describe the rule's purpose.
  • CSS — the raw CSS body. No wrapper tags. The save handler strips angle-bracket sequences from this field on every save.
  • Status — Active (renders in the page head), Inactive (saved but dormant), Trash (soft-deleted, recoverable). Defaults to Inactive on create.
  • Priority — integer 1 through 20. Lower numbers load first. Two snippets with the same selector: the higher-numbered Priority wins because it loads later. Default is 10.

Custom Codes snippet fields

  • Name — internal label only.
  • Body — accepts HTML, script tags, style blocks, or link tags. The sanitizer strips HTML comments from this field on save.
  • Status — Active or Inactive. Same behavior as Custom CSS status.
  • Placement — where in the page the snippet is injected: head (default), body start, or body end.

SG-Builder Additional CSS fields

  • Additional CSS — raw CSS scoped to the selected component. Injected as an inline style block on the page, after Custom CSS and Custom Codes in the overall load order.
  • No Status or Priority fields. The rule is active whenever the component is present on the page and the page is published.
  • Editing requires opening the page in the Builder, selecting the component, and writing in the Additional CSS trait panel on the right side.

What success looks like

Success looks like

When the CSS fix is working: The view-source check is the fastest first step. Here is what a correctly-injected Custom CSS snippet looks like when you search the page source:

  • Your CSS rule appears in the page source — right-click the public page, choose View page source, and search for a string from your rule.
  • The element you are styling shows the new value when you inspect it. The Computed tab in DevTools shows which rule won the cascade and names its origin stylesheet.
  • The change is consistent across normal and incognito windows after a hard-refresh.
  • Your rule appears without a strikethrough in the Styles panel. A strikethrough means another rule won.
  • The Priority field on the snippet shows the value you intended — a common error is accidentally saving Priority 1 when you needed Priority 15.
  • If you open the page in the SG-Builder canvas and select the affected component, the Additional CSS trait panel shows the rule you authored.

Common root causes (sorted by frequency)

The seven checks above map directly to these root causes. Check 1 rules out browser cache (cause 2). Check 2 catches cause 1. Checks 3 and 4 handle causes 3 and 4. Checks 5 through 7 handle the remaining three. Working through them in order means you rule out the most common causes first and only reach the subtle ones if the quick checks do not resolve the issue.

  1. Snippet is Inactive. The snippet was saved but Status was not set to Active. Toggle to Active and save.
  2. Browser cache. The browser is serving the previous stylesheet. Hard-refresh in incognito to confirm and rule this out.
  3. Specificity loss. A theme rule with higher specificity is winning the cascade. Add a body prefix to your selector.
  4. Save-handler stripping. An angle-bracket sequence in your CSS got removed on save. Use Unicode codepoints for angle brackets in content: values.
  5. Theme swatch overwrote it. A swatch swap reset your Styles and Layouts values. Move the override to Custom CSS so future swatch changes cannot undo it.
  6. Wrong layer. The CSS is sitewide when it should be per-component, or per-component when it should be sitewide.
  7. Conflicting Custom Code. A style block in an Active Custom Code is targeting the same selectors with equal or higher specificity and loading after your snippet.

Example scenarios

Example 1: Inactive snippet after a new-tab workflow. an editor manages the your business site. She created a new Custom CSS snippet with three button-color rules, then closed the browser tab before toggling the Status field to Active. When she later checked the Custom CSS list, the snippet existed but its Status pill read Inactive — the default for a new snippet before activation. The rule was never loaded into the page head. Fix: open the snippet, toggle Status to Active, click Save, then hard-refresh the public page.

Example 2: Save handler strips a content: value. a teammate added a tooltip rule for the your business navigation with an angle-bracket icon string in the content: value. After saving and reloading, the tooltip was empty. Opening the snippet's edit form revealed the stored rule had an empty content: value — the save handler had removed everything between the angle brackets. Fix: replace the angle-bracket string with Unicode codepoints. The stored rule now survives the save handler and the tooltip renders the expected character.

/* Before — angle brackets get stripped on save */
.nav-icon::before { content: "<i>"; }
/* After — Unicode codepoints survive the save handler */
.nav-icon::before { content: "\003Ci\003E"; }

Example 3: Swatch swap overwrites a hand-tuned button color. a developer switched your business' Color Swatch from "Espresso" to "Natural" to preview how it looked. After switching back, the primary button background had reverted from the custom brand brown he had set in Styles and Layouts to the swatch preset value. Root cause: swatch changes rewrite Styles and Layouts presets, including button background values. Fix: add a Custom CSS snippet that pins the button background so future swatch changes cannot override it.

Example 4: Conflicting style block in Custom Codes. an admin noticed the your business hero section background was wrong — her Custom CSS snippet set a warm off-white background but the public page showed plain white. Checking Appearance then Custom Codes filtered to Active, she found an older snippet called Legacy hero override containing a style block that overrode the same selector. Because Custom Codes rendered into the page head after Custom CSS, it was winning the cascade at equal specificity. Fix: remove the overlapping rule from the Custom Code snippet, then save and hard-refresh.

How this connects to other features

Custom CSS (Appearance then Custom CSS) — the primary surface for sitewide CSS overrides. See Create a Custom CSS snippet and Manage Custom CSS snippets.

Custom Codes (Appearance then Custom Codes) — use when you need CSS alongside a script or a link tag. See Add custom HTML, scripts, and tracking code. The Custom Codes sanitizer strips HTML comments and some markup patterns — the same sanitizer family as the angle-bracket stripping in Custom CSS.

Themes and Styles (Appearance then Themes / Styles and Layouts) — the layer beneath Custom CSS. Changes here are overridden by Custom CSS snippets but not by SG-Builder Additional CSS. See Pick a theme and Customize global styles.

SG-Builder Additional CSS — per-component CSS authored inside the Builder. Scoped to one page and one component. Does not interact with the Custom CSS or Custom Codes layers at the admin level.

What to do if it does not work

If you have worked through every check above and the rule still is not applying, gather the following before contacting support:

  1. A screenshot of the snippet's edit form showing the exact rule text and the Status pill = Active.
  2. A screenshot of the public page with DevTools open on the affected element, Computed tab visible. The Computed tab names the winning rule, its selector, and the stylesheet it came from.
  3. The snippet's Priority value and a list of any other Active snippets whose selectors might overlap with yours.
  4. Which of the seven checks you completed and the result of each, so support can continue from where you left off.

Contact SGEN support through the Help menu in your admin panel.

Related troubleshooting

Citations (audit trail)

Every check above traces to one of these existing per-feature reference docs.

On this page