Skip to main content

🚫 “Duplicate OTTO Pixel Detected” — how to find it, fix it, and prevent it (all platforms)

A step‑by‑step, platform-by-platform playbook to resolve double (or triple!) OTTO Pixel installs and get OTTO back online fast.

Updated over a week ago

Installing the OTTO Pixel is the first step to unlocking AI-powered SEO automation — but what happens when you install it more than once?

Duplicate OTTO Pixel installations are one of the most common issues new users face. They can lead to detection errors, audit delays, and even prevent OTTO from executing real-time optimizations. The catch? You might not even realize it’s installed twice — once by a plugin, again by GTM, and maybe a third time buried in your page’s theme code.

This guide walks you through exactly how to detect, fix, and prevent double (or triple) installations — with real examples and solutions for WordPress, Shopify, Wix, GTM, GoHighLevel, and other CMS platforms.

If you’re seeing “Pixel Not Detected,” if OTTO isn’t enabling, or if something feels off, this article is your go-to playbook.

🔎 TL;DR — What “duplicate pixel” really means

You (or a teammate/plugin/tag manager) installed the OTTO Pixel more than once — e.g., WordPress plugin and GTM, manual <script> in <head> and another in the footer, two GTM containers, or a Global Section + page-level code in GHL/Wix. When that happens, OTTO’s diagnostic can’t reliably verify or execute fixes, and you’ll see detection failures, conflicting attributes, or repeated loads.

🧭 Quick path: How to confirm you have a duplicate

  1. Run OTTO’s Diagnostic Scan (from OTTO & Audit → All Sites).
    Look for “Duplicate installation detected” and which method(s) OTTO found.

  2. Use Chrome DevTools → Network tab

    • Reload the page and filter by dynamic_optimization.js (or your OTTO script URL / id sa-dynamic-optimization).

    • If you see it requested more than once, you’ve got a duplicate. (This is the same approach recommended to detect duplicate GTM installs/tags firing twice.).

  3. Page Source / Elements tab

    • Search for sa-dynamic-optimization your OTTO Pixel UUID.

    • More than one match? → duplicate.

  4. GTM Preview mode

    • Click Preview in GTM and inspect which tags fire on page load. If you see your OTTO tag firing multiple times — or you find multiple containers embedded — you’ve found the root cause. GTM/Ads/GA tags firing twice due to various containers is a known pattern.

🧰 Universal Fix Checklist (do this before you dive into platform specifics)

  1. Pick ONE install method (Plugin, GTM, or manual <script>). Remove the others.

  2. Keep the script in the <head> (or as high as possible) before </head>. Avoid placing it deep in <body> unless your CMS forces it. Shopify’s guidance is “just above </head> when editing theme.liquid.

  3. Purge caches / CDN / optimization layers (WP Rocket, NitroPack, Cloudflare, etc.) and exclude the OTTO script from minify/defer/delay if it’s being altered. (WP Rocket documents ?nowprocket to load an uncached page to debug, and how to exclude exact JS files from minification and defer).

  4. Re-run the OTTO Diagnostic Scan to confirm:

    • JavaScript detected

    • No duplicates

    • Fixes deployed

🖥️ Platform-by-Platform Fix Playbooks

🟩 WordPress (Plugin vs GTM vs manual script)

Most common root causes

  • OTTO is installed via the Search Atlas plugin and also via GTM / header.php.

  • Caching/minification plugins (WP Rocket, NitroPack, etc.) duplicate/delay the script.

  • A staging → production migration left two copies (one via functions.php, one via plugin).

How to fix

  1. Decide the source of truth (recommended: Search Atlas SEO plugin).

  2. If the plugin is the source:

    • Deactivate/remove any GTM tag or hard-coded <script> with sa-dynamic-optimization or your OTTO UUID.

    • In WordPress → Search Atlas plugin, ensure:

      • Enable OTTO is checked.

      • UUID is the same as in your dashboard.

    • Purge caches and exclude the script from minify/defer/delay if needed

  3. If GTM is the source:

    • Disable the plugin OTTO toggle (or remove the code from header.php/functions.php).

    • In GTM, ensure that only one Custom HTML tag includes the OTTO script, with the Trigger set to 'All Pages' (or 'Initialization – All Pages'), and the container is published.

  4. Validate: DevTools → only one request; OTTO Diagnostic → no duplicates.

🟨 Google Tag Manager (GTM)

Most common root causes

  • Two GTM containers are embedded on the site (standard in migrations / WL setups).

  • The same OTTO script is in GTM and also hard-coded.

  • Wrong tag type (Image/iFrame) or creative “event-based” firing — leading to multiple fires per load. (Meta/FB Pixel threads show this same problem; fix is “fire once per page”).

