Built-in analytics
Open the site’s Analytics page for people and AI agents on the site, or Traffic in GEO for AI crawlers and referrals across all your domains. Neither page counts visits to previews, and you can turn built-in analytics off under Settings → Danger zone. See AI agents and search.How integrations work
You set up a provider in the dashboard or add it underintegrations in blog.json, and both methods write the same configuration. Notra installs the provider’s script on every live page and adds the hosts it needs to the Content-Security-Policy, so you never add a script tag or install an SDK. You can enable several providers at once.
Analytics integrations are disabled on preview deployments and during local development. Custom scripts still run there, so if you install analytics through a custom script, you control when it sends events.
Supported providers
Google Analytics 4
PostHog
Plausible
Umami
Set up in the dashboard
1
Copy your provider's ID
Create or select your site in the analytics provider and copy its public ID, using the provider pages above to find it.
2
Enter the settings
In Notra, open Studio → Sites, select your site and open Integrations. Click Add next to the provider and paste its ID into the matching field.The dialog shows the corresponding
blog.json configuration, which you can copy to use the same setup in your repository.3
Wait for the draft to save
Valid settings save automatically, so there is no Save button. Saving creates a draft of
blog.json and doesn’t create a GitHub commit or change your live site. You can click Close to leave the draft for later, or continue with Create PR in the same dialog.Closing the dialog or navigating within the dashboard finishes a pending save. If saving fails, the dialog stays open so you can retry, and invalid settings show a validation error instead of saving.4
Review and publish
Click Create PR in the provider dialog or the draft bar on the Integrations page. Notra finishes any pending save and opens a preview of all saved drafts, including
blog.json. Review the changes and commit message, click Open pull request and merge the PR into the production branch to deploy it.To edit other files or commit directly, click Open editor, review the changes and click Publish → Commit and deploy. Direct commits are available only when Settings → Publishing allows them and the GitHub branch is not protected. Publishing includes the editor’s pending changes, so review any other drafts first. See Publishing and deployments.5
Verify on the live site
Wait for a successful production deployment, open your live site and check the provider’s incoming traffic. Draft saved only confirms that Notra saved the configuration, not that the provider received an event, and a PR preview can’t verify analytics because provider scripts are disabled there.
Set up in blog.json
Add the provider to theintegrations object in blog.json at the root of your site folder. If the file already exists, add the provider next to your other settings, and use the provider pages for a full example of each.
blog.json
$schema line enables autocomplete and validation in your editor. Commit the file to your production branch, or open a PR and merge it into that branch, and Notra activates the provider after the production deployment succeeds.
Notra validates provider settings in the dashboard, when saving and during builds. Invalid IDs, unexpected keys and invalid hostnames stop the change with an error. To disable a provider, remove its object, then publish and deploy the configuration. See integrations in blog.json for every setting.
If no events arrive
- Confirm that you published the draft and the production deployment succeeded. A saved draft or an unmerged PR hasn’t changed the live site.
- Test the live URL, not a PR preview, branch preview or local development server.
- Check that the ID belongs to the provider site or project whose dashboard you’re viewing. For PostHog, also check the US or EU API host.
- Temporarily disable your browser’s analytics blocker for the test and check the Network tab for failed provider requests.