Exploring n8n: a step-by-step guide with an AI inbox workflow

Cover image for Exploring n8n: a step-by-step guide with an AI inbox workflow

n8n (said "n-eight-n") is a workflow automation tool. You build a workflow on a canvas out of nodes, one node per step, and n8n runs it when something happens: a form is sent, a schedule fires, another app calls a webhook. Between those steps you can put an AI model that reads, sorts and writes for you. You can use n8n's cloud service, or host it yourself for free under its fair-code licence.

This guide is long on purpose. It starts from an empty computer and ends with two workflows running, and every click has a screenshot. I built both workflows on a fresh install of n8n 2.44 in October 2026 while writing this, so the screens you see are the screens you will get.

If you read the first version of this guide from January 2025, the example has changed. That version searched Reddit and posted comments automatically. Reddit now asks every app to be approved before it reads data, and has announced the end of its RSS feeds, so a Reddit example would stop working soon after you built it. The last section explains the details. The new examples use sources you control or that are open by design.

What you will build

The main workflow is a lead and feedback inbox. A visitor fills in a contact form on your site. n8n sends the message to an AI model, which decides whether it is a sales lead, a support request, a partnership idea, feedback or spam, rates how urgent it is, writes a one-line summary and drafts a reply. n8n saves everything to a table and emails the message to the person who should answer it. Sales leads go to sales, support requests go to support, everything else goes to the team, and spam stays in the table for whenever you want to check it.

reference image for blog
08-inbox-flow.webp 137KB

8. The lead and feedback inbox, from form to inbox.

The second workflow runs every morning. It searches Hacker News for new stories that mention your topic, asks AI which ones are real questions or discussions where you could help, and emails your team a short list to read and answer in their own words.

Both workflows are useful as they are, and both teach the pieces you will reuse in every n8n project: triggers, HTTP requests, items, expressions, AI nodes, tables, routing and email.

What you need

  • A computer with Docker Desktop installed (Mac, Windows or Linux). Docker runs n8n and a small test inbox for you.
  • An API key for an AI model. I used OpenAI. Anthropic, Google Gemini, Mistral, a local model through Ollama and many others work the same way in n8n.
  • About an hour for the first workflow and twenty minutes for the second.

Everything here is done with settings and drag and drop. A few fields take short expressions such as {{ $json.title }}, and the guide gives you each one to copy.

Install n8n with Docker

The n8n docs offer a few ways to run n8n on your own machine. Their recommended Docker Compose setup also starts a sandbox for the n8n Assistant and asks for at least 4 GB of memory. There is also a one-line setup script. For this guide a smaller Compose file is enough: n8n itself, plus Mailpit, a test inbox that catches every email n8n sends, so you can read the results safely on your own computer.

Make a folder called n8n, and save this as compose.yml inside it:

services:
n8n:
image: n8nio/n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- GENERIC_TIMEZONE=America/Toronto
- TZ=America/Toronto
volumes:
- n8n_data:/home/node/.n8n
mailpit:
image: axllent/mailpit
restart: unless-stopped
ports:
- "8025:8025"

volumes:
n8n_data:

Change America/Toronto to your own time zone. GENERIC_TIMEZONE is the one n8n uses for schedules, so a workflow set to run at 8:00 runs at 8:00 where you are. The n8n_data volume keeps your workflows, credentials and tables when the container restarts.

Open a terminal in that folder and start both services:

docker compose up -d

The first start downloads the images and takes a minute or two. When it finishes, open http://localhost:5678 for n8n and http://localhost:8025 for the test inbox. To update n8n later, run docker compose pull and then docker compose up -d again.

You may also see npx n8n in older guides. It still works for a quick try, but the n8n team has announced that n8n 3.0 drops npm and npx installs, so Docker is the better habit.

The first visit

The first page asks you to set up the owner account. This is the admin of your n8n, so use a real email address and a strong password (at least eight characters, with a number and a capital letter).

reference image for blog
01-owner-account.webp 25.2KB

1. Create the owner account, then click Next.

n8n then asks a few optional questions about your company and role. Answer them or click Get started to skip.

reference image for blog
02-survey.webp 27.9KB

2. The survey is optional.

