🚀 Latest Edition
📖 Beginner to Advanced
⏱️ 40 min read
🎯 20+ Sections
⏱️ Estimated reading time: 35-45 minutes
📋 Quick Summary: n8n is a powerful open-source workflow automation tool that connects apps, APIs, and services without writing code — but with the flexibility to add code when you need it. This course covers everything from your first workflow to deploying n8n in production with error handling, webhooks, AI integration, and more.
Imagine connecting 400+ apps, building complex automations that replace entire teams, and having full control over your data — all without paying per-operation fees like Zapier. That’s n8n. Fair-code, self-hostable, infinitely extensible. This course will make you an n8n automation expert.
Table of Contents
- What is n8n? Why Use It?
- Common Myths Debunked
- Installing n8n (3 Methods)
- n8n Basics: Nodes, Workflows, Connections
- Essential Nodes Deep Dive
- Working with Data: Items, JSON, Expressions
- Webhooks & Triggers
- Error Handling & Workflow Resilience
- AI & LLM Integration
- Common Mistakes & How to Avoid Them
- Real-World Project: Automated Email Reporter
- Test Your Knowledge
- Frequently Asked Questions (FAQ)
- Glossary
- 10 Pro Tips Learned the Hard Way
- 7-Day Learning Roadmap
- Troubleshooting Guide
- TL;DR: If You Learn Nothing Else
- Final Thoughts
1. What is n8n? Why Use It?
n8n (pronounced “n-eight-n”) is a fair-code workflow automation platform. Think Zapier but self-hosted, more powerful, and zero per-operation costs.
Why n8n Over Zapier/Make?
| Feature | n8n | Zapier |
|---|---|---|
| Pricing | 🆓 Free (self-hosted) | 💰 Starts $19.99/mo |
| Data control | ✅ Full (your server) | ❌ On their servers |
| Custom code | ✅ JavaScript/Python inline | ❌ Limited |
| Integrations | 400+ (community expanding) | 7000+ |
| AI/LLM | ✅ Native OpenAI/LLM nodes | ❌ Limited |
| Self-host | ✅ One docker command | ❌ Not possible |
Who Uses n8n?
- Developers: Automate CI/CD, DevOps alerts, code reviews
- Marketers: Automate email campaigns, social media, lead capture
- Operations: Invoice processing, onboarding flows, approval chains
- Data teams: ETL pipelines, database sync, report generation
- Startups: Replace 5 SaaS subscriptions with one self-hosted instance
2. Common Myths Debunked
| ❌ Myth | ✅ Reality |
|---|---|
| “n8n is just for developers” | The visual editor makes it usable by anyone. You can build 90% of workflows without code. |
| “Self-hosting is hard” | It’s one Docker command. Or use n8n.cloud for managed hosting. |
| “It can’t handle complex logic” | IF nodes, Switch nodes, Code nodes, Loops — it handles enterprise-grade complexity. |
| “No community support” | 15,000+ GitHub stars, active Discord, 400+ community nodes. |
3. Installing n8n (3 Methods)
Method 1: Docker (Recommended for Production)
# Quick start with SQLite docker run -d --name n8n \ -p 5678:5678 \ -v n8n_data:/home/node/.n8n \ n8nio/n8n # With PostgreSQL (production) docker run -d --name n8n \ -p 5678:5678 \ -v n8n_data:/home/node/.n8n \ -e DB_TYPE=postgresdb \ -e DB_POSTGRESDB_HOST=postgres \ -e DB_POSTGRESDB_DATABASE=n8n \ -e DB_POSTGRESDB_USER=n8n \ -e DB_POSTGRESDB_PASSWORD=secret \ -e N8N_ENCRYPTION_KEY=your-32-char-key \ n8nio/n8n
Method 2: Docker Compose (Full Stack)
version: "3.8"
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=secret
- N8N_ENCRYPTION_KEY=your-encryption-key-here
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
restart: unless-stopped
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
n8n_data:
postgres_data:
Method 3: npx (Quick Dev)
npx n8n # Or install globally npm install n8n -g n8n start # Opens at http://localhost:5678
Access n8n
# Open in browser http://localhost:5678 # Create your account (first-run setup) # Email, password, optional MFA
4. n8n Basics: Nodes, Workflows, Connections
Core Concepts
- Workflow: A series of connected nodes that perform an automation
- Node: A single step in a workflow (trigger, action, logic)
- Connection: The link between nodes — data flows from one to the next
- Item: A single record/data object flowing through the workflow
- Execution: A single run of a workflow
Node Types
- Trigger Nodes: Start a workflow (webhook, schedule, app event)
- Action Nodes: Do something (send email, create record, call API)
- Flow Nodes: Control logic (IF, Switch, Loop, Merge, Split)
- Transform Nodes: Modify data (Code, Set, Remove Duplicates)
- AI Nodes: LLM integration (OpenAI, Anthropic, LangChain)
Your First Workflow
1. Click "New Workflow"
2. Add a "Manual Trigger" node (blue circle with hand icon)
3. Add a "Set" node → Set a value like {"message": "Hello n8n!"}
4. Add a "NoOp" node (does nothing — good for testing data flow)
5. Connect: Trigger → Set → NoOp
6. Click "Execute Workflow" (blue button at top)
7. Click on each node to see the data flowing through
5. Essential Nodes Deep Dive
HTTP Request Node (Most Powerful)
// Call any REST API
// Configuration:
Method: GET / POST / PUT / PATCH / DELETE
URL: https://api.example.com/endpoint
Authentication: None / Basic Auth / Header Auth / OAuth2
Headers: {"Content-Type": "application/json"}
Body (JSON): { "field": "value" }
// Get JSON placeholder data:
URL: https://jsonplaceholder.typicode.com/posts
Method: GET
→ Response includes 100 posts you can process
IF Node (Conditional Logic)
// Branch workflow based on conditions // Example: Route high-priority vs normal tasks Conditions: "priority" Equals "high" → Route to urgent handler Else → Route to normal queue // Multiple conditions: "temperature" Greater Than 30 → Send alert "temperature" Between 10 and 30 → Log only "temperature" Less Than 10 → Send freeze warning
Code Node (JavaScript/Python)
// Transform data with custom code
// JavaScript example:
const items = $input.all();
return items.map(item => ({
json: {
fullName: item.json.firstName + " " + item.json.lastName,
email: item.json.email.toLowerCase(),
createdAt: new Date().toISOString()
}
}));
// Python example (if configured):
import datetime
items = Input.items
for item in items:
item['json']['processed_at'] = str(datetime.datetime.now())
return items
Schedule Trigger (Cron)
// Run workflows on schedule // Options: Every Hour Every Day at 9 AM Every Monday Custom Cron: */15 * * * * (every 15 minutes) Custom Cron: 0 9 * * 1-5 (weekdays at 9 AM) Custom Cron: 0 0 1 * * (first day of every month)
Email Node (IMAP/SMTP)
// Read emails (Trigger)
IMAP: mail.example.com:993
Username: user@example.com
Password: ********
Search: UNSEEN (unread emails)
→ Triggers workflow for each new email
// Send emails (Action)
SMTP: smtp.example.com:587
To: {{ $json.to }}
Subject: "Your order #{{ $json.orderId }} confirmed"
Body (HTML): Thank you!
Your order has been processed.
6. Working with Data: Items, JSON, Expressions
Understanding Expressions
Expressions in n8n use double curly braces {{ }} to reference data from previous nodes:
// Basic expressions
{{ $json.name }} // Get "name" field from current item
{{ $json.email }} // Get email field
// From specific node
{{ $node["API Call"].json.id }} // Get id from node named "API Call"
{{ $node["Webhook"].json.body }} // Get full body from webhook
// Parameter node (latest)
{{ $("HTTP Request").item.json.result }}
// Functions in expressions
{{ $json.name.toUpperCase() }}
{{ $json.price * 1.18 }} // Add 18% tax
{{ $json.date.substring(0, 10) }}
{{ JSON.stringify($json) }}
// Date functions
{{ DateTime.now() }} // Current time
{{ DateTime.now().plus({days: 7}) }} // 7 days from now
{{ DateTime.fromFormat($json.date, "yyyy-MM-dd") }}
// Utility functions
{{ $items().length }} // Total items
{{ $items(0).json.name }} // First item's name
{{ $jmespath($json, "users[?age > `18`].name") }} // JMESPath query
Data Transformation Patterns
// Item Lists — n8n works with arrays of items
// Each item = { "json": { ... } }
// Example incoming data:
[
{ "json": { "name": "Alice", "score": 85 } },
{ "json": { "name": "Bob", "score": 92 } },
{ "json": { "name": "Charlie", "score": 78 } }
]
// Use "Aggregate" node → combine items into one
// Use "Split" node → split items into individual streams
// Use "Remove Duplicates" → deduplicate by field
7. Webhooks & Triggers
Webhook Node (Receive Data)
// Create a public endpoint for external apps to call
// Example: Receive data from a form, GitHub, Stripe, etc.
// Configuration:
HTTP Method: POST
Path: my-webhook → URL: https://your-n8n.com/webhook/my-webhook
Response: "Received successfully"
// Test with curl:
curl -X POST https://your-n8n.com/webhook/my-webhook \
-H "Content-Type: application/json" \
-d '{"name":"John","email":"john@example.com"}'
// Access received data:
{{ $json.name }}
{{ $json.email }}
// Webhook Response node (to send response back)
// Can return JSON, text, or redirect
Stripe Trigger
// Trigger when a Stripe event happens // Supports: payment_intent.succeeded, checkout.session.completed, etc. // Example: Send email when payment succeeds: 1. Stripe Trigger (event: checkout.session.completed) 2. Get customer email from Stripe 3. Send thank-you email via SMTP 4. Update database with order info
GitHub Trigger
// React to GitHub events // Supports: push, pull_request, issues, stars, etc. // Example: Auto-label issues: 1. GitHub Trigger (event: issues.opened) 2. IF node: check if issue contains "bug" 3. IF true → GitHub node: Add "bug" label 4. Send Slack notification to team
8. Error Handling & Workflow Resilience
Error Workflows
// Every workflow can have an Error workflow
// When a node fails → Error workflow runs
// Settings → Error Workflow:
ERROR_WORKFLOW_ID: "your-error-handler-id"
// Error workflow receives:
{{ $json.error.message }}
{{ $json.workflow.id }}
{{ $json.workflow.name }}
{{ $json.node.name }}
// Example: Send Slack alert on failure
1. Trigger: Error workflow
2. Format Slack message with error details
3. Post to #alerts Slack channel
Retry Logic
// Nodes can retry on failure // Settings per node: Retry on fail: ✅ Max retries: 3 Wait between: 1 second Backoff: exponential // Timeout settings: Timeout: 30 seconds (per node call)
Data Fallback Patterns
// Use expressions with fallback defaults:
{{ $json.email || "no-email@example.com" }}
{{ $json.price || 0 }}
{{ $json.name || "Unknown" }}
{{ $json.date || DateTime.now().toFormat("yyyy-MM-dd") }}
9. AI & LLM Integration
OpenAI Node
// Credentials: OpenAI API key
// Models: gpt-4o, gpt-4o-mini, o3-mini, etc.
// ChatGPT node:
Prompt: "Summarize this email: {{ $json.body }}"
Model: gpt-4o-mini (fast, cheap)
Temperature: 0.3 (more factual)
// Image Analysis node:
Image URL: {{ $json.imageUrl }}
Question: "What products are in this image?"
// Text Completion (legacy):
Model: text-davinci-003
Prompt: "Write a professional reply to:\n{{ $json.emailBody }}"
Practical AI Workflows
// 1. Email Classification Email → OpenAI (classify: support/billing/sales) → Route to team // 2. Content Translation Webhook receives text → OpenAI (translate to Spanish) → Post to CMS // 3. Sentiment Analysis Customer feedback → OpenAI (positive/negative/neutral) → Log to spreadsheet // 4. Smart Reply Generator Support ticket → OpenAI (generate 3 draft replies) → Present for review // 5. Data Extraction PDF invoice → OpenAI (extract: amount, date, vendor) → Save to database
Anthropic Claude Node
// Credentials: Anthropic API key
// Models: claude-3-opus, claude-3-sonnet, claude-3-haiku
Prompt: "Analyze this customer sentiment:\n{{ $json.text }}"
Model: claude-3-haiku (fastest, cheapest)
Max tokens: 1000
10. Common Mistakes & How to Avoid Them
🔴 Mistake #1: Not Using Error Workflows
What happens: Workflow silently fails, you never know.
How to fix: Always set up an Error Workflow that sends a Slack/email alert.
🔴 Mistake #2: Infinite Loops
What happens: Workflow triggers itself repeatedly, runs thousands of executions.
How to fix: Add a “Remove Duplicates” node or set a “Max Executions” limit in settings.
🔴 Mistake #3: Not Using Expressions Correctly
What happens: {{ $json.name }} returns [Object Object] or undefined.
How to fix: Use {{ JSON.stringify($json) }} to debug data shape first.
🔴 Mistake #4: Ignoring Rate Limits
What happens: API starts returning 429 errors.
How to fix: Add “Wait” node between API calls. Use batch processing.
🔴 Mistake #5: No Data Backups
What happens: Server crash = all workflows gone.
How to fix: Use n8n’s export feature or back up the ~/.n8n directory daily.
🔴 Mistake #6: Exposing Sensitive Data in Logs
What happens: API keys, passwords visible in execution history.
How to fix: Mark sensitive fields as “HIDDEN” in n8n credentials manager.
11. Real-World Project: Automated Daily Email Reporter
Let’s build a real automation: fetch data from an API, process it, generate a report, and email it daily.
Step 1: Schedule Trigger
Node: Schedule Trigger Setting: Every day at 9:00 AM Time: "09:00" Timezone: Asia/Kolkata
Step 2: Fetch Data
Node: HTTP Request
Method: GET
URL: https://api.example.com/metrics
Authentication: Header Auth
Header Name: Authorization
Header Value: Bearer {{ $credentials.apiKey }}
→ Response: array of daily metrics
Step 3: Process & Summarize
Node: Code (JavaScript)
// Calculate totals & averages
const items = $input.all();
const total = items.reduce((sum, item) => sum + (item.json.revenue || 0), 0);
const avg = total / items.length;
const best = Math.max(...items.map(i => i.json.revenue || 0));
return [{
json: {
totalRevenue: total,
avgRevenue: avg.toFixed(2),
bestPerformance: best,
reportDate: new Date().toISOString().split('T')[0],
itemCount: items.length
}
}];
Step 4: Generate HTML Email
Node: Set (JSON → String)
HTML Template:
<h1>Daily Report - {{ $json.reportDate }}</h1>
<table border="1" cellpadding="8">
<tr><td>Total Revenue</td><td>${{ $json.totalRevenue }}</td></tr>
<tr><td>Average Revenue</td><td>${{ $json.avgRevenue }}</td></tr>
<tr><td>Best Performance</td><td>${{ $json.bestPerformance }}</td></tr>
<tr><td>Items Processed</td><td>{{ $json.itemCount }}</td></tr>
</table>
Step 5: Send Email
Node: Email (SMTP)
To: team@example.com
Subject: 📊 Daily Report - {{ $json.reportDate }}
Body (HTML): {{ $json.html }}
→ Workflow is complete! Every day at 9 AM, the report is auto-generated and emailed.
12. 🧠 Test Your Knowledge
- What does the expression
{{ $json.name }}do?
A) Gets the “name” from the current item’s JSON data
B) Creates a new field called “name”
C) Deletes the “name” field
D) Renames the field to “name”
Answer: A - Which node would you use to run a workflow every Monday at 9 AM?
A) Webhook Node
B) Schedule Trigger (Cron)
C) Manual Trigger
D) IMAP Email Trigger
Answer: B - What does an Error Workflow do?
A) Deletes the failed workflow
B) Runs when another workflow fails (for alerts/fallbacks)
C) Fixes the error automatically
D) Logs the error to a file
Answer: B - How do you reference data from a node named “API Call”?
A){{ $node["API Call"].json }}
B){{ $json.api_call }}
C){{ $input.apiCall }}
D){{ $("API").Call.json }}
Answer: A - Which node splits a workflow into multiple branches?
A) Merge Node
B) Switch Node
C) Code Node
D) Set Node
Answer: B
13. 📖 Frequently Asked Questions (FAQ)
Q1: Is n8n completely free?
n8n is fair-code — you can self-host it for free (no limits on workflows, executions, or users). n8n.cloud (managed hosting) and n8n Enterprise have paid plans. Self-hosted is 100% free forever.
Q2: Can non-developers use n8n?
Yes! The visual drag-and-drop builder makes it accessible. Most common automations (email → Slack, form → spreadsheet, webhook → database) require zero coding. For complex logic, you can add Code nodes.
Q3: How is n8n different from Zapier?
n8n is self-hosted (your data stays on your server), has no per-operation fees, supports custom code inline, has native AI/LLM nodes, and gives you full control over the infrastructure. Zapier has more integrations (7000+) but costs more and owns your data.
Q4: What hosting specs do I need?
Minimum: 1GB RAM, 1 CPU, 10GB storage (Raspberry Pi 4 works!). Recommended: 2GB RAM, 2 CPU (for running multiple workflows). Works great on a $5/mo VPS.
Q5: Can n8n integrate with my custom API?
Absolutely. Use the HTTP Request node to call any REST or GraphQL API. You can also build custom community nodes if you need a reusable integration.
Q6: Is n8n secure for production?
Yes. It supports encryption keys, credential vaulting, MFA, audit logs, and RBAC (Enterprise). The encryption key ensures your API keys are safe even if the database is compromised.
Q7: Can I run workflows on demand AND on schedule?
Yes. Workflows can have multiple triggers. For example, a workflow can run: on a schedule (daily report), via webhook (on-demand trigger), and manually from the n8n UI.
Q8: How do I handle API rate limits?
Use the Wait node between API calls, batch your requests with the Split node, and set retry-on-fail on your HTTP Request nodes. n8n also supports throttling at the node level.
Q9: Does n8n support webhooks?
Yes. The Webhook node creates public HTTPS endpoints that any app can POST data to. Perfect for Stripe, GitHub, Typeform, Shopify, and custom webhook integrations.
Q10: Can I use n8n with AI/LLMs?
Yes! n8n has native nodes for OpenAI (GPT-4o, GPT-4o-mini), Anthropic Claude, Hugging Face, and a generic LLM node. You can build AI-powered workflows: email classification, content generation, sentiment analysis, image recognition, and more.
14. 📚 Glossary: Key Terms Explained
| Term | Definition |
|---|---|
| n8n | Fair-code workflow automation platform. Connects apps, APIs, and services. |
| Node | A single step in a workflow (trigger, action, logic, transform). |
| Workflow | A connected series of nodes that perform an automated process. |
| Item | A single JSON object flowing through the workflow (like a row of data). |
| Expression | Dynamic value using {{ }} syntax to reference data from previous nodes. |
| Trigger | A node that starts a workflow (schedule, webhook, app event). |
| Webhook | An HTTP endpoint that receives data from external services. |
| Execution | A single run of a workflow from start to finish. |
| Credentials | Encrypted API keys, passwords, and tokens for external services. |
| Error Workflow | A separate workflow that runs when the main workflow fails (for alerts). |
| Fair-code | Source available with restrictions on commercial re-hosting. Free for self-use. |
| Sub-workflow | A workflow called by another workflow (reusable module). |
| Webhook Response | Data sent back to the webhook caller after processing. |
| LLM | Large Language Model (AI) — like GPT-4, Claude — integrated via n8n AI nodes. |
15. 🏆 10 Pro Tips Learned the Hard Way
- Always add a Wait node before API-heavy operations. Many APIs have rate limits and will 429 you. A ${“$”}{“{“}randomInt(1,5)}{“}”} second wait saves headaches.
- Use the expression editor’s “Test” button. Before using an expression in a node, test it in the expression editor. Saves hours of debugging.
- Name your nodes descriptively. “Get Orders from Shopify” is better than “HTTP Request 3” — especially when debugging.
- Export workflows as JSON regularly. Keep them in git. n8n provides a download button (⋮ → Download) that saves everything.
- Use environment variables for credentials, not hardcoded values. Set
N8N_ENCRYPTION_KEYandDB_POSTGRESDB_PASSWORDin your docker-compose.env file. - Batch process large datasets. If you have 10,000 records, use Split + Wait + Merge instead of processing all at once.
- Debug with NoOp nodes. Place a NoOp node after any complex transformation to inspect the output before passing to the next step.
- Secure your webhooks. Add a header validation step in your webhook workflows — verify a shared secret before processing the request.
- Set execution time limits. In Workflow Settings, set a max execution time (e.g., 5 minutes) to prevent runaway workflows.
- Join the n8n community. The Discord and Forum have thousands of ready-to-use workflow templates. Don’t reinvent the wheel.
16. 🗺️ 7-Day Learning Roadmap
| Day | Topic | Goal | ⏱️ Time |
|---|---|---|---|
| 1 | Install & First Workflow | Docker install, create your first 3-node workflow | 45 min |
| 2 | HTTP & API Integrations | Call REST APIs, process JSON responses | 60 min |
| 3 | Webhooks & Triggers | Build a webhook receiver, connect to external apps | 60 min |
| 4 | Logic & Transformations | IF/Switch/Conditional flows, Code nodes, data transform | 90 min |
| 5 | AI & LLM Integration | OpenAI node, sentiment analysis, content generation | 90 min |
| 6 | Error Handling & Production | Error workflows, retry logic, monitoring | 60 min |
| 7 | Build a Real Project | End-to-end automated system (e.g., daily report generator) | 120 min |
17. 🚑 Troubleshooting Guide
| ⚠️ Problem | 🔍 Cause | ✅ Solution |
|---|---|---|
| Expression shows [Object Object] | Trying to print an object as string | Use {{ JSON.stringify($json) }} |
| Workflow not triggering on schedule | Timezone mismatch or wrong cron | Set timezone in Schedule node. Verify with tz command. |
| Webhook returning 404 | Webhook not activated (needs manual save) | Click “Save” on the webhook workflow. Check the webhook URL. |
| API returning 429 Too Many Requests | Rate limit hit | Add Wait node. Enable retry with exponential backoff. |
| MySQL/Postgres connection refused | Database not in same Docker network | Put n8n and DB on same network. Use service name as host. |
| n8n won’t start after config change | Invalid encryption key or database URL | Check docker logs. Verify N8N_ENCRYPTION_KEY is 32+ chars. |
18. 📌 TL;DR: If You Learn Nothing Else, Learn These 5
- HTTP Request Node — The Swiss Army knife. Calls any REST/GraphQL API. Handles JSON, auth, headers, and pagination.
- Code Node — Your escape hatch when the visual editor can’t express your logic. JavaScript (default) or Python.
- Expressions ({{ }}) — The #1 feature that separates n8n beginners from pros. Dynamic data referencing everywhere.
- Error Workflow — Without this, your automation is flying blind. Always set one up before production.
- Webhook Node — The bridge between n8n and the outside world. Every external service integration starts here.
19. 💭 Final Thoughts
n8n represents a fundamental shift in how we think about automation. It’s not just a cheaper Zapier — it’s a platform that gives you the power of a programmable integration engine with the accessibility of a visual builder.
🔥 Final Word: The most expensive automation is the one you haven’t built yet. Every hour you spend automating a repetitive task pays back tenfold over the next year.
The best time to start was yesterday. The second best time is now. 🚀
What to Learn Next
- Docker & Docker Compose — Run n8n in production properly (full Docker course)
- REST APIs — Deep dive into the HTTP Request node and authentication flows
- Linux Commands — Manage your n8n server efficiently (full Linux course)
- GitHub Actions — CI/CD for n8n workflow deployment
More Free Courses on TricksPage
- Git & GitHub Course — Master Git from basics to collaboration workflows, CI/CD, and open-source.
- Linux Commands Course — Complete Linux command line mastery — navigation, text processing, scripting, networking.
- Docker & Swarm Course — Containers, Dockerfiles, Compose, Swarm orchestration, and production deployment.
- n8n Automation Course — Workflow automation with 400+ integrations, webhooks, AI, and error handling.
- Agentic AI Course — Build AI agents with ReAct patterns, tools, memory, and multi-agent orchestration.
If this course helped you:
- 📌 Bookmark this page for future reference
- 📤 Share it with someone who needs it
- 💬 Leave a comment — what’s the first workflow you’re going to build?