n8n is the open-source workflow engine most lead-gen teams end up on once Zapier and Make bills start scaling with lead volume. It is fair-code licensed, self-hostable, and treats an HTTP request like a first-class node, which is exactly what you want when every lead needs three or four enrichment calls before it reaches the CRM.
The question we get most from LinkFinder AI users is not "how do I build the workflow" but "where should I run n8n?" This guide covers the three options we see in practice, what each one costs you in setup and maintenance, and how to connect LinkFinder AI once the instance is running.
Why self-host n8n for enrichment pipelines
n8n Cloud is a fine product, but enrichment workflows have a specific shape that pushes people toward self-hosting:
- Execution volume. A single inbound lead can trigger a LinkedIn URL lookup, an email finder, a phone lookup and a company enrichment call. Cloud plans meter executions, and lead volume is spiky. Self-hosted n8n has no per-execution cost.
- Data residency. Contact data flows through the instance. Running it on infrastructure you control makes GDPR and DPA conversations much shorter.
- Long-running batches. Enriching a 5,000-row CSV overnight is a normal job for a self-hosted worker. It is an awkward fit for a metered plan.
- Custom nodes. Community nodes, including the LinkFinder AI n8n node, install cleanly on a self-hosted instance.
The trade-off is operations. Somebody has to keep the container up, patch it, back up the database and rotate the encryption key if it leaks. The three options below sit at different points on that spectrum.
Option 1: Docker on a VPS
The classic route. You rent a small VPS, install Docker, and run n8n next to a Postgres container. A minimal docker-compose.yml:
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: change-me
POSTGRES_DB: n8n
volumes:
- postgres_data:/var/lib/postgresql/data
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
ports:
- "5678:5678"
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: change-me
N8N_ENCRYPTION_KEY: generate-a-long-random-string
N8N_HOST: n8n.yourdomain.com
WEBHOOK_URL: https://n8n.yourdomain.com/
GENERIC_TIMEZONE: Europe/Paris
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: 168
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
volumes:
postgres_data:
n8n_data:Put a reverse proxy with TLS in front of it (Caddy is the least effort) and you are done.
Good for: teams with someone who already runs servers, or workloads with strict data residency requirements.
EXECUTIONS_DATA_PRUNE from day one.Option 2: Railway
Railway is the "I want a container, not a server" option. It is what we run our own enrichment workflows on, and the whole setup is two files.
FROM n8nio/n8n:latest{
"$schema": "https://railway.app/railway.schema.json",
"build": { "builder": "DOCKERFILE" },
"deploy": {
"startCommand": "n8n start",
"restartPolicyType": "ON_FAILURE"
}
}Push that to a GitHub repo, point a Railway service at it, and n8n boots. Three things to add in the Railway dashboard before you trust it with real data:
- A volume mounted at
/home/node/.n8n. Without it, every redeploy wipes your workflows and credentials. - A Postgres service from Railway's template, with the
DB_*variables from the compose example above pointed at it. SQLite works for a demo and will hurt you in production. N8N_ENCRYPTION_KEYandWEBHOOK_URLas environment variables. Set the webhook URL to the public Railway domain so inbound webhooks (form submissions, CRM triggers) resolve correctly.
Good for: solo builders and small teams who want Git-based deploys and predictable usage-based pricing without touching a shell.
latest will eventually ship a breaking change on a Tuesday.Option 3: FlowEngine, managed n8n built for AI agents
If you want n8n hosted by people who only host n8n, look at FlowEngine. It is a managed n8n platform: you get a running instance in about thirty seconds, automatic backups, auto-deploy from GitHub for custom Docker images, and an official n8n node plus an MCP server so you can generate workflows from a text description instead of dragging nodes around.
What makes it interesting for enrichment work specifically is where the platform is heading. FlowEngine's upcoming v2 positions it as a Railway built for AI agents, and the feature list maps closely to the pain points of running lead pipelines at scale:
- Shared vaults for API keys and credentials across instances, so your LinkFinder AI key, CRM token and email provider credentials live in one place instead of being pasted into every workflow.
- Memory sandboxes for agents that need state between runs, which is what a "re-enrich this account when something changes" agent actually needs.
- Built-in rotated IPs, useful when your workflows call rate-limited or geo-sensitive endpoints.
- An AI app builder that can, for example, connect a database to n8n without you writing the glue.
- A fleet agent that monitors instances and scales them up when a batch job saturates a worker.
Good for: teams who want the control of self-hosted n8n without hiring for it, and anyone planning to run agentic workflows rather than simple linear automations.
Quick comparison
| Docker on a VPS | Railway | FlowEngine | |
|---|---|---|---|
| Time to first workflow | 1 to 2 hours | 15 minutes | Under a minute |
| Who handles upgrades | You | You | FlowEngine |
| Backups | You | You (volume snapshots) | Built in |
| Custom nodes | Yes | Yes | Yes |
| Git-based deploy | Manual | Yes | Yes |
| Agent-focused features | No | No | Yes (v2) |
| Best for | Ops-capable teams | Solo builders | Teams shipping agents |
Connecting LinkFinder AI to your instance
Once n8n is running, the enrichment step is the same on all three hosts. LinkFinder AI is a single REST endpoint, POST https://api.linkfinderai.com, and a type field in the body selects the lookup. An HTTP Request node is enough; if you would rather have Resource and Operation dropdowns, install the LinkFinder AI community node from the n8n community nodes settings page.
A minimal enrichment flow is a trigger followed by three HTTP Request nodes and a write-back:
1. Find the LinkedIn URL from a name and company (1 credit)
Store your API key as an n8n Header Auth credential rather than in the node itself, so it is encrypted at rest with your N8N_ENCRYPTION_KEY.
Method: POST
URL: https://api.linkfinderai.com
Auth: Header Auth credential
Name: Authorization
Value: Bearer YOUR_API_KEY
Body: JSON
{
"type": "lead_full_name_to_linkedin_url",
"input_data": "{{ $json.full_name }} {{ $json.company }}"
}2. Find the email from the LinkedIn URL (10 credits)
{
"type": "linkedin_profile_to_email",
"input_data": "{{ $json.linkedin_url }}"
}3. Enrich the company (1 credit)
{
"type": "company_name_to_employee_count",
"input_data": "{{ $json.company }}"
}4. Write back
Update the CRM record, append to a Google Sheet, or hand the lead to your outreach tool. The full list of type values and their credit costs is in the API documentation.
Ready-to-import templates for n8n, Make and Zapier are on the integrations page, and a code-first version of the same flow is in How to enrich leads with an API.
Which one should you pick?
- You have an ops person and strict data rules: Docker on a VPS.
- You are one person shipping fast and comfortable in a dashboard: Railway, with a volume and Postgres from day one.
- You want managed n8n and plan to run agents, not just automations: FlowEngine.
Whichever you choose, the enrichment layer is the same three HTTP calls. Get the instance stable first, then connect LinkFinder AI and let the workflow run.
Plug LinkFinder AI into your n8n instance
Free credits to start, an API on every plan, and one endpoint for LinkedIn URLs, emails, phones and company data.
Get your API keyNo credit card required • API on every plan • Cancel anytime