Custom CSS Guide
Subscription requirement
This feature requires a Pro through Enterprise NotionApps Subscription. Users on other subscriptions may not see this option in the builder.
This guide explains how to use the Custom CSS feature in NotionApps to style a published app for client-facing or brand-specific use cases.
Custom CSS gives app builders a controlled way to customize the visual appearance of the end-user app. You can use it to adjust fonts, text colors, buttons, form fields, links, images, spacing, and responsive behavior without changing the app's data structure or backend logic.
Custom CSS applies to the published end-user app, not to the NotionApps builder interface.
Who This Guide Is For
This guide is intended for:
App builders who want to apply brand styling to a NotionApps app.
Technical writers documenting NotionApps customization workflows.
Customer success teams helping users style client-facing apps.
Developers or advanced users who understand basic CSS selectors.
What You Can Customize
With Custom CSS, you can style many visible parts of the end-user app, including:
Text color and typography
Headings, labels, body text, and links
Buttons and button hover states
Inputs, textareas, dropdowns, and placeholders
Images and icons
Lists and repeated records
Borders, spacing, backgrounds, and shadows
Mobile-specific layouts using media queries
Custom CSS is best suited for visual customization. It should not be used to control access, hide sensitive data, replace validation logic, or change application behavior.
Before You Begin
Before writing Custom CSS, make sure:
You have access to the app in the NotionApps builder.
The app has been created and can be saved.
You know the styling goal, such as applying a brand font, changing button colors, or styling form fields.
You understand that users must save and re-publish the app before published users see the latest CSS.
Avoid using Custom CSS to hide information that should not be visible to end users. If data should not be visible, configure permissions, screens, fields, or filters instead.
Add Custom CSS in the Builder
To add Custom CSS:
Open the app in the NotionApps builder.
Go to the app settings area.
Find the Custom CSS section.
Enable Custom CSS.
Paste your CSS into the Custom CSS editor.