Next comes an offer of a free licence key for a few extra features: folders for your workflows, debugging failed runs in the editor, and custom execution data. They are free forever once unlocked, and the n8n docs list exactly what the key adds. I recommend it, because folders help once you have more than a handful of workflows. Enter your email and n8n sends the key there. Skip works too, and you can ask for the key later under Settings, Usage and plan.

reference image for blog
03-free-license.webp 51.2KB

3. The free licence key unlocks folders and better debugging.

Recent versions of n8n open on the n8n Assistant, a chat that can build workflows for you once you give it a model. This guide builds by hand, so you learn what each step does. Click Set up later in Settings.

reference image for blog
04-assistant-set-up-later.webp 41KB

4. Choose "Set up later in Settings" for now.

You land on the Overview page. This is home: your workflows, credentials, executions and data tables all live here.

reference image for blog
05-overview.webp 29.1KB

5. The Overview page on a fresh install.

How n8n works in five ideas

Five ideas explain almost everything you will see on the canvas.

A trigger starts the workflow. It can be a schedule, a form, a webhook, a message in a chat app, or a manual click while you test. Every workflow has at least one.

A node is one step. It calls an app, changes data, makes a decision or asks an AI model a question. Nodes connect left to right, and each connection carries the output of one node into the next.

The data moves as items. An item is one record, such as one form submission or one news story. A node that receives ten items usually runs its step ten times, once per item. In every node you can see the items it received and the items it produced, as a table or as JSON.

An expression is a small formula in double curly braces that reads data from an item. {{ $json.name }} means "the name field of the item this node is working on". You can type expressions, or drag a field from the input panel into a setting and n8n writes the expression for you.

A sub-node plugs into an AI node from below. It gives that node its chat model, its output format, its memory or its tools.

reference image for blog
06-building-blocks.webp 135KB

6. Triggers, nodes, items, sub-nodes and expressions.

One more idea matters before you start. While you build, you run things by hand: Execute step runs one node (and the nodes before it), and Execute runs the whole workflow once. n8n saves your edits on its own as you work. When the workflow is ready, you publish it, and from then on it runs by itself every time its trigger fires. Publishing replaced the old Active switch in n8n 2.0, so older tutorials that mention "activate" mean the same thing.

reference image for blog
07-test-and-publish.webp 163KB

7. Build and test first, then publish.

Part 1: an AI inbox for your contact form

Step 1: Create a Data Table for the messages

A Data Table is a simple table that lives inside n8n. It is a good place to keep a record of every message, and it is ready the moment you create it. Data tables are available on every plan, including self-hosted, and the n8n docs describe them as suited to light and moderate storage (all tables in one n8n share a 200 MiB limit by default, which is plenty for messages). If your team lives in Google Sheets or Airtable, you can swap those in later with the same steps.

On the Overview page, open the Data tables tab and click Create data table.

reference image for blog
09-data-tables-tab.webp 69.4KB

9. Data tables live on the Overview page.

Name the table inbox, keep From scratch selected, and click Create.

reference image for blog
10-name-the-table.webp 40.2KB

10. Name the table inbox.

The new table already has id, createdAt and updatedAt. Click Add Column and add these eight text columns, one at a time: name, email, company, message, category, urgency, summary and draft_reply. Text is the default type, so you only type the name each time.

reference image for blog
11-add-a-column.webp 6.79KB

11. Add each column by name.

reference image for blog
12-table-columns.webp 29.8KB

12. The empty inbox table, ready for messages.

Step 2: Start a workflow with a form

Back on the Overview page, open the Workflows tab and click Create workflow. Click the workflow's name at the top ("My workflow") and rename it Lead and feedback inbox.

reference image for blog
13-create-workflow.webp 43.4KB

13. Create a new workflow.

The empty canvas shows one big plus, "Add first step". Click it, and n8n asks what triggers the workflow. Choose On form submission. n8n hosts the form page for you, so you have a working form straight away. You can link to it, or embed it on your site later.

reference image for blog
14-form-trigger.webp 111KB

14. Pick "On form submission" as the trigger.

The form trigger opens with its settings. Set the Form Title to Get in touch and the Form Description to something friendly, such as "Questions, feedback or a project in mind? Write to us and the right person will reply within one working day." Rename the node itself to Contact form by clicking its name at the top of the panel. Clear names make every later step easier to read.

reference image for blog
15-form-settings.webp 78.1KB

15. The form's title and description.

Under Form Elements, click Add Form Element four times and set them up like this:

Label

Element Type

Required

