integrations, Notra’s own visitor analytics and any custom scripts you list wait until a visitor allows them.
Set up the backend
You need a c15t backend before the banner can save choices. Pick one:- Inth
- Self-hosted
- Create an Inth project and turn on Consent for it. Sign-up is free.
- Add policy rules that cover the
measurementcategory, so visitors can allow your analytics. - In Notra, open Studio → Sites, select your site and open Integrations. Under Cookie banner, open Inth and stay on the Managed by Inth tab.
- Click Connect Inth account and approve access in Inth.
- Pick the project under Inth project and click Use project.
blog.json as a draft. The dialog shows that configuration, and Create PR at the bottom of the Integrations page publishes it. If you add a domain later, the dialog lists it under Domains and offers to trust it.Notra keeps the Inth connection on its own servers. Your published site only contains the public backend URL.Turn on the banner
Connecting Inth writes the setting for you. To set it up in your repository instead, or for a self-hosted backend, addc15t to integrations in blog.json:
blog.json
Analytics and consent
With the banner on, Databuddy, Google Analytics, Plausible, PostHog and Umami load through c15t’s official integrations, only after a visitor allows the measurement category, and they stay off for visitors who reject it. Each provider also appears as its own vendor, so a visitor can allow measurement and still turn off one provider. Google Analytics receives Consent Mode v2 signals, so it knows about a separate choice for marketing too. PostHog never falls back to cookieless capture after a rejection, and Databuddy keeps all its tracking options and stays disabled whenever measurement is withdrawn. When a visitor withdraws consent later, the page reloads so that no analytics code keeps running. Notra’s own analytics follow the same choice:- The script that measures time on page waits until the measurement category is allowed.
- Page views that Notra counts on the server follow your c15t policy. Where the policy asks for consent first, a visit counts only after the visitor allows measurement. Where no banner is needed, or visitors can opt out, visits count unless the visitor turned measurement off.
- AI crawlers, AI agents and visitors arriving from AI assistants are always counted, because that tracking never touches the visitor’s device.
Custom scripts
Custom scripts load on every page unless you list them underscripts. Map each script’s path in your repository to the category a visitor has to allow first:
blog.json
measurement, marketing, functionality and experience. A path that doesn’t match a custom script stops the build, so a typo can’t leave tracking code ungated. Scripts you leave out, like a script that only opens external links in a new tab, keep loading for everyone.
Previews and local development
Preview deployments andnotra-sites dev show the banner and dialog with your settings, so you can check how they look. They keep the choice in the browser only and never contact your backend or load analytics.
During notra-sites dev, the c15t DevTools panel also opens from a button in the corner of the page. Use it to inspect the stored choice, try other locations and languages, and clear your consent to see the banner again. It never ships to previews or your live site. To hide it locally, set devTools to false:
blog.json
Custom footers
The theme’s footer shows the Privacy settings link on its own. If you replaced it withfooter.mdx, add the <PrivacySettings /> built-in where the link should go. It renders nothing when c15t is off.
footer.mdx
<PrivacySettings>Cookie settings</PrivacySettings>.
Appearance
By default the banner is a floating card in the bottom-left corner. It uses your site’s fonts, surface, border and text colors andcolors.primary for its buttons, and it follows your site’s light and dark mode. Use these options to change its layout:
Your c15t policy decides which buttons a visitor must see. If a layout hides a button the policy requires, c15t shows it anyway.
Colors and corners
To give the banner its own look, settheme. Each color is a hex value, and any color you leave out keeps following your site:
blog.json
All options
The
blog.json schema checks every option, so your editor autocompletes the values above and flags a position that doesn’t fit the variant.
Content-Security-Policy
Notra adds your backend’s origin toconnect-src and allows the analytics scripts that c15t loads, so you don’t need to touch security.allowedOrigins. See Content-Security-Policy.
Troubleshooting
If the banner never appears, check that your site’s domain is trusted in the Inth project, or allowed in your self-hosted backend’s CORS settings. With Inth connected, the Inth dialog under Cookie banner on the Integrations page lists domains that are missing and trusts them for you. The browser console shows the blocked/init request.
If analytics never loads, make sure your policy has a measurement category and that you allowed it. Open Privacy settings, turn on the analytics switch and save.
If the link is missing from a custom footer, add <PrivacySettings /> to footer.mdx. The link stays hidden until the policy has loaded, and it stays hidden for visitors whose region needs no consent UI.