Journey Troubleshooting
Debugging marketing automation journeys.
Journey Status Check
View Active Journeys
SELECT id, name, status, trigger_type, enrolled_count, completed_count
FROM "Journey"
WHERE tenant_id = 'TENANT_ID'
AND status = 'ACTIVE';
View Journey Steps
SELECT step_order, type, config, next_step_id
FROM "JourneyStep"
WHERE journey_id = 'JOURNEY_ID'
ORDER BY step_order;
Enrollment Issues
Check Customer Enrollment
SELECT
je.id, je.status, je.current_step_id, je.enrolled_at, je.completed_at,
js.type as current_step_type
FROM "JourneyEnrollment" je
LEFT JOIN "JourneyStep" js ON je.current_step_id = js.id
WHERE je.customer_id = 'CUSTOMER_ID';
Find Stuck Enrollments
SELECT
je.id, je.customer_id, je.status, je.waiting_until,
j.name as journey_name, js.type as step_type
FROM "JourneyEnrollment" je
JOIN "Journey" j ON je.journey_id = j.id
JOIN "JourneyStep" js ON je.current_step_id = js.id
WHERE je.status = 'ACTIVE'
AND je.waiting_until < now() - interval '1 hour';
Re-process Waiting Steps
-- Mark for reprocessing (worker will pick up)
UPDATE "JourneyEnrollment"
SET waiting_until = now()
WHERE status = 'ACTIVE'
AND waiting_until < now() - interval '1 hour';
Common Issues
Customer Not Enrolling
- Check if trigger conditions match:
SELECT trigger_type, trigger_conditions
FROM "Journey" WHERE id = 'JOURNEY_ID';
- Check if customer is already enrolled:
SELECT * FROM "JourneyEnrollment"
WHERE journey_id = 'JOURNEY_ID' AND customer_id = 'CUSTOMER_ID';
- Check journey status:
SELECT status FROM "Journey" WHERE id = 'JOURNEY_ID';
-- Must be 'ACTIVE'
Messages Not Sending
- Check step configuration:
SELECT config FROM "JourneyStep" WHERE id = 'STEP_ID';
-- Should have channel and templateId
- Check enrollment step progress:
SELECT * FROM "JourneyEnrollmentStep"
WHERE enrollment_id = 'ENROLLMENT_ID'
ORDER BY started_at DESC;
- Check messaging logs for send failures
Wrong Branch Taken
Check condition evaluation:
SELECT
jes.id, jes.step_id, jes.status, jes.result,
js.type, js.config
FROM "JourneyEnrollmentStep" jes
JOIN "JourneyStep" js ON jes.step_id = js.id
WHERE jes.enrollment_id = 'ENROLLMENT_ID'
ORDER BY jes.started_at;
Manual Operations
Advance Customer to Next Step
UPDATE "JourneyEnrollment"
SET current_step_id = 'NEXT_STEP_ID'
WHERE id = 'ENROLLMENT_ID';
Exit Customer from Journey
UPDATE "JourneyEnrollment"
SET status = 'EXITED', exited_at = now()
WHERE id = 'ENROLLMENT_ID';
Force Re-enroll Customer
-- Delete existing enrollment
DELETE FROM "JourneyEnrollmentStep"
WHERE enrollment_id IN (
SELECT id FROM "JourneyEnrollment"
WHERE journey_id = 'JOURNEY_ID' AND customer_id = 'CUSTOMER_ID'
);
DELETE FROM "JourneyEnrollment"
WHERE journey_id = 'JOURNEY_ID' AND customer_id = 'CUSTOMER_ID';
-- Trigger re-enrollment via event
-- (use API or emit trigger event)
Pause a Journey
UPDATE "Journey"
SET status = 'PAUSED'
WHERE id = 'JOURNEY_ID';
Monitoring
Enrollment Funnel
SELECT
j.name,
count(CASE WHEN je.status = 'ACTIVE' THEN 1 END) as active,
count(CASE WHEN je.status = 'COMPLETED' THEN 1 END) as completed,
count(CASE WHEN je.status = 'EXITED' THEN 1 END) as exited,
count(CASE WHEN je.status = 'FAILED' THEN 1 END) as failed
FROM "Journey" j
LEFT JOIN "JourneyEnrollment" je ON j.id = je.journey_id
WHERE j.tenant_id = 'TENANT_ID'
GROUP BY j.id, j.name;
Step Performance
SELECT
js.step_order, js.type,
count(*) as executions,
avg(EXTRACT(EPOCH FROM (jes.completed_at - jes.started_at))) as avg_duration_secs
FROM "JourneyEnrollmentStep" jes
JOIN "JourneyStep" js ON jes.step_id = js.id
WHERE jes.completed_at IS NOT NULL
GROUP BY js.id, js.step_order, js.type
ORDER BY js.step_order;