Skip to content

FAQ

Short answers to the questions teams ask most often before and after installing the Grona script. Each answer links to the page with the detail.

Search crawlers get your original page. The Grona scripts recognise crawlers and automated tools by their user agent and stop straight away: they do not hide the page, run campaigns, change the address or touch the canonical tag.

For real visitors, after the runtime applies a variation other than the control, it does two things to the page:

  • It adds a marker to the address. It sets ?v=grona- plus the first eight characters of the variation id, with history.replaceState, so the page does not reload. This overwrites any v query parameter your site already uses. Analytics tools that read the address after this point see the marker.
  • It adjusts the canonical tag. The runtime points <link rel="canonical"> at the address the page loaded with, minus the v marker and keeping any other query parameters. If the page has no canonical tag, it adds one. If the page has one that points somewhere else, it rewrites it. It also removes duplicate canonical tags and moves a canonical tag found outside <head> into <head>.

Crawlers never see either change. Tools that run JavaScript and are not recognised as bots, such as some SEO auditors, can see the adjusted canonical tag.

Some can. What happens depends on whether the blocker blocks cdn.grona.ai, main.js or api.grona.ai; Performance lists the effect of each. Grona does not offer first-party serving or a proxy through your own domain.

The anti-flicker script hides the page body on every page with the snippet until main.js has loaded and applied any changes, for at most 5 seconds after the anti-flicker script runs. While the page is hidden, nothing is painted, so the hide can delay your largest contentful paint. The effect depends on how quickly main.js arrives and runs on your visitors’ connections.

Lab tools such as Lighthouse and PageSpeed Insights are treated as bots and see the page without Grona, so they do not show this cost. Use data from real visitors to measure it. See Prevent flicker and Performance.

Can Grona change content in iframes or shadow DOM?

Section titled “Can Grona change content in iframes or shadow DOM?”

No. The runtime does not change elements inside an iframe or inside a shadow root. That also rules out the inside of web components that use shadow DOM. Change the content of the outer page, or change the embedded content at its source.

No. The Grona script sets no cookies. It uses first-party local storage and session storage on your own domain, for a random visitor id, the current visit and, for some features, a short visit history. It reads cookies only to find consent from supported consent tools and, on Shopify stores, the market setting.

The full list of storage keys, with their purpose and lifetime, is in Consent and storage.

Grona adds work to each page view, and you should measure its effect on your own pages. On each page view the browser:

  • loads antiflicker.js synchronously, which blocks parsing until it has downloaded;
  • loads main.js asynchronously, and keeps the page hidden until it has run;
  • checks both scripts with the CDN on every page load, so an unchanged script comes back as a 304 response;
  • downloads one changes file from the CDN when a campaign enrols the visitor;
  • sends page view and event data to api.grona.ai in batches.

Location targeting reads response headers and makes no extra request. main.js is built for each workspace and grows with the number of campaigns and the features they use. See Performance for detail.

Does Grona work on single-page applications?

Section titled “Does Grona work on single-page applications?”

Yes, with limits. The runtime detects route changes made with the History API and checks campaigns again for the new address. Hash routing, re-applying changes after your framework redraws an element, and hiding the page during route changes are not supported. See Single-page applications.

The script works when Google Tag Manager injects it, but a tag manager loads it asynchronously, so the anti-flicker script cannot block the first paint and visitors can see flicker. Add the snippet directly to the top of <head> when you can. See Google Tag Manager.