Save the app.
Publish or re-publish the app.
Open the published app and verify the style changes.
Understand the End-User Root Selector
The NotionApps end-user app is wrapped in a root element with this attribute:
When writing Custom CSS, scope your selectors to that root element:
This is the recommended pattern because it limits your CSS to the NotionApps end-user app.
Best practice: Start most selectors with [data-notionapps-end-user-root="true"].
Why Scoping Matters
Scoped CSS is safer than global CSS.
For example, this selector targets every button inside the NotionApps end-user app:
This selector targets every button on the page:
The second example is broader and can affect elements outside the app. Use scoped selectors whenever possible.
Create Reusable Brand Variables
CSS variables make brand styles easier to maintain. Define them once on the root selector:
You can then reuse those values:
Style All Text
To change the color of all text inside the end-user app, target both the root and all child elements:
The universal selector * targets every descendant element.
Use this approach when you want a global text color or when testing that Custom CSS is working.
The universal selector is powerful. Use it carefully because it affects every element inside the app.
Style Form Field Text
Some browsers apply special rendering to form controls. If the text inside inputs, dropdowns, or textareas does not change color, add -webkit-text-fill-color.
Style Placeholder Text
Placeholder text requires a separate selector:
Use opacity: 1 because some browsers reduce placeholder opacity by default.
Style Headings
Use heading selectors to style screen titles, section titles, or large text elements.
You can style heading levels separately:
Style Paragraphs, Labels, and Inline Text
Use these selectors for common text elements:
If a label does not change, inspect the element in browser DevTools. It may be rendered as a div, span, or another element.
Style Links
Use the a selector for links:
Style Buttons
Buttons may be rendered as actual button elements or as elements with role="button". Target both:
Add a hover state:
Add a disabled state:
Style Inputs, Textareas, and Dropdowns
Use these selectors for common form fields:
Add focus styling:
Style Lists
Use list selectors for unordered and ordered lists:
Style Images
Use image selectors for rounded corners or consistent sizing:
If images are cropped or displayed in cards, test the change on multiple screen sizes.
Style Icons and SVGs
Icons are often rendered as SVGs. You can target SVG elements:
Some SVGs use path elements:
Use currentColor when possible so icons inherit the surrounding text color.
Style Containers and Cards
Many app layouts are built with div elements. You can target them, but use broad div selectors carefully.
This rule applies to every div inside the app. For layout styling, inspect the element first and look for a more specific selector when possible.
Avoid adding large layout changes to all div elements. Broad div rules can unintentionally affect navigation, records, forms, and nested components.
Use Attribute Selectors
Attribute selectors target elements by attributes.
The root selector is an attribute selector:
Button-like elements can be targeted by role:
You can also target input types:
Use Pseudo-Classes
Pseudo-classes target states such as hover, focus, disabled, or checked.
Use Pseudo-Elements
Pseudo-elements target parts of an element, such as placeholders.
Use Media Queries
Media queries let you apply styles only at certain viewport widths.
Example for mobile:
Example for larger screens:
Use Custom Fonts
If the app also uses the Custom Font feature, set the same font family in Custom CSS:
If a font is loaded from Google Fonts, make sure the font family name in CSS matches the font name exactly.
Example:
CSS:
Example: Make All Font Color Red
Use this example to verify that Custom CSS is working:
After saving and publishing, all visible text inside the end-user app should appear red.
Example: Branded Buttons and Fields
This example applies a client brand color to buttons and form controls:
Example: Softer Form Styling
This example makes form fields feel lighter and more spacious:
Example: Mobile-Friendly Buttons
This example makes buttons easier to tap on mobile screens:
Verify That Custom CSS Worked
After saving and publishing, open the end-user app and inspect it with browser DevTools.
Check for the root element:
Check for the custom style tag:
If that style tag appears, the published app received the Custom CSS payload.
Troubleshooting
CSS Does Not Appear
Confirm the following:
Custom CSS is enabled.
The app was saved after editing the CSS.
The app was re-published.
The published app was hard-refreshed.
The page contains
id="notionapps-end-user-customization".
CSS Appears but Does Not Apply
The existing component style may be more specific than your selector. Increase specificity:
Use !important only when needed.
Input Text Does Not Change Color
Add -webkit-text-fill-color:
Placeholder Text Does Not Change
Target placeholders separately:
Styles Look Different on Mobile
Add mobile-specific media queries:
A Broad Selector Changed Too Much
If a rule affects more than expected, make it narrower.
Broad:
Narrower:
Recommended Authoring Workflow
Define the brand variables first.
Add typography styles.
Style buttons.
Style form fields.
Add hover, focus, and disabled states.
Add mobile media queries.
Save and publish.
Verify in the published end-user app.
Inspect problem elements with DevTools.
Refine selectors if a rule is too broad.
CSS Selector Reference
App root
[data-notionapps-end-user-root="true"]
All elements in app
[data-notionapps-end-user-root="true"] *
Headings
[data-notionapps-end-user-root="true"] h1, h2, h3
Paragraphs
[data-notionapps-end-user-root="true"] p
Labels
[data-notionapps-end-user-root="true"] label
Links
[data-notionapps-end-user-root="true"] a
Buttons
[data-notionapps-end-user-root="true"] button
Button-like elements
[data-notionapps-end-user-root="true"] [role="button"]
Inputs
[data-notionapps-end-user-root="true"] input
Textareas
[data-notionapps-end-user-root="true"] textarea
Dropdowns
[data-notionapps-end-user-root="true"] select
Placeholders
[data-notionapps-end-user-root="true"] input::placeholder
Images
[data-notionapps-end-user-root="true"] img
SVG icons
[data-notionapps-end-user-root="true"] svg
Best Practices
Scope Custom CSS to
[data-notionapps-end-user-root="true"].Use CSS variables for repeated brand values.
Target both
buttonand[role="button"].Target placeholders separately.
Use focus states for form accessibility.
Use
!importantonly when needed to override existing component styles.Avoid broad layout changes on every
div.Test on both desktop and mobile.
Save and re-publish after every meaningful change.
Summary
Custom CSS in NotionApps is a flexible way to make published apps feel more polished and on-brand. The key is to write scoped, intentional CSS that targets the end-user app root. Start with broad proof-of-concept styles when testing, then refine the selectors for production-ready styling.
Last updated