Skip to main content

Accessing Mida A/B Test Variant Data for Internal Tracking

Updated over 2 months ago

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

  1. SPAs: For Single Page Applications, variant data persists across route changes.

  1. Cross-domain: For cross-domain tracking scenarios, Mida uses server-side exposure data rather than localStorage. Contact support for cross-domain implementations.

  1. Privacy: localStorage data is scoped to the domain and does not transfer across subdomains by default.

Did this answer your question?