n8n Workflow
Controller
Control, monitor and command your n8n automation infrastructure directly from physical buttons. Zero latency, self-hosted, real bidirectional control.
Setup in 5 minutes
Follow these steps once after installing the plugin from the Elgato Marketplace.
Install the plugin
Download and install n8n Workflow Controller from the Elgato Marketplace. Restart the Stream Deck app if prompted.
Create an n8n API Key
In your n8n instance, go to Settings → API → Create API Key. Copy the key — you'll need it in the next step. Keep it safe: it grants full access to your n8n instance.
Configure Global Settings
Drag the n8n Settings action onto any button. Click the button to open the Property
Inspector. Enter your Base URL (e.g. https://your-n8n.example.com) and
API Key. Click Test Connection — it should turn green.
Add your first action
Drag Trigger Workflow onto a button. In the Property Inspector, paste the webhook URL of an n8n workflow. Press the physical button — the workflow fires.
Explore the other actions
All actions share the Global Settings you entered in step 3. You never need to re-enter the API key per-button.
Global Settings
Entered once, used by every action. Stored securely on your local machine — never exported in profiles.
Base URL
The root URL of your n8n instance. No trailing slash.
http://localhost:5678
API Key
From n8n → Settings → API. Stored encrypted, never visible in profile exports.
Internal Email / Password
Pro Required only for live execution monitoring via the internal REST API. Optional.
Default Poll Interval
Fallback polling speed for monitoring actions if no per-action interval is set.
Trigger Workflow
Sends an HTTP POST (or GET) request to any n8n webhook URL. The simplest and most versatile action: one press, one workflow execution. No API key required — webhooks are public by default.
| Field | Description |
|---|---|
| Webhook URL | The full webhook URL from your n8n workflow. Supports both production and test webhook URLs. |
| Method | POST (default) or GET. Use GET only if your webhook node is configured
to accept GET requests. |
| Button label | Text displayed on the key. Leave empty to show no label. |
| Custom body | Optional JSON body sent with POST requests. Useful for passing parameters to the workflow. |
| Timeout (s) | How long to wait for a response before showing an alert. Default: 10 seconds. |
https://n8n.example.com/webhook/deploy-productionMethod:
POSTCustom body:
{"branch": "main", "env": "prod"}Label:
Deploy
Toggle Workflow On/Off
Shows the real-time active/inactive state of a workflow directly on the button. Press once to toggle. Perfect for scheduled workflows, scrapers, or any automation you want to pause and resume quickly.
| Field | Description |
|---|---|
| Workflow | Select from the dropdown list of your n8n workflows. Loaded automatically from your instance. |
| Button label | Auto-filled from the workflow name. You can override with a custom label. |
| Poll interval | How often to refresh the status from n8n (5s to 5min). Lower = more accurate, more API calls. |
Stop Execution
Stops a running n8n execution immediately. The button polls every 15 seconds and shows a red indicator when an execution is in progress. By default requires a long press to prevent accidental stops.
| Field | Description |
|---|---|
| Workflow | Target a specific workflow, or leave empty to stop any active execution on your instance. |
| Button label | Text on the key. Default: Stop. |
| Confirm (hold) | When enabled (recommended), a long press is required to execute the stop. Short press shows "Hold to stop" for 2 seconds. |
Execution Counter
Shows the number of executions for a workflow (or all workflows) today or this week. Updates automatically on each poll cycle.
| Field | Description |
|---|---|
| Workflow | Select a specific workflow, or choose "Count all workflows" to count across your entire instance. |
| Button label | Auto-filled from workflow name. Displayed above the count number. |
| Poll interval | Refresh frequency. 30s is a good default for most uses. |
Status Monitor
Cycles automatically between three views: last execution result and timestamp, today's execution count, and a live active/inactive indicator. A single button that tells you everything about a workflow.
| Field | Description |
|---|---|
| Workflow | The workflow to monitor. Select from the dropdown. |
| Button label | Auto-filled from workflow name. |
| Poll interval | How often to fetch fresh data from n8n. |
Instance Health
Pings the n8n health endpoint and shows whether your instance is up, degraded, or offline. On Stream Deck + shows Prometheus metrics on the LCD strip if available.
Add Node
Sends a keyboard shortcut sequence to n8n to open the node picker and instantly insert a node. The node name is pasted via clipboard — it appears all at once, not typed character by character. n8n must be the active window when you press the button.
| Node | Category |
|---|---|
| HTTP Request | Core |
| Webhook | Core |
| Respond To Webhook | Core |
| Merge | Data |
| Aggregate | Data |
| Sort | Data |
| Limit | Data |
| Remove Duplicates | Data |
| Split Out | Data |
| Summarize | Data |
| Item Lists | Data |
| Compare Datasets | Data |
| Convert To File | Files |
| Extract From File | Files |
| Readwrite Files From Disk | Files |
| HTML | Transform |
| Markdown | Transform |
| AI Transform | AI |
| Git | Dev Tools |
| n8n | n8n |
| n8n Form | n8n |
| n8n Form Trigger | n8n |
| n8n Trigger | n8n |
| MCP Server Trigger | AI |
| Microsoft Agent 365 Trigger | AI |
The Pro version includes 200+ additional nodes with custom icons (Slack, Gmail, Notion, OpenAI, Google Sheets, Postgres, and many more).
| Field | Description |
|---|---|
| Node picker already open | If enabled, skips the N keystroke. Use when you clicked the + button
on an existing node — the picker is already open. |
+), enable the Node picker already
open flag above.Canvas Shortcut
Executes a keyboard shortcut in the n8n canvas: save, undo, run workflow, zoom to fit, and more. Requires n8n to be the active window.
| Action | Shortcut sent |
|---|---|
| Save | Ctrl+S |
| Undo | Ctrl+Z |
| Redo | Ctrl+Shift+Z |
| Run workflow | Ctrl+Enter |
| Zoom to fit | Ctrl+Shift+H |
| Select all | Ctrl+A |
Workflow Browser
Designed for the Stream Deck + dial. Rotate to scroll through your workflow list on the LCD strip, push to trigger or toggle the selected workflow. The most ergonomic way to manage many workflows.
Quick Retry
Finds the most recent failed execution for a workflow and retries it with one button press. Saves you from navigating to n8n, finding the execution, and clicking retry manually.
| Field | Description |
|---|---|
| Workflow | The workflow to check for failed executions. |
| Button label | Default: Retry. |
Variable Injector
Like Trigger Workflow, but lets you configure a set of key-value pairs that are injected into the webhook body. Useful for workflows that behave differently based on parameters.
https://n8n.example.com/webhook/deployVariables:
env=staging, branch=developBody sent:
{"env": "staging", "branch": "develop"}
Data Table Monitor
Reads rows from an n8n Data Table via a webhook bridge workflow and displays an aggregated value on the button with configurable color thresholds. Shows the last known value if the connection drops.
- Download the bridge template: data-table-bridge.json (or click Download Bridge Template in the Property Inspector)
- In n8n, go to Workflows → Import from File and select the downloaded JSON file
- Open the imported workflow. In the "Get Table Rows" node, set Data table to
={{ $json.query.table }}and select By Name - Activate the workflow (toggle ON) and copy the Production webhook URL from the Webhook node
- Back in Stream Deck, paste the webhook URL in the Webhook URL field of the Property Inspector
| Field | Description |
|---|---|
| Webhook URL | Production webhook URL from the bridge workflow. |
| Table name | The n8n Data Table name. Sent to the webhook as ?table= parameter and shown on the
key. |
| Column | The column to aggregate. |
| Mode | Auto-detect (sum if numeric, count if string), Sum, Count rows, or First value. |
| Display format | Template for the displayed value. Use {{value}} as placeholder. Example:
{{value}} leads |
| Warning if ≥ | Value threshold for yellow badge. Leave empty to disable. |
| Error if ≥ | Value threshold for red badge. Leave empty to disable. |
| Poll interval | How often to refresh. Default: 30 seconds. |
leads · Column: count · Mode: Count rowsFormat:
{{value}} leads · Warning: 50 · Error: 100Result on key:
47 leads (green) → 73 leads (yellow) →
112 leads (red)
JSON Display
The most versatile monitoring action. Calls any URL that returns JSON, extracts a value using dot-notation path, and displays it on the key with color thresholds. Use it to monitor CPU, API quotas, prices, container counts — anything expressible as a number.
| Field | Description |
|---|---|
| Data source | Webhook URL: calls a URL directly. Workflow run: executes an n8n workflow and reads the output. |
| Webhook URL | Any URL returning JSON. Must be accessible from your machine. Used when Data source = Webhook URL. |
| Workflow ID | ID of the n8n workflow to execute. Used when Data source = Workflow run. |
| JSON path | Dot-notation path to the value. Supports array indexing. Examples below. |
| Display format | Template using {{value}}. Example: {{value}}% or
{{value}} ms |
| Button label | Top label (e.g. "CPU", "API quota", "Latency"). |
| Warning if ≥ | Threshold for 🟡 indicator. |
| Error if ≥ | Threshold for 🔴 indicator. |
| Poll interval | Refresh frequency. |
| JSON response | Path | Extracted value |
|---|---|---|
{"cpu": 73} |
cpu |
73 |
{"data": {"metrics": {"cpu": 73}}} |
data.metrics.cpu |
73 |
{"results": [{"count": 42}]} |
results[0].count |
42 |
{"status": "ok"} |
status |
ok |
https://myserver.example.com/metricsJSON path:
data.cpu · Format: {{value}}%Warning:
70 · Error: 90 · Label: CPU
AI Agent Status
Press the button to send a request to an AI agent workflow. The LCD strip shows "Thinking…" while the workflow runs, then displays the first 80 characters of the response. Press again to cancel and restart.
| Field | Description |
|---|---|
| Webhook URL | The webhook URL of your n8n AI agent workflow. |
| Button label | Displayed on the key. Default: AI Agent. |
| Show streaming | When enabled, the LCD updates as soon as the response arrives. |
| Max chars | How many characters of the response to show on the LCD strip. Default: 80. |
output,
response, text, or message. The action picks the first one it
finds.Parameter Prompt
When pressed, opens a small form in your browser to collect parameters at runtime. After you fill in the form and click Submit, the values are sent to the configured webhook. Useful for workflows that need a dynamic input each time (branch name, recipient, message text, etc.).
| Field | Description |
|---|---|
| Webhook URL | Where to send the collected parameters. |
| Prompt title | Title shown on the input form. Default: Parameters. |
| Fields | Up to 3 configurable input fields. Each field has: key (sent in JSON body), label (shown in form), type (text or select), and optional default value. |
Add Custom Node
Like Add Node, but lets you type any node name to search for — not limited to the pre-mapped nodes. Configure the node name in the Property Inspector once, then press to insert it instantly. The name is pasted via clipboard — it appears all at once, not typed character by character.
| Field | Description |
|---|---|
| Node name | The name to search for in the n8n node picker (e.g. Airtable, OpenAI,
Supabase). |
| Node picker already open | If enabled, skips the N keystroke. Use when you clicked the + button
on an existing node — the picker is already open. |
| Button label | Label on the key. Default: the node name. |
+), enable the Node picker already
open flag above.+ button on an existing node
→ picker opens → enable Node picker already open in the PI → press the button →
Airtable appears instantly and is selected.Workflow Templates
Ready-to-import n8n workflows included with the plugin. Import via n8n → File → Import from file.
Schedule Trigger → Execute Command (rsync/backup) → IF success → Slack notification. Configure source path, destination, and Slack channel.
Webhook trigger → Set (format message) → Slack. Send
{"message": "...", "channel": "#general"} from any Trigger Workflow button.
Webhook trigger → Execute Command (git pull + npm build + pm2 restart) → HTTP Request to report status. The classic "deploy button" on your Stream Deck.
Webhook trigger → Switch (by platform) → Twitter / LinkedIn / Telegram nodes. Send
{"text": "...", "platform": "twitter"}.
Troubleshooting
Common issues and how to fix them.
%APPDATA%\Elgato\StreamDeck\Plugins\. If you installed via CLI
link, verify the symlink is there.1. Base URL has no trailing slash — correct:
https://n8n.example.com2. n8n is reachable from your machine (open the URL in a browser)
3. API Key is correct — generate a new one in n8n → Settings → API if unsure
4. Your n8n instance version supports the
/api/v1 endpoint (requires n8n v0.188+)
1. The webhook URL is correct and the workflow is active in n8n
2. The workflow has a Webhook node (not a Schedule or other trigger)
3. Your machine can reach the n8n host
4. Try increasing the timeout setting in the Property Inspector
status=waiting for
in-progress executions. If your execution is very short-lived, it may complete before the next 15-second
poll. For live execution status, consider upgrading to Pro which includes Internal REST API support.Common mistakes:
• Path starts with the wrong key: response is
{"data": {"value": 42}} but path is just
value — should be data.value• Array index missing:
results.count instead of results[0].count