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 *_label or deprecated prose aliases in GTM/Target rules

Quickstart · Integration patterns · Signal library

Example dataLayer push

Fires when meaning changes. Verify: dataLayer.filter((e) => e.event === 'si_personalization_signal').pop()

Production example
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.

For CMS authors: branch on fields marked Branch in CMS/GTM. Use Display only labels in copy and dashboards, not in targeting conditions. Optiview does not render modules — your stack maps 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
FieldTypeCMS leverage
si.commercial_signals.statusstatus"active" | "diagnostic"
Metadata

Gate rules — only branch when status is active

si.commercial_signals.signal_phasesignal phase"explainable_heuristic"
Metadata

Metadata — explainable_heuristic today; not a targeting dimension

si.commercial_signals.commercial_state_idcommercial state idCommercialStateId (closed enum)
Branch in CMS/GTM

Primary CMS key: how ready the visitor is to commit (hesitating, narrowing, …)

si.commercial_signals.commercial_state_labelcommercial state labelstring
Display only

Display copy for dashboards — never use in Target/GTM conditions

si.commercial_signals.blocker_idsblocker idsstring[]
Branch in CMS/GTM

Match friction themes to modules (financing uncertainty, trust, shipping, …)

si.commercial_signals.recommended_next_actionsrecommended next actionsRecommendedNextAction[]
Branch in CMS/GTM

Ordered list of what the site could do next

si.commercial_signals.recommended_next_actions[].action_idaction idstring (closed enum)
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"
Branch in CMS/GTM

Prefer high-priority actions when multiple fire

si.commercial_signals.momentum_direction_idmomentum direction idclosed enum
Branch in CMS/GTM

Pair with state for urgency vs patience treatments

si.commercial_signals.hesitation_trend_idhesitation trend idclosed enum
Branch in CMS/GTM

Trending hesitation — soften or reinforce over time

si.commercial_signals.entitiesentitiesCommercialEntitySignal[]
Branch in CMS/GTM

Personalize inventory grids, VDPs, or product modules

si.commercial_signals.entities[].entity_typeentity typestring
Branch in CMS/GTM

Category of entity (vehicle, product, plan)

si.commercial_signals.entities[].entity_identity idstring
Branch in CMS/GTM

Stable slug for the entity in your catalog

si.commercial_signals.journey_stage_idjourney stage idJourneyStageId
Branch in CMS/GTM

discovery → conversion ladder for hierarchy and module order

si.commercial_signals.need_state_idneed state idstring (enum)
Branch in CMS/GTM

Reassurance vs acceleration copy variant in CMS

si.commercial_signals.message_angle_idmessage angle idstring (enum)
Branch in CMS/GTM

Content variant key (payment_clarity, expert_consultation, …)

si.commercial_signals.interruption_posture_idinterruption posture idclosed enum
Branch in CMS/GTM

How hard the site should interrupt (observe_only, soft_nudge, …)

si.commercial_signals.offer_type_idoffer type idstring
Branch in CMS/GTM

Module family to render (payment_guidance, comparison_tray, …)

si.commercial_signals.vertical_idvertical idstring
Branch in CMS/GTM

Which vertical taxonomy pack applies

si.context — observed visit facts
FieldTypeCMS leverage
si.context.traffic_source_typetraffic source typeclosed enum
Branch in CMS/GTM

Paid vs organic vs direct — acquisition-specific modules

si.context.device_classdevice classclosed enum
Branch in CMS/GTM

Mobile layout, sticky CTAs, shorter forms

si.context.visit_recency_bucketvisit recency bucketclosed enum
Branch in CMS/GTM

Returning vs first-time — continuity and saved state

si.context.local_time_bucketlocal time bucketclosed enum
Branch in CMS/GTM

Time-of-day messaging (evening research, commute, …)

si.context.campaign_intent_familycampaign intent familyclosed enum
Branch in CMS/GTM

Align landing experience with campaign theme

si.context.referrer_classreferrer classclosed enum
Branch in CMS/GTM

Channel class for broad rules

si.context.is_retargeted_sessionis retargeted sessionboolean
Branch in CMS/GTM

Retargeting-aware tone and offers

si.session_dynamics — pace & engagement
FieldTypeCMS leverage
si.session_dynamics.decision_pacedecision paceclosed enum
Branch in CMS/GTM

Slow pace → delay popups; fast → advance CTAs

si.session_dynamics.engagement_trendengagement trendclosed enum
Branch in CMS/GTM

Deepening → expand content; thinning → lighten touch

si.session_dynamics.session_velocitysession velocityclosed enum
Branch in CMS/GTM

Fast page changes while deciding — separate from hesitating to commit

