# Troubleshooting

> Fixes for the common problems: the tag isn't detected, rules don't fire, content flickers, conversions are missing or a CSP blocks it.

Most problems show up in the browser console. Add `data-debug="true"` to the tag, reload, and look for lines that start with `[GeoEngage]`.

## The tag isn't detected

- **Load a page after saving.** The tag reports only when someone loads a page, and a page cache or CDN can keep serving the old HTML for a while. Clear it.
- **Check the live page.** View your live page's source and search for `data-api-key`. If it isn't there, the change wasn't published.
- **Check the key.** The `data-api-key` value has to match the site's key under **Sites**.
- **Check your plan on site builders.** Webflow and Wix only run custom code on the published site, on a paid plan. Squarespace needs a plan that includes code injection.
- **Check consent mode.** With `data-require-consent="true"`, nothing is sent until a visitor accepts the consent banner.
- **Try a private window.** A browser extension that blocks trackers can stop the tag for you, and only for you.
- **Check the Network tab.** In your browser's developer tools, `ge.js` should load without errors. A failed or blocked request points to the URL, an ad blocker or a [Content Security Policy](#a-content-security-policy-blocks-the-widget).

In the console, `window.GeoEngage?.version` returns a version number once the widget has loaded.

## A rule doesn't show

- **Is it published?** Rules reach your site only once published. In the rule editor, **Save & Publish** puts your latest changes live; if it says visitors still see an older version, the rule has unpublished edits.
- **Is it switched on?** Check its toggle in the **Rules** list.
- **Do you match it?** Conditions are checked against you as a visitor. A VPN changes your location, and **First Visit** only matches your first session on the site.
- **Has it already shown?** A rule set to show once per session, once ever or until dismissed won't show to you again once it has.
- **Is your site running a holdout?** Visitors in the holdout group see no rules at all, so the rest can be compared against them. Check **Tracking Config → Holdout**, and see [testing your own site](https://geoengage.app/docs/rules/holdouts#testing-your-own-site).
- **Is consent mode waiting?** In consent mode, no rule except the compliance banner runs before the visitor accepts.

With `data-debug="true"`, the console shows each rule as it's checked.

## Content flickers before a rule changes it

Visitors briefly see your original page, then the change.

- **Move the tag up.** It belongs in `<head>`, above your content, not at the end of `<body>`.
- **Remove `async` and `defer`.** Both let the page paint before the widget runs.
- **Don't use a tag manager.** Google Tag Manager and similar tools inject tags asynchronously.
- **Exclude it from optimizers.** Performance plugins that delay, defer or combine JavaScript need this tag excluded; see [WordPress](https://geoengage.app/docs/install/wordpress#caching-and-optimization-plugins).

A visitor's very first page view can still show a change as it happens. The widget learns which elements to hide from the rules it ran on an earlier page view, and on the first one there isn't an earlier page view yet. From the second page view on, those elements stay hidden until the change is applied.

## Conversions don't show up

- **Is `trackConversion` being called?** Nothing calls it for you: add [`GeoEngage.trackConversion()`](https://geoengage.app/docs/widget/methods#trackconversion) where the conversion happens. (Page visit, element click and form submit goals are the ones that need no code.) `trackEvent` doesn't count: its events appear under **Custom Events**, never in a goal.
- **Does the call come after the tag?** `trackConversion` can be called as soon as the tag has run, even on a page that converts as it loads, such as an order confirmation. A script that runs before the tag finds no `GeoEngage`; see [Calling the API](https://geoengage.app/docs/widget#calling-the-api).
- **Does a goal claim it?** Reports only count conversions that a goal claims. Create a *Conversion from code* or *Revenue* goal whose event name matches the name you pass. In **Events Explorer**, a conversion no goal claims is marked as such.

## A Content Security Policy blocks the widget

If your site sends a `Content-Security-Policy` header, the console reports *Refused to load the script* or *Refused to connect*, followed by the blocked URL. Allow:

- the host in the tag's `src` under `script-src`
- each GeoEngage URL the console reports as blocked, under `connect-src`

## Try things without touching your site

When you're signed in, **Test Sandbox** in the dashboard loads the widget with one of your sites' keys, so you can try rules and the JavaScript API before they go anywhere near your live site.

---

Source: https://geoengage.app/docs/troubleshooting
