The problem with "just use n8n"
n8n is excellent for integrating SaaS tools. It becomes fragile when you try to use it as an agent orchestrator: long-running loops, conditional retries, and LLM calls that can fail in non-obvious ways.
Separating orchestration from integration
The pattern that works: n8n handles triggers and integrations; LangGraph handles agent logic.
An n8n workflow watches a Slack channel. When a message matches a pattern, it calls a LangGraph endpoint with the raw payload. LangGraph runs the multi-step reasoning loop, maintains state, and returns a structured result. n8n takes that result and routes it: posts to Jira, sends an email, updates a database row.
Making agents auditable
Every LangGraph state transition should emit an event to a structured log. We use a Postgres table with columns: run_id, step, input, output, timestamp. This table becomes the audit trail that compliance teams and on-call engineers both need.
Add a human_in_the_loop node for any action that cannot be undone: deleting records, sending external emails, approving payments. The node pauses execution and posts to Slack; a human approves or rejects; execution resumes.
Handling failures gracefully
LLM calls fail. Build retry with exponential backoff into every LangGraph node that calls an LLM. Set a hard limit of 3 retries, then route to a dead-letter state that pages the on-call engineer. Never silently swallow errors in agentic pipelines. A swallowed error is an invisible outage.