model, chain, tool).
The HoneyHive n8n shipper closes that gap. The shipper works only with self-hosted n8n, since it needs read access to n8n’s execution database. For n8n Cloud, see Other options.
Prerequisites
- Self-hosted n8n with PostgreSQL execution storage
- Read access to n8n’s Postgres database
- A HoneyHive project and API key from Settings > Project > API Keys
Official execution-history shipper
The HoneyHive n8n shipper is a Python sidecar created by HoneyHive. It:- Polls n8n execution storage after each run (or on a schedule)
- Reads
execution_entityjoined withexecution_data - Decodes pointer-compressed
data(flatted JSON) to recoverresultData.runData - Maps n8n node runs to HoneyHive event types (
model,chain,tool,session) - Exports HoneyHive-compatible OTLP spans to
POST /opentelemetry/v1/traces
Install
Clone the shipper and run it from source:Configure
Set the required environment variables:HONEYHIVE_API_URL is your HoneyHive data plane API base URL: the host shown in your HoneyHive dashboard or API settings (for example https://api.dp1.us.honeyhive.ai or https://api.dp1.us.prod.honeyhive.ai). The shipper appends /opentelemetry/v1/traces automatically.
You can also omit PG_DSN and use n8n-style Postgres variables:
| Variable | Default | Purpose |
|---|---|---|
DRY_RUN | true | Map executions without exporting to HoneyHive |
CHECKPOINT_FILE | .shipper_checkpoint | Stores the last processed execution ID |
FILTER_AI_ONLY | false | Export AI-related spans plus required context |
FILTER_WORKFLOW_IDS | none | Comma-separated workflow ID allowlist |
TRUNCATE_FIELD_LEN | 0 | Truncate large input/output strings (0 disables truncation) |
OTEL_EXPORTER_OTLP_ENDPOINT | derived from HONEYHIVE_API_URL | Full OTLP traces URL override |
Run
The--dry-run and --no-dry-run flags override the DRY_RUN environment variable for a single invocation.
Start with a dry run:
CHECKPOINT_FILE after successful non-dry-run exports, so later runs resume from the last processed execution ID.
Where n8n stores runData
On self-hosted n8n, finished executions are persisted in the database:
| Table | Key columns | Contents |
|---|---|---|
execution_entity | id, workflowId, status, startedAt, stoppedAt, mode | Execution metadata |
execution_data | executionId, workflowData, data | Static workflow snapshot plus runtime payload |
data column holds resultData.runData: a map of node name to execution runs, each with startTime, executionTime, executionStatus, and per-item JSON under data.main. The data value may be flatted (pointer-compressed JSON), while workflowData is usually plain JSON.
Operational notes
| Concern | Detail |
|---|---|
| Latency | Near-real-time poll (seconds) or backfill batch; not inline with workflow execution |
| Re-export | A checkpoint file tracks processed executions, so incremental runs export each one once. Keep the checkpoint on durable storage: if it is lost or the shipper crashes before writing it, executions are re-exported and currently create duplicate spans. |
| Queue mode | Workers write to the same execution tables; run the shipper after executions are persisted |
Example workflow: support ticket triage
A multi-step workflow that classifies an incoming support ticket and routes it. Classify Urgency and Sentiment and Draft Customer Response are OpenAI nodes, so they map tomodel events with gen_ai.* fields; the order lookup and routing steps are static Set and Code nodes that map to chain events. Any other LangChain LLM node (for example Anthropic) maps the same way.
The shipper exports the whole run from execution history, so no HTTP Request nodes are added after each step.
Verify in HoneyHive
Run the workflow
Execute the workflow from the n8n UI or workflow execute API. Confirm the execution is stored in n8n’s Postgres database, then run the shipper with
--no-dry-run.Check shipper-exported spans
In Traces, search for the workflow name or a node name from the execution. Shipper spans include 
service.name = n8n-honeyhive-shipper and n8n metadata such as honeyhive.session_id, n8n.metadata.n8n.execution.id, and n8n.workflow.id. Node spans are mapped to HoneyHive event types and include input/output values plus gen_ai.* fields when available.
Troubleshooting
| Symptom | Fix |
|---|---|
| No shipper-exported spans in HoneyHive | Confirm HONEYHIVE_API_KEY, HONEYHIVE_API_URL, and PG_DSN point to the expected HoneyHive project and n8n database. Run a dry run first, then export with --no-dry-run. |
| Shipper missing executions | Confirm the shipper points at the same Postgres DSN as the n8n instance that ran the workflow. Check DB_TABLE_PREFIX (empty for unprefixed tables such as execution_entity; n8n_ only if your tables are prefixed), workflow filters, and .shipper_checkpoint. |
| Flatted parse errors | execution_data.data is often pointer-compressed. Use a flatted decoder, not plain JSON.parse. |
Other options
- n8n Cloud: The shipper requires database access, so it does not work with n8n Cloud. For Cloud workflows, log a small number of summary events with the HoneyHive Events API, or instrument the application that triggers n8n.
Related
Tracing via API
Full REST logging guide for sessions, model events, and batches
TrueFoundry Integration
Automatic OTLP trace export from an AI gateway
Tracing Introduction
Sessions, event types, and trace hierarchy
Enrich Your Traces
Add metadata, user properties, and feedback