Name

Text Input

yes

Email

Email

yes

Company

Text Input

no

Message

Textarea

yes

To make a field required, click Add Attributes inside that element, choose Required Field and switch it on.

reference image for blog
16-form-elements.webp 60.9KB

16. Form elements, each with a label, a type and the Required switch.

Step 3: Send yourself a test message

Click Execute step in the form trigger. n8n opens the test version of your form in a new tab. Fill it in as a visitor would. I used a made-up sales lead: "Hi! We're a 12-person agency and we'd like to roll your tool out to the whole team next month. Do you have a team plan or volume pricing, and can we get a short demo this week?"

reference image for blog
17-test-form.webp 43.4KB

17. The test form, filled in with a sample lead.

Submit the form and go back to the n8n tab. The output panel now shows one item with the four fields, plus submittedAt and formMode.

reference image for blog
18-form-output.webp 83KB

18. One form submission becomes one item.

Now click the pin icon at the top right of the output panel. Pinning keeps this output, so while you build the next steps, every test reuses Maya's message and you skip filling in the form again. Pinned data is used only in test runs, and the published workflow always works with live data.

Step 4: Let AI sort the message

Close the node panel. On the canvas, hover over the Contact form node and click the small plus on its right side. Search for Basic LLM Chain and select it. This node sends a prompt to a chat model and returns the answer.

reference image for blog
19-add-basic-llm-chain.webp 65KB

19. Add a Basic LLM Chain after the form.

Set Source for Prompt to Define below. For the Prompt, click Expression next to the field and paste this:

Name: {{ $json.Name }}
Email: {{ $json.Email }}
Company: {{ $json.Company }}
Message: {{ $json.Message }}

Below the field, n8n shows the result with Maya's real values filled in. That preview is the fastest way to check an expression.

Switch on Require Specific Output Format. Then, under Chat Messages, click Add prompt, keep the type as System, set Message to Expression and paste the instructions:

You sort messages that people send through our website's contact form.

Choose one category:
- sales: wants to buy, asks about pricing, a demo or a quote
- support: needs help using the product
- partnership: integrations, reselling, affiliates, press
- feedback: ideas, praise or complaints with no question
- spam: ads, SEO or link offers, nonsense

Set urgency to high when they are blocked or ready to buy now, low for feedback and spam, and normal otherwise.

Write a one-sentence summary a teammate can read in five seconds, and a short, friendly draft reply in the sender's language for a person to check and send. Leave the draft empty for spam.

Rename the node to Sort with AI.

reference image for blog
20-prompt-and-system-message.webp 109KB

20. The prompt carries the message, and the system message says how to sort it.

Close the panel. The Sort with AI node now has two connectors underneath it, Model and Output Parser. Click the plus under Model and choose your chat model. I picked OpenAI Chat Model.

reference image for blog
21-add-openai-model.webp 70.8KB

21. Attach a chat model under the Model connector.

The model needs a credential, which is how n8n stores an API key safely. Click Connect to OpenAI (the button is named after your provider), paste your API key into the API Key field and click Save. You do this once, and every later workflow can reuse the credential.

reference image for blog
22-openai-credential.webp 48KB

22. Paste your API key into the credential and save it.

Pick a model from the list. Sorting short messages is an easy job, so a small, low-cost model is enough. I used gpt-6-luna, and any current small model does the job well.

reference image for blog
23-choose-model.webp 70.1KB

23. A small model is enough for sorting.

Back on the canvas, click the plus under Output Parser and choose Structured Output Parser. Pick it by its exact name, because the Auto-fixing Output Parser above it mentions the same words in its description.

reference image for blog
24-output-parsers.webp 78KB

24. Choose the Structured Output Parser.

The parser makes the model answer in a fixed shape, so the next nodes can count on the same four fields every time. Replace its JSON Example with this, and rename the node to Answer format:

{
"category": "sales",
"urgency": "high",
"summary": "Agency of 12 wants a team plan and a demo this week.",
"draft_reply": "Hi Maya, thanks for writing! ..."
}
reference image for blog
25-structured-output-parser.webp 91.1KB

25. The JSON example defines the answer's shape.

The canvas now shows the form, the AI chain and its two sub-nodes. I renamed the chat model node to OpenAI model too, which keeps the labels short.

reference image for blog
26-ai-step-on-canvas.webp 70.7KB

