Coruve

Install guide

Install Coruve on Framer

One snippet, pasted into your site settings once. Page changes are counted automatically even though Framer never reloads the browser. No plugin, no cookie banner of ours, nothing to maintain.

What you need

Two things, and one Framer behaviour worth knowing before you start.

  • A Coruve project. Your project ID is on Settings → Project in the dashboard. It is not a secret — it ships in the page of every site that uses Coruve, by design.
  • Edit access to the Framer project’s settings. Look for Site settings → General → Custom code.
It does not run on the Framer canvas or in the editor’s preview. Nothing will appear in your dashboard until you publish, which trips up almost everyone once. Custom code may also require a paid Framer plan — their plan rules are theirs and they change, so check Framer’s current documentation if the snippet never reaches your published page.

Add the snippet

Site settings → General → Custom code → head.

1. Copy your snippet

Use the one on Settings → Project in your dashboard — it already has your project ID filled in. The version below is the same thing with a placeholder where your ID goes.

Custom code — head
<script>
  !function(){var t=window._CORUVE=window._CORUVE||[];if(t.invoked)return void console.error("Coruve snippet included twice.");t.invoked=!0,t.methods=["init","track","identify"],t.factory=function(e){return function(){var n=Array.prototype.slice.call(arguments);return n.unshift(e),t.push(n),t}};for(var e=0;e<t.methods.length;e++){var n=t.methods[e];t[n]=t.factory(n)}var i=document.createElement("script");i.type="text/javascript",i.async=!0,i.src="https://coruve.com/tracker.v1.5.0.min.js",i.integrity="sha384-WKIaYR7qF3TaP1l+q51N8KKL+jKLrm8qfcBV93AwFFLoXuV16WIyAngODrA40nd/",i.crossOrigin="anonymous";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(i,r)}();
  _CORUVE.init("proj_YOUR_ID", { apiHost: "https://ingest.coruve.com" });
</script>

2. Paste it into the head field

  1. Open your Framer project and go to Site settings (the gear).
  2. Find General → Custom code.
  3. Paste the snippet into the head field — the one that says it goes inside <head>, not the end-of-body field.
  4. Close the panel; Framer saves as you type.

Use site settings rather than a single page’s code. Per-page code would measure one page and leave the rest of the site dark.

The snippet loads tracker.v1.5.0.min.js and pins it with a sha384- hash. Your visitors’ browsers check the file they downloaded against that hash and refuse to run it if a single byte differs. That URL is immutable: installing it is not a promise from us not to change the file later.

Publish and verify

Custom code does not run until the site is published.

Publish

Hit Publish in Framer. If you publish to a staging URL first, check there — the snippet works the same on both.

Check it is reporting

Open your published site in a normal browser tab, click through two or three pages, then open Realtime in your Coruve dashboard. Your visit should appear within a few seconds, and you should see more than one page.

Seeing exactly one page view no matter how much you click is the signature of a script that does not understand client-side routing. It is also the thing the next section is about.

You are done

Page views, referrers, scroll depth, clicks on interactive elements and Core Web Vitals are all collected automatically from here.

Page changes are automatic

The part that usually needs a plugin. Here it needs nothing.

A Framer site navigates on the client: moving from / to /pricing does not reload the browser, so a script that only reports on page load reports your whole site as one visit to one page.

The Coruve tracker watches the browser’s own history API — it wraps pushState and replaceState and listens for the back button — so each route change is recorded as its own page view. You do not need to instrument anything, and there is no router integration to install.

If you would rather send page views yourself, turn the automatic ones off:

Custom code — head (last line of the snippet)
_CORUVE.init("proj_YOUR_ID", { apiHost: "https://ingest.coruve.com", autoPageView: false });

Track button clicks

Optional. Only if you want to name a specific action.

Clicks on links and buttons are already recorded. You only need this if you want a named event — something like pricing_cta_clicked — that you can build a funnel on.

In Framer, give the element a name or ID you can select, then add this to the end-of-body custom code field:

Custom code — end of body
<script>
  document.addEventListener("click", function (event) {
    var el = event.target.closest("#pricing-cta");
    if (!el) return;
    window.Coruve && window.Coruve.track("pricing_cta_clicked", { plan: "pro" });
  });
</script>

This listens on the document rather than on the element itself, which matters on Framer: elements are added and removed as you navigate, and a listener attached to one that later gets replaced stops firing silently.

Cookies and consent

What Coruve stores, so you can answer this for your own site.

Coruve sets no cookies and no cross-site identifier. It does not follow your visitors to anybody else’s site, because it has nothing to follow them with.

It does use your visitor’s browser storage for three things: a session identifier, shared across that visitor’s tabs on your site and expiring after 30 minutes of inactivity; — by default — a small buffer holding events that failed to send, so a visitor on a bad connection is not simply lost; and a cached copy of your project’s capture switches, so the tracker knows what you have turned on without an extra request on every page load. The buffer is capped and expires within a day, and the switches are your settings rather than anything about the visitor.

One option turns all three off — the buffer is cleared and never rewritten, the session identifier falls back to living in memory for the length of a tab, and the switches are re-read from the compiled defaults on every page. Add it to the _CORUVE.init line in your snippet:

Custom code — head (last line of the snippet)
_CORUVE.init("proj_YOUR_ID", { apiHost: "https://ingest.coruve.com", offlineBuffer: false });

Whether you need a consent banner is your call, not ours

Cookie-free is not automatically consent-exempt everywhere, and whether the offline buffer counts as “strictly necessary” storage where you operate is a question for your own legal advice. See our privacy page for exactly what is collected.

If nothing shows up

In the order worth checking.

  1. Did you publish? Custom code does not run on the canvas or in preview. This is the most common cause by a wide margin.
  2. Did the snippet go in the head field? The end-of-body field works too but reports later.
  3. Is the project ID exactly right? Compare it character for character with Settings → Project. A wrong ID sends events to nowhere and looks identical to no events at all.
  4. Only ever one page view? Check you pasted the whole snippet. Route changes are handled by the tracker file itself, so a partial paste that loads nothing will still record the first page and nothing after it.
  5. Are you blocking yourself? A content blocker or your own self-exclusion setting will hide your own visits. Try a different browser.
  6. Any console errors? Open your browser’s developer console on the published site. An integrity error means the snippet was altered or edited — re-copy it from your dashboard rather than retyping it.

Still stuck? Tell us what you see and include the published URL.

Install Coruve on Framer | Coruve