Hey all. My company is currently implementing Gro...
# ask-questions
a
Hey all. My company is currently implementing GrowthBook, and we're seeing Multiple Exposures Issue for most of our sanity tests. Roughly 17% of all users are being filtered out due to this. This is happening in tests with no new phases, so I don't expect that Sticky Bucketing is the culprit here. I've been unsuccessful in finding a solution in the documentation. So far, in this section (https://docs.growthbook.io/kb/experiments/troubleshooting-experiments#solution-4-ensure-the-hash-attribute-and-identifier-type-match) I see this: "_When you analyze experiments, you set an "Identifier Type" that corresponds to columns in your data warehouse. Ideally, the Hash Attribute that you choose for users is both (1) logged to the data warehouse in the trackingCallback, and (2) is used as the "Identifier Type" for all of these experiments. By doing this, you establish a 1:1 relationship between the Hash Attribute and the Identifier Type."_ However, the documentation also states that if my Hash attribute doesn't correspond to the identifier in the data warehouse, I would see both Multiple Exposures AND SRM issues; I don't see SRM issues in my tests. Can anyone help recommend a way to debug or investigate the root cause of this issue?
f
Can you tell me more about what kind of experiment this is?
a
Hi @fresh-football-47124 It is basically any experiment we run. We are running a few sanity checking tests, where Control and Variation are entirely the same. It's a Visual Editor test with no visual or functional difference between variations (other than VAR printing a browser console msg). We see this issue pop up:
I've looked into our datawarehouse (BQ). When users see both variations, there's a consistent pattern: Users get 1 growthbook-experiment event with one variation. And then, often 3-4 seconds later, they will get another growthbook-experiment event with the other variation. And from then on, all remaining events will contain the 2nd variation. So it seems that the issue is caused by the first experiment event assigning the wrong variation or being over-written by the 2nd event somehow
f
can you share the implementation code?
a
I'll reach out to my developer and get back to you 🙂
f
this can happen when the randomization unit is different from the analysis unit
particularly if the randomization unit is not persistent
a
My developer sent me this now: Config:
window.growthbook_config = window.growthbook_config || {};
window.growthbook_config.attributes = {
"visitorState": "Company",
"userIsLoggedIn": "foo",
"useQuarterlyBonus": "foo",
"PageTemplate": "foo",
"item_list_name": "foo",
"lomax_source": "foo"
};
window.growthbook_config.trackingCallback = function(experiment, result) {
if (typeof dataLayer !== 'undefined') {
dataLayer.push({
'event': 'growthbook_experiment',
'experiment_id': experiment.key,
'variation_id': result.key
});
}
console.log("GrowthBook experiment:", experiment.key, "variation:", result.key);
};
Script to fetch growthbook SDK:
<script async="" data-api-host="<https://cdn.growthbook.io>" data-client-key="sdk-lbJ8nntO3Byaw1y" src="<https://cdn.jsdelivr.net/npm/@growthbook/growthbook/dist/bundles/auto.min.js>"></script>
Loading chain: config -> script for sdk -> popup system js file
is that what you requested?
@fresh-football-47124 Is there any other code I need to get for you now?
f
hi Kim
thanks for the implementation
can you share one of the payload for an experiment? (or a screen shot from GrowthBook)
I want to know what the randomization unit is
a
The randomization unit is
id
(v2 hashing). This is set via
growthbook_config.attributes
in the frontend code. It maps to
anonymous_id
in our GrowthBook assignment query, which corresponds to
user_pseudo_id
in BigQuery. We've been experiencing a multiple exposures issue (~17-19% of traffic) which we believe is caused by the SDK firing before
id
is available. I've attached a screenshot of the experiment. I'm also attaching the "SDK payload" from the DevTools extension.
Copy code
{
  "status": 200,
  "features": {
    "test_gb_popup_full": {
      "defaultValue": false
    },
    "test_popup_local_lasse": {
      "defaultValue": true
    },
    "Sign-up_10": {
      "defaultValue": true
    },
    "test-oprette-feature": {
      "defaultValue": 1
    }
  },
  "experiments": [
    {
      "key": "gb-lomax-test1",
      "changeId": "bb07425a4e342efdb2b431af49b287f4f6f54ce5818e6a2230f71833d9db7656",
      "status": "running",
      "variations": [
        {
          "css": "",
          "js": "console.log(\"Control - yes!\")",
          "domMutations": []
        },
        {
          "css": "",
          "js": "console.log(\"V1 - yes!\")",
          "domMutations": []
        }
      ],
      "hashVersion": 2,
      "hashAttribute": "id",
      "fallbackAttribute": "",
      "disableStickyBucketing": false,
      "bucketVersion": 1,
      "minBucketVersion": 0,
      "urlPatterns": [
        {
          "include": true,
          "type": "simple",
          "pattern": "/*"
        }
      ],
      "weights": [
        0.5,
        0.5
      ],
      "meta": [
        {
          "key": "0"
        },
        {
          "key": "1"
        }
      ],
      "filters": [],
      "seed": "477fbeed-3a41-4add-9eed-f7299d0ed537",
      "phase": "1",
      "condition": {
        "url": {
          "$exists": true
        }
      },
      "coverage": 1
    },
    {
      "key": "test-i-kurv",
      "changeId": "96f03b870bdf983653b3087f680a3dea464030b2d7e82e7d8a7556e6131326e1",
      "status": "running",
      "variations": [
        {
          "css": "",
          "js": "",
          "domMutations": []
        },
        {
          "css": "",
          "js": "console.log(\"Kurv-test - yes!\")",
          "domMutations": []
        }
      ],
      "hashVersion": 2,
      "hashAttribute": "id",
      "fallbackAttribute": "",
      "disableStickyBucketing": false,
      "urlPatterns": [
        {
          "include": true,
          "type": "simple",
          "pattern": "<https://www.lomax.dk/kurv/>"
        }
      ],
      "weights": [
        0.5,
        0.5
      ],
      "meta": [
        {
          "key": "0"
        },
        {
          "key": "1"
        }
      ],
      "filters": [],
      "seed": "e7fffa7a-3834-409f-bbf0-a7fd498a31fc",
      "phase": "0",
      "condition": {
        "url": {
          "$exists": true
        }
      },
      "coverage": 1
    },
    {
      "key": "desktop-brugete",
      "changeId": "ea4622d0776248dfb7df6571a73451dcf39672f73f59e7e628bf6270c5ffd65a",
      "status": "running",
      "variations": [
        {
          "css": "",
          "js": "",
          "domMutations": []
        },
        {
          "css": "",
          "js": "console.log(\"forside test - VAR!\")",
          "domMutations": []
        }
      ],
      "hashVersion": 2,
      "hashAttribute": "id",
      "fallbackAttribute": "",
      "disableStickyBucketing": false,
      "bucketVersion": 1,
      "minBucketVersion": 0,
      "urlPatterns": [
        {
          "include": true,
          "type": "simple",
          "pattern": "<https://www.lomax.dk/*>"
        }
      ],
      "weights": [
        0.5,
        0.5
      ],
      "meta": [
        {
          "key": "0"
        },
        {
          "key": "1"
        }
      ],
      "filters": [],
      "seed": "5c5d60cf-e4d7-469a-aafb-1da4e488b725",
      "phase": "1",
      "condition": {
        "deviceType": "desktop"
      },
      "coverage": 1
    },
    {
      "key": "ny-sanity-test-efter-gtm-fix",
      "changeId": "ff1af3a16c1f98104dc33df6aced3e183e141c59d59df5e31913beeb5d6fbd79",
      "status": "running",
      "variations": [
        {
          "css": "",
          "js": "console.log(\"Control - yes!\")",
          "domMutations": []
        },
        {
          "css": "",
          "js": "console.log(\"Sanity-test V2 - VAR\")",
          "domMutations": []
        }
      ],
      "hashVersion": 2,
      "hashAttribute": "id",
      "fallbackAttribute": "",
      "disableStickyBucketing": false,
      "urlPatterns": [
        {
          "include": true,
          "type": "simple",
          "pattern": "/*"
        }
      ],
      "weights": [
        0.5,
        0.5
      ],
      "meta": [
        {
          "key": "0"
        },
        {
          "key": "1"
        }
      ],
      "filters": [],
      "seed": "477fbeed-3a41-4add-9eed-f7299d0ed537",
      "phase": "0",
      "condition": {
        "url": {
          "$exists": true
        }
      },
      "coverage": 1
    }
  ],
  "dateUpdated": "2026-03-31T05:40:36.120Z"
}
Let me know if there's anything else I can find for you
Hi @fresh-football-47124 Did you have the chance to look at the code I sent you yet? 🙂
@fresh-football-47124 Do you know if you can provide any feedback this week? 🙂
@fresh-football-47124 Is there someone I can direct my question to, if you're pressed for time?
f
from what I can tell, you're assigning based on "id" but I don't see "id" set in your list of attributes
which doesn't seem right - as if the attribute is missing, it should not assign at all.
window.growthbook_config.attributes = {
"visitorState": "Company",
"userIsLoggedIn": "foo",
"useQuarterlyBonus": "foo",
"PageTemplate": "foo",
"item_list_name": "foo",
"lomax_source": "foo"
};
a
Ok. So how would I proceed from here?
@fresh-football-47124 is there something you can recommend I proceed with to continue debugging this issue?
Hi @fresh-football-47124. I really appreciate the time you've taken so far, but I need to proceed to try to resolve this issue. It's been 38 days since I asked originally, so I've re-posted my question in the main ask-questions channel now