<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TephlonDude</title>
    <description>The latest articles on DEV Community by TephlonDude (@tephlondude).</description>
    <link>https://dev.to/tephlondude</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F473280%2Fd4b45f42-3f45-494b-be24-e2ea9903b49a.png</url>
      <title>DEV Community: TephlonDude</title>
      <link>https://dev.to/tephlondude</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tephlondude"/>
    <language>en</language>
    <item>
      <title>2021: The Year to Automate the New You with n8n ☀️</title>
      <dc:creator>TephlonDude</dc:creator>
      <pubDate>Mon, 18 Jan 2021 07:29:04 +0000</pubDate>
      <link>https://dev.to/n8n/2021-the-year-to-automate-the-new-you-with-n8n-2a7k</link>
      <guid>https://dev.to/n8n/2021-the-year-to-automate-the-new-you-with-n8n-2a7k</guid>
      <description>&lt;p&gt;The occasional indulgence is a good thing. The keyword there is “occasional”. I have found that with all of the strangeness that has gone on over the past year, it has become easier for me to indulge myself.&lt;/p&gt;

&lt;p&gt;Should I go out for a run? No, better “stay safe” and stay home baking the umpteenth batch of decadent cookies. Should I order that amazing new life-changing self-improvement book all my friends have been recommending to me? Naw, I’m already paying for all these streaming services and I’m sure that I will find something to watch that won’t put me into a coma.&lt;/p&gt;

&lt;p&gt;Sometimes, all it takes to get out of these ruts is a little nudge. A bit of a prod to move you closer where you know you should be mentally and physically.&lt;/p&gt;

&lt;p&gt;To assist with this, &lt;a href="https://n8n.io"&gt;n8n&lt;/a&gt; has put together a list of five workflows that can help you to meet your New Year’s resolution and start you on some great new habits.&lt;/p&gt;

&lt;h1&gt;
  
  
  New Recipes Emailed Daily
&lt;/h1&gt;

&lt;p&gt;Many of us want to start eating better in the new year. The holiday season tends to be a time when we allow ourselves to indulge in foods which may not be extremely healthy.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LhXVE4Wj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/a45m81fwo4kl5f5vtevl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LhXVE4Wj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/a45m81fwo4kl5f5vtevl.png" alt="Recipe"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example Recipe from Edamam&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The challenge comes when trying to figure out what healthy meals to make. It is too easy to simply say, “I don’t know what to make for supper so I will eat this entire family-sized back of potato chips instead!”.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://n8n.io/workflows/856"&gt;Daily Recipe Email&lt;/a&gt; workflow allows you to configure what type of meals you would like to eat. It will then daily send you three recipes from &lt;a href="https://www.edamam.com/"&gt;Edamam&lt;/a&gt; so that you can pick up groceries on the way home and make a healthy meal.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tracking Your (Crypto) Finances
&lt;/h1&gt;

&lt;p&gt;With Bitcoin reaching records highs over the last number of weeks, cryptocurrency is becoming more and more attractive when it comes to investing.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lS2Id8sp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4l9d5rq1odag1u9ilxf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lS2Id8sp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4l9d5rq1odag1u9ilxf6.png" alt="Crypto"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example AirTable Cryptocurrency Portfolio&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Using the &lt;a href="https://www.coingecko.com/"&gt;CoinGecko&lt;/a&gt; node, the &lt;a href="https://n8n.io/workflows/859"&gt;Crypto Portfolio Tracking&lt;/a&gt; workflow, you can set up your cryptocurrency portfolio! Watch all of the ups and downs as it records the running value of your crypto assets. It also shows you which of your assets are up and which ones are losing you money.&lt;/p&gt;

&lt;h1&gt;
  
  
  Read More Books
&lt;/h1&gt;

&lt;p&gt;Reading is one of the activities that can allow you to relax, destress and improve yourself all at the same time. But what book should you start next?&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CSu66atq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/22703csspr8bbaxalxjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CSu66atq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/22703csspr8bbaxalxjl.png" alt="Books"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example Book Recommendations from Open Library&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A workflow that &lt;a href="https://n8n.io/workflows/869"&gt;recommends books to read&lt;/a&gt; from the &lt;a href="https://openlibrary.org/"&gt;Open Library&lt;/a&gt; sounds like it may just be what you are looking for! You can schedule when and how frequently you receive a book recommendation (Friday afternoon, by default). The email provides you with the book title, a brief description, and links to the authors so that you can look for more of their writing.&lt;/p&gt;

&lt;h1&gt;
  
  
  Automate Your Task Planning
&lt;/h1&gt;

&lt;p&gt;Sometimes we feel like there is not enough time at the end of the day. One of the reasons this happens is because we do not plan or organize the tasks that we need to complete. Often, it is something that is mentioned to us as we are passing in the hallway which you completely forgot about by the time you got back to your office.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NV0HFht0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/12p8tzaskwpupqdqlh4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NV0HFht0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/12p8tzaskwpupqdqlh4g.png" alt="ClickUp"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;ClickUp with Automated Tasks&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But, if you set up a &lt;a href="https://n8n.io/workflows/865"&gt;workflow&lt;/a&gt; that uses a &lt;a href="https://www.typeform.com/"&gt;Typeform&lt;/a&gt; web form to gather the information about the task request directly from the user and then categorizes it properly into &lt;a href="https://app.clickup.com/"&gt;ClickUp&lt;/a&gt;, not only do you not need to remember the task, you don’t have to do the data entry, saving you time.&lt;/p&gt;

&lt;h1&gt;
  
  
  Get Daily Work-Out Encouragement
&lt;/h1&gt;

&lt;p&gt;With so many of us at home or working in offices, it can be difficult to get motivated to get up and get moving. “I’ll just sit here rather than getting up and going for a walk. Who’s going to know?”&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zcAcyhR0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pq03xc77ofs6dlwv6o8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zcAcyhR0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pq03xc77ofs6dlwv6o8i.png" alt="Strava"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sample Strava Activities‌‌&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you are using the &lt;a href="https://n8n.io/workflows/876"&gt;Activity Encouragement&lt;/a&gt; workflow, the answer is at least three people! This workflow monitors your &lt;a href="https://www.strava.com/"&gt;Strava&lt;/a&gt; account and checks to see if you have been active enough that day. If not, it will send an email to three of your friends who will reach out to you with words of (we hope) encouragement!&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;It is really easy for me to get into a routine that does not contribute to me being the best version of myself. I have found that little nudges from friends, family and, yes, even computers can make a huge difference in shaking me out of my “lather, rinse, repeat” life so that I can pursue becoming the person I know that I can be. My hope is that some of these tools that I have presented to you here can do that for you as well.&lt;/p&gt;

&lt;p&gt;Do you have an amazing idea of how to make the New Year fantastic using n8n? Feel free to message me on &lt;a href="https://twitter.com/tephlondude"&gt;Twitter&lt;/a&gt; or ask for help on our &lt;a href="https://community.n8n.io/"&gt;forum&lt;/a&gt; 🧡&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This &lt;a href="https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/"&gt;post&lt;/a&gt; originally appeared on the n8n.io &lt;a href="https://n8n.io/blog/"&gt;blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>lowcode</category>
      <category>automation</category>
      <category>tutorial</category>
      <category>selfimprovement</category>
    </item>
    <item>
      <title>How to host virtual coffee breaks with n8n ☕️</title>
      <dc:creator>TephlonDude</dc:creator>
      <pubDate>Mon, 11 Jan 2021 07:29:04 +0000</pubDate>
      <link>https://dev.to/n8n/how-to-host-virtual-coffee-breaks-with-n8n-f6k</link>
      <guid>https://dev.to/n8n/how-to-host-virtual-coffee-breaks-with-n8n-f6k</guid>
      <description>&lt;p&gt;Almost all of us have had to start something new, be it a new job or a new school. When I find myself in this situation, I make it my mission to do two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get to know as many people as possible&lt;/li&gt;
&lt;li&gt;Find out what tech they are using&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fortunately, &lt;a href="https://n8n.io/"&gt;n8n&lt;/a&gt; has a great way of doing both at once. Using this coffee chat workflow, I can familiarize myself with their systems and get to meet a bunch of people at the same time.&lt;/p&gt;

&lt;p&gt;This workflow automatically arranges coffee chats with people in Mattermost. It even schedules the appointment in their calendars! Virtual networking has never been so easy.&lt;/p&gt;

&lt;p&gt;In this article, we are going to learn how to build this workflow and then change it to accommodate different chat systems that you may find plus accommodate some differences in the technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;This article assumes that you have the following in place already:&lt;/p&gt;

&lt;h3&gt;
  
  
  n8n
&lt;/h3&gt;

&lt;p&gt;You will need a working copy of n8n. This can be either installed on your system or running on the new &lt;a href="https://n8n.cloud"&gt;n8n.io.cloud&lt;/a&gt; environment. This workflow was created in n8n version 0.101.0.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Calendar
&lt;/h3&gt;

&lt;p&gt;We will be using Google Calendar to send out the meeting requests. It is important that you have access to this online app and that you have already set up the credentials in n8n as outlined &lt;a href="https://docs.n8n.io/credentials/google/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chat Program
&lt;/h3&gt;

&lt;p&gt;You will need to have one of the two following chat programs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mattermost.com/"&gt;Mattermost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://matrix.org/"&gt;Matrix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please ensure that you have created accounts for one of these programs and set up the credentials for n8n to access them. If you need more information on setting up the credentials for these chat systems, please check out the appropriate set of documentation below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/credentials/mattermost/"&gt;Mattermost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/credentials/matrix/"&gt;Matrix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;If you are just here to get this workflow up and running and are not interested in figuring out what each of the nodes does, you can take a shortcut and download the already completed workflow located here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://n8n.io/workflows/853"&gt;Mattermost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://n8n.io/workflows/854"&gt;Matrix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please select the one that matches the technology and accounts that you have. All you will be required to do is paste the workflow into your copy of n8n and then modify the corresponding nodes for the chat system and Google Calendar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qZgzCa6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/image1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qZgzCa6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/image1.png" class="kg-image" alt=""&gt;&lt;/a&gt;Completed Mattermost Workflow&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mattermost Workflow
&lt;/h2&gt;