si.session_dynamics.interaction_densityinteraction densityclosed enum
Branch in CMS/GTM

Bursty clicks → comparison or calculator modules

si.personalization_signal — secondary messaging layer
FieldTypeCMS leverage
si.personalization_signal.journey_stagejourney stageJourneyStage
Branch in CMS/GTM

Change messaging hierarchy and module order

si.personalization_signal.need_state_idneed state idstring (enum)
Branch in CMS/GTM

Reassurance vs acceleration copy variant in CMS

si.personalization_signal.need_state_labelneed state labelstring
Display only

Human-readable need for panels

si.personalization_signal.inferred_needinferred needstring
Display only

Deprecated alias of need_state_label

si.personalization_signal.top_conceptstop concepts{ id, label, score }[]
Branch in CMS/GTM

Personalize modules, grids, and related content

si.personalization_signal.message_angle_idmessage angle idstring (enum)
Branch in CMS/GTM

Content variant key (payment_clarity, expert_consultation, …)

si.personalization_signal.message_angle_labelmessage angle labelstring
Display only

Human-readable angle for panels

si.personalization_signal.recommended_message_anglerecommended message anglestring
Display only

Deprecated alias of message_angle_label

si.personalization_signal.offer_type_idoffer type idstring
Branch in CMS/GTM

Module family to render (payment_guidance, comparison_tray, …)

si.personalization_signal.offer_type_labeloffer type labelstring
Display only

Human-readable offer class label.

si.personalization_signal.recommended_offer_typerecommended offer typestring
Branch in CMS/GTM

Select treatment class in CMS, AEM, or Target

si.personalization_signal.recommended_surfacerecommended surfacestring
Branch in CMS/GTM

Pick which page region your stack should update

si.personalization_signal.recommended_timingrecommended timingstring
Branch in CMS/GTM

Delay or sequence modules (scroll, next page, exit)

si.personalization_signal.recommended_friction_levelrecommended friction level"low" | "medium" | "high"
Branch in CMS/GTM

Light nudge vs. high-commitment CTA

si.personalization_signal.reasonreasonstring[]
Branch in CMS/GTM

Analytics, QA, and human-readable explainability

si.site
FieldTypeCMS leverage
si.site.type_labeltype labelstring
Display only

Human-readable site type for CMO-facing tools.

si.site.business_contextbusiness contextstring
Branch in CMS/GTM

Same as type_label today - high-level business read.

si.session
FieldTypeCMS leverage
si.session.journey_stagejourney stageJourneyStage
Branch in CMS/GTM

Same as personalization_signal.journey_stage in envelope.

si.activation
FieldTypeCMS leverage
si.activation.statusstatus"developing" | "ready" | "strong"
Metadata

Gate rules — only branch when status is active

si.activation.inferred_needinferred needstring
Display only

Primary inferred need for personalization.

si.activation.primary_path_labelprimary path labelstring
Display only

Primary activation path label.

si.activation.secondary_path_labelsecondary path labelstring
Display only

Secondary path label.

si.activation.soft_path_labelsoft path labelstring
Display only

Soft conversion path label.

si.activation.reasonreasonstring[]
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_id

    Kind

    closed_enum · message_angle_id
  • dataLayer path

    si.personalization_signal.need_state_id

    Kind

    closed_enum · need_state_id
  • dataLayer path

    si.behavior.interruption_posture

    Kind

    closed_enum · interruption_posture
  • dataLayer path

    si.site.type

    Kind

    closed_enum · site_vertical
  • dataLayer path

    si.session.journey_stage

    Kind

    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_label

    Use instead

    branch on si.personalization_signal.message_angle_id
  • dataLayer path

    si.personalization_signal.need_state_label

    Use instead

    branch on si.personalization_signal.need_state_id
  • dataLayer path

    si.behavior.interruption_posture_label

    Use instead

    branch on si.behavior.interruption_posture
  • dataLayer path

    si.personalization_signal.recommended_message_angle

    Use instead

    branch on message_angle_label (deprecated prose alias)
  • dataLayer path

    si.personalization_signal.inferred_need

    Use instead

    branch on need_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_id

    Kind

    dynamic_slug — Slug of recommended offer class (e.g. implementation_guide)
  • dataLayer path

    si.personalization_signal.top_concepts[].id

    Kind

    dynamic_slug — Concept affinity slugs from page semantics
  • dataLayer path

    si_decision_offer_type

    Kind

    dynamic_slug — Experience-decision offer class slug
DevTools — verify live payload
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
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
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
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" }]
    }
  }
}
Need the full enum catalog? Machine-readable IDs live in the repo at docs/reference/signal-machine-readable-ids.json — use that for exhaustive value lists during implementation, not deprecated personalization shorthand fields.