Troubleshooting
If the GetIntent script isn't loading or personalizations aren't appearing, one of these common issues is usually the cause.
CORS & Content Security Policy (CSP)
The GetIntent pixel loads from getintent.co and makes API calls back to personalize your page. Some websites have security policies that block these cross-origin requests.
Content Security Policy (CSP) blocking the script
If your site sets a Content-Security-Policy header with a restrictive script-src directive, the browser will refuse to load the GetIntent script entirely.
How to tell: Open your browser's developer console. You'll see an error like:
Refused to load the script 'https://getintent.co/api/pixel' because it violates the following Content Security Policy directive: "script-src 'self'"
Fix: Either add https://getintent.co to your CSP script-src and connect-src directives, or set up a custom domain so the script is served from your own origin.
CORS errors on API calls
GetIntent's API endpoints allow requests from any origin by default. However, some corporate proxies, firewalls, or browser extensions can strip or modify CORS headers, causing the personalization requests to fail.
How to tell: The script loads, but personalizations don't appear. In the console you'll see:
Access to fetch at 'https://getintent.co/api/rewrite' from origin 'https://yourdomain.com' has been blocked by CORS policy
Fix: Set up a custom domain so all requests are same-origin. This bypasses CORS entirely.
Ad Blockers
Some ad blockers and privacy extensions block third-party scripts by domain. If your visitors use ad blockers, the GetIntent script may not load at all.
Fix: A custom domain makes the script appear as a first-party resource, so ad blockers won't flag it.
Fix: Serve from Your Own Domain
A custom domain solves CORS, CSP, and ad-blocker issues in one step. Instead of loading the script from getintent.co, it loads from a subdomain you control — like t.yourdomain.com. All API calls also go through this domain, making everything same-origin.
How to set it up
- Go to Dashboard > Settings > Domains.
- Enter the subdomain you want to use (e.g.
t.yourdomain.com). - Add the CNAME record shown to your DNS provider, pointing to
proxy.getintent.co. - Click Verify in the dashboard. Once DNS propagates, an SSL certificate is provisioned automatically.
- Update your script tag to use the new domain:
<script src="https://t.yourdomain.com/api/pixel" data-api-key="gi_xxxx" data-site-id="YOUR_SITE_ID" ></script>
Tip: We recommend setting up a custom domain even if you're not currently experiencing issues. It improves reliability for visitors behind corporate firewalls and reduces the chance of ad blockers interfering with personalization.
Consent Mode Delays
If you have Google Consent Mode v2 enabled in your GetIntent settings, the script waits for analytics consent before personalizing. It checks your consent management platform (GetCookies, Cookiebot, OneTrust, etc.) for up to 30 seconds.
Personalization takes 30 seconds to appear
Your consent banner may not be pushing consent state to dataLayer or localStorage correctly. GetIntent waits the full 30 seconds then gives up. To test, disable “Google Consent Mode v2” in Dashboard > Install and see if personalization appears instantly.
Works sometimes, fails other times
This is usually a race condition between your CMP and GetIntent. If the consent banner loads after GetIntent, the consent check may time out on some page loads. Make sure your CMP script loads before the GetIntent script.
Rate Limits & Credit Quotas
“Rate limit exceeded” (429 error)
GetIntent allows up to 200 personalization requests per minute per organization. If you hit this during a traffic spike, requests are temporarily rejected. The script will automatically retry after the cooldown period shown in the Retry-After header.
“Monthly personalization limit reached”
Each plan has a monthly AI credit limit. When you run out, personalizations stop until the next billing cycle. Check your remaining credits in Dashboard > Settings > Billing. Upgrade your plan if you need more.
Single-Page Apps (SPA)
GetIntent personalizes the page on initial load. If your site uses client-side routing (React Router, Next.js App Router, Vue Router, etc.), navigations within the app don't trigger a full page reload, so the script only runs on the first page the visitor lands on.
This is usually fine — the landing page is where the intent signal is strongest. Subsequent pages the visitor navigates to are less likely to need personalization. If you do need personalization on client-side navigations, reach out to support and we can help configure it.
Protected Elements
GetIntent automatically excludes certain elements from personalization to avoid breaking third-party widgets. There are four categories of protected elements, all enabled by default:
- Cookie banners — consent popups, GDPR/CCPA banners
- Chat widgets — Intercom, Drift, Crisp, and similar
- Notification bars — announcement banners, promo strips
- Fixed overlays — any element with
position: fixedorposition: sticky
If a sticky header, fixed CTA, or other element isn't being personalized, it's likely covered by one of these protections. You can toggle each category independently in Dashboard > Selectors.
Other Common Issues
Script loads but nothing changes
Make sure your URL includes the signal/intent parameters that GetIntent looks for (e.g. ?gi_intent=crm+for+startups or UTM parameters). Both gi_signal/gi_intent and unprefixed signal/intent are supported. If you have “Require signal/intent” enabled in settings, pages without these parameters won't be personalized. Add data-debug="true" to the script tag to see what's happening in the console.
Wrong API key or Site ID
Double-check that the data-api-key and data-site-id values match what's shown on your Dashboard > Install page. API keys start with gi_.
Selectors not matching any elements
GetIntent needs CSS selectors to know which elements to personalize. If your selectors don't match anything on the page, nothing will change. Use your browser's element inspector to verify the selectors target the right elements.
Inline style CSP violations
GetIntent applies fade transitions using inline styles. If your site has a strict CSP that blocks style-src 'unsafe-inline', the text will update but without the smooth transition. You can add 'unsafe-inline' to your style-src directive, or the transitions will simply be skipped.
Still Stuck?
Reach out to us at [email protected] with the following details and we'll help you get set up:
- Your site URL
- Any error messages from the browser console
- Whether you're using a custom domain
- Your site's platform (WordPress, Webflow, custom, etc.)