26. The AI step with its model and output parser.

Open Sort with AI and click Execute step. A few seconds later the output panel shows the answer. For Maya's message, the model chose sales with high urgency, summarised it as "Maya from Northwind Labs wants team or volume pricing for a 12-person rollout next month and a demo this week", and drafted a short, warm reply.

reference image for blog
27-ai-output.webp 158KB

27. The AI's answer, in the shape the parser asked for.

Step 5: Save every message to the table

Add a node after Sort with AI and search for Data table. The node offers actions for rows and for tables. Choose Insert row.

reference image for blog
28-data-table-insert.webp 88.7KB

28. Insert row adds one row per item.

Under Data table, choose inbox. n8n reads the table and shows one field for each of its columns. Now fill them by dragging. In the input panel on the left, open Contact form and drag the Name field onto the name column. n8n writes the expression {{ $('Contact form').item.json.Name }} for you, which means "the Name field from the Contact form node".

reference image for blog
29-drag-a-field.webp 77.2KB

29. Drag a field from the left onto a column.

Drag Email, Company and Message from Contact form onto their columns. Then open Sort with AI, then output, and drag category, urgency, summary and draft_reply onto theirs. Those become {{ $json.output.category }} and so on, because they come from the node right before this one. Rename the node to Save to inbox and click Execute step.

reference image for blog
30-row-saved.webp 202KB

30. Every column mapped, and the first row saved.

The output shows the saved row with an id of 1. If you open the inbox table on the Overview page, Maya's message is there.

Step 6: Route each message by category

Add a Switch node after Save to inbox. A Switch has one output per rule, so each category can take its own path.

For Routing Rule 1, drag category from the input panel into the first field. Keep the operator "is equal to" and type sales in the last field. Switch on Rename Output and name it sales, so the canvas shows the word on that output. Click Add Routing Rule and do the same for support, and once more for spam.

Then open Options, add Fallback Output and choose Extra Output. Add the option Rename Fallback Output and call it everything else. Partnership ideas and feedback leave through this output. Rename the node to Route by category and click Execute step. The output panel shows tabs for each route, and Maya's message sits under Sales.

reference image for blog
31-switch-rules.webp 203KB

31. One rule per category, with a fallback for everything else.

Step 7: Email the right person

Hover over the Switch node. Each output has its own plus. Click the plus on sales, search for Send Email and choose Send an Email.

The node needs an SMTP credential, which is the server that sends the email. For the test inbox, click Connect to SMTP and fill in Host mailpit and Port 1025, switch SSL/TLS off, leave User and Password empty, and save. Mailpit keeps every email it receives in its own inbox, which makes it a safe place to test.

reference image for blog
32-smtp-credential.webp 29.5KB

32. An SMTP credential pointing at the Mailpit test inbox.

When you move to real email, use the SMTP details from your email provider instead. The n8n docs for the SMTP credential explain the usual ports: 465 with SSL/TLS on, or 587 with it off.

Fill in the email:

  • From Email: an address such as Inbox bot <inbox@yourcompany.com>.
  • To Email: your sales address.
  • Subject, as an expression: [{{ $json.urgency }}] New sales lead from {{ $json.name }}.
  • Email Format: HTML, and for HTML, as an expression:
<p><strong>{{ $json.summary }}</strong></p>
<p>From {{ $json.name }} ({{ $json.email }}) {{ $json.company }}<br>Urgency: {{ $json.urgency }}</p>
<p><strong>Their message</strong><br>{{ $json.message }}</p>
<p><strong>Suggested reply</strong> (check it before you send)<br>{{ $json.draft_reply }}</p>

Then open Options, add Reply To and drag the email field into it. Now when someone on your team clicks Reply, the answer goes straight to the visitor. Rename the node to Email sales and click Execute step. The output says the message was accepted.

reference image for blog
33-email-sales.webp 199KB

33. The sales email, with the visitor as the reply address.

Repeat for the other two outputs. On support, add a Send Email node named Email support that goes to your support address, with the subject [{{ $json.urgency }}] Support request from {{ $json.name }}. On everything else, add Email the team, with the subject [{{ $json.category }}] New message from {{ $json.name }}. Use the same HTML body and Reply To each time. The SMTP credential is picked automatically, because you only have one. Leave the spam output empty, since those messages are already saved in the table.

