Identifiers, Users, and Mapping Tables
1. What this page is about
This page explains how Neon Blue identifies users across your systems and which mapping tables we expect in your data warehouse.
It is written for:
Data / analytics engineers who maintain your warehouse
Marketing ops / lifecycle teams who care about experiments being measured correctly
You do not need prior knowledge of Neon Blue to understand this page.
2. Quick overview: what Neon Blue is and why IDs matter
Neon Blue is an AI-driven experimentation and personalization platform. It:
Generates and tests different creative variants (emails, on-site banners, etc.)
Learns which variants work best for which users
Continuously optimizes performance over time
To do that, we have to answer a basic question reliably:
“Are we looking at the same person in your ecommerce system, your email platform, and your analytics tools?”
That is why the identifier model is one of the first things we align on. If user identities are messy, experiments are hard to trust. If they are clean, everything else becomes much easier.
3. The canonical user_id
We ask each customer to choose one canonical identifier that represents a “user” (often a customer account or household) across the integration. We call this user_id.
This user_id:
Is stable over time
Is unique per user
Exists in your warehouse on key tables (profiles, orders, events)
Common choices:
shopify_customer_id(for Shopify brands)A
customer_idprimary key from your internal customer tableAnother ecommerce platform’s customer identifier
How Neon Blue uses user_id:
All experiments and gate assignments are keyed by
user_idAll persona tags we send back are keyed by
user_idWhen we join events, orders, and assignments,
user_idis the common key
If you remember only one thing from this page, it’s:
“Pick a clear, stable
user_idand use it everywhere.”
4. Other identifiers you probably have
Most teams also have other IDs floating around. That’s normal. We just want to separate their roles clearly.
4.1 Messaging / ESP IDs
These are IDs from tools like Klaviyo, Braze, Iterable, or your CRM.
Examples:
klaviyo_person_idbraze_user_idsalesforce_contact_id
These IDs are usually intended to map 1:1 to your canonical user_id, but sometimes you’ll discover oddities (e.g., duplicate contact records).
We recommend keeping this mapping in its own table:
Table: user_messaging_id_map
user_id– your canonical user idmessaging_platform– e.g.,'klaviyo','braze'messaging_person_id– the ID in that system
This table is useful when:
You want to upload Neon Blue personas to your ESP
You want to join ESP-level performance data to Neon Blue assignments
4.2 Analytics / device IDs (pseudo IDs)
Analytics tools often use device- or browser-level IDs:
GA4
user_pseudo_idA first-party cookie ID
Mobile app device IDs
These are almost never 1:1 with real people:
One household can use multiple devices and browsers
A single device might be used by several people
We suggest a separate mapping table that acknowledges this reality:
Table: user_device_id_map
user_id– canonical user id (if known)device_id– e.g., GA4user_pseudo_idfirst_seen_at– when this mapping was first observedlast_seen_at– last time we saw this combination
How this is used:
You log pageviews and other web events by
device_idWhen
device_id ↔ user_idbecomes known (e.g., login), that mapping is stored hereNeon Blue can then connect browsing behavior to a user when possible
Anonymous traffic will still exist, and that’s okay. We work with what can be reliably tied back.
5. The user_profiles table
user_profiles is the main table that describes who your users are.
Think of it as:
“One row per user, with their core attributes.”
It should include everyone you want Neon Blue to learn about, not just paying customers.
Recommended shape:
Table: user_profiles
Required columns:
user_id– canonical user id (primary key)email– latest known email (nullable if not known)created_at– when this user first joined your universe
What does “joined your universe” mean?
For ecommerce: usually when they first gave you an email (newsletter signup, account creation, checkout start)
Not just when they placed their first order
Optional but very helpful:
Basic traits:
country,language,marketing_opt_in,is_subscriberLifecycle markers:
first_order_at,last_order_at,total_orders,total_revenueInternal segments:
segment_lifecycle,segment_value_tier, etc.
Why include non-purchasers?
Neon Blue also optimizes early-funnel experiences like welcome flows and lead-nurture journeys
If we never see those users in
user_profiles, we can’t learn anything about them or personalize for them
6. Recommended minimal ID architecture
We recommend you maintain three simple tables:
user_profilesOne row per user
Canonical
user_id,email,created_at, basic traits
user_messaging_id_mapMapping between
user_idand each messaging platform IDTypically 1:1 per platform, with occasional exceptions
user_device_id_mapMapping between
user_idand device or pseudo IDs1:many expected
This gives you:
Clean joins for experimentation and reporting
Flexibility to change ESPs or analytics tools in the future
A clear place to debug identity issues (“Why does this user appear twice?”)
7. Practical example: measuring a welcome flow
Imagine you want Neon Blue to optimize your Welcome email flow:
A new user signs up with an email.
Your system assigns them a new
user_idand stores it inuser_profiles.Your ESP creates a profile for them and writes that ID to
user_messaging_id_map.As they browse your site, your analytics tool logs pageviews by
device_id.When they log in or check out, you map that
device_idto theuser_idinuser_device_id_map.
Now, when Neon Blue runs an experiment on the Welcome flow:
We assign a variant per
user_id(e.g., subject line A vs B).We see their events (opens, clicks, orders) keyed by
user_id.We measure performance per variant, reliably, with all their cross-device behavior.
The entire chain works because user_id is consistent and the mapping tables are clean.
Last updated