&lt;p&gt;There are four different nodes used in this workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.cron/"&gt;Cron&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.mattermost/"&gt;Mattermost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.function/"&gt;Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.googleCalendar/"&gt;Google Calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Cron Node
&lt;/h3&gt;

&lt;p&gt;We would like this workflow to run once a week each Monday. To accomplish that, we use the cron node. To configure this to run at 10:00 each Monday morning, we will set the node parameters as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mode&lt;/strong&gt;: Every Week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hour&lt;/strong&gt;: 10&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minute&lt;/strong&gt;: 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekday&lt;/strong&gt;: Monday&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you set each of these parameters, you can rename the cron node to &lt;em&gt;Weekly Trigger on Monday&lt;/em&gt; and close the node.&lt;/p&gt;

&lt;h3&gt;
  
  
  First Mattermost Node (Greetings)
&lt;/h3&gt;

&lt;p&gt;So, the first thing that we would like this workflow to do when the cron node triggers, is to post a quick message letting everybody know that the coffee groups are about to be released. To do this, set the following parameters in the Mattermost node:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mattermost API credentials&lt;/strong&gt;: &lt;em&gt;Select your credentials that you set up earlier&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt;: Message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: Post&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel ID&lt;/strong&gt;: &lt;em&gt;Your channel ID&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message&lt;/strong&gt;: 👋 Happy Monday! Groups for this week's virtual coffee are:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are not sure what the channel ID is for your Mattermost node, simply go to the title of the channel in the Mattermost page, click on the down chevron, and click on view info. This will pop up a new window telling you about your channel the channel ID is in fine print at the bottom left-hand corner of the window copy and paste this long string of letters into the channel ID field in the Mattermost node window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P2Rze-vE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P2Rze-vE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0.png" class="kg-image" alt=""&gt;&lt;/a&gt;Mattermost Channel ID&lt;/p&gt;

&lt;p&gt;You are now ready to test your Mattermost node click on the execute node button at the top right-hand corner of the node window. You should now see the contents of your message field posted in the appropriate Mattermost channel.&lt;/p&gt;

&lt;p&gt;You can rename the Mattermost node to &lt;em&gt;Greetings&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second Mattermost Node (Employees in Coffee Chat Channel)
&lt;/h3&gt;

&lt;p&gt;The next Mattermost node will get a complete list of everybody who is in the channel that you chose in the previous node. The difference between this node and the previous Mattermost node that you created is that this node is being used to retrieve information whereas the previous node was used to post information. To configure this node, enter the following into the Mattermost node fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mattermost API credentials&lt;/strong&gt;: &lt;em&gt;Select your credentials that you set up earlier&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt;: User&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: Get All&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return all&lt;/strong&gt;: On&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will also want to add a field below the standard Mattermost fields. Click the add field dropdown button and select &lt;em&gt;In Channel&lt;/em&gt; from the dropdown menu. In this field, use the Expression Editor to enter &lt;code&gt;{{$node["Greetings"].parameter["channelId"]}}&lt;/code&gt; so that the same channel ID is used as in the previous Mattermost node.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please note that you may receive an error message indicating that you do not have appropriate permissions on the server. This will not affect the results of this workflow.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7q4RUP-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0--1-.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7q4RUP-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0--1-.png" class="kg-image" alt=""&gt;&lt;/a&gt;Potential Error in Mattermost Node&lt;/p&gt;

&lt;p&gt;You can now test the second Mattermost node. Click the &lt;em&gt;Execute Node&lt;/em&gt; button at the top right-hand corner. You should get a list of all the users that are present in the channel along with some extra information.&lt;/p&gt;

&lt;p&gt;Once you have successfully retrieved this information you can rename the node &lt;em&gt;Employees in Coffee Chat Channel&lt;/em&gt; and close the node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Function Node
&lt;/h3&gt;

&lt;p&gt;The function node is now going to be used to perform a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put all users into an array&lt;/li&gt;
&lt;li&gt;Shuffle the list of channel users&lt;/li&gt;
&lt;li&gt;Break them up into groups of three&lt;/li&gt;
&lt;li&gt;If there is a group of just one, added to the previously created group&lt;/li&gt;
&lt;li&gt;Forward the groups on to the next nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since reading function node can be some of the most complicated parts of writing a workflow, we are going to just provide you with the contents of this function node so that you can quickly get moving on to the next step. Here is the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ideal_group_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data_as_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;newItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="c1"&gt;// Take all the users and add them to an array&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Fisher-Yates (aka Knuth) Shuffle&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currentIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;temporaryValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;randomIndex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// While there remain elements to shuffle...&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Pick a remaining element...&lt;/span&gt;
        &lt;span class="nx"&gt;randomIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;currentIndex&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;// And swap it with the current element.&lt;/span&gt;
        &lt;span class="nx"&gt;temporaryValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;randomIndex&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;randomIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;temporaryValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Randomize the sequence of names in the array&lt;/span&gt;
&lt;span class="nx"&gt;data_as_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create groups of ideal group size (3)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;ideal_group_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;ideal_group_size&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Make sure that no group has just one person. If it does, take&lt;/span&gt;
&lt;span class="c1"&gt;// one from previous group and add it to that group&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;newItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;groupsUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;groupsEmail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)}})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;newItems&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy and paste this code into the JavaScript code field in the function node. Rename the &lt;em&gt;function&lt;/em&gt; node &lt;em&gt;Divide into groups&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You can test to see if the code in the function node is working properly by pressing the &lt;em&gt;Execute Node&lt;/em&gt; button at the top right-hand corner of the node.&lt;/p&gt;

&lt;p&gt;You should get several array sets of three users each as your output. There is a chance that the last array will have two or four members in the array if the number of users in the channel is not evenly divisible by three. Close the &lt;em&gt;function&lt;/em&gt; node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Third Mattermost Node (Announce Groups)
&lt;/h3&gt;

&lt;p&gt;The next thing that we are going to do is send out a post with the names of the people who will be getting together in the coffee groups.&lt;/p&gt;

&lt;p&gt;Fill in the following parameters in this Mattermost node:&lt;/p&gt;

&lt;p&gt;Mattermost API credentials: select the credentials that were provided earlier&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mattermost API credentials&lt;/strong&gt;: select the credentials that were provided earlier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt;: message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: post&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel ID&lt;/strong&gt;: the channel that you used previously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message&lt;/strong&gt;: groups to be distributed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the information to go out properly, the message field will have to be filled out with an expression. Use the expression editor next to the message field and paste in the following:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;☀️ {{$node["Divide into groups"].json["groupsUsername"].join(', ')}}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will pull the user groups from the &lt;em&gt;function&lt;/em&gt; node and use their information. Close the expression editor.&lt;/p&gt;

&lt;p&gt;You can test your latest Mattermost node by clicking the &lt;em&gt;Execute Node&lt;/em&gt; button at the top right corner. If this worked properly, you will be able to see the coffee groups appear in the appropriate Mattermost channel. You can rename the Mattermost node to &lt;em&gt;Announce groups&lt;/em&gt; and close the node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Calendar Node
&lt;/h3&gt;

&lt;p&gt;The final thing we want to do with this workflow is to send out calendar invites to everyone in the groups. The &lt;em&gt;Google calendar&lt;/em&gt; node will perform this for us.&lt;/p&gt;

