Expand my Community achievements bar.

Join expert-led sessions on Real-Time CDP & Journey Optimizer designed to boost your impact.

Mastering Step Events in Adobe Journey Optimizer: Fundamentals, Schema, and Essential Queries for Data-Driven Campaigns

Avatar

Employee

6/30/25

Why Step Events Matter: The Foundation of Journey Analytics in Adobe Journey Optimizer

This is Part 1 of a 3-part series on Step Events in Adobe Journey Optimizer. Jump to: Mastering Step Events in Adobe Journey Optimizer: Fundamentals, Schema, and Essential Queries for Da... | Troubleshooting Step Events in Adobe Journey Optimizer: Diagnosing Errors, Discards, and Failures fo... | Optimizing and Validating Adobe Journey Optimizer Step Events: Performance Analytics, Feedback Integ...

What to expect from this trilogy: This 3-part blog series is your comprehensive guide to mastering Step Events in Adobe Journey Optimizer.
Part 1 lays the foundation—explaining the Step Events schema, key identifiers, and essential queries for understanding journey analytics.
Part 2 dives into troubleshooting, showing you how to diagnose errors, discards, and failures to ensure reliable customer journeys.
Part 3 focuses on performance optimization, validation, and integrating feedback, equipping you to monitor, tune, and cross-validate your journeys for maximum impact.

i) Getting Access

  1. Make sure you have Query Service access to the target sandbox.
  2. Preferred tools: AEP Query UI or any Postgres-compatible client (e.g., DB Visualizer) using the same credentials.

Here's what the Query Service UI looks like in Adobe Experience Platform:

image.png

ii) Schema Overview

Key nested sections of _experience.journeyOrchestration :

Section What it captures

stepEventsOrchestration info at per node, per profile level (nodeType, nodeName, stepStatus, …)
serviceEventsUp-stream or infra signals (dispatcher discards, orchestrator export jobs…)
profile & journeyPresent only on certain error paths today; future-proofed for all events

The attributes above reside in the flattened analytics dataset named journey_step_events. Below are the leaf fields you will query most often:

  • journeyVersionID – UUID of the journey version you are analyzing.
  • nodeType – start, action, condition, wait, etc.
  • stepStatus – SUCCEEDED, FAILED, TIMED_OUT, and more.
  • entrance – Boolean flag set only on the first node hit when a profile enters.
  • instanceEnded – Boolean flag set when a profile finishes (whatever the outcome).
  • timestamp – Node execution time in ISO-8601 (UTC).
{
  "_experience": {
    "journeyOrchestration": {
      "stepEvents": [
        {
          "journeyVersionID": "9ac7ac5e-1234-4cde-8a2b-61b6faeab999",
          "nodeType": "action",
          "nodeName": "Send Email #1",
          "stepStatus": "SUCCEEDED",
          "timestamp": "2024-02-14T16:32:11Z"
        }
      ]
    }
  }
}

Journey Identifiers & Time Filters

Know your journey IDs – The journeyVersionID is the UUID you see as the last segment of the URL when a journey version is open. Its friend journeyVersionName is the human-readable display name. You will reference one of these in almost every query.

-- ISO timestamp stored as TIMESTAMP type. Keep it raw for Common Table Expressions.
SELECT timestamp
FROM   journey_step_events
LIMIT  10;

-- Last 48 hours
WHERE timestamp > (NOW() - INTERVAL '48 hour');

-- Group by calendar day
SELECT DATE(timestamp) AS event_day, COUNT(*)
FROM   journey_step_events
GROUP  BY event_day;

iii) Your First Queries

1. How many unique profiles entered a journey in the past 24 h?

Let's start with a foundational query: getting a simple headcount of who's knocking on the journey's front door.

SELECT COUNT(DISTINCT _experience.journeyOrchestration.stepEvents.profileID)
FROM   journey_step_events
WHERE  _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
  AND  _experience.journeyOrchestration.stepEvents.nodeType = 'start'
  AND  timestamp > (NOW() - INTERVAL '24 hour');

image.png

2. Node heat-map (entries per node name)

Time to find the hot-spots. This query acts like a thermal camera, revealing which nodes on your canvas are getting the most traffic.

SELECT _experience.journeyOrchestration.stepEvents.nodeName   AS node,
       COUNT(*)                                             AS hits
FROM   journey_step_events
WHERE  _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
AND   _experience.journeyOrchestration.stepEvents.journeyNodeProcessed = 'true'
GROUP  BY node
ORDER  BY hits DESC;
 

image.png

iv) Counting Entrances

Your CMO asks, "How many real humans actually entered that flashy welcome journey yesterday?" You have 10 minutes before the exec meeting. Time to wield SQL like a lightsaber.

Before diving in, keep Adobe's canonical Examples of queries page open in another tab. We'll upgrade those snippets with re-entrance logic and throughput heat-maps.

1. Tracking Exits

Just as important as who comes in, is who leaves. Let's see the total number of profiles that have finished the journey.

-- Total exits (any status) last 24 h
SELECT COUNT(*)
FROM   journey_step_events
WHERE  _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
  AND  _experience.journeyOrchestration.stepEvents.instanceEnded = TRUE
  AND  _experience.journeyOrchestration.stepEvents.instanceType = 'unitary'
  AND  timestamp > (NOW() - INTERVAL '24 hour');

2. Exit Status Breakdown

Not all exits are created equal. This query breaks down how profiles left—whether they finished, timed-out, or hit an error.

SELECT _experience.journeyOrchestration.stepEvents.stepStatus AS status,
       COUNT(*)                                              AS cnt
FROM   journey_step_events
WHERE  _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
  AND  _experience.journeyOrchestration.stepEvents.instanceType = 'unitary'
  AND  _experience.journeyOrchestration.stepEvents.instanceEnded = TRUE
GROUP  BY status
ORDER  BY cnt DESC;

3. Throughput per Minute (Hot-Spot Detection)

Let's zoom in on the entry-gate's busiest moments. This helps you visualize pressure on the Start node, minute by minute.

SELECT DATE_FORMAT(
         TO_TIMESTAMP(FLOOR(EXTRACT(EPOCH FROM timestamp)*1000/60000)*60000/1000),
         'yyyy-MM-dd HH:mm')               AS bucket,
       COUNT(*)                            AS requests
FROM   journey_step_events
WHERE  _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
  AND  _experience.journeyOrchestration.stepEvents.nodeType = 'start'
  AND  _experience.journeyOrchestration.stepEvents.instanceType = 'unitary'
GROUP  BY bucket
ORDER  BY bucket;

v) Troubleshooting Checklist

  1. Confirm the event or segment trigger actually fired (check serviceEvents.dispatcher ).
  2. Verify re-entrance settings on the Start node.
  3. Make sure the journey version is Running and not Stopped .
  4. Use the exit breakdown query to see if profiles time-out or hit capping errors.

Summary & What's Next

Congratulations—you now have a working toolbox for exploring the journey_step_events dataset. We covered how to locate your journey IDs, slice data by time, surface hot-spots, and tally entrances vs. exits in minutes.

In Part 2 we will dive deep into troubleshooting failures & discards, turning those raw Step Events into actionable fixes. Part 3 then rounds out the trilogy with performance tuning and validation techniques.

Continue your journey: Troubleshooting Step Events in Adobe Journey Optimizer: Diagnosing Errors, Discards, and Failures fo... | Optimizing and Validating Adobe Journey Optimizer Step Events: Performance Analytics, Feedback Integ...