Skip to main content
Notra can add a c15t cookie banner and privacy settings dialog to your site. Visitors save their choice to a c15t backend that you control, either an Inth project or a c15t backend you host yourself. Notra does not run that backend for you, because the consent records belong to you. With the banner on, the analytics providers in 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:
  1. Create an Inth project and turn on Consent for it. Sign-up is free.
  2. Add policy rules that cover the measurement category, so visitors can allow your analytics.
  3. In Notra, open Studio → Sites, select your site and open Integrations. Under Cookie banner, open Inth and stay on the Managed by Inth tab.
  4. Click Connect Inth account and approve access in Inth.
  5. Pick the project under Inth project and click Use project.
Notra adds every domain your site uses, including custom domains, to the project’s trusted websites and saves the project’s backend URL to 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.
The backend URL is public configuration, not a secret. It ends up in every page, so never put an API key or other credential in it.

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, add c15t to integrations in blog.json:
blog.json
After you publish the change and the production deployment finishes, open your live site in a private window. The banner appears once the browser has loaded your policy from the backend, and the footer gets a Privacy settings link that reopens the dialog. 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 under scripts. Map each script’s path in your repository to the category a visitor has to allow first:
blog.json
The categories are 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 and notra-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 with footer.mdx, add the <PrivacySettings /> built-in where the link should go. It renders nothing when c15t is off.
footer.mdx
Pass your own label as children, like <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 and colors.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, set theme. 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 to connect-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.
Last modified on October 20, 2026