Ciphera Docs
Pulse AnalyticsInstallationContent Security Policy

Content Security Policy

The two CSP directives Pulse needs, and how to add them without weakening your policy.

If your site sends a Content-Security-Policy header, the browser blocks anything the policy doesn't explicitly allow — including Pulse. Two hosts need to be allowed, one per job:

script-src https://js.ciphera.net; connect-src https://pulse-api.ciphera.net

Merge these into your existing directives — don't replace your policy. If your policy already has a script-src or connect-src list, append the host to it. If it has neither, the browser falls back to default-src, so add the hosts there instead.

What each directive is for

  • script-src https://js.ciphera.net — where the tracking script itself is served from. Without it the script never loads, and Pulse never runs.
  • connect-src https://pulse-api.ciphera.net — where the script sends events. Without it the script loads and runs, but every event is blocked in the browser — the dashboard stays empty while the install looks fine in your HTML.
The Behind a Content Security Policy callout box in Pulse's tracking-script settings panel, showing the required CSP directives and a Copy directives button.

The setup panel in Pulse (Settings → Site → General, under "Behind a Content Security Policy?") carries this exact pair with a copy button.

Nonce- and hash-based policies

If your script-src uses nonces ('nonce-…', often with 'strict-dynamic'), allowing the host alone is not enough — the browser also requires the nonce on the tag. Add your page's nonce attribute to the Pulse <script> tag the same way you do for your own scripts:

<script src="https://js.ciphera.net/…" nonce="YOUR_PAGE_NONCE" defer></script>

With 'strict-dynamic', keep https://js.ciphera.net in the list anyway — browsers that don't support 'strict-dynamic' fall back to the host allowlist.

If your script-src allows hashes instead of hosts (script-src 'sha384-…'), turn on Subresource Integrity (SRI) in the same setup panel instead of adding the nonce. It swaps the script tag for a version-pinned URL with a matching integrity="sha384-…" attribute, and browsers check that attribute against the hash-source values in script-src, so the tag can pass a hash-only policy without a host in the allowlist. Copy the same hash the toggle put in the tag into your script-src list; adopting a new script version means updating both.

How a CSP problem looks

Open your browser's developer console on your own site. A blocked install shows one of:

Refused to load the script 'https://js.ciphera.net/…' because it violates … script-src …
Refused to connect to 'https://pulse-api.ciphera.net/…' because it violates … connect-src …

The first means the script never ran; the second means it ran but its events are blocked. In both cases the install panel in Pulse keeps "Listening for your first event…" — the server never saw anything. Once the directive is deployed, events confirm within seconds of a page load.

No console errors but still no data? That's usually not CSP — an ad blocker or tracking-protection extension can drop the same requests without printing anything. Test in a browser profile without extensions, then see Troubleshooting for the rest of what to check.

On this page

On this page