Skip to main content

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

  1. Check if trigger conditions match:
SELECT trigger_type, trigger_conditions
FROM "Journey" WHERE id = 'JOURNEY_ID';
  1. Check if customer is already enrolled:
SELECT * FROM "JourneyEnrollment"
WHERE journey_id = 'JOURNEY_ID' AND customer_id = 'CUSTOMER_ID';
  1. Check journey status:
SELECT status FROM "Journey" WHERE id = 'JOURNEY_ID';
-- Must be 'ACTIVE'

Messages Not Sending

  1. Check step configuration:
SELECT config FROM "JourneyStep" WHERE id = 'STEP_ID';
-- Should have channel and templateId
  1. Check enrollment step progress:
SELECT * FROM "JourneyEnrollmentStep"
WHERE enrollment_id = 'ENROLLMENT_ID'
ORDER BY started_at DESC;
  1. 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;