Click Tidy Up in the bottom-left corner of the canvas, and the workflow lines up neatly.

reference image for blog
34-whole-workflow.webp 113KB

34. The finished lead and feedback inbox.

Step 8: Test the whole workflow

Open the Contact form node and click Unpin in the banner above its output, so the next runs use real submissions. Close it, and click the orange Execute button at the bottom of the canvas. The test form opens again.

reference image for blog
35-execute-button.webp 16.2KB

35. Execute runs the whole workflow once.

I sent four more made-up messages, one for each kind of path:

  • A support request: "Since this morning the export button gives me an error 500 and our client report is due at 3pm. Can someone look at it today?"
  • A partnership idea from a newsletter writer who wanted to feature an integration.
  • Feedback in French: "Bonjour ! Le nouveau tableau de bord est beaucoup plus rapide, merci. Petite idée : pouvoir épingler nos rapports favoris en haut de la page."
  • Spam offering "100% guaranteed backlinks".

After each submission, the canvas lights up the path that message took. The green line shows the support request going out through the support output.

reference image for blog
36-run-support.webp 115KB

36. The support request took the support path.

Open the test inbox at http://localhost:8025. Four emails arrived, each at the right address: the sales lead at sales, the support request at support, and the partnership idea and the feedback at the team. The spam stayed in the table.

reference image for blog
37-test-inbox.webp 86.6KB

37. Every message reached the right person.

Each email starts with the summary, so the reader knows in five seconds what it is about. The suggested reply sits under the original message.

reference image for blog
38-support-email.webp 156KB

38. A support email, with a summary and a draft reply.

The French feedback got its draft reply in French, as the instructions asked. The summary came back in French too. If your team works in English, add "Write the summary in English" to the system message.

reference image for blog
39-feedback-email-french.webp 149KB

39. The AI answered in the sender's language.

The inbox table now holds all five messages, including the spam.

reference image for blog
40-table-rows.webp 71.7KB

40. Every message is saved, spam included.

Scroll the table to the right to see what the AI decided for each one.

reference image for blog
41-table-ai-columns.webp 50KB

41. Category, urgency, summary and draft reply for each message.

Step 9: Publish it

Everything so far ran because you clicked. To make the form work on its own, click Publish at the top right.

reference image for blog
42-publish-button.webp 12.3KB

42. Publish makes the workflow live.

n8n asks for a version name. Write what this version does, such as "First version: form, AI sorting, inbox table, routing emails". Later, when you change the workflow, your edits stay as a draft until you publish again, and the version history lets you go back.

reference image for blog
43-publish-version.webp 30.3KB

43. Give each published version a name.

The form now has a production URL as well as the test URL. Open the Contact form node and switch Form URLs to Production URL. That is the link to share or embed on your site. On a computer of your own it starts with localhost, so before real visitors can reach it, n8n needs to run on a server or on n8n Cloud.

reference image for blog
44-production-url.webp 114KB

44. The production URL is the one visitors use.

Every run from now on is listed under the Executions tab, with how long it took and whether it succeeded. Click any run to see the exact path it took and the data at every step. This is where you look first when something seems wrong.

reference image for blog
45-executions.webp 143KB

45. Executions keep a record of every run.

Swap the test inbox for your real tools

Mailpit stands in for your real email so you can test freely. When you are ready, change the SMTP credential to your provider's details, and change the To addresses to real ones. The rest stays the same.

Your team may prefer chat to email. Replace a Send Email node with the Slack node and post the same summary to a channel such as #sales. To send from a Google account, use the Gmail node. And if your team lives in a spreadsheet, the Google Sheets node can append a row instead of, or as well as, the Data Table. Each of these needs a one-time sign-in to that service as its credential.

By default, the Send Email node adds a line saying the email was sent automatically with n8n. You can turn it off under Options, Append n8n Attribution.

Part 2: a daily Hacker News watch

The second workflow watches the outside world. Every morning it searches Hacker News for stories from the last day that mention "AI agent", asks AI which ones are questions or discussions where someone like you could add something useful, and emails the list. It reuses most of what you learnt in Part 1 and adds the most useful node in n8n, HTTP Request, which can call almost any service on the web.

Hacker News search comes from a free public API run by Algolia, which anyone can call straight away.

reference image for blog
46-hn-flow.webp 149KB

46. The Hacker News watch, from schedule to digest.

Step 1: Run it every morning

