Troubleshooting Step Events in Adobe Journey Optimizer: Diagnosing Errors, Discards, and Failures for Reliable Customer Journeys
This is Part 2 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...
Schema disclaimer – Field names may evolve. Always verify against the public XDM reference: https://github.com/adobe/xdm/tree/master/docs/reference/adobe/experience/journeyOrchestration .
Picture an email that never leaves the station. Marketing is fuming, DevOps is shrugging, and you're the last line of defence. Time to interrogate Step Events.
Adobe's stock query examples include a basic error count per node; this post shows you how to diagnose those errors in style.
Already comfortable counting entrances/exits? Jump back to Step Events, Part 1: Fundamentals for refreshers; then continue here.
i) Understanding Error Fields: Decoding Step Event Failures in Adobe Journey Optimizer
Field What it captures
actionExecutionError |
High-level message (e.g. ACTION_EXECUTION_ERROR ) |
actionExecutionErrorCode |
Partner-specific code (SMTP, SMPP, HTTP) |
actionExecutionOriginError |
Origin system description |
fetchError , fetchErrorCode |
Errors during personalisation fetch |
Only one of these needs to be non-NULL for the step to be considered "in error".
ii) Node-Level Error Heatmap
When things go wrong, the first question is 'where?'. This query pinpoints which journey nodes are generating the most errors.
SELECT _experience.journeyOrchestration.stepEvents.nodeName AS node,
COUNT(DISTINCT _experience.journeyOrchestration.stepEvents.profileID) AS profiles
FROM journey_step_events
WHERE _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
AND timestamp > (NOW() - INTERVAL '6 hour')
AND (
_experience.journeyOrchestration.stepEvents.actionExecutionError IS NOT NULL OR
_experience.journeyOrchestration.stepEvents.fetchError IS NOT NULL)
GROUP BY node
ORDER BY profiles DESC;

iii) Drill-Down for a Single Action
Now that we know the 'where,' let's find the 'why.' This gives you the raw error codes for a specific, problematic action node.
SELECT timestamp,
_experience.journeyOrchestration.stepEvents.profileID AS profile,
_experience.journeyOrchestration.stepEvents.actionExecutionError AS err,
_experience.journeyOrchestration.stepEvents.actionExecutionErrorCode AS code
FROM journey_step_events
WHERE _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
AND _experience.journeyOrchestration.stepEvents.nodeName = '<Node-Name-Unique>'
AND _experience.journeyOrchestration.stepEvents.actionExecutionError IS NOT NULL
ORDER BY timestamp DESC
LIMIT 100;
Why unique Node Name? If your canvas re-uses the same label, use nodeID instead.

iv) Fetch vs. Send – Which Side Failed?
Is the problem with getting the personalization data (fetch), or sending the message (execution)? This query settles the debate.
SELECT CASE WHEN fetchError IS NOT NULL THEN 'fetch-error'
WHEN actionExecutionError IS NOT NULL THEN 'execution-error' END AS stage,
COUNT(*) AS occurrences
FROM journey_step_events
WHERE _experience.journeyOrchestration.stepEvents.journeyVersionID = '<journeyVersionID>'
AND _experience.journeyOrchestration.stepEvents.nodeName = '<Node-Name-Unique>'
GROUP BY stage;
v) Triage Workflow
- Run the heat-map query – identify the hottest node.
- Drill into that node for last N hours.
- If fetch errors dominate → look at data prep & personalisation sources.
- If execution errors dominate → contact support and inspect action provider logs (Message, custom action, etc.).
vi) Dispatcher & State-Machine Discards
1. EVENT_WITH_NO_JOURNEY (Dispatcher)
When an incoming event matches no running journey, the Dispatcher drops it. Use this query to trend such mis-routed events.
SELECT DATE(timestamp) AS event_day,
COUNT(*) AS discards
FROM journey_step_events
WHERE _experience.journeyOrchestration.serviceEvents.dispatcher.eventType = 'EVENT_WITH_NO_JOURNEY'
GROUP BY event_day
ORDER BY event_day DESC;

2. State-Machine Discard Taxonomy
If the event did reach a journey but was later rejected, the State-Machine records the reason.
eventType Meaning First Fix
terminatedJourneyVersion |
Version stopped/deleted |
Republish journey |
reentranceNotAllowed |
Re-entrance policy blocked |
Allow re-entry or start new instance |
expiredInstance |
Instance >30 days |
Shorten journey or re-start |
journeyVersionLoadingError |
Runtime load failed |
Contact support |
3. Query Template
SELECT _experience.journeyOrchestration.serviceEvents.stateMachine.eventType AS reason,
_experience.journeyOrchestration.stepEvents.journeyVersionID AS jvid,
COUNT(*) AS profiles
FROM journey_step_events
WHERE _experience.journeyOrchestration.serviceEvents.stateMachine.eventCode = 'discard'
GROUP BY reason, jvid;

Summary & What's Next
You now have a systematic playbook for interrogating Step Events when things go sideways— from zeroing-in on the hottest error nodes to dissecting segment-export discards. In Part 3 we take the gloves off and focus on performance and guardrails.
Continue your journey: Mastering Step Events in Adobe Journey Optimizer: Fundamentals, Schema, and Essential Queries for Da... | Optimizing and Validating Adobe Journey Optimizer Step Events: Performance Analytics, Feedback Integ...