For builders. Evaluating Optiview in plain language? Start with the signal guide — this page is IDs, allowed values, and code.
Builder reference
Signal reference
Canonical contract for si_personalization_signal. Branch on stable IDs — Optiview does not render experiences.
- Commercial signals — readiness, blockers, recommended actions (
si.commercial_signals) - Context + dynamics — observed visit facts and browsing pace (separate from commitment readiness)
- Labels — for panels and copy only; never use
*_labelor deprecated prose aliases in GTM/Target rules
Example dataLayer push
Fires when meaning changes. Verify: dataLayer.filter((e) => e.event === 'si_personalization_signal').pop()
window.dataLayer.push({
"event": "si_personalization_signal",
"si": {
"context": {
"traffic_source_type": "paid_search",
"device_class": "mobile",
"visit_recency_bucket": "first_seen",
"local_time_bucket": "evening"
},
"session_dynamics": {
"decision_pace": "slow",
"engagement_trend": "deepening",
"session_velocity": "accelerating"
},
"commercial_signals": {
"status": "active",
"signal_phase": "explainable_heuristic",
"commercial_state_id": "hesitating",
"blocker_ids": [
"financing_or_payment_uncertainty"
],
"recommended_next_actions": [
{
"action_id": "promote_financing_clarity",
"priority": "high",
"confidence_0_1": 0.8
}
]
}
}
});Tag & dataLayer emit catalog
Everything the hosted tag can push on si_personalization_signal for your CMS, Adobe, Target, or GTM to consume. Generated from activationPayload.ts — regenerate via pnpm docs:generate after contract changes.
action_id values to experiences.Primary integration object: structured visitor intelligence your CMS, Adobe stack, Optimizely, or GTM can route on. Branch on si.commercial_signals and si.context first; si.personalization_signal is a secondary messaging layer.
si.commercial_signals — primary CMS / GTM branching
| Field | Type | What it means | CMS leverage |
|---|---|---|---|
si.commercial_signals.statusstatus | "active" | "diagnostic" | active = interpretation available; diagnostic = page blocked (WAF, access denied). | Metadata Gate rules — only branch when status is active |
si.commercial_signals.signal_phasesignal phase | "explainable_heuristic" | Transport metadata — deterministic session signals, not ML probabilities. | Metadata Metadata — explainable_heuristic today; not a targeting dimension |
si.commercial_signals.commercial_state_idcommercial state id | CommercialStateId (closed enum) | Commitment readiness: exploring, evaluating, narrowing, hesitating, committing, recovering, re-engaging. | Branch in CMS/GTM Primary CMS key: how ready the visitor is to commit (hesitating, narrowing, …) |
si.commercial_signals.commercial_state_labelcommercial state label | string | Human label for panels and reports — do not use in CMS targeting rules. | Display only Display copy for dashboards — never use in Target/GTM conditions |
si.commercial_signals.blocker_idsblocker ids | string[] | Taxonomy IDs for likely friction (e.g. financing_or_payment_uncertainty). | Branch in CMS/GTM Match friction themes to modules (financing uncertainty, trust, shipping, …) |
si.commercial_signals.recommended_next_actionsrecommended next actions | RecommendedNextAction[] | Ranked action suggestions for your stack to map to modules or suppressions. | Branch in CMS/GTM Ordered list of what the site could do next |
si.commercial_signals.recommended_next_actions[].action_idaction id | string (closed enum) | Stable action key — map to CMS fragments, GTM tags, or React modules. | Branch in CMS/GTM Map each action_id to a CMS fragment, component, or suppression rule |
si.commercial_signals.recommended_next_actions[].prioritypriority | "high" | "medium" | "low" | Relative priority when multiple actions are present. | Branch in CMS/GTM Prefer high-priority actions when multiple fire |
si.commercial_signals.momentum_direction_idmomentum direction id | closed enum | accelerating | stalling | reversing | validating — session momentum direction. | Branch in CMS/GTM Pair with state for urgency vs patience treatments |
si.commercial_signals.hesitation_trend_idhesitation trend id | closed enum | stable | increasing | decreasing — how hesitation is trending this session. | Branch in CMS/GTM Trending hesitation — soften or reinforce over time |
si.commercial_signals.entitiesentities | CommercialEntitySignal[] | Products, vehicles, plans, or content the visitor is engaging with. | Branch in CMS/GTM Personalize inventory grids, VDPs, or product modules |
si.commercial_signals.entities[].entity_typeentity type | string | e.g. vehicle, product, plan, package. | Branch in CMS/GTM Category of entity (vehicle, product, plan) |
si.commercial_signals.entities[].entity_identity id | string | Stable slug for the entity (inventory personalization). | Branch in CMS/GTM Stable slug for the entity in your catalog |
si.commercial_signals.journey_stage_idjourney stage id | JourneyStageId | discovery | browsing | comparison | conversion — portable journey stage. | Branch in CMS/GTM discovery → conversion ladder for hierarchy and module order |
si.commercial_signals.need_state_idneed state id | string (enum) | Stable need-state key — reassurance vs acceleration copy in CMS. | Branch in CMS/GTM Reassurance vs acceleration copy variant in CMS |
si.commercial_signals.message_angle_idmessage angle id | string (enum) | Messaging approach slug for content variants (payment_clarity, etc.). | Branch in CMS/GTM Content variant key (payment_clarity, expert_consultation, …) |
si.commercial_signals.interruption_posture_idinterruption posture id | closed enum | How aggressively the site should interrupt (observe_only, soft_nudge, guided_nudge, …). | Branch in CMS/GTM How hard the site should interrupt (observe_only, soft_nudge, …) |
si.commercial_signals.offer_type_idoffer type id | string | Recommended offer class slug for CMS module selection. | Branch in CMS/GTM Module family to render (payment_guidance, comparison_tray, …) |
si.commercial_signals.vertical_idvertical id | string | Site vertical pack (auto_retail, b2b_saas, …) used for taxonomy and overlays. | Branch in CMS/GTM Which vertical taxonomy pack applies |
si.context — observed visit facts
| Field | Type | What it means | CMS leverage |
|---|---|---|---|
si.context.traffic_source_typetraffic source type | closed enum | paid_search, organic_search, direct, email, … — how the visit arrived. | Branch in CMS/GTM Paid vs organic vs direct — acquisition-specific modules |
si.context.device_classdevice class | closed enum | mobile | tablet | desktop — layout and CTA density rules. | Branch in CMS/GTM Mobile layout, sticky CTAs, shorter forms |
si.context.visit_recency_bucketvisit recency bucket | closed enum | first_seen, returning_30d, same_day_return, … — repeat visit context. | Branch in CMS/GTM Returning vs first-time — continuity and saved state |
si.context.local_time_bucketlocal time bucket | closed enum | evening, workday, commute_morning, … — time-of-day modules. | Branch in CMS/GTM Time-of-day messaging (evening research, commute, …) |
si.context.campaign_intent_familycampaign intent family | closed enum | financing, inventory, service, … — inferred from campaign/referrer clues. | Branch in CMS/GTM Align landing experience with campaign theme |
si.context.referrer_classreferrer class | closed enum | search_engine, social_platform, email_client, … | Branch in CMS/GTM Channel class for broad rules |
si.context.is_retargeted_sessionis retargeted session | boolean | Whether retargeting parameters were detected on landing. | Branch in CMS/GTM Retargeting-aware tone and offers |
si.session_dynamics — pace & engagement
| Field | Type | What it means | CMS leverage |
|---|---|---|---|
si.session_dynamics.decision_pacedecision pace | closed enum | fast | normal | slow | stalled — how deliberate decisions feel this session. | Branch in CMS/GTM Slow pace → delay popups; fast → advance CTAs |
si.session_dynamics.engagement_trendengagement trend | closed enum | deepening | flat | thinning — whether attention is building or fading. | Branch in CMS/GTM Deepening → expand content; thinning → lighten touch |
si.session_dynamics.session_velocitysession velocity | closed enum | accelerating | steady | slowing | stalled — pace through pages (separate from commitment readiness). | Branch in CMS/GTM Fast page changes while deciding — separate from hesitating to commit |
si.session_dynamics.interaction_densityinteraction density | closed enum | low | medium | high | bursty — click/scroll intensity. | Branch in CMS/GTM Bursty clicks → comparison or calculator modules |
si.personalization_signal — secondary messaging layer
| Field | Type | What it means | CMS leverage |
|---|---|---|---|
si.personalization_signal.journey_stagejourney stage | JourneyStage | discovery | browsing | comparison | conversion - inferred from behavior and rules. | Branch in CMS/GTM Change messaging hierarchy and module order |
si.personalization_signal.need_state_idneed state id | string (enum) | Stable need-state key for CMS/GTM (see signal-id-enums.json). | Branch in CMS/GTM Reassurance vs acceleration copy variant in CMS |
si.personalization_signal.need_state_labelneed state label | string | Human-readable need description (panels, reports). | Display only Human-readable need for panels |
si.personalization_signal.inferred_needinferred need | string | Deprecated alias of need_state_label. Use need_state_id for targeting. | Display only Deprecated alias of need_state_label |
si.personalization_signal.top_conceptstop concepts | { id, label, score }[] | Up to five strongest business-concept affinities (0–1 scores). | Branch in CMS/GTM Personalize modules, grids, and related content |
si.personalization_signal.message_angle_idmessage angle id | string (enum) | Stable machine key for CMS/GTM/Target branching (e.g. operating_rhythm, payment_clarity). See signal-id-enums.json. | Branch in CMS/GTM Content variant key (payment_clarity, expert_consultation, …) |
si.personalization_signal.message_angle_labelmessage angle label | string | Human-readable message angle for panels and reports — not an activation key. | Display only Human-readable angle for panels |
si.personalization_signal.recommended_message_anglerecommended message angle | string | Deprecated alias of message_angle_label. Use message_angle_id for targeting rules. | Display only Deprecated alias of message_angle_label |
si.personalization_signal.offer_type_idoffer type id | string | Stable slug for recommended offer class (e.g. payment_guidance). | Branch in CMS/GTM Module family to render (payment_guidance, comparison_tray, …) |
si.personalization_signal.offer_type_labeloffer type label | string | Human-readable offer class label. | Display only Human-readable offer class label. |
si.personalization_signal.recommended_offer_typerecommended offer type | string | Suggested offer class (guide, checklist, soft demo, etc.). | Branch in CMS/GTM Select treatment class in CMS, AEM, or Target |
si.personalization_signal.recommended_surfacerecommended surface | string | Where to place the treatment (maps from NBA surface + opportunity). | Branch in CMS/GTM Pick which page region your stack should update |
si.personalization_signal.recommended_timingrecommended timing | string | When to surface the treatment (e.g. after scroll depth, second page). | Branch in CMS/GTM Delay or sequence modules (scroll, next page, exit) |
si.personalization_signal.recommended_friction_levelrecommended friction level | "low" | "medium" | "high" | Suggested friction for the offer or CTA. | Branch in CMS/GTM Light nudge vs. high-commitment CTA |
si.personalization_signal.reasonreason | string[] | Short bullet reasons (trimmed) supporting the signal. | Branch in CMS/GTM Analytics, QA, and human-readable explainability |
si.site
| Field | Type | What it means | CMS leverage |
|---|---|---|---|
si.site.type_labeltype label | string | Human-readable site type for CMO-facing tools. | Display only Human-readable site type for CMO-facing tools. |
si.site.business_contextbusiness context | string | Same as type_label today - high-level business read. | Branch in CMS/GTM Same as type_label today - high-level business read. |
si.session
| Field | Type | What it means | CMS leverage |
|---|---|---|---|
si.session.journey_stagejourney stage | JourneyStage | Same as personalization_signal.journey_stage in envelope. | Branch in CMS/GTM Same as personalization_signal.journey_stage in envelope. |
si.activation
| Field | Type | What it means | CMS leverage |
|---|---|---|---|
si.activation.statusstatus | "developing" | "ready" | "strong" | How mature the activation read is for this session. | Metadata Gate rules — only branch when status is active |
si.activation.inferred_needinferred need | string | Primary inferred need for personalization. | Display only Primary inferred need for personalization. |
si.activation.primary_path_labelprimary path label | string | Primary activation path label. | Display only Primary activation path label. |
si.activation.secondary_path_labelsecondary path label | string | Secondary path label. | Display only Secondary path label. |
si.activation.soft_path_labelsoft path label | string | Soft conversion path label. | Display only Soft conversion path label. |
si.activation.reasonreason | string[] | Reason strings backing the opportunity. | Branch in CMS/GTM Reason strings backing the opportunity. |
Also emitted (operator/debug, do not use in CMS rules): si.context_debug, si.behavior. Optional second event: si_experience_decision for per-placement copy hints.
Personalization signal layer
Secondary branching IDs
Use when you need message angle / journey stage rules alongside commercial signals.
CMS, AEM, Target, and GTM branch on closed enum IDs and stable keys. Labels and deprecated prose aliases are for humans and panels only.
Core branching fields (closed enums)
Closed enums — finite, documented value sets. Safe for if/else rules, content-fragment keys, and audience conditions.
dataLayer path
si.personalization_signal.message_angle_idKind
closed_enum · message_angle_iddataLayer path
si.personalization_signal.need_state_idKind
closed_enum · need_state_iddataLayer path
si.behavior.interruption_postureKind
closed_enum · interruption_posturedataLayer path
si.site.typeKind
closed_enum · site_verticaldataLayer path
si.session.journey_stageKind
closed_enum · journey_stage
Human-only fields
Human-readable copy — never use as activation keys in CMS/GTM/Target.
dataLayer path
si.personalization_signal.message_angle_labelUse instead
branch onsi.personalization_signal.message_angle_iddataLayer path
si.personalization_signal.need_state_labelUse instead
branch onsi.personalization_signal.need_state_iddataLayer path
si.behavior.interruption_posture_labelUse instead
branch onsi.behavior.interruption_posturedataLayer path
si.personalization_signal.recommended_message_angleUse instead
branch onmessage_angle_label (deprecated prose alias)dataLayer path
si.personalization_signal.inferred_needUse instead
branch onneed_state_label (deprecated prose alias)
Dynamic slugs (not closed enums)
Runtime-derived snake_case slugs — not a closed enum. Do not hard-code exhaustive if/else trees; treat as hints or map in your CMS.
dataLayer path
si.personalization_signal.offer_type_idKind
dynamic_slug— Slug of recommended offer class (e.g. implementation_guide)dataLayer path
si.personalization_signal.top_concepts[].idKind
dynamic_slug— Concept affinity slugs from page semanticsdataLayer path
si_decision_offer_typeKind
dynamic_slug— Experience-decision offer class slug
const e = window.dataLayer.filter(x => x?.event === 'si_personalization_signal').pop();
[
e?.si?.personalization_signal?.message_angle_id,
e?.si?.personalization_signal?.need_state_id,
e?.si?.behavior?.interruption_posture,
e?.si?.site?.type,
e?.si?.session?.journey_stage,
]Machine-readable catalog: docs/reference/signal-machine-readable-ids.json
Platform snippets
Copy patterns — your rules own rendering and orchestration.
Google Tag Manager
// Custom Event: si_personalization_signal
// Branch on canonical IDs — NOT labels in panels
if ({{DLV - si.context.traffic_source_type}} === 'paid_search'
&& {{DLV - si.commercial_signals.blocker_ids}}.includes('financing_or_payment_uncertainty')) {
showFinancingReassuranceModule();
}
if ({{DLV - si.session_dynamics.decision_pace}} === 'slow') delayInterruption();Adobe Target
// Profile parameters — use flat IDs from pushCommercialSignalsToTargetProfile
// si_commercial_state_id, si_blocker_ids (comma-separated), si_top_action_id
if ({{DLV - si.commercial_signals.commercial_state_id}} === 'hesitating') suppressPopup();Webhook / server
POST /your/collector
{
"event": "si_personalization_signal",
"si": {
"commercial_signals": {
"status": "active",
"commercial_state_id": "hesitating",
"blocker_ids": ["financing_or_payment_uncertainty"],
"recommended_next_actions": [{ "action_id": "promote_financing_clarity" }]
}
}
}docs/reference/signal-machine-readable-ids.json — use that for exhaustive value lists during implementation, not deprecated personalization shorthand fields.