Create a new workflow and name it Hacker News watch. For the first step choose On a schedule. Keep Trigger Interval on Days and Days Between Triggers at 1, and set Trigger at Hour to 8am.

reference image for blog
47-schedule-8am.webp 57.8KB

47. Run once a day at 8:00.

Click Execute step to test it. The trigger outputs the current date and time in every format you might need, in the time zone you set in compose.yml.

reference image for blog
48-schedule-output.webp 74.7KB

48. The trigger's output, in your own time zone.

Step 2: Search Hacker News with HTTP Request

Add an HTTP Request node. Keep Method as GET and set URL to:

https://hn.algolia.com/api/v1/search_by_date

Switch on Send Query Parameters and add four parameters:

Name

Value

query

"AI agent"

tags

story

numericFilters

created_at_i>{{ $now.minus({ days: 1 }).toUnixInteger() }} (as an expression)

hitsPerPage

50

The quotes around "AI agent" ask for the exact phrase. tags set to story keeps posts and leaves out comments. The numericFilters expression asks for stories created in the last 24 hours, so each morning's run picks up where the last one ended. Change the query to your own topic.

Rename the node to Search Hacker News and click Execute step.

reference image for blog
49-hn-http-request.webp 61.8KB

49. One HTTP Request node does the search.

The answer arrives as one item that holds a list called hits, one entry per story. Pin this output while you build, so you can test the next steps as often as you like with the same search result.

Step 3: One item per story

Add a Split Out node and set Fields To Split Out to hits. It turns the one item with a list inside into one item per story, so the next nodes handle each story on its own. Rename it One item per story. On the day I ran it, it found 13 stories.

reference image for blog
50-split-out.webp 113KB

50. Split Out turns a list into separate items.

Step 4: Keep what matters

Each story has many fields, most of them search details. Add an Edit Fields node, named Keep what matters, to keep five of them. Click Add Field for each, and give it a name, a type and a value:

Name

Type

Value

title

String

{{ $json.title }}

discussion

String

https://news.ycombinator.com/item?id={{ $json.objectID }}

text

String

{{ $json.story_text ?? '' }}

points

Number

{{ $json.points }}

comments

Number

{{ $json.num_comments }}

discussion builds the link to the comments page on Hacker News, which is where you would reply. text is the body of posts such as "Ask HN" questions, and ?? '' gives an empty value for link posts, which only have a title.

reference image for blog
51-keep-what-matters.webp 148KB

51. Five clean fields per story.

Step 5: Ask AI which stories are worth joining

Part 1 used a Basic LLM Chain because it needed four answers per message. Here you need one decision per story, and n8n has a node made for that job, the Text Classifier. Add it after Keep what matters.

reference image for blog
52-add-text-classifier.webp 68.9KB

52. The Text Classifier sorts items into categories.

Set Text to Classify, as an expression, to the title and the text:

{{ $json.title }}
{{ $json.text }}

Then add two categories. Each has a name and a description, and the description is what the AI reads, so make it specific:

  • worth joining: "Someone asks for advice, compares tools or describes a problem with AI agents, and a practitioner could add something useful."
  • skip: "Product launches, self-promotion, news with no open question, or not about AI agents."

Rename the node Worth joining?. Under Model, add your chat model the same way as in Part 1. The OpenAI credential is already there to pick.

reference image for blog
53-text-classifier.webp 84.4KB

53. Two categories, each with a clear description.

Click Execute step. The classifier gives every category its own output. On my day, 2 of the 13 stories were worth joining: an Ask HN about sandboxing AI agents so they can't delete your files, and a question about whether a webpage can hijack an AI agent. The other 11 were mostly launches and links.

reference image for blog
54-classifier-output.webp 108KB

54. Two worth joining, eleven to skip.

Step 6: Make a table and email the digest

On the worth joining output, add an HTML node and choose Convert to HTML Table. It turns all the items into one HTML table, ready to drop into an email. Under Options, add Capitalize Headers, and add Table Attributes with border="1" cellpadding="6" so the table reads well in any email app. Rename it Make a table.

reference image for blog
55-html-table.webp 162KB

55. One table for all the stories worth joining.

Add a Send Email node after it, named Email the digest, using the same SMTP credential. Send it to your team with a plain subject such as "Hacker News threads worth joining today", and this HTML body as an expression:

