Hey, welcome to the most comprehensive NADN course on how to go from zero, somebody that's never used this platform to hero, a master capable of building automations for themselves and or selling stuff like that to clients. I've scaled my own automation agency at over $72,000 a month using no code tools like make and nen. So, the purpose of this course and any follow-up courses that I make are all about how to use these tools for actual business purposes. how to drive revenue, how to improve savings, and more or less purposes that you would actually be
building systems for in the real world, not just hobby projects. I've made sure to add timestamps for every section down in the video. So, if you guys maybe already are coming to this with a little bit of NAN knowledge and just want some bits and pieces, feel free to use that to move around. And make sure you guys bookmark this video so you can come back to it later. Trust me, this is the most comprehensive resource on NAN that you will find on YouTube, at least as of the time of this recording. I've checked. You
guys are going to want to make sure that you run through this from start to finish at some point in your NADN career. So, you might as well have an easy and simple way to get back to it. So, let's cover what NAD is, how to get set up on the platform, and how to build our very first simple practical workflow. Okay, now that you guys understand what the purpose of this course is, let's actually dive into the very first module, which is going to be all about how to get NADN set up for yourself.
how to essentially go from somebody that's never used this dashboard or this platform to somebody that at least is a little bit familiar with it. I'm going to be basically putting on your NAN training wheels, if that makes sense. And we're going to start this video by signing up to N8N. I'm actually going to walk you through what that process looks like from start to finish. I'm going to be using their cloud hosted offering today. The reason why is it's just a lot easier for total beginners to get up and running versus self-hosting. But I
want you guys to know that I'm going to be covering self-hosting in depth over the course of the next few weeks. After that, we're going to do a live hands-on review of NAND's builder. We're going to cover the canvas, the workflow, nodes, and then after that, I'm going to be creating three simple but effective workflows to actually have you guys get something on the page, so to speak. You'll actually have created three simple workflows before the end of this video. So, if that sounds good to you, without further ado, this is Nadn's website, as we
could see. Secure AI native workflow automation. Very sexy. I really like their branding. You can see they worked with some big freaking names. Adobee is using NN now. Sendin Blue, Pearson, um, Splunk. I've never heard of those guys, but they sound funny. So top right hand corner, I'm just going to click get started. And the first thing it's going to ask me for is my full name. So I'm going to give it my full name. Then it's going to ask me for my company email. I'm going to give it a company email. So I'm going
to ask me for a password. I'm going to write down example password. And then for account name, I'm just going to go nickyou YouTube.app.ncloud. Keep up with our constant improvements through our newsletter. No, thank you. What I have to do here is just because I'm crazy with it, sometimes they think that I am a robot. I need to select a bunch of images that match a mountain. That kind of looks like a mountain. That looks like a mountain. I don't know about that, but let's see what happens. It is embarrassing how uh common it is
for me to get these things wrong. Anyway, they have some little onboarding stuff using Type Form. I'm not going to harp too much on that because odds are this will be different by the time you're looking at it. And then I'm not going to invite any team members to my workspace. I really like their onboarding. They have fantastic onboarding. They have a little quick start guide over here on the right hand side as the workspace starts up. As you can see, it didn't cost me anything to like launch said workspace. The cloud plan gets you
up and running like ASAP. So, despite the fact that onboardings typically do change and yours might look a little bit different. As of the time of this recording, it is pretty dang sweet. Okay. And now I just received a notification saying that my workspace is online. I can click start automating and we'll actually dive into NAND proper. They use a little dark mode action which I really like. So, very clean, very sleek. As you can see, they automatically sign you up to a trial. Um, when you get started, you'll have 14 days in said trial
with a,000 executions total. I'll cover what all that stuff means in a minute. No big deal. The terminology of NAN is pretty simple and straightforward, which I like. So, just covering the dashboard really quickly, top to bottom. I'll talk about the things that are important, the things that you don't really need to know, you want to actually use in practice. U let me just exit out of this little top bar here. First things first, this button over here allows you to create. So, you can create either a workflow and you can create it in a
specific project. So, I only have one project here called personal, which is why that's all that it's giving me. You can also create a credential. So credentials are how you connect to various software platforms and apps in N8N. Uh and then you can also create a new project. So add a project button down here. You also have an add a project button up here. No idea why they do that, but they do. Um as I mentioned, things are separated into projects. We don't have any workflows here, but when I add one, you'll see it'll be
listed. Then we sort of have some of the same data here as well. We have credentials. If I click on those credentials, I can actually create a credential up here, too. Nothing magic. If you're on the cloud hosted offering, you will have this sexy admin panel. the purpose of which I have yet to fully understand. Uh no, the purpose of this is basically just to monitor your trial. You can change NAN version versions if you need to. You can change NAND versions if you want. You can change the versions if you need to select your
time zone and you know do some other settings. In practice, you basically never really have to change any of this stuff. So don't sweat it too much. Aside from that, one of the most powerful and valuable parts of N8, this little dashboard, it's actually down here in the bottom lefthand corner under admin panel. It's called templates. And this sets NAN apart from a lot of the other no code tools that you could choose. They basically have some of the highest quality workflow automation templates publicly available and completely free to use out there on the internet.
This is the simplest way to get up and running if you guys don't know how to build a flow. And after you're done watching this video, I'd highly recommend you guys to just bookmark this and just spend a few minutes scrolling through clicking on various systems that you might want to create and just understanding a little bit more about how professionals or people that are a little bit more wellversed within might put things together. There's a lot of opportunity here obviously to template out, you know, big chunks of flows that you'd otherwise build. And some
of these flows, to be honest, are literally good enough where you could just click sales and you could find like one or two of these flows that like does exactly what you need before you even had put any work in. So for instance, if you wanted to scrape business emails from Google Maps or the use of any third-party APIs, that was a system you were tasked to build maybe as a service or for your own business, you could literally click on this button and you could import the flow. It would take you like 5 seconds.
Not hard at all. And a lot of the time the developers will document the hell out of it too. They'll do video tutorials and and all that stuff. So yeah, that's probably the most valuable part of this whole page to be honest, aside from the workflow creator. But let's actually dive into the juicy bits which are obviously what you're here for by creating a workflow. So that takes us to the canvas. When you open up a new workflow, you are sent to this page where you could see a lot of cool stuff. This is basically
the workbench where all of your N8N flows are going to be created. I'm going to walk you through this top to bottom. Let's start on the top lefthand corner. This is where you can name your workflows. So, I'm just going to name a workflow and I'm going to call it N8N course. You can see here you can also add a tag. N uses tags to organize their workflows in projects which I'll show you in a moment. But let's just create a new tag and let's just call this YouTube. Let's say I'm going to be creating
a big YouTube tutorial. So, I want to tag everything here as YouTube if it's if it's part of my um NAN course. And then over here on the right hand side, you have the ability to activate your workflow. You do need a trigger for that which I'll cover in a moment. You could share your workflow here, which means you can add users to your NAND account and then give them access to a workflow. Pretty neat. There's a workflow history or revision history. If you make a mistake or something during your NAN flow, you can just
click this button. It'll actually restore the version of the workflow that you want. So, they have very good persistence. They actually show you it um live, which a lot of other no code tools don't. In the top rightand corner, you have this sort of like click more button where you have can duplicate a workflow. So, if I click this button, it'll actually just like, you know, create another one. I can download a workflow. When you download it, you'll download it into JSON, which is pretty neat. JavaScript object notation. This allows you to then send it
to anybody else that you want and then they can like import it. And speaking of import, you can import either from a URL. So there could be like a JSON file hosted on a URL over here. And then you could also host it just import it from the file too. So that NAN course over here, I could just click that button and then it would import that workflow that I just exported. There's also some settings. Obviously, there are a bunch of like um I don't want to call these higher level, but they're sort of like
configuration options with execution order where there are variety of different ways that NN used to execute workflows. There's some error handling workflows, some some ways to time things out after a certain amount of time. We're not going to cover this because in practice, I find you rarely need to use this when you're actually building flows for business purposes. That's ultimately what the purpose of this whole tutorial and course is about. But, you know, rest assured, there's ample documentation on all this stuff. The really cool part about Niten is how well documented it is. It's basically
everything that you could possibly need. I'm not going to switch to the old canvas. It's just like a slightly different way that it looks. Moving forward, this is probably going to be the predominant mechanism just because it's so clean and sexy and useful, which you'll see. Okay. Now, speaking of the actual canvas itself, um, if I just scroll around here, I'm holding my two fingers on my little touchpad. You could also do this with like the mouse wheel if you want. I'm moving around the canvas, right? You see these little dots that are equidistant from
one another. Um, this sort of shows you where you're at. in the bottom lefthand corner. You'll notice that as I do that, there's this little white box sort of in the middle. What this is is this is sort of like a mini map. I don't know if you guys have ever played video games like uh Starcraft or Warcraft or League of Legends or Call of Duty or whatever. It's basically the same sort of thing. You have a mini map here. Um and you can actually you can drag the canvas like I'm doing right now or
you can actually just drag the mini map too which is kind of neat. We can zoom way out. We can zoom way in. This is sort of nifty and honestly sometimes I just play with this for like 10 or 15 minutes at a time before I remember that I should probably be building workflows that make people money. Um so that mini map's kind of cool. In the bottom lefthand corner you have a couple of buttons and these are like quick access easy buttons. These are just useful when you're building out workflows. Um if you just
press this button it'll basically just like fit back to um like I don't know like it'll it'll zoom out to an appropriate amount that allows you to see most of the nodes here. The cool thing is N makes very heavy use of uh hotkeys. So if you actually just instead of clicking this button, just press one, you'll just snap back. So one, one, one. Pretty cool. It basically just centers this box or centers the average location of all of the boxes when you have multiple nodes um in the center of your screen. There's also some
plusing and minusing action going here. You can press plus to zoom in or you can press minus to zoom out. In practice, I don't really use these when I'm building just because I have my little touchpad and mouse wheel and I can just do this and when I do this, my head gets spinny and it's very fun. You then have um reset zoom here. So, you can go zero or one. I don't really use that in practice if I'm mad zoomed in. And then you have a little way to report bugs. Um I never report
bugs, granted. Uh I don't know, maybe we have some white knights here that want to make the platform better or something. Okay, the last thing I want to cover is, and you can't really see it cuz my giant ass head is in the way, but in the bottom right hand corner of the screen, you can click this button to ask an AI assistant. Says, "Hey Nicholas, I can answer most questions about building workflows in NAN for you for specific tasks. You'll see the ask assistant button in the UI. How can I help?" And the reason
why I wanted to cover this is because this has got to be one of the most useful features in NAND. And this really sets it apart from the vast majority of other noode platforms, especially like make. I think Zapier has an AI assistant feature now as well. Because this AI assistant is actually useful. you can actually use it to sort of co-build things. Um, it has access to all of the NAND community forums. So any post that was basically ever made that describes a solution to a problem, it will technically have access to and it
can pull it like with reasonable accuracy. Uh, and then it's also integrated into your builder. So it it has access to the the actual build itself. Although sometimes you have to give it a little bit more context about what it is that you're doing for it to like really figure it out. Yeah, this AI assistant, I want to say it's not perfect, but it covers at least 30 or 40% of all the queries that I have for NNN. So, my usual debugging workflow, which you guys will see if we run into a bug later. Hopefully,
we do. Fingers crossed. Uh, I'm going to use the AI assistant as sort of a first pass. Okay, great. So, that's that. Um, I think we now know everything except for obviously the big juicy elephant in the room, which is adding a first step. If I click on this middle button here, you'll now see on the left hand side, we've opened a bunch of options. Um, and essentially what we're doing when we add a first step is we're adding a trigger. A first step of any flow in N8, and it's always going to be a
trigger. And so on the right hand side we have a variety of different triggers we could choose from. We could trigger manually. This runs the flow by clicking a button in Nadn. Good for getting started quickly. It is very good for getting started quickly. And I'm going to show you our first uh module or sorry our first workflow is going to be built like that on app event. So this runs a flow when something happens in one of the many apps that you can connect to non. So if I click this you can see there's
there's action network active campaign acuity adalo. Maybe you want to do a trigger when a new thing gets added to an air table or when a new project gets added to a Santa or maybe you want to I don't know when you receive a new um ClickUp task or I don't know you get a new Gmail or something or a new GitHub repo or ghost post was made. Right? If I scroll through here there there are a couple of hundred triggers as of the time of this recording and NN is always looking to add more.
So the cool thing is you can very quickly if there's one of the platforms that are listed here click this button and then you could say oh okay um let me see a better example oh okay you know a new air table event just occurred and what is the air table event in particular um I don't know it's going to be like a a new thing that was added to a row with a with a specific field for instance you could very quickly get an anal integration up and running super super quickly anyway I don't
actually want to use this so I'm just going to drag on the canvas And then I'm going to press delete. And it's going to delete that module. Sorry, the uh note. If I right click this, you can see I can also do a variety of things to this. But the one that I want in this case is a delete. So that's what I'm going to do. And I'll show you how to do all the the other things that you saw a moment ago just over the course of building. Okay. So if I go back to
this open nodes panel in the top rightand corner, you'll see that there's a hotkey. I can just click the the tab button instead of doing this manually. So that's what I'm going to do. I'm just going to press tab. So that's what I just did. And it just opened this up automatically. Um, let's continue down. Uh, aside from just on app event, you can also do things on a schedule. So, you can run a flow every day, hour, or whatever custom interval you want, which is pretty neat. So, if I click this, you can see
on the right hand side here, left hand side here, we can trigger the interval to be seconds. I might run this thing every 30 seconds. I can run this every minute. I could run this every hour, days, weeks, months. They also have like a programming um sort of term here called cron which is just a specific language setup where you could write an expression that does something I don't know every third Sunday of years that are oddnumbered for instance. I'm just going to now click delete. So we can delete that out. Press tab to open
up this right hand side panel and then continue. You can also do what's called a web hook call. If you guys are unfamiliar with web hook calls, um I'm going to cover it later on in the course, but essentially the really cool thing about NN and a lot of other note platforms, it'll it allows you to set up your own URL just like this up here, right? Nick nick YouTube.app.n.cloud where when anybody tries to access that URL or sends or receives data from or to that URL, you can basically get notified and you can use
that as the the beginning of a trigger um for one of your flows. And the benefit to this too is you know how earlier I showed you guys that and had a bunch of you know native integrations about like 200 or something like that where you could connect with Acuity, you could do ClickUp, you could do Gmail, all that stuff. Well, a lot of the time, especially if it's a new platform, you don't actually have that native connection yet. And the benefit of having web hooks is they allow you to create that connection yourself. In
these tools, most of the time they'll have a thing um called like a like a web hook listener. You can set up your own web hook listener to be this URL here. And then NAN can just listen to data being shuttled to and from those platforms, which basically in effect allows you to create an infinite number of integrations, connect to tens of thousands of different apps and ultimately become the automation god that we both know you want to be. Okay. Anyway, so I'm going to click that out and I'll cover all of the uh fields
and everything like that that you saw there earlier. Next, we have a very nifty one which we're going to be using today called the on form submission. If I give this a click and then I uh add just some very base details here. Um let's just say name. Sorry, let's just do example form. Enter example data. What's your name? We'll go Peter. If I click test this step now, we're actually going to open up a little form that I could use to fill data out. And when I submit it, this basically begins my my flow,
which is really neat. So in practice like in business flows you don't usually use this too much but I'm going to show you a simple um workflow that we can build today that will there's also when called by another workflow. This runs the flow when called by the execute workflow node from a different workflow. The reason why this is so valuable is because a lot of AI flows will use this. So if you want to learn how to build AI agents and stuff like that the when called by another workflow um execute workflow nodes the
the that relationship there is very common and you'll see me do it a lot over the course of the rest of this tutorial. And then there's also on chat message which is very valuable. So, this runs a flow when a user sends a chat message um for use with AI notes. As we could see, you could ask AI just using a little chat interface, hey, can you check my calendar to um I don't know, double check that I'm not double booked for for 11:00 a.m. It'll actually go through um this little chat window trigger and
then use that to begin the rest of this flow. There a few other ways. Um you could do an email trigger, IMAP, error trigger. This one's actually really nifty and most other no code tools don't have this. when there's an error in another workflow, you could trigger this workflow to do something with. There are a couple of like metadata things with NAD where you could set it up so that when you create another workflow somewhere in your NAD project, you trigger a flow when one of your flows starts or when one of your workflows is
activated, you could do something. And there also a variety of actions here. We'll cover actions in a moment. And then there's this SSE trigger, which nobody really ever uses in practice from my understanding, so I won't sweat it. All right. Awesome. So that in essence are all of the triggers. In order for us to check out and learn some of the actions, we're obviously going to have to go and create a flow, right? In order for a flow to be a flow, it needs a trigger, something that starts it, and then an action, something it
does. Now that we finished the first part, let's actually just go and start building our three workflows so you guys can see how to actually do things in NADN. It's one thing to sort of look at things from a canvas point of view. It's another thing to actually get in the weeds, get your hands dirty, start manipulating fields. Okay, I just jumped over to my other NAND account which contains these examples. And I just wanted to show you one more thing that I I haven't mentioned yet. You see how this is now this little like
yellow note um with manual trigger send an email to someone. We'll start by learning how the manual trigger works. We'll also cover creating a brief connection and using that to send a templated email. This is just how I'm going to document um a lot of our work moving forward because it's very convenient. But what is this? This is basically a piece of documentation that you can just insert inside of your own N8 flows anytime you want. It's very simple. If you go to the top right hand corner, just go down a bit. There's a sticky
note which you can do with the hotkey um shift and then S. So I go shift S. I just added a bunch of notes. I'm just going to command Z or control- Z just to go back. Um but yeah, you can just add a note anytime you want. And notes are really cool in because they allow you just to document things. You don't just have to use notes when you're trying to teach or show somebody something. In fact, my recommendation I'm just pressing one to center this. My recommendation is to use notes for yourself to
document workflows for yourself. um just so that you know let's say you build a system for a client or for your own business and it works really well so you don't have to check in on it for 6 months but 6 months in you want to change something well now you're not like basically having to relearn the whole workflow now you have like a note which I don't know documents or teaches you a little bit about it okay so the very first system we're going to build and basically the thing that is going to allow
us to get up and running to learn how the rest of the uh N8 end UX works is we're going to start with a manual trigger and we're just going to use that to send an email to somebody why this is valuable is because it's going to show us how to actually trigger a workflow like ourselves. We're also going to learn how to test a workflow and I'm going to run you through how the fields in NAN work as well. We're going to create a brief connection to my Gmail. Then we're going to use that
to send basically the hello world example. If I click on this, actually, let me update that. Basically, our quote unquote hello world. Okay, great. So, I'm going to drag this add a first step over here and let's actually do it. Let's click add a first step and let's add this trigger manually flow. Click that node. Boot over to the left hand side. And now, as you can see, we have a node in our workflow that says when clicking test workflow. Awesome. I'm now going to click this plus button. What this enables us to do is
basically do um some next step. So, what I'm going to do next is I'm going to add an action. This is our trigger. Remember, it has this little um electricity lightning icon next to it. What I'm going to do is I'm going to do probably the simplest thing that you can do in NAN, which is just send an email. I think most of us are probably using Gmail at this point. Um, I'm going to go Gmail over here. And then what I want is I just want to scroll down. There's so many message action. I
got a label, delete a message, get a message, do whatever the hell I want. But the one that I want is I want send a message. So I'm going to click send a message. And two things will happen. The very first thing that will happen is we just connected an action to our trigger node. And so our canvas is now updated. It has two parts to it, which I'll show you in a second. The second thing is we are now faced with this screen. This is basically, you know, there's like the bird's eye view canvas
screen where you see all the nodes laid out, but this is a screen that pertains to that particular node. And the really cool part about the way that NAND lays it out is this Gmail node which we just added um is sort of in the middle. On the left hand side here, we have the input to the node. On the right hand side, we can see the output of the node. So N8N and one of the reasons I love it so much is because it tries to show everything to you uh linearly and logically. Everything
that comes in to this node that we added will be coming in through the left hand side which I think looks like the right hand side on my thing. So let's go over here. It'll come in through the left hand side. Then it'll hit your node. Your node will do something with that and then it will finally proceed uh out the left hand side as an output. So very simple conceptually and I can't really overstate how valuable this is just as somebody that's worked with like you know over a dozen no code tools at this
point to have it laid out like this um I think shows that the team spent a lot of time and energy figuring out what like the most ideal UX was for development. Okay, so I'm going to ignore all of this input data stuff and and we'll we'll cover all of that later um just over the course of building. What we're going to do now is we're going to click this credential to connect with. So, I've already actually already connected my Gmail account, but I'm going to pretend like I haven't just because I want you guys
to be able to follow along here. So, what you have to do is you have to click create new credential. Now, there are variety of ways to connect one of your accounts to NAN. There is OOTH or OOTH 2 and then there are also service accounts. I highly recommend anytime that there's an OOTH or OOTH 2 option available, you guys go with OOTH 2. To keep to make a long story short, OOTH 2 just refers to you clicking a button like sign in with Google and then you being able to select an email address with
which you can sign in. All you then have to do is actually sign into the service. In my case, I'm already signed into my own Gmail because I'm using Chrome and it already does that. Then you click continue and now you can close this window. It even tells you how lovely. And you'll see that it now has connected the account. Basically meaning that all of the stuff inside of my Gmail is now accessible to N8 and I can actually do things with it using various triggers and actions. So we're going to exit out of this
now. And you can see that we're now connected to Gmail account 3. Okay. Next up we have a couple of fields. We have resource. This just allows us to choose what thing we are manipulating. So message label draft thread. For now we're just going to keep it as message. You can poke around with that after you're done this. Then the operations. So, we can do a ton of things here. We could add a label, delete, get many, mark as red, mark as unread, remove label, reply, send, and send and wait for approval. Lots of options
here. We're just going to click send for our hello world example. And now we get to the juice of it, which is the two field. So, in my case, I'm going to be sending this to myself, which is [Music] nicholas@gmail.com. And I'm going to be putting a subject. And you can see it's already autofilled the hello world. So, I'm actually just going to go hello Nick. We have a bunch of email types here. There's text and HTML. For simplicity, I'm just going to go with text, but I want you guys to know that HTML is
a programming language. It allows you to make your email pretty. If you guys have ever signed up to like a newsletter service and there's all these images and and and you know, banners and stuff like that. That's because they're using HTML. So, you can learn how to do that yourself. And then you can send stuff like that through NAN pretty easily. But then finally, we have the message. So, I'm just going to say, "Hello, Nick." And then I'm going to say, "It's nice to meet you." Okay, great. And now we've gotten to the point where
the vast majority of this is done. We do have some extra options down here. I want you to know that basically all nodes that you can manipulate will have some form of extra option. You don't have to memorize every option for every node cuz there are hundreds of nodes. As I mentioned, generally speaking, there just a couple that are valuable. I know just off the top of my head that the Gmail node has one that's append attribution. Naden will try and market themselves all the time. So, if you do not turn this off, they will
say this email was sent by NAND. It's not a big deal. Most no code platforms do this, but just make sure you actually turn it off if you want to use it for some sort of business use case. Okay. And then that's that. I'm just going to head over to my personal email here. Just open that up just so we could see. So, you see I have a ton of, you know, red emails here. And I'm just going to click test step. I'm now going to send the email. You can see the lefth hand side
filled out first. It said when clicking test workflow and I'll cover that later. But the most important thing is this output field has now populated and we see here it's kind of like a table right with a column called ID another one called thread ID and then finally label ids. So any time that you send or receive data in NAD from one node to the next you're generally speaking going to have some sort of object that is created as a result. This data object um can take a number of forms and then it can visualize
in a number of forms. The way that they do by default for this type of data is they do table view which is where it's separated kind of into columns like this. There's also JSON. This is JavaScript object notation. This is what a lot of programmers and people that are a little bit more familiar with no code are going to prefer because this is just a standard convention JavaScript object notation. They know what the brackets mean and I don't know instead of it being kind of left to right like this which can be squished, it's
sort of top to bottom instead. There's also schema. This is generally what I find most people in NAND prefer. They prefer schema views. Schema views are great. They're sort of like JSON. It's just instead of them being written in code, it's just sort of a little bit cuter and it's wrapped in like little bubbles and stuff. So this data is the same as this data and this data is the same as this data. They're all just different ways of showcasing um what the information looks like to you. I should also note that you can search
the output which is cool. And a lot of people, even seasoned professionals at NA, they like have never clicked this little search button. So give it a try. If you um are looking for a particular filter, let's say the object that is output is actually huge. And you'll see you can output a ton of different parameters here. But you want to just see if the output contains something, you can do so very quickly just using this. Then only that field will show and then you can very quickly manipulate that as necessary. Um you can also
do a couple of other things like pin uh data. Um and I'm going to cover pinning data later. Uh and then kind of like one of the neat things you can do as well is you could actually manipulate the output data. So you could pretend like this just output a different ID. Maybe instead of 1 1949, it was 1821 3 or something. The reason why this is valuable is because it will then allow you to propagate that data moving forward. And as you can see, we just changed that number. It used to be 1 1949.
Now it's 1823. So when I search 1949, we don't have two fields coming up. We only have one. Right? If I want to search for the 181, I go 18. There we go. Okay, great. So that's what happened in N. But why do we give a crap about that? We don't. What we care about is did I receive the email? Okay. And now you can see we just received that email. If I give it a click, it now says, "Hello, comma space Nick with an exclamation point. Nick leftclick.ai." That's the connection of the account that
I made. Then it says, "Hello, Nick. It's nice to meet you." Fantastic. Amazing. Great. Thank you, NAN, for this lovely email. Just for shits and gigs. I'm going to click this append n attribution just retest it just so you guys can see what that attribution is like. Um, but as I mentioned, I I wouldn't really recommend it for business purposes. You just got this little almost email signature that says it was sent automatically with N8N. Okay, so I'm just going to turn that off. And then voila, we're basically done our first example. This is the
hello world of N8N. Um, if you've made it to this point, you now literally know how to set up a simple trigger and a simple action. You can do a lot of stuff with what we've just covered. Honestly, if you take the tips and sort of the the workflow here, you can put together probably like 10% of all workflows at this point. Um, so as you can see, you know, it's it's sort of simple to get up and running as long as you have a couple of core fundamentals down, as long as you know what
triggers and actions are. And obviously, um, you know, if you did not know what you were doing before you tried to do it, it' be a little bit tougher. So you have the benefit of my foresight, but flows in a nutshell are not really more complicated than this. You always have some trigger, then you have some thing that happens, and then you have the action, which is this Gmail. So let's kick this puppy up a notch. Instead of just doing an email, why don't we do an email, but let's also add AI. And then instead
of a manual trigger where we just click the thing and then it runs, why don't we use a form to begin our workflow instead? So, the very first thing I'm going to do is I'm just going to delete this. I'm just going to scroll down here to form fill a autoresponder. And what we're going to want to do as our trigger is instead of it being trigger manually like we did before, we're going to go on form submission. just that I could show you um how to do things a little bit more um complicated like
things that don't just rely and yeah, it's going to try and add it um all the way back up here. So, I got to go drag it down uh just so we could see how do you get data in from a resource that like isn't this canvas. Instead of us just clicking a button, let's actually trigger it based off something. So, the way we're going to do it is on this on form submission node. So, I give this a click. Um you'll see that now there are way more fields and this can actually be pretty
intimidating. it's the first time that you've ever mucked around with something like this. So, don't worry. It's actually not that scary. Um, we'll we'll make it pretty simple. Up at the very top here, we have some form URLs. There's a test URL. There's a production URL. Right now, it's not really worth knowing the difference between the two. Just know that this is the URL of your form. So, you'll be able to send this to somebody. You'll say, "Hey, um, I'm really excited to get up and running with you. Thanks so much for paying the invoice.
All you need to do is fill out the information on this form and my team will get started." You use this as an onboarding form. Next you have an authentication basic off none. Basically in our case um this just refers to how you want to secure the form. In our case we don't want to secure the form at all. We just want to use it. Now we need to create a form title. So maybe let's just go onboarding form. Form description. This is an onboarding form for leftclick. Fill out the fields and our team will
get back to you shortly. As you can tell I'm building this example. I guess I'm framing it as an onboarding situation where you're working with somebody and you just sign the deal. So, you send them over a form and that form includes a bunch of fields with information they need to fill out in order to get started with you. So, uh what is your name? Maybe we'll do the the first one. So, we'll go first name. Well, I mean, we should probably already know their first name if we're on boarding them, but for the purpose
of this example, let's roll with it. We have a bunch of different fields we could choose here. We could do text, text area, password, number, file, email, drop down list, and date. So, there's a lot going on, but let's uh roll with first name first. The second one, let's do last name. And let's just use my own information as placeholders. So I'm going to do Nick as the first placeholder, Sarafh as the last placeholder. Let's make both of these fields required. Let's go down here. Let's go email address. Now, because it's an email, we can
actually choose a specific type of form field. I'm going to choose email. The reason why is because I want to force people to put in a properly formatted email. If I'm going to use this flow to send an email to somebody, obviously I'm going to need to make sure that email is valid. What if somebody typed in this instead? Or what if somebody typed in that instead? Both of my emails wouldn't go through. It' break my flow. This sort of pre-planning is necessary when you're putting together more complex no um flows because you just want
to make sure that like the data is correct from the get- go. The data is uh bad, so will the rest of your flow. So will be the rest of your flow. Okay, great. And then let's just ask for a phone number. Then down over here, you could see that we have access to a bunch of different fields. There's number. You might immediately think that a number is the one to go to. Um, I don't think I'm going to do number for this. Uh, I don't think there's a a native phone number formatting field. If
we did number, then that would mean that people wouldn't be able to put a format in like this, for instance. So, I kind of want people to be able to. So, instead, I'm just going to go text and then I'm just going to add a placeholder. And the idea is this is just going to tell them sort of what sort of format to use for their number. We're going to go required. Okay, great. Down here we can now choose when we want this form to trigger. So when do we want it to trigger? When the
form is submitted. So that's what we're going to use. And then down here we have some other options. We could choose like a pen nadn attribution. I'm just going to turn that off. There's uh button labels. We can change the button label if you want. Let's get started. I think the default one just says a submit. Um, and then there are a variety of other ones here which I'm not going to cover right now because I want to keep things simple and straightforward. Awesome. So now that we have this, I'm just going to click test
step. This is going to open up my form. And you can see this honestly is not a bad looking form. So I'm going to go nick surive nick at leftclick.ai. I'm just going to add a sort of example e phone number and then click let's get started. What happens when I fill this in? If we just make this a little bit smaller and we couldn't see this in real time, but what happened right there was the output populated. And so now we actually have all of these fields accessible to us in our NAN flow. First
name, last name, email address, phone number, submitted at form mode as well. Form mode uh wasn't and submitted at. These weren't fields that were put in by me when I filled out the form. These are what are called metadata. And the cool part about metadata a lot of the time is you can use this metadata to do something cool with. So, you know, we could very easily use this to update a Google sheet or something with a list of submitted at dates so that we could always be tracking and sort of know like which form
entry made it in at which time. We could distinguish between test and production workflows. Production being a live workflow. Anyhoo, so now that we have access to all this data, what I want to do just to make my life simpler is in the top right hand corner, I'm going to click this little pin button. The value in pinning the data in n and this is kind of different from most other noode platforms. But the value in pinning the data is by pinning the data we will have access to that same data on all nodes that
are downstream from the trigger node or the node that we are pinning the data from. And this is valuable because as you'll see naden's whole testing flow involves you know in in future nodes or subsequent nodes testing using data from the previous node. And if there is no data from the previous node you are going to have to fill out that data in order to proceed. So this is just going to save us a little step. Now that we've done the form submission what I want to do is I want to send this to AI.
Okay. So, I'm going to give this a click and I'm going to go over here and I'm going to type in um open AI. From here, we have a variety of ways that we can communicate with our AI. I'm going to scroll down until I get one called message a model. This is the simplest um AI module that you AI node that you guys could possibly use. This is basically chat GPT. It's just instead of us using chatgpt on their website, you know, chat.opa.com, openai.com. We're basically going to be communicating with it now through API,
which is way cooler and enables way more cool use cases. So, credential to connect with. As you can see, I already have connected to my own OpenAI account. I'm going to go to create new credential just to show you guys how this works. Now, unfortunately, this is not yet have an ooth 2 connection. So, that means that as I mentioned previously, you're not going to be able just to like give that click uh give that button a click and then have it open up the signin with Google button. Instead, what you're going to have to
do is you're going to have to add an API key. Your question is probably Nick, how the hell do I do this? The good thing is Naden is very gratuitous and forthcoming with documentation. So if I didn't know how to do this, I would actually click on this button, open docs, go down over here, and then I would look through to see how to do this connection. And just because I want to show you guys, like I know how to do this connection, but I want to show you guys if I didn't know how to
do this connection, how I'd approach it, I would literally follow the documentation one by one by one. So to generate your API key, log into your OpenAI account or create an account. So I already have an OpenAI account. I'm just going to go platform.openai.com. openai.com. That's how you get sort of like their main API. From here, let's go back to the docs. Open your API keys page. As you can see, there's even a button there. It says API keys. So, I'm actually just going to go API- keys cuz that's the link that they just gave
me a moment ago, right? So, I'm going to paste that in. It's now going to take us to our API key page. Next up, what does it say? Create new secret key to create an API key. optionally naming the key and then copy your key and add as the API key 999. That sounds simple. Create new secret key. YouTube example. Awesome. I'm then going to create my secret key. We now have a secret key that I can copy. So, I'm just going to go back to NAN and then paste in my API key. Boy, is
that a long API key. Great. Now, we're going to save. And as you see, it says credential successfully created. This credential is currently private to you. Now, one thing that I didn't cover when I created the credential to the Gmail was you can actually rename these credentials to make your life a little bit easier. So, I'm just going to call this YouTube. So, now I know that this is like my YouTube example. And obviously, I could have much better naming conventions for this stuff, but sue me. Cool. Connection tested successfully. We're good to go. We
can now exit out of this. And we have now connected to the credential um with the API key, meaning this is now hooked up just like we can now uh previously we could get all of our Gmail information in NAND. Now we can get all of our open eye information in NAN. Okay, great. So the variety of fields here like text, assistant, image, audio, file, custom API call. I'm just going to stick with text cuz I just want to talk to the model over text. Operation is going to be message a model. We get to
choose from a list. Now, as of the time of this recording, the most popular model, just scroll way down here, is GPT40, this one. But I'll be honest, these models change pretty quick. So, by the time that you are watching this, might be a couple days after I recorded this, might be a couple months, the model's probably going to be different. I would just head on over to like OpenAI's model page, and then I just look to see what the current recommended one is, the flagship model, for instance. As you see, GBT40 is kind of
like in the driver's seat here. Um, has a bunch of data on it. Um, and I just sort of use that to, I guess, guide me. If you're using another service, then it won't be in exactly the same place, but I think you guys get the idea. Okay, great. Now, we can define our prompt. You know, when you talk to CHP and you say, "Hey, I want you to do this thing." Well, there's actually a term for what you just did. You prompted ChatGBT and specifically you did so using a user prompt. You're the user,
so that makes sense. Basically, the user prompt is what you want chat GBT or want in our case GPT40 to do for us. But there's actually one other prompt that you don't really get unless you're using um a no code tool like this. It's called the system prompt. This is used to set the model's behavior or context for the next user message. So, we're going to click on system first. And the way that the system prompt works for AI is the system prompt tells the model how to identify. So basically I'm saying, hey, I want
you to identify as uh you know worldclass philosopher. I want you to identify as a PhD in genomics. I want you to identify as a helpful intelligent writing assistant. And however you you put your system prompt, the better it'll be at that specific thing more generally. There's a little bit of nuance there. I'm not going to go into it too much, but in my case, I'm just going to say you're a helpful, intelligent email writing assistant. Then I'll go period. So, that's what the system prompt is. Now, we're going to click add message. And then
the next prompt I'm going to do is a user prompt. If I click on roll, though, you'll see there's also an assistant prompt. This is pretty interesting. What what you can do with the assistant prompt is you can pretend that the assistant has actually already said something in your chat chain. If you want it to act a certain way, you can give it examples of how you want it to be. Anyway, in my case, I'm going to do something very simple. user. Then I'll say your task is to customize an email using the following data.
Now I'm going to go enter. Enter. This is going to make this stretch this out a bit. I'm actually going to open this up a bit more. Then I'm going to go um and I'm going to drag this first name in here. You see when I drag the first name in here, something changed. We just went from fixed to expression. Why did we do that? Well, basically fixed is almost always just going to be static text. Okay, we don't want static text. We actually want to connect a variable from a previous node into this OpenAI
module or OpenAI node call. So, I'm going to go back to expression to show you guys how this works. All I need to do if you want to connect the input of the previous node into the current node is just drag it and then drop it where you want it. So now this is populating the um result is populating with the actual data from the test. If we zoom in way here you can actually see it says result. Your task is to customize an email using the following data. Then in green it says Nick. Here
it says curly curly dollar sign JS with a square bracket. Like this is really intimidating and scary. Well this is just the code representation and this is the actual thing that just got populated. Okay. So that's how we're going to do this. I'm going to say first name and then Nick. Then we're going to go last name. And I'm just going to go and drag last name in here. I'm going to go email address. And I think I might have just deleted that. So, let me just do this one more time. Last name. Beautiful. Email
address. Nick leftclick.ai. Phone number. Drag this puppy in here. Cool. That looks pretty good to me. And now what we're going to do is I'm going to click I'm going to leave simplify output um as is. Then I'm just going to write my email template. So I'm going to go down here and go email template. Hey name. Let's go first name. How are you? Thanks for submitting your request, your brief or onboarding form moment ago. I see here your number is number. Let's do phone number. I'm just putting this text in so the AI sort
of like knows what to fill in. If you think about it, it has the first name over here. And if you think about it, I could just fill all this stuff in procedurally, but I'll show you why I'm doing this in a second. We're actually going to like level up the data to make the customization a lot more valuable. Um, I see here your phone number is blank and your email is email. Could you let me know if I'm missing anything? Thanks, Nick. Okay, great. So now what I'm going to do is remember how we
pinned the data before. All we need to do in order to test the step now is we just go up here top rightand corner click test step. If you test the step is actually sending this whole thing to AI. And now we have a bunch of content. It's a subject welcome to our program back slashn back slashn. If you guys are unfamiliar with what the back slashns mean here, back slashn just means um like a new line. So this is trying to write us a whole email and it's doing so with new line characters instead
of new lines just cuz AI has no real way of like creating a new line um without this. So this is basically just a new line character. Hey Nick, how are you? Thanks for submitting your onboarding form a moment ago. I see here your number is 6045005000 and your email is nick leftclick.ai. Could you let me know if I'm missing anything? Thanks, Nick. That's pretty neat. Why don't we just pin this output and why don't we hook this up now to another email module. And just to show you guys how useful it is to know
a little bit of like NAND hotkeys, if you just go back to the previous email module we had, if I just hold command and C, same thing as right clicking and pressing copy. See the copy to clickboard event just came down. And I actually just paste this. And I'm basically now just pasting the same module I had before. And then I'm connecting it to the output of the OpenAI module. And you'll see here this is now accessible to us as input. The content is which is pretty cool, right? I'm noticing actually that this includes a
subject line. I don't like this. So why don't I go back to AI then I'll just tell it don't include the subject line. Let's do that and let's test it. Let's unpin. Let's test the data. And now that it doesn't include the subject line, let's pin it again. Let's go back to our next module or our next node, I should say. I keep on using the term module because I'm big on make.com. It was kind of the major noode platform I learned and make.com always uses the term module for everything that uses the term node
for. Anyway, now I'm going to drag this content field to the message and as you can see it's already populating with the email. I'm going to say re your onboarding form and I'm going to test this. The connection's already set up. All of the rest of the parameters are set up. everything set up cuz remember all we did was we just copied that module with all of the settings. In practice, I find I copy modules a lot. Okay, great. Now going back to my email, you see we have read your onboarding forms. I'm going give
that a click. Now it says, "Hey Nick, how are you? Thanks for submitting your onboarding form a moment ago. I see here your number is 6045000 and your email is Nick leftclick.ai. Can you let me know if I'm missing anything? Thanks Nick." The reason why this is sort of like an AI example right now is because we actually just used AI to write this email for us. But if you think about it, what we've done so far is we haven't really done anything that you can't just do by dragging and dropping the first name into
the email module instead. So next up, I want to do something that's a little bit more creative. Uh I want to do something that paraphrases what a person said or summarizes it. And in order for me to do that, I'm going to have to go in and I'm going to have to change the way that the form was a second ago. But anyh who, we've now done a different hello world example. Basically, um the hello world example we just did was instead of a manual trigger of us just clicking test step, we now have a
form that triggers this. So, let me make a couple of adjustments to the flow and then we'll actually run through the form one final time and we'll see what it all looks like when we put things together. The adjustments I want to make to this form. I don't just want to ask for all this information. I want to ask for let's say design preference. I'm going to add a drop-own item and I'm going to say sleek. I'm going to say um minimalistic. I'll say luxurious. Then over here I'll say playful. Then I'm going to add
another form field. I'm going to say give us a brief description of your brand. Or maybe we'll just say um brand description. My brand or maybe we'll do company description. Leftclick builds growth systems for B2B agencies and creative teams, enabling them to scale without having to manually reach out to prospects. Let's just do something like that. We'll make that required. Now, what's one more thing that I could do that might be new? H, we'll ask it timeline. And we'll say how quickly. Let's say uh 3 to 6 weeks. There you go. We'll go required field.
Awesome. Okay. So now I'm going to click test this step. It's going to overwrite the pin data, but now it's going to open up our form and it's going to have way more information here, right? So I'm going to go Nick Sarif. Nickclick.ai. Um design preference. I want my website to be minimalistic. Company description. Leftclick. Build sleek growth systems, high performing growth systems for B2B agencies and creative teams. And the timeline is I want like one to two weeks. Okay, let's get started. Awesome. Fantastic. We now have all the information that we need in the
output panel here. I'm going to pin this data to make it accessible to subsequent modules. Now, I'm just going to go in here and edit the prompt a little bit. And if you think about it, I don't just want to edit it with, you know, information about the the name and stuff like that. That's not super relevant to me. What I want to do instead is your task is to is to customize an email template using the following data. Let's just add in more information here. Let's go design preference. Drag this puppy in. I want
to give it more data to do the customization with. Down here, I'll go timeline. We'll go one to two weeks. Okay, great. And so, basically, instead of what I had before, just hey, first name, how are you? Thanks for submitting your onboarding form a moment ago. I loved reading about thing about company. Let's do let's go paraphrase company description. I see here that you're looking for design preference a design preference sort of site and you're looking to have it done. Would you mind confirming your number for me one last time? I'm going to say formatted
phone number. Right. Also, okay. And obviously they know the email because we're sending it. Cool. This looks pretty good to me. Don't include the subject line. Let's actually give this thing a go now. Let's click test step. We're going to feed all this data in. Let's see what our email looks like. Hey Nick, how are you? Thanks for submitting your onboarding form a moment ago. I loved reading about how Leftclick built high performing autonomous growth systems for B2B agencies and creative teams. I see here you're looking for a minimalistic sort of site and you're looking
to do it within one to two weeks. Would you mind confirming your number for me one last time? 604700s 5,000. Right. You let me know if I'm missing anything. Thanks, Nick. So, basically what we've done is we've um taken in some of the information here and then we've paraphrased it. Um I guess in this case we didn't actually paraphrase. This looks like an exact one for one. Hm. Cool. Okay, great. Let's test this one more time just to make sure that we got a personalized but customized thing that's paraphrased. Cool. Looks pretty good. Um, what
I'm going to do now is I'm going to go down to our Gmail module. Take the data. I'm going to test it. We've now sent an email and we should have received another one called read your onboarding form. This is the customized email, which looks pretty nice and sexy. And now that we figured out how to do this testing one by one by one, why don't we actually test the whole thing from start to finish? Okay. Yeah, let's actually just run this whole thing. So, I'm going to go down to the bottom. Instead of us
testing the module one by one, which is where we click on it and then we click that test step, we're actually going to test the whole workflow. So, I'm going to click test workflow. It's using the pin data. It's running through. Uh, we don't actually want to pin the data, so I'm going to click unpin. Okay, now it's time to test out this flow. I'm just going to go back to the form submission and I'm just going to do a little bit differently to how we did before. I'm actually going to copy this form URL
myself. Click test workflow and let me exit out of that. And I'll show you guys you guys can actually just test this from anywhere. I'm just going to go back here, open up an incognito tab, paste it in, and this is the same input now, right? So, I don't know, Nick um Sarah. Uh we'll go Nick at leftclick.ai. We'll do phone number. Then design preference minimalistic company description. NY's Donuts sells sleek, high-end donuts with a creative twirl. We're big on uh I don't know, let's do our favorites are chocolate and pink sprinkles or something. Uh
timeline would be like 3 weeks or so. Then I'm going to click let's get started. It's now going to submit it. And I just wanted to show you guys this is like a live form. Like you can use this anywhere you want to test this thing. You don't have to just like click that button. Um what just happened in the background was these just went green. Green means that you know the flow has now been completed and that node has been done. So this node completed, this middle node completed and that last node completed. That
means that if I go back to uh my page here, I should be able to see set input. So hey Nick, how are you? Thanks for submitting your onboarding for a m ago. I love reading about how Nick's donuts sell sleek high and donuts with creative twirl. I see here looking for a minimalistic sort of site and you're looking to do it in about 3 weeks or so. Um you know the data here was different. We're paraphrasing a fair amount which is pretty cool. Would you mind confirming your number for me one last time? 604500
5,000. Right. Could you let me know if I'm missing anything? Thanks, Nick. Very cool. Very cool. Okay, beautiful. So, that's the uh second example here with form fill and some AI autoresponder. Um, worth noting here that our AI autoresponder sent something immediately, but you can also use a delay. Like, hypothetically, if somebody fills that out, you don't really want to send it immediately. So, why don't we just cap this off with like a quick like 120 second delay to connect it. Um all we do is we drag we exit um both of these connections. We
drag this over here and then we drag that over there. And now basically we have um the form submission coming through. AI then figures out what it wants to say. We wait for 120 seconds and then we send the Gmail. Pretty neat, right? Cool. So big fan of that flow. Um you can manipulate and you know improve that flow however you want. Obviously this paraphrasing here was pretty lowle and weak, but you could do a ton of things. You could ask it to generate you a list of questions to ask the onboard for instance. You
could um have it uh I don't know suggest a bunch of actions based off of some form fields. There's a lot that you could do when you want to make the flow production ready or live. You'd have to click on production URL. This would then be the form that you would use instead of the test one. Then you'd have to activate your flow by clicking this button up here in the top right hand corner. So now basically anytime that uh the production form URL is filled out, we will fill out this flow and then send
an email which is kind of neat, right? Not saying that this is what you guys should do right now. I just wanted to show you guys what that process looks like when you actually activate a node or workflow. Okay, great. Now let's use one final example to show you guys and level this up a little bit. Show you guys how you might actually use this in a real business flow. So maybe instead of an onboarding form, which is kind of contrived example here, we instead we have a calendar booking. What we want to do is
when somebody books on my calendar, um, I want to reply to them and I want to make it seem like it's a personalized reply. Then after that, I want to add a new row to my CRM where I'm storing all this data. Okay, so there are going to be a couple of moving pieces here. And I'm just going to keep everything very light, but I'm also going to walk you through the process step by step. First of all, I have a cal.com set up, nick-leclick/inter, so you can book internal calls with me if you're on
my team using this calendar. As you can see, 1:30 p.m. is open. What I want to happen is when I give this a click, I basically want to use this to trigger a flow that immediately sends them over an email. And it's an email from Nick. It's an email from me saying, "Hey, you know, just saw you booked today. Really looking forward to chatting with you." It's going to substantially improve the perceived personalization of this flow. It's going to make people think that I'm paying private and and one-on-one attention to them, which is great. Then
what I want to do is I want to take that data and I want to use it to fill in a row inside of my CRM. Now, I'm using a um thing called ClickUp here for my CRM. Sorry, wrong account. Let's go over here. I'm using um a CRM called ClickUp. ClickUp is a fantastic high- quality CRM that allows you to do a ton of stuff. Um but for the purposes of this example, I'm just going to be filling in this creative agency template CRM that I set up a while ago. Basically, what I want
to happen is when somebody fills out the calendar booking, I want to add them over here to this meeting booked um status so that I have their first name, their last name, their email address, some other information about them, company oneliner, maybe some meeting URLs. Let's actually get to like business uh flows now because I think honestly after like an hour, you guys know more than enough to do it. And let me show you guys what an actual automation build for something like this, an NN would look like. Okay, great. So the very first thing
we have to do is we just have to set up our trigger here. So I'm going to go over to three NAND examples and then I'm going to just going to remove this on form submission trigger. The reason why is if you have um triggers in NAN um when I test the workflow it's going to test the the other trigger. So we just need one trigger per flow. I'm going to go down here and what I want to trigger is I just want to see if there's a cal.com node. Cal.com is the service that I'm
using. There variety of other ones. There's kalanly as well which I know many people use very popular but I'm going to use cal.com and what I want is my trigger is I want onbooking created. So I have credentials that I can add here. What I'm going to do is I'll go create new credential and then you can see here I need to find my API key for um cal.com. There's also a bunch of docs over here. In my case I know where my docs are. You can see that I have YouTube nn example expires in
24 days. I'm just going to delete that. I'll make a new one. And then I am going to have it expire just in case my silly brain forgets to update this. I'll save. I'm going to copy this. Then I'll go back here to my API key. I'm just going to paste that in. The host is autofilled. It's always api.cal.com. So don't worry about that. Then I'm going to click save. This is now going to successfully create my credentials. I'm now going to go over here, type YouTube just to make sure that I I name it
right and everything. I'll save and test it one more time. Exit out. Okay. So there variety of events that I could use here. The one that I'm going to want is called booking created. But I want you guys to know you can also trigger a flow like this when a booking is canceled. You do it when a booking is rescheduled, when a meeting is ended even. You also have some options here um which are a little bit more advanced. I'm not going to get into all of them, but essentially these light is set like metadata
and other um payloads and stuff like that for more advanced flows where you need to tag people and know where they're coming from and that sort of stuff. Anyway, so what I'm going to do is I'm going to click test step. When I do, it's now listening for one of my bookings. So I'm going to go over here to internal. Actually, you know what? I think I have a better one. Um, instead of internal, don't I have one that's for discovery calls? That's probably a little bit better. Yeah, let's do that. So, I'm going to
go in and I'm going to book a meeting with myself. Uh, I'm going to pretend my name is Peter Jackson and my email address is just going to be my longer email address here. I'm going to fill my gross monthly revenue at 20K. And then for additional notes, I'll say, "I'm a big fan of your YouTube channel and would love to know more about how I can grow past 20K." Then I'm going to click confirm. After I click confirm, I'm just going to open up this page again because I want to watch the event come
in live. And as we see, the event did indeed come in live. We have a ton of fields here. Trigger event, created at, booker, URL, type, title, on and on and on and on. Because remember at the beginning of this when we were just getting started with a simple flow, I was like, sometimes calls have a lot of fields. Well, this node output a ton of fields. So, what I'm going to do just to make sure I don't lose this is I'm going to pin this. And then what I want to do is I want
to feed this into a Gmail node. Now, if you guys remember my previous hack was just going to the Gmail node, selecting it, command C, commandV. Very clean. And then I'm going to go double click on this. I have all the data accessible to me. And now instead of this, I'm just going to say re recent meeting. And then I'm just going to say, "Hey, Peter, instead of just text, why don't I do an HTML email?" Just to show you guys what this might look like. If you want to write an HTML email, a couple
things you have to know. A new lines are this BR. So, if you want to add two new lines, you'd go BR BR. Hey, Peter, just saw you booked a and let's go type. Let's drag this over here. blank call looking forward to learning more about you slashthe business. Then I'm going to say br Thanks Brick. So when I send this email via HTML it'll say hey Peter new line new line. That'll be two lines. Just saw you booked at just saw you booked a discovery call. Looking forward to learning more about you/the business. Then
it'll go new line, new line. Then it'll go thanks. Then it'll go new line. Then it'll go neck. In terms of um you know what this looks like. Let's see if we could customize this a little bit more. Maybe I'll go reming with and then I'll grab the first name in. So I say remeating with Peter. Perfect. Then in terms of the email address I'm going to be sending this to. I'm not going to hardcode this at Nicholas. Now, I'm actually going to enter in Peter's email, which is apparently going to be this value key,
which will always say Nicholas@gmail.com with this example. Um, and then I think at this point, we've now filled out everything, right? Send HTML. Yep, looks good. Let's actually test this. Send myself an email. We've now received a um status of send, which is cool. So, you can see I've received two emails. The first was um cal.com letting me know that I've just booked a meeting with Peter. And the second one is the email that I'm supposed to be sending or receiving as Peter. Hey Peter, new line, new line. Just saw you booked a discovery call.
Looking forward to learning more about you, the business. New line, new line. Thanks, Nick. That's pretty sweet, right? Looking forward to um that conversation with Peter. But I got to be honest, I think that we could probably customize this a little bit better. I don't really like the way that this is um so small and minimal. So, why don't we do a little bit of like um date customization? You guys see on the lefth hand side here, there's a start time and an end time. Well, this isn't a very particular format. datetime format that we
can convert into natural language instead of this. How cool would it be if we could say, "Hey, looking forward to our chat on Tuesday, on Saturday, on Wednesday. See you." And what I'm going to do is I'm going to drag in the start time here. And what you'll find is because of the format of NAD, which can be a little bit intimidating if you're not familiar with it, we have these curly brace curly brace a dollar sign JSON dot and then the variable name start time. Well, the cool thing about Na is if I put
a period here, I can actually do a ton of stuff with this. Like I can do a ton of stuff with this. What I want to do is I want to convert this to a date time, then I want to format this. And the way I want to format this is I want to format this as a date. So I don't go DD no M A. Sorry. There's a specific datetime uh formatting key thing here. here. So, I'm going to read the formatting guide really quickly. And we're just going to find out how to say
like Monday or Tuesday or something. Okay. See this? So, it's CCCCC looks like. So, that's the token that I'm going to use. Or maybe it's E. I don't know. Let's try both. We'll format as E. Awesome. See you Friday. Perfect. You see how um that we're sort of just like iteratively developing or iteratively editing this. And it ends really cool because it actually shows you the value of the thing that you are currently manipulating down here. So, the purpose of this is not to have me for me to expect you guys to know how to
do any of this date uh formatting for now. I just wanted to show you what might be possible with a little bit more complex JavaScript and and JSON formatting down the line. This dot notation is really valuable. It just allows you to very quickly manipulate things. In my case, I called this variable JSON.start time. I then converted it to something called a datetime variable. Then I formatted it as a day of the week and that's why it says Friday. Okay, great. So, now that I have that, let's test this flow. Let's just double check that
Friday was formatted well. Everything looks good to me. And now let's move on with that last part of our example, which is going to be taking this and using it to update uh my CRM, which is ClickUp. So, I'm going to give this a click. Give this a click up. And then I'm going to go click up. And what I'm going to do next is I'm going to scroll all the way down to tasks. What I want to do is I want to create a task. Okay, great. Now, we have the ability to choose our
credentials. So, if I go to create a new credential, you can see that it asks me to connect my ClickUp account. I'm going to click connect. It'll now say, do you want to connect with NSM? I'll say yes, the window can now be closed. Beautiful. And why don't we do that one more time? We'll call this YouTube. Click save. Awesome. Now, I'm going to exit out of this. And now we have access to the credential for for YouTube for my ClickUp account. So, basically, if you guys remember, what I wanted to do a moment ago
was every time a new calendar booking comes in, I want to add a row to this meeting booked um space, and I want to say Peter Smith, person's first name, um status. We don't have the project type or email or company name or anything like that, unfortunately. So, I'm just going to leave most of this out. Why don't we just um hide these columns for now? But I just want to show a proof of concept to show you guys that we can indeed get the data in. And we're going to put the meeting URL here
as well, which is going to be nice. And future videos will show you guys how to build CRM like this and connect them um using naden. Okay, awesome. So now let's head back over to this ClickUp module or ClickUp node rather. And uh we'll go operation create. What I want to do is create a task. The team name is NSM. It'll go and it'll find the space name which will be template creative agency. It'll find the folder name which is CRM. The list name will be sales. I know this because if I look on the
right hand side, right, this is NSM. This is my template creative agency. This is my CRM folder. This is my sales list. So, I'm just going down top to bottom and connecting them. Then, we'll have a name here, and I'll be able to add the name. Now, what do I want to be the name? The reason why I picked this as an example is because we're going to be manipulating data from a node that's not just the previous node, but it's actually a couple nodes back now. And as you can see, this previous node here,
all we have access to are a bunch of Gmail things, right? ID, thread ID, labels, label, ID. If you want to go one step back, what you have to do is you have to open up this cal.com trigger. So basically what we have here is at the very bottom, this is the very first node that we executed, this trigger, this is the second node we executed. The most recent node is always going to be on the top and then every node that's connected to the the previous node. Um it's just going to go lower and
lower and lower and lower. So if we had a 20 node flow, for instance, the very first node in our flow would be down here, second would be here, third would be here, working all the way up until the final most recent one or the previous one up at the top. But anyway, now I want to access data from my cal.com trigger. So that is two nodes back. So it's not going to be um you know immediately behind us, but we could still open and access stuff as needed. What I want to do now is
the name of this record, if you think about it, I want it to be the first and the last name of the person. I just wanted to say Peter Jackson. So I'm going to go here, Peter. And you'll notice that the syntax here changed pretty substantially, but we'll cover that later. Then I'll go space and then last name. So now it says Peter space Jackson. That's the name of the record. Okay. So, why don't I why don't I do this. Why don't I go back to my Gmail? Let's just pin this. Not that it matters.
I'll go over here. What I want to do is I just want to test this step and show you guys what it looks like when something gets updated in my ClickUp. You guys see that Peter Jackson was just added. How cool is that? We've now just bridged the gap and we've added Peter Jackson who was previously inside of NAN whose data we got from click uh from cal.com which is a totally different software platform and we put it in ClickUp. But you'll notice that, you know, a couple things are off here. I want to make
the status meeting booked. And then I also want to fill out this meeting URL. So in order to do this with ClickUp, what we have to do is we have to go and we have to fill out what's called a custom fields JSON. This is kind of annoying to do in ClickUp to be honest. Um I wish that there was an easier way to do this. Uh maybe at some point in time ClickUp will provide an easier way to do this through their API, but hey, what are you going to do? So in order to
do this what we have to do is we have to go down here to where it says add additional fields rather what we have to do is we have to number one set the status name manually. We have to set it to meeting booked. Okay. And we also have to go over here and add custom fields JSON. Now this is pretty annoying to do unfortunately in um N8N. We have to basically figure out what the ID of the field is before we fill it out. And then in order to do so, we also have to
do um use this format with like a square bracket then a space left curly bracket quote ID quote um colon space quote quote then inside of there we'll have the ID. Then we have the value which is the thing we're going to fill it in with. Sometimes you have to do this. I know the ID already. Um so I'm just going to paste that in. And then I'm just going to paste in the rest of this as well for simplicity. In this case um I'm just going to go expression go back here. ID will be
this and then the value is going to be the meeting URL. So what I'm going to do is I'll go here. I'll go meeting. Maybe I'll go URL. There you go. Video call URL. I'm going to drag this over here between these two quotes. Okay. So now if you look at the JSON that I'm sending, it is now uh in the right format uh that uh ClickUp is requesting. Don't worry too much about the code aspect of this. I put this in here just to show you guys that like there is some knowledge that will
make it a lot easier for you to do specific things that you want to do. For instance, if you didn't know this, it would probably take three or four more nodes in order to get there. And that's okay. Um, everybody needs to start somewhere. But in future videos as we cover all of the different functions and dot notations of NAD. Um, stuff like this sort of just adds fuel to the fire. Okay, great. So now I'm going to test this one more time. We'll go back to ClickUp and we'll see what we just did. We
just added Peter Jackson except now we've done so with the status that says meeting book and also with the meeting URL of the call that we're going to have. So in this way we've created a very simple flow that when a new cal.com meeting comes in we reply with an email and then immediately after we log it in our CRM. This sort of thing is crazy effective for small to mediumsiz businesses. A lot of them lack organization and they don't really understand how to do these sorts of connections. Well, the great news is you can
now, you know, assuming that you've you've built this out on your own and I highly recommend you build alongside me. You can now do this sort of thing, not just for ClickUp, but for any CRM out there and not just for Cal.com, but for any calendar booking platform out there. At the end of the day, they all they're all more or less the same. Awesome. So, the last thing I'm going to do, I don't call any build done until I test it end to end. So, I'm just going to remove the pin data here. Sorry.
You got to go up here, top right hand corner, click unpin, then click unpin. Then what I'm going to do is I'm going to test this workflow from start to finish on actual data. If we double click on this, it's listening for a test event, so we have to actually go fill it out. I'm going to go back to my calendar. Now, I'm just going to make a second test booking at like a slightly different time. Let's open up a tab here and let's do it. Uh, we'll go 2 p.m. This will still be Nick.
Well, let's say Sally. Oh, what did I say? Lozen or something. I forgot what her last name was. I think a lozenge is a thing you put in your mouth when you are sick. Okay. Anyway, confirm. This is now going to go through the booking flow. Go on my calendar. Apparently, book me. Uh, and then if we go over here, you'll see we just pulled in the data with Sally Lozenge. Apparently, if we go to our ClickUp, we'll go down here and we'll see Sally Lozen was now put in, which is pretty neat. So, yeah.
Um, that's that for our third NN example. And just to cover things, what we did here was we didn't just learn how to use an app trigger like cal.com do an API connection using an API key. You know, send emails and stuff, but we also learned how to reference data a couple of nodes back, which is very important. And ultimately, you know, most of the complex flows that have value will be you referencing data from all over the freaking place, not just the previous node. So, I hope that this makes sense. What I'm going to
do is I'm going to save this and I'll make this accessible for you guys to play around with. Note that we do not have the trigger nodes in this. That's okay. You guys now, if you've made it to this point of the video, know everything you need to know to get to the same point. Future videos, as I mentioned, are going to be covering a lot of the more code oriented stuff that I just did here for that last section with the IDs and the JSON and the dot notation in detail, just so you guys
can add fuel to the fire and, you know, get a lot more competent with NAN and no code in general. Great work uncovering that first section. You now hopefully understand what NAND is, how to get set up on the platform, and even how to build some simple but useful workflows. But if you guys really want to understand NAND and not just NADN but no code in general, you need a little bit more knowledge in terms of logic data handling and then the ability to manipulate some of the data that we've seen already. That's what this
next part is all about. We're going to dive into some more foundational concepts to separate maybe the NADN automation entrepreneur who is solely restricted to copying and pasting blueprints from the internet to somebody that can actually build templates of this kind out on their own. Just a quick note before we dive in. If you're serious and want to turn these technical concepts into a real business, definitely check out Maker School. It's my Noode AI automation community with daily accountability that shows you how to take this skill set that we're developing right now and actually put
it in front of real customers. I have over 2,000 members in the community as of right now. We get new wins, thousands of dollars closed every day. And if you guys want the straightest line path between somebody that doesn't understand any of this to somebody that is actively running and managing a successful and thriving AI automation business, there is no better way. Anyway, whatever you do, let's dive into the next part. So, if you guys have seen some of the other videos on my channel, you'll know that I put a very big emphasis on building
things practically. I don't really care much for the academic side of things. I prefer we just dive right in and then teach some of these concepts by actually putting nodes together, making workflows that you could sell for business purposes or implement into your own companies. And that's what we're going to be doing today. We can't really get away from doing some of the academic stuff with JSON just because, you know, if you don't know JavaScript object notation, you are going to have to learn some things like types and objects and what variables are and stuff
like that. But for the most part, we're going to be learning all of these concepts down here by building two workflows. The first workflow is up here. And essentially what this does is it feeds in a bunch of lead data to artificial intelligence. This is the Google sheet containing four leads with a bunch of information here. So, we're going to feed in this information to AI. Then, what we're going to do is we're going to have AI generate a subject line for an email, an icebreaker for an email, an elevator pitch for an email, a
call to action, and then a post script, little PS sign. The idea here is this is a real workflow that people pay me for. And so, these are the ones that I want to I want to start with. Essentially, this will allow you to customize email outreach that it seems as if you've done a lot of research into the person. Uh, which is very very valuable in a business setting. The second workflow is a little bit more peculiar, I guess. There's this service out there called source of sources. It used to be called helper reporter
at Haro. Basically, the way that it works is this lovely gentleman here, Peter, will send you uh a bunch of information basically where journalists are looking for professionals in a certain industry to weigh in on some developments and then if you're a professional in the industry and you give the journalist some good info, they can actually tag you and then like use you in an article. It's quick and easy way to basically get listed in a magazine or some very authoritative data source. And what this system does is it basically gets an email like this.
Then it pumps in the titles into AI, does some cool processing, and then we actually write a draft of that email as if we were an expert in that field, which all you need to do is just like quickly review, give a once over, edit a little bit, and then send off to journalists. There's another system that I've sold a number of times. And so I want the videos that I create on NAD to be practical in nature. I want them to be on things that you're probably going to be using for business purposes. So
these are the two systems that uh we're going to be building. They're cool systems and all, but you know, for the purpose of this video, I kind of want to build them from scratch. So, why don't we just exit out of that puppy? That's the prompt that we're going to be using for AI. And for the rest of this, we'll just get rid of that. Okay. The very first concept I want to cover are fixed fields and expression fields. I'm going to be basically convincing you to just use expressions all the time. And I'm also
going to show you how to map different field inputs cuz the last time that we jumped around Nadn, we built a couple of workflows, but I was sort of glancing over a couple of the um like some of the nuance behind fields and stuff like that. So, for the purposes of demonstration, it's going to be pretty easy. We're just going to build the first system out by clicking a button that is going to get a bunch of data from our Google sheet, and then we're just going to pass all of that data in kind of
rowby row into AI. Pretty simple, pretty straightforward, but ultimately something that is very useful and you'll find yourself doing quite a bit if you do cold outreach. So, first things first, I'm just going to press tab. That's going to open up this trigger thing on the lefth hand side. And then, you know, if you type trigger here, there'll be if you type trig, I should say, you'll see a ton of options here. Um, you could either do that or you could just scroll down to the bottom where it says add another trigger and then press
trigger manually. Either is fine, but for the purposes of demo, I'm just going to do that. And basically what I want to do is the second that I run this trigger when I click on test workflow, um, I want to uh, get all of the rows and all the data in my Google sheet. So, I'm going to go up here to nodes. I'm just going to type in sheet. We're going to get Google Sheets. Now, what I'm going to do is if you scroll down here, you'll see that there's this one node called get rows
and sheets. That's what I'm going to click on. Now, I've already done a connection before. Um, what you're going to have to do if you want to connect to your Google Sheets account is go to create new connection. Now, because I'm on the cloud hosted offering, and keep in mind if you're not on the cloud hosted offering, um, these sorts of connections are a little bit more difficult. You have to go to Google Cloud Console and get set up there. But because I'm on the cloud hosted offering, all I need to do is click sign
in with Google over here, and I'll actually go connect to my email account, and then it'll create a credential for me, which is pretty handy. So you can see it's saying it's already has some access just because I've already done this connection. But for the purpose of this demo, I just wanted to show you guys what that looks like. And then I'm just going to save this connection here with a name so that it's just nice and organized. Okay. And what we want to do is we just want to grab this Google sheet up here.
Right? So in NAN there are variety of ways to do this, but I'm just going to I'm going to be looking for a document. Sorry, a sheet within a document. My bad. The document we're going to want to select is from the list. And we're actually going to go down. We're going to choose this one called leads, comma, space, January 27th, 2025. So, as you can see, we have already manually found that. Okay. And then the specific subshet that we want is this sheet one because I guess that's the only one that we have here.
So, I'm just going to click on this. It's going to actually do an API call to Google Sheets. It's going to find that there's only sheet one here. Then I can give it a click and then voila. Let me just run test step and let's see what happens when I click test. Okay, great. So, I've offiscated this data. This data is not um actually one for one whoever this this person is. I've gone through and I've like renamed them and stuff like that just for privacy purposes. But as we see on the right hand side
here, we we have a bunch of output and we can see the output in a variety of ways. Tabular JSON schema. Most people and they like the schema look because it just kind of compresses the information nicely. It's a little bit easier for them to see. I'm a little zoomed in here too. Um but uh yeah, you know, normally like you see most of the node variables which is pretty handy. But this JSON one over here, this is really intimidating for a lot of people. And so we're we're going to cover this in detail. I'm
going to show you exactly how you read JSON, what all those things mean. But just I just want you guys to know that for the remainder of this course, I'm going to be using primarily the JSON and the schema view. But I'm actually going to tend towards JSON. And the reason why I'm going to be tending towards JSON is because like JSON says all the same stuff that the schema view does anyway. But unfortunately, part of the way you learn JSON is just by kind of staring at it a lot and squinting at it and
kind of inherently and intuitively understanding the formatting. If we're going to be looking at outputs all day anyway, we might as well kind of get, you know, kill two birds with one stone. All of the same data in JSON is represented in schema anyway, it's just instead of like the quotes around key names and stuff, you just have sort of this light gray box alongside like a type sign here. So, I guess the point I'm making is we might as well double up and just learn how JSON looks while we're proceeding with the course. Um,
and that's why I'm going to be using this. Even if it looks a little bit more intimidating, don't worry too much about it. Okay, so I said that I'd talk about fields, right? So fields in N&M just as I was covering on the previous video are stuff like this right we have this sort of center node config option here for our Google sheets node um you know one of the fields we selected was this YouTube credential to connect with another one was this resource sheet within document operation document sheet but I want you to know
that these are actually all representable in code as well so as you see over here we have two different types of fields one's called fixed and the other is called expression So, by default, just to keep your life easy and to not like freak you the hell out, especially if you're like a newbie in NN, um they're going to keep all the fields to the fixed type. But if you click on expression, you'll see that things are now a little bit different. Notice how when I went to fixed, we had like a nice little, you
know, it said um leads January 27, 2025. And then when I jump over to expression, now we have some big long ID. So, what is this? Why is it structured that way? And what exactly does any of this mean? Well, if we pay close attention, this ID field here, 1 lowerase o t r r r r r r r r r r r r r r r r r r r r r a t4 C capital C and then the rest of this big long ID string over here. If we go to our Google sheet,
what you'll see is that that ID string actually matches the URL of our Google sheet exactly. This takes me to a wider point. Most of the time, sorry about that. Most of the time, anytime you're accessing a resource on some API or even just on the internet, they will store the ID of the resource, which is sort of like a hidden representation of it, in the URL. So, you know, one of the examples that I provided the other day was I went over to ClickUp, right? And inside of ClickUp, I like searched around for some
record. I'm just going to click on this here. This is this was my old content calendar. Um, how to send 1,000 cold Instagram DMs per day. That was one of the things I wanted to do. This right up here is the ID of the record. 86B27A7Zm, right? If I wanted to do something with this through their API, this is the ID of the record that I would be calling. So, I want you to know that like ClickUp, uh, Monday, uh, like even Gmail, basically every service out there, they will store the ID of the thing
you want to modify or update or whatever just in the URL. So if ever a field asks for an ID, you can almost always just go to the URL of the thing on the actual user um you know on the actual app like the user interface. Then you can find that URL thing. You just hardcode it in here. Okay. So that's just a just a brief look at some of the differences between fixed and expression. Basically fix a lot of the time just to to keep you guys um to make sure that like we're on
the same page here. Fix is just the simpler version. Then expression is sort of what's actually going on under the hood. So, you know, um, NAND just defaults to fix like it just did here because it doesn't really want to scare you away. But in order to really unlock the value of NAN, we have to go to the expression, um, field. And I'm going to show you here why, you know, I basically just use expression for everything at this point. Okay. So, looking at the output here, what we have is we have we clicked and
then we got a click event that was counted as one item. And so, N8 actually shows you the number of items that are passed on. Then we pumped that click event into Google Sheets and then that click event outputed four items. So now we actually we're working off of array data or tabular data which I'll cover um in a moment. But essentially with these four items now what we want to do is we want to pass each of these items into artificial intelligence and we want to have AI tell us something about it before um
writing some cold email copy for us to insert into an email or maybe we could just send a Gmail directly or something. So what I'm going to do is I'm going to click on this button. I zoom out a little bit. What we want is we want um if you go down advanced AI, we want is we want this open AI node. And specifically what I want is I want the message a model. So if you've seen me connect this in the previous video, you'll notice that you know in order to create a new credential,
you actually have to go and you have to find the API key from OpenAI in order to do this. This is pretty simple to do. You just type platform.openai.com/ I think it's like account/appi or something. You'll have to click on this button here to open the documentation to tell you more. But anyway, you can basically just create an API key for N8N. Um, it's very simple and very straightforward to do so. And I've already done this and I've called it YouTube. So, I'm just going to use that credential just so I don't have to like
leak another API key. Now, again, we have a ton we have a ton of fields. We have resource text operation message model from list choose. Keep in mind the fields are again fixed, right? It's trying to make it really easy for us to select GPT40. So, I'm just going to go down here, type GPT four, and then I'm just going to click 40 O. And now we actually enter in the text that we're interested in. Okay. And this is really where you're going to start learning the differences between the fixed and the expression. So fixed,
again, fixed is just I mean, it's what the name implies. It's fixed. It's text. You can't make this dynamic. You can't add variables to it. It's the simplest way to get up and running with a node, which is why NAND will default to fixed. Um, but over the course of the next few minutes, I'm going to convince you to basically always just use expression. Okay. So, I I saved my prompt somewhere else. The first thing I'm going to do is I'm going to add a system prompt. So, I'm going to go down here to system.
I'll just say you are a helpful intelligent writing assistant. Usually, the way that you will do um AI calls is you will have a system prompt first. Then you'll have a user prompt after. And the user prompt is where you actually give it the instructions you want it to do. So, you know, in our case, it's going to be like, hey, I want you to write a bunch of fields that are templates that we're going to insert into a cold email later. And then after you have the choice to provide a bunch of examples. So
you could provide an assistant prompt and then you could do another user prompt. Assistant prompt. User prompt. Assistant prompt. You can do that however many times you want just to show it how things work. For the purpose of this example, I'm just going to be providing a single user prompt. And what I'm going to be doing here is I'm just going to copy over my prompt below. Let me paste that in. And let's just read through this together. Your task is to personalize an email. You'll do this by taking as input a prospect LinkedIn profile.
Then editing five templates for different sections of the email. Subject line, icebreaker, elevator pitch, call to action, and a PS or postcript field. If you're unfamiliar with postcript, you know, at the bottom of an email, it'll just say PS, I really miss you. Can't wait to see you. That's what a postcript field is. We basically want AI to automate that for us because there's a lot of value in making those postcript fields seem human written. Anyway, now we're offering it some templates. subject line. Hey, name I think I have something for you. Re and then
cool thing about them that we discovered. Let's just go unique thing about them or their company. Icebreaker, I know you're doing thing and I've been following related thing for a while, so I figured it made sense to chat. Next elevator pitch, the TLDDR. I think I can add 5K a month to their paraphrase business with a few automated systems. And then there's a call to action. I just did this for a very similar industry company and we had 28,350 in a few months. They do related things. So I'm very confident I can duplicate this at
minimum. Would be 100% risk-f free. I guarantee at least 20 appointments booked or you wouldn't have to pay. Pretty neat, huh? So then I give it a bunch of guidelines. And feel free to pause the video if you want to take a look at it. The last thing that I do is then I say respond in JSo N using this format. And if you've at all used AI before, you'll see this JSON thing come up again. JSON. JSON. JSON. We're going to cover that in just a few minutes, so buckle up. Okay, great. So, we've
given it a ton of uh instructions in the first user prompt. So, what I do next is I just give it a user prompt with the actual body of the input that I want to give. And if you think back here, um you know what this Google sheet is just just so you guys um are all on the same page as me, is I've basically gone and I've scraped a bunch of data about random people on the internet that fulfill some criteria that I have. So, chief executive officer, director of demand generation, director of marketing,
business development, manager, some dentistry person or something. Okay. And then I have a bunch of fields here. One of the fields I have is I have a summary field where people basically write their own summary of who they are and what they care about. We have a ton of other fields as well. We have company location. We have a description of their title. We have um I don't know their their industry. And the cool part about AI is you can just feed this into a large language model and have it have it automate something for
you. Have it have it write something customized. And so that's what we're going to be doing here. The thing is though, right, how do I get dynamic data into this? So, I don't know, let's say um one of the things I want is I want to feed the AI the person's full name. Notice how this is fixed here, right? If I just typed Amy Wabe, then that means that every time I do an API call that includes their full name, I'm going to have it say Amy Wabby. This is fixed. It's the same thing every
time. If you want to make this dynamic, what you have to do, there are variety of ways to do this, but I'm going to use the expression field, is you have to click expression and then you drag the field that you want and then you drop it. And you'll see that when I do that, we've now just inserted a little bit of code. This is in N8N's um code format, the equivalent of the variable that we just pulled from our pinned data or our our data from the uh input. And what you see down here
is this is separated into two halves. The top half is the code representation. We said full name just in like regular characters. And I can manipulate this how I want. Then a colon, then a space. And then there's uh curly bracket curly bracket space dollar sign Js N. FU L N A M E space. And then a right curly bracket right curly bracket. Up here you have the code representation. And then notice that underneath here we have result. It actually shows us what the data that we're pulling in is from the input, which was right
over here. Now, I'm going to be feeding it a bunch of data in order to have this personalized. I'm going to be feeding in their full name. I'm going to be feeding in the summary. I'm going to be feeding in the title. But I just want you guys to to notice how these these variables change between the full name, between the summary, between the title. And you're going to notice that there's kind of a pattern there. Okay. So, full name was that. We'll go title. I'm just going to drag this in. Paste it in. Notice
how the first one was jso nf full name. Second one was jso n.title. Right. Let's see what the third one is. Let's go down here to company. Company. If I drag and drop this now says JSON company. You know that the C is capitalized. That looks a little bit new, but for the most part, it's still pretty self-explanatory. It seems to me if I were an alien staring at this and looking to try and figure out what the pattern here is. It seems to me that every single time I drag and drop one of these
fields in there, it says dollar sign JSo N dot and then the name of the variable. The name of the variable tends to be whatever I'm looking at on the left hand side here. So what if hypothetically instead of me doing this drag and drop what if I were to actually just try and write this myself? Well, let's see what happens. If I zoom in a little bit, just so we could all see. If I go curly bracket curly bracket, you'll see that I'm now entering sort of the next level up in NN. I'm now
manipulating like code or JavaScript, their version of JavaScript, the JMSE path, I believe it's called, directly in the expression editor. And this is where N gets really powerful because you also have a ton of built-in methods and built-in ways you can manipulate this data with literally one click, one little button tap without having to drag and drop all these modules everywhere. You can just do so in the convenience of your own field editor. Okay, so the very first thing that pops up is it says suggested JSON. If I just type that and then I press
enter, you'll see that now I have access to all of the fields that I had access to earlier. So instead of me dragging and dropping all this stuff, what if I just wanted to write the word summary here to grab this, if I just type summary, notice how this now turned green. And we've added all of that information down here to the results tab. All that information is here. How cool is that? So now, you know, if I want to continue on, I'll go industry. I'll go dollar sign JSON industry. Voila. Next, we're going to
go company location. I'm going to go um JSON.co company location. Voila. Notice how it's trying to autofill this for me, right? I'll go title description dollar sign JSON dot to ital description. Voila. And I basically have the ability to do this um infinitely depending on how nested the data is in the JSON structure of the input. I I'll run through how to do all of that um in a moment, but I just want you guys to sort of pattern match, look from the outside in. How am I actually referencing all these variables from from previous
calls? Okay, great. So, to me, you know, as somebody that does this sort of personalization all the time, if we click on this little button here, we can actually open up, we can see all of the um code and all of the text. To me, somebody that does this all the time, this looks like sufficient amount of information for us to personalize an email off of. So, I'm actually just going to call it there, and we're actually going to just run this puppy. But basically what's going to happen is we're just going to be feeding
in all of this stuff to artificial intelligence and we're going to be saying, "Hey man, based off of all of Amy's info, I want you to tell me something about her." And then I want you to write an email um based off of the template that I provided you earlier. The last thing I'm going to do is I'm going to go down here and press output content as Jason. Give this a click. And then I'm not going to modify any of the options here either. Um but I'm just going to click test step. Okay. Okay,
so what's just happened or what is occurring as we speak is I'm feeding in four items to open AI. I'm basically Blitz going item one, item two, item three, item four, and it's happening all at once before they show us the output of each of these. So that's why it takes a little bit longer than usual. Um, but this is more or less what's happening under the hood. Okay, great. And we just received an output. Um, so what I'm going to do is I'm just going to zoom out a little bit just so we could
see this in completeness. And I'll use schema for now just to make it easier for you guys. doesn't you don't have to like scroll all the way to the right to see it, but let's take a look. Um, the output was content, subject line, icebreaker, elevator pitch, call to action, PS. So, it actually went it outputed five fields for us and we can use those fields in future nodes very easily. The first thing in the subject line was, "Hey, Amy, think I have something for you regarding boosting online strategies." The icebreaker was, "I know you're
leading creative web solutions and net directives and been following innovative marketing strategies for a while, so I figured it made sense to chat." The TLDDR, I think you can add 5K a month to your client focused internet marketing efforts with a few automated systems. The call to action, I just did this for a very similar IT consulting company. We hit this amount. They do e-commerce and marketing, too. How cool is that? So, I'm very confident I can duplicate this at minimum. Would be 100% risk-f free. I'd guarantee at least 20 appointments booked. You wouldn't pay.
P.S., even if we just chat, I'd love to hear about what you're doing with video marketing. That sounds pretty cool to me, right? And if I were to receive an email like this, you know, aside from the subject line, which is a little bit vague, boosting online strategies, but you can't fault the AI for not being perfect 100% of the time. Um, you know, even if I were to get something like this, it would seem as if, uh, you know, like the person that's reaching out to me did their did their research at minimum and
is reaching out to me sort of in a personalized customized way as opposed to just like blasting me a big sequence. So, uh, what else do I want to do with this? Well, if you guys, you know, remember back to the beginning of the video, the there weren't just two or three nodes here. There was um there was a node that updated the Google sheet. So I'm going to show you how to update the Google sheet. And what we're actually going to do is we're going to take this one step further and I'm actually going
to draft some emails to send to Amy and the rest of the people here. So actually the first thing I'm going to do is I'm just going to go over here and pin this output. The reason why is because if you think about it, me calling um OpenAI there, that was a little bit like computationally expensive. It took me a little bit of time. I don't actually want to have to rerun that over and over and over again. pinning the data just allows me to capture that, cache it, and now I can just like test
all subsequent nodes using that, which is very straightforward. Okay, so what I want to do, I want to update this Google sheet. So I'm going to click here, search nodes, I'll type sheets, and what I want to do is I want to um update row and sheet. I'm going to select my credentials again, YouTube. The resource will be sheet within document. The operation will be update row. Let's instead of using the fix, let's actually just use the expression so I could show you how this works. Just going to grab the ID of this field or
of this sheet. Paste that in there. Voila. Then the sheet that I'm going to be picking, it's just going to be sheet one. So notice that the top here we use the expression field view and then down here we just use the fix. So it actually use the expression field view to do an API call to their backend to discover that sheet one was the only sheet and then we selected it there. We can also just feed in an expression. And as you see when you go from fix to expression for the specific sheet type,
it just says G equals Z. G equals Z just refers to the first sheet. um basically here. So we're we're always going to be selecting the first sheet. But anyway, for this I'm actually going to go from list and then I'll just go sheet one. Keep this simpler. Okay. Now it's going to be fetching a bunch of columns for us. And basically in order to do this update, what we have to do is um we have to grab the data from the previous nodes and then we have to update every single column here with that
data. If I were just to, you know, scroll all the way down and update the columns that I care about, like subject, icebreaker, elevator, pitch, call to action, postcript, it would just leave the rest of these blank, which is kind of annoying if I'm being honest. But I don't want the rest of these to be blank and these to be filled. I want all of this data because I'm just going to import this into some cold email tool later, right? So, what we have to do is now, this is kind of the initial idea behind
this system. I'm going to go through and I'm going to update every single one of these um using the expression tab, and then I'm going to be pulling data in. But I'm not going to be pulling data in from here. I'm going to be pulling data in from one node behind it. So you guys could see what it looks like in code basically. Okay. So the first thing we have to do is we just need a column to match on. In order for the automation to know which row should be updated, we have to find
data that includes that email. So I'm going to go email. Then the first thing I'm going to do is I'm going to scroll down here to the previous node, not the OpenAI node, but the Google Sheets node, the one that like first listed us the data. I'm going to drag this feed that in there. And you'll notice that the format now looks different than it did before. Previously, we had a dollar sign JSON dot item. Right? Now we have a dollar sign and then a bracket single quote sign. The name of the node, another single
quote sign and then another bracket. And then we go do item.json. So when you when you access node data from more than one node back, you have to use this new format here, which is kind of annoying, but you'll see how easy it is when we just like kind of copy paste and spam our way through. So, uh, how about this civility? I'm going to go to expression. I'm going to paste this in. Then, instead of email, I'm just going to go civility. How about this first name? Let's paste that in there. We'll go first
name. How about this first name suggestion? Paste that in there. Go expression. Go first name suggestion. How about the last name? I'm going to paste this in there. Go last name. How about the full name? I'm going to paste that in there. Go expression. We'll go full name. How about the title? I'm going to paste this in there. I'll go title profile URL. So, you can see, you know, we're picking up the pace a little bit. It's getting a little bit faster and faster. Company, company, illegal name, company phone. And I'm just going to go
ahead and um cut to me having actually filled all this stuff out just for brevity. Okay. Okay, elevator pitch, call to action. Looking good. And then last but not least, we'll do um I think it was just PS or was it a post script? Yeah, sorry, it was just PS for that. This is the one situation which uh the column name is a little bit different from the variable name down here. Okay, now that we're done with that, let's just quickly cover um just some little differences here in the formatting just so we can get
a runup on the JSON, which I'm about to teach you. If you scroll all the way up here, you'll see that some of these, well, actually most of these followed this format. It was Oops, sorry about that. Let's go over here. It was um curly brace curly brace dollar sign the name of the node in single quotes dot item.json dot whatever the value was dots summary. In this case, this one was regular company URL. This one down here was VM ID. You'll notice that a few of these are actually a little bit different. a few
of these in particular the variable names with spaces. They weren't just dot you know the name it was square bracket single quote and then the name of the variable that we're referencing. The reason why we had to do this instead of just doing the dot and then the variable name is because JSON in JavaScript object notation you can't query I mean the technical term is you can't query a key that has spaces basically just because spaces aren't really represented. So, you know, if we scroll down here to some of these variable names, first space name
space suggestion, there's a bunch of spaces in there, right? So, the way that you get around this in uh NAN's formatting is instead of calling, let me get that specific example company legal name or was it uh first name suggestion. So, the way that you get around this is you can't just go first name suggestion cuz that kind of breaks the formatting here, right? The way you can get around this is two things. when you can make it so that the input data aka the columns in your Google sheet are all just one word. So
if instead it was first name suggestion, this would be fine. You could also do something like first name suggestion. Some people do that format. I don't really like that. I don't know why. What I do is um called camelc case. It's kind of like a programming convention. And here we can get into like a a lifelong mutually assured destructive battle where some people prefer camel case, other people prefer underlining. Um, but I'm team Camel Case, so go team camel case. Um, instead, you know, if we want to represent the spaces, what we have to do
is we have to go brackets here, um, single colon, first name, suggestion, another col, uh, another quote sign, and then another square bracket. So, don't don't sweat the small little formatting stuff too much. I just wanted to give you guys like the best way that I found to learn this is literally just to like spam a bunch of examples. Um, that's what I did when I was picking this stuff up. I didn't read a bunch of books on JavaScript object notation or expressions or whatever. I just spammed a bunch of examples. And the human brain
is such that if you squint at it long enough, you'll sort of figure it out intuitively. Uh, okay, great. So, now that we've mapped all these, let's actually go and let's, um, let's update this data, right? That's the whole point of this. So, uh, now that we've mapped all the data, if I click test step, and then I go over here to my Google sheet, scroll all the way to the right, you see, and it just took us a second, but you see that we just, boom, we just updated all four of these simultaneously. Uh,
we got the subject line for Amy, subject line for Joe, subject line for Mercedes, subject line for Susan. Same thing with all the elevator pitches, call to actions, postcripts. You'll see that the the the copy of the email is pretty similar, but um it it changes. So, this one's I know you're leading creative web solutions. I know you're le into leveraging customer voices. I know you're focused on building relationships. I know you're advancing digital dentistry. These are all basically like reframing or paraphrasing um the things that they said in their profile which ultimately uh you
know is meant to make them go like oh okay this person did their research they read a little bit about me. So that's pretty cool. Um why don't we take this one step further now. Why don't we pin this and then I'm actually going to create a Gmail draft in my inbox just so we can see what's going on here. So I'm type draft create a draft. I'll connect with my Gmail credential and this is before I did the naming convention so it was probably number three. We're just going to create a draft. The subject
line is going to be, let's just go to fix now that we know how to do this. It's going to be JSON dot uh subject right here. And then the actual message, it's going to be pretty interesting, but I'll show you I'll show you how we put it together. First thing we're going to do is we're going to go JSON dot. And then what I want to do is I want an icebreaker. Uh, sorry, I don't want an icebreaker. I want to go hi. And then I want to grab the person's name. So I'll go
Jason first name right here. So hi Amy, then we have the the JSON icebreaker. Next up, I want to go JSON dot uh sorry dollar sign JSON dot and then what were we doing here? Was it the elevator pitch? Yeah, it was the elevator pitch. Paste that in there. Then we want to go dollar sign JSON dot what's the next one? Call to action. Beautiful. And we also want to go dollar sign JSON dot and I'm sure you guys can guess what the last one is, but very quickly make sure you do make sure you
know u postcript. Now if we open up this thing in the bigger example window, you'll see the email says, "Hi Amy, I know you've been leading creative web solutions and net directives. Been following innovative marketing strategies for a while, so I figured it made sense to chat. The TLDDR, I think I can add 5K a month to your client focused internet marketing efforts with a few automated systems. I just did this for and even if we just chat, I'd love to hear about what you're doing with video marketing." I guess I actually need to add
a PS sign here. And it looks like none of these have periods. Actually, I think this last one has a period, but not all of these do. So, just because I was a little bit um fast in kind of designing this and I didn't put periods over, I'm actually just going to add the periods directly into the expression editor. I'm go PS here. Okay. And now, if we open it up, this is what it looks like. We got periods everywhere. Cool. Wonderful. And then we have a little PS sign here. Even if we just chat,
I'd love to hear what we were doing with video marketing. Very, very cool. Awesome. Awesome. So, now that we have that pinned data, um, why don't we just draft these emails? So, I'm going to, uh, create a draft. I'm not actually going to send this cuz I don't just want to spam a bunch of these people. I've also changed the email address and stuff, so I'd get a bunch of bounces. We're just going to test step. It's executing. We just executed four nodes. So, now if I go over here, go to drafts, you'll see here
that we have, "Hey, Susan, think I have something for you. Red digital dentistry." Oh, gez, I'm realizing I didn't put the um email address in actually. Yeah, I did not put the email address in. I just did the draft. U in options you have to go to email. And then what we want to do is we just want to drag that back here. JSON email to get that address. Let's create four more drafts just for shits and gigs. Then why don't I just delete the ones that I just generated uh right over here. Going to
just discard these. And then you see that the four that I just did now have just popped up. And they also have the email addresses there. So yeah, that's that with that example. Um, I think at this point you guys probably have an intuitive understanding of how these fields work. And hopefully I've made a case for why you should just always use expression. Like there's no real need to do fixed because if you think about it, like you could just write the same fixed thing. Like if I wanted to type, hey, think I have something
for you regarding marketing strategies. And I just wanted to send the same thing every time. I could do so with the expression view of the field, right? Like same thing. It's just here I also have the ability to u modify uh code a little bit and like do something if I wanted to. So, I personally am always going to be using this moving forward. And the reason why, sorry, it can be kind of a lot to see if you muck around with. Just always put a dollar sign first if you're referencing data from the previous
node. Uh, and the reason why is it's just going to be the easiest for me. Um, you know, you get all the variables up here anyway. It's no big deal. So, we're doing subject. Stick that in there. We got the subject line. We are good to go. So, uh, I think we probably learned a fair amount about the fixed fields and expression fields at this point. Um, the last thing I wanted to cover, I say mapping different field inputs to it. The last thing I wanted to cover was uh if we go back to Gmail
here and if we scroll down to actually this is a bad example. Why don't we go back to open AI? You see here how um I selected the RO field and it was fixed and then I selected from a dropown user assistant system whatever. Well, I can actually just go expression and what you see here is this is just text that we are feeding this API the uh the node. We're actually just writing user. So instead of writing users, you could also write a system. This fix stuff. This is just made to make our life
a little bit easier. But anytime you want to get the actual data representation, just move over to expression. So what are some examples of that? Well, like you see these simplify output and output content is JSON fields. We go to expression. You'll see that what we're actually passing is we're passing this true value. We're literally just writing true. Um output content is JSON. If we move it to expression, you can see we're actually just passing true here. For output content is JSON. The point that I'm making is um all of this is basically just um
you know if we just strip away all of the basic simple stuff. You can start getting into what's actually going on behind the scenes. How we're actually communicating with these nodes. The way that we're actually communicating with these nodes in practice is we're sending the term true. Now the reason why this one has quotes around it I believe is because um true is a special case. It's called a boolean which I'm I'm about to cover right now. Um so I believe you need these quotes just for NAD to like not bug out at you. um
just one of those unfortunate peculiarities of the platform. But that's that for fixed fields and expression fields. Okay, next up, let's talk more about JavaScript object notation. And if you guys already know JSON, if you've already experimented and and understand the various formatting types available here, feel free to skip on until we move on to how data in N8 is represented. Um should be about 15-ish minutes or so. Uh but for everybody in the audience that doesn't understand JavaScript object notation, I just want to go real deep into it and I want to make sure
you understand everything about JSON because ultimately as opposed to a lot of other noode platforms, NAD it doesn't ignore code or try and shove code away. It actually embraces code. So understanding a little bit of some of the um code types like JSON for instance makes you way more powerful. This is really what like everybody that makes money with this platform uses. We just use JSON to send data back and forth. Um, and you know, if you don't know JSON, everything's going to be a little bit trickier for you. Okay. So, what's the best way
to um intuitively understand JSON? Well, what I'm going to do next is I'm going to walk you through the various data types in JSON. Uh, I'm going to give you just like a a brief little um structure and format, and then we can actually just walk through JSON kind of step by step depending on different variables and stuff like that. So, I'm just going to go and type in JSON formatter. This is just the simplest and freesting platform I found online. As you can see, we got tons of ads in the middle here. you don't
pay anything to use it, but basically what's happening under the scenes is behind the scenes is it's running um with every time you press a keystroke, it's just double checking to see if it's valid JSON. This is actually pretty useful for us because we can we can verify if something is indeed JSON or not just by looking at it. This isn't the only way to do it. Obviously, we could do a ton of different things. We could I could open up like a code platform like VS Code or something and do the same thing, but
I just wanted to keep this thing accessible for all of us. All right. So, zooming way in here, um, just so I don't get ads in my face 24/7. So, what is JavaScript object notation? Basically, JSON um is just a way to represent data in a structured and standardized format that minimizes the number of characters and it also minimizes the ambiguity so that when we send data to and from some API or something, we could do so as efficiently as possible. So the way that JSON works, the way that you send and receive data is
based off of two um two concepts. The first concept is a key. So I'm going to write a key here. This key is going to involve my name. The first name is going to be sorry um the the key name is going to be called first name. So the key is just you can think of it as like the name of a variable. So the variable is called first name, but what the variable equals is a whole different matter. And that's where the value comes in. So first name I'm going to set to Nick. So
this here is proper or well formatted JSON. It's not yelling at us or anything like that. It's it's it's actually good, which is nice. So this is an example of one of the simplest JavaScript objects that you could build. It is a onekey uh one value object. The key being first name and the value being neck. You've undoubtedly seen examples of this before if you tried working with any noode or coding platform um you know nadn included. The thing is in JSON there are a few simple but consistent formatting quirks that you just have to
pay attention to. So the first is there are variety of different data types. Now as you can see here what I've done is I have this open curly bracket and then close curly bracket. I have the key name over here, a a colon, that's just these two dots, and then I have the value, but what I've done is I've wrapped everything in these double quote signs here. So, first name, double quote, Nick, double quote. The reason why is because the data type that I'm going with here is called a string. It's actually a particular data
type. A string is just like written text. Okay, so this is if if instead of first name I say ID, this here this is a string data type, but it's not like you don't only have strings available to you. Although a lot of platforms prefer strings, you also have a variety of other data types. Here's another data type we have access to. This is a number data type. It's numeric. So in order to um you know send and receive numbers, you don't actually have to wrap them in quotes. This red here just corresponds to it
being linted or formatted or whatever by this JSON formatter as a number data type. So this is still valid JSON even though we don't have the quotes around this. Okay, this is not valid JSON, right? This does not mean anything because we're using string characters uh and we're inserting it in something that the software that we're going to be using NN is going to be expecting to be a number. So basic rules of thumb are uh you can't just write a string without wrapping it in quotes. And the unfortunate reality is numbers can be both
numbers and strings. So three ways to do X. Maybe we call this titles, right? The three here, this is a number, right? But we are still wrapping this within the quotes of a string. However, this is different from this. And so in practice, the reason I harp on this is because uh in practice this usually doesn't matter that much. No code platforms will take care of like the type conversion for you between number to string. Um if you're using a number, if you're sending it as like just the three without the quotes around it, um
for the most part, that's that's okay. You'll be able to use this as a string later on. But in like pure JavaScript and a couple of programming languages, you can't actually just like if you wanted to, I don't know, run a function after this that added a number. um you know maybe it was like here let me show you number of things then title template let's say I had some function where I wanted to add the number of things to the beginning of the title template so that it said three ways to create NAN flows
five ways to create N flows 15 ways to create NAN flows some programming languages wouldn't let you do that in which case you'd have to convert this to um you know a string and then you could just go number of things plus title template equals 15 ways to create N flows. Okay, great. So, we've covered numbers. We've also covered uh and numbers, I believe they have some fancy name, int or or technically they could be floats. They could be a number of things, but um in our case, we're just going to go numbers. Next up,
I want to cover a couple of additional data types. So, one of the data types is called bool. So, a bool stands for boolean. Boolean just means zero or one, true or false. So, true, see how this just turned into orange instead of gray. Um, true is an accepted bool and you don't actually need to wrap uh quotes around this true in order for it to technically be valid JSON. Now, for the most part, I will always just wrap quotes around all this stuff anyway because as I mentioned, they do type conversions and it doesn't
really matter to me too much. But I just wanted you guys to sort of explain why sometimes you see stuff that is not wrapped in quotes, and that's one of them. You also have a few higher level data types. And one of the higher level data types um that I'm going to show you guys, I'm going to show you two. The first is I'm going to show you an array. An array looks like this. It's with square brackets. So you have a left square bracket and then a right square bracket. Then the other is another
JavaScript object. And the really cool part about JSON is you can infinitely ne nest different data types within the values of uh of a key. So, I could theoretically wrap an array, which is just a number of things. And then inside of that array, I could wrap a number of other JavaScript objects that go infinitely deep. And I'll show you guys how to do this in practice. But maybe we'll just go items. Then here we'll go first name, Nick. Here we'll go first name. And we'll go Sally. Then here, uh, let's just do two so
I don't run off the page. So now what we've done is we've created JSON where we have a key called items. Then inside of said key we have an array and inside of set array we have two more objects. Both objects have the key called first name and then they have different values. The first has a value of Nick, the second has a value of Sally. Now to make people's lives easy, usually the way that this works is you will do some level of uh formatting like this string formatting just to make your life really
really easy. You'll be able to see like where the item starts and then there's usually like a fair amount of indentation and I don't know the exact amount of indentation but usually it looks something like this. Now at a glance you can kind of see the structure of this. It's sort of nested. You have um this top level array and inside of the array you have two objects. First name Nick, first name Sally. Okay, great. So, let's create a hypothetical JSON object. And just because I know the most about myself, I'm going to be creating
this for myself. Let's hypothetically just create a JSON object. And let's just do like a user object. Okay. So, what I'm going to do is I'm going to go user. That's going to be the key name. Then I'm going to go uh colon. And then I'm going to create another object. Inside of my user object, I'm going to have first name. First name is Nick. We have a last name. My last name is Sarafh. Um I'll have city. My city for the time being is Calgary. I'll have um foods he enjoys or foods, let's just
call it food preferences, right? Cuz if you say foods he enjoys, now you're um insinuating that has to be a he. And then what if you add a user in the future that is a woman? Do you want to change the key name? No, obviously not. So food preferences, I'm just going to add an array. And inside of my array are going to be a bunch of strings. So, one of my food preferences is um I don't know, Thai. I'm going to have another one that is uh I don't know, like Japanese. Okay, so I
like Thai food and I like Japanese food. Apparently, I like absolutely nothing else. I have a very strict diet. Okay, cool. And then why don't we add um let's just add one more. And then I'm just going to add one called friends hypothetically. Um but because as we all know, I have absolutely no friends. Um, and then inside of friends, we're going to add a another object. We're going to add an array. And inside of that, we're going to have first name. We're going to have Peter, my uh dearest and longest friend, of course. Thank
you, Peter. Then underneath that, we're going to have um last name Griffin because I am now uh loving family guy. And that's one of my friends. And then I'm just going to copy this over. I'm going to add a a comma because you need a comma in between all items in an array and also all items in an object. So, we have our object here. It's a pretty intense user um object. We have a first name, last name, the city the person lives in, the food preferences, we have a list of friends, right? The reason
why I go into this much uh detail here to create this object is just because I want to impress upon you that you can make an object arbitrarily detailed. You can make it as detailed as a human being could ever possibly want. And a lot of the time you'll see that these APIs that you're accessing, these these calls that you're making to these different nodes that return you data about a particular software platform, they will be really really deep and they will have nested data like six or seven things uh levels deep essentially. So the
easiest ones to use in my experience are just the ones that are all um you know surface level. You just have like a user object and then a first name and then a last name, a city and then maybe some food preferences. But in practice, you know, we need to be a little bit more capable. And understanding how data is structured in JavaScript object notation is uh probably like half the battle to be completely honest. So, I believe I've covered everything I wanted to cover. The last thing I'll mention is um you can't have a
comma, I believe, be the last Yeah, it doesn't allow you to have a comma for the last item in an object or an array. So notice here how we have a curly bracket, then we have the key name user, then we have another object sign, and then we have the key name and then the value. The key name and the val, the key name, and then the value. Between each of these, we have a comma. But just know that at the last item in an array or the last item in an object, you can't have
a comma. So you just need to remove that. If I press format or beautify, which is just my button that tells me everything's okay. Um, then you see that it is indeed formatted and beautified. Everything's everything's all right. Okay, cool. So that's the meandering um you know that's sort of how to understand this stuff from a bird's eye view. Moving forward what I'm going to be doing is just to make our lives a little bit easier. I'm going to be showing you guys in every module or every node I should say on what the JSON
is of the input and the output. The reason why is it's just going to make it a lot easier for us to ultimately you know reference stuff and then do cool things with the data. So I go back to our Google Sheets example from earlier. I'm just going to move the input sorry I'm going to have the output be JSON. And you'll see that in this case what we have is we have an open JSON curly bracket. Then we have a bunch of top level keys. So row number over here, well that's a key. And
you can see that it's represented as a two. Very similar to what we talked about earlier, right? You'll notice that the formatting here is a little bit different. Notice that this one has an underscore and then these other ones are all camel case and some of these are capitalized. Because these are within quotes, none of this stuff really matters. But just showing you guys that there's a there's a variety of like conventions that people do. Some people like capitalizing things, some people don't. So my recommendation to you just to keep everything really clean and and
expected is just to pick one format and stick with it. If you like the underscores, use the underscores for everything. If you like the camel case like me, use the camel case for everything. But anyway, civility is Mr. First name Amy. First name suggestion, it's empty. You know, when something is empty in JSON, you just use these quotes. Notice that every item here has a comma in between it. last name, comma, full name, comma, right? Just going all the way down. And then if I zoom out, I scroll, you'll see now what do we have
here? This was just one item. So if I just click on this little blue left curly bracket, it'll actually nest the item for me. And you'll see that inside of this item are 38 other items, but it'll just nest it for me. And then I can see the next one. Now I can see the next one. Now I can see the next one. Right? We only have five. So that'll be it. But now I want to show you guys a little bit about how an format stuff because it's a little bit different than Jason I
just showed you. But once you understand this, basically everything from here on out will be child's play. Notice how the very first character that you see on the output page on the JSON is a square bracket. Well, if you think back to the example that I gave you earlier, if we click out of this um Pizza Hut ad, as much as I love Pizza Hut, this array here starts with these square brackets. And so we see over here we have a square bracket as well. That means that this is an array basically. So the way
that data is represented in NADN is all data on the platform is represented as an array of objects. Okay. So if I scroll down here to how data in NAN is represented. All of it is an array of objects. All of it will basically be those two square brackets on the outside of a number of items. And you could have as many items as you want. As we saw, we had four back over there. And inside of those four items, we had an additional 38 items nestled inside. But all data is an array of objects.
Meaning that that's how you send and receive multiple objects. Remember at the beginning here we had one item. We just outputed a single variable there. Well, now after this Google Sheets call, we're doing four items. Those four items are represented in our JSON as an array inside of which is another object that has the key name row underscore number, civility, first name, first name, suggestion, and so on and so on and so forth. So all data in NAD is an array of objects. The number one gotcha that I always see when beginners start out with
this is they end up not fully understanding how many objects the previous node is sending or the current node is receiving. And so then when they try and reference a particular item inside of the data structure, they find that it just doesn't exist or they need to like index it, they need to slice in to find a specific item inside of the array of items or some other problem. But this is the number one problem that I see in practice just running through reading like NA and help threads and stuff like that that people struggle
with on this platform. So if you understand this the fact that all inputs and all outputs are an array of items represented as follows and now if you understand how to format JSON what JSON looks like and now further if you just make it so that you look at the JSON and not necessarily the table or the schema format every time you're sending and receiving data you will solve the biggest gotcha that people have within it's just going to be a lot easier for you moving forward to you know create flows. You're you're basically going
to take so much of the load off that most other people spend like hours and hours and hours trying to debugging. um right from the get- go which is ultimately what I wanted to do here. Okay, great. So now we know that data in N8N is represented as an array of objects. So how do you actually reference that data? You guys remember earlier in that example here where we were using this Google sheet module? Sorry, this Google sheet node I should say. And if we scroll down here, we were updating a field using data not
from the previous node but from a few nodes back. Well, basically if I go back to JSON here, what you can see is we can go one node back to open ad, two nodes back to Google Sheets, three nodes back to when clicking test workflow. Okay, let's just go to this Google sheet. In order to reference data, actually in this case, we will use the schema cuz you can actually see sort of them logically top to bottom. In order to reference data more than one node back, what we have to do, if we just want
to redo this email one, we go curly bracket curly bracket dollar sign. Then what we want to do is we go this left round bracket. Then we have access to all of our earlier nodes. We can select the current node open AI, but we can also select Google Sheets. And we can also select when clicking test workflow we want is the Google Sheets. And then if you just dotindex, if you put a period, then you'll get an item. And the reason why I bring up this item is because basically all of this stuff is buried
under this dot item syntax. And it's kind of annoying, but in order to reference, I don't know, the row number, what we have to do is we have to reference the Google sheet. Then we have to reference the item. Then we have to reference JSON. Then we have to reference the row number. Why? Because NAN actually hides some of this information from us. We don't actually see the nested data structure. All we see is the nice representation of it. Okay. So this isn't actually represented this way despite the fact that it looks kind of like
it is. The way that this actually looks kind of underneath the scenes behind what NAN is showing us is it looks like this. And if you understand this, you'll understand how to reference basically any item in NAN. So this is equivalent to what we're seeing here. What we actually have is there's an additional two layers between us accessing the data through the dot thing. It's actually item.json and then we have the row number, stability, first name, first name, suggestion, stuff like that. Okay. So that means that when we want to access it kind of just
just looking over here, the very first thing we have to do is we have to reference the Google sheet. Then think about it logically. Then we have to reference the item. So go item. Then we have to reference the JSON.js. And then we have to reference the row underscore number if we want to like that. And then we get that data. Okay. So big issue, big misunderstanding I would say with Naden. Um unfortunately their documentation in my experience is not clear enough to really elucidate what's going on here unless you have a programming background. Um
but just want you guys to know that this is how it's done when you reference nodes that are more than one module back. If you wanted to just reference something in the previous node, it's a lot easier. You go dollar sign and then you go JS. then you can just go immediately into the variables. Message content or something like that dot subject line for instance. All right, so let's start looking at some of these foundational nodes over here because I think at this point we've done four different workflows and I think you guys probably have
a reasonable understanding of how to put a workflow together now as well. Some of the more nuanced portions of NAN like the way that they do their JSON, some of the the nuances behind burying names inside of various keys and how to do arrays of objects and backtrack and all that fun stuff. Let's actually cover like nodes because nodes are ultimately what you guys are going to be using on a daily basis. After we're done that, then I'll I'll rebuild this flow up here and I'll show you guys how all that stuff works under the
hood. This will allow us to use some of the more um I guess code oriented features of N&N. Then I think after this point, like you guys have a reasonable enough understanding to build most things. It's just a matter of like what can you build and how exactly do you put the various Lego blocks I've shown you together. That's what the subsequent videos in this course are going to are going to ultimately just show you. It's going to be non-stop building 24/7, baby. Anyway, so let's cover these foundational nodes. The first thing is we're going
to cover nodes for doing things. So, HTTP requests, web hooks, and open AI nodes. And we'll cover nodes that modify flows. So, if filter, merge, split into batches. There are a couple of other ones, but these are the ones that we're going to be focusing on, at least for today. So, you know, in terms of nodes that do things, um, if you guys aren't familiar with, um, HTTP request, this stands for hypertext, I don't know, hypertext transfer protocol. And what we're doing when we do an HTTP request is we're doing the same thing that your
browser does when it goes to a website. So just like when I go to google.com, I'm sending a request to Google, receiving a bunch of information what this web page looks like, and then I'm using my browser Chrome to render it into the beautiful, wonderful image you have in front of me. The HTTP request does the same thing. It just it just returns the thing to you in the code. You don't have that rendering portion. So I'm going to do a get request here. And the get request is just the simplest and most basic request.
And this is ultimately what you're probably going to be using for for most cases. And the URL I'm going to be doing is just my own leftclick.ai. So leftclick.ai just for the purposes of this discussion. Looks like this. We build hands-off growth systems for B2B founders. There's a bunch of information about what our clients get, our leads. The lovely Joe Davies left me a testimonial. I should probably touch this website up at this point. It's been the same for a while. But anyway, I'm just doing an HTTP request using a method get to leftclick.ai I
with no authentication, no nothing. We're just going to see what happens. So, let me click that test step. And the response that we've received is again an array of objects. Our one object has a key name data. Then inside of that key name, you'll see that there is a ton of code. HTML it's called. Okay. And just because this is not the easiest to see here, I'm just going to go to schema view so you can see a little bit more of it. But basically, this here is the code of my website. This is what
my website looks like to the browsers. um you know and like what ultimately my browser uses to render it. You can see it says leftclick space vertical carrot space AI and amperand. This is just a symbol that um allows it not to break any characters. Process optimization. Left click is an AIdriven performance optimization agency is cutting edge tech to scale your company. This is all the code, right? It's pretty badass. If I were to go to leftclick and then I were to go to inspect, if I were to open this up, this is like the
Chrome dev tool which allows you to see the code of the website. It's the exact same thing that's over here in the bottom lefthand corner, right? Literally no differences whatsoever. You built your agency, we'll scale it. The only difference is some symbols like the amperand or maybe the ad sign, they just have like little replacements here or there so they don't break any um string formatting. So that's the HTTP request. Why why does an HTTP request matter and why would we want to do an HTTP request? Well, the reason why is because you can do
pretty cool stuff with this. Like if I go um HTML and then I say extract HTML content. What we can do is we could use the code of the page to pull out all of the text. Okay. So why don't I just go text? I'll go P. Uh let's just do H1, H2, H3, H4, H5, H6. Let's do P. I'm going to return this value as text. And then I'm going to return uh let's just test this and see what happens. What we're doing is we're basically feeding in the HTML and then we're using uh
various CSS selectors they're called to extract a bunch of text for us. And it looks like I didn't do this right because we're not actually retrieving anything. Let's just try P for now. We'll do this. You're seeing already that we've extracted a bunch of P text. We've extracted basically like a specific type of tag inside this website that starts with a P. Okay. Now, we can do the same thing with a variety of other tags. Let's say I want to do H1. This is going to return all of the um top level selectors basically. So,
let's do H1 test. We build we build hands-off growth systems for B2B founders. That's pretty cool. If I return an array, let's return all of them. We build hands-off growth systems for B2B founders. A better way to build ops. What our clients get. If I do uh I think if I want to select multiple, I just would I just do P like this. H1 and P. Yeah, there we go. Okay. So now I'm getting all the text of the website. We build hands-off growth systems for B2B founders. Find the perfect offer. Automate your lead acquisition.
Solve your project management. A better way to build ops. This is all the text of the website. And all I needed to do in order to feed this in was I basically went through and then I fed in a bunch of elements which I know just correspond to text like this. And then I pressed test step. It went through and it extracted all of them into this big fat array which is really cool. Now like if you think about it, I could actually do some pretty cool stuff with this. I could have AI tell me
something about the site very easily. You're a helpful intelligent uh website scraping assistant. We'll go got to add my credential first. We'll go down here and I'm just going to have AI tell me a little bit about this website. Return in JSON just some data. I'll do that as my system prompt. And then here, your task is to take as input a bunch of scraped website text and return as output a JSON that follows this format. I'm going to say summary. I'm going to say three unique points. We'll do an array. We'll do um probable
customer demographic. Okay, I'm going to have it return an object. we'll see contact information if any and then we'll do I don't know some sort of like array of objects. Okay. And then that's that's what we're going to have it return. We're going to output the content as JSON and then as input add a message. What we want to do is we just want to join this is um being output as an array right now. Right? Arrays as we see are many options or many different um things on various lines. What we want to do
is we want to take all of this output data. We just want to turn it into one big long string. The way you do that here is I would use the expression tab and then I'm just going to add some lines so the AI knows that this is my input. Then I'm just going to go JSON.ext and then dot we'll just go join. Join is just a way to convert an array of items into just one big long string. And the thing you put inside of the join is you just put what you want to
separate it by. So in my case, I'll just separate it all with a new line. If I enter the detailed editor here, you can see that now I've just turned all of this into one giant long string. I'm going to feed this into AI and I'm going to have it just tell me something about the website. So, this took us just a few seconds. And we already have a scraper that's basically capable of coming up with and then outputting a summary of what I do, three unique points that separate me from the competition, probable customer
demographic information maybe I can use to do something, then contact information if any. And it looks like it separated that into a subobject that says method, book a call, details, get started today, platform, website. As I'm sure you guys can imagine, I spent 15 seconds putting this puppy together. If you guys wanted to maybe scrape emails or do something like that, you could put something together that does this pretty easily. So that's the HTTP request node. Pretty simple, pretty straightforward. The next thing I want to show you is I want to show you basically the
inverse of the HTTP request node. Instead of us sending data, I want to show you a quick and easy way that we can receive a little bit of data if necessary. But it's nowhere near as hard as you think. There are a variety of different ways that you could do this, but I'm going to show you guys a really simple and easy one that I personally use all the time. It's called the web hook. So, I'm going to go over here, then I'm going to type a web hook. Starts the workflow when a web hook
is called. Basically, what a web hook is is it's just a server URL that you spin up, almost like my website, leftclick. And every time that server gets a request to it, it'll show up here with all of the data. Why is this so valuable? Well, it allows us to do a million things. Connect workflow to workflow, add up and create our own API integrations, do a variety of things that otherwise we wouldn't really be able to do without them. This is basically the glue that holds the internet together. And this is a quick and
easy way for you to make your own piece of that. So, this is what the web hook fields look like. We have a test URL, production URL. Don't worry about the distinction there for now. We'll just use test URL. HTTP method we want to allow to access our service. Think we might actually allow multiple. One of these I think allows us to do multiple, but we're just going to go with get for now. The path, we're going to leave the path as fixed. The path is just this URL string. Authentication, we're going to turn this
off. We don't want any authentication. They recommend that you have authentication, but for simplicity sake, I'm just not going to have any because otherwise it might be a little bit too much at once. Then we're going to do respond immediately. What I'm going to do is I'm going to set up a test event for this URL. Okay. Actually, I don't know if I can do this within the same workflow. Actually, no, I can't because the workflow is already running. So, I'm actually going to make another workflow really quickly. And I'm going to use that to
call this web hook to get some cool data. So why don't I create a workflow. We'll just call this three nadn concepts. And then we'll go web hooks http requests. I'm going to make a new HTTP request here. It's going to get this long thing that I've done over here. Okay. I'm going to test it. Then over here I'm going to grab that data. And as you can see like what just happened if you were paying close attention is this just ran. The second I sent the data from this node which is in another workflow
over to this node which is on the current workflow we received a ton of info and the info that we received was received a big object one item inside of our array of objects here. So a single object with a key name headers which had a bunch of other data underneath params query body web hook URL execution mode test. So this might look a little bit dry and a little bit boring to us right now but what's the value here? The value is you can run something from one workflow, send it to another workflow really
easily. So in our our first example, we sent no data. But what if I go back to my other workflow, okay, that's number three here. And then I send some query parameters and I say first name and I say Nick. Then I go here a last name surive. And then here maybe I go UU ID. That's just like user ID. And then I type something like this. Now if I go back here, then I listen for a test event. I go back here and then I send the test event. Now when I receive it, not
only do I get the headers, sorry, the headers over here, not only do I get the params inside of our query are the variables that I just sent over inside of JSON. First name, last name, UU ID. So man, I can do so many cool things with this. It's crazy. I could connect this to any web service out there. just give this URL as the URL where the events are sent and then voila, I basically have like an infinite machine. I'll show you guys a quick example right now using ClickUp, but you guys can extend
this example and do whatever the hell you want with it. So, ClickUp is just this project management platform that I have that allows you to send out web hooks. And most services that are good will allow you to do stuff like this. But you see there's a call web hook feature here. I'm going to go back to my web hook and I'm going to copy this URL. Now, this is for get only. I don't actually remember if ClickUp sends a get or a post. So, we're going to see what happens here. And then what I'm
going to do is I'll just have status change. We're going to say from specifically hook to specifically outline. And we're going to create this. And basically what this means is when I change a field called status inside of my my project manager, it sends a web hook over to this address. So hook to outline find something that's hook. Maybe this one here. Now what I'm going to do is I'm going to go over here, listen for a test event. Then I'm going to change this to outline. And I don't remember if it's a get or
a post request. So we might have to wait and try two or three. This unfortunately does not respond to the methods that are not the same. methods are, you know, kind of a deeper story, but basically there are variety of ways you can query a website or a web service. HTTP, most commonly, you'll do either a get or a post. Um, in this specific instance of ClickUp, it looks to me like they're probably using post. So, I'll go HTTP method. I'll go post. Now, I'll listen for this test event. I'll change this back to hook.
Then, I'm going to change this back to outline. And now that it's outline, um, we're waiting for this this post request. Let's see if we we are receiving it from ClickUp. Okay, great. Looks like we received it. Now, what did we receive in reality? Well, excuse me. I'm like really close to sneezing, but I've decided not to, so I won't. Uh, before we updated the query field, now we're updating the body field. We see it's built into ClickUp. What we did, ClickUp has a number of default things that they send over when you do this
web hook integration. One of them is the ID of the record. Now there's the trigger ID ID the trigger payload ID the name of the thing which was three chat GBT prompt engineering hacks you need to start using next some hooks some order in text some information about the person that created it the point that I'm making is we just created our own integration with ClickUp and it took me like 30 seconds realistically after I got off the HTTP method hump so in practice sometimes APIs like ClickUp I'm sure they have API documentation somewhere but
sometimes they just don't tell you right at the point of creating the web hook whether it's going to be a get or a post request. So if your get request doesn't come in, just change the HTTP method to post and then rerun it with the post uh example and then one of those will work, which is pretty cool. Okay, so that's how you do it as a test URL. Ultimately though, we don't just care about having this workflow be sort of a test. We want it to be live. And so when your workflow moves to
production, aka you publish it and you make it live to actually interact with the internet, you're going to want to go over to this production URL and then copy this URL and update all of your web hooks to send here. And this will enable you to activate this. If it's in test mode, you actually won't be able to activate this. Um, just I guess for safety or security purposes. It just makes the transition to publish it unfortunately involve an additional step, but it also makes your workflows a little bit more secure. So, that's how you
do web hooks. The last thing I'll mention are these OpenAI and AI nodes. Now, I'm going to have many, many videos after this one be all about AI agents since that's obviously the big thing that's blowing up right now. What I'm going to do here is I'm just going to cover them super super briefly. I'm not even going to like run anything, but I just wanted to show you guys that NAN is very AI native. And so whereas I've been doing some very basic um OpenAI calls with this OpenAI module, there's a variety of things
you could do. You could create an AI agent which generates an action plan and executes it. Uses external tools. You can have Open AAI message and assistant or GPT. This is what we've been using. Some basic LLM chains and a bunch of like specific tools that are used to do things like categorize information, summarize information, and so on and so forth. AI agent. Just to give you guys a very brief example, probably is one of the most intimidating looking modules or nodes, but it's actually one of the simplest in practice. When you create an AI
agent, it'll automatically open up this when chat message receive node on the side. And then you'll see that down at the bottom of my screen, there's an additional button that allows me to chat with my with my model. But in order to make this work, what we need to do is we need to hook this up. Notice how there's this little um warning here. What we need to do is we need to go down to chat model. We actually need to select the AI module or AI node that we want the AI service I should
say that we want to use. For most intents and purposes, I use OpenAI. This is just the best to me. But you could use O Lama, Mistral, Google, Gemini, Anthropic. Feel free to play around with this for whatever your use case is or whatever your data privacy security requirements are. So I'm going go down to my Open AI chat model. The model I'm going to be using for this is going to be GBD40. I just find it has better answers. And then now you'll see that the warning sign is gone. Now we have an additional
node I can drag and drop here. And now I can go to chat and I could say, "Hey, how are you doing?" We've essentially opened up our own chat window. Hey, I'm just a computer program, but I don't have feelings, but I'm here and ready to assist you. Thanks, Chat GPT. And on the right hand side, probably the most valuable part about this is you could see a log of what is happening and how many nodes were called in order to get you the result. This is important because the whole point of AI agents is
their ability to call other tools to do things for you. So this says system your helpful assistant human hey how are you doing? This is just their prompt setup. So the input to open AAI was this right here. And because we just asked how it's doing and so on and so forth um you know it didn't it didn't really do anything special. There were no additional tools. This is the same thing as you just sending a message to chat GBT essentially. Now in order to make an AI agent like really work you're going to want
to add two things. The first thing you're going to want to add is you're going to want to add some sort of memory. If an AI agent doesn't have memory, then basically if I go back here to chat and then say, "What did I say in my last message, it will have no context or no idea. I don't have any access to past messages or personal data. Each session is independent." Basically, this is like a one it's like it's like a send a question, receive an answer sort of window. But we don't want that. We
want this to actually have access to our chat history. We want it to see what we've been talking about over the course of the last like 20 or 30 minutes and be able to reference those. So, there are a variety of ways to do this. Basically, you need to implement some sort of database. I'll show you guys how to implement some more complex databases in the future, but the simplest one, the one that Naden provides right out the gate, the one that most people on YouTube are going to be talking about is this window buffer
memory. Window buffer memory basically just allows you to store it here inside of the test window, which is the easiest to do. And the default is five messages. So, u basically every time you send it a message, it will send up to five pass messages. But just for the purpose of this discussion, I'm going to go 10. So now what I'm going to do is I'll go to chat and then I'll say hey how are you doing and I'm going to say what did I ask you in my previous message and you'll see that it's
asking how it's doing right so we're actually now accessing the previous message using this buffer memory and on the right hand side you'll see here that the log has gotten a little bit more intense too so basically we called the AI agent up at the top the next thing that happened was we went through the buffer memory we fed this in and basically basically added this to some big long stack of message history. Then we fed that in plus the previous message. Then we said, "Hey, what did I ask you in my previous message?" This
is the input that is currently being fed into the model on that second call. And then we went down into buffer memory. We saved all of this again. And then uh we kind of came up and then and sent the answer. How about now? Cool. So now we're three levels deep. And as you can see, this is just a quick and easy way to load the memory. make sure that we're always having some sort of topical contextual conversation, which is pretty cool. Now, the real juice in AI agents, the reason why they've gained so much
popularity is just because of this tool section here where you can essentially call an action just like we were doing before procedurally, but you can call it using AI and you can automatically format and get information from different tools. So, there are variety of tools that are just sort of set up for you. Air table, base row, calculator, Gmail, Google calendar, Google Docs, Google Drive, all this stuff. What I'm going to do in this example, just because I don't want to spend all day on it um before I do my more detailed AI agent tutorials,
is I'm just going to select Google Calendar. I'm going to create a new credential, sign in with my Gmail account, and then I'll go over here. I'll close this window. Now that I've uh I've connected my Google calendar agent, what I'm going to do is I'm going to select my specific calendar, which is nick leftclick.ai. And then now that it's connected to my AI agent, this is the create event. I don't want to create, I just want to get. So get all of my events basically from my calendar. Okay. And then in addition to that,
what we have to do is we have to use this dollar sign from AI feature here. And we just have to paste that into the expression field. Um what this does is this just tells AI, hey, I want you to provide uh you know your own details for the value of a field. In our case, I wanted to feed in some options that say, hey, you know, I want you to grab data that is after this date, but before this date. So, if I'm asking AI like, "Hey, what's going on? Can you tell me what
I'm doing tomorrow?" And I'll just say, "Jan 28, 2025." The whole idea here is AI now has access to my calendar. It also has the ability to call that API. Then it can actually go and retrieve specific events from my calendar and then return them here. So, as you can see, I have this call uh me and my my buddy Zach. And then it just has all of this information. Okay, great. How are you more generally? you know, I can also just chat with it like I'm chatting to chat GBT or something like that. So,
I don't always have to use like the tool that I'm I'm calling. And the idea is you basically stack on 3, four, 5, 10, 15, 20 of these tools. Although, I find in practice when you get um past maybe six or seven, instead of calling a tool, what you want to do is you want to call another agent which then decides to call a tool. It's basically like a big almost like a search tree or something. But any more or less the AI side of things. The last thing I'll mention here is uh this OpenAI
note doesn't just have the message a model text action like we've been doing before. There's a variety of other things you could do. You can create an assistant, delete an assistant, list assistance, message assistance, update assistance, analyze images, you can generate images, generate audio. Like you have a ton that you could do here, which is pretty sweet. I go down to generate audio and I'll say um I don't know, Nick is awesome and very pretty and I generate it using the Nova voice. Click this test step. Not only can I generate text and stuff like
that, but I can also have this generate me an audio output I can then listen to. Variety of cool things you can do with this. Nick is awesome and very pretty. You're damn right I am. Um variety of cool things you can do with this, but definitely don't sleep on the AI nodes. Uh you know, don't just like stick to the one that I've shown you guys so far. Okay, great. So, those are the foundational ones. In practice with NAN, you're probably going to be using these quite often. What I'll do next is talk about
some nodes that modify flow. And here are a bunch more that like you're going to want to read their docs and add them to your toolkit because this is like an everyday sort of thing. The first is an if. The second is filter. The third is merge. And the fourth is split into batches. So let me show you guys a very quick and and simple example of the if. If I go here and then I add my own trigger. Uh and I just want to trigger manually. Oh, sorry. It looks like I already have one
somewhere in here. Right. So let's just repurpose this um manual trigger for an example workflow that I'm going to build down below. this example trigger. I'm going to click it. And then what we're going to do is we're going to use the edit fields. We're going to go down to JSON. This is just a handy dandy tool that allows you to set your own inputs and outputs. So I can now set my own um output. And I could say first name Nick, last name uh Sarif. And if I if I test this, if I test
my whole workflow, you'll see this broke because um Sarif was not in quotes there. Got to make sure that all of your strings are in quotes. If I check out the JSON, you see the output of this module is now first name, Nick, last name, surf. Okay, I'm just going to pin this. Now, let's say I want to do something else, you know, if the if the input is Nick, I want to do something really cool. I want to provide prize. I don't know, um, $100. If the input is Nick, I want to go through
my my sequence and then I want to generate another variable called prize, and I want to I want to have it be $100. Okay. But I only want to do that if the input is Nick. If the output is something else, then I want to have my prize be just $5. So Nick gets all the prizes here. He's very greedy. Okay. So how do you actually implement this sort of logic? Well, the simplest way is if I click this plus button and I just type if, you'll see I'll have this node pop up that says
if wrote items to different branches, true or false. So I'm going to add that in there. And what I'm going to say is if first name, which by the way, we could still just drag if we wanted to. could say if first name is equal to Nick then proceed through the true node which is up here and if not we're going to want to proceed through this false node. Isn't that cool? So now we basically have two things that are occurring. Okay, prize up here was 100. Prize down here was five. I'm going to click
test workflow. This is now going to run and I just want you guys to see what's happening. I clicked test workflow. We then edited our fields. We added Nick as the first name. We then went to the if and then as we saw here, first name was equal to Nick, meaning oops, if I double click this again, the output is now only going down the true branch with one item. And then the uh upper branch was illuminated. It's green. And then that's how we get to edit fields with the prize equal to $100. Now, if
I change this, instead of Nick, if it's like Sally or something, and if we run this again, what you'll see is the data is flowing through here cuz I didn't unpin it. So, let's unpin it. If we if we test this now, uh what you'll see is the data didn't go through the top uh route anymore. Went through the bottom route. Okay, great. So, now with this example here, why don't we just pretend like we're emailing somebody. So, I'll go draft an email. I'm going to create my thing here and we'll say congrats you won.
Good expression. Then what I want is dollar sign Jason.prise right over here. So like congrats you won $5. How cool is that? C title loser. Uh okay, great. And then I'm going to go here and I'm going to create a draft. Voila. I have it. Now if I go back here to my SOS media queries page, see it says, "Congrats, you won $5." There's nobody to because we didn't set the email to. But pretty neat, huh? We gave the same thing with this $100 field. Go over here. You'll see that I just copied like all
of the same logic. It says, "Congrats, you won Jason. Prize." It's grayed out right now because there's no data coming in. But you'll see that it'll work if I change the um input back to Nick. Then if I test this, I'll see it'll follow the top route and then also send me an email. Okay, great. So now let's look to use the filter node. Um, what I have here is I have my little first name Nick here. Um, what I'd like to do instead is I'd like to just change this a little bit. So, instead
we'll create an array of names. And inside of this, we'll have Sally, John, and then Nick. Okay. And so now, if we test this, we see three entries in an array called names. We have our top level array, which contains an array of objects, and we have our object. And inside of that, we have key whose value equals a list of other objects or an array of other objects. I know the terminology can be kind of a lot and unfortunately there are many ways to refer to the same thing. So if something doesn't make sense
just bear with me here and we'll in a moment. Okay, great. So let's say what we want to do if this names array includes Nick then um I want to continue with the flow. So I'll go array. Then what I want is I want to see if this array of of names feed that in here contains and I just want to say Nick. I'm going to test this out. What you'll see is that we've kept it because it does in fact contain Nick, which is pretty cool. If instead we wanted to see if it contains
Peter, we test this. You'll notice that we are now following the discarded route. Okay, there's kept and then there's discarded. The thing is um it just goes down the same flow. Whereas if sort of split into two, there's a true and a false route. Uh this one actually just like continues and proceeds down the same flow. If something matches the filter, it will continue. Something doesn't match or the fil match the filter, then it won't. So, what we could do, if I just paste in this Gmail node, so we could basically build uh a very
similar flow, but what we could do is if it is kept, then we could send a prize of $100 instead. We could hardcode that $100 in. So, I'm going to do is I'm going to check to see if it's kept. Okay, so right now name contains Peter, it's probably not going to be kept, right? So, test workflow. It's going to stop right here. Does not proceed any further. If instead I change the filter so that it contains Nick, then we test it. What we see is we're going to move on and we're actually going to
like proceed with the rest of our flow. So, this filter here just allows us to kind of stop if it doesn't match our condition or or continue. And you can add as many conditions as you want. You can go and or or um you can add whatever sort of logic you'd like. I used array logic here too, but there's also a lot. There's like string. You could check to see if something exists or matches array x, number, date and time, boolean, array, and then there's also a bunch of object ones as well. So, that's filter.
Pretty straightforward. But I would say the last thing is two more. There's one called merge and then there's split into batches. What I'm going to do here is I'm going to have two routes or two outputs of a module and then I'm going to combine them back into one. And I'll show you guys what I mean by this. Remember earlier how we had some HTTP requests. What I'm going to do is I'll go first name Sally and I'm going to have let's just say second name. Actually, let's go person one. Go person two. Just for
the purpose of this example, we're going to have two people. Person one, Sally. Person two is Nick. Okay. Next, what we're going to do is we're going to add an AI node. You going to down to open AI. And I'm just going to message a model. Then here, I'm going to say write a detailed fun story about. What I'm going to do is I'll go I don't know person one. So, JSON.person one. This example is sort of silly if I'm honest because we could just hardcode the names in there. But I just wanted to do
this to show you guys how this logic of the merge node would work. I'm going to select GPT40. And then I'm, you know, because this is just a very quick and easy example, I'm actually going to add a user prompt. Okay, it's now going to go and it's going to write me a fun story about Jason.person one. Person one was Sally. So, we're going to see it in a second. Very fun. Thank you very much for the detailed story. Q Jeopardy music Q other elevator music. All right, it's taking its sweet ass time. Could be
for a variety of reasons. I might have like a little bit of rate limit action going on on my end just because of all the examples that I provided, but could also be something else. I don't know. Let's see here. Okay, cool. Looks like it did once upon a time in the vibrant city of Elmssworth, where the streets hummed with the rhythm of hopeful dreams and endless possibilities. Okay, so we just uh you know we just wrote a cool story about Sally. What what you can do in N8 is you can actually connect the same
output to multiple um multiple future nodes. So what I've done is I've you know I have one over here which I'm going to rename write story about uh Sally. Then I have another one over here which I'm going to say write story about neck. Then down over here, I'm going to say write a story about person two instead of person one, which is, you know, now going to equate to neck, right? If I test the step, same thing's going to happen. It's going to call GPT40, it's going to write me a cool story. The issue
is if you think about it logically, we now have two routes. We have one top route that writes a story about Sally, another bottom route that writes a story about Neck. Um, so if we wanted to do something with these stories, like I'd kind of have to repeat the same logic up here. Let's say I wanted to email this to somebody. Well, I'd have to Gmail up here. and I'll set to Gmail down here, right? I have to duplicate it. And it then provides a pretty simple and easy built-in way to avoid that. It's called
the merge node. So, you can merge data of multiple streams once data from both is available. So, if you just click on it, you'll see that there's a mode append or combine or SQL query. I'm just going to stick with append for now. I'm just going to feed in these inputs. And in this way, what I can do is I could actually just write, you know, one Gmail node here instead of two. Um, and maybe I could like append both of these stories or something. But let me actually show you um what this looks like.
Now, I'm actually going to test this workflow from end to end. So, you see it first does the top route and you can see this is orange because it's like filling out the um story about Sally right now. This is currently active. It's waiting to fill in the merge the second this is finished. And I think I probably should have set some character limit to the story cuz now I'm thinking about I was probably writing a lot of my tokens. And then after it's done with the story about Sally, it's gonna go and just gonna
do the same thing. Write a story about Nick. Um hopefully this finishes before the next ice age. Okay, that took way too long, but uh just make sure you put in some sort of limits next time you do one of these calls. Otherwise, you'd be waiting here until the end of time. However, what we see as our final product is the top route completed and then populated the merge and the bottom route also completed and populated the merge. Now we had one item from a top route, one item from the bottom route. Then we also
carried forward one end from the top route, one item from the bottom route. But what you'll see is the output of this merge is now two items instead of one. The reason why it's two items is because we use the the append. So now we have uh you know the story number one and we have the story number two. Basically we don't actually have to just output two things. We could actually just output like one item instead. Um but because in N8 um outputs are arrays of items, you kind of have a choice there. Now,
since we output two items, what we could do is we could add our little Gmail node. Stick that down here. Connect it. Then I'm just going to pin this. And what I could do is I could email myself this story. I could say story about just cuz I back myself into a corner here. I need to write kind of like a little bit more difficult of a line of code. But I don't have access to Nick here, right? Like I don't have access to a single variable that contains the value that I'm looking for. So
this is person one, Sally, person two, Nick. So I mean I could select person one, but then my second run would also say Nick, right? So both of these would say story about Sally, story about Sally, even though they'd have different stories. So what I'm going to do is I'm going to say I'll look at the actual story. So I'll go uh sorry, I'm going to go to the merge. I'll look at the actual story here, which now that I think about it is actually just JSON. Then I'll go message. I'll go content. Then if
it includes the term Nick, then I'm just going to return Nick. Otherwise, I'm going to return Sally. That's how that works. So if this contains Nick, I'll return Nick. If not, I'll return the ter I'll ret the term Sally. This is just a kind of a shorthand way to use the if um else logic. Same as what we had before. So, I'm just going to pop this puppy open. Um, and let me take a look at the data. Story about Nick. Nick was an ordinary guy with an extraordinary dream. I wanted to become the first
person to ride a unicycle all the way across the United States. Then Sally, uh, Once Upon a Time in the quaint town of Lavender Hill, I think, uh, this was the one where I timed out or something because of the rate limit, unfortunately. So, it doesn't look like it generated me anything more than Once Upon a Time in the Quaint Town of Lavender Hill. But, I'm sure we could. Yeah, like I could rerun this. Let me just make sure that the prompt is a little bit shorter. Less than 100 words. Let's just do that. And
then good. Uh, awesome. We should be good now to actually produce this puppy. Let me just go over here and delete these examples that I don't need in preparation for the next run. And cool. We We warmed up two Gmails. Now we have a story about Sally, who's a curious hamster. And then I am a curious inventor. Lovely. Wonder why uh they use the term curious both times. H. But anyway, I hope you guys see now that like basically the merge connects two things together. The if statement sort of does the opposite. It kind of
creates two routes, right? Yeah. This is kind of neat when you contrast and compare them like that. So I believe now uh we have everything we need except for the split into batches run. Split into batches is kind of a a little trickier of a thing to conceptualize. So, I'm going to show you a real example from a source that I used to extract a bunch of data. So, let me take a quick peek here at um I think I was doing depersonalization system. Yeah. So, I created a video on a depersonalization system a while
ago and as part of it um what I'm doing is I'm waiting over here for data to come in through a web hook. I send in data to this web hook and then I use it to call an API that gets a bunch of data set items. The data set items are pretty big, right? As you can see over here, it's a bunch of data about specific leads. But notice how it says 128 items above, right? Anytime you output more than one item in N8N, what you can do is you could loop over every item.
Then you could perform something individually on just that item. And then once you're done with that, you could go back to the loop over and over and over and over again until you're completed. So in my case, I had a lot of items in this. I had 128 for Christ's sake, right? And what I wanted to do is I wanted to run my five column personalization flow similar to what we saw earlier. And then I also wanted to add a row to my spreadsheet. Now unfortunately every time I did that I consumed one API uh
call and a lot of these platforms have pretty intense rate limits. So instead of me um one issue I always found I found very frequently was I just kept on getting timed out. It would say 400 error or 403 error or whatever. Basically, the gist of that is that, you know, I'm over the rate limit and they're not going to allow me to make any more requests for a certain amount of time. So, what I did instead is instead of me just submitting all of those requests simultaneously, I added this to a loop over items
and then I added a designated weight node. The weight node is a simple node in N that allows you to wait for a certain number of seconds. In my case, five. And in this way, I was able to basically take one item, go from start to finish, wait 5 seconds, and then loop back and then proceed with my next item. And I basically just went, you know, one after the other after the other after the other over and over and over and over again. So that's just to give you guys some context on on what
that actually might look like. If I go down here and I set um my items here, I'm just going to use a future a feature in NAN that allows you to automatically set like your own test data. So I'm going to say, you know, there's there's first item and then there's second item and my data for that. Where is the edit fields? Right over here. If I zoom way in, you'll see that I'm not outputting two items, right? So, what I can do is I can go loop over items, split in batches. You set the
batch size to one. What it'll do now is it will go first item and then second item. What I'll do is when you add a loop over items, it immediately adds a replace me node. And this is what you're supposed to basically replace with the thing you want to do. So, in my case, I just want to wait 5 seconds. So, I'm just going to go over here and go wait. wait exactly five seconds. What I want to do is for the loop route, for the route that is going to be looping over my items.
So basically for every item, you can think of this as I want to wait and I want to wait 5 seconds. Very cool. Then the output of this needs to feed back into the input. This is kind of like the tricky part. So when you go through a loop, I'm going to click a test workflow. I'm going to generate two items and then I'm just going to pull one item out of that and I'm going to wait 5 seconds. I'm going to go to the second item and I'm going to wait 5 seconds. Is this
going to do anything? No. But notice that there is both a loop route and then there's a done route. Basically in NAN once you're done with the loop route, it just automatically goes to the done route. So I could do something like this and maybe I send myself an email. Let's just draft. And then let's say um you know done looping. You successfully waited 10 seconds. Awesome. So, we're going to wait 5 seconds and then 5 seconds. Then we're going to Gmail. Okay. So, that's that. I'm going to test this workflow. That's the first 5
seconds here. And that's the second 5 seconds here. And once this is done, we can now send over an email draft or queue up an email draft, I should say, which is right over here. I should note that I may have ran this twice. I feel like I just ran this twice. Looks like it's carrying all of these here. Oh, yeah. Sorry. It'll it'll output all of the records that you feed it in basically. So, I fed it in two records and then the third run it went and then fed both of those records in
as input to my Gmail branch. Um, what I could do is I could take these two items and I could convert it into just one item by combining them. Um, and then I wouldn't have to deal with this, which is kind of neat. So, that's probably what I would do in practice. I wouldn't actually proceed here with two items. I would just do one. There's a really cool built-in way to do this in NAN just called execute once. So if you just go to the settings page of any node and then just click execute once,
you basically stop the multiple executions regardless of the number of elements that precede it. So I just clicked execute once and instead of me sending two emails, now it's only going to send one. That's run number one. That's run number two. Then it'll go and it'll feed one item as an output. So if I refresh this now, instead of two, I'm only going to have one. Quick and easy hack. Um, and yeah, you know, because we're building stuff live, hopefully you guys get to see the applications of this in real time as we put something
together. All right, so now I think we are at the point where we can realistically build out substantially more complicated flows. What I'm going to do now is basically run almost like a test of sorts where we're going to take all the information that I just tried to shove into your brain and we're going to use it to build out a flow that actually does something business worthwhile, a flow that I've sold many times before and a flow that's made people a fair amount of money. So this is what the flow looks like right now.
I'm actually going to simplify it. I've decided to do it a little bit simpler just over the course of the last like 20 minutes thinking about it. But basically, just to keep things make a long story short, there's this service out there called SOS. Um, and I mentioned this at the beginning of the video, they send out like a a query every day from journalists uh where the journalists are looking for people that match their criteria to answer questions. So, uh, for instance, you know, this one up here is from Jordan Rosenfeld who's saying, "Seeking
healthcare Medicare specialist weigh on how RFK Junior and Dr. Medat Oz might affect benefits or healthcare if appointed. know that this is usually like US specific. I think they have kind of like a like a global arm sometimes too, but most of this is going to be USD uh US specific. And then it says, "Hey, um I'm looking to speak to people in a nonpartisan way, but the possible changes, things like Medicare, healthcare, insurance, these are two stories. Specify what you're commenting on can be both. Robust and longer answers are prioritized. You must have the
relevant experience. We'll link back to your site. Please include pronouns." There's a lot going on here, right? Basically what we want to do is we just want to take this whole long email and we just want to extract all of these. So this would be one, this would be one, this would be two, this would be three, and so on and so forth. And we want to feed this into AI. And we just want AI to give us a very simple answer. Hey, is this relevant to me based off of some characteristics I'm going to
give you? and two, if it is, can you like pre-draft an email for me? So, pretty pretty simple, pretty straightforward stuff, right? Let me show you how straightforward this flow can be given what you now know. And I want you to treat this as like a test. Basically, like you've made it this far, let's actually see if you could build something out that's business worthwhile. If something that I'm saying doesn't make sense, uh, pause the video and look for the specific part that I've covered the concept in, cuz that's that's basically the purpose here. I
just want you guys to be able to reaffirm your knowledge and show you how now you can do something pretty cool. Okay, so the first thing I'm going to do is I'm just looking for a Gmail trigger there. I'm going to select my credential. Sorry, not create a new credential. I'm going to select my credential, Gmail account 3. And the way that this module or node works is it extracts emails from my inbox that match my specified filters. And it does so in the timing that I give it. So every minute, hour, day, week, month,
x, custom, whatever. I'm just going to say once a day for now. It's going to be zeroth hour, zeroth minute, simple stuff. The event I'm looking for is message received. Then what I need to do is I I need to add a filter down here. And there's one called search where I basically just look for emails from SOS. Luckily for me, they're all formatted in very similar ways. SOS media queries. So if I want to get all the emails from SOS, this is just what I do. Now I don't just want to get any email.
I just want to get the specific email just to show you guys what I'm working with. Later on, we'll then um we'll separate it. So it's just SOS media queries will work with any of them. But for now, I just want to grab this one. Here's what you'd do. You just go subject and then you'd feed this in. This is a Gmail operator. So just use whatever same filtering mechanism you do for your own emails in Gmail. Uh and just feed it in over here and it'll work fine. Okay. Now let's test this out. Let's
grab the data. We've received a ton of data. Uh this is an object with 11 items inside. But this simplify is sort of working against us here. The Gmail trigger just natively always has simplify on. We actually want to get rid of this. So, I'm going to go to expression just like we know how and press and and type in false. This is the same, by the way, is just turning this off. I just wanted to be clear that I always use the expression field. And now I'm going to get the actual data of the
email, which is way more as you can see here. Instead of whatever it was 12 or something, now it's or six, now it's 13. And uh the headers object has 27 items buried in it just in and of itself. The thing we're looking for is this text variable, which is the same as what we had before. Tell friends to join source of sources. It's always free. want to know how to strengthen your relationship with journalists blah blah blah. We're then going to pin this. So now we have access to all of this JSON in future
nodes. And I think I got lost here with my Gmail trigger. And now let's actually go ahead and let's let's split this data. Let's basically get our data so that it's just a bunch of these. How are we going to do this? Just think about this. We got a bunch of text processing features available to us. We know a little bit about the JSON uh JavaScript and and stuff like that. But what are some ways we might actually realistically be able to do this? Well, the way that I see it is the great news about
source of sources and the previous uh service called Haro is that they just have the same like characters everywhere. So, they have a bunch of stars here. Then between every story is basically just like these underscores. So, underscores there, underscores there, underscores there. So when you see a similar pattern like this, it becomes very easy for you to like process this in a noode tool using a term or a function called split where you basically just feed in a whole big string and then you just split it based off something that you want. So I'm
probably I'm going to probably need to split this twice. The first thing I'm going to do is I'm going to split based off this up here and then is you know there's like this top section and then there's going to be this whole bottom section. Then after that I'll grab the bottom section. I'll split it based off of uh this probably. then I'll just be able to get like the individual sections. If that sounds like rocket science to you right now, don't worry. We're going to go over here, press edit fields. And what I'm going
to want to do is for now I'm just going to go manual map and click add field. This allows me to create my own variable basically based off of um you know the the previous module. So I'm going to type above. Uh actually yeah, let's let's just call this below. And then what I'm going to do is I'm going to feed in where is this text. Ah, it's right over here. We'll go to the expression field. Then I'm just going to type dollar sign JSON dot. And what I want is I want text. Okay. So
now if we open up this big fat editor here, we got all the text right here. Pretty sweet, right? We don't want all the text. We only want the stuff that is uh below this line. So I'm going to copy this. And then I'm just going to go over here and press dot. Now we have a bunch of functions. And I haven't covered all these functions yet. I will in the future videos. Um, but one of the functions that I use all the time is called split. Just press split. And all we need to do
now is we just need to feed in the thing that we want to split it by. So I'm going to feed in what I just copied a moment ago. Okay. And now instead of just seeing the string, we actually see an array. And this is what arrays look like when they're output in um naden. It says bracket array and then colon space. And then we actually have the whole array here. And this array is split based off of wherever this was. So I think it's going to be split right over here. The last character before
it will say information week. Okay. So we go information week. I'm going zoom way in. And yeah, that's what the array looks like. We have a comma. So this whole thing was a string. Then we have um quotes and then a comma, a space, and then we have another quote. And this is the beginning of everything underneath it, which is awesome for us. Okay, so this is basically what we get. Um, and now the really cool thing that allows us to do is it allows you to pull objects out of an array. So this is
an array with two items inside of it. The one string that's everything above those lines, this little star line, then another string that's everything below the star line. We can just go dotlast. And now we'll just pull out the actual string itself, which is this. All of this. How cool. Now what else we could do is theoretically we could just split this again. We could split this again and then extract everything split based off of these characters. So I go dotsplit feed this in. Now we have another array, right? How many items are in here?
I don't know. Let's find out. So I'm going to test the step. You click on test step. And now we have a bunch of different items. So yeah, just make sure you like set the array um here anytime you're screwing around with data. Otherwise, I believe they have a field like autotype convert or something. Um I haven't used that one before. type conversion errors or something. Um, I actually just set the specific, uh, data type that I want. In this case, I'm creating an array. I'm splitting stuff to turn it into array. So, uh, I'm
going to be doing so with this array drop down. Okay, but anyway, now we have a big array. Pretty cool, right? And it looks like we have 19 items in total. What I want to do with this is, first of all, I'm going to pin this. Second of all, I'm going to go over here to extract titles. And I'm just going to copy this because I don't want to have to rewrite the whole prompt. I think that would probably take like 15-ish minutes or so once when all is said and done. Um, what I want
to do is I want to um grab this data which looks just like this. And all I want to do is I just want to feed this into AI now. And I just want to have AI tell me, hey, am I good? You know, if I'm good, then go ahead and like draft an email. If I'm not good, then um then don't. And I know just from experience that this is sort of split into two parts here. So, I'm just going to copy this over. I'm going to use it to create my prompt. Okay. What
does this prompt look like? You're a helpful intelligent administrative assistant. Very on brand for me. That's a system prompt. Then, hey, I'm a business owner specializing in AI, automation, marketing, and software. Then what I'm going to say is below is an email requesting a uh below is an email requesting let's do an email request from a journalist looking for a story about sorry information about their story. Then just going to paste a bunch of data in. Your task is to determine whether it is relevant to me and if so pre-draft an email that answers their
questions using my tone of voice and I'll say casual Spartan. Some information about me. I own one second copy. Here are my links. Then I will say uh sorry I just got a lot going on here because I'm piecing this together between two different um prompts. But anyway, some information about me. I own one second copy a successful AI marketing company came up. My name is Nick Stra here. My links don't use unless asked links and then um below is a request by a journalist for outreach. Write a syncing spartan email responding to each query.
says spart an email be concise use the following format. Okay. Then I will say if it is relevant return a JSON object as follows. True. Email body. Email body goes here. If it is not relevant, return false for relevance and leave email body blank. Some information about me. Good. Use the following email format. Email template when responding to relevant inquiries. Cool. Make sure to respond in JSON. Very sweet. Okay, great. And now all I'm going to do is I'm going to provide as input um the specific item that I am referencing. So what you'll find
is when you're referencing a an array like this, what it'll do is it'll grab the specific item of the array. So JSON.blow0ero, below zero. I don't actually want that. Um what I want to do is I I basically want to loop through this array and then for every item I want to feed this in as input. Um this is selecting the first item here with the zero. Um everything is zeroth indexed. So this is 0 1 2 3 4 and so on and so forth. Um so in order to do that we're going to have
to take our data and do just a little bit of pre-processing first. Um, we're going to want to combine a field from many items. Sorry, uh, turn a list inside items here using the split out node. I don't believe I talked about split out, but rest assured, all this does is it turns an array into a bunch of items. So, you can run them one by one. Okay, great. So, below, no other fields. And now we have uh 20 items on the right hand side. And now, basically, we can feed in every one of those
20 items to AI. So all I'm going to do now is I'm just going to feed in uh this below field. And now instead of me having to go JSON items.0 below one below two because we are now splitting this into a top level uh array instead of before how it was uh an array and then the curly bracket below and then another um array with like 20 records. Now it's just below below below below below. It's going to run basically once for every item that we've received. So yeah, that's that. Um, we should be
able to get some JSON here. Uh, I don't want to run it on all 20 as a test, though, cuz all we're doing is testing. So, what I'm actually going to do is I'm going to go in between these and type in limit. Limit allows us to restrict the number of items. So, I actually only want to run this twice to start, and I want to see what happens. So, I'm actually going to do this on two items. Then, we're going to see what those two item outputs are. And if they're good, then we'll continue.
We'll pin them and then move on. And if not, then we won't. We'll be able to modify them before we actually waste 20 uh tokens worth of data. And I'm just going to pin all the data moving forward. And then I'm going to go over here to limit. And then I'm just going to press test step. Okay. I'm going to pin this now. So now we have the two items. So I'm going to go over here. And then I'm going to test this step. Looks like we are now producing. Uh and it looks like both
of these were false. So I'm going to want to up this limit just a little bit. Maybe we'll try three last items instead. We'll overwrite the data that's pinned. We'll pin it again. I'll go back to extract titles. Now we're feeding in the last three enterprise genai users. Yeah, this is probably me. Edge AI and stuff. Looks like they kept their AI entries at the end, so that makes sense. And we're now doing three API calls. It looks like uh there were two TRS. So true up here, true up here. This looks like it was
just junk data. So we could actually cut that out. Show you how to do that later. Um but now we actually have like emails drafted. Hey Pam, I own one second copy accessible blah blah blah. Here's a big answer to all of these questions. That's pretty cool. All we need to do now is we just go Gmail. We draft. Oh, you know what? Uh, we need to grab the email, don't we? Yeah, I don't think I actually grabbed the email address of the person. Yes, I did not. So, let's actually change our prompt a little
bit and let's edit it so that we actually output the email to. So, I'm going to go back here. I'm actually go um email address um discovered or let's just go their email. Okay, there you go. That should probably be sufficient. Let's actually test this one more time. So now we should actually extract their email address as well, assuming the AI does what I what it's silly human overlord tells it to do. And now that we have the the email um address, we'll actually be able to like use that to feed into a draft. Yeah,
I kind of forgot about that. So we'll go back to Gmail. I'm going to go draft create a draft credential Gmail account 3 resource draft operation create. Then I'll say re and then I'll say SOS inquiry. I'm going go message and then all I'm going to do is I'll go back to my schema. Just going to drag my email body in here. Then I'm going to add an option called uh now we'll go to email and then we're actually just going to feed that puppy in there. And now we can actually test this out on
three. So let's go one, two, three. So we have three items. All of them just wrapped up. We go back to my email inbox, go down to drafts, we'll see that uh I created one for each. It looks like I created an additional one, but anyway, I'll cover that in a second. The first was this one to this lovely Pam lady. Very nice. Second was this other one to this lovely John fella. Very cool. Uh, everybody followed my email template. No issues. And then, yeah, looks like we just used one additional um email. I think
the reason why we sent that additional email is because we technically outputed an item. So, I wonder if we could just not output an item. That'd be one way to do [Music] it. Yeah, we could just not output the item. Or, you know, we could just add a filter like I uh was showing us how to do so before. So, if uh let's just go down here. Let's go JSON dot Let's go item three. We'll go down to [Music] JSON.relevance message.content.relevance. So basically if this is equal to true then we'll continue and then if not
we won't. So we should get two, right? Yeah, there you go. We uh kept two items and now we're only going to be sending emails on the two items that passed our filter. So, just because I always like to do an end toend flow, I'm just going to discard some old drafts here, delete everything, and then run this one final time just to show you guys what all this looks like. We will use the Gmail trigger, edit the fields, split them out. I'm going to have the limit be three items just for now because I
don't want to like draft a bunch of emails. Extract the titles, add a filter, and then create three drafts. Let's run this from start to finish. We're now extracting the titles. And by sorry extracting the titles I mean we are um filtering and creating an email. And then the end result is we have two drafts in our inbox which is kind of neat. And if we wanted to take this even further what we could do is we go down to Gmail and then we could add a label to this message. Just to make it abundantly
clear if I select the message ID that we just created. It's going to be right over here. Uh I could just call this public relations or something. And now basically it'll just automatically apply a label to these drafts inside of my inbox that I just know that these are, you know, these are public relations inquiries basically. Um these are not, you know, other email drafts for some purpose. And that's kind of cool of a flow, but I'm actually just going to stick that right over there. And then because I'm already getting mixed up with the
extract titles, I'm just going to say filter and respond to email or maybe create email body. There you go. A little bit simpler. So yeah, we used a ton of new functions here. Um, we use the split. I then use the split out. Uh, I don't actually use all of these super often. We did use the filter, which I talked about and covered. And then the limit is just basically like an internal tool that I like to use to uh make sure that I'm not screwing around with token usage or spending a ton of like
executions or anything like that. Um, I think this system is a lot cleaner than that other system that I was going to build with you guys before. It's also a little bit more simple. Here I have just a ton of code unfortunately, but we'll get rid of that. We'll use this as the two templates for us. Then I'll also just make this nice and easy to see. And yeah, I hope you guys appreciated this. Um, just so that we could do a quick recap and because in my experience doing a recap of the stuff is
sort of how you remember it. Um, we started off by talking a little bit about fields specifically two types of fields. There were fixed fields and then there were um, expressionbased fields. I sort of made a case for you as to why you should probably favor expressionbased fields over fixed fields whenever possible because you could do the exact same thing anyway. And you also just get like a ton of code options. So I always just toggle little expression. I then showed you how all of these different field inputs, even like the little toggle buttons, these
really are just expressions at the end of the day. You know, if it's a toggle button, it's true or false. If you're selecting a Google sheet or something, there's actually an ID behind it. And so now you know a lot more about sort of the underlying data and the way that NAN structure stuff. I then covered JSON JavaScript object notation in probably pretty excruciating detail. Hopefully that wasn't too boring. But we covered a bunch of different variable types. Just to recap them, there was a string, there was a number, there was a bool or boolean,
true or false. There was an array, and then there was also another object. So you could bury JavaScript objects inside of JavaScript objects. There were key names, values. We learned a little bit about the formatting with quotes, um, as well as commas and and brackets and that sort of stuff. But the reality is if you just like stare at JSON long enough, kind of give it a good squint or two, eventually it'll start making sense. And that's why I've now changed all of the input and outputs inside of our NAND course tutorial to to favor
a JSON JavaScript object just so you guys could see it and kind of get used to it. From there, we covered a little bit about how data is represented in NAN. So specifically, all data, all inputs and outputs in NAD are structured as an array of objects. So there's some top level square bracket and inside there's just a bunch of those JavaScript objects nestled in it. And if you want to reference the most previous node, then all you need to do is just use this little dollar sign JS O N syntax. If you want to
reference nodes from 2, 3, four, or nodes back, n standing for whatever number, then you would do the dollar sign, but then you'd have to like specifically reference the name of the node. No big deal. Naden actually does a lot of that selection for you. And there's usually a little drop down or toggle button that you can just click to get there. We talked about how to reference earlier fields, how to do some backtracking with like dot notation and square bracket notation. Then I also covered some common gotchas. The most common gotch in NAN, just
to be clear, is people don't understand that it is an array of objects that you're referring to. And so NAD will run once per item in the array. If you're trying to reference one item, but you're really referencing all of them, obviously you're going to get an error message. It's not going to work. Likewise, if you're trying to reference a number of items, but you only reference some subset of them, you're going to have some error, a message, and you know, you're going to get that dreadful red text that I think we all hate so
much. So, understanding that everything is just an array of items and array of objects. This goes a long way towards insulating you against that. Finally, we covered some foundational notes. We started off with the HTTP request node, which allows us to basically request or do the same thing that your browser is doing when you access a website, pull all of the code, and then I also showed you guys how to do cool stuff with AI, where you take the extracted or parsed components of that node, like my leftclick website, and then turn that into some
sort of AI structured data, like a summary, like some interesting tidbits about that website, maybe the contact details if you could find it. I then covered a little bit about web hooks. If you guys are familiar, if you guys remember, web hooks are just like the glue that holds so much of the internet together. I showed you guys how to send a request from one workflow and receive it in another workflow. And I also showed you guys how to use a third party platform, in this case, ClickUp, but you can really use whatever the hell
you want to send a request upon some triggers. So now I'm like connecting NAN and ClickUp with my own native integration without even necessarily having to know too much code. And then at the tail end there, I covered OpenAI and AI agent nodes. The real value of N8N in comparison to most other no code tools in addition to its ability to self-host is their AI agent functionality that just works fresh out of the box. So rest assured, we're going to be covering a lot more of that moving forward. But we built a very simple example
where I essentially asked my AI agent what was going on for the day and then it pulled data from my calendar intelligently while also still being able to like talk back and forth in natural language. We covered some nodes that modify flows as well, including the if, the filter, the merge, the split into batches or bundles. We covered the split out and then finally we also covered while I was building that last example the limit. And then from there I showed you guys how to build a super simple and easy essentially email autoresponder type flow
but one that does a very high leverage highv value business purpose which is parsing out defining whether a journalist inquiry is relevant to us or not than if it is actually writing out an example based off of a template. Okay. So now that you understand how data works in NAD and how information flows through a workflow, let's cover some of the more complex aspects of NADN. And these are parts of nodn that usually keep beginners away from this tool. What I'm covering now is JavaScript functions. N uses a very specific take on JavaScript functions, dot
notation, JavaScript functions. And there's just so many of them that it's very difficult and intimidating for beginners to know which is the right one to use. And that's what we're going to cover over the course the next hour or so. You're going to learn how to transform data, how to filter it, how to map it, how to reduce it. And if none of these concepts make sense to you right now, they certainly will in a few minutes. Okay, let's get building. I have an NAN workflow open over here called all NAT functions. I'm going to
click add tag and go down to NAD course just so I can help organize it a little bit. And all we have is we have a start node. This begins a flow when I click test workflow down here. So I give this a click. You'll see that this just turned green. This just tells us that this has triggered the flow. Uh peculiarity of the start node is when you click it and when you get it going, it doesn't actually output any data. It just starts the flow. So obviously if we want to do something here,
we're going to have to add another node. So, let me click on that right little plus sign. And then the nodes that we're going to be using in this video, I'm going to be using pretty gratuitously. They're called the edit fields node. And the edit fields node, for anybody that's coming from maybe a different noode editor, especially something like make.com, you can just think of this as a way to set variables, rename fields, and that sort of stuff. So, I'll go down to edit fields over here. Give us a click. And now, you know, we
have the start node on the left, and that's the input. And then in the middle here, we have an edit fields node with a couple of different modes. There's manual mapping and there's JSON. Basically, what this allows you to do is if you give this a click, you can define your own variables here. And if I click test step, you'll see that we now have a new variable accessible to us in the output called hello world. Now, what I'm going to be doing is I'm going to be using the JSON option here. And I've already
created a bunch of JavaScript um that I'm just going to be using for the purposes of running through all the functions. So, this is what the object looks like. We have a string called hello, number 3.5, an array with names of Sarah, Sally, and Stephanie, an object, and this object has some parameters like first name, last name, height, and centimeters. Then we also have a bool that stands for boolean, and that's just set to true. I'm doing this because these are all of the different function types that we're going to be working through in the
rest of this video. And so I just wanted an easily accessible way for us to get all of these and then do cool stuff with it. I can now add, let's just give this a quick rename. Let's just say set example JSON. Then what I'm going to do is I'm going to go and do another edit fields. And this edit fields is where I'm actually going to be mapping the output. So I'm going to call this output. And then for now we'll go off of a string data type. And what I'm going to do is
I'm just going to drag this string into the value. And now we have access to it. Now, the way you use functions in NAND, as I'm sure you're probably already aware, but just to reiterate, is all you do after you've selected a variable from an input and it's turned green, like this one here, all you need to do is just click the dot. A period then opens up this function editor. And now we have access to tons of stuff. So, you can see there's some suggested functions here. This is just because while Anaden gives you
a large library of functions that you can do stuff with um in practice you don't actually end up using the majority of them. But I'm still going to run you through every single one of these for completeness's sake and then if I touch on something that I actually use pretty often either for my own workflows or uh workflows that I've seen other people use then I'm going to I'm going to mention it. Okay, great. So let's start with the very first one. Now if you remember if I click back here this turns green and we
see a result down here to hello. If you remember the value of this string right now is currently hello. Okay, so keeping that in our minds, what we start with is the includes function. The way that the includes function works is basically we can use this to search within a string to see if something includes a substring that we're looking for. So right now we have hello and what we're basically saying is does hello include what I'm about to write inside of here. So if I write h the result will be true. But if I
write something like x, you'll see the result will change to false. Keep an eye on this result panel because this is going to be your best friend anytime you're manipulating functions. Uh because most of the time it'll give you some sort of real time uh feedback. So you know if I wanted to see whether or not my string contains the word hell. I don't know maybe I am very pious or something. I type helen here. You see h e l l is a four-letter substring that is inside of hello. Obviously this is going to turn
true. But if I were to jumble up the letters, right? vertigo l e h you'll see that this is false because this is reading all strings left to right. So this is a pretty quick and easy one. Um you know it's kind of useful to see whether or not something includes obviously if you have a very large string you can instantly do this just to search and see whether or not that string includes just some tiny little thing that you're looking for a mention of something perhaps. The next one I'm going to cover is called
split. Now split is something that I use basically all the time. I use it at least once a day. Um, and I use it across a variety of no code tools just because it's so goddang useful. Now, the way that split works is you essentially take your string h l exclamation point in this case and then you convert it into an array. And the way that you do so is you give it a character that you want to split the thing by. So, let me give you a very simple example. If our input string is
h e l o, let's hypothetically say I wanted to split this into two halves. And the way that I wanted to split it was based off of the presence of the L and the L here. Okay. So, what I could do is I could say JSON.string.split and then in quotes and you have to use quote signs. If I go LL, you'll see that I've now split this string into two um substrings basically and then plopped them in an array. Now, if you're unfamiliar with what an array is or how an array works, that's okay. We'll
get into that later. But for now, all you need to know is that we basically taken one input and we've turned it into an array that contains two outputs, the H E and the O. If you split it based off of the presence of an L, you'll see that we are now generating an empty space. Why? Well, this is sort of nuanced, but if you look at our input over here, that's H E L L. If we're splitting based off of an L, and what this is doing is it's catching the empty string in between
these two L's. So hypothetically, if I wanted to split this by something else, let's say the E, you see that this is now splitting into a substring that's H and then LL O. If you wanted to do this based off of the presence of nothing, you'll see that it splits it based off every character. So this is just its default um if you don't feed it in any input whatsoever. So if you have an empty string like this, it's h e l l o exclamation point. And splitting is really useful just as a quick and
easy way to take something, usually some sort of tabular or CSV data, and then just turn it into, you know, an array that you can use naden for. So, let me give you a quick little example. Right now, this editor is set to dollar sign JSON.string. We're referencing a variable from a previous um, you know, uh, node. There's actually a little hack in Naden that you can do. If you want to like create something directly in the function editor to do so with a string, all you do is you add quotes and then you do
something like Sarah, Sally, Stephanie. Everything within these two quotes still technically counts as a string. And so you can dotindex it. You can slice it into uh you can use dot notation, I should say, in order to attach a function to the end of it. So hypothetically, let's say we had three names here and these three names were just somewhere, I don't know, they're in some data source that we're scraping. Well, we can turn this into an array very easily just by adding the delimiter of comma and then space. Now, because we're going comma and
then space, as you can see, we've turned this string of Sarah, Sally, and Stephanie into an array. That's a quick example of split. Split's pretty awesome. I use split all the time because we just deleted all of this. We need to reselect our string. So, I'm going to go dollar sign JSON. Then, I'm going to go dot st i n g. That's the name of the key in our JSON that we fed. And so now we have the hello again. Let's proceed. Next we have starts with. Starts with is kind of what it sounds like.
If you want to see whether or not a string starts with a uh series of of letters or not necessarily letters, numbers and stuff like that as well, characters I should say, then you can just use starts with. So in our case, if we wanted to see whether it started with h e l or something like that, then this would return true. But if we wanted to instead uh I don't know let's say we wanted to see if the string started with the term by then it would obviously be false. Similarly to starts with as
you could see we also have ends with and so the way that this works is very similarly essentially all we're doing is we're starting at the back and we're just working our way forward. So if the hello exclamation point string sorry getting a call there um but it looks like it went to voicemail. If the hello exclamation point string is, I don't know, exclamation point, this is obviously going to be true, right? But if it's a dollar sign, it's going to be false because we don't have a dollar sign present in our string. If we
were instead to go e l, this would again revert to true. So, lots of options there. And there are a lot of uh functions in reality that you'll find are just the inverse of each other. So, if there's something for starts with, odds are there's something that ends with. There's something for uppercase, odds are there's something for lowerase. We're going to cover all of that over the course of the rest of the video. Okay, great. There's also this other function here which I find myself using quite often. It's called replace all. And so replace all
sort of a power function. Basically what it allows you to do is allows you to take this string which we have here is hello exclamation point and we can just replace any character we want in there with another character. So let's say we're some crazy anime weeaboo. What we do is we replace the first letter L and we go comma and we replace it with W. What we're doing now is replacing all of the L's in the string of hello with a bunch of W's, hello. Right? So we have a lot of um you know
granularity and control there. If you look over the expression and function uh documentation over here, you'll see that this is the first instance in which we're now splitting this into two parts. So you know we actually have two variables that we're feeding into the replace all function. There's a pattern aka what we're looking to replace and then the actual thing that we're going to be using to replace it. I could just as easily replace the term the O, right, with nothing. And if I do that, it actually just cuts it out. Just removes that character
completely. So replace all is pretty powerful. I find myself using this all the time when I'm developing flows. Um, and I'm glad that it's in the suggested editor up here alongside with split cuz you know, these are the two most common ones realistically. Okay, great. Moving our way down, you'll see that there's a very interesting looking function. This technically isn't a function. I believe this is a parameter in JavaScript. Uh, you know, like technically speaking, that's why it doesn't have the two little brackets next to it. But this is just a quick and easy way
to determine the length of a string. So you know if h e l l o exclamation point this is 1 2 3 4 5 6 right we should expect this to say six that's exactly what happens when we feed in length hypothetically if I were to replace this with hey how's it going men you'll see that the character length of this string is now 24 so uh length is super valuable I use length all the time I use length to determine you know whether or not the input that I'm feeding into a large language model
is too much right a lot of the time you can average out the token length of a big string just by multiplying the number of um characters per word on average. And if you look up number of characters per word, the average is 4.7. Uh and then if you want to get the number of tokens per word average, you'll see that that's uh something like 2 to three. A paragraph is 128 tokens. I guess I should have said number of words per token. This ends up being about um 0.75. So, from there, if you feed
in a string of 1,000 uh characters, right? Uh what was the the math there? 4.7 or something, I believe. Yeah, 4.7. So, 1,000 characters divided by 4.7 is 212 words. 212 words* 1 / 0.75 gives us 282 tokens. You know, odds are if you do this calculation and you get the length of your your string, you're going to know that every time you call a large language model, you're going to be using 282 on average over a large uh enough data set, 282.6 tokens in order to do so. So, you know, if you're not working
with large language models, maybe a little bit less applicable, but there's still a variety of reasons why you might want to use length. So, um yeah, length is definitely one of the big boys. Okay, so working our way down the function panel here, uh, we have B 64 decode and it's partner B 64 encode. Now, if you guys aren't familiar with what B 64 is, you can think of it in a really simplified way. It's just a slightly different alphabet used to represent strings. Um, if I were to zoom into this example, the letters H
E L L O when they are base 64 encoded translate to A, capital G, capital V, SB, capital G8, and then little equal sign. So this is basically just a way to to like uh I don't know like rotate characters according to some formula this base 64 um function. And the reason why they have a function available is because a lot of servers and uh some web services will only accept base 64 encoded versions of the strings that you send them. This is both a security purpose and I believe there's also some sort of compression
purpose as well. Um but to keep things really simple, we'll start with B 64 encode. Then I'm going to feed in the thing that we just B 64 encoded into a B 64 decoder just so you can see that they're the same thing. Okay. So if I were to attach B 64 encode over to the string H E L O exclamation point, you'll see that it's very similar to the string that I just showed you guys um without the exclamation point. The only difference is the last letter I think is an h or something like
that instead of an an equal sign. So as you can see it's very similar. Now, if I were to take this string and then I were to attach another function to it, base 64 decode. Notice how we've basically just regenerated our initial hello string. We could do this an arbitrary number of times. I go back to base 64 encode, then base 64 decode. And hypothetically, we could make this thing, you know, the distance from here to Mars. Um, but as I'm sure you guys can guess, it's kind of pointless to do so. So, this is
sort of a niche function. I do use that function. Uh, I use one of the two functions reasonably often when I'm doing certain API calls because sometimes you need to base 64 encode an API key or base 64 encode credentials, usernames, passwords, that sort of thing. The only thing I want you guys to take away from this if you're unfamiliar with it is next time you know a service says, "Oh, you'll need to base 64 encode a string." Well, now you know. All you need to do is just go to your string, press period, and
then type in B 64 encode. Voila, you're done. Okay, continuing on down, we now get to another function that I use reasonably often, one called concat. Concat basically just allows you to take your string and then add on another string to it. Kind of think of this as like a string addition, right? You're like manipulating the string. You're sticking two strings together. So, if I were to press enter here, go to concat, and then inside of quotes, I were to say space world, you can see here that my string has now changed from hello exclamation
point to hello exclamation point space world exclamation point. right? The cardinal example of um you know you doing something cool with a computer for the first time. Now I should note that you can also feed in uh more than one string. So you could actually feed in an array of strings. That's why the concatenate function is kind of cool. So I could technically feed in world and then I could go how are you? And then you'll see that you know we've now taken um three strings. We've stuck them all together. The first was hello, the
second was world. The third was how are you right? The next series of functions I use all the time and they're the extract functions for strings. So we have four. Extract domain, extract email, extract URL, and then extract URL paths. And basically the way that this works is this is just something that allows you to pull out a domain name from a string that you supply that might include it. You can pull out like email addresses. You can pull out the whole URL instead of just a domain. Or you can pull out everything after the
backslash at the end. I'll show you what I mean by all this uh right now. So I'm going to use extract domain first. The way that extract domain works is you either feed in a URL or you feed in a believe like an email and it'll basically tell you what the domain is. Obviously, you know, this isn't rocket science. If I delete the hello string here, because this doesn't actually have any domain inside of it, which is why it's returning undefined. If I were instead to type something like Nick at leftclick.ai, you'll see that extract
domain extracts leftclick.ai. Okay. Uh, conversely, if you were to just go leftclick.ai, it would remain the same. If you were to go https back/backslash, it would only extract the leftclick.ai portion. And there are variety of instances in which this is useful. Um, you know, a lot of the time when I'm web scraping for either myself, you know, people pay me to build a web scraper for them, or if I'm doing it for one of my businesses, you know, a lot of the time I'm scraping the web for strings using a regular expression that follow a
certain pattern. Maybe something like this. Well, this is just a quick and easy way where I could feed those strings in and then it could extract the the domain name because domain names and URLs are a little bit different. And a lot of the time you need a domain name for something that you don't necessarily need a URL for. So that's just a quick example of something that allows you to extract. If I were to add um some spaces over here though, you'll see that it it breaks. So this does not work if you feed
in like multiple or something like that. It's only really going to work if you feed in one and then you just want to extract a portion of it. But this is, you know, comparable to you slicing the string in halves. instead of you having to do some sort of fixed type of data processing where like you're looking for the string that occurs after the second backslash, you know, you can just put extract domain in there and it'll basically just always get you exactly what you want whether or not there are, you know, threeletter tople domain
endings or twolet like I have over here, right? So very flexible, very nice. The second function that I'm going to show you is called extract email. So as I'm sure you guys can imagine, if you feed an email into this, it will return with said email. If I go back to that other example and go nickleclick.ai AI. As we see here, we're now extracting Nick at leftclick.ai. You know what's pretty cool? If I add a bunch of other text here to the beginning and then to the end. This is different than the extract domain. Unfortunately,
the documentation is pretty poor. But if I feed in a bunch of additional information, let's say I scraped a website and we just have tons of text. And then just somewhere in this text, there's one little line that says Nick leftclick.ai. Okay, one tiny little line. This will extract and pull out the nick at leftclick.ai based off of like an email formatting mechanism. um whereby it looks for a little string and then it looks for some at symbol and then it looks for some domain ending. So that's really really useful. You can use this just
as your email extractor. You know, you are going on a website or something like that. You feed in the entire string of the scraped website to this function and then it just pulls out the email addresses for you. I think you guys could probably come up with a million use cases for something like that. Okay, let me just put this back in here cuz I hate when it screams at me with red. And we're going to move on to the next function which is extract URL. So similarly, the way the URL works is uh a
little bit differently from extract domain. In case you guys weren't aware, this is the domain name right over here, but this is the URL. So the URL tends to have some sort of I think this is just the protocol. Then you have some standardized delimiter which is usually this colon and then these two backslashes and then you have the domain name. Okay, that's how that works. So uh this will actually extract a URL based off of the presence of this. Now, if I take out the P, right, it's going to break because there is no
protocol called HTTS. But I could take out the S and that would work cuz there is a protocol called HTTP. I'm unsure if FTP works. Yes, FTP works. Um, does SSL work? No. Um, SSH, sorry. Uh, no. Anyway, there variety of these protocols. Feel free to look them up if you guys are curious what sort of URL protocols there are and sort of like URL structures. But yeah, this is just a quick and easy way to get the whole URL, which can be very useful. And then from here, what I want to do is show
you the last one, which is called extract URL path. And the way that extract URL path works is as opposed to getting the URL itself, which is everything sort of if I put a slash here, it's everything before this line in like the HTTP protocol, they call everything after this first slash the path. And a lot of the time websites and services and stuff like that, they'll actually store a ton of important information after that backslash. If I show you guys what this looks like on NN in particular, you'll see that this is my cloud
account. So if I were just make this practical, this is the URL right over here. It's https back/nixerive.app.n.cloud. Okay, this is like the the root part of the URL. This is the protocol. This is the domain name. And then this over here is a URL path called workflow slash and then I have the ID of my particular workflow that end uses to grab data from its server and then display it to me. So, if I wanted to extract this URL path, if I just feed in this whole thing, just as an example and replace my
little leftclick.ai example, you'll see that what results when I extract the URL path is basically it goes to this backslash and then it gives me the backslash plus the term afterwards workflow plus everything after um you know the next slash. And the way that URLs work is you can go arbitrarily deep over here. Okay, if we continue down the function list, the next one up is called hash. Now, if you're unfamiliar what a hash is, a hash is basically like a mathematical algorithm applied to a string that converts it into just some big long number.
The confusion with hash tends to be that the number that it generates has letters in it. So, if I take this string https back/back/nix.app.cloud, if I take this here, then if I hash it according to their default algorithm, which I believe is MD5, you can see we get this long result here. And the reason why a lot of people don't understand these hashes and you know they're so scary is just because this isn't actually like a string. This is a number um in something called hexadimal. Hexadesimal is just another number system where instead of it
going up to 10, it goes 0 1 2 3 4 5 6 7 9 8 9 and then it goes a b cde e and f. You know how binary is zero and one? Well there's technically a bunch of different number formats. There's binary which is 0 and 1. I think there's quadinary which is 0 1 2 and 3. Um you know there are a bunch of other ones right there's like a number system based off five number system based on 6 7 8 9. Our number system just tends to be based off of 10.
That's why it's 0 through 9. But this hexadimal is a number system based off 16. And the thing is we just don't have any other characters that we can use. So uh or I don't know it just wasn't convenient to invent new characters for the 10th thing, the 11th thing, the 12th thing, the 13th thing, the 14th thing, the 15th thing. So what uh computer programmers or scientists the people that developed this um you know standardized format did is they just decided to use the letters A B CDE E and F. So you can think
of it as this uh you know the number three corresponds to the number three. Um A corresponds to the number 10. B corresponds to the number 11. C is 12, D is 13, 14, and then this is 15. And the reason why it stops as 15 is because we start from zero. So 0 to 15 is technically 16 different numbers. So you know this is one of the main issues with people in hashing I find you know the hexodimal doesn't really explain super easily u but essentially all all that a hash does is a hash
is just like an algorithm that takes a string. So if we just go hello instead of this takes a string and then just performs a bunch of mathematical manipulations on the value of h which I don't know might be 85 or something whatever the the computer programmers that came up with the standard for the the numerical value of every letter is and then it turns it into something that is just not easily interpretable by by humans. Um the benefit of having a hash is you can then de de hash this and then you can regenerate
this from you know this 5D4142 back into hello and what you find hashes commonly used for as I'm sure you're aware are security applications. So things like hashing a password for instance there's this big common saying in any sort of computer security and that's never store passwords in plain text. The alternative to plain text is hashing the password in some way. So I'm not going to go too much into this as I'm sure you can imagine it's very niche and this doesn't really make you money to be honest. I mean like you know if you
in some computer security thing possibly but there are some values you can feed this and the only real values that matter here are MD5 base 64 SHA1 SHA224 SHA 256 Shaw 384 Shaw 512 Shaw 3 RIPE MD160 these are all just different algorithms so if the default is MD5 if I were to go instead and go base 64 you'll see that we've now basically done the same thing that we did with the base 64 encode function right but uh if instead we want to do Shaw 1 or something you know we get shot 224, um,
shot 256, shot 512. These tend to get longer and longer and longer the higher the the SHA number thing at the end, just because this basically represents more and more complexity. So, I'm going to leave it at that, but just know that there are going to be a couple of instances that may ask you for hashing on some point in the future, but as somebody that's made tons of money with no code platforms, uh, you know, I don't know, in like over a 100 projects, I've had maybe one uh require me to hash something, and
that was just really briefly for like one tiny section. Okay, the next function I want to run you guys through is one called quote. It is similar in hash in so far that I don't use it a lot. Um, all quote really does uh from a bird's eye perspective is just wraps your thing around um your your string in quotes, right? So, if I just remove this, you'll see that it is now hello. And if I go back, it now wraps it in these these quote signs. But quote can actually do a lot more than
that. It's actually kind of useful when you start getting into sending and receiving data through um you know HTTP requests or web hooks just because a lot of time you have to sanitize the data that's being sent. Let me show you guys a quick example. So, if there's one thing that you guys might not know, um, you know how earlier we defined a string with these two double quotes and then I, you know, wrote it down over here. Okay. Um, well, hypothetically, let's say somewhere in my string I wanted to use another quote. What happens
if I try and do this? Well, this breaks the whole string, right? And the reason why is because there's just some built-in logic in string parsers. Parser is just the thing that determines whether or not it's a string. But there's some built-in logic in string parsers that sees this quote, then it sees this one and says, "Oh, this must be the string." Then it sees that one and then that one and goes like, "Oh, no, no, no. This must be the string." Then it sees that one and that one. It's like, "No, no, no. This
must be the string." Well, how many strings are there? I can't do this. And then it just quits. So, there are a couple workarounds uh when you're using quotes inside of a string. The first is instead of wrapping in double quotes, what we do is we just wrap it in single quotes. And the second you do that, like this technically, this this is now technically a valid string again. But you'll see, you know, if I just go back here, you'll see that if I try and add quotes inside of this now with this quote function,
um, something really interesting happens. And basically what happens is this this feature called escaping. So a lot of the time in order to prevent this exact issue that I was talking about from occurring, what you can do is you can escape a quote sign, which is um, you can proceed it with this like reverse backslash character. What this reverse backslash character does is this just like cancels out. Actually, is this a backslash? I don't know. was a reverse backslash or a forward slash. Anyway, um that's funny. I've probably been calling one the other my entire
life, but hey, might as well have that realization during filming of a YouTube video, right? So, uh the way that this works is we are escaping this character with this backslash with this slash character. I'm just going to use slash to like keep my sanity. And then because we have this slash in front of it, um, basically all string parsers and formatterers will will take a look at this and say, "Oh, okay. I can actually ignore the formatting of what happens next." So, let me show you guys an example using what I did earlier. You
see how it says Nick says hi. Well, if I actually put a slash here and then a slash here, it's now like an acceptable string, right? But I have to do that manually every time, right? This is kind of annoying. Anytime I'm I'm I'm writing or adding something and I basically have to go find all the quotes and replace them. Well, guess what? That's what our quote uh function over here does. It just does all that automatically for us. So, if you wrap the outside with the single quotes instead, then I remove this uh like
this, you'll see that it's actually gone through and it's added in the the the slashes for us. Um so, this is just a form of I don't want to say niche because this can be quite often, you know, used in quite often in many applications depending on what you like. Um it says up here it's useful when constructing JSON SQL. These are all uh you know formatting conventions for sending and receiving data over the internet. But this this allows you to do that. This has one parameter. It's the mark. So you can u actually select
the quotation mark that you want to cancel it out with, which is pretty neat. So uh if you want to wrap something, let's just go back to our hello example. If you want to wrap this in different quotes, then you could go single quotes like this. You could also just create whatever quote you want. So hypothetically, let's say that the I don't know the underscore is my new quote character. Well, I can just um have that wrap everything. Okay, let's cover the next string function. As you can see, we are making some good time. The
next one here is one called remove markdown. Now, markdown is another example of a formatting convention. And you'll see that this is in large part what string manipulations are for. They take some formatting convention and they just fix it for you. So, the way that markdown works, and this is kind of beyond the purpose of this discussion, uh let's just look this up really quickly. There's some basic syntax guide here. Feel free to check this out if you want. But this is very commonly used when you are calling um large language models and open AAI
and claude and these various services to turn text um so that it's not just plain text but actually has some sort of formatting. So here's markdown on the left. Markdown. If you want to like create a header, what you do is you add a dollar sign, dollar sign. You add a number sign and then a space and then the header. If you want to do like an H2, you go two H3. They show us what it looks like in HTML as well, which is another markup or rendering language over here. And you can see that,
you know, if you want to do the equivalent thing for markdown in HTML, you need to wrap this in some H1 tags. Markdown's a little bit more efficient. As you can see, the total number of characters used to represent the same information was just two here instead of 1 2 3 4 5 6 7 8 9. And so when you communicate with large language models, you know, obviously the main benefit there is the fewer tokens, the fewer characters, the less money you tend to be built, especially with these bigger APIs. So that's why everybody just
tends towards markdown in order to get rendered outputs like this. So all that function that remove markdown does is hypothetically if I go back to creating my own string again and then I were to say heading one, you'll see that this just takes out the markdown formatting. It has a built-in parser again that looks specifically for instances of these number signs for headings. If I were to add 2 3 4 5 6 7 8, you know, as you can see, nothing really changes here. You know, it does add a space, which is interesting, but I
don't believe it adds a space um on anything up to six. Yeah. So anything up to and including six doesn't add a space. It does on seven. Why? cuz this is no longer considered um like uh like there is no heading seven hypothetically and so now it says okay this just must be like a bunch of bogus markdown um number symbol stuff so this must actually be a real character we're going to render the space peculiarities of markdown aren't super important just know that you can remove it all with something like this if you want
similarly there's also a function called remove tags which works as I'm sure you can imagine very similar to remove markdown it's just all this does is instead of removing markdown if we go back to our markdown in HTML comparison here. It just removes the HTML tags. So, this is considered a tag in HTML. If I were to go back to my end function and if I were to try and create a new heading called heading one, what this will do is it'll jump in. It'll actually just remove all instances of this. Now, when is this
useful? Um, well, I'll give you guys a quick and easy example just because I think that this is something that I do often enough for it to represent like for it to be valuable. But if I go and I do an HTTP request to my own website, notice how on the right hand side here, I receive a bunch of HTML. That's kind of a lot of HTML. Right? Now, if I go and I add another edit fields node and then I go manual mapping and then I go um no tags. If I feed in my
data and then if I go remove tags, what you'll see is I've basically gone through and if I just expand this a little bit so we could see big. I've basically gone through and I've taken as input all of this ugly looking HTML. Then I've gotten as output just the plain text of the website basically. And when you have the plain text of the website, not only is it a lot more token efficient when you're calling large language models and stuff like that, you know, you could you could run like searches over this uh it'
be easier, faster and so on and so forth. So this is just a principle of like removing waste. So that's how you'd use that. The next function I want to talk about if we just go back here and then select my dollar sign JSON and then go back to string. The next function I want to talk about is called replace. Now, as opposed to replace all, which I use a lot more often than replace. What replace does it just replaces the first element that uh it sees with another element, it doesn't just replace every instance
of it in the entire string. So, remember how earlier replace all took L's and then I replace them all with W's and then it was hello. Well, in this case, if I were to try and replace an L with a W, it would go hello instead cuz it's only grabbing the first one. If I switch this back now to replace all, it does um all characters. But if I go back to replace, you see it only does one. So it's kind of neat. Um, you know, it's a little bit niche. I mean, there aren't too
many situations in which you want to replace one character and not replace all characters. At least in my experience. There's another function here called replace special cars. Basically, you know, a lot of other languages than English will have things like accents. So like alone, you have deja, you have excuing characters that sometimes, unfortunately, APIs do not support. What this does is it just allows you to take them out. So if you know I had uh how the hell am I going to write that? I just realized that I don't necessarily have any of these. Um
you know if I was going to write something like you know zuer let's go back here. What this will do, you know, if you feed Ju into replace special characters, um the output is just going to be zu like without the the exaltu um on the right hand side of this. And you know, this doesn't just apply to French. Obviously, there's a ton of languages out there with all sorts of things above letters like um and stuff like that in German. I believe that's how you pronounce them. Anyway, any Germans in my audience, feel free
to roast the hell out of me. Yeah, it's just a quick and easy way to just replace those before you do an API call to a service that doesn't support them. So, if you're calling a service and then it just like keeps on giving you weird error messages that you don't fully understand and your input includes one of these characters with like accent above or some sort of marking or symbol, call replace special cars and give it another try. I use this maybe like 5% of the time. Most APIs are pretty good now, but some
of them are still sort of modernizing. Okay, the next function is called slice. Now, slice is pretty interesting. I use slice all the time. If I go and select JSON string, what slice does is it basically allows you to select a substring, but not based off of characters, but actually based off of um the number of characters from the start or the finish. So, we're not slicing based off of L to O. Well, I mean, like we can if we want, but I guess what I'm trying to say is we're feeding in the character order
and the position and then we're using that to extract a substring. So, everything is zero index. That just means it starts at zero at an ind. This is technically the zeroth character. This is the first character. This is the second character. If I were to try and grab everything from zero to 0, 1st, 2nd, 3rd, I think fourth, maybe I'd go 0 to four and then it would say hell, right? You know, if I just wanted to grab the O, I'd go four to six, then I grab the O, and then the exclamation point. There
is some nuance regarding the start position, and I believe the second one is inclusive. You also don't necessarily always need to have uh the second value here. So, you can actually just feed it in a start, and then it'll just automatically run till the end of the string. That can be pretty useful because you know sometimes you don't know the length of the string, right? Sometimes you just want to grab everything from like the third character onwards. If you think about it using our previous example, let's say I have something like this. Well, instead of
using the extract domain, you could use slicing as an alternative to you extracting a domain if you wanted to. Obviously, the only issue would be if somebody removes the S and it's instead like an unvalidated or nonsecure request, then all of a sudden we lose the first letter. So, it's usually better uh in those cases to do to use the tools that were sort of meant for this. and you'll be able to handle any flexible amount that you'd like. Yeah, slicing has a number of uh cool use cases, I would say. So, generally a fan
of the slice function. Let's go back to JSON. And let's see what's next. We already covered split, so I'm just going to cover that. Next up, we have something called substring. Substring is, from my understanding, basically the exact same thing as slicing. I'm not really sure why there are two to be completely honest. Um, all this does is just returns the same thing that slice does. So, let me give you an example. If we were to go uh 0 to four, it's hell. If we just replace this with slice, you see the result doesn't really
change. So, I'm not really sure why substring exists to be completely honest, but this is just personally uh what I always use. I like slice better than substring cuz how much cooler does slice sound? We're slicing a string than versus we're extracting a substring. You should just operate purely off of vibes, clearly. Um anyway, next up we have a function I use pretty often. It's called trim. Basically, what happens a lot of the time, especially when you're scraping resources, is you will get data, but that data will tend to have like a variable amount of
white space to the left and to the right. Whites space just means a bunch of spaces or new lines or something. Trim just removes all of that for you. So, um, you know, I mean, they give you an example of lonely. Let me show you what this might actually look like with a string that we type in. You know, this is, hey, how's it going? Google.com and then we have another space. What this does, as you can see here, there are three spaces. There's one at the beginning, there's one in the middle, and then there's
one at the end. Uh what this does is it just removes the ones on the end. Same thing, you know, if we added well, I mean, you can't really do it, but if we added like a bunch of new line characters, uh tab characters as well. This isn't actually like taking any of those because the part of the way that this works is it just looks for the presence of that slash and then the nt and I think there's one more. These characters just denote like a new line. Pretty useful to use. So yeah, I
like to use trim basically anytime that I'm feeding in a string that may have some sort of variable white space. Uh when I'm scraping, I use trim all the time. you know, just kind of make sure that my data is standardized, formatted well, and that I'm not just like asking for any additional like I'm not using any additional characters or tokens. There's trim end and then there's trim start. Um, this just does the same thing that I showed you guys earlier. It's just it preferentially removes things at either the start or at the end. So,
trim end obviously just takes this out. If I were to change this to trim start, it would obviously just take that out, but I just tend to use trim more generally. We have two more functions under edit, and those are URL encode and then URL decode. Now, if you're unfamiliar with how this works, usually um when you are dealing with a URL of some kind, you have characters that look kind of like this. You have percentage signs, threes, um I think those rep uh percentage sign 3D, I think those represent an equal sign. Percentage sign
20 that represents a space. The reason why you do this is because you can't actually just legally have, you know, like if if this is my URL, you can't actually legally have um a bunch of spaces. So, actually, let's go back and let's go docs.google.com. Like you can't say hello, how are you? Uh this would not be a valid URL, right? But what you could do is you go um number sign 20 number sign 20 number sign 20 number sign 20 and now this would be like an actual URL. It's not a URL somebody has
created but it is a real URL like we can actually press enter and and format it. So all that this does is it basically converts something that may include those characters into something that doesn't and uh vice versa. So let's hypothetically say you wanted to go to leftclick.ai AI and then you want it to go to blog post call. Let's go blog and then we go a post with the name of awesome. Okay. If we URL encoded this, what it would do is it would take all of the characters that aren't really like legally allowed.
So, you know, in our case, mostly these spaces, although you see it actually also does some transformations under the hood to colons and backslashes and stuff like that just because these characters aren't technically being rendered. you know, it's just kind of a quirk of how the browsers are rendering these to us. But in reality, when you like request to a server or something like that, they're they're being encoded. And then uh what you can do is you can then subsequently decode this and you can kind of transform it back to your initial URL. So sometimes
you'll just see an API or something that'll say, you know, this requires like URL encoded um or I don't know this this requires stuff encoded in a certain way. You can use URL encode when you're sending and receiving and making requests to things. I basically never really use this in practice, but it is uh something that they offer to you as a tool in case you need to. Okay, next up we have a bunch of query functions. We've already covered ends with and includes. Now I'm going to cover index of. Index of is pretty cool.
It basically allows you to find a substring that is present inside of the string and then tell you at what index did that substring occur. This can lead to some really interesting string manipulations and some cool use cases where like you'll find the index of something first and then you will use that to take a slice or something from from one character to another and then do a bunch of other cool stuff. Send and receive data that way. But uh yeah, I mean in our hello example, right, if I were to feed an index of
H, what do you think would happen? We'd feed in zero. E would be one. L the thing about L is notice that you know I have two L characters there, right? So if I really wanted to get the index, I'd have to go L because that's a unique character there. Could also go O, which would be four. Then I go exclamation point, which be five. I go L. I could go L. I could go L L. I could go low. And then I could go O exclamation point. And then I could get like basically a
a sliding window of two characters instead. But just notice how it always grabs the beginning of that. in their example steam and then t we're finding the first um index because s is at zero t is at one and then even though it's three characters te ea it still starts at one which is pretty neat so yeah I use index of not super often to be honest I usually don't need to search through things um numerically like that but you know it's a good function to understand last index of is very similar to index of
but it solves that problem that we had a moment ago with the l so um you know if we go index of and we just type in and L the result is two. But if there are instances where we might have you know some characters repeated multiple times or something you can grab the last index of L and notice how that is now three in our hello string. Next we have match. Match is pretty interesting and you sort of need to understand a term called regular expressions in order to really get it. But essentially this
is a much more powerful find and replace sort of tool. Um I don't know if this function in particular allows you to replace something. I don't believe so. But it does allow you to find the thing. And then you could always just like grab that thing and then replace it later. But um basically let's say we have a string, right? And instead of hello, I'm going to use a much more varied example. I'm going to say hey man, how are you doing today? Okay. And hypothetically, let's say we want to find the man or um
we want to extract the man string. So if man is present inside of this, we want to extract it. If it's not, then we don't want to. Okay. What we do in order to do this is we build up something in what's called the regular expression I think like templating language. So instead of just like identifying the thing, we're actually going to extract it. And the regular expression templating language like it looks kind of weird. As you can see here, there's some there's some backslashes and then some up arrows and stuff like that. It's it's
not super difficult to do. If I were to type in a backslash and then man and then another backslash and I really got to stop using the term backslash here. Um, you can see that it did in fact extract men. But hypothetically, I could also instead of just looking for man and like hard- coding it like this, cuz this really doesn't do anything for us, right? Instead, what I can do is I could look for all instances of threeletter words. Okay? So, um, in this language, it would be a to z to z. Then it
would be a to z to z. But I just copy that one last time. And then we do that one more time. Now, um, in our case, we're we're matching the first instance of this. Um, but if we wanted to match all, I think we we'd feed in a G operator, which would be on this backslash and this slash and then this G at the end, just because regular expressions are sort of outside of the scope of a video like this, and because it's an entirely new language, um, my go-to is if you want to
build a regular expression, if you need one, and there are many, many instances in which you will need one, head over to this website over here, reax 101. You can insert whatever your string is that you want. Hey, how are you doing today? And then sorry, you'd actually insert the test string down here. And then you actually have the ability to play around live and see how your changes extract various parts of um the text. So as you can see, we have this backslash at the very beginning. Dang, this slash at the very beginning. We
have this slash at the end, and then we have some options here. Um these options always just occur after the last slash. So in our case, global and multi-line. Um again, this uh this resource will explain everything to you if you look at it. But if you wanted to extract the man, you might type man. Um, it's going to say that it's not matching the subject string because we don't have man in it. But if we say how, right, you'll see that as I type H, it illuminates two elements that are being extracted. H O,
now it's these and then H O. There also a bunch of really cool things. Maybe we want to go like you doing, right? But maybe instead of you doing, we just want to find the presence of U and then we want to extract everything from U all the way to the end. Well, if I were to do that, then um I could just go period, which matches any character, and then I could multiply it an infinite number of times to go to the end. Or maybe I want to grab everything before the U. So, I'd
go period U. And now I extract everything here. You can also play around with the presence of um these two brackets. This allows you to extract specific sub elements or substrings from the parent string. Um so, as you can see here, now we have a green section that is illuminated because we've wrapped this in a capture group. And then the the blue U section is sort of also captured, but it's not in our captured group. And yeah, that's just more or less a quick little rundown of what you can expect if you were to go
super deep in regular expressions. Uh I should also note that an AI is really really good at coming up with regular expressions for you. Like if I were to feed in this and then I were to say I want a regular expression to capture um all threeletter words in the above string. If I were to press enter and I'm just using a new model called 03 mini high. Uh it's new as of the time of this recording and probably not going to be new by the time that you guys watch it. Uh but if I
were to do this uh I would get something like this. And notice that it's always going to start with a slash. It's always going to end with a slash. And if I were to feed this in, if I were to remove the beginning and at the end, what you can see is we basically gone through we we've extracted all threeletter characters. Um, and it threeletter words, and it's done a really good job of it. So, you know, over the course of the last, I want to say 6 months or so, AI has gotten to the
point where he can do this, um, as of the time of this recording. Uh, and if you know, you're wondering how exactly to do regular expressions and you're watching my video and you're like, "What the hell is that guy doing?" Um, AI can can do an even better job than I can like 90% of the time already. So, they're automating my regular expressions. What a dang shame. Next, we have a another uh module or another function that uses regular expressions, but instead of returning the actual extraction, what we're doing is we're returning the place that
the character occurred. So, in this case, we're searching for n and then we're going um I don't know, I think this is like at the beginning of a word and then anything else after that. And so it tells us, hey, what time does the first word start or in what position does the first word starting with n occur? In this case, it's 0 1 2 3 4 and then five. Um, and keep in mind that regular expressions tend to be case sensitive unless I think you specifically turn that off. So, uh, it's not capturing the
first capital and it's capturing the the second. I don't really use search basically ever to be completely honest. Um, search to me just doesn't really have any value that index of doesn't. So, uh, from here on out, we are now moving into the validate section. So now we have a suite of functions that I use very often to validate whether something is a domain, whether something is an email, whether something is empty, whether something is not empty, whether something is numeric or whether something is a URL. Let's start with domain. So remember earlier how we
fed in https back/back/leclick.ai. Right? And then I said that this was a URL and inside of the URL you had a protocol, you had some sort of delimiter, and then you had the domain name. Well, this will tell you whether or not what you're feeding in is a domain name. So what do you think? If I feed this in, is this a domain? The answer is no because we include we've included the protocol and the delimiter as well. If I take this out, is domain now reverse to true. Now, alternatively, if I change this to
is URL, you'll see that this is true. But if I just feed in a domain name, you'll see that this is false because a URL requires all of the other subsequent components. Okay, we have a couple of other ones that we can go into as well. We can do empty. So if a string is empty, you can very quickly validate and check it. So obviously, is this empty? No. Right. But if I were to take this and delete everything, then yes, it is empty. We can go is not empty, which is just the inverse of
is empty. So is is this not empty? Yes, true. This is not empty. There is a bunch of stuff inside. If I take it out, is this not empty? No, it is empty because there's nothing inside. And then similarly in the same vein, um we can do a little bit of checking to see whether or not something is an email. So if nick at leftclick ai, you'll see that this converts to true because there is currently no tople domain. That's just the thing at the very end here. Um that isn't at least two characters, right?
But if I were to just feed in a domain name, that would obviously be false. Quick and easy way to do validation and verification. And then there's also one for a numeric, which is somewhat interesting. Basically, what you have is the ability to check whether or not all that you fed in is is a number. So you can feed in um integers, you could feed in like decimals, you could feed in like negative numbers and stuff like that. Um and if it's a number, it'll tell you. If you feed in an f or an e
or whatever, um then you know obviously this is no longer just a number. It's also a bunch of other characters here, which is why is numeric is now reverting as false. Okay, the next functions are very simple and very straightforward. There are a bunch of case functions. So there's two lowercase, two sentence case, two snake case, two title case, and two uppercase. Lowerase is hopefully self-explanatory. Hello. How are you doing, Nick? If I feed in this, which has two capitalizations, it just lowercases everything. This might be useful when, I don't know, you're trying to convert
something into a domain. So, if I were to go uh sorry, convert something like like into a blog post slug. So, let's say I had a blog post title and it's 38 ways to make money online, right? And I wanted to convert this um into something that I could stick onto my my URL. Basically, what I could do first is I could replace all instances of a space and I could do so with a dash and then I could just go lowercase. And what I'm doing now is I'm converting um this over to something that
might actually fit inside of my URL. Pretty cool, right? That's what lowercase does. Now, obviously, there is an alternative and that is if I just remove this here, um there are a bunch of other similar functions that change the case of the of the string that you're feeding in. So, if I were to say 38 ways to feed, sorry, to make money online, and then I would go to go uppercase, well, then we would just scream 38 ways to make money online. But there are a couple of other cases as well. There's something called sentence
case. The way that sentence case works, if you're unfamiliar, is it basically just capitalizes the first letter of the entire string. So, ways to make money online, right? If I were to remove this to sentence case, you'll see that I'm basically taking all of these and then I'm I'm pumping them. Uh, I'd have to remove this dot as well. And then I'm uh bringing up all of the subsequent first letters of every word back up to capital case. For to put this in, I just remove that. And then there's a there's a couple more. There's
one called snake case. Snake case is pretty interesting. Um, this basically does uh almost like what I was what I was saying earlier with the URL replacement, but instead of a dash, we're doing an underscore. And this is just like a way to like create variable names really quickly because there are two naming conventions for variables. There's um camelc case and then there's snake case. Snake case just always has underscores between every word because uh spaces are not represented well in programming because parsers break. And then the last one is to um title case. And
what you'll see is nothing changes between this and this. The reason why is cuz this is already in title case. All title cases is it grabs the first letter of all major words. So I think uh words that are not connectors like to or at or a or 'the' and it makes them capital. So ways make money man if I were to go at I guess that is oh no it's not if I were to go at then at would not be a connector the right most would but not the so yeah I mean all
of these are just different ways to turn something into um something else which is nice. Okay the next function is called parse JSON. It's pretty interesting. Uh, but basically the way that it works is a lot of the time when you receive queries uh from the internet like when you do some sort of scraping or when you consult an API, what you get is you get something that has a lot of those escaped delimiters that I mentioned, the slashes before certain characters. So I'll give you guys a quick example and you'll understand this intuitively. Let's
say I have a string here. Okay? And this string is like a JSON object. So I'm going to go name and in order to do this I'm going to cancel it out and then I'll go you know Peter like this and then I'll wrap it. Uh if I feed this into parse JSON, you'll see what happens is I'm actually parsing this out into an object. Like previously, this is a string, right? The string is uh this curly brace, the quote sign, name other quote sign colon uh quote sign uh Peter and then quote sign and
then this other curly brace. But if I go parse JSON, what I'm actually doing is I'm converting this to an object. I'm literally converting the data type into another data type um which I will be showing you um you know, cool things about. And if you if you parse this, if you click test step, um what you'll see is sorry uh what I'm what I mean to say is now that it's parsed, what you can do is you can actually reference things inside of the variable of the thing that you just parsed. So now, for
example, I can actually just extract the name from this. So I mean, you know, uh obviously I'm just writing this all out right now, which is why this doesn't seem very useful. You can imagine how if you receive a big long string, well, you can actually parse it directly in your expression editor, which makes this super powerful. Um, you know, as I mentioned, I don't use this super often. Uh, just because I'm not like calling a lot of dedicated or hidden APIs where I find that this typically comes up. Um, but you know, you can
you can use this so that you don't have to like add another node. You don't have to like render something or or parse something in this node and then deal with it later. What you can do is actually just like get a string that contains JavaScript, parse it out, and then you'll be able to extract whatever value you want. So, you know, because this is an object, I can now reference keys or I can get values, right? I can do a lot of other stuff with it. Um, and I'm going to be running you guys
through the object functions in a moment. Okay, the next function is to boolean. Boolean's pretty simple. Um, basically if I feed in a one or a zero, what I do is I convert this data type from a string into this boolean which is true or false. So zeros are false, right? Zero is is um no, it's off. It's false in boolean logic. One is on, it's true, it's good, right? So um I'm basically converting this from a string into like a separate data type called true. I rarely use this in practice because most of the
nodes in n that I'm realistically going to care about. They're going to have some sort of type conversion built in. This next one is called to date time. This is actually super useful um because a lot of the time you're going to be converting to and from some standardized datetime format in order to do things like add a certain number of minutes, add a certain number of hours. The context here is NAN uses this specific type of datetime formatting called Lexon datetime. But basically all this does is it just allows you to convert like a
string into another type of object that you can now do math with basically uh which is pretty cool. So I'll give you guys a quick example um just to show you guys just how many things are representable as dates. If you just feed in like the number one, it will find the first date of 2001. Why? I I don't know. There's just some logic that's going on under the hood. But hypothetically, if I were to grab the current date in um I think like uh day day no month month day day year year format it
would be 0131 uh 2024. Right? So now this is converting um the current date to the standardized date format. Sorry I guess 2025 it converts into the standardized detype format. What's the cool thing about this? Well, if I press uh dot here now, what I can do is now I have a whole other function suite available to me that includes datetime specific functions. So now we can do a bunch of really cool things. We could convert to local string and now this actually converts this into um the specific uh basically they grab my local and
then it converts it into the specific type of string that people are most likely to see here. So you can imagine this might be really really useful if you're working in databases or something like that. There are a variety of other datetime functions as well which we're going to get into. But yeah, you can do things like extract certain times. You can do things like subtract uh I don't know five days from January the 31st to give us January the 26th. All this stuff ends up being super super valuable um when you're working. Okay, great.
The last thing I want to cover is to number. So let's say I have the number 123,54. Okay. All this does is it takes the string that is 123,54 and converts it to a number. What do I mean by this? Well, um numbers and strings are different, right? And so, um all this is doing is it's allowing me to do a conversion from the string format of 1,120,54 to the number format 123,54 which means now I can do things like I can add. So, I just added five, right? If I were to try adding five
to the string, all we do is we actually literally add the string five to it. You guys kind of see what I mean? If I go 1 2 3504 + 5, what I'm doing is I'm appending five to this four. I'm concatenating. But if I make this into a number, well, now we can actually perform a logic on it. We can we can I don't know, multiply it by five or 12, right? If you were to not, then you know, if you were to try and multiply a string by 12, um, I guess it would
allow you to because this is like a very clear operator. But yeah, the the plus specifically is sort of like the the breaking example of doing mathematical operations on strings. And this is equivalent to concat 12 as we could see here. So basically all this is doing is it's just verifying that this thing is a number. And then once it's a number, we can do a ton of like really cool, you know, math and stuff like that with it. I use two number reasonably often. Yeah, a lot of the time like I'll grab a string,
that string is formatted in like a particular way and then I extract it. I turn it into a number and then once I've turned it into a number um you know I can I can do really cool things with it. And then there's one other example here in NADN where um you can have a number that's like 1.23 E10. That's like 1.23 raised to the 10. Well, you can actually take the string and then you can convert it into like a usable number that you can perform mathematical operations on. This is sort of like more
of a scientific need. So you're not going to use it super often, but I do use two number just to make sure that my my types are okay. Okay. Next up, we have the number family of functions. This is pretty straightforward. Now that we've done string, I'll say that string and array are probably the most difficult ones. This one's going to be a little bit easier. Um, let's just type in the number. And now let's reveal all the functions available to us. So the first one we're going to cover is round. Round is kind of
what it sounds like. If I were to feed in JSON number, which in our case is 3.5, into round, what happens? This goes up to four. If I were to try and uh change the number of decimal places and go two, it'll round to 3.5. If I go three, it won't do anything because this number doesn't have any more decimal points, right? But yeah, this will automatically round up to four, which is just default behavior. Anything um up to 3.499 repeater will round down. Anything at 3.5 and up will round up. Um and yeah, this
is just sort of like default behavior. It's it's great for like removing complexity from numbers and stuff like that. Now, I should note I want to show you guys a little bit more context here. I don't just want to use JSON number. So, if you want to write a number in NAD, you could do so just by wrapping round brackets around it like this. So, if I'm rounding 234.5, this will be 235, right? I'm going 499, it'll be down. But what if I go this and then I want to round to the second decimal point.
How about the third decimal point? The fourth decimal point. I don't think there uh yes, sorry, I was just getting a lag actually. If I wanted to round to the sixth decimal point, all the way over here, right? This is a two, a three, it would be down. If it's a a six, it would be up, right? Because we have a five down here. Anyway, point I'm making is you can round stuff and rounding is cool. All right. Now, why don't we do the uh more directed version of round, which is where we specifically say,
am I aiming for the floor or am I aiming for the ceiling? So, if I aim for the floor of 3.5, what do you guys think is going to happen? This is going to return me the number three. If I aim for the seal of 3.5, what's going to happen? This is going to return me the number four. So basically this is just a directed way to perform your rounding operation sort of manually. Right? 3.8 is always going to go up to four. 3.1 is going to go up to four. Um if I were to
replace this now with the number three ceiling of three would be three. 2.9 would be would be three. 2.1 would be three. Two would be two. 2.001 would be three. So it's interesting um you know just how much granularity NN gives you in being able to manipulate numbers with this. Uh but yeah, that's the way that seal works. The next number function is called ABS. That stands for absolute, not my ripped six-pack. Uh basically, when you feed in something like a number here, um you can do so uh you know, with with positives or with
negatives or whatever, all this does is just returns to you uh what's called the the absolute value of that number. So, ABS just says, hey, if there's any negatives, something like that, I just want you to get the absolute magnitude of it. If I feed in 2.001, 0 01 it'll just return me two. So you can kind of think of it as just a way to strip negatives get only the actual magnitude of the thing. Magnitude being the distance from zero. Okay. On top of that we also have a few other interesting ones like format.
Now the way that format works is basically you know how sometimes Americans and Europeans will format numbers differently. Like sometimes Europeans might put like the euro at the end of the sign or something uh end of the number and then Americans sometimes might put the dollar sign or usually at the beginning of the number. Um, sometimes they use periods as delimiters in thousand separators instead of commas and stuff. Format just deals with all of that. Now, I'm feeding in 3.5 and I'm trying to format it. That doesn't really make much sense for me. So, let
me just feed in a bigger number and show you guys uh show you guys how it works intuitively. Let's say I fed in 3,459,221. If I were to leave this up to the standard way that the format module or format function I should say formats things, I'm basically converting this and then I'm adding a bunch of these little um delimiters. But I could also change this if I just add a period instead. Oh, sorry. If I uh my bad, you didn't actually add the delimiter. If I had the local string instead, right? If instead I
wanted to go French, you'll see that we've now added a space in between instead of the uh comma. If I wanted to go um Dutch instead, I think Dutch, I may be mistaken, but if I wanted to go Dutch instead, um we now add periods, right? This can be useful when I don't know, you want to drop like a dollar sign in front or something like that, right? If I go en here, then now we have uh basically like a number that maybe we've done some math on to get to this point. Um and now
we've turned this into something that is like realistically readable as I don't know, a string, which we could do um tons of things with. we could pass it into a a pandadoc proposal and template out, you know, the amount of money it costs. Make things look a little bit prettier essentially. So, that's pretty neat. I'm a fan of format. I use format pretty often. Um, aside from that, we have a couple of very simple functions. Um, is even just tells you whether or not this number is even. So, is this number even? No, because there's
a one at the end. But if it's a zero, then it'll be true. Likewise, there's is odd. So, is this number even? No. Is this number odd? Yes. Is this number odd? No. Uh there are a few other ones like is integer. Now if you guys are unfamiliar an integer just sort of means like a like a like a number that doesn't have any decimal points. So this is an integer because there's no decimal points. But if I were to do this and this would not no long no no longer be an integer. This can
be important sometimes but to be honest I don't really use these type conversions or is even or is odd very often. Um there are certainly places for them though. Next up we have um some conversion functions. So two boolean similarly to what we had before. 2 boolean will convert this to true. Like if I go uh zero, this will be false. If I go one, it's true. Then if I go any number above one, it's also true. So basically zero is just the only negative. And then even like negative numbers and stuff like that are
technically true. This is some nuance that isn't super important to understand, but um yeah, just to say that you can convert this into the true or the false boolean type. There are also ways to convert numbers to datetimes. So 43 uh you know is extracted as this. If I wanted to convert this number to a datetime, um, I would go and I'd get a time stamp. Unix time stamp is the number of seconds since January the 1st, 1970. So, I'm just going to copy this. Going to go over here. I'm going to feed this in.
What this does is it tells me what the current date time is. I think I have to add three zeros actually. Um, when I do that, because I think this one does it with thousands, but anyway, as we can see, the date time here is now 2025131. Um, it is 300641 according to my time zone, which is nice. They automatically do minus07 because that's where I'm at. Uh, but yeah, you know, you can convert a number of things from numbers or numeric um uh like like numbers into um dates as well to perform functions on
later. And I should note that, you know, this is a number um you know like like this right over here is a number. So what you could theoretically do is you could probably do this So, you know how early I had to add that um thousand separator? If you just multiply this by a th00and first instead, then this is still technically like a like a functioning um number, right? Cuz basically what I'm doing is I'm I'm taking this number. I'm defining it. Then I'm multiplying it by a th00and then I'm converting that to a datetime
which is now rendered correctly. Um you know, this will sort of muck up the date time, but a thousand in my case. It's just the nadn conversion between a Unix epoch time stamp over here. Um and then you know what what NNN is comfortable with. Okay, great. Um we have a couple of additional ones. Uh the only ones that are are really important are the local string. Um, so this converts things from I don't know, let's say 500 uh 500 and then 50,34 sorry 50,50,34 automatically converts this into a string with those commas and everything
like that um in them. There are a variety of things that you can do. Um you could use the same settings that we had before. So remember how earlier if I go to the C full list uh remember how earlier you know I fed in um fr well there's also a variety of other ways that things um can be formatted and this is just like a master list of all of them and some of them will be well most of them are going to be very similar to each other but some of them are also
going to be a little bit different. This just allows you to format things into the particular local or it allows you to format it into a string that is of the particular local of the people that you want and sort of like an an automatic basis which is pretty nice. And then the last one is obviously just two string. Um two string just converts a number which you perform functions on um sorry perform mathematical operations on into a string that you can now do things like concatenate with the term hello. Right? So, you couldn't just
add the term hello to uh 50,50,34 cuz that doesn't really make sense. But since we converted to a string first, this is now basically this. And then we can easily concatenate any string to this if we want. All right, that is the number family. Let's move over to the array family. Um, and let's knock these out. What I have over here on the left hand side is I have an array with three items, Sarah, Sally, and Stephanie. This is clearly an array of names. You can also create your own array in N8 similarly to how
we've been doing so far just by using the square bracket operator. All right, this is technically now um rendered as an array in code that we could do things with just by dot notating. But in our case, as usual, I'm going to start off with that just to show you guys how all of this works. Um and we can see our array has now been pulled and rendered as a variable from the previous node. So if I click period, what sort of functions are available to me? Well, the first is length, which is probably pretty
similar to the string one. It's just instead of counting the number of characters, what we do is we count the number of elements in the array. So, we had S Sarah, Sally, and Stephanie. Those are three elements. It's not surprising then that we have a length that equates to three. Now, we have some other functions here. Last, if I were to put this in, what do you think would happen? Well, we'd extract the last element, Stephanie. Likewise, if I were to extract the first element, Sarah, um, we can do includes. This one in practice I
use very often. Um, and this just verifies whether or not there is the element that I'm looking for in this array. So sometimes APIs will return big arrays with tons of elements. And all I'm curious about is, hey, does this contain the thing that I want? Well, you know, does this contain Sally? Yes. Does this contain Saul? No. But does this contain Sally? Yes. Remember, we're now doing this on array basis. So we're looking for the array elements that need to match these strings exactly as opposed to just the string basis. If we did a
string and then we to typed a substring or a slice of that, it would have returned as true, right? But now that we're operating off of arrays, we need to make sure that they match one to one. Okay, we have map and we have filter. And these are a little bit more complicated, so I'm going to leave them till the end. But, uh, moving our way down, the next function is append. Now, append is just a way that you can add an additional element to an array. Um, if you append something, you're sticking it on
the end. So, if I were to add the guy's name here, let's go Eric. Then if we append quote Eric quote, we've now added something to the end of that array. So I use this pretty often. Um the interesting part here that people don't know most of the time is that you can actually just feed in another array. So maybe we have like a guy's array over here. Um you can append a number of things. In my case, you know, I've just appended another array inside of that array. Uh you can also append other data
types like numbers. So, keep in mind Sally, Sarah, and Stephanie, they all have quotes around them. You can also append things like objects. So, um I believe in order to do this, we actually need to go like this. No, my bad. There are so many quote signs here. I don't know what the hell's going on. So, in order to append this puppy, we'll remove that. And then we can see that the next element over here is uh is an object, right? Right? It's an object with name equals Peter. So yeah, you can append a variety
of things um to an array. Uh but append is just a way to add to the end of it. Another function I'll show off is chunk. Chunk is pretty cool. Uh basically if we have an array and the array has I don't know uh in this case it has three elements. So this isn't really going to work. But basically let's say it has like I don't know 10 elements or something like that. We can chunk it into subarrays of two. So let me make one really quickly. Okay. Okay. And if I just copy this and
then if I feed this in over here, um, basically what we can do is we can chunk this into uh a bunch of subarrays that contain the number of elements that we specify in our chunk. So laptop, backpack, smartphone, notebook, pen, headphones, water bottle, whatever. We're now chunking this into array where we have two items. So I don't know, maybe in this specific case we're asking people to bring um, you know, everybody brings two items or something and then like we all get them together. that way. I don't know. We're sort of at like the
same level carrying wise. Nobody's carrying a bunch of stuff. Um, if you wanted to chunk this more, maybe you'd go three, you go five. Um, you know, if you want to do one, that's just obviously um sort of silly because you're just nesting every element inside of another element. Um, zero breaks, so don't do that. Um, but yeah, that's that's kind of how chunk works. Do I use chunk? Basically, never. Um, but I figured I'd at least mention what chunk was. Okay. Um, we'll go down to chunk. Sorry, we'll go down to JSON. And then
working our way down here, we also have a very interesting function called compact. Hypothetically, let's say we had that array that we had earlier. But let's also say that I don't know a bunch of these elements weren't empty. So if we look at what's being returned here, you see we're being returned an array that still has, you know, 10 elements, but three of them are empty. Well, hypothetically, um, what you can do is if you just wanted to only get the elements in the array that had values, you just type in compact, but it would
actually strip everything that is empty. I should note that these quotes aren't the only things that you can have. You can also have null. Um, this null is not wrapped in quotes and it's a special series of characters. It's just like understood by JavaScript to mean that there's like a null entry there. Um, but yeah, compact is just a quick and easy way to get rid of these null entries or empty entries. And this can be valuable because sometimes this is how APIs send information back and forth, right? You'll receive some big long array and
then like 50 of the fields inside will be empty. Well, this way allows you to just strip those and then only operate off of the data that actually matters to you. Okay, the next function is concat. So, as you can imagine, this is very similar to pend in so far that you can add a bunch of things to it. In this case, you know, if I wanted to add um Sarah or something, we've now added an additional element inside called Sarah, but I could also add um like I did before an array with Peter and
then I don't know, Eric. And now what I've done is I haven't added a subarray. So, it's not like I've added an additional array inside like I did with append. And what I'm actually doing is I'm just like taking these two arrays and I'm just sticking them together. So you can kind of think of it as like squishing two arrays together without really preserving um like the data type uh necessarily. Next up we have a very interesting function, one that I use quite often called difference. I'll also show you its intersection which is um inter
uh sorry I'll show you its inverse which is called intersection. But I'm just going to create a new array and I'll go 1 2 3. Then I'm going to go difference. Then I'll go three, four, four, five. So basically, oh, sorry, I need to make this an array. So basically, what difference does is difference just returns you all of the elements from the first array that are not in the second array. Okay, so one and two are not in the second array. Three is in the second array. So we're only getting one and two. Difference
doesn't care about all of the elements here. like you don't insert any of these elements here. It only ever uh uses the the the first array that you feed in as like the primary data. So if I were to say two, what do you think would happen? Well, if I click two, obviously this is now going to disappear because one of the elements here is now over here and the only element that is unique. You kind of think of this as like a unique element, although um there's another function called unique. So it might not
be good to to conceptualize that way. Um, but all of this does is this just takes all of the elements here that are not in this array. So, there are tons of ways and and reasons why you should use this. One way that I just used this the other day is I'm tracking a bunch of other people on YouTube that are about the similar size to me. Uh, just because I want to see if there's differences in posting schedule, lengths of the videos or something like that. And so, I'm calling a YouTube RSS feed. The
YouTube RSS feed brings me an array of a bunch of YouTube posts that they make. Well, I can store their YouTube post in a database. And then all I can do is I can just compare to see, hey, um, you know, is this RSS feed array different from this RSS feed array? Oh, it is. Okay. Well, what's the difference? Is it that post? Okay, great. Well, now I know that that's the post that I'm going to take to like update my database with. I'm going to add that post essentially. So, uh, yeah, variety of ways
you could do this. If we use our example here of um you know names maybe maybe what I'm doing is I'm just looking for um any name from this array that is not in this array back here. So Stephanie for instance is not in Sarah, Sally or Peter. Hence why I'm returning Stephanie. Now the inverse of this is called intersection. And this is similarly another function that I use all the time. An intersection is super valuable. Basically, instead of looking for the difference, it looks for the instances in which we have both data. So, we
have Sarah in both arrays, so that's what I'm going to return. We have Sally in both arrays. That's what I'm going to return. Do we have Stephanie in both arrays? No. We have another name called Peter, right? So, intersection and difference are both fantastic, and they're things that uh you know, if you're working with any sort of like real industrial or enterprise data, I think you're going to find yourself using all the time. Okay. The next function I want to cover is called find. find is pretty pretty sweet. Um, basically it allows you to use
math as part of your function. So, if you just press enter, you'll see that we've now added it doesn't just allow you to use math, sorry, it allows you to use like any sort of operator. Um, now we've added this cool little syntax which is called like arrow notation or arrow syntax in JavaScript where um we've got now we have an element. So, we now have some some variable that we're calling item and we're saying true. This is pretty interesting. Um, the way that this works is think of item as the individual item in the
array. So all we're doing is we're basically saying, hey, array zero is equal to item. So item is just the name that we're going to use to reference the specific uh item in the array that we are currently at because it's going to go through all of the items. So this is kind of a piss poor example and I don't really know why they do that, but let me show you something that you can do with this. What if we want to return all of the elements in an array that are greater than let's see
uh I don't know they're greater they have more characters than six. So um Sarah has six charact or five characters. Sally has five characters but Stephanie has way more than six. Realistically I think has like 10 or something like that. So maybe I don't know we're just looking to see if there are any names in our array that are longer than a certain number of characters. How would you do this? Well it's actually really easy. We go dollar sign JSON.array.find and then we take the thing item. Then we just check to see if item length
is over six. And if so, then our result is Stephanie. We're finding an element in an array that corresponds to this. Okay. Now, there's some nuance and some some things here that I should explain. Um there's another function that does something very similar to this called map. Uh sorry, called filter, which I'll cover in a second. But this element is special because it only returns the first instance of the element that uh satisfies the request. So JSON.array.find we define our item and we're saying the constraint is the item.length needs to be less than six is
going to return uh Sarah but it's not going to return Sally even though Sally also fulfills that request technically. So find is super powerful. I don't use find as much as I use map and filter. Um, but I'm I'm going to cover all of them regardless. The very important thing to know here is you just need to be comfortable using array syntax. Um, um, arrow syntax. This is called an arrow function in JavaScript. So, I should note that it doesn't need to say item. It could say I as long as the element or the way
that you've named it on the left is the same as the way you've named it on the right. This satisfies the condition. So, in our case, um, I is just a symbol that we're using to denote all of the different elements in the array um, one by one. Okay, great. So, that's fine. Find fine is pretty awesome. Let's now cover um index of. Index of, as I'm sure you can imagine, is very similar in the array format to the way that things are represented in the string format. If we are looking to find the index
of the entry called Sally, well, then the entry is one. This is zero. This is one. This is two. What if we wanted to find Sarah? It'll return zero. What if we wanted to find Stephanie? This will return two. Right? So, that's what index of does. Um, and one common theme that you'll find is that arrays and uh strings are actually pretty similar in terms of what's going on under the hood mathematically. Next up, we have is empty. If I feed in this array with three elements to is empty, obviously it's going to return false.
We also have is not empty, which is the inverse. And then we have a very special uh function, one that I use very often, called join. And all join is is it's the inverse of split. Remember how earlier we took a string and then we split it into an array. Well, join takes an array and then it turns it into a string. So in our case, we have Sarah, Sally, and Stephanie here. We can actually just join all those together and then we can get Sarah, Sally, Stephanie. This is now a string. So hypothetically, what
if I wanted instead to put plus signs between them? Sarah plus Sally plus Stephanie. Well, all I do is I go space plus and then space. So what join does is it just gets all the elements as they're laid out. Then it adds whatever characters you want between all of them. So, we go comma space. We could go this. We go underscore, right? We have a ton of options here. Uh, we we have a ton of options here for how we want to do the separator. Uh, which is pretty cool. So, I use this all
the time. I mean, this is how I turn a bunch of array data into like a string or something, right? I also use this to convert things into like CSV format, which is where you have like a comma between. And then the cool thing is you can just take the CSV, you can actually make a file of it and just upload it to a Google Drive or something. So, tons of examples here. You know, they show you how to do three with a space plus space. Um, if you just join with nothing, then if you
join with um like an empty string, it'll just kind of stack them all together. This is very similar to like a text aggregator sort of function if you're using make or um some sort of aggregation function in most no code platforms. Okay, great. Let's now cover merge. Now, all merge does is it allows you to take a specific type of array and that's the type of array that has um objects as elements instead of just um numbers, strings or booleans or subarrays and allows you to basically take them all and then stick them into one
big object. So, if you think about this, what we're really doing is we're converting from an array into an object. I'll give you guys a quick example of what that looks like by actually creating my own. If I were to grab my own array, and then I were to create an object inside of set array where I have name, that's object number one, and then I were to say city. The automatic curly brace adding is kind of annoying. Okay, so name Nick. Uh, let's do city Calgary. And then we'll go, I don't know, height. And
then we'll go like 188 or something. Just like this. Right? We now have an array that contains three elements. We have name neck. We have city Calgary. And then we have height 188. What if we just wanted to convert this into one object? Well, we just go merge. Sorry, that's not going to work because we're outside of these curly brackets. Let me just add a space here to make our lives easier. We go domerge now. And now we basically taken an array and we've converted it into an object where all of the um array elements
are now just key names in one. So it's name, nick, city, calgary, height, 188. This is now just one object. And now instead of a bunch of array functions, we actually have a bunch of object functions available to us, which I'm going to go over later. So merge is, you know, I mean, like I understand why they put merge in, but do I ever actually use it in practice? No, not really. Next up, we have pluck. Pluck is pretty badass. Um, basically what we get to do is if I were to feed in the same
thing that I just fed in before, then instead of merging it, I were to pluck it. What I can do is I can extract the specific things from this array of objects. Like if I had name and then uh I mean you know this this isn't a very good example but if I were to pluck out the name what I'd get as a result is I'd get nick. Okay. Pluck just allows you to extract the value of something that has a key name equal to what you've put in here. So hypothetically if I were to
just have another person in with a name Sally. What I've done is I've plucked out all of the names. I've plucked out Nick. I've plucked out Sally. This is another one of those manipulation functions which I don't really use too often. Um, but it's not bad to know. The next function we have is called random item. It is fantastic. Random item is just a quick way to select something from an array. I use this all the time. I use this in like roundroin scheduling. Well, not round robin scheduling, sorry, like uh random scheduling. I use
this when like I'll generate a a list of random numbers and I'll just select one. Although to be fair, there is like a random function that you can use. I use these to like, you know, statistically randomly and uniformly just take things from an array and then do things with it. The next function is called rename keys. You guys remember that example function I had earlier? If I just go back to it, if I had a bunch of entries with name, name name, and then name, and instead of using pluck, I were to use rename
keys. What rename keys allows you to do is it basically allows you to to search for a specific key name of the object. So in this case, name, then convert it to something else. So maybe instead of name, what I want is I actually want to call it first name. Well, this will now um create another array, but it'll automatically go in and it'll rename all the keys and all the objects in set array. This is another one of those like more complicated like data formatting functions that I don't really find myself using often, but
I have used this before and uh it's worth at least knowing. Okay. And JSON.array reverse does probably what you're expecting it to do. Um it just takes as input an array. So, in my case, an array of Sarah, Sally, and Stephanie, then it reverses it. But for some weird reason, every time I put JSON array at reverse in, it crashes my NAND server entirely and then I have to spin it up again. So this is a very interesting development if I'm honest. I wasn't expecting this one function to just consistently crash, but I've repeated the
behavior a number of times and just does not really seem to be cooperating. Anyway, imagine if it said Sarah, Sally, and Stephanie in your input. Um the output would be Stephanie, Sally, and then Sarah. Sally is the middle unit, so it wouldn't necessarily change. Anyway, I'm going to exit this page, fix it, and then come back. Okay, next we have the slice function. Um, the slice function works the exact same in an array as it does in a string. If we wanted to slice between zero and two, we get Sarah and Sally. If we want
to go one and three, we'd get Sally and Stephanie. Next up, we have a very interesting one called smart join. Uh, basically, I'm going to rely off the given example here just because it's such a nuanced and and I want to say uncommon function to use that I don't really use it basically ever. But you know over here you see how we have um an object that is specifically formatted as follows. Field age value 2 field city value Berlin. Okay, let me copy this over. I'll show you guys what this means. I were to pump
this in and I were to go to smart join. And if I were to feed in um field and then value and I close it off and what this would do is it would basically take as input my array and my array is broken down into basically an object with a field and a value for every thing. Like if you think about it, there's no need to break it into a field and then an age and then a value and then a two. You could just go age and then two, right? City and then Berlin.
Um, but it takes this very particular formatting and then it basically plucks similar like to what we were doing before. It plucks out the fields and then the values and then it uses it to turn into a new object where the first element that you feed in is going to be the key and then the second element that you feed in is going to be the value. I don't really ever use this so I probably wouldn't worry too much about understanding it if you don't. Next up we have sort. Sort just sorts things alphabetically to
start. Um, if you want to do anything more complex than alphabetical sorting, you're going to have to use one of those arrow functions that we talked about again. And unfortunately, the way that the arrow function works is not very intuitive. It's just a handme-down of um I guess uh you know like some programming or JavaScript conventions. Basically, you want to grab A, which is going to be your earlier element, and you want to grab B, which is your later element. You just always want to wrap it like this. And then in order to turn this
bracket a comma b into some sort of inverse order, what you'd have to do is you have to go to b localal compare and then go a like this. It's kind of annoying, but we've just reversed it. Basically, we've sorted this. Well, we didn't reverse it actually. We sorted this based off of the presence of the characters in the alphabet. You know, SA comes before S, which comes before ST. Uh because we're we're doing this inverse comparison. If you were to go alphabetically, it would just be standard. it just be a and then b um
why you have to use the localal compar in this particular format to be honest I don't really understand or get um I don't really ever sort anything other than numbers um from like largest to greatest or strings um alphabetically ascending and then if you think about it if you sort things one way you can also just sort it and then you can just reverse it in order to get the other thing right so like most of the time in practice I'll sort first and then I will reverse after now I'm not going to type the
two brackets there because I have a feeling it's probably going to break my my nan add an instance again for whatever reason. But yeah, that's that's how that works. Next up, we have JSON string. Um, this just converts all of the elements in an array into like a JSON string that you could do stuff with. So, this is now a string. It's not an object. It's a string and you can do string manipulations on it. A lot of the time you have to convert things into JSON strings in order to send or receive them through
API. So, I'll use this reasonably often. Next, we have two spliced. Two splice is actually really, really interesting and I could see a lot of cool uses for it, but I personally don't use it very often. Essentially what it allows you to do is allows you to take as input an array. Then what you do is you will add specific elements at an index that you specify then remove a bunch of elements after that and then actually designate the thing that you want to add. So I know that sounds kind of difficult but let me
show you as as our example Sally Sarah Stephanie. Let's say this is the zeroth position. This is the first position and this is the second position right? Let's say I want to add something at the first position right over here. So, in order to add something, I go one and then I go comma zero. And I'll show you why in a moment. And then let's say I just wanted to add another s name. Let's say s Oh jeez, I already have Sally. Samantha. Yeah, Samantha. I would type in uh like this. What I've done is
I've inserted Samantha into the first place of our array. If I wanted to move it so that it's after Sarah, I just go two. If I want to do it so it's after Stephanie, I go three. And I know can I add it in fourth? No, I can't because of the it takes the length of the string length of the array and then it uh sticks it in at the end. So yeah, this is me just bringing some at the back. Baby, that's what I'm doing now. I'm bringing her forwards. I have the power. Uh
next up is uh the second parameter is kind of interesting. Basically what this does is it deletes a certain number of entries. Uh which is kind of kind of neat. You can delete the number of entries from the start index onwards. If I want to delete, let's say three entries or something. I think I have to refresh this unfortunately. Sorry. Let's do one. Yeah. Yeah. Because we can't delete anything at the third index because there's nothing left. But hypothetically, we go 0 0 first. If I delete everything from the zeroth index and then I go
one out, I'm going to delete between zero and one, which is this, right? If I go two, I'll delete Sarah as well. If I go three, I'll delete Stephanie. That still allows me to add Samantha though. Um, sometimes the NAD editor will sort of bug out like this if you have an additional comma. So, just be really careful. But anyway, this still allows me to add Samantha. So, the way that I like to think about this function is this function is just sort of like an all-in-one. Um, if you wanted to do two or three
things simultaneously, if you wanted to add an element at a specific place, then if you wanted to remove a bunch of elements, um, and then if you wanted to, I don't know, like designate a specific element to add, um, then you'd be able to to do so here. And the cool thing is this is this can be an array. So I could add more Peter uh more people here too. So I could add like Samantha, Peter, and then Stacy. And then I could use that to if you think about it logically um replace the three
elements that I have in here. So like you know this is what the string looks like when I concatenate them. This is them afterwards. So this is just sort of like a I don't know. It's like a it's like a three in one if that makes sense. Do I use this one often? No, I do not. Uh still pretty cool though. You know, you could probably impress some people. The next one I want to cover is called union. Union is pretty awesome. Um this is uh like it's the union operator in logic. And basically if
you feed in two arrays and they have overlapping elements, it will just ignore the overlapping elements and then just give you a unique um total array which only contains unique elements. So you know how we have Sarah, Sally, and Stephanie. Let's say I feed in another one with Sarah, Sally, and then Stacy. What we do is we basically add these two. perform a union on the first which was Sarah um Sally and then Stephanie and then the second which is Sarah Sally and Stacy and we don't duplicate the Sarah and Sally elements right these are
unique we just add the single new element that's sort of like a difference between the two so you can kind of think of this as similar to the intersection and the difference functions this one just doesn't preferentially add things from the beginning or the end it just does it with both equally which is nice function is unique and I use unique all the time it displays only the things that are unique in your um array. So this is a very quick way to dduplicate data. If I if you think about, you know, an array and
I have 1 2 3 4 5 and I pass it through the unique function, I'm only going to have five remaining. If I go 3 4 5 23, you can see I've added nothing. But if I go six, now I've added a single additional element. And it does so by preserving the placement as well, which is quite handy. So I use unique all the time. Very very common for me to use unique. Okay, let's now cover um the two functions that I've been leaving until the very end here. Actually, three functions if we count reduce
as well. Map, filter, and reduce. These are extraordinarily powerful. Um I use map and filter all the time specifically. And these, you know, if you figure them out, will end up being probably your most used array functions um because they are just the cardinal v array functions. So, the first thing that I'm going to do is I'm going to do map. Now, if you remember back to um that previous function that I showed you guys, um we are now going to be using arrow syntax again where we have some item and then what we're doing
all the map does is map just does something to the item. Okay, so let's hypothetically say I wanted to append gmail.com to all of these entries. I could do so very simply just by concatenating gmail.com. Let's dogmail.com like that. So what I've done is I've taken my item which is I and then I've said for every item I want you to perform this function I do concat and then gmail.com. Pretty sweet, right? Well, why don't we now make them all um lowercase as well to lowercase. Then I double up on the brackets. Um now you
can see that we have basically all of these formatted as email addresses. So now I'm kind of mixing and matching combining functions which is cool. Okay, so what's really cool about the map is I mean I just did this with a string, right? But you can do this with whatever data type. Like hypothetically, if instead of JSON array, I fed in 1 2 3 into map. What I could do is I can just multiply this by two, then I can instantly change all of these a proportional amount. If I divide these, you know, I could
do a bunch of cool stuff with that as well. U modulo 2 probably like like there's there's so much that you could do with a map function, it's crazy. I'm not even going to like start, but um just know that this solves like 99.9% of all array queries. Now, similar to similarly to the map function, you also have one called the filter function. If you've never used the filter function before, I'm just going to give it a click because it'll automatically check this out for me. What the filter function does is it basically does the
same thing as map in so far that it goes it goes over every element in your array, but it allows you to like filter out elements that don't match the criteria. So let's say I have a simple array here 1 2 and three and I filter out all elements where I is less than three. Right? So all elements where I is less than three. Well 1 is less than three. Two is less than three. Three logically is not less than three. It is three. Um so I only have 1 and two. Okay. If I were
to do this with um my array, I could also filter based off of string u constraints. So my array, if you think about it, is Sarah, Sally, and Stephanie. What if I was only interested in returning um entries that had a length of less than six? Sally and Sarah more than six, Stephanie. So, we're basically doing the same thing as find, but we're we're doing it a little bit differently. We're sort of proceeding with it a little bit differently. So, map and filters I mentioned are fantastic. I use them all the time. There's one more
which employs similar logic, but you're probably not going to end up using it anywhere near as much. It's called reduce. Now, reduce can be very complicated to understand. Um, so I'm just going to cover it like really really briefly. Um, but essentially what it allows you to do is it allows you to define your own function and then you can do stuff to things iteratively. So let's say I have 1 2 3 4 5. Okay, I'm reducing. What you do is you have some accumulator then you have some initial value and then you have an
arrow where you go accumulator plus initial value. So what's happening? I think it's a c I think it's called initial value. I might have some other term for it. I might be misunderstanding but basically you have like a and then you have b and what you want to return is you want to return a plus b. So what this does is it says a is your current element. So a would be uh for the first pass around be 1 and then b would be the one next to it. Okay? So 1 + 2. Then it
would take the result of 1 plus 2, which is 3, and then it would add it to the next thing, which would be 3 + 3. Then it would take that result, which would be six, and add it to the next thing, 6 + 4. Take that result, which is 10, add it to the next thing, 10 + 5. What do we get as a result? We get 15. Now, you can do a number of things that aren't just mathematical functions to this. Um, but this is sort of like an accumul like it like it
aggregates things the further it goes along. So obviously large arrays, you know, that you're running some functions on um will be bigger and bigger and bigger mathematically. You can do things like divide too. So I don't know, a divided by b. It's kind of interesting. A * b obviously grows. A minus b you're going to get a negative number, right? Cuz you're going backwards, but I'll leave reduce there just because, you know, in practice, you're probably rarely going to use it. Okay, that now takes us to the object suite of functions. So I'm just going
to change the type to object here. And I'm now going to be extracting data from this, which is an object that is nested one level deep with a first name, a last name, and a height in centimeters. Apparently, Kof Arladen, uh, one of my favorite characters from fantasy, is 186 cm. Wonderful. So, um, I'm going to go JSON dot object. And I have access to this. And I'm going to press dot. And the first thing you're going to see when you're operating with an object is you're going to see some additional fields up at the
top. So basically we'll go in we'll parse this out and then we have access to the first name the last name and the height in centimeters. So these aren't functions these are parameters but I'm going to write them down anyway. First name will equate to both right last name will equate to Arllin and then height and cm will equate to 186. Pretty neat huh? So these aren't functions as I mentioned. These are just ways to reference um you know uh values in in set array. Let's actually get into the functions. There aren't too many of
them so it's going to be pretty straightforward. The first is called keys. Keys is pretty self-explanatory. All we do is we just get the keys and we pluck it out and turn it into an array. So in our object first name, last name and height in centimeters. These are all the keys. On the right hand side, both Arland and 186, these are all the values. So if we want to extract the keys, we use keys. Similarly, if we wanted to extract the values, well, you just type values. So now we're extracting kind of the other
half, right? Both Arland and 186 instead of first name, last name, height, and centimeters. In addition to that, um you can do is empty. This just tells you whether or not the object is empty. So, this object clearly not empty. There are a lot of things there, right? Is not empty. That's dang right it's not empty. There's a lot going on in there. Next up, we have has field. Has field is pretty self-explanatory. Basically, we're just looking to see if there's a field called um whatever. So, maybe we're feeding in an object. We just want
to check to see if there's a field called first name. Well, we just go first name. That's true. But what if we wanted to check if there was a full name field? Full name in this case would be false because there's no key that corresponds to full name. Realistically, they probably should have called this has key and not has field. But what are you going to do, right? JavaScript. Okay, great. Next up, we have compact. Compact just does the same thing uh in objects as it does to arrays. So, basically, if we had any empty
um values here, um we could we could uh basically remove them instantly. I'll show you guys an example. If I go first name Nick, then I go um last name, and then I go empty, the end result of feeding this in to our compact function, it just removes this last um element in field entirely because it's empty. If I put an X there, you'd see it had populated. Okay, the next function I want to talk about is going to be called um keep fields containing. This is kind of an interesting one because I don't know,
they they change the the name or the meaning of fields over and over and over again. Basically, you see over here how I have first name, last name, Arlin, height, and centimeters. Well, what if I only wanted to extract parts of this object that have both in it. So, I want to extract the field name and the value of the field and value that contain. If I put that in there, you see that I've now created a smaller object called first name. And that's it. I don't really ever use this in practice, and to be
honest, I don't use most of the object manipulators in practice, but we have remove field. Remove field just allows you to specifically take things out that you don't want. So maybe we want to remove the last name. We want to remove the height in centimeters, right? We also have remove fields containing. So this will go and take out fields that contain a value that we want or don't want. So in our case, we don't want any fields containing the value of both. So we take first name out entirely. And now it's just last name, height,
and centimeters. And then we have our obligatory tojson string which just takes in the object and then it turns it into a JSON string that we can send to receive uh basically um through API call. So you know if you're trying to send an API call or trying to send data somewhere and it keeps on telling you that your JSON is misformatted just try passing it through to JSON string first. Um I use it pretty often. Last thing I'm going to show you is URL encode. This is pretty interesting. Um but basically you know how
earlier we were talking about URLs, right? Let's hypothetically say I have some database available. Okay. What you can do with a URL is you can encode what are called query parameters. Query parameters look like this. You put a question mark and then after you put the name of the variable or the key name and then the value and if you want to add more the name of the variable or the key name and then the value and name of the variable uh aka the key name and then the value. So what this allows you to
do is allows you to turn a JSON object which is sort of like this structured thing, right? and it allows you to just instantly encode it as one of these URL parameters or query parameters. This is pretty uh useful anytime you want to send or receive data add it to a website or something like that because instead of you having to like manually put all this stuff out like hypothetically I could totally go first name equals and then I could go dollar sign JSON.object first name, right? Be kind of similar. Um, but I'd have to
do this sort of structure over and over and over again, which would just be a massive pain in the ass, right? Hypothetically, instead of me doing this, um, what if I just went, you know, this is, as you can see, it's just really unseammly. Um, you know, instead of doing this, if I just went, uh, JSON.object URL encode, u, you know, this is kind of a lot more interpretable, a lot shorter, a lot easier. So, I use URL encode pretty often. Okay, let's cover boolean functions. And boy, do I have a surprise for you. If
we go JSON.boolean.bool, I should say, um, you'll see that there really only two functions. There's two number and then there's two string. So two number just turns a true into a one and then a false into a zero. In our case, what we have is we have a true down here. So the output is going to be a one, right? If we wanted to instead turn this to a string, this just turns the bool, which is uh technically even though this is in letters like t r ue e, this technically isn't considered a string. So
what this allows us to do is allows us to take a bool and then convert it into a string. So we could do things like, you know, to uppercase or something. If we were just to go bool to uppercase, um, as you see, it doesn't really allow us to because this isn't like a function that you can apply to bools. So you got to go to string first, uh, basically. Okay, the last thing we're going to be doing is talking about datetime functions. Now the first thing we have to do in order to get a
datetime function is we have to get a we have to get a date time right. So if you guys remember the way that I did this in order to get the Luxen date time it was called was I went uh 01 sorry 3101 2025 then I went to date time saying that it can't convert it. Uh why was that? I think my format might have been different actually. 01 was it 01? Yeah, sorry. It was um I think it was 0131. Yeah, deluxe and datetime. Okay. Anyway, uh okay. So, once we have something in the
standardized datetime format, um there is a million in one things that you can do. All you do is you press period. And now the standardized datetime format offers just uh god I don't know 20 or 30 functions. Now, I'm not actually going to show you every single one of these because some of these are such uh, you know, obvious variants of each other, like you can plus a date, you can subtract a date, and that sort of thing. But I am going to cover all the ones that are important that I find myself using pretty
often. So, the first one's called format. Format is super valuable. Basically, it allows you to get something that is a datetime, okay? Like this that allows you to format it however the hell you want. So, you know how there are millions of datetime formats out there or millions of date formats? Some people want it uh year year slashmon month/ day. Other people want it month/ year uh day/ year year. Well, this allows you to do so using characters that are um designated in this formatting guide. So, basically you have tokens like S, tokens like lowercase
U, tokens like Z, tokens like K, right? And all these correspond to things like hypothetically if you wanted to um instantly translate any time into an extraverbose localized datetime you could just type fff or sorry ffff and it would automatically do that. So let me show you. If I just typed fff I've now converted this into a datetime and then I've immediately formatted it into this super extraordinarily complicated looking date which is just like a string representation. I could remove some complexity with FF. I could remove even more with FF. And I could just go
FF to get some other format. Likewise, I actually create my own format if I wanted to. So maybe I wanted to go um year year year. Okay, sorry. Y I meant to say um because you got to lowercase Y's. Then month and then date date. And then let's say I wanted to go hour hour minute second. Okay, I've taken this date then I've converted it to a date time. Then I've formatted it in this specific structure. As you can see, we end up with um not only the year, the day and the month, and the
day, we also end up with like the number of hours, minutes, and seconds. Now, in this case, it's 00 0. Why is it 00 0? Well, um I've been inserting standardized date times here. What you can actually do is there's a specific function that grabs the current date and time called dollar sign now. So, dollar sign now, if I were to just remove this, dollar time, dollar sign now is already in a date time. So you actually don't need to convert this to a date time. Um all you would have to do is you you
just format this um as follows. Year year um month month day day and then h mm ss or maybe hh I think if I want to get three and then I think you just go a uh no p it'd say like am or pm or something like that. Uh, I kind of forget how to do that though. But anyway, um, now you know you can format the exact current time, uh, which is pretty cool and pretty useful. And I believe there used to be, and I don't know if there still are. I think there was
like a time stamp variable or or something else, but I'll I'll leave that out um, just for the purposes of this discussion. Okay, great. So, if I just go back to my previous um, example, which just had sort of a simpler look at a date because we didn't have a bunch of seconds and stuff like that. If I press period again, you'll see that now we also have a few options. We have minus, we have plus, and then we have diff 2, and then extract. And these are the most commonly used datetime functions and ones
that I use basically all the time. Minus just subtracts a given amount of time from a date, and it allows you to designate things just in like natural language. Well, not natural natural language, but like using dates, uh, days, hours, uh, weeks, that sort of thing. And then plus adds. Let me show you what this looks like. So, you know how right now this is like 0000? Like basically there's no there there's not even a single second to the day. Well, what if I wanted to add, you know, 30 then seconds? Well, you'll see we've
just changed this here. 40 seconds, 50 seconds, 60 seconds, 70 seconds, 80 seconds, 90 seconds. Let's say hypothetically we wanted to add 10 days to this. Well, now it's February the 10th. How about 10 weeks? Well, now it's March the 11th. Well, now how about 10 months? Well, now it's November the 30th, right? You could even add years. Um, this is pretty standard, right? If you wanted to take this out, you just subtract instead by using minus. So, variety of different functions uh available to you for just doing like simple date manipulations. Um, a couple
of other ones that I use pretty often. Uh, there's this one here called diff 2. Basically, what you do is you feed in the most commonly used one is now. But basically, you feed in the starter over here on the left and then you get the difference between that and the second date over here, which in our case, we're just going dollar sign now. And then we get the number of days. Hypothetically, what we could also do if you wanted to reverse this, right, this is a negative value. We could go dollar sign now diff
2. Then we could feed in this whole thing. And then we'd get that it's been 667 days from this, aka I'm about 66% done. um the current day because this was counting from like the zeroth minute, the zeroth second, the zeroth hour of, you know, January the 31st, 2025. Likewise, we could uh show this off in weeks. We could do this in minutes. We could do this in seconds. Man, it's kind of crazy to me that 960 minutes have already gone by in my day. What the hell have I been doing? Anyway, um aside from
the existential value, obviously there's just a lot that you can you can do and get done. And then, uh we could also extract. So we could extract things from this really easily. Like now is obviously January the 31st, 2025, right? What if I wanted to extract the month? Well, we get the first month of the year. If I wanted to extract the year, what if I wanted to extract the day, right? I can basically go in, I can extract the current second, man. I can extract the the minute, right? The minute of the hour of
the day. Um, so I have I have a lot of options available to me. Uh, and so this this ends up being pretty valuable when uh I don't know, usually when I'm sending or receiving something or when I'm performing logic for stuff like invoice follow-ups or email follow-ups. Um, using all of these functions just makes a lot a lot easier to calculate how long it's been since something has occurred and and so on and so forth. Variety of other functions. Um, this one uh is end of. This allows you to round up to the end
of the month. So if I were to give you an example, this doesn't really make sense because I'm at the end. So, why don't we do start of instead? Um, start of just does the same thing. It just rounds um in the opposite direction. But if I want to round out my current date to the start of, then basically what I've done is I've rounded my date, which was January the 31st, to the the beginning of the month, which was the first. So, this is very similar to the floor function. It's just you're technically flooring
like a date, which is pretty wild. Um, if I wanted to go start of the year, it would be the same thing cuz this is January, right? If I wanted to go end of year, you can see that we're now 2025, 12, 31, 23, 59, 59, 9999, so on and so forth. This goes all the way to the very very end of the year. I don't remember if you could do decade. No, you can't do decade. Uh, could you do millennium? Yeah. Anyway, lux and datetime is a something for another time. Lux and daytime is
for another daytime. Uh, if you guys want to check the myriad cool functions, um, just Google this and then you'll see a variety of dot functions similar to what we've been screwing around with here. Luxon's extraordinarily powerful, but obviously some of the syntax and stuff like that can be a little trickier. Okay. And then aside from that, there was just a couple other ones that I used pretty often. Um, oh yeah, yeah, they're components. So, you know how earlier we were extracting things and we were doing so by saying like month. Well, you can actually
just get like day, you can get like month, you can get like year. Uh, and you can you can dotindex it that way. Um, there's also zone. Um, so, you know, a lot of the time when you feed in a datetime object that you get from an API or something, it will include stuff like this minus 07. Well, what you can do is if you just type in zone, it'll tell you what the name of that time zone is. uh which can be really useful you know just when clarifying stuff contractual documents can be useful
because a lot of services also require you to feed in a time zone and a lot of these also just use like zone codes or there's like a lot more names to these zones than I understand so in practice I usually end up using something like that in order to reference it and then there's um just some helper functions like is weekend so like you know you can find out if the date is a weekend let's say you're sending some sort of invoice follow-up well you can you know do your math and then you can
determine if something is a weekend and then if it is a weekend, you can grab the date and then you can add one to it or two to it and then you can send it on the Monday instead. You have a lot of options, I should say, which is pretty neat with formatting, you know, date times as things like, you know, whether it's a weekend or in this case whether it's a leap year or so on and so forth. So, yeah, I'm going to leave the daytime functions there, but definitely check that out um if
you guys want a lot more power and control over the way that works. I didn't add daytime functions in the batch of 106 just cuz these aren't technically like NADN functions. These are functions outside a library called uh Luxen and uh you know that's not like native to NAND or anything like that but obviously they're still super powerful to know so I highly recommend it. Okay, hopefully by this point you now have a reasonable understanding of NAD functions. Again, I know I mentioned this a few times in the video but you don't have to memorize
all these. You can grab all of the stuff just straight from the documentation and the NAND AI tool is also pretty good at just figuring out sort of the finer nuances behind some of these functions. So, what's more important than knowing the specific information itself is just knowing how to find the information if you need to. And that's really what most modern developers do. It's not like we've all memorized every single function on planet Earth. We're just capable of going through a list of functions, reading a little bit of documentation, and figuring out which ones
apply for which use case. Now, let's take your NAD knowledge to another level by transitioning from solely cloud hosted environments to self-hosted environments. To make a long story short, self-hosting just refers to the idea that you actually take the NAND source code and then you put it on a server. Now, you are doing it on the cloud. Technically, you're putting it on some sort of cloud server out there, although you can certainly do it on your own computer as well. It's just a little bit of nuance that I don't really think most people care for
these days, but there are a number of benefits to self-hosting. The biggest one is cost. So instead of you spending a fixed amount per you know thousand operations or executions or or or workflow node runs what you can do with a self-hosted environment is you could basically pay a monthly rental to the service that hosts the server. Then you could run as many executions as you want. So instead of you spending you know hundreds if not thousands of dollars to run let's say 1 million executions per month you could spend maybe 10 or 15 bucks
to rent a server and then um you don't have to spend any money whatsoever to NAD. you just take care of all those executions within the the server rental. That sounds a little bit more complex to you, don't worry. I'm going to dive into how to do all of this stuff in the next few minutes. It's also really good for data security and privacy concerns. There's some niches that you work in, specifically healthcare, uh, legal, some financial, where you can't actually send like customer or patient data up to the cloud or you can't have it,
I don't know, leave the bounds of your country. And so in this way what you can do is you can rent servers that are within your country or maybe on premises and then you know run an NAN install there making sure that you're not leaking any customer or member or patient data. This to be honest isn't super important in practice but there are a few industries in which this applies and self-hosting is the primary solution for a lot of those industries. The first and simplest way to self-host is using Render. For those of you that
are unfamiliar, they call themselves the fastest path to production for a reason. Now, I'm not affiliated with them, but I'll show you how you can get up and running with Render in just a couple of minutes. This is easily the simplest way to go ahead and do so. So, first things first, just create an account over here. Now, I already have an account, so I'm just going to put in a fake one here. Fake email address and the fake password. We're going to click create account. They're going to ask you to verify your email next.
Now, since I've already gone through and done all of the sign up, I can then go and then sign in. So, I'm going to sign in with my account. After you are done verifying your email, you'll be taken to a screen that looks like this. It'll say deploy a web service, static site, Postgres database, or explore all service types. Now, unlike a lot of the other videos here, I'm actually signed up to the service. I'm actually going to be paying when I need to. But I want to let you guys know that like, you know,
the these videos tend to be invalidated pretty quickly because all of the platforms that we are signing up for self-hosting on, they all tend to have different UIs and UXs and they change the way that their dashboards look and stuff. So instead of paying attention to the very specific buttons I'm clicking and stuff like that, just try to understand what I'm doing more generally. So what you're going to want to do is you're going to want to find an area in the page that says deploy a web service and then go down to where it
says existing image. What you're going to need to do is you're just going to paste this in uh verbatim. So nadn has a deployment method called a docker. Docker is just a very simple and easy way to grab like an image of the nadn install off of the internet. So, if you just Google, you know, nadn docker like I'm doing here, you'll get a page that looks something like this on the docker hub. And if you just scroll down, you'll find a URL that looks something like this. Docker.n.io/nadn.io/nadn. This is just what you copy. Then
you go back to render and just paste it in where it says image URL up here. And then you click connect. I'm going to leave everything else as blank. And I'm going to click on free for hobby projects. In reality, what you're probably going to want to do is you're going to want to launch a starter uh standard or pro plan depending on your usage. If you are doing thousands of requests a minute, pro is probably uh sufficient for you. If you're just getting up and running and maybe have like two or three clients or
two or three um you know, systems that you're you're maintaining that send workflows every few minutes, starter sufficient for you. If you do free, just note that they'll automatically spin down the service. This can be kind of a pain in the butt, but I'll just leave it at that. Once you're done, it's going to go through. It's actually going to spin up the Docker image and you're going to set up your server. So, let me cut in a second. By the way, it was on this website that I first found what NN actually means. Uh,
it was written by the creator himself and he says that it means nodemation and it is pronounced as N8N. Apparently, the reason why was he just didn't really like typing a ton of characters. So, he said Nad, nodemation. Good enough. Okay. And then after a couple minutes, you're going to get a message that looks something like this with editor being accessible on this local host. All you need to do is go up here to the link, give it a click, and then you'll have the ability to set up your owner account. So that's what I'm
going to do here. And once I'm done, going to click next. This will then send a verification email using my server actually, which is interesting. Do some fun little onboarding. Heard about y'all from Google. Then we actually have the ability um and this may not necessarily be the case when you guys are watching, but as of the time of this recording, we have the ability to get a bunch of paid features for free with a license key. So I've already done this on a bunch of other ones. I'm going to skip it, but yeah, now
naden is here. We could start any workflow we want from scratch. This is running entirely in our own server. You'll see that because it's a free server, it's going to be a little bit slower than usual. Um but all hot keys, everything you could possibly want works. And because you're using a Docker image, it's going to be up to date. So this is by far the simplest and easiest way to get up and running with this. I should note this isn't the only way to set up Naden on render and we've also glossed over a
fair number of like the configuration options that you have. If you want to check out some of those configuration options, feel free to check um the Nad Docker page, there are variety that allow you to like switch the database that you're using by modifying environment variables and changing basically a bunch of things related to encrypting and and so on and so forth. If you also look up the NAN community environment variables and just pump that into Google, you'll find a bunch of different settings that people use to optimize their NAND installs. Um, but that's just
beyond the course of this video. The second simplest way to set up NADN in a self-hosted environment is using Railway. Now, for those of you that don't know, Railway is very similar to Render in that it allows you to very quickly and easily spin up servers and spin up databases for those servers. But our signup here is going to be a little bit different to what we were doing before. We're actually going to have to continue with GitHub. For those of you that are unaware, GitHub is a way to host your code or repositories that
you've worked on. Uh, make a long story short, all you need to do to make sure that this method works is spin up a GitHub profile. on. I believe you have to add some authentication. So, github.com. Let me just open this in an incognito tab. There you guys can see what it'll look like when you do not have an account. Then click sign up over here. Add your credentials as necessary in order to get that account up and running. Then all you have to do is go back and authorize your rail railway app. This will
give you $5 in free trial credits as of the time of this recording. And now we have an account here that I just have to accept a bunch of terms for. Then move on to deploy a template. The one you're going to want to click is n with workers. It's currently the most popular one um on the platform. Then just type in deploy. And basically what's going on now is we're using our $5 in free trial credit to spin up an NN instance with workers which are just a little addition and I believe it's a
postcre database with Reus Reddus. I don't really know how you pronounce that. But the specifics of the implementation aren't super under aren't necessary to know or understand until you actually get up and running with NN. So the purpose of this is just to make sure that you you have an NN self-hosted instance. We can actually access it using um a public URL. So let's queue up some Jeopardy music and let's see how things go. At a certain point, you'll get a page that looks something like this. All of these will turn green. This is the
actual deployment process and it'll say it's applying a bunch of changes. You'll get updates in the right hand column here that show you that various deployments were done. So in my case, it started with Reus, then it went to Postgres, and it's kind of working its way backwards over to the primary and add an instance before finishing off with the worker. Eventually, all of these nodes will have green little check marks associated with them. And all I have to do is go back to primary, then give this URL a click. It'll open up your NAD
instance, same as we had before, and I can go through and I can add all of the information that I want. And because it's a new instance, obviously, it's asking me to go through the onboarding again. And so this is going to happen every time that you set up a new instance. It's going to offer to give me paid features for free forever. Um, and then voila, you know, we're basically good to go. Again, we have our NAND instance up and running. The third simplest way to get NAN up and running in a self-hosted environment
is using Digital Ocean. They have a one-click NAN install template. Very simple, easy, and straightforward. You just type in Digital Ocean into Google, and this will be one of the first hits. I'm going to sign up to an account here from scratch. Show you guys what it looks like. So, just pumping in my email address and my password. I like Digital Ocean's design. Very nice. It's now going to do some bot verification just to make sure that I'm a real human being. And once we are in Digital Ocean, we're going to have to go through
our confirmation sequence. And we have some onboarding that I'm very quickly going to get up and running. And then once we're here, you do have to enter in some payment details. So, in my case, I'm going to enter some payment details just to secure the account. I'm going to do that offscreen, of course. Okay, great. And now we are registered in Digital Ocean. And in order to get all this stuff up and running, it's very, very easy. All I'm going to want to do is go over to the Digital Ocean um I believe it's called
their marketplace or their store. So, go back over here. Let me go. I think it's marketplace. There we go. And what we want to do is we want to click on or search for N8N. be a one-click install. All we're going to do is create an NN droplet. It's now going to connect back to our account. We can select the specific server area we want. Um, just select whatever is closest to you. It should automatically do this. And then it should automatically select an Ubuntu version. In my case, it's 22.04 on the marketplace. I'm just
going to use the basic plan. Um, it's going to try and like get you up to the the peak. Um, but I'm just going to go down to regular. And then I'm going to go down to six bucks a month or 9 cents an hour. Actually, 9 cents an hour, I should say. Now, you're going to have to create a root password. So, I'm going to do this here. Looks like it needs to be a little bit longer. H. Uh, one uppercase letter. O man, this is tough. Oh jeez. Uh, why don't we just go
to Okay, that's rough. So, I'm totally going to forget that. So, y three. That sounds good. Paste that puppy in there. I'm going to store it very securely on YouTube where everybody could see it. And then we're going toh create the droplet. Now, this is going to do the whole deploy procedure similar to like how we, you know, what we've seen before. very same idea. It's just going to obiscate or obscure some of that data from Digital Ocean. I find it's just a little bit less I don't know, they put that stuff a little less
front and center. Um it's also an older platform versus something like Railway or Render, which is focused a lot more on uh obviously, you know, user experience and being modern and stuff like that. So, we're going to give it a few minutes and let it finish. Okay. And then your droplet should be up and running. The issue in Digital Ocean and the reason why this is like third instead of first is because you can't just access it via the IPv4, the IP address. Paste it in, you'll have some some issue. It will refuse to connect.
So, we have to do instead is you have to actually add this to a domain um using DNS. What I'll show you guys how to do here is on my own leftclick.io. I go to advanced DNS here. Then add an A record. The host is going to be NAD. The IP address is going to be this. And I'm just going to try and do this as quickly as possible. So click 1 minute. What this is going to do is it's going to provide me a publicly accessible URL at nadn my domain name.ai that routes to
this address here. So if you don't have this um you're going to have an error every time you try and access the IP the IPv4 which is the IP address. So I'm going to give it a minute and then I'm going to access n.click.ai. After that all we need to do is go to console here. Give that a click. It'll open up this window, which looks pretty scary, make you feel like a computer hacker. All you have to do is press enter, enter in the domain name. Enter in whatever the email address you want to
use for their encryption protocol is, and then um I'm just going to not set up a time zone. It's actually going to go through and run some additional configuration options for us. So, here it is. It's now building this out. Once you're done, it'll say installation complete. Access your new edit end server in a browser to continue at this address. So, I'm going to copy that over. Go back here. Open up a new tab. And as you can see, we now have the owner account screen. Same as we had before. We can set it up.
It's going to ask us some onboarding info. And voila, you can now go in and then, you know, muck around in our canvas. Again, the fourth way to set up Naden in a self-hosted environment is using Heroku. Now, if you just Google Heroku, spelled H E R O K U, you'll get to a website like this. Heroku is definitely a lot older of a platform. You can see they have some updates that are coming. So, maybe that has changed as of the time of this recording, but we will type in N Heroku. What you want
is you want this GitHub repo here or a GitHub repo that looks something like it. Now, GitHub actually has a native deploy to Heroku button. So, what you can actually do is you just click this button and then it'll deploy it to Heroku. They've done some updates over the course of the last 3 months. I should note that every time we're doing this, we're getting slightly different versions of NAND and stuff, but you click on that button, you'll then be taken to Heroku where you can log in to an account, which I have yet to
do. So, I'm actually sign up to an account. That's what I'm doing here. Uh, no company. So, enter your email again. And I am in the United States. Let's say Delaware. Now, creating my account. So, we're going to check my email like I did a moment ago. Okay, now we have to add a bunch more info. Um, and it looks like you have to make your password super long. Okay, now we have to enter some uh two-factor authentication. I don't really know what I want to do here. Um, one time authenticator. Yeah, that's probably what
I'm going to do. I then have to go and download an app called Authenticator from the um Google Play Store or the Apple Store. The way that this works is it'll basically just generate a code based off of the current date and time multiplied by some secret key thing that Heroku has installed. Then what it'll allow you to do is you're actually going to be able to scan it using something that looks just like this. And basically you put in your little QR code in that in that center area here, which is what I'm doing.
And it's just given me a verification code that I can now pump in, which will be this. There are multiple different authenticator apps. You could use whichever one floats your boat. I like using the Google authenticator one. Just simpler and easier for me. Okay, now we have some more onboarding questions just to go through when this puppy finally loads. That is, am I doiciled in Italy? No. Awesome. Okay, great. So now once we're signed in, we can go back to that N8 Heroku GitHub install. Click deploy to Heroku and it'll actually just do that oneclick
deploy for us. going to call this nadnick common runtime and I'm going to dismiss this. And then the only things that we have to do is are we have to change the encryption key. So we have to change it to whatever the heck we want. I'm going to do um I don't know Nick is super awesome and jacked. All true. Um and then the app name is going to be the Heroku application name which is naden Nick. So naden-nick. Cool. and we click deploy. Beautiful. As this is a one-click deploy, all of the configuration settings
are just up on their own. So, as you can see, there's some config variables here. These are the same things the environment variables and render um and then railway that we saw earlier. But I'm just going to let it play and we'll see what happens. Great. You're going to get a bunch of green check marks as per usual. And then we're just going to go view. Now, because we don't have um like HTTPS installed basically and Heroku, which is a little bit behind on this stuff, you're probably going to get a dangerous site. What you're
going to want to do is you're going to want to go visit this unsafe site down here. It'll actually take you to the page. And as you can see, there's no real difference in the uh that's okay. There's no real difference in um any of the the safety here. Um it's just like it's your own website. They're just lacking the protocol that we'd be interested in. So yeah. Um voila. We are now on our website. We're going to go software business owner, myself, um less than 20 people, and then Google as per usual. And we
got some paid features. And then voila, we can now start from scratch all over again with our naden install self-host number four. The next way to selfhost naden is actually just do it on your own computer using Docker. Uh you can do so on like your laptop or maybe you have some server rack or something like that. I don't necessarily recommend this unless you know what you are doing, but I'm putting it in here just for completeness sake. What you're going to want to do is just head over to docker.com. It'll allow you to download
the Docker desktop version. Now I have an Apple Silicon Mac, so I'm going to give this a click. This is then going to go through the download process. Once I'm done with that, I have my docker.d image. Again, this is going to be different if you're running a um I don't know, like a Mac or a PC or something. Make sure to download the right one for your version. In my case, I'm copying this over to the applications folder, which takes its sweet ass time. Then after that, you can just search for Docker, whatever way
that you are currently interacting with your FileFinder. That's how I do mine. It'll verify the package. Yes, I want to open the package. That is why I doubleclicked it. And then uh you can accept and then use these advanced settings. My case, I need to enter my password to do so. Okay, great. So, um you can sign in, you know, through go through the whole rigomeroll if you want to like creating an account and stuff. I'm just going to skip all this. And what you want is up up here where it says search, you're just
going on paste in not that um just look for NAD. So naden io/naden is right over here. So what you're going to want to do is you're going to want to click pull. That'll go through setting this up on your own computer basically. And once you've pulled it, you're going to want to run it. Now I should note that you can do this through terminal as well. You don't need to necessarily do this just through like the Docker desktop. Docker desktop's just a much easier way of getting up and running with this. And then you're
actually going to want to instantiate this by clicking run. And when you do so, it'll ask you for some optional settings. I'm going to do 5678 right over here. Volumes, host path, environment variables. I'm just going to leave that as is. And I'll just do n-nick. Going to give that a run. And you'll see that, you know, my computer's a lot faster than a lot of the other ones we've been using. So, it's already done with the deploy. If you click 5678, you'll now be at localhost 5678. Which is again my own server. And now
I'm actually running n directly on my computer. So, because I have way more server resources than, you know, most of these ones that I could rent out realistically, I bought like one of the swankier MacBooks. Um, you know, everything here is going to run way, way faster than, you know, if I were to do so using some sort of cloud instance. You also need to keep in mind I'm not um I don't have to send and receive data. It's actually just all locally here. I could see this making sense for people that want to play
around with like higherend applications. Just keep in mind that this does complicate the process quite a bit because now, you know, your web hook urls are all local. Now, if you want to um find a way to expose, right, if I go back here, if I type web web hook, but you'll see that we can't currently access this. So, if you want to, I'm actually going to go back to my docker container. I'll stop it. If I click delete here, so we're going to want to find the nio this one. Uh we can pull it
if we want, but in my case, I'm going to click run. What I want is I want to set the web hook URL to this. And then the host port I'm just going to leave at 5678. We'll call this NAN-IK again. So now when I run this after it uh gets up and running I'll have access to my local host setup again. So let me just go through the rigomearroll of the signup. And now if I I need to find a way to automate this just given how many times I'm signing up to all these.
No thank you. Now if I start from scratch and I add a web hook URL, what you'll see here is it automatically puts in um this address. Now this still isn't enough to make it accessible. But what we need to do is we need to find a way to pass in requests from naden-nick.leclick.ai to our local NAD instance. And that specific thing is beyond the purpose of this tutorial. Essentially, what you're going to have to do is you're going to have to set up ngx, which is uh basically an HTTP web server that makes it
so that when you send a request over to that address, um it'll automatically forward it over to your local host on your machine. But there's a ton of great documentation written on all this stuff on NAD. Um, feel free to check out configuration environment variables and then if you just type nadnx right over here, it'll show you guys uh well there variety of like answers direct from the founder of nadn himself um that walk you guys through what that process looks like. The last way I'm going to show you on how to set up nad
in a self-hosted environment easily and quickly is using Hostinger. For those of you that are unfamiliar, Hostinger is very similar to the other tools that I mentioned here. Um they just kind of hold your hand through the process a little bit more. So, if you just type in NAND and then Hostinger up here, it'll take you to this page. There's a one-click VPS template, which will get you up and running quickly. Um, these are the prices on a 24-month term, but when you click on it, you'll actually be able to select a uh a smaller
term if you want. So, period 24 months. Let's go down to 1 month here. I'm going to click on continue. It's obviously then going to ask me to create an account and do all my pricing information and stuff, but let's do this one. Okay, good to go. We're now going to click get started. That's going to take us to our H panel. H panel is just like the hosting or panel. And we have a guided setup here. I'm going to choose just the the default options because they walk you through it fair amount. The template
that I'm looking for is NAN. So that's the one that you're going to want to do. It will launch um it will ask you to set up some malware scanning BS. I never do that. And then you do have to set up a root password of some kind. It'll be the same sort of idea as before. That looks pretty good to me. Oh, 12 to 50 characters. Can I just double this up? Yes, I can. We have the VPS host name. We had an SSH key, which I don't really need. It's going to save all
this stuff. All this looks good to me. I'm going to click finish setup, and it's going to run through the process now of setting up my VPS. After that, you'll get a message saying the VPS is ready. We'll click manage VPS here. Um, it's going to obviously ask us some fun stuff. Thank you for the onboarding. Then, we have to do is head to panel access. Click on the login URL and this will take us to our lovely hopefully familiar at this point um NAN signup page and then from there you can proceed through the
onboarding as I've done five times already. Click get started skip the paid features trial and then you are now good to go. We are in the canvas. Perfect. So now you not only know how to put together workflows in Naden and drive real business value but you know how to self-host. we've actually leveled up on the deployment side of things, which is historically very difficult to do. What I'd like to do next is I'd like us to take a step back, zoom out a bit, and then look at naden not isolation anymore, but as one
of many tools that you could choose. And particularly what I'm going to do in this video is compare naden to make.com. These are two sort of competing noode platforms, and I know we haven't talked too much about them up until now, but I think it's important for you to understand the merits because some organizations are going to want one solution, some organizations are going to want another. And especially if you're doing any sort of consulting, you're going to want to know enough of a difference between the two platforms to be able to make strong educated
decisions. Yeah, let's start with module availability. I've also included a winner here. So I think that the winner in module availability is make if we go back to NAND here and then I click on this plus arrow on the right hand side and I type action in an app and I scroll through. Don't get me wrong, there are lots of platforms but I don't know in total maybe a couple hundred, right? These are all the platforms that NN is natively um connected to. Whereas, if we go back over here to make, we click on this
plus button, scroll through, I mean, that's probably to where NAN was. So, I don't have a numeric way of figuring this out, but I'd say make.com is probably at least 15 to 20, maybe 25 times as many platforms. And that's not taking into account community platforms and stuff either, although I don't really know if that's fair considering that NN probably has some community functionality as well. But yeah, I guess the point that I'm making is since Make.com's been around a little bit longer if you're just looking for like direct out of the box connections that
just tend to work, make.com is probably your your better bet. Um, it's definitely substantially more streamlined to get up and running as opposed to you having to make your own API calls or that sort of thing. Okay, the next is JSON and code integration. So, you know, as I mentioned earlier, if we click on label general Q&A, we scroll in a little bit. Message ID, JSON ID. This is pretty interesting because we actually have like code in our no code or low code tool I should say. And the really cool part about it is naden
actually allows you to use JavaScript just natively in any of these fields as long as you um go over here and click expression. So for instance if I just like you know I don't know wanted to do something to this JSON ID. Okay. I wanted to uh check if it starts with the number three or something. Uh like I I can do that. I can I can literally do that. Um, let me check what this actually was. This is a one. If I click one here, you see it just turned to true. Two, false. One,
true. So, I can't understate how crazy this is to me as somebody that, you know, kind of like back in back in the hood, man, like the make.com hood, things were rough out there. We didn't have any JavaScript or anything like that. Uh, we we had to make do with like built-in make.com functions. The second that you sprinkle a little bit of code onto your Note Code platform, like like basically everything becomes possible very very quickly and easily. Um, you know, make doesn't really want to let you do that because obviously if you could just
like do something like this with one little, you know, like a few characters, then how are they going to make their money, right? Like obviously it's uh the simplicity and effectiveness of the no code automation platform in a way is directly opposed to their ability to monetize if it's being built on a per operations basis. So NAN definitely wins. There's no comparable feature in make.com. The only thing that's even somewhat comparable is they uh there's this third party service called customjs and this isn't even like a like makes company like this is some other company
that like built a way to do this. You can actually like add some code yourself in JavaScript but as you see it's nowhere near as dynamic. You don't get any feedback. You don't know when the code was sent or received. Uh you don't have little tool tip windows that pop up. It's just nowhere near as as dynamic. And you actually have to pay another platform in order to run JavaScript inside of make which is hilarious. So, JSON and code integration, N wins hands down. There's no, it's not even close. Um, I could show you, you
know, a bunch of other stuff here. Like, you could literally make your own JavaScript window. You could write as much code as you want here. Um, but I'm not going to cuz I think it's pretty clear who wins that one. Okay, the next up is flow control. N wins flow control. Now, what is flow control? Essentially, you know, earlier I was talking about how this is one of the simpler flows that you could build, right? This is sort of like in one direction. It's unidirectional. You don't have like loop backs and stuff like that. And
it can get pretty complicated with that stuff, but in general, it's it's much more powerful in nuance than anything that make.com could hope to do. Um, a good example of this is just this text classifier. As you see, this Gmail trigger feeds into a text classifier which natively outputs like five different if then statements. Okay, cold outreach, general Q&A, Gumroad notifications, invoices and receipts, unknown. It just automatically does this built-in. If we wanted to do something similar here in make.com with a router, which is the equivalent um function that kind of splits flows up, I
would have to go and add a filter for every route. I have to say, you know, category has to be equal to um you know, cold outreach. I have to label it. And then I have to do that like, you know, six times or however many times I did. Um, so, you know, for one, we we just tend not to have that built-in kind of filtering or or uh what's the term flow functionality. On the other hand, um, I find loops are just a lot better done in N8. Now, I'm not going to show you
an example of a loop here, but you can actually just like natively loop things back into each other in N8. Um, it's kind of crazy to me just to be able to do that to drag the output of one function into the input of another. There is no native way to do this in make. Like I can't can of do that. And the main reason why is they just don't want to like you know over complicate the hell out of the process for you. Um so instead the way that it works is if your previous
module outputs multiple bundles then all um subsequent modules will run for the same number of times or they will run the same number of times that there are bundles in the previous module. If I give you guys a very simple example with a parse JSON module, which is just a way for me to convert um JavaScript object notation into something that's accessible by make.com. If we go array and then I go here and then go one to if I were to run this, what would happen is my first module would run once because I just
outputed an array. I just converted this into make.com's format. So an array was um produced with three elements. I then iterated over this array which basically just means to turn an array of elements into three separate runs. So this is run number one, bundle one, run number two, bundle two, run number three, bundle three. Then it ran this set variable module three times. If I make um the value of this the value I run this again you'll see that I don't really have like a looping feature but we do run the same number of times
as there are bundles in the previous section. What I mean by that is if the input to this is uh one bundle then the output is that same bundle but we didn't just input that one bundle we output three and then three outputs were made simultaneously. Operation three has a value of three. Operation two has a value of two. Operation one has a value of one because that is the value that I extracted from the particular bundle run um from that parse JSON module at the beginning. So without really beating a dead horse at this
point, I'm just going to call it there. But n is is certainly far far better than make.com in flow control. Um they have the ability to filter just like make.com does, but then also have built-in ifs, loop over items. They can merge data from two different data sets. uh they have built-in error handling. It's fantastic. Another thing I want to bring up is testing. If you guys remember earlier when I was attempting to test the NA10 flow, all I did was I pinned an example and then I could actually manually modify the content of that
example here. Then all I needed to do was I just ran the subsequent modules or subsequent nodes rather one by one, right? And it always just used that same input. I can't overstate how valuable it is to have that ability in a noode tool because the alternative is basically make.com where if I want to run something from left to right, I basically need to make an API call to my email server every single time I do that. So there's no caching of data. There's there's nothing that easy. If you wanted to build that in, you'd
actually have to manually do that by using something like a set variable module, setting it to whatever you want. Yeah. And then on all downstream modules having to reference that set variable module for your testing and then anytime that you wanted to switch from staging to production basically you'd have to switch back over and over and over and over again. Um which means you'd have to go through every module and then change the email body variable back to uh you know the text the email text variable over and over and over again. And that's really
annoying. It's also annoying because they kind of charge you a little bit more for it. So not even close and AD's just much better with testing authorizing and connecting. Uh, make wins for sure. Um, I know that I showed you some pretty simple connection flows here where all you needed to do is log into your Gmail, but in reality, Naden's connection flows are substantially harder most of the time. Um, if you wanted to connect, I don't know, like a Google sheet or something. Actually, you know what? Now, you could probably do one click off, right?
Yeah. Okay, I take that back. You can do one click off here. But previously, if you wanted to do um I don't know, something like a Google Drive, you would have to create a credential and then you would have to go and use um you'd basically have to like do a whole API connection, which is obviously extraordinarily intimidating for new users. So like really, you're going to have to go into the Google Cloud Console and get the OOTH redirect URL, the client ID, the client secret, and you have to read super annoying but also very
intimidating documentation on how to do this. you know, honestly, you could screw up and it could take you forever and you could be totally dead-ended. Whereas, if you wanted to do the same thing with make.com, you would just add a, you know, a Google Drive module here. And then the connection to this is literally just again sign in with Google. It's sort of a one-click sort of deal. So, very straightforward. Make.com even despite the fact that they have like 10 times the built-in modules, it's just much much better there. So, make definitely wins uh on
that respect. For web hooks and mail hooks, u make wins as well. It's extraordinarily simple. And this isn't going to make sense unless you have like a um no code background, but it is extraordinarily simple to set up a custom basically event handler in make.com. All you do is you click add, you make new web hook. Let's just do YouTube example. I've had to start writing YouTube example cuz I went through all of my connections a little while ago and there were like 8 million that were just ASDF. I'm just going to say YouTube example
and 8N versus make web hooks. They just give you an address and you can just send a request to this address anytime you want and then something will automatically populate here. It's crazy if you think about it. And NAD, you know, they have an equivalent feature if you go down to web hook, but I find in general um it's just it's just a lot clunkier and it's a lot more annoying to use. The NA web hooks are substantially more annoying to deal with. If you do the wrong request type instead of a get or you
do a post or something like that, they won't just tell you that you did the wrong request type. You'll just be stuck here waiting. uh there's a difference between test URLs and then production URLs which you know is important if you're like a computer programmer or something but the vast majority of nontechnical folks they won't remember to change um the test to the production likewise and then they ask for some sort of like off usually um by default so it's a lot more secure don't get me wrong but if you want to just get up
and running with this stuff make is is definitely superior another issue is uh there's no built-in mail hook feature make basically coined the term mail hook like a lot of people expect this a mail hook is just like a web hook it's just instead of a web hook it's an email address. So if you send an email to this address, like if I go back here and if I were to just make an email, I could actually like have a flow set up that, you know, basically like does something every time you send an email
to this address. Think of the uh possibilities and opportunities here. You could basically instantly, you know, create a system that you CC something and it does something else. It it it adds a record to ClickUp. or if you BCC or something like that, maybe it automatically starts following a user on a social media platform. Like the abilities here for mail integrations particularly are limitless. So if that's something that you're looking to do a lot of, you know, definitely look more towards make AI features. Uh I hope that this is self-explanatory, but um NAN wins hands
down. Uh I know I covered the text classifier here, but the biggest module and probably the most popular one is the AI agent module here. As I mentioned, the really cool part of the AI agent, if I just exit out of this and kind of scroll down, is it even has this inherent chat feature, which is crazy, but uh there's nothing like this in make.com. Make's not even close. You basically have to rebuild the wheel every time you want to do something like this. So, uh you know, when a chat message is received, and you
could even you could chat with the model right here. It will go and it will call a chat model of your choosing. So, open AI chat model. Going to select my credentials. Uh sure, let's do GPT4 mini. Then it'll also talk to a uh memory store that you have which stores five or however many messages you want from your past conversation history. And then depending on that you can choose a tool that you want it to do which is pretty crazy. So uh I don't know this is the the simplest API in the whole wide
world. Um I don't know if I'm actually going to do a tool usage. I'm trying to like find a very simple example. Maybe we'll we'll do the Gmail API and then we're just going to read through Um, let's not send. Let's get maybe get many. We're going to simplify them. And then now we're going to chat with our little AI agent. Hi, how's it going? Our AI agent is already here and ready to help you. What can you do for me? It can retrieve information, do email management, task assistance, and general advice. Like, that's pretty
crazy. Could you retrieve the most recent email from info@leftclick.ai? We're just going to send it a message, ask it to retrieve the most recent email from info leftclick.ai. It's then going to call my little tool and it's going to take a while for that tool to obviously consume and do whatever it is that it needs to do. But then it goes through and it finds the tool in my email inbox just using natural language. And as you can see, I set that up in like 3 seconds, right? So it includes a snippet, includes all the
data and all that stuff. Um, you can make this arbitrarily complicated. I added a single tool here. You could add 500. I mean, you probably shouldn't add 500, but what you can do is you can add five and then one of the other ones you can add is another AI agent which filters some other stuff. Essentially, what you're doing is you're you're making this big decision tree, which is pretty neat. And you can chain together however many of these things that you want. Um, it does start to break down after a certain point. And I
won't say that it's like super business um capable at the moment, but it's very clear that this is going to be the future of the vast majority of businesses. They're just kind of a agents that route decisions and do queries. So yeah, not even close. Nad wins hands down. If you're looking to get more involved in AI agents and that's like kind of the the the next step you want to take, then NAN's the one for you. Sharing and collaborating functionality, Nad also wins on that front. Um, if I just go over here, uh, if
I wanted to share this flow, which, you know, it's kind of two parts. So, let me just delete this Agent. Sorry buddy, you're not taking my job just yet. We click share over here. Sorry, not share. Well, we could we can collaborate with other people in our um workspace very easily with that button. But if we go over here and then we click um download uh you can basically um very quickly and easily download like a blueprint file or a JSON uh which is similar to um what make.com allows you to do. And what this
data is is it's basically like a code representation of all of the modules in your flow along with all the connections and like the positions on the page and all the test data and stuff like that which is obviously pretty neat, right? The benefit to this though is if you think about it um there there's also the ability to import from a URL um which is kind of new. So you can actually import a workflow from a URL. You can remember how earlier we said that there were a bunch of templates. Well this is what's
happening under the background. You can actually just click any one of these workflows and instantly just import it to your um a workspace. You can also copy the template to your clickboard and I can just paste this in and it'll literally just like paste in this huge Lego block like thing. And as you can see, you know, you can get arbitrarily big and complicated with this stuff. I mean, you know, this flow could be, I don't know, it could start here or go all the way down here. There could be 8 million modules involved. Not
that I recommend you build flows that have 8 million modules, but I think you guys see what I'm saying, um, with this copy and paste stuff. Make.com's a lot more annoying, I find, with this. Um, you have to use this little import blueprint thing, and they have to choose a file on your computer. Um, there's nowhere near as big of a template library available. Like, there are templates, don't get me wrong. I just find that the templates are nowhere near as nuanced or as valuable and this is coming from somebody that like actually uses these
to make real money. These are usually just one or two step flows and like yeah they're cool and stuff and that's nice but nowhere near as detailed as like the thriving developer open source community that NAN has unfortunately. So your ability to collaborate is definitely impacted. Hotkeys NAN definitely crushes it with hotkeys. Not just um uh like the the availability of the hotkeys but also the fact that they like teach you everything. If you mouse over stuff, it'll just tell you what hotkey you need to click in order to have it happen. So, top right
hand corner here, I'm mousing over this plus button. It says, "Hey man, quit clicking this button. Next time, just press tab instead." Right? Variety of other examples of this, but yeah, they lend themselves to this little text interface quite a bit, which I like. And uh you know, there aren't very many hotkeys in make.com at all if I'm being honest, aside from just like the built-in ones in your browser. Like, you know, you can tab through fields for sure, but really like that's it. I could just tab through fields. Is there really nothing else? If
I wanted to um copy something, the copy, paste, you know, cut. I mean, like these are all things that are obviously native to my um native to my computer, not really built into make.com. And I consider it such a shame because I think make.com could be so much more easy to use with some hotkeys, but they are really just targeting that total noob demographic, I would say. Um note-taking and documentation, naden wins for sure. Um if I wanted to document a flow in make.com for this, I would have to click on this notes feature. I'd
have to right click on this, go add a note, and I'd say, you know, note about XYZ, then click exit out of this. I' right click this, add a note, note about ABC. Not only is this just not very intuitive, like the only way to see my notes is I have to physically go down here to notes and then give it a click and then and only then will I see it. Not only is this not very intuitive, it's just it's very limited with like what you can do. I mean, sure, you could make this
really long if you wanted to, I guess, but I don't know. There's like no there's no formatting. You can only see it if you click on the button. You have this little arrow. I guess what I'm trying to say is NAD just does a much much better job on notes because remember that template that I just copied and pasted a moment ago. If I copy this again and go back here, like if I paste this puppy in, just look at the way that this is documented, right? You have a variety of different formatting um options
natively accepts markdown, which is just a text formatting method. You can drag and drop these to be visible anywhere you want. There's so much information basically on everything that you can you can like document any flow that you possibly want uh for you or somebody else in your team for instance. So that makes it just a lot easier and clearer to use in general. Okay, let's do the financial comparisons and then at the end I'll talk about which platform I would use if I were in your shoes right now and I were kind of at
the start line of my business versus if I were sort of halfway through. So financial comparison wise um now I think you know how each platform works realistically. Let's now turn to the major topic that is on most people's minds and is honestly the main reason why most people choose one platform or the other. Um, the financials involved. So, how much money could you realistically expect to spend on each platform if you wanted to? What I'm going to do next is I'm going to break costs down below so you guys can make the best decision
for you. To keep things relatively equal across each of these, I'm going to be using a hypothetical example. We just need to run the system that I built 2,500 times per month or a little under 100 times per day. So, 2,500 times per month. I don't know, it's like 80 times a day or something like that. I'm assuming that, you know, you get 80 emails a day. That may seem a little crazy for you, but I guess if you think about it logically, if you're running like a big info ad email or hello ad or
something, 80 emails a day, while on the higher end of the number of emails you might receive, it's actually not that crazy to consider. So, we're going to start by doing a financial breakdown of NAN and then I'm going to do a financial breakdown of make.com as well. If I start with this N8N financial breakdown. Basically, the way that their pricing works is, and I I've clicked monthly on all of these. You can also buy annual plans, and I think the pricing is a little bit different, but not by that much. NAND is absolutely 100%
free if you self-host it. I'm going to cover that in a second, but I just want to make sure that everybody here knows that's like one of the main draws of the the self-hosting feature. Now, I'm going to be comparing this on a cloud hosting to cloud hosting um basis just because doesn't really make sense to compare apples to oranges. Let's compare oranges to oranges to start. If you were to compare oranges to oranges and then go cloud um based hosting for both nand and make.com, here's what it looks like. Um you will pay $24
a month for 2,500 workflow executions and five active workflows. What is a workflow execution? To be clear, a workflow execution is this. One run of this is a workflow execution. So that runs 80 times a day. you're consuming 80 workflow executions a day. You are allowed five active workflows. What is an active workflow? If we go back to personal here, I'm just going to save this flow and exit out and go back to the dashboard. Five would be five systems that are clicked to active. So 1 2 3 4 5. That is all you would
be able to do for $24, which to be honest, pretty crappy. The fact that they limit the number of active workflows you have on the $24 month plan, that's kind of crappy. Um, so not very good there because I mean I can think of a dozen scenarios where well scenarios is a funny word. Uh, I can think of a dozen instances where you could have where you would need substantially more than five to do even like some of the more basic things um in a business. So I really don't like how they limit the number
of active workflows. It's probably like the shittiest part of their pricing model to be honest. But obviously, you know, the self-hosting comes in handy and anytime you're over five, that's typically what people do. So, if we were to run a scenario 2,500 times, you know, obviously this would be under the $24 a month plan because we have one active workflow. That's how much it would cost. $24, I should say, per month. Now, let's chat really quickly about the self-hosting. If you self-host an N workflow, you don't pay them a dime. Your only costs are the
server that you are going to be using to host your NA10 open- source instance. That's it. So, most of the time in practice, a server costs like at the beginning and low end of the range might be 5 to 10 bucks a month. the higher end of the range, you might be spending like 30, 40, 50 bucks a month if you have like a pretty good server. If you want to spend like a couple hundred bucks a month or whatever, you'll have like the best server ever, but you probably don't really need to unless you're
doing something mega enterprise. So, what that means is, you know, you can kind of get away with five bucks a month and theoretically on that five bucks a month, you could like probably scale to over 100,000 workflow executions. So, like that's 40 times what you're getting for €24 a month. You know, there are so many options like there's render, that's one uh service, digital ocean, easy panel. I mean I could throw out like 500 here but yeah you can you can get you know servers and all these for like 5 to 10 bucks a monthish
and then you could run 100,000 uh workflow executions and since a workflow execution in nn is very different from an operation consumption in make like this is pretty huge right if the average make scenario has 10 operations or 10 modules and it run it takes 10 operations every run like theoretically this is like a million operations a month for like five bucks a month so that's what's really attractive to a lot of people that do make.com uh and that's one of the reasons why a lot of people are switching over to NANN. Now, in terms
of scaling, they're not captured in our example. Um, the key point in NN is how affordably it scales. Make.com doesn't really scale very affordably. A single scenario can consume many ops, usually between 5 to 25, I want to say. Um, N8N will only ever count a single workflow on their cloud offering. Additionally, if you're doing self-hosted, you can run an infinite number of workflows for the same or slightly elevated cost per month, which is nothing. So, that's pretty cool. Obviously, um, NAN has, uh, quite a lot of big deck energy there. If you could just
self-host your make thing and just never have to pay them, how great would that be, right? Moving on, let's do a make.com financial breakdown. So, as you see here, there are variety of plans on the monthly side of things. There's a free plan, there's a core plan, a pro plan, themes plan, enterprise plan. I should note that um, you technically don't have like a free plan here for the cloud hosting. It's just the self-hosting. So, technically like make.com is more accessible um, at the lower levels. You can get started for free, right? All right, you
don't actually have to pay a dime, nor do you have to know any computer programming or anything. You can actually get up and running for $0. But generally, if you want to do anything meaningful in a business, you're going to need you're going to need core or up. Um, the good news is core starts at just $1059, so 10,000 ops a month. Pretty simple. When I wrote this, I thought that our scenario would include five modules. I believe it only ended up including four, right? Yeah, it only ended up including four. So, um, this is
actually even less than this. So the logic that I did here with five was I said, you know, if we run this 2,500 times a month, we have five modules which get executed. 5* 2,500 is 12,500. 12,500 would be over the limit of most built-in $10,000 and ops a month plans like core for$1059 or pro for 1882 or teams for uh 3412. So you'd have to upgrade. Um that would then cost $18.82 per month on this plan on 20,000 instead. Um, but you know, because we're doing this for just uh I don't know, four time.
Technically, this fits under the core plan for $1059 a month, which makes a lot more cost- effective than NNN's cloud hosted offer for this example. Uh, this does make it less cost effective than their self-hosted offer still in most cases because you can usually get a server for less than this. Um, and that server would be able to run like 100 times this, right? Now, the issue with make.com, I would say pricing wise, is it just scales really fast. Um, most scenarios are going to include a ton more modules than our little example did with
five or four I should say. And a lot of the time there'll be some sort of looping functionality where you might run the scenario once, but you have 50 bundles. So 50 * 5 or four is instantly 200. And if you run that like more than a few times a day, you basically are like using your entire month's operation budget with just one scenario. So that kind of sucks. Um, yeah, I'm not going to graph it for you guys, but essentially it's like more affordable at the beginning and then it like spikes way up. And
what's interesting, um, depending on how long you guys have been in, you know, the no code business for is this is basically the comparison between Zapier and Make.com. Um, a few years ago, Zapier was kind of the one that was like, you know, scaled way the hell up. And if you were like a pro and you wanted to like get better at this stuff, you'd move over to make. But now that same determination is kind of being made between Make and and N. And it makes sense if you think about it because the market itself
in no code is getting more sophisticated like I don't know five or 10 years ago. I mean how many people were out there developing no code stuff? Fewer, right? But over the course of the last 5 years like some of those people have become really good and the median ground of the market has become reasonably good. So if you're really good or reasonably good, it makes sense that you'd start going towards more developer friendly applications, right? That's just logical. Anyway, which one should you choose? Drum roll, please. This is probably what most people here were
waiting for. Nick, what would you choose if uh you were in my shoes? Let me tell you, it depends. I'd pick uh I'd pick one or the other depending on circumstance. So, as I mentioned before, almost all no code platforms are capable of the same things. If you can do something in make, you can absolutely do it in NAD. It's not just a matter of is this possible? It's a matter of how many steps would be required in order for me to do this? How difficult would this be? Right? So, I I really want to
like prove that to you guys that you can do anything in either one. And that's why I built that same system in both. and we had relatively different approaches for them. Now, a simple answer to the question is make is going to be easier for simpler things. Nad is going to be easier for more complex and operationally intensive, more expensive things. So, if you find yourself doing easier things more often and if you're not very technically competent, you know, it's easier for simple applications. Nad is going to be better for you if you're operationally intensive.
Congratulations. You guys have now made it to the end of the NAND mastery course. You went from somebody that probably had no idea what NAN was or how to put together a workflow to somebody that is now comfortable and confident enough to do this sort of thing regularly while also understanding some of the finer nuances related to data related to some of the nodes that most people don't get stuff like the merge node the split node and then how to um coral those hundreds of NAD functions into something that actually works and hopefully makes money.
After that we covered self-hosting. though you learned how to actually deploy a real live instance of nadent directly from the source code. Then finally we looked at nad not in isolation but as a comparison to make do one of the competing tools right now that a lot of people are also using. At this point you are no longer an NAND beginner. You are an NADN master. You have spent more time on this tool than most people ever would believe it or not in just a few hours. You guys can reference anything in this video using
the bookmarks and using the chapter headings down below. So don't feel like now that you've gone through it, you can never brush up on any of these skills again. I've tried to make this as organized a resource as humanly possible. Now knowledge is not valuable in isolation. So now that you know all of this stuff intellectually, it's time to actually go out there and do something with it. And this is what I think the main gap is between people that understand AI and automation concepts as builders and then people that understand AI and automation concepts
as strategic business people. Now, I'm obviously leaning more towards the latter. Everything that I teach is always in a business context, but to be honest, that's really where no code shines. It's not really great for hobby projects. It's more of a thing to actually drive actionable revenues. So, if you guys like what you've done so far, you guys see potential in potent and maybe wanted to start a business model doing something like this, then join my community, Maker School. It is the simplest, straightest line road map to go from a total beginner who has never
sold any sort of AI automation in their life to an experienced business professional who runs a thriving AI and automation company. Inside you guys are going to find a 90day road map that takes you from a total automation agency beginner to somebody that has their first client guaranteed or your money back. daily accountability and step-by-step guidance where I will legitimately check in with you at least every 24 hours to make sure that you're on the right path. Copy and paste outreach and sales templates that are closing deals right now. A library of proven naden and
make.com workflows and blueprints that you can copy and paste immediately. And coaching calls that I do live with thousands of people where I answer specific questions that you guys ask. Plus, you'll see me there every day. I respond to the bulk of community posts. I record customized videos for all of you. And I'm essentially just a pillar of that community. So, if you guys are serious about making money for yourselves rather than just watching videos on YouTube or a bunch of other people do that, then this is the sign. I'm giving you permission to go
out there and try something new. We'd love to have you. And uh if you do end up joining, definitely say hi. Would love to help coach you through the first few steps of your AI and automation journey. Thank you for completing this course and I earnestly hope to see you inside a maker school and just on my YouTube more generally.