&lt;p&gt;Connect the &lt;em&gt;Google Calendar&lt;/em&gt; node to the &lt;em&gt;Divide into groups&lt;/em&gt; function node and set the following parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Calendar OAuth credentials:&lt;/strong&gt; select your Google calendar credentials or &lt;a href="https://docs.n8n.io/credentials/google/"&gt;set them up&lt;/a&gt; if this is the first time you have used them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt;: event&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: create&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar ID&lt;/strong&gt;: your calendar ID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start&lt;/strong&gt;: start date and time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End&lt;/strong&gt;: end date and time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use default reminder&lt;/strong&gt;: on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also want to use some additional fields in this node. Select and set the following additional fields using the add field dropdown button:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attendees:&lt;/strong&gt; use the expression editor and add the following for the expression: &lt;code&gt;{{$node["Divide into groups"].json["groupsEmail"].join(',')}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conference Data:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conference Link:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type:&lt;/strong&gt; Google Meet&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guests Can Modify:&lt;/strong&gt; On&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summary:&lt;/strong&gt; n8n coffee catchup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can test this node by clicking on the &lt;em&gt;Execute Node&lt;/em&gt; button at the top right corner.&lt;/p&gt;

&lt;p&gt;If everything works properly, each of the attendees should see a new calendar request in their calendar.&lt;/p&gt;

&lt;p&gt;You can rename the node &lt;em&gt;Send Calendar Invites&lt;/em&gt; and close the node.&lt;/p&gt;

&lt;p&gt;At this point, please save and active your node so that it runs on schedule! Your final result should look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HG88WWqI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0--2-.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HG88WWqI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0--2-.png" class="kg-image" alt=""&gt;&lt;/a&gt;Completed Mattermost Workflow&lt;/p&gt;

&lt;p&gt;If everything goes according to plan, every Monday at 10:00 AM you will get an invitation for coffee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different Technology
&lt;/h2&gt;

&lt;p&gt;Now if your new school or workplace uses Mattermost as their chat system, you're all set and ready to go. But, there are many different chat systems out there other than just Mattermost. Fortunately, n8n has you covered. It is simply a matter of replacing the Mattermost nodes with the comparable node from the other chat systems and fine-tuning the function node to support this new information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Substituting Matrix
&lt;/h3&gt;

&lt;p&gt;To use the Matrix messaging system rather than the Mattermost messaging system, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Delete the 3 Mattermost nodes from the workflow and replace them with Matrix nodes with the same names and connect them the same way they were connected in the Mattermost workflow.&lt;/li&gt;
&lt;li&gt;Configure the &lt;em&gt;Greetings&lt;/em&gt; node with the following settings:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Matrix API Credentials&lt;/strong&gt;: &lt;em&gt;Your credentials that you had previously set up&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt;: Message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: Create&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room ID&lt;/strong&gt;: &lt;em&gt;This should be the room name that you are using for the coffee chat meetings&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt;: 👋 Happy Monday Groups for this week's virtual coffee are:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message Type&lt;/strong&gt;: Text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message Format&lt;/strong&gt;: Plain Text&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Configure the &lt;em&gt;Employees in coffee chat channel&lt;/em&gt; node with the following settings:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Matrix API Credentials&lt;/strong&gt;: &lt;em&gt;Your credentials that you had previously set up&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt;: Room Member&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: Get All&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room ID&lt;/strong&gt;: &lt;em&gt;This should be the room name that you are using for the coffee chat meetings&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filters&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Membership&lt;/strong&gt;: Any&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Update the &lt;em&gt;Divide into groups&lt;/em&gt; function node with the following code so that it accepts the different output from the &lt;em&gt;Matrix&lt;/em&gt; node and it does not look for email addresses (since Matrix does not supply them):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ideal_group_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data_as_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;newItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="c1"&gt;// Take all the users and add them to an array&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Fisher-Yates (aka Knuth) Shuffle&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;currentIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;temporaryValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;randomIndex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// While there remain elements to shuffle...&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Pick a remaining element...&lt;/span&gt;
        &lt;span class="nx"&gt;randomIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;currentIndex&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;// And swap it with the current element.&lt;/span&gt;
        &lt;span class="nx"&gt;temporaryValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;randomIndex&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;randomIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;temporaryValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Randomize the sequence of names in the array&lt;/span&gt;
&lt;span class="nx"&gt;data_as_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create groups of ideal group size (3)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;ideal_group_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data_as_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;ideal_group_size&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Make sure that no group has just one person. If it does, take&lt;/span&gt;
&lt;span class="c1"&gt;// one from previous group and add it to that group&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;newItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;groupsUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)}})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;newItems&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure the *Announce groups *node with the following settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Matrix API Credentials&lt;/strong&gt;: &lt;em&gt;Your credentials that you had previously set up&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt;: Message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt;: Create&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room ID&lt;/strong&gt;: &lt;em&gt;This should be the room name that you are using for the coffee chat meetings&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt;: *Use the Expression editor to enter the following expression: *&lt;code&gt;☀️ {{$node["Divide into groups"].json["groupsUsername"].join(', ')}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message Type&lt;/strong&gt;: Text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message Format&lt;/strong&gt;: Plain Text&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Delete the &lt;em&gt;Calendar&lt;/em&gt; node. Since Matrix does not provide email addresses, there is nowhere to send out a calendar invite. (Maybe a shared Google Sheet with everyone’s account name and email address could be used as a lookup table in future versions! 🤔)&lt;/li&gt;
&lt;li&gt;Don’t forget to activate the workflow so that it runs every Monday&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your final Matrix workflow should look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--37s-yPHu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0--3-.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--37s-yPHu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://n8n.io/blog/content/images/2021/01/pasted-image-0--3-.png" class="kg-image" alt=""&gt;&lt;/a&gt;Completed Matrix Workflow&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;Now that we have this basic coffee chat workflow running properly in different environments using different technologies, where could we take this? Here are some ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send out calendar invites via the chat program using a calendar (ICS) file&lt;/li&gt;
&lt;li&gt;Integrate other chat technologies (e.g. Slack, Telegram, Teams, etc.)&lt;/li&gt;
&lt;li&gt;Create invitations to the actual video conference program (e.g. Zoom) and send the links&lt;/li&gt;
&lt;li&gt;Check people’s calendars and opt them out of the chat if they already have a meeting scheduled&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Our Journey
&lt;/h2&gt;

&lt;p&gt;We’ve covered a lot of ground today. Let’s review what we have accomplished:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Built a workflow for creating random groups of three for a virtual meeting and sent out the groupings using Mattermost along with an invitation to their calendars&lt;/li&gt;
&lt;li&gt;Modified the workflow to use the Matrix chat program rather than Mattermost, taking into account differences in technology.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’d love to hear about what you’ve built using n8n! Or if you’ve run into an issue while following the tutorial, feel free to reach out to me on &lt;a href="https://twitter.com/tephlondude"&gt;Twitter&lt;/a&gt; or ask for help on our &lt;a href="https://community.n8n.io/"&gt;forum&lt;/a&gt; 💙&lt;/p&gt;

</description>
      <category>lowcode</category>
      <category>automation</category>
      <category>tutorial</category>
      <category>chat</category>
    </item>
    <item>
      <title>Dashing Through The Data: Visualizing Metrics with n8n</title>
      <dc:creator>TephlonDude</dc:creator>
      <pubDate>Fri, 02 Oct 2020 16:37:10 +0000</pubDate>
      <link>https://dev.to/tephlondude/dashing-through-the-data-visualizing-metrics-with-n8n-8pk</link>
      <guid>https://dev.to/tephlondude/dashing-through-the-data-visualizing-metrics-with-n8n-8pk</guid>
      <description>&lt;p&gt;I use information from all over the internet. I visit hundreds of new web pages every day, both for personal and professional projects. It’s part of the process, and I’m happy to do it.&lt;/p&gt;

&lt;p&gt;But, every day, I also waste precious time checking the same old websites for other vital information; weather, news, stock portfolio, email, Twitter, work alerts, and so on. And we all have a list like this. And you may find yours just as frustrating.&lt;/p&gt;

&lt;p&gt;What annoys me the most is that the second I leave the site, I instantly wonder if the information has changed, and I stress out until I check it out again.&lt;/p&gt;

&lt;p&gt;I finally got so fed up with all this chasing after information! Instead of me going to look up information in twenty different places, why can’t this information come to me in one single spot?&lt;/p&gt;

&lt;p&gt;And that’s when it hit me 🥊&lt;/p&gt;

&lt;h3&gt;
  
  
  I Need a Dashboard!
&lt;/h3&gt;

&lt;p&gt;A dashboard makes so much sense! It can contain any information that I want! It can be updated several times a day and can be permanently displayed on a monitor. All I need to do is glance at it for a few seconds, and I know what is going on.&lt;/p&gt;

&lt;p&gt;What sealed the deal for me was that most web services can be easily queried with &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;n8n&lt;/a&gt;, which can then talk to &lt;a href="https://smashing.github.io/" rel="noopener noreferrer"&gt;Smashing&lt;/a&gt;, a dashboarding system. Combining these three technologies (web services, n8n and Smashing) would save me significant time every day and keep me better in the loop with what is going on in other areas of my life.&lt;/p&gt;

&lt;p&gt;And the best part? You can build your custom dashboard as well!&lt;/p&gt;

&lt;p&gt;In this article, we will pull information from &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;, &lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;npm&lt;/a&gt;, and &lt;a href="https://www.producthunt.com/" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; about the n8n project and then display it using a Smashing dashboard. Since this information is constantly changing, n8n will perform this every minute. The workflow for this project looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AIziHFaKQSDo9MHzgJa1DcQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AIziHFaKQSDo9MHzgJa1DcQ.png"&gt;&lt;/a&gt;n8n Dashboard Data Workflow&lt;/p&gt;

&lt;h3&gt;
  
  
  n8n and Smashing
&lt;/h3&gt;

&lt;p&gt;The two essential pieces of this project are &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;n8n&lt;/a&gt; and &lt;a href="https://smashing.github.io/" rel="noopener noreferrer"&gt;Smashing&lt;/a&gt;. They make up the core of the project and are very well suited to working together.&lt;/p&gt;

&lt;p&gt;Every minute, n8n gathers the data from the four data sources using their &lt;a href="https://en.wikipedia.org/wiki/API" rel="noopener noreferrer"&gt;API&lt;/a&gt; interfaces. It then takes this data and extracts the pieces which are useful and then pushes it to the Smashing dashboard.&lt;/p&gt;

&lt;p&gt;At this point, Smashing takes over and displays the information it receives from n8n based on how the dashboard was built inside the Docker container and which Smashing API endpoint receives the information.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Smashing Works
&lt;/h3&gt;

&lt;p&gt;While it is outside of the scope of this article to go into detail on how Smashing works, it is important for you to understand some of the fundamentals of Smashing.&lt;/p&gt;

&lt;p&gt;Each Smashing dashboard is made up of a series of widgets. Each widget displays a piece of information. This information is fed to the widget through the Smashing API. Each widget has its own unique API endpoint. When the endpoint receives information, the widget displays that information.&lt;/p&gt;

&lt;p&gt;These are the endpoints that have been created for this project and where their information originates:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AoJ6kxu7Z6EVOEAmHuR9zfA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AoJ6kxu7Z6EVOEAmHuR9zfA.png"&gt;&lt;/a&gt;Dashboard Widgets and Their Data Origins&lt;/p&gt;

&lt;p&gt;This dashboard API interface along with the widget types are defined in the &lt;em&gt;n8n_overview.erb&lt;/em&gt; file located in the docker container. (If you are interested in seeing how this file creates the dashboard, it is available &lt;a href="https://gist.github.com/TephlonDude/bb3d3b713af97b8e8d3c67d559048b0b" rel="noopener noreferrer"&gt;here&lt;/a&gt;.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;If you want to build this project yourself, you will need a couple of things ready to go before you start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;n8n&lt;/strong&gt;&lt;/a&gt; — You can get this up and running by checking out the &lt;a href="https://docs.n8n.io/getting-started/quickstart.html" rel="noopener noreferrer"&gt;Quickstart&lt;/a&gt; page. You should have a fresh install without any workflows.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/a&gt; — To save you time, we have built a Docker container with all of the Smashing pieces pre-configured. This way, you can have this piece running quickly and easily. For more information on setting up a Docker environment, please check out one of these &lt;a href="https://docker-curriculum.com/#setting-up-your-computer" rel="noopener noreferrer"&gt;tutorials&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub Account&lt;/strong&gt;&lt;/a&gt; — In order to ensure that you do not run into issues accessing the GitHub API, you can use your account to increase how frequently you can retrieve information from the API. If you do not have a GitHub account, you can &lt;a href="https://github.com/join" rel="noopener noreferrer"&gt;join here&lt;/a&gt; and you can learn how to set up your credentials for GitHub in n8n &lt;a href="https://docs.n8n.io/credentials/github/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.producthunt.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Product Hunt Account&lt;/strong&gt;&lt;/a&gt; — To use the Product Hunt API, you are required to authenticate with them using your account and a developer token (see “But… I just wanted to run a simple script?” in the &lt;a href="https://api.producthunt.com/v1/docs" rel="noopener noreferrer"&gt;Product Hunt API documentation&lt;/a&gt;). If you do not have an account with Product Hunt, you can &lt;a href="https://www.producthunt.com/login" rel="noopener noreferrer"&gt;sign up here&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;

&lt;p&gt;Many of you want to experience the result before committing to a project or already know the majority of what you will be learning in this article. For you, I have put together this &lt;strong&gt;Quick Start&lt;/strong&gt; option. Follow these steps to get up and running quickly. If something is unclear or you want to learn more about how it works, feel free to dig deeper into the sections that follow.&lt;/p&gt;

&lt;p&gt;Here are the quick start steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the docker container with the following two commands:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull tephlon/n8n\_dashboard

docker run --name n8n\_dashboard -d -p 8080:3030 --rm tephlon/n8n\_dashboard:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Copy the n8n workflow from &lt;a href="https://n8n.io/workflows/693" rel="noopener noreferrer"&gt;here&lt;/a&gt; and paste it into your n8n installation&lt;/li&gt;
&lt;li&gt;Modify the following nodes with your information. I have highlighted them in red in the workflow for easy identification:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard Configuration&lt;/strong&gt;  — set value of &lt;em&gt;dashboardHostname&lt;/em&gt; to your docker install&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve Product Hunt Data&lt;/strong&gt;  — set your &lt;em&gt;token&lt;/em&gt; value based on your &lt;a href="https://www.producthunt.com/v2/oauth/applications" rel="noopener noreferrer"&gt;developer token&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Set up your &lt;a href="https://docs.n8n.io/credentials/github/" rel="noopener noreferrer"&gt;GitHub credentials&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Activate workflow&lt;/li&gt;
&lt;li&gt;Browse to port 8080 of your docker installation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that you have a fully functioning dashboard, let’s take a look at what everything does, and maybe inspire you to tweak this workflow to suit your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Five Stages of an n8n Workflow
&lt;/h3&gt;

&lt;p&gt;I have noticed in many of the workflows that I create there are five distinct stages that the workflow goes through from start to finish and this workflow is no exception.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trigger&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Data Retrieval&lt;/li&gt;
&lt;li&gt;Data Processing&lt;/li&gt;
&lt;li&gt;Action&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is how the dashboard workflow looks broken up into these different stages:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Ah5cBoKw5C0aoS50p_QuQlw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Ah5cBoKw5C0aoS50p_QuQlw.png"&gt;&lt;/a&gt;The Five Stages of the n8n Dashboard Workflow&lt;/p&gt;

&lt;p&gt;Let’s work through setting up these five stages as they pertain to the dashboard project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1 — Trigger
&lt;/h3&gt;

&lt;p&gt;Every workflow has to be told how to start, and this is referred to as the trigger. In this project, we want to update the dashboard with new information every minute. We’ll use the &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.cron/" rel="noopener noreferrer"&gt;&lt;em&gt;Cron&lt;/em&gt;&lt;/a&gt; node for that.&lt;/p&gt;

&lt;p&gt;Set the &lt;strong&gt;Mode&lt;/strong&gt; parameter to &lt;em&gt;Every Minute&lt;/em&gt;. Doing this will run the workflow (you guessed it) every minute.&lt;/p&gt;

&lt;p&gt;Now, the workflow knows how and when to run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2 — Configuration
&lt;/h3&gt;

&lt;p&gt;The configuration stage is generally a little more defined in my workflows than they are for others. I like to create a &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.set/" rel="noopener noreferrer"&gt;&lt;em&gt;Set&lt;/em&gt;&lt;/a&gt; node with the majority of the configuration options so that they are all in one place (although there are exceptions to this rule which we will cover in a minute). For those of you who have developed in other tools before, you can think of this node as &lt;a href="https://en.wikipedia.org/wiki/Global_variable" rel="noopener noreferrer"&gt;global variables&lt;/a&gt; that are available to all other nodes within the workflow.&lt;/p&gt;

&lt;p&gt;Not all configuration settings are set at this time for two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The value is retrieved in a later stage&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Set&lt;/em&gt; node values get copied when exported. If you have sensitive data such as API tokens in a &lt;em&gt;Set&lt;/em&gt; node, they would also get exported (which would be bad)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a convention for myself, I like to color the borders of my nodes red that require configuration, and you will see that I have done this as well for this workflow.&lt;/p&gt;

&lt;p&gt;For the configuration of this workflow, we have created a &lt;em&gt;Set&lt;/em&gt; node called &lt;em&gt;Dashboard Configuration,&lt;/em&gt; which contains several string values. Most of these values can be ignored at this point, but if you want to customize the dashboard to monitor your project, this is where you would make these changes. (More on this later.)&lt;/p&gt;

&lt;p&gt;As described in the quick start section, the only change you need to add to the &lt;em&gt;Dashboard Configuration&lt;/em&gt; node is to set the &lt;em&gt;dashboardHostname&lt;/em&gt; value so that it matches your docker container deployment. This is very specific to your docker installation and deployment of the tephlon/n8n_dashboard container. If your n8n installation is on the same system as your docker installation, this will be &lt;em&gt;localhost:8080&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If docker is on a different system than your n8n installation, this value will be either &lt;em&gt;:8080&lt;/em&gt; or &lt;em&gt;:8080&lt;/em&gt;. So, if your docker installation is on 192.168.4.25, this value would be &lt;em&gt;192.168.4.25:8080&lt;/em&gt;. You should be able to get this information from your docker admin. (If it turns out that this person is you and you are uncertain about what this value is, I have found a handy &lt;a href="https://www.youtube.com/watch?v=mPEM557bMR4" rel="noopener noreferrer"&gt;YouTube video&lt;/a&gt; which may point you in the right direction.)&lt;/p&gt;

&lt;p&gt;This node is connected to the previous &lt;em&gt;Cron&lt;/em&gt; node so that these values are loaded every time that the workflow runs, and the values are reset if one of them gets accidentally changed by a different node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3 — Data Retrieval
&lt;/h3&gt;

&lt;p&gt;In this stage, we are collecting all of the data from the different data sources, often using settings from the configuration stage.&lt;/p&gt;

&lt;p&gt;We are using two different types of nodes to collect data, depending on the service. n8n has a built-in &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.github" rel="noopener noreferrer"&gt;&lt;em&gt;GitHub&lt;/em&gt;&lt;/a&gt; node, so it makes sense to use it for gathering the GitHub data. But, there are no custom nodes for the other three services, so we will use the &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.httpRequest/" rel="noopener noreferrer"&gt;&lt;em&gt;HTTP Request&lt;/em&gt;&lt;/a&gt; node to pull information from each service’s API.&lt;/p&gt;

&lt;p&gt;The output of the &lt;em&gt;Dashboard Configuration&lt;/em&gt; node connects into these four nodes. They then use these settings to know which project to be monitoring.&lt;/p&gt;

&lt;p&gt;You will need to change the settings in two nodes for this stage. The &lt;em&gt;GitHub&lt;/em&gt; node will need your &lt;a href="https://docs.n8n.io/credentials/github/" rel="noopener noreferrer"&gt;GitHub credentials&lt;/a&gt; to work, and the &lt;em&gt;Retrieve Product Hunt Data&lt;/em&gt; node will need your &lt;a href="https://www.producthunt.com/v2/oauth/applications" rel="noopener noreferrer"&gt;developer token&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You should now have the ability to retrieve all of the raw data provided by these services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 4 — Data Processing
&lt;/h3&gt;

&lt;p&gt;Now that we have this data, we need to make sure that it is in the proper format. The two challenges that need to be overcome are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Large numbers are difficult to read&lt;/li&gt;
&lt;li&gt;Decimal numbers are too long to display properly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To transform these values into something more usable, we will use the &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.function/" rel="noopener noreferrer"&gt;Function&lt;/a&gt; node. The Function node allows us to write our custom code when a pre-built node may not exist.&lt;/p&gt;

&lt;p&gt;A single Function node is added for each service and connected to the output of the nodes created to retrieve the service data.&lt;/p&gt;

&lt;p&gt;To add the thousands separator to a value, you reassign the original value with the updated value. The updated value is created by appending the value name with .toString().replace(/\B(?=(\d{3})+(?!\d))/g,","). This tells the system to convert the number to a string and replace every third space between characters with a comma.&lt;/p&gt;

&lt;p&gt;For example, to reformat the &lt;em&gt;pull_count&lt;/em&gt; from the Docker service, you would enter the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;items[0].json.pull\_count = items[0].json.pull\_count.toString().replace(/\B(?=(\d{3})+(?!\d))/g, “,”);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To round a value to two decimal places, we perform a similar action using the &lt;a href="https://www.w3schools.com/jsref/jsref_parsefloat.asp" rel="noopener noreferrer"&gt;&lt;em&gt;parseFloat&lt;/em&gt;&lt;/a&gt; function and &lt;a href="https://www.w3schools.com/jsref/jsref_tofixed.asp" rel="noopener noreferrer"&gt;&lt;em&gt;toFixed()&lt;/em&gt;&lt;/a&gt; method.&lt;/p&gt;

&lt;p&gt;So, to round the &lt;em&gt;score.final&lt;/em&gt; value from the npm service, use the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;items[0].json.score.final = parseFloat(items[0].json.score. **final**.toFixed(2));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each value that needs to be changed has the appropriate line of code added to its _Function _node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 5 — Action
&lt;/h3&gt;

&lt;p&gt;The final stage is the action. This is where the n8n workflow performs an action on something. In this case, the workflow posts a value to the dashboard API for a specific dashboard widget.&lt;/p&gt;

&lt;p&gt;For example, to update the number of GitHub Stars on the dashboard, the workflow needs to post the &lt;em&gt;stargazers_count&lt;/em&gt; value from the formatted data originally generated by the &lt;em&gt;GitHub&lt;/em&gt; node. This is performed using the &lt;em&gt;HTTP Request&lt;/em&gt; node, one for each widget.&lt;/p&gt;

&lt;p&gt;And that is the final piece! Once the workflow is activated, it will update all of the dashboard widgets every minute with the information it pulls from each service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring Your Own Project
&lt;/h3&gt;

&lt;p&gt;The one thing that most people will want to do is modify this workflow to monitor their own project. I have tried to make this easy by putting all of the changes in one the &lt;em&gt;Dashboard Configuration&lt;/em&gt; node.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;dashboardHostname (default &lt;em&gt;&lt;a href="http://192.168.1.14:8080" rel="noopener noreferrer"&gt;http://192.168.1.14:8080&lt;/a&gt;&lt;/em&gt;)&lt;/strong&gt;: This should be the hostname and port of your docker installation. See &lt;em&gt;Stage 2 — Configuration&lt;/em&gt; for more details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dashboardAuthToken (default &lt;em&gt;n8n-rocks!&lt;/em&gt;)&lt;/strong&gt;: Used to authenticate with the Smashing dashboard. There should be no need to change this unless you are playing around with the docker image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;product_hunt_post_id (default &lt;em&gt;170391&lt;/em&gt;)&lt;/strong&gt;: The post_id of the product that is being monitored at Product Hunt. You can find this number by going to your product page on Product Hunt and clicking on the &lt;em&gt;Embed&lt;/em&gt; button. In the embed code, look for &lt;a href="https://cards.producthunt.com/cards/posts/." rel="noopener noreferrer"&gt;&lt;em&gt;https://cards.producthunt.com/cards/posts/&lt;/em&gt;.&lt;/a&gt; The number immediately follows this string.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm_package (default &lt;em&gt;n8n&lt;/em&gt;)&lt;/strong&gt;: Name of the n8n package that is being monitored. You can find your project name by searching for your product at &lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;https://www.npmjs.com/&lt;/a&gt; and copying the name exactly as it is on the webpage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;docker_name (default &lt;em&gt;n8nio&lt;/em&gt;)&lt;/strong&gt;: Name of the user or organization who owns the docker repo being monitored. Find the repository that you are using at &lt;a href="https://hub.docker.com" rel="noopener noreferrer"&gt;https://hub.docker.com&lt;/a&gt; (e.g. &lt;em&gt;jim/nasium&lt;/em&gt;). This is the portion of the string before the “/” (e.g. &lt;em&gt;jim&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;docker_repository (default &lt;em&gt;n8n&lt;/em&gt;)&lt;/strong&gt;: Name of the docker repo being monitored. Find the repository that you are using at &lt;a href="https://hub.docker.com" rel="noopener noreferrer"&gt;https://hub.docker.com&lt;/a&gt; (e.g. &lt;em&gt;jim/nasium&lt;/em&gt;). This is the portion of the string after the “/” (e.g. &lt;em&gt;nasium&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;github_owner (default &lt;em&gt;n8n-io&lt;/em&gt;)&lt;/strong&gt;: Name of the user or organization who owns the GitHub repo being monitored. Find the repo that you will be monitoring at &lt;a href="https://github.com" rel="noopener noreferrer"&gt;https://github.com&lt;/a&gt; (e.g. &lt;em&gt;jim/nasium&lt;/em&gt;). This is the portion of the string before the “/” (e.g. &lt;em&gt;jim&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;github_repo (default &lt;em&gt;n8n&lt;/em&gt;)&lt;/strong&gt;: Name of the GitHub repo being monitored. Find the repo that you will be monitoring at &lt;a href="https://github.com" rel="noopener noreferrer"&gt;https://github.com&lt;/a&gt; (e.g. &lt;em&gt;jim/nasium&lt;/em&gt;). This is the portion of the string after the “/” (e.g. &lt;em&gt;nasium&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If there are any of these services which you do not wish to monitor, delete the link between that services’ data retrieval node and the &lt;em&gt;Cron&lt;/em&gt; node. This will prevent the node from capturing the data and the widgets on the dashboard will remain unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s Next?
&lt;/h3&gt;

&lt;p&gt;We have just touched the tip of the iceberg when it comes to dashboarding. Some other ideas that are possible include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charting stock prices&lt;/li&gt;
&lt;li&gt;Displaying weather&lt;/li&gt;
&lt;li&gt;Aggregating RSS feeds&lt;/li&gt;
&lt;li&gt;Monitoring Twitter feeds&lt;/li&gt;
&lt;li&gt;Showing videos from a YouTube channel&lt;/li&gt;
&lt;li&gt;Company phone activity&lt;/li&gt;
&lt;li&gt;Personnel in/out board&lt;/li&gt;
&lt;li&gt;Fleet vehicle tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Our Journey
&lt;/h3&gt;

&lt;p&gt;We’ve covered a lot of ground today. Let’s review what we have accomplished:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installed the custom dashboard in Docker&lt;/li&gt;
&lt;li&gt;Set the workflow to run every minute&lt;/li&gt;
&lt;li&gt;Designed a global configuration node to easily manage common variables&lt;/li&gt;
&lt;li&gt;Gathered data from four different online services&lt;/li&gt;
&lt;li&gt;Modified the data so that is displays properly&lt;/li&gt;
&lt;li&gt;Pushed the information for display in the dashboard using its API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’d love to hear about what you’ve built using n8n! Or if you’ve run into an issue while following the tutorial, feel free to reach out to me on &lt;a href="https://twitter.com/tephlondude" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or ask for help on our &lt;a href="https://community.n8n.io/" rel="noopener noreferrer"&gt;forum&lt;/a&gt; 💙&lt;/p&gt;




</description>
      <category>n8n</category>
      <category>metrics</category>
      <category>visualization</category>
      <category>nocodeplatform</category>
    </item>
    <item>
      <title>A LowCode Dashboard?</title>
      <dc:creator>TephlonDude</dc:creator>
      <pubDate>Tue, 22 Sep 2020 11:06:38 +0000</pubDate>
      <link>https://dev.to/tephlondude/a-lowcode-dashboard-2o5l</link>
      <guid>https://dev.to/tephlondude/a-lowcode-dashboard-2o5l</guid>
      <description>&lt;p&gt;Did you know that it is possible to have this dashboard up and running with live data in under 5 minutes?&lt;/p&gt;

</description>
      <category>lowcode</category>
      <category>dashboard</category>
      <category>data</category>
      <category>workflow</category>
    </item>
    <item>
      <title>Build your own virtual assistant with n8n: A step by step guide 👦</title>
      <dc:creator>TephlonDude</dc:creator>
      <pubDate>Tue, 15 Sep 2020 07:29:04 +0000</pubDate>
      <link>https://dev.to/n8n/nathan-your-n8n-virtual-assistant-1iha</link>
      <guid>https://dev.to/n8n/nathan-your-n8n-virtual-assistant-1iha</guid>
      <description>&lt;p&gt;There is a lot to do for the average person living in the 21st century. Between work, family, and personal obligations, it is not uncommon for someone to get up early in the morning and run hard all day long just to collapse in bed that night with a list of tasks still unfinished.&lt;/p&gt;

&lt;p&gt;Many people will turn to a virtual assistant to help them with these daily tasks. This can take the form of someone who works remotely for you, receiving direction through the internet. But, more recently, a new type of virtual assistant has emerged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pQh4iPLp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AJ2KTpAtx6rmUdtzmNALWcA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pQh4iPLp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AJ2KTpAtx6rmUdtzmNALWcA.jpeg" alt=""&gt;&lt;/a&gt;Nathan: Your n8n Virtual Assistant&lt;/p&gt;

&lt;p&gt;This is the electronic virtual assistant. They are not people at all. Rather, they are programs on our computer/phone or devices that sit on our kitchen counter at home. Two well known examples of these virtual assistants are the &lt;a href="https://en.wikipedia.org/wiki/Amazon_Alexa"&gt;Amazon Alexa&lt;/a&gt; and the &lt;a href="https://en.wikipedia.org/wiki/Google_Assistant"&gt;Google Assistant&lt;/a&gt;. They can find details about your day or retrieve information for you quickly and (sometimes) easily.&lt;/p&gt;

&lt;p&gt;The one challenge with these virtual assistants is that, at their core, they have a number of basic abilities that can be augmented with different skills created by either the manufacturer or a 3rd party. Because of this model, the majority of the abilities available from your personal assistant do not apply to you and, even worse, they may not have the ability to actually perform the tasks that you want them to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Lesson from Suits
&lt;/h3&gt;

&lt;p&gt;If you’ve watched even just one episode of the television series &lt;a href="https://www.usanetwork.com/suits"&gt;Suits&lt;/a&gt;, it becomes pretty apparent almost immediately that, despite all of his self confidence, the main character &lt;a href="https://suits.fandom.com/wiki/Harvey_Specter"&gt;Harvey&lt;/a&gt; would not be where he is today without his personal assistant &lt;a href="https://suits.fandom.com/wiki/Donna_Paulsen"&gt;Donna&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Donna knows what Harvey wants before Harvey does. Donna anticipates Harvey’s needs and acts on them so that by time Harvey realizes he needs something, Donna has already done it. She is the glue that holds his life together.&lt;/p&gt;

&lt;p&gt;Wouldn’t it be wonderful if our virtual assistants were more like Donna?&lt;/p&gt;

&lt;p&gt;Well, I may have some good news for you!&lt;/p&gt;

&lt;h3&gt;
  
  
  Nathan is Here to Help
&lt;/h3&gt;

&lt;p&gt;While it would be impossible to completely recreate the &lt;a href="https://www.youtube.com/watch?v=3TMNcCquWhg"&gt;awesome that is Donna&lt;/a&gt;, we can definitely put together a useful virtual assistant who can deal with some of the day to day details that somehow find a way to consume our lives!&lt;/p&gt;

&lt;p&gt;In this article, we are going to show you how to build your very own virtual assistant using many of the services that you already use today and connecting them all together with &lt;a href="https://n8n.io/"&gt;n8n&lt;/a&gt;. To add a personal touch to our virtual assistant we are going to call him Nathan.&lt;/p&gt;

&lt;p&gt;Throughout this article, I’m going to use a Suits analogy. If you haven’t watched Suits, that’s OK! Everything will still make sense so feel free to ignore it! 😄&lt;/p&gt;

&lt;h4&gt;
  
  
  Goals
&lt;/h4&gt;

&lt;p&gt;We are going to set some specific short term goals which we will complete during this article and then some long term goals which are ideas we can add-on at a later date once we build this initial framework.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give Nathan the ability to perform basic email management&lt;/li&gt;
&lt;li&gt;Set up a way to communicate with Nathan behind the scenes&lt;/li&gt;
&lt;li&gt;Give Nathan some sass!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Prerequisites
&lt;/h4&gt;

&lt;p&gt;In order to get Nathan up and running, we need to have the following in place:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://n8n.io/"&gt;&lt;strong&gt;n8n &lt;/strong&gt;&lt;/a&gt;— You can get this up and running by checking out the &lt;a href="https://docs.n8n.io/getting-started/quickstart.html"&gt;Quickstart&lt;/a&gt; page. You should have a fresh install without any workflows. You can also sign-up for &lt;a href="https://n8n.cloud"&gt;n8n.cloud&lt;/a&gt; to get access to our hosted service. This workflow was created in n8n version 0.104.2.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://slack.com/"&gt;&lt;strong&gt;Slack&lt;/strong&gt;&lt;/a&gt; — You will need a Slack workspace set up with at least one account for the person who is being assisted. You can find information about your Slack requirements &lt;a href="https://docs.n8n.io/credentials/slack/"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mail.yahoo.com/"&gt;&lt;strong&gt;Yahoo Mail&lt;/strong&gt;&lt;/a&gt; — This is used for communication between our users. (Please note that I have decided to use Yahoo mail but most other mail providers will work as well. For example, &lt;a href="https://docs.n8n.io/credentials/imap/#using-gmail"&gt;Gmail&lt;/a&gt;, &lt;a href="https://support.microsoft.com/en-us/office/pop-imap-and-smtp-settings-for-outlook-com-d088b986-291d-42b8-9564-9c414e2aa040"&gt;Outlook.com&lt;/a&gt;, &lt;a href="https://www.zoho.com/mail/help/zoho-smtp.html"&gt;Zoho&lt;/a&gt; and others are fine to use.) Set up the Yahoo mail credentials following the instructions mentioned &lt;a href="https://docs.n8n.io/credentials/imap/#using-yahoo-mail"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  n8n
&lt;/h4&gt;

&lt;p&gt;The core of our Nathan is the &lt;a href="https://n8n.io/"&gt;n8n&lt;/a&gt; system. It has two primary purposes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect services together that do not presently talk with each other&lt;/li&gt;
&lt;li&gt;Provide the logic for how these services interact&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  A Note About Screenshots and the Start Node
&lt;/h4&gt;

&lt;p&gt;The Start node is the default node for a workflow and can’t be removed. It’s used to initiate processing in a workflow that doesn’t begin with a trigger node (something you’ll learn about next). In the screenshots, the Start node has been omitted for clarity. You can also get &lt;a href="https://n8n.io/workflows/632"&gt;your own copy of the workflow&lt;/a&gt; to help you follow along as we go.&lt;/p&gt;

&lt;p&gt;Okay, enough of the preamble. Let’s get this project started!&lt;/p&gt;

&lt;h3&gt;
  
  
  You’ve Got Mail!
&lt;/h3&gt;

&lt;p&gt;The first ability that we want to give Nathan is to work with Harvey’s email. We are going to accomplish this using two integrations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.emailReadImap"&gt;&lt;em&gt;EmailReadImap&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;— reads email from an IMAP enabled mailbox and executes a workflow. This node is sometimes referred to as &lt;em&gt;IMAP Email&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.emailSend/"&gt;&lt;em&gt;Send Email&lt;/em&gt;&lt;/a&gt; — sends emails using information received by the node from a workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Reading Email
&lt;/h4&gt;

&lt;p&gt;The first node we are going to configure is the &lt;em&gt;EmailReadImap&lt;/em&gt; node. This node will allow Nathan to monitor Harvey’s email and then perform actions based on the email.&lt;/p&gt;

&lt;h4&gt;
  
  
  Add the EmailReadImap Node
&lt;/h4&gt;

&lt;p&gt;The first step is to add the node into the workflow. To do this, follow these steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tLqfcZtm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/364/0%2A9GUEM8dAheiJlU0w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tLqfcZtm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/364/0%2A9GUEM8dAheiJlU0w" alt=""&gt;&lt;/a&gt;EmailReadImap node parameters&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the &lt;strong&gt;+&lt;/strong&gt; button in the top right corner&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;All&lt;/strong&gt; tab, find the &lt;em&gt;EmailReadImap&lt;/em&gt; node and click on it to open up the node parameters&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Parameters&lt;/strong&gt; tab, under &lt;strong&gt;Credentials &amp;gt; IMAP&lt;/strong&gt; select &lt;em&gt;— Create New &lt;/em&gt;— and enter the credentials you &lt;a href="https://docs.google.com/document/d/1dfKs-SYZRH1UMyz5aI1WmVdFdu5uCi4ltebvsQnmqmg/edit#heading=h.ox1dr0oe3c5f"&gt;created earlier&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I’ve also chosen to change the name of the node to &lt;em&gt;Read Harvey’s Email&lt;/em&gt; so that we will know exactly what this node does when looking at the workflow (Trust me, this helps later on when things get really complicated). We rename nodes by opening the node, clicking on the title of the node at the top left corner to enable renaming the node, edit the name and then click on the ✔ to set the new node name.&lt;/li&gt;
&lt;li&gt;You can leave the rest of the options as defaults&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Test the EmailReadImap Node
&lt;/h4&gt;

&lt;p&gt;Before we move on, let’s test the &lt;em&gt;EmailReadImap&lt;/em&gt; node to ensure that it is working properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Save any changes you made to your workflow before you test it. This way, you will not lose your work if you run into any problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dlbbv6C1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A4sMeF7beEw1udye2" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dlbbv6C1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A4sMeF7beEw1udye2" alt=""&gt;&lt;/a&gt;Email waiting for Harvey&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure that there is an unread email for the node to read. As it turns out, it appears that Louis has plans for him and Harvey after court this evening&lt;/li&gt;
&lt;li&gt;In the open &lt;em&gt;EmailReadImap&lt;/em&gt; node, click on the &lt;strong&gt;Execute Node&lt;/strong&gt; button in the top right corner. This will get the node to reach out and read Harvey’s email.&lt;/li&gt;
&lt;li&gt;If everything works right, you should get a table of information in the right hand pane with the following information:
• &lt;strong&gt;textHTML&lt;/strong&gt; : The message body in HTML format
• &lt;strong&gt;textPlain&lt;/strong&gt; : The message body in plain text format
• &lt;strong&gt;metadata&lt;/strong&gt; : All of the information that is needed for the mail client to read the message (mainly looks like gibberish)
• &lt;strong&gt;date&lt;/strong&gt; : Time and date that the message was sent
• &lt;strong&gt;from&lt;/strong&gt; : Name and email address of the person who sent the message
• &lt;strong&gt;to&lt;/strong&gt; : Name and email address of the person who sent the message
• &lt;strong&gt;subject&lt;/strong&gt; : The subject line of the email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If we go back into Harvey’s email, we will also see that the email from Louis is now marked as read compared to the unread message from Mike that came in after we tested the node:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--86Zln1a7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/668/0%2Afz7kt_8nB20OJkPp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--86Zln1a7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/668/0%2Afz7kt_8nB20OJkPp" alt=""&gt;&lt;/a&gt;Email after executing node and new mail has come in&lt;/p&gt;

&lt;p&gt;You can now close the node and your workflow should look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--weigThEh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A-Ic8RNfkUReewXNj" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--weigThEh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A-Ic8RNfkUReewXNj" alt=""&gt;&lt;/a&gt;Workflow after adding &lt;em&gt;EmailReadImap node&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because the &lt;em&gt;EmailReadImap&lt;/em&gt; node is a trigger node, it does not have an input but it is triggered each time a new email is detected so that the email can be processed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making a Decision
&lt;/h3&gt;

&lt;p&gt;Now that we have the email, what do we do with it? Well, Harvey has given Nathan explicit instructions that he does not want to waste time on any of Louis’s emails. So, Nathan is going to check who sent the email.&lt;/p&gt;

&lt;p&gt;There are a couple of ways to do this in n8n:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.if/"&gt;&lt;strong&gt;&lt;em&gt;IF&lt;/em&gt; node&lt;/strong&gt;&lt;/a&gt;: Checks a parameter and performs one action if it results in a true result and performs another if it results in a false result&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.if/"&gt;&lt;strong&gt;&lt;em&gt;Switch&lt;/em&gt; node&lt;/strong&gt;&lt;/a&gt;: Checks a parameter and performs one of many actions, depending upon the value of the parameter.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While either would work for Nathan, we are going to use the &lt;em&gt;Switch&lt;/em&gt; node because it allows us more flexibility for further expansion later.&lt;/p&gt;

&lt;p&gt;Once you have added the &lt;em&gt;Switch&lt;/em&gt; node and made sure that the output from the &lt;em&gt;EmailReadImap&lt;/em&gt; node is connected to the input of the new &lt;em&gt;Switch&lt;/em&gt; node, this is how we are going to configure it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c3o4Pi1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/364/0%2AsWu8-zp2tVTMY9T6" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c3o4Pi1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/364/0%2AsWu8-zp2tVTMY9T6" alt=""&gt;&lt;/a&gt;Final Switch node Parameters&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set the following parameters in the &lt;strong&gt;Parameters&lt;/strong&gt; section:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mode&lt;/strong&gt; : Rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Type&lt;/strong&gt; : String&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;Value 1&lt;/strong&gt; , click on the gears icon to the right of the field and click on &lt;em&gt;Add Expression&lt;/em&gt; in the dropdown menu to open up the variable selector windows&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Current Node &amp;gt; Input Data &amp;gt; JSON &amp;gt; from&lt;/strong&gt;. You should see the expression display &lt;code&gt;{{$json[“from”]}}&lt;/code&gt; and the result below it read &lt;em&gt;Louis Litt &amp;lt;louis_litt_&lt;a href="mailto:1970@yahoo.com"&gt;1970@yahoo.com&lt;/a&gt;&amp;gt;&lt;/em&gt;. This displays the expression that you need to look for and what it is presently based on the information provided by the previous node.&lt;/li&gt;
&lt;li&gt;Close the &lt;strong&gt;Edit Expression&lt;/strong&gt; window&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Routing Rules:&lt;/strong&gt; , click the &lt;strong&gt;Add Routing Rule&lt;/strong&gt; button. Three new labels and fields appear&lt;/li&gt;
&lt;li&gt;Fill in the rule fields as follows:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt; : Equal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value 2&lt;/strong&gt; : Louis Litt &amp;lt;louis_litt_&lt;a href="mailto:1970@yahoo.com"&gt;1970@yahoo.com&lt;/a&gt;&amp;gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output&lt;/strong&gt; : 0&lt;/li&gt;
&lt;li&gt;Beneath the &lt;strong&gt;Add Routing Rule&lt;/strong&gt; button, select &lt;em&gt;3&lt;/em&gt; for the &lt;strong&gt;Fallback Output&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That completes the configuration of the &lt;em&gt;Switch&lt;/em&gt; node. What we have told it to do is this:&lt;/p&gt;

&lt;p&gt;If the unread email is from Louis, send it for further processing. Otherwise, let it go through.&lt;/p&gt;

&lt;p&gt;I’ve also taken the liberty of renaming the node &lt;em&gt;Who Is The Email From?&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Test the Switch Node
&lt;/h4&gt;

&lt;p&gt;To test the &lt;em&gt;Switch&lt;/em&gt; node, simply click on the &lt;strong&gt;Execute Node&lt;/strong&gt; button at the top right corner of the node. If we have configured everything correctly, you should see an indicator above the output side of the node windows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hNoEvn8m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/270/0%2ACW--GbyyPNdCkGgq" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hNoEvn8m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/270/0%2ACW--GbyyPNdCkGgq" alt=""&gt;&lt;/a&gt;Switch Node Output Indicator&lt;/p&gt;

&lt;p&gt;This is telling me that we are seeing the results for &lt;strong&gt;Output 0&lt;/strong&gt;. It is also telling me that the &lt;em&gt;Switch&lt;/em&gt; node sent information out of &lt;strong&gt;Output 0&lt;/strong&gt; and this information is displayed below. In this case, it is the JSON data that was received in the input sent from the &lt;em&gt;EmailReadImap&lt;/em&gt; node (i.e. the contents of the email).&lt;/p&gt;

&lt;p&gt;If you were to click on the dropdown field beside the &lt;strong&gt;Output&lt;/strong&gt; label, the &lt;strong&gt;Results&lt;/strong&gt; would change and the output information below would also change to reflect the results and the output from the selected  &lt;strong&gt;Output&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can now close the &lt;em&gt;Switch&lt;/em&gt; node. The workflow now looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t8bO3TzN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AeIID1FOGRm_YrirC" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t8bO3TzN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AeIID1FOGRm_YrirC" alt=""&gt;&lt;/a&gt;Workflow after Switch node added&lt;/p&gt;

&lt;h3&gt;
  
  
  Making Up Excuses
&lt;/h3&gt;

&lt;p&gt;Since Harvey doesn’t want to do anything with Louis, Nathan needs to make up a good excuse for Harvey. Fortunately, he has several (13,800 to be exact) excuses ready to go. We just need to build the excuse generator for him.&lt;/p&gt;

&lt;p&gt;There are three separate nodes to this part of the system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.readBinaryFile/"&gt;&lt;em&gt;Read Binary File&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.spreadsheetFile/"&gt;&lt;em&gt;Spreadsheet File&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.function/"&gt;&lt;em&gt;Function&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Spreadsheet Node Note
&lt;/h4&gt;

&lt;p&gt;While I chose to create a copy of the Google Sheet as an Excel spreadsheet and then access it from the &lt;em&gt;Read Binary File&lt;/em&gt; node, I could have just as easily accessed the information directly from Google Sheets using the &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.googleSheets/"&gt;&lt;em&gt;Google Sheets&lt;/em&gt; node&lt;/a&gt;. For bonus points, see if you can replace the &lt;em&gt;Read Binary File&lt;/em&gt; and &lt;em&gt;Spreadsheet File&lt;/em&gt; nodes with a &lt;em&gt;Google Sheets&lt;/em&gt; node&lt;/p&gt;

&lt;h4&gt;
  
  
  Create a Spreadsheet
&lt;/h4&gt;

&lt;p&gt;The raw data for the generator is stored in an Excel spreadsheet. You can see the Google Sheets version yourself &lt;a href="https://docs.google.com/spreadsheets/d/1mZXiALzjpcGhtDzpweJmQ1jYJBhkv92x855lumoLqi8/edit?usp=sharing"&gt;here&lt;/a&gt;. Download the file as an Excel spreadsheet and then save it in the same folder where you have installed n8n.&lt;/p&gt;

&lt;p&gt;This spreadsheet acts like a database and stores each separate part of the excuse in the file. This spreadsheet should be installed somewhere that the n8n server can get access to; either on the n8n server itself or a remotely mounted network share.&lt;/p&gt;

&lt;h4&gt;
  
  
  Read Data as Binary Information
&lt;/h4&gt;

&lt;p&gt;Next, we have to load the binary file into the system. This is done using a &lt;em&gt;Read Binary File&lt;/em&gt; node. There are only two parameters for this node:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;File Path&lt;/strong&gt; : The full file path to the spreadsheet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Property Name&lt;/strong&gt; : The property which will contain the binary data. This can be left as the default &lt;em&gt;data&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once they are set, the node can be closed.&lt;/p&gt;

&lt;h4&gt;
  
  
  Retrieve Information from Spreadsheet
&lt;/h4&gt;

&lt;p&gt;We can now actually view the information stored in the spreadsheet. Using the &lt;em&gt;Spreadsheet File&lt;/em&gt; node, we can retrieve the binary data output from the previous node.&lt;/p&gt;

&lt;p&gt;The two parameters to set are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt; : Since we are reading from the file, we set the value to &lt;em&gt;Read from file&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binary Property&lt;/strong&gt; : This needs to match the &lt;strong&gt;Property Name&lt;/strong&gt; value entered in the &lt;em&gt;Read Binary File&lt;/em&gt; node previously&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Create the Excuse
&lt;/h4&gt;

&lt;p&gt;The final node in our excuse generator workflow is a &lt;em&gt;Function&lt;/em&gt; node. The &lt;em&gt;Function&lt;/em&gt; node is a bit special because it gives you the freedom to do pretty much anything you want with the data that it receives and spit out whatever you want on the other side as long as it follows the proper data structure (See &lt;a href="https://docs.n8n.io/reference/data/data-structure.html"&gt;Data Structure&lt;/a&gt; for more information).&lt;/p&gt;

&lt;p&gt;This is the code that runs in the _Function _node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var leadinmax = 24;
var perpmax = 25;
var delaymax = 23;
var leadin = Math.floor((Math.random() \* leadinmax ) + 1);
var perp = Math.floor((Math.random() \* perpmax ) + 1);
var delay = Math.floor((Math.random() \* delaymax) + 1);

var excuse = items[leadin].json.Leadin + “ “ + items[perp].json.Perpetrator + “ “ + items[delay].json.Delay;

items = [{json:{}}];

items[0].json.excuse = excuse;
return items;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lines 1–3&lt;/strong&gt; : The number of entries that are available for each of the three portions of the excuse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines 4–6&lt;/strong&gt; : Generates a random number to retrieve a random excuse portion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line 8&lt;/strong&gt; : Creates the excuse from the three randomly selected portions pulled from the Spreadsheet node&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line 10&lt;/strong&gt; : Clears all the data originally retrieved from the Spreadsheet node so there isn’t any unused data consuming resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line 12&lt;/strong&gt; : Adds the excuse to the JSON data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line 13&lt;/strong&gt; : Sends the data to the next node&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When done, our workflow now looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QlIlKy7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AZA1u1xj3_wc_QAB2" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QlIlKy7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AZA1u1xj3_wc_QAB2" alt=""&gt;&lt;/a&gt;Workflow with Excuse Nodes Added&lt;/p&gt;

&lt;p&gt;Next, Nathan is going to make sure that Harvey is not stuck with Louis in a vat of mud this evening.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not Tonight!
&lt;/h3&gt;

&lt;p&gt;Now that Nathan has the perfect excuse to get Harvey out of that appointment with Louis, he will email Louis (as Harvey) and let him know that Harvey will not be there.&lt;/p&gt;

&lt;p&gt;To do this, we need to use the &lt;em&gt;Merge&lt;/em&gt; node to combine the excuse with the mail information and then feed that data into the &lt;em&gt;Send Email&lt;/em&gt; node which will send the reply to Louis.&lt;/p&gt;

&lt;h4&gt;
  
  
  Merging the Information
&lt;/h4&gt;

&lt;p&gt;Some nodes do not forward the information they received along to the nodes that follow so the &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.merge/"&gt;&lt;em&gt;Merge&lt;/em&gt; node&lt;/a&gt; is useful to retrieve that information and add it to other information for processing together. So, we are going to add a &lt;em&gt;Merge&lt;/em&gt; node to the workflow and connect the output from the Generate Excuse Function node to Input 1 of the _Merge _node.&lt;/p&gt;

&lt;p&gt;Next, we are going to take a second connector from &lt;strong&gt;Output 0&lt;/strong&gt; of the &lt;em&gt;Switch&lt;/em&gt; node (this contains the email information) and attach it to &lt;strong&gt;Input 2&lt;/strong&gt; of the _Merge _node.&lt;/p&gt;

&lt;p&gt;Inside the &lt;em&gt;Merge&lt;/em&gt; node, there are two parameters that we are going to set:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mode&lt;/strong&gt; : &lt;em&gt;Merge By Index&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join&lt;/strong&gt; : &lt;em&gt;Left Join&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By setting these parameters, we are going to merge the data into a single JSON array and then send it on its way to the &lt;em&gt;Send Email&lt;/em&gt; node.&lt;/p&gt;

&lt;h4&gt;
  
  
  Send the Email
&lt;/h4&gt;

&lt;p&gt;The &lt;em&gt;Send Email&lt;/em&gt; node now has all of the information that it needs to send an email back to Louis. This does take a bit of configuring to get it set up right:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z4bmg2ax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/352/0%2AC8eB90Q9Eyu7Q60B" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z4bmg2ax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/352/0%2AC8eB90Q9Eyu7Q60B" alt=""&gt;&lt;/a&gt;Parameters for the Send Email node&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Credentials — SMTP&lt;/strong&gt; : This is a new credential set that was created to connect to Harvey’s email and send email on his behalf. Much of this information is available in &lt;a href="https://help.yahoo.com/kb/sln4075.html"&gt;this handy help article&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From Email&lt;/strong&gt; : This is filled in from the &lt;em&gt;To&lt;/em&gt; field supplied by the email by using the expression &lt;em&gt;&lt;code&gt;{{$json[“to”]}}&lt;/code&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;To Email&lt;/strong&gt; : This is filled in from the &lt;em&gt;From&lt;/em&gt; field supplied by the email by using the expression &lt;em&gt;&lt;code&gt;{{$json[“from”]}}&lt;/code&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt; : This is the same subject that the email used except it is prepended with &lt;em&gt;RE:&lt;/em&gt;. This is generated using the expression &lt;em&gt;RE: &lt;code&gt;{{$json[“subject”]}}&lt;/code&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt; : This is where we put in the excuse (generated by the expression &lt;em&gt;&lt;code&gt;{{$json[“excuse”]}}&lt;/code&gt;&lt;/em&gt;) followed by “Maybe next time. Harvey”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest of the parameters can be left empty for the time being or if you want to get fancy, you can fill in the &lt;strong&gt;HTML&lt;/strong&gt; field with the same message but format the text using HTML and CSS.&lt;/p&gt;

&lt;p&gt;You can now close the &lt;em&gt;Send Email&lt;/em&gt; node.&lt;/p&gt;

&lt;p&gt;The workflow should now look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RuN8AVxo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AM9KP4PN8Kluo3HaW" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RuN8AVxo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AM9KP4PN8Kluo3HaW" alt=""&gt;&lt;/a&gt;Workflow with Merge and Send Email nodes added.&lt;/p&gt;

&lt;h3&gt;
  
  
  Take Up the Slack
&lt;/h3&gt;

&lt;p&gt;Now, the last thing that Harvey needs is for Louis to come in the next day and start talking about the excuse Nathan made up if Harvey knows nothing about it. This is why we are creating a “back channel” for Harvey and Nathan to communicate with each other while everyone else is none the wiser.&lt;/p&gt;

&lt;p&gt;To accomplish this, we have set up Slack accounts for both everyone in the team and set up Nathan Slack app with the proper permissions to access the Pearson Specter LLC Slack workspace. We have also created a private channel which only Harvey and Nathan have access to and added Nathan app to that channel. (While I would love to go into all the fine details about how we set up Slack, it is quite simply beyond the scope of this article. But this could turn into a future article so stay tuned! For now, check out &lt;a href="https://medium.com/n8n-io/giving-kudos-to-contributors-with-github-slack-and-n8n-b3f5f4a653a6"&gt;Giving kudos to contributors with GitHub, Slack, and n8n&lt;/a&gt; another example.)&lt;/p&gt;

&lt;p&gt;Now that all of that preliminary information is out of the way, here is how Nathan is configured to send Harvey a message. The first thing that we need to do is add the &lt;a href="https://docs.n8n.io/nodes/n8n-nodes-base.slack/"&gt;&lt;em&gt;Slack&lt;/em&gt;&lt;/a&gt; node to the workflow and connect the output of the &lt;em&gt;Merge&lt;/em&gt; node to the input of the _Slack _node.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4JxDbk9B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/352/0%2AhxBjiJkQ21VkYM5u" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4JxDbk9B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/352/0%2AhxBjiJkQ21VkYM5u" alt=""&gt;&lt;/a&gt;Parameters for Slack node&lt;/p&gt;

&lt;p&gt;Next, open up the &lt;em&gt;Slack&lt;/em&gt; node so we can set up the parameters. The Slack API credential is the first item we need to fill out. This is critical because if it is done incorrectly, then the node will fail.&lt;/p&gt;

&lt;p&gt;The reset of the parameters are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; : &lt;em&gt;Access Token&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource&lt;/strong&gt; : &lt;em&gt;Message&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation&lt;/strong&gt; : &lt;em&gt;Post&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel&lt;/strong&gt; : This is the name of the private channel that we created in Slack. For Nathan, this is called &lt;em&gt;private&lt;/em&gt; (Yes, unique, I know!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt; : The is the content of the actual message (we will talk a bit more about this in a bit)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the other things that we would like to do is give our messages a bit more punch by being able to style them. We are going to accomplish this using &lt;a href="https://www.markdownguide.org/tools/slack/"&gt;Markdown language&lt;/a&gt;. To enable Markdown language, simply click on the &lt;strong&gt;Add option&lt;/strong&gt; button near the bottom of the &lt;strong&gt;Parameters&lt;/strong&gt; tab and click on &lt;strong&gt;Markdown&lt;/strong&gt; on the pop-up menu. This will add a &lt;strong&gt;Markdown&lt;/strong&gt; option which will, by default, be on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bf4uxZPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/346/0%2AgMJhS25-6ts7pvLX" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bf4uxZPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/346/0%2AgMJhS25-6ts7pvLX" alt=""&gt;&lt;/a&gt;Markdown Option in Slack Node&lt;/p&gt;

&lt;p&gt;Now, you can style the text using Markdown language. If you are not familiar with Markdown language, it is a quick way to format text. There is an excellent tutorial on Markdown available &lt;a href="https://www.markdowntutorial.com/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The final piece to this puzzle is to generate the message to Harvey using the excuse that Nathan sent to Louis. For the &lt;strong&gt;Text&lt;/strong&gt; field, we are going to create an expression that looks like this:&lt;/p&gt;

&lt;p&gt;Here is what Louis emailed you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{$json[“textPlain”]}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is how “you” responded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\&amp;gt; {{$json[“excuse”]}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👍 *You’re Welcome!* 😏&lt;/p&gt;

&lt;p&gt;This code tells the node to put into a text box the contents of Louis’s email and then add the excuse that Nathan made up. He then finishes off the message with a sassy “You’re Welcome!” with a couple of emojis for good measure.&lt;/p&gt;

&lt;p&gt;The final message that will be posted to the private Slack channel will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uTWgoaIs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/563/1%2A2SyqH21_4yygQF6LBw2aaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uTWgoaIs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/563/1%2A2SyqH21_4yygQF6LBw2aaw.png" alt=""&gt;&lt;/a&gt;Stylized message sent by Slack node&lt;/p&gt;

&lt;h3&gt;
  
  
  More Mail!?
&lt;/h3&gt;

&lt;p&gt;Now that we have taken care of all the email from Louis, Harvey needs to be notified when he gets an email from anyone else. To accomplish this, we are going to make a copy of the &lt;em&gt;Slack&lt;/em&gt; node that we just finished creating and connect the &lt;em&gt;Switch&lt;/em&gt; node’s &lt;strong&gt;Output 3&lt;/strong&gt; to the input of this copied node.&lt;/p&gt;

&lt;p&gt;Next, we will reset the value of the &lt;strong&gt;Text&lt;/strong&gt; field and enter &lt;em&gt;You’ve just received an email. You may wish to check it out.&lt;/em&gt; into that field.&lt;/p&gt;

&lt;p&gt;Now, whenever a non-Louis email comes in, Harvey will get a notification.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Else Could Nathan Do?
&lt;/h3&gt;

&lt;p&gt;Because Nathan’s abilities are only limited by the services that are available through the internet, there are a lot of things that we could get Nathan to do for us. Some ideas include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buy and sell items online&lt;/li&gt;
&lt;li&gt;Speak and be spoken to&lt;/li&gt;
&lt;li&gt;Make dinner reservations or order food&lt;/li&gt;
&lt;li&gt;Oversee our smart homes&lt;/li&gt;
&lt;li&gt;Manage our communications (text messages, email, phone calls, etc.)&lt;/li&gt;
&lt;li&gt;Make recommendations (movies, recipes, etc.)&lt;/li&gt;
&lt;li&gt;Direct employees and customers&lt;/li&gt;
&lt;li&gt;Whatever else comes to mind!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Everyone, Introducing Nathan!
&lt;/h3&gt;

&lt;p&gt;That concludes the first steps in creating Nathan! Let’s do a brief review of what Nathan does so far:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check Harvey’s Email&lt;/li&gt;
&lt;li&gt;If there is new email check if it is from Louis&lt;/li&gt;
&lt;li&gt;If it is from Louis:&lt;/li&gt;
&lt;li&gt;Make-up an excuse&lt;/li&gt;
&lt;li&gt;Email the excuse to Louis&lt;/li&gt;
&lt;li&gt;Send Harvey a message on Slack with the excuse&lt;/li&gt;
&lt;li&gt;If it is not from Louis:&lt;/li&gt;
&lt;li&gt;Send a Slack message to Harvey that there is a new email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The final workflow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J4ukgQho--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2ABU-CtyvksHzk1Nl3" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J4ukgQho--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2ABU-CtyvksHzk1Nl3" alt=""&gt;&lt;/a&gt;Final Workflow for Nathan&lt;/p&gt;

&lt;p&gt;I’d be excited to check out what you’ve built using n8n! In case you’ve run into an issue while following the tutorial, feel free to reach out to me on &lt;a href="https://twitter.com/tephlondude"&gt;Twitter&lt;/a&gt; or ask for help on our &lt;a href="https://community.n8n.io/"&gt;forum&lt;/a&gt; 💙&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This &lt;a href="https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/"&gt;post&lt;/a&gt; originally appeared on the n8n.io &lt;a href="https://n8n.io/blog"&gt;blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>lowcode</category>
      <category>raspberrypi</category>
      <category>automation</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