<p>Stories from the last 24 hours that mention "AI agent" and look worth a reply. Open the discussion, read the thread, and answer in your own words.</p>
{{ $json.table }}

Leave the skip output empty. Tidy up the canvas, and the workflow reads left to right like a sentence.

reference image for blog
56-hn-canvas.webp 126KB

56. The finished Hacker News watch.

Unpin the search node and click Execute to run the whole workflow once. The digest lands in the test inbox with one row per story and a link to each discussion.

reference image for blog
57-digest-email.webp 144KB

57. The morning digest.

When you are happy with it, publish it, and it runs every day at 8:00. On a quiet day, when every story lands in skip, the run ends at the classifier and your inbox stays quiet too.

Reply as a person

This workflow finds the threads. The replies are yours to write. Read the whole discussion first, answer the question that was asked, and share what you know from experience. Hacker News has its own guidelines, and they reward substance and good faith. Mention your own product only where it answers the question, and say that it is yours. A few thoughtful replies a week build more trust than any number of quick ones.

Why this guide moved away from Reddit

The 2025 version of this guide built a Reddit workflow, and many people searched for exactly that. Here is what changed, so you can decide for yourself.

Reddit's Responsible Builder Policy asks every app to request access and get explicit approval before it reads Reddit data through the API. Reddit's changelog of 8 Oct 2026 then announced three dates: new requests for public API access close on 31 Oct 2026, RSS feeds stop on 13 Nov 2026 (and for feeds outside a community you moderate, "there is no replacement"), and the remaining public API access ends in March 2027 as apps move to Reddit's Developer Platform. Reddit's User Agreement also says that scraping the site without its written consent is prohibited.

So a workflow that reads Reddit has two honest options: get approved by Reddit, or read Reddit yourself. The Hacker News workflow above follows the same pattern with a source that publishes an open API, and the pattern carries over to any community or forum that offers one.

Where to go next

You now know the pieces that almost every workflow is made of. The same shape (a trigger, a fetch, an AI decision, a record, a message to a person) fits many jobs:

  • New reviews of your product, sorted into bugs, feature requests and praise, with one-star reviews sent to you right away.
  • Release notes and blog posts from the tools you depend on or compete with, summarised in a weekly email.
  • New questions on the forums of the tools you use, filtered to the ones you can answer well.
  • Support tickets, tagged and summarised before anyone opens them.

The n8n workflow templates are a large library of starting points, and you can copy any of them into your own n8n. If you are still choosing a tool, n8n is listed on AI Agents Live with its reviews, and the Workflow Automation category lists the alternatives.

Questions people ask

Is n8n free?

Self-hosting n8n is free under its Sustainable Use License for your own internal business use and for personal or non-commercial use. The licence FAQ gives examples, such as charging clients to build workflows for them or using n8n behind the scenes in your own product. Hosting n8n as a service where your clients build their own workflows is outside the free licence, and the FAQ points you to n8n for that case. n8n Cloud and the Business and Enterprise plans are paid, and they add features such as SSO, environments and Git version control.

Do I need to know how to code?

Both workflows in this guide use settings, drag and drop and a handful of short expressions that you can copy. n8n also has a Code node for the day you want to write JavaScript, and you can go a long way before that day comes.

Can I use Claude, Gemini or a local model instead of OpenAI?

Yes. Every AI node in n8n takes its model from a sub-node, and n8n has chat model nodes for Anthropic, Google Gemini, Mistral, Groq, DeepSeek, OpenRouter, AWS Bedrock, Ollama for local models, and more. Swap the OpenAI model node for another one and add that provider's credential. The prompts, the parser and the rest of the workflow stay the same.

How do I put the form on my own website?

Publish the workflow and use the form's production URL, either as a link or inside an iframe on your page. For visitors to reach it, n8n has to run somewhere public, such as a small server or n8n Cloud, because localhost only works on your own computer. If you already have a form on your site, use a Webhook trigger instead of the form trigger and have your form send its data to the webhook's URL. Everything after the trigger works the same.

What happens when the AI gets a category wrong?

Every message is saved in the table with the AI's choice, so a wrong guess is easy to spot and every message stays on record. If one kind of mistake repeats, improve the description of that category in the system message, and test again with the message that went wrong. For anything important, keep a person in the loop, which is why both workflows draft and suggest and leave the sending of replies to you.

関連ブログ