If you're using your own internal tracking system and want to capture which Mida A/B test variant a visitor is assigned to, this guide explains the data structures and methods available.
Storage Locations
Mida stores variant assignment data in localStorage using two keys:
1. _variant_result β Variant Assignments
Contains the visitor's assigned variant for each active test.
// Structure
{
"12345": { // Test ID as string key
"vaId": 0, // Control variant
"uuid": "abc123", // Visitor's unique identifier
"complete": false // Whether a conversion has been recorded
},
"67890": {
"vaId": "Variant 1", // Variant name as string
"uuid": "abc123",
"complete": true
}
}
Understanding vaId Values
vaId Value | Meaning |
0 (number) | Control |
"Variant 1" (string) | Variant 1 |
"Variant 2" (string) | Variant 2 |
"Variant 3" (string) | Variant 3 |
etc. | ... |
Note: Only the Control variant uses the number 0. All other variants are stored as their full string name (e.g., "Variant 1", "Variant 2").
2. _abcache β Test Metadata
Contains metadata about active tests including test names.
// Structure (Array)
[
{
"test_id": 12345,
"test_name": "Homepage Hero Test",
// ... other test properties
},
{
"test_id": 67890,
"test_name": "CTA Button Color Test",
// ... other test properties
}
]
JavaScript Code Examples
Get All Active Variant Assignments
function getMidaVariants() {
var variants = [];
try {
var variantData = JSON.parse(localStorage.getItem('_variant_result')) || {};
var abCache = JSON.parse(localStorage.getItem('_abcache')) || [];
Object.keys(variantData).forEach(function(testId) {
var variant = variantData[testId];
var testMeta = abCache.find(function(test) {
return test && test.test_id && test.test_id.toString() === testId;
});
// Convert vaId to readable variant name
var variantName = variant.vaId === 0 || variant.vaId === '0'
? 'Control'
: variant.vaId;
variants.push({
testId: testId,
testName: testMeta ? testMeta.test_name : 'Unknown',
variant: variantName,
visitorId: variant.uuid,
hasConverted: variant.complete || false
});
});
} catch (e) {
console.error('Error reading Mida variant data:', e);
}
return variants;
}
// Example output:
// [
// { testId: "12345", testName: "Homepage Hero Test", variant: "Control", visitorId: "abc123", hasConverted: false },
// { testId: "67890", testName: "CTA Button Color Test", variant: "Variant 1", visitorId: "abc123", hasConverted: true }
// ]
Get Variant for a Specific Test
function getMidaVariantByTestId(targetTestId) {
try {
var variantData = JSON.parse(localStorage.getItem('_variant_result')) || {};
var abCache = JSON.parse(localStorage.getItem('_abcache')) || [];
var variant = variantData[targetTestId.toString()];
if (!variant) return null;
var testMeta = abCache.find(function(test) {
return test && test.test_id && test.test_id.toString() === targetTestId.toString();
});
// Convert vaId to readable variant name
var variantName = variant.vaId === 0 || variant.vaId === '0'
? 'Control'
: variant.vaId;
return {
testId: targetTestId,
testName: testMeta ? testMeta.test_name : 'Unknown',
variant: variantName,
visitorId: variant.uuid,
hasConverted: variant.complete || false
};
} catch (e) {
console.error('Error reading Mida variant data:', e);
return null;
}
}
Send to Your Internal Tracking System
function sendMidaDataToInternalTracking() {
var variants = getMidaVariants();
variants.forEach(function(test) {
// Replace with your internal tracking call
yourTrackingSystem.track('ab_test_exposure', {
test_id: test.testId,
test_name: test.testName,
variant: test.variant,
visitor_id: test.visitorId
});
});
}
Data Reference
Field | Location | Description |
Test ID | _variant_result keys | Unique identifier for the A/B test |
Variant (vaId) | _variant_result[testId].vaId | 0 = Control, otherwise the variant name string (e.g., "Variant 1") |
Visitor UUID | _variant_result[testId].uuid | Unique visitor identifier |
Conversion Flag | _variant_result[testId].complete | true if visitor converted |
Test Name | _abcache[].test_name | Human-readable test name |
Important Notes
SPAs: For Single Page Applications, variant data persists across route changes.
Cross-domain: For cross-domain tracking scenarios, Mida uses server-side exposure data rather than localStorage. Contact support for cross-domain implementations.
Privacy: localStorage data is scoped to the domain and does not transfer across subdomains by default.
