Transcript for:
N8N Mastery Course Summary

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] [email protected] 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 [email protected] 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 [email protected] 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