{"workflow":{"id":14487,"name":"Notify on menu orders via ntfy and Home Assistant TTS with daily BAC tracking","views":0,"recentViews":0,"totalViews":0,"createdAt":"2026-03-30T13:40:50.748Z","description":"# Notify on menu orders via ntfy and Home Assistant TTS with daily BAC tracking\n\nReceive instant push notifications on your phone and voice announcements on your Google Home every time someone orders from your intranet menu — with cumulative BAC tracking per person.\n\n&gt; **Full documentation & step-by-step setup guides:**\n&gt; [📖 Notion Documentation](https://paoloronco.notion.site/Documentation-Menu-Order-Push-Notifications-Home-Assistant-TTS-BAC-32ff0ba27c328075a886d89ebfbf5ce5)\n&gt; [💻 GitHub Repository](https://github.com/paoloronco/n8n-templates/tree/main/free-templates/5%20v3%20online_menu-push_notifications-homeassistant-TTS-BACcalculation)\n\n---\n\n## What This Workflow Does\n\nEvery time a customer submits an order from your intranet menu website, this workflow:\n\n1. Receives the order via **Webhook**\n2. Logs it to an **n8n DataTable** and reads all orders for that person today\n3. Calculates the cumulative **BAC** (Blood Alcohol Content) using the Widmark formula\n4. Sends a **push notification** via ntfy (with order history + BAC level)\n5. Triggers a **Home Assistant script** → voice announcement on Google Home\n\n**No cloud TTS fees. No external AI services. Fully self-hosted.**\n\n---\n\n## Flow\n\n```\nWebhook → Prepare Order → DataTable (INSERT) → Read Today's Orders → BAC Calculator → ntfy Push Notification → Home Assistant TTS\n```\n\n---\n\n## Example Output\n\n**Push notification (ntfy app):**\n\n```\n🛎 Order from Mario\n\nMario: 1x Pizza, 2x Beer 33cl\n🕐 12:30\n📋 Ordered before:\n  - 1x Prosecco  🕐 11:45\n🍸 BAC ~0.54 g/L  🔴\n```\n\n**Google Home voice announcement:**\n\n```\nMario has ordered Pizza\n```\n\n---\n\n## Prerequisites\n\nBefore importing this workflow, you need:\n\n- A running **n8n** instance (self-hosted or cloud) reachable from the internet\n- **Home Assistant** on your local network (e.g. `homeassistant.local:8123`)\n- At least one **Google Home** (or Chromecast-capable) device added to HA via the Google Cast integration\n- **ntfy** deployed via Docker (self-hosted push notification server)\n- A public HTTPS URL for ntfy — recommended via **Cloudflare Tunnel** (no open ports needed)\n- An Android or iOS device with the **ntfy app** installed\n\n---\n\n## Credentials Required\n\n| Credential                                             | Used For                                 |\n| ------------------------------------------------------ | ---------------------------------------- |\n| **Home Assistant**                                     | Calling the `annuncia_ordine` TTS script |\n| **Header Auth** (`Authorization: Bearer &lt;ntfy_token&gt;`) | Sending authenticated requests to ntfy   |\n\n---\n\n## n8n DataTable Schema\n\nCreate a DataTable in **n8n → Data → Tables** with these columns:\n\n| Column         | Type   | Description                                            |\n| -------------- | ------ | ------------------------------------------------------ |\n| `item`         | Text   | Full order string (e.g. \"2x Negroni, 1x Messina 33cl\") |\n| `person`       | Text   | Normalised person name                                 |\n| `alcol_grammi` | Number | Total grams of alcohol for this order                  |\n| `data`         | Text   | ISO date (YYYY-MM-DD)                                  |\n| `orario`       | Text   | Time string from the order                             |\n\nCopy the DataTable ID and paste it into the DataTable nodes inside the workflow.\n\n---\n\n## Webhook Payload\n\nYour menu website must POST this JSON to the Webhook Production URL:\n\n```json\n{\n  \"name\": \"Mario\",\n  \"time\": \"26/03/2026, 12:30:00\",\n  \"order\": [\n    { \"section\": \"Food\", \"name\": \"Pizza\", \"details\": \"\", \"quantity\": 1 },\n    { \"section\": \"Drinks\", \"name\": \"Beer\", \"details\": \"33cl\", \"quantity\": 2 }\n  ],\n  \"total\": 3\n}\n```\n\n---\n\n## Setup Steps\n\n### 1. Deploy ntfy (self-hosted push notifications)\n\nAdd ntfy to your `docker-compose.yml`:\n\n```yaml\nntfy:\n  image: binwiederhier/ntfy\n  command: serve\n  volumes:\n    - ./ntfy/config:/etc/ntfy\n    - ./ntfy/data:/var/lib/ntfy\n  ports:\n    - \"8095:80\"\n```\n\nIn `server.yml`, set `auth-default-access: deny-all`.\n\nThen create an admin user and generate a token:\n\n```bash\ndocker exec -e NTFY_PASSWORD=\"your_password\" ntfy ntfy user add --role=admin admin\ndocker exec ntfy ntfy token add admin\n```\n\n### 2. Expose ntfy over HTTPS (Cloudflare Tunnel)\n\nAdd an ingress rule to your Cloudflare Tunnel config:\n\n```yaml\n- hostname: ntfy.YOUR_DOMAIN.com\n  service: http://localhost:8095\n```\n\n### 3. Configure Home Assistant TTS\n\nIn HA, go to **Settings → Automations & Scenes → Scripts → Add script → Edit in YAML** and paste:\n\n```yaml\nalias: annuncia_ordine\nsequence:\n  - action: tts.speak\n    target:\n      entity_id: tts.google_translate_en_com\n    data:\n      media_player_entity_id: media_player.YOUR_GOOGLE_HOME_ENTITY\n      message: \"{{ message }}\"\n      language: it\nmode: single\n```\n\n&gt; Replace `media_player.YOUR_GOOGLE_HOME_ENTITY` with your actual entity ID.\n\nThen go to your HA profile → **Security → Long-lived access tokens** → create and copy a token.\n\n### 4. Import and configure the workflow\n\n1. Import the workflow JSON into n8n\n\n2. Create the **DataTable** (columns listed above) — copy its ID\n\n3. Create the **Header Auth** credential for ntfy:\n\n   - Header Name: `Authorization`\n   - Header Value: `Bearer YOUR_NTFY_TOKEN`\n\n4. Create the **Home Assistant** credential:\n\n   - Host: `http://homeassistant.local:8123`\n   - Access Token: your HA long-lived token\n\n5. In the `ntfy notification` node, replace `YOUR_TOPIC` in the URL\n\n6. In the `Home Assistant TTS` node, set the `message` attribute expression:\n\n   ```\n   ={{ $('Webhook').item.json.body.nome }} has ordered {{ $('Webhook').item.json.body.ordine[0].nome }}\n   ```\n\n7. Activate the workflow and copy the **Webhook Production URL**\n\n### 5. Configure your menu website\n\nSet the webhook URL in your menu site config:\n\n```js\n// menu-data.js\n\"orderWebhook\": \"https://YOUR_N8N_DOMAIN/webhook/menu\"\n```\n\n---\n\n## BAC Calculation (Widmark Formula)\n\n```\nBAC [g/L] = total_alcohol_grams_today / (70 × 0.68)\n```\n\nAssumes ~70 kg body weight. Italian legal driving limit: **0.5 g/L**\n\n| Emoji | Level      | BAC           |\n| ----- | ---------- | ------------- |\n| ⬜     | None       | 0 g/L         |\n| 🟢     | Low        | &lt; 0.2 g/L     |\n| 🟡     | Warning    | 0.2 – 0.5 g/L |\n| 🔴     | Over limit | &gt; 0.5 g/L     |\n\nBAC is **cumulative per day per person** and resets automatically the next day.\n\n---\n\n## Customization\n\n| What                                      | How                                                          |\n| ----------------------------------------- | ------------------------------------------------------------ |\n| Change the TTS message                    | Edit the `message` expression in the HA TTS node             |\n| Announce all ordered items                | Use `$json.body.ordine.map(i =&gt; i.quantita + ' ' + i.nome).join(', ')` |\n| Change TTS language                       | Edit `language` in the `annuncia_ordine` HA script           |\n| Announce on multiple Google Home devices  | Add multiple `media_player_entity_id` entries to the HA script |\n| Disable TTS (keep only push notification) | Remove or deactivate the `Home Assistant TTS` node           |\n\n---\n\n## Security\n\n| Layer                | Mechanism                                            |\n| -------------------- | ---------------------------------------------------- |\n| Transport (ntfy)     | HTTPS via Cloudflare Tunnel                          |\n| ntfy access          | `auth-default-access: deny-all` — no anonymous reads |\n| n8n → ntfy           | Dedicated Bearer token (revokable, no expiry)        |\n| n8n → Home Assistant | Long-lived access token                              |\n| Mobile app           | Username/password on the ntfy server                 |\n\n---\n\n## Documentation & Source\n\n|                          |                                                              |\n| ------------------------ | ------------------------------------------------------------ |\n| 📖 **Full documentation** | [Notion — step-by-step setup guides](https://paoloronco.notion.site/Documentation-Menu-Order-Push-Notifications-Home-Assistant-TTS-BAC-32ff0ba27c328075a886d89ebfbf5ce5) |\n| 💻 **GitHub Repository**  | [paoloronco/n8n-templates](https://github.com/paoloronco/n8n-templates/tree/main/free-templates/5%20v3%20online_menu-push_notifications-homeassistant-TTS-BACcalculation) |\n\n## Related Resources\n\n- [ntfy.sh documentation](https://docs.ntfy.sh)\n- [Home Assistant TTS documentation](https://www.home-assistant.io/integrations/tts/)\n- [Home Assistant Scripts](https://www.home-assistant.io/integrations/script/)\n- [Google Cast integration](https://www.home-assistant.io/integrations/cast/)\n- [n8n Home Assistant node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.homeassistant/)","workflow":{"meta":{"instanceId":"","templateCredsSetupCompleted":true},"nodes":[{"id":"709a58d2-d2fe-422d-bb31-7c7ae04af1c3","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1152,368],"parameters":{"width":480,"height":800,"content":"## Notify on menu orders via ntfy and Home Assistant TTS with daily BAC tracking\n\n📖 [Full documentation](https://paoloronco.notion.site/Documentation-Menu-Order-Push-Notifications-Home-Assistant-TTS-BAC-32ff0ba27c328075a886d89ebfbf5ce5)\n\n### How it works\n\n1. Receives a menu order through a webhook (POST body: `name`, `time`, `items[]`).\n2. Normalizes the customer name and formats the order string.\n3. Logs the order to a DataTable (item, person, alcohol_grams, date, order_time).\n4. Reads all of today's orders for that person from the DataTable.\n5. Calculates a cumulative BAC estimate using the Widmark formula.\n6. Sends a push notification via ntfy and announces the order via Home Assistant TTS.\n\n### Setup steps\n\n- [ ] Create a DataTable node with columns: `item`, `person`, `alcohol_grams`, `date`, `order_time`\n- [ ] Set up ntfy credentials (HTTP Header Auth) in the **Send Ntfy Notification** node\n- [ ] Set the ntfy URL to your server/topic (e.g. `https://ntfy.sh/your-topic`)\n- [ ] Set up Home Assistant credentials and update the script service name\n- [ ] Adjust the Widmark formula weight/factor if needed (default: 70 kg, 0.68)\n\n### Customization\n\nThe BAC thresholds, weight constant, and notification message format can all be adjusted in the **Calculate Cumulative BAC** node."},"typeVersion":1},{"id":"9e8f77e4-7dcb-4647-a5e2-fb00028c5b16","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[1648,368],"parameters":{"color":7,"width":432,"height":304,"content":"## Receive and prepare orders\n\nReceives the menu order via a webhook and prepares the data by normalizing and calculating necessary order information."},"typeVersion":1},{"id":"067991b5-23c9-4174-b9a5-6b6bb6982808","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[2096,368],"parameters":{"color":7,"width":432,"height":304,"content":"## Log order and read data\n\nLogs the prepared order into the database and reads the accumulated orders for the day."},"typeVersion":1},{"id":"efea2242-1257-4f84-ac0b-1c8d1281d491","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[2560,368],"parameters":{"color":7,"width":672,"height":304,"content":"## Calculate BAC and notify\n\nCalculates the cumulative BAC from today's orders and sends notifications followed by TTS announcements."},"typeVersion":1},{"id":"817f6c00-fbfd-4d4f-b0cf-0af68bc32893","name":"When Order Received","type":"n8n-nodes-base.webhook","position":[1696,496],"webhookId":"00000000-0000-0000-0000-000000000001","parameters":{"path":"menu","options":{},"httpMethod":"POST"},"typeVersion":2.1},{"id":"a19b54cd-144d-4fd1-b0dc-0aa34f25a972","name":"Calculate Alcohol and Format Order","type":"n8n-nodes-base.code","position":[1936,496],"parameters":{"jsCode":"// Normalize name, calculate alcohol amount and order string for current order\nconst body        = $input.first().json.body;\nconst rawName     = (body.name || 'Anonymous').trim();\nconst name        = rawName.charAt(0).toUpperCase() + rawName.slice(1).toLowerCase();\nconst orderTime   = body.time || new Date().toLocaleString();\nconst items       = body.items || [];\nconst today       = new Date().toISOString().slice(0, 10);\n\nconst alcoholGrams = items.reduce((s, i) => s + (i.alcohol_grams || 0) * (i.quantity || 1), 0);\n\nconst orderStr = items\n  .map(i => {\n    let s = i.quantity + 'x ' + i.name;\n    if (i.detail) s += ' ' + i.detail;\n    return s;\n  })\n  .join(', ');\n\nreturn [{ json: { name, orderTime, items, orderStr, alcoholGrams: Math.round(alcoholGrams * 10) / 10, today } }];"},"typeVersion":2},{"id":"114d6f2c-17f4-422b-b6d9-6072b6b3e9aa","name":"Log Order to Database","type":"n8n-nodes-base.dataTable","position":[2144,496],"parameters":{"columns":{"value":{"date":"={{ $json.today }}","item":"={{ $json.orderStr }}","person":"={{ $json.name }}","order_time":"={{ $json.orderTime }}","alcohol_grams":"={{ $json.alcoholGrams }}"},"schema":[{"id":"item","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"item","defaultMatch":false},{"id":"person","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"person","defaultMatch":false},{"id":"alcohol_grams","type":"number","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"alcohol_grams","defaultMatch":false},{"id":"date","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"date","defaultMatch":false},{"id":"order_time","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"order_time","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"dataTableId":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""}},"typeVersion":1.1},{"id":"52f52c12-7940-4364-9b77-1fa63ecbd2c5","name":"Read Today's Orders","type":"n8n-nodes-base.dataTable","position":[2384,496],"parameters":{"filters":{"conditions":[{"keyName":"person","keyValue":"={{ $('Calculate Alcohol and Format Order').item.json.name }}"},{"keyName":"date","keyValue":"={{ $('Calculate Alcohol and Format Order').item.json.today }}"}]},"matchType":"allConditions","operation":"get","returnAll":true,"dataTableId":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""}},"typeVersion":1.1},{"id":"634dc78b-3e39-4b2e-b030-ba4c734f7548","name":"Calculate Cumulative BAC","type":"n8n-nodes-base.code","position":[2608,496],"parameters":{"jsCode":"// Calculate cumulative BAC by reading today's rows from the DataTable\n// rows = all orders for this person today (including the one just inserted)\nconst rows       = $input.all().map(i => i.json);\nconst name       = $('Calculate Alcohol and Format Order').item.json.name;\nconst orderTime  = $('Calculate Alcohol and Format Order').item.json.orderTime;\nconst orderStr   = $('Calculate Alcohol and Format Order').item.json.orderStr;\n\nconst totalAlcohol = Math.round(rows.reduce((s, r) => s + (r.alcohol_grams || 0), 0) * 10) / 10;\nconst orderCount   = rows.length;\nconst bac          = totalAlcohol > 0 ? totalAlcohol / (70 * 0.68) : 0;\nconst bacStr       = bac.toFixed(2);\n\nconst E_OK    = String.fromCodePoint(0x1F7E2);\nconst E_WARN  = String.fromCodePoint(0x1F7E1);\nconst E_OVER  = String.fromCodePoint(0x1F534);\nconst E_NONE  = String.fromCodePoint(0x2B1C);\nconst E_LIST  = String.fromCodePoint(0x1F4CB);\nconst E_CLOCK = String.fromCodePoint(0x1F552);\nconst E_DRINK = String.fromCodePoint(0x1F378);\nconst E_WATER = String.fromCodePoint(0x1F964);\nconst E_TIME  = String.fromCodePoint(0x1F550);\n\nlet bacLevel;\nif      (bac === 0)  bacLevel = E_NONE;\nelse if (bac < 0.2)  bacLevel = E_OK;\nelse if (bac < 0.5)  bacLevel = E_WARN;\nelse                  bacLevel = E_OVER;\n\n// Previous orders = all rows except the last one (just inserted)\nconst prevOrders = rows.slice(0, -1);\nconst historyStr = prevOrders.length > 0\n  ? '\\n' + E_LIST + ' Already ordered today (' + prevOrders.length + ' orders):\\n'\n    + prevOrders.map(r => '  - ' + r.item + '  ' + E_CLOCK + ' ' + r.order_time).join('\\n')\n  : '';\n\nconst bacRow = totalAlcohol > 0\n  ? '\\n' + E_DRINK + ' BAC ~' + bacStr + ' g/L  ' + bacLevel\n  : '\\n' + E_WATER + ' no alcohol';\n\nconst message = name + ': ' + orderStr\n  + '\\n' + E_TIME + ' ' + orderTime\n  + historyStr\n  + bacRow;\n\nreturn [{\n  json: {\n    name,\n    orderTime,\n    orderStr,\n    message,\n    bac:          bacStr,\n    bacLevel,\n    totalAlcohol,\n    alcoholGrams: $('Calculate Alcohol and Format Order').item.json.alcoholGrams,\n    orderCount,\n    today: $('Calculate Alcohol and Format Order').item.json.today\n  }\n}];"},"typeVersion":2},{"id":"929d8f78-ead4-4545-8e45-77c32b8a5d16","name":"Send Ntfy Notification","type":"n8n-nodes-base.httpRequest","position":[2848,496],"parameters":{"url":"http://YOUR_NTFY_SERVER/YOUR_TOPIC","body":"={{ $json.message }}","method":"POST","options":{},"sendBody":true,"contentType":"raw","authentication":"genericCredentialType","rawContentType":"text/plain","genericAuthType":"httpHeaderAuth"},"typeVersion":4.4},{"id":"e1accf02-8716-4f2e-ae39-9b1dbc6bd392","name":"Announce Order with Home Assistant","type":"n8n-nodes-base.homeAssistant","position":[3088,496],"parameters":{"domain":"script","service":"announce_order","resource":"service","operation":"call","serviceAttributes":{"attributes":[{"name":"message","value":"={{ $json.name }} HAS ORDERED {{ $('When Order Received').item.json.body.items[0].name }}"}]}},"typeVersion":1}],"pinData":{},"connections":{"Read Today's Orders":{"main":[[{"node":"Calculate Cumulative BAC","type":"main","index":0}]]},"When Order Received":{"main":[[{"node":"Calculate Alcohol and Format Order","type":"main","index":0}]]},"Log Order to Database":{"main":[[{"node":"Read Today's Orders","type":"main","index":0}]]},"Send Ntfy Notification":{"main":[[{"node":"Announce Order with Home Assistant","type":"main","index":0}]]},"Calculate Cumulative BAC":{"main":[[{"node":"Send Ntfy Notification","type":"main","index":0}]]},"Calculate Alcohol and Format Order":{"main":[[{"node":"Log Order to Database","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":11,"nodeTypes":{"n8n-nodes-base.code":{"count":2},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.dataTable":{"count":2},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.httpRequest":{"count":1},"n8n-nodes-base.homeAssistant":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Paolo Ronco","username":"paoloronco","bio":"Cybersecurity Analyst passionate about automation, cloud, and infrastructure.\nSince discovering n8n, I automate everything I can: workflows, processes, integrations, and repetitive tasks.\nI love building, optimizing, and making systems more secure, faster, and scalable.","verified":true,"links":["https://paoloronco.it"],"avatar":"https://gravatar.com/avatar/f0b622283139bed01fcf8336ec78291bbd066c115b3b6b419b8b854ecbbb7097?r=pg&d=retro&size=200"},"nodes":[{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":498,"icon":"file:homeAssistant.svg","name":"n8n-nodes-base.homeAssistant","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.homeassistant/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/homeassistant/"}]},"categories":["Miscellaneous"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"output\"]","defaults":{"name":"Home Assistant"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNDAiIGhlaWdodD0iMjQwIiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjRjJGNEY5IiBkPSJNMjQwIDIyNC43NjJjMCA4LjI1LTYuNzUgMTUtMTUgMTVIMTVjLTguMjUgMC0xNS02Ljc1LTE1LTE1di05MGMwLTguMjUgNC43Ny0xOS43NjkgMTAuNjEtMjUuNjA5bDk4Ljc4LTk4Ljc4YzUuODMtNS44MyAxNS4zOC01LjgzIDIxLjIxIDBsOTguNzkgOTguNzg5YzUuODMgNS44MyAxMC42MSAxNy4zNiAxMC42MSAyNS42MXY5MHoiLz48cGF0aCBmaWxsPSIjMThCQ0YyIiBkPSJtMjI5LjM5IDEwOS4xNTMtOTguNzgtOTguNzhjLTUuODMtNS44My0xNS4zOC01LjgzLTIxLjIxIDBsLTk4Ljc5IDk4Ljc4QzQuNzggMTE0Ljk4MyAwIDEyNi41MTIgMCAxMzQuNzYydjkwYzAgOC4yNSA2Ljc1IDE1IDE1IDE1aDkyLjI3bC00MC42My00MC42M2MtMi4wOS43Mi00LjMyIDEuMTMtNi42NCAxLjEzLTExLjMgMC0yMC41LTkuMi0yMC41LTIwLjVzOS4yLTIwLjUgMjAuNS0yMC41IDIwLjUgOS4yIDIwLjUgMjAuNWMwIDIuMzMtLjQxIDQuNTYtMS4xMyA2LjY1bDMxLjYzIDMxLjYzdi0xMTUuODhjLTYuOC0zLjM0LTExLjUtMTAuMzItMTEuNS0xOC4zOSAwLTExLjMgOS4yLTIwLjUgMjAuNS0yMC41czIwLjUgOS4yIDIwLjUgMjAuNWMwIDguMDctNC43IDE1LjA1LTExLjUgMTguMzl2ODEuMjdsMzEuNDYtMzEuNDZjLS42Mi0xLjk2LS45Ni00LjA0LS45Ni02LjIgMC0xMS4zIDkuMi0yMC41IDIwLjUtMjAuNXMyMC41IDkuMiAyMC41IDIwLjUtOS4yIDIwLjUtMjAuNSAyMC41Yy0yLjUgMC00Ljg4LS40Ny03LjA5LTEuMjlMMTI5IDIwOC44OTJ2MzAuODhoOTZjOC4yNSAwIDE1LTYuNzUgMTUtMTV2LTkwYzAtOC4yNS00Ljc3LTE5Ljc3LTEwLjYxLTI1LjYxeiIvPjwvc3ZnPg=="},"displayName":"Home Assistant","typeVersion":1,"nodeCategories":[{"id":11,"name":"Miscellaneous"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1315,"icon":"fa:table","name":"n8n-nodes-base.dataTable","codex":{"data":{"alias":["data","table","knowledge","data table","table","sheet","database","data base","mysql","postgres","postgresql","airtable","supabase","noco","notion"],"details":"Data table","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.datatable/"}]},"categories":["Core Nodes","Development"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\",\"transform\"]","defaults":{"name":"Data table"},"iconData":{"icon":"table","type":"icon"},"displayName":"Data table","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":45,"name":"Miscellaneous"}],"image":[]}}