How to fix

  1. In View Source, search for googletagmanager.com/gtm.js?id= → Ensure only one container ID.

  2. In GTM:

    • The OTTO Pixel must be a Custom HTML tag.

    • Tag firing options: Once per page (Advanced Settings) if you must keep multiple triggers.

    • The trigger should be All Pages (or Initialization – All Pages).

    • Publish the container.

  3. Remove any hard-coded OTTO script in templates/plugins.

  4. Validate with GTM Preview mode, DevTools, and OTTO Diagnostic.

🟦 GoHighLevel (GHL / Ideation)

Most common root causes

  • Script added on the home page and again inside a non-global section on other pages.

  • Script embedded in multiple funnel steps or duplicated sites.

  • Not marking the code block as a Global Section, causing install inconsistencies (and devs “fixing” it by pasting it again elsewhere).

How to fix

  1. Keep ONE script, placed in a Custom Code element inside a Global Section (ideally, the top layout area).

  2. Remove any page-level duplicates.

  3. Save → in the modal, confirm “Apply to Global Section”.

  4. Republish, clear your cache, and re-run the Diagnostic.

(This mirrors the validated implementation we documented for GHL to guarantee OTTO’s diagnostic can detect it site‑wide.)

🟪 Wix (Editor & Studio)

Most common root causes

  • Script added to a single page instead of All Pages.

  • Multiple scripts across Custom Code and Velo masterPage.js.

  • Global sections and headers are used inconsistently. (Wix now supports Global Sections in Studio to reuse across pages.)

How to fix

  1. Go to Settings → Custom Code → “+ Add Custom Code”.

  2. Paste the OTTO script, name it clearly, and select All Pages → Load code on Each Page Load → Place in Head.

  3. Remove any other OTTO code from page-level sections, Velo, or templates.

  4. Publish → validate with DevTools & OTTO Diagnostic.

🟥 Shopify

Most common root causes

  • Script added in theme.liquid AND inside an app/embed.

  • Script pasted below </head> or in multiple layout files.

  • Theme duplicated/switched without removing older pixel code. (App embeds can also re-inject.)

How to fix

  1. Online Store → Themes → Edit code → layout/theme.liquid.

  2. Search </head> and place the OTTO script just above that closing tag (per Shopify best practices).

  3. Search entire codebase for OTTO UUID / script URL; remove duplicates (community threads recommend centralizing in theme.liquid).

  4. Publish → clear caches (if any) → run Diagnostic.

🟫 Webflow, Squarespace, Blocs, “Custom Site”, etc.

Most common root causes

  • Script inserted in page settings instead of site-wide head.

  • Script placed as first tag in <head> where confident builders (e.g., Blocs) mis-handle it. (Workaround: move it slightly lower in <head>).

How to fix

  1. Put OTTO Pixel in Project/Site Settings → Custom Code → Head (global).

  2. Remove any page-level versions.

  3. In Blocs-like builders, don’t make it the very first <script> — Move it a few lines down.

  4. Publish & validate.

🧩 Edge cases you should also rule out

  • Staging + Production both indexed → You see double because both environments are scanned.

  • Multiple domains pointing to the same codebase, running the script twice under different conditions.

  • Consent tools fire a second copy after the user accepts cookies.

  • CDN “combine JS” features, duplicating/rewriting the script.

  • Two Knowledge Graphs / two OTTO projects using the same domain (rare, but we’ve seen it).

✅ Post-fix: How do you know you’re clean

  1. DevTools → Network: Only one request for your OTTO script.

  2. Elements / View Source:

    Only one <script id="sa-dynamic-optimization" ...> (and the correct data-uuid).

  3. OTTO Diagnostic Scan shows:

    • ✅ Correct Installation Method (JS detected)

    • ✅ No duplicates found

    • ✅ Fixes deployed / OTTO Enabled

🛡️ Preventing duplicates (governance you can copy-paste into your internal SOPs)

  • Establish a single “source of truth” for 3rd‑party scripts (e.g., GTM only or WP plugin only).

  • Maintain a “Tag Registry” (sheet/notion) listing who owns each script, where it resides, and the reason.

  • Lock production GTM (publish rights) and force PR/code reviews for manual <head> changes.

  • Comment any manual script block with “DO NOT DUPLICATE — OTTO Pixel lives here”.

  • Add a monitoring step in releases: DevTools → Network quick scan for duplicate script calls.

A properly installed, single instance of the OTTO Pixel ensures your site is ready for automation. It unlocks accurate scanning, activates your Knowledge Graph, and enables OTTO to do what it’s best at — finding and fixing SEO problems in real-time.

By following this guide, you’ll avoid the most common missteps we see across our support team and community. Whether you’re using GTM, a plugin, or manual code, remember: one method, one place, one clean load.

Still seeing issues? Run the OTTO Diagnostic, check your browser’s DevTools, and if needed, reach out with a link to your site and a screenshot of your script setup — we’re here to make sure your setup is clean, compliant, and ready for scale.

Welcome to smarter SEO.

Did this answer your question?