Full transcript
Introduction
0:00Hey, welcome to the most comprehensive
0:02NADN course on how to go from zero,
0:04somebody that's never used this platform
0:06to hero, a master capable of building
0:08automations for themselves and or
0:10selling stuff like that to clients. I've
0:12scaled my own automation agency at over
0:14$72,000 a month using no code tools like
0:16make and nen. So, the purpose of this
0:18course and any follow-up courses that I
0:20make are all about how to use these
0:22tools for actual business purposes. how
0:24to drive revenue, how to improve
0:26savings, and more or less purposes that
0:28you would actually be building systems
0:29for in the real world, not just hobby
0:31projects. I've made sure to add
0:32timestamps for every section down in the
0:35video. So, if you guys maybe already are
0:37coming to this with a little bit of NAN
0:38knowledge and just want some bits and
0:40pieces, feel free to use that to move
0:41around. And make sure you guys bookmark
0:43this video so you can come back to it
0:44later. Trust me, this is the most
0:46comprehensive resource on NAN that you
0:47will find on YouTube, at least as of the
0:49time of this recording. I've checked.
0:51You guys are going to want to make sure
0:52that you run through this from start to
0:53finish at some point in your NADN
0:55career. So, you might as well have an
0:56easy and simple way to get back to it.
0:58So, let's cover what NAD is, how to get
1:01set up on the platform, and how to build
1:03our very first simple practical
1:05workflow. Okay, now that you guys
1:07understand what the purpose of this
1:08course is, let's actually dive into the
1:10very first module, which is going to be
1:12all about how to get NADN set up for
1:15yourself. how to essentially go from
1:17somebody that's never used this
1:18dashboard or this platform to somebody
1:20that at least is a little bit familiar
1:21with it. I'm going to be basically
1:22putting on your NAN training wheels, if
1:24that makes sense. And we're going to
The n8n basics
1:25start this video by signing up to N8N.
1:27I'm actually going to walk you through
1:28what that process looks like from start
1:30to finish. I'm going to be using their
1:31cloud hosted offering today. The reason
1:33why is it's just a lot easier for total
1:34beginners to get up and running versus
1:36self-hosting. But I want you guys to
1:37know that I'm going to be covering
1:38self-hosting in depth over the course of
1:40the next few weeks. After that, we're
1:42going to do a live hands-on review of
1:44NAND's builder. We're going to cover the
1:45canvas, the workflow, nodes, and then
1:47after that, I'm going to be creating
1:49three simple but effective workflows to
1:51actually have you guys get something on
1:53the page, so to speak. You'll actually
1:54have created three simple workflows
1:56before the end of this video. So, if
1:58that sounds good to you, without further
1:59ado, this is Nadn's website, as we could
2:01see. Secure AI native workflow
2:03automation. Very sexy. I really like
2:05their branding. You can see they worked
2:06with some big freaking names. Adobee is
2:08using NN now. Sendin Blue, Pearson, um,
2:11Splunk. I've never heard of those guys,
2:13but they sound funny. So top right hand
2:15corner, I'm just going to click get
2:16started. And the first thing it's going
2:17to ask me for is my full name. So I'm
2:19going to give it my full name. Then it's
2:21going to ask me for my company email.
2:22I'm going to give it a company email. So
2:24I'm going to ask me for a password. I'm
2:26going to write down example password.
2:28And then for account name, I'm just
2:29going to go nickyou
2:32YouTube.app.ncloud. Keep up with our
2:33constant improvements through our
2:34newsletter. No, thank you. What I have
2:36to do here is just because I'm crazy
2:38with it, sometimes they think that I am
2:40a robot. I need to select a bunch of
2:41images that match a mountain. That kind
2:43of looks like a mountain. That looks
2:44like a mountain. I don't know about
2:45that, but let's see what happens. It is
2:48embarrassing how uh common it is for me
2:50to get these things wrong. Anyway, they
2:52have some little onboarding stuff using
2:53Type Form. I'm not going to harp too
2:55much on that because odds are this will
2:56be different by the time you're looking
2:57at it. And then I'm not going to invite
2:59any team members to my workspace. I
3:01really like their onboarding. They have
3:02fantastic onboarding. They have a little
3:03quick start guide over here on the right
3:05hand side as the workspace starts up. As
3:07you can see, it didn't cost me anything
3:08to like launch said workspace. The cloud
3:10plan gets you up and running like ASAP.
3:13So, despite the fact that onboardings
3:15typically do change and yours might look
3:16a little bit different. As of the time
3:18of this recording, it is pretty dang
3:19sweet. Okay. And now I just received a
3:20notification saying that my workspace is
3:22online. I can click start automating and
3:24we'll actually dive into NAND proper.
3:27They use a little dark mode action which
3:29I really like. So, very clean, very
3:30sleek. As you can see, they
3:31automatically sign you up to a trial.
3:33Um, when you get started, you'll have 14
3:35days in said trial with a,000 executions
3:37total. I'll cover what all that stuff
3:39means in a minute. No big deal. The
3:40terminology of NAN is pretty simple and
3:42straightforward, which I like. So, just
3:44covering the dashboard really quickly,
3:45top to bottom. I'll talk about the
3:46things that are important, the things
3:47that you don't really need to know, you
3:48want to actually use in practice. U let
3:50me just exit out of this little top bar
3:52here. First things first, this button
3:53over here allows you to create. So, you
3:56can create either a workflow and you can
3:57create it in a specific project. So, I
3:59only have one project here called
4:00personal, which is why that's all that
4:01it's giving me. You can also create a
4:02credential. So credentials are how you
4:05connect to various software platforms
4:06and apps in N8N. Uh and then you can
4:08also create a new project. So add a
4:10project button down here. You also have
4:12an add a project button up here. No idea
4:13why they do that, but they do. Um as I
4:15mentioned, things are separated into
4:17projects. We don't have any workflows
4:18here, but when I add one, you'll see
4:19it'll be listed. Then we sort of have
4:21some of the same data here as well. We
4:23have credentials. If I click on those
4:24credentials, I can actually create a
4:26credential up here, too. Nothing magic.
4:28If you're on the cloud hosted offering,
4:29you will have this sexy admin panel. the
4:32purpose of which I have yet to fully
4:33understand. Uh no, the purpose of this
4:35is basically just to monitor your trial.
4:37You can change NAN version versions if
4:39you need to. You can change NAND
4:41versions if you want. You can change the
4:43versions if you need to select your time
4:44zone and you know do some other
4:45settings. In practice, you basically
4:47never really have to change any of this
4:48stuff. So don't sweat it too much. Aside
4:50from that, one of the most powerful and
4:51valuable parts of N8, this little
4:53dashboard, it's actually down here in
4:54the bottom lefthand corner under admin
4:56panel. It's called templates. And this
4:58sets NAN apart from a lot of the other
4:59no code tools that you could choose.
5:01They basically have some of the highest
5:03quality workflow automation templates
5:04publicly available and completely free
5:06to use out there on the internet. This
5:08is the simplest way to get up and
5:10running if you guys don't know how to
5:11build a flow. And after you're done
5:13watching this video, I'd highly
5:14recommend you guys to just bookmark this
5:16and just spend a few minutes scrolling
5:17through clicking on various systems that
5:20you might want to create and just
5:21understanding a little bit more about
5:23how professionals or people that are a
5:24little bit more wellversed within might
5:26put things together. There's a lot of
5:28opportunity here obviously to template
5:30out, you know, big chunks of flows that
5:31you'd otherwise build. And some of these
5:33flows, to be honest, are literally good
5:34enough where you could just click sales
5:36and you could find like one or two of
5:38these flows that like does exactly what
5:40you need before you even had put any
5:42work in. So for instance, if you wanted
5:43to scrape business emails from Google
5:44Maps or the use of any third-party APIs,
5:46that was a system you were tasked to
5:47build maybe as a service or for your own
5:49business, you could literally click on
5:50this button and you could import the
5:52flow. It would take you like 5 seconds.
5:54Not hard at all. And a lot of the time
5:55the developers will document the hell
5:57out of it too. They'll do video
5:58tutorials and and all that stuff. So
6:00yeah, that's probably the most valuable
6:02part of this whole page to be honest,
6:04aside from the workflow creator. But
6:06let's actually dive into the juicy bits
6:08which are obviously what you're here for
6:09by creating a workflow. So that takes us
6:11to the canvas. When you open up a new
6:13workflow, you are sent to this page
6:15where you could see a lot of cool stuff.
6:17This is basically the workbench where
6:19all of your N8N flows are going to be
6:20created. I'm going to walk you through
6:22this top to bottom. Let's start on the
6:23top lefthand corner. This is where you
6:25can name your workflows. So, I'm just
6:26going to name a workflow and I'm going
6:28to call it N8N course. You can see here
6:30you can also add a tag. N uses tags to
6:33organize their workflows in projects
6:35which I'll show you in a moment. But
6:36let's just create a new tag and let's
6:37just call this YouTube. Let's say I'm
6:38going to be creating a big YouTube
6:39tutorial. So, I want to tag everything
6:41here as YouTube if it's if it's part of
6:43my um NAN course. And then over here on
6:47the right hand side, you have the
6:48ability to activate your workflow. You
6:50do need a trigger for that which I'll
6:51cover in a moment. You could share your
6:53workflow here, which means you can add
6:55users to your NAND account and then give
6:56them access to a workflow. Pretty neat.
6:58There's a workflow history or revision
7:01history. If you make a mistake or
7:02something during your NAN flow, you can
7:04just click this button. It'll actually
7:05restore the version of the workflow that
7:07you want. So, they have very good
7:09persistence. They actually show you it
7:11um live, which a lot of other no code
7:12tools don't. In the top rightand corner,
7:14you have this sort of like click more
7:15button where you have can duplicate a
7:18workflow. So, if I click this button,
7:19it'll actually just like, you know,
7:20create another one. I can download a
7:22workflow. When you download it, you'll
7:24download it into JSON, which is pretty
7:25neat. JavaScript object notation. This
7:27allows you to then send it to anybody
7:28else that you want and then they can
7:30like import it. And speaking of import,
7:32you can import either from a URL. So
7:33there could be like a JSON file hosted
7:35on a URL over here. And then you could
7:36also host it just import it from the
7:38file too. So that NAN course over here,
7:40I could just click that button and then
7:42it would import that workflow that I
7:44just exported. There's also some
7:46settings. Obviously, there are a bunch
7:48of like um I don't want to call these
7:50higher level, but they're sort of like
7:51configuration options with execution
7:53order where there are variety of
7:54different ways that NN used to execute
7:56workflows. There's some error handling
7:58workflows, some some ways to time things
8:01out after a certain amount of time.
8:02We're not going to cover this because in
8:03practice, I find you rarely need to use
8:05this when you're actually building flows
8:06for business purposes. That's ultimately
8:08what the purpose of this whole tutorial
8:10and course is about. But, you know, rest
8:12assured, there's ample documentation on
8:13all this stuff. The really cool part
8:14about Niten is how well documented it
8:16is. It's basically everything that you
8:17could possibly need. I'm not going to
8:19switch to the old canvas. It's just like
8:20a slightly different way that it looks.
8:22Moving forward, this is probably going
8:23to be the predominant mechanism just
8:24because it's so clean and sexy and
8:26useful, which you'll see. Okay. Now,
8:28speaking of the actual canvas itself,
8:30um, if I just scroll around here, I'm
8:32holding my two fingers on my little
8:34touchpad. You could also do this with
8:35like the mouse wheel if you want. I'm
8:36moving around the canvas, right? You see
8:38these little dots that are equidistant
8:40from one another. Um, this sort of shows
8:41you where you're at. in the bottom
8:43lefthand corner. You'll notice that as I
8:44do that, there's this little white box
8:46sort of in the middle. What this is is
8:48this is sort of like a mini map. I don't
8:49know if you guys have ever played video
8:50games like uh Starcraft or Warcraft or
8:54League of Legends or Call of Duty or
8:56whatever. It's basically the same sort
8:57of thing. You have a mini map here. Um
8:59and you can actually you can drag the
9:01canvas like I'm doing right now or you
9:02can actually just drag the mini map too
9:04which is kind of neat. We can zoom way
9:06out. We can zoom way in. This is sort of
9:07nifty and honestly sometimes I just play
9:09with this for like 10 or 15 minutes at a
9:11time before I remember that I should
9:12probably be building workflows that make
9:14people money. Um so that mini map's kind
9:16of cool. In the bottom lefthand corner
9:17you have a couple of buttons and these
9:18are like quick access easy buttons.
9:20These are just useful when you're
9:21building out workflows. Um if you just
9:23press this button it'll basically just
9:26like fit back to um like I don't know
9:29like it'll it'll zoom out to an
9:31appropriate amount that allows you to
9:32see most of the nodes here. The cool
9:33thing is N makes very heavy use of uh
9:36hotkeys. So if you actually just instead
9:38of clicking this button, just press one,
9:40you'll just snap back. So
9:42one, one, one. Pretty cool. It basically
9:46just centers this box or centers the
9:48average location of all of the boxes
9:50when you have multiple nodes um in the
9:52center of your screen. There's also some
9:54plusing and minusing action going here.
9:56You can press plus to zoom in or you can
9:58press minus to zoom out. In practice, I
10:00don't really use these when I'm building
10:01just because I have my little touchpad
10:03and mouse wheel and I can just do this
10:04and when I do this, my head gets spinny
10:07and it's very fun. You then have um
10:10reset zoom here. So, you can go zero or
10:11one. I don't really use that in practice
10:13if I'm mad zoomed in. And then you have
10:15a little way to report bugs. Um I never
10:17report bugs, granted. Uh I don't know,
10:19maybe we have some white knights here
10:20that want to make the platform better or
10:22something. Okay, the last thing I want
10:23to cover is, and you can't really see it
10:25cuz my giant ass head is in the way, but
10:27in the bottom right hand corner of the
10:28screen, you can click this button to ask
10:30an AI assistant. Says, "Hey Nicholas, I
10:32can answer most questions about building
10:33workflows in NAN for you for specific
10:35tasks. You'll see the ask assistant
10:36button in the UI. How can I help?" And
10:38the reason why I wanted to cover this is
10:39because this has got to be one of the
10:41most useful features in NAND. And this
10:43really sets it apart from the vast
10:44majority of other noode platforms,
10:46especially like make. I think Zapier has
10:47an AI assistant feature now as well.
10:49Because this AI assistant is actually
10:51useful. you can actually use it to sort
10:53of co-build things. Um, it has access to
10:56all of the NAND community forums. So any
10:58post that was basically ever made that
10:59describes a solution to a problem, it
11:01will technically have access to and it
11:02can pull it like with reasonable
11:04accuracy. Uh, and then it's also
11:06integrated into your builder. So it it
11:08has access to the the actual build
11:09itself. Although sometimes you have to
11:11give it a little bit more context about
11:12what it is that you're doing for it to
11:13like really figure it out. Yeah, this AI
11:15assistant, I want to say it's not
11:16perfect, but it covers at least 30 or
11:1940% of all the queries that I have for
11:20NNN. So, my usual debugging workflow,
11:22which you guys will see if we run into a
11:23bug later. Hopefully, we do. Fingers
11:25crossed. Uh, I'm going to use the AI
11:26assistant as sort of a first
11:28pass. Okay, great. So, that's that. Um,
11:31I think we now know everything except
11:32for obviously the big juicy elephant in
11:34the room, which is adding a first step.
11:36If I click on this middle button here,
11:38you'll now see on the left hand side,
11:39we've opened a bunch of options. Um, and
11:42essentially what we're doing when we add
11:43a first step is we're adding a trigger.
11:45A first step of any flow in N8, and it's
11:47always going to be a trigger. And so on
11:49the right hand side we have a variety of
11:50different triggers we could choose from.
11:52We could trigger manually. This runs the
11:54flow by clicking a button in Nadn. Good
11:56for getting started quickly. It is very
11:57good for getting started quickly. And
11:58I'm going to show you our first uh
12:00module or sorry our first workflow is
12:02going to be built like that on app
12:04event. So this runs a flow when
12:05something happens in one of the many
12:07apps that you can connect to non. So if
12:09I click this you can see there's there's
12:10action network active campaign acuity
12:12adalo. Maybe you want to do a trigger
12:14when a new thing gets added to an air
12:16table or when a new project gets added
12:17to a Santa or maybe you want to I don't
12:20know when you receive a new um ClickUp
12:23task or I don't know you get a new Gmail
12:25or something or a new GitHub repo or
12:27ghost post was made. Right? If I scroll
12:29through here there there are a couple of
12:30hundred triggers as of the time of this
12:32recording and NN is always looking to
12:33add more. So the cool thing is you can
12:36very quickly if there's one of the
12:37platforms that are listed here click
12:39this button and then you could say oh
12:40okay um let me see a better example oh
12:44okay you know a new air table event just
12:46occurred and what is the air table event
12:48in particular um I don't know it's going
12:50to be like a a new thing that was added
12:52to a row with a with a specific field
12:54for instance you could very quickly get
12:56an anal integration up and running super
12:58super quickly anyway I don't actually
13:00want to use this so I'm just going to
13:02drag on the canvas And then I'm going to
13:04press delete. And it's going to delete
13:06that module. Sorry, the uh note. If I
13:09right click this, you can see I can also
13:11do a variety of things to this. But the
13:13one that I want in this case is a
13:14delete. So that's what I'm going to do.
13:15And I'll show you how to do all the the
13:17other things that you saw a moment ago
13:18just over the course of building. Okay.
13:21So if I go back to this open nodes panel
13:23in the top rightand corner, you'll see
13:24that there's a hotkey. I can just click
13:25the the tab button instead of doing this
13:27manually. So that's what I'm going to
13:28do. I'm just going to press tab. So
13:29that's what I just did. And it just
13:30opened this up automatically. Um, let's
13:33continue down. Uh, aside from just on
13:35app event, you can also do things on a
13:36schedule. So, you can run a flow every
13:38day, hour, or whatever custom interval
13:39you want, which is pretty neat. So, if I
13:41click this, you can see on the right
13:42hand side here, left hand side here, we
13:44can trigger the interval to be seconds.
13:46I might run this thing every 30 seconds.
13:48I can run this every minute. I could run
13:50this every hour, days, weeks, months.
13:52They also have like a programming um
13:54sort of term here called cron which is
13:56just a specific language setup where you
13:58could write an expression that does
13:59something I don't know every third
14:02Sunday of years that are oddnumbered for
14:04instance. I'm just going to now click
14:07delete. So we can delete that out. Press
14:09tab to open up this right hand side
14:10panel and then continue. You can also do
14:12what's called a web hook call. If you
14:14guys are unfamiliar with web hook calls,
14:16um I'm going to cover it later on in the
14:17course, but essentially the really cool
14:19thing about NN and a lot of other note
14:21platforms, it'll it allows you to set up
14:23your own URL just like this up here,
14:27right? Nick nick
14:29YouTube.app.n.cloud where when anybody
14:31tries to access that URL or sends or
14:33receives data from or to that URL, you
14:36can basically get notified and you can
14:38use that as the the beginning of a
14:39trigger um for one of your flows. And
14:42the benefit to this too is you know how
14:43earlier I showed you guys that and had a
14:45bunch of you know native integrations
14:47about like 200 or something like that
14:48where you could connect with Acuity, you
14:50could do ClickUp, you could do Gmail,
14:51all that stuff. Well, a lot of the time,
14:52especially if it's a new platform, you
14:54don't actually have that native
14:55connection yet. And the benefit of
14:56having web hooks is they allow you to
14:58create that connection yourself. In
15:00these tools, most of the time they'll
15:02have a thing um called like a like a web
15:04hook listener. You can set up your own
15:06web hook listener to be this URL here.
15:08And then NAN can just listen to data
15:10being shuttled to and from those
15:12platforms, which basically in effect
15:14allows you to create an infinite number
15:15of integrations, connect to tens of
15:17thousands of different apps and
15:19ultimately become the automation god
15:20that we both know you want to be. Okay.
15:22Anyway, so I'm going to click that out
15:24and I'll cover all of the uh fields and
15:26everything like that that you saw there
15:27earlier. Next, we have a very nifty one
15:29which we're going to be using today
15:30called the on form submission. If I give
15:33this a click and then I uh add just some
15:35very base details here. Um let's just
15:37say
15:38name. Sorry, let's just do example
15:41form. Enter example data. What's your
15:45name? We'll go Peter. If I click test
15:48this step now, we're actually going to
15:49open up a little form that I could use
15:52to fill data out. And when I submit it,
15:54this basically begins my my flow, which
15:56is really neat. So in practice like in
15:59business flows you don't usually use
16:00this too much but I'm going to show you
16:01a simple um workflow that we can build
16:03today that will there's also when called
16:05by another workflow. This runs the flow
16:07when called by the execute workflow node
16:09from a different workflow. The reason
16:10why this is so valuable is because a lot
16:12of AI flows will use this. So if you
16:13want to learn how to build AI agents and
16:15stuff like that the when called by
16:16another workflow um execute workflow
16:19nodes the the that relationship there is
16:21very common and you'll see me do it a
16:22lot over the course of the rest of this
16:23tutorial. And then there's also on chat
16:25message which is very valuable. So, this
16:27runs a flow when a user sends a chat
16:29message um for use with AI notes. As we
16:31could see, you could ask AI just using a
16:34little chat interface, hey, can you
16:35check my calendar to um I don't know,
16:38double check that I'm not double booked
16:39for for 11:00 a.m. It'll actually go
16:41through um this little chat window
16:43trigger and then use that to begin the
16:44rest of this flow. There a few other
16:46ways. Um you could do an email trigger,
16:49IMAP, error trigger. This one's actually
16:51really nifty and most other no code
16:52tools don't have this. when there's an
16:54error in another workflow, you could
16:56trigger this workflow to do something
16:58with. There are a couple of like
17:00metadata things with NAD where you could
17:03set it up so that when you create
17:04another workflow somewhere in your NAD
17:06project, you trigger a flow when one of
17:09your flows starts or when one of your
17:11workflows is activated, you could do
17:12something. And there also a variety of
17:13actions here. We'll cover actions in a
17:15moment. And then there's this SSE
17:17trigger, which nobody really ever uses
17:18in practice from my understanding, so I
17:20won't sweat it. All right. Awesome. So
17:21that in essence are all of the triggers.
17:23In order for us to check out and learn
17:25some of the actions, we're obviously
17:26going to have to go and create a flow,
17:28right? In order for a flow to be a flow,
17:30it needs a trigger, something that
17:32starts it, and then an action, something
17:33it does. Now that we finished the first
17:34part, let's actually just go and start
17:36building our three workflows so you guys
17:38can see how to actually do things in
17:40NADN. It's one thing to sort of look at
17:42things from a canvas point of view. It's
17:43another thing to actually get in the
17:44weeds, get your hands dirty, start
17:45manipulating fields. Okay, I just jumped
17:47over to my other NAND account which
17:49contains these examples. And I just
17:50wanted to show you one more thing that I
17:52I haven't mentioned yet. You see how
17:54this is now this little like yellow note
17:57um with manual trigger send an email to
17:58someone. We'll start by learning how the
17:59manual trigger works. We'll also cover
18:00creating a brief connection and using
18:02that to send a templated email. This is
18:03just how I'm going to document um a lot
18:05of our work moving forward because it's
18:06very convenient. But what is this? This
18:08is basically a piece of documentation
18:09that you can just insert inside of your
18:11own N8 flows anytime you want. It's very
18:13simple. If you go to the top right hand
18:14corner, just go down a bit. There's a
18:16sticky note which you can do with the
18:18hotkey um shift and then S. So I go
18:20shift S. I just added a bunch of notes.
18:22I'm just going to command Z or control-
18:24Z just to go back. Um but yeah, you can
18:26just add a note anytime you want. And
18:27notes are really cool in because they
18:29allow you just to document things. You
18:30don't just have to use notes when you're
18:31trying to teach or show somebody
18:33something. In fact, my recommendation
18:34I'm just pressing one to center this. My
18:36recommendation is to use notes for
18:38yourself to document workflows for
18:39yourself. um just so that you know let's
18:41say you build a system for a client or
18:43for your own business and it works
18:45really well so you don't have to check
18:45in on it for 6 months but 6 months in
18:47you want to change something well now
18:49you're not like basically having to
18:50relearn the whole workflow now you have
18:52like a note which I don't know documents
18:53or teaches you a little bit about it
18:56okay so the very first system we're
18:57going to build and basically the thing
18:59that is going to allow us to get up and
19:00running to learn how the rest of the uh
19:02N8 end UX works is we're going to start
19:04with a manual trigger and we're just
19:05going to use that to send an email to
19:07somebody why this is valuable is because
19:09it's going to show us how to actually
19:11trigger a workflow like ourselves. We're
19:14also going to learn how to test a
19:15workflow and I'm going to run you
19:16through how the fields in NAN work as
19:18well. We're going to create a brief
19:20connection to my Gmail. Then we're going
19:22to use that to send basically the hello
19:23world example. If I click on this,
19:25actually, let me update that. Basically,
19:28our quote unquote hello
19:31world. Okay, great. So, I'm going to
19:33drag this add a first step over here and
19:35let's actually do it. Let's click add a
19:36first step and let's add this trigger
19:38manually flow. Click that node. Boot
19:42over to the left hand side. And now, as
19:43you can see, we have a node in our
19:45workflow that says when clicking test
19:48workflow. Awesome. I'm now going to
19:50click this plus button. What this
19:52enables us to do is basically do um some
19:54next step. So, what I'm going to do next
19:56is I'm going to add an action. This is
19:57our trigger. Remember, it has this
19:58little um electricity lightning icon
20:01next to it. What I'm going to do is I'm
20:03going to do probably the simplest thing
20:04that you can do in NAN, which is just
20:06send an email. I think most of us are
20:07probably using Gmail at this point. Um,
20:09I'm going to go Gmail over here. And
20:11then what I want is I just want to
20:13scroll down. There's so many message
20:14action. I got a label, delete a message,
20:16get a message, do whatever the hell I
20:17want. But the one that I want is I want
20:19send a message. So I'm going to click
20:21send a message. And two things will
20:22happen. The very first thing that will
20:24happen is we just connected an action to
20:26our trigger node. And so our canvas is
20:28now updated. It has two parts to it,
20:29which I'll show you in a second. The
20:30second thing is we are now faced with
20:32this screen. This is basically, you
20:35know, there's like the bird's eye view
20:37canvas screen where you see all the
20:38nodes laid out, but this is a screen
20:40that pertains to that particular node.
20:42And the really cool part about the way
20:43that NAND lays it out is this Gmail node
20:46which we just added um is sort of in the
20:48middle. On the left hand side here, we
20:49have the input to the node. On the right
20:51hand side, we can see the output of the
20:53node. So N8N and one of the reasons I
20:56love it so much is because it tries to
20:58show everything to you uh linearly and
21:00logically. Everything that comes in to
21:03this node that we added will be coming
21:05in through the left hand side which I
21:07think looks like the right hand side on
21:08my thing. So let's go over here. It'll
21:10come in through the left hand side. Then
21:13it'll hit your node. Your node will do
21:15something with that and then it will
21:17finally proceed uh out the left hand
21:20side as an output. So very simple
21:22conceptually and I can't really
21:24overstate how valuable this is just as
21:26somebody that's worked with like you
21:28know over a dozen no code tools at this
21:29point to have it laid out like this um I
21:31think shows that the team spent a lot of
21:33time and energy figuring out what like
21:34the most ideal UX was for development.
21:37Okay, so I'm going to ignore all of this
21:39input data stuff and and we'll we'll
21:41cover all of that later um just over the
21:43course of building. What we're going to
21:44do now is we're going to click this
21:45credential to connect with. So, I've
21:47already actually already connected my
21:48Gmail account, but I'm going to pretend
21:49like I haven't just because I want you
21:51guys to be able to follow along here.
21:52So, what you have to do is you have to
21:53click create new credential. Now, there
21:55are variety of ways to connect one of
21:57your accounts to NAN. There is OOTH or
22:01OOTH 2 and then there are also service
22:04accounts. I highly recommend anytime
22:06that there's an OOTH or OOTH 2 option
22:09available, you guys go with OOTH 2. To
22:12keep to make a long story short, OOTH 2
22:15just refers to you clicking a button
22:17like sign in with
22:19Google and then you being able to select
22:22an email address with which you can sign
22:24in. All you then have to do is actually
22:27sign into the service. In my case, I'm
22:29already signed into my own Gmail because
22:30I'm using Chrome and it already does
22:32that. Then you click continue and now
22:35you can close this window. It even tells
22:37you how lovely. And you'll see that it
22:40now has connected the account. Basically
22:42meaning that all of the stuff inside of
22:44my Gmail is now accessible to N8 and I
22:46can actually do things with it using
22:48various triggers and actions. So we're
22:50going to exit out of this now. And you
22:52can see that we're now connected to
22:53Gmail account 3. Okay. Next up we have a
22:56couple of fields. We have resource. This
22:58just allows us to choose what thing we
23:00are manipulating. So message label draft
23:02thread. For now we're just going to keep
23:04it as message. You can poke around with
23:05that after you're done this. Then the
23:07operations. So, we can do a ton of
23:08things here. We could add a label,
23:10delete, get many, mark as red, mark as
23:11unread, remove label, reply, send, and
23:14send and wait for approval. Lots of
23:16options here. We're just going to click
23:17send for our hello world example. And
23:18now we get to the juice of it, which is
23:20the two field. So, in my case, I'm going
23:22to be sending this to myself, which is
23:25[Music]
23:27nicholas@gmail.com. And I'm going to be
23:28putting a subject. And you can see it's
23:30already autofilled the hello world. So,
23:32I'm actually just going to go hello
23:34Nick. We have a bunch of email types
23:36here. There's text and HTML. For
23:38simplicity, I'm just going to go with
23:39text, but I want you guys to know that
23:40HTML is a programming language. It
23:42allows you to make your email pretty. If
23:43you guys have ever signed up to like a
23:45newsletter service and there's all these
23:46images and and and you know, banners and
23:49stuff like that. That's because they're
23:50using HTML. So, you can learn how to do
23:52that yourself. And then you can send
23:53stuff like that through NAN pretty
23:55easily. But then finally, we have the
23:57message. So, I'm just going to say,
23:58"Hello,
24:00Nick." And then I'm going to say, "It's
24:03nice to meet you."
24:06Okay, great. And now we've gotten to the
24:08point where the vast majority of this is
24:10done. We do have some extra options down
24:12here. I want you to know that basically
24:13all nodes that you can manipulate will
24:15have some form of extra option. You
24:17don't have to memorize every option for
24:19every node cuz there are hundreds of
24:20nodes. As I mentioned, generally
24:22speaking, there just a couple that are
24:23valuable. I know just off the top of my
24:25head that the Gmail node has one that's
24:28append attribution. Naden will try and
24:32market themselves all the time. So, if
24:33you do not turn this off, they will say
24:36this email was sent by NAND. It's not a
24:38big deal. Most no code platforms do
24:40this, but just make sure you actually
24:41turn it off if you want to use it for
24:42some sort of business use case. Okay.
24:45And then that's that. I'm just going to
24:46head over to my personal email here.
24:48Just open that up just so we could see.
24:50So, you see I have a ton of, you know,
24:53red emails here. And I'm just going to
24:55click test step. I'm now going to send
24:57the email. You can see the lefth hand
24:59side filled out first. It said when
25:00clicking test workflow and I'll cover
25:02that later. But the most important thing
25:04is this output field has now populated
25:06and we see here it's kind of like a
25:07table right with a column called ID
25:10another one called thread ID and then
25:11finally label ids. So any time that you
25:15send or receive data in NAD from one
25:18node to the next you're generally
25:19speaking going to have some sort of
25:21object that is created as a result. This
25:24data object um can take a number of
25:25forms and then it can visualize in a
25:27number of forms. The way that they do by
25:29default for this type of data is they do
25:31table view which is where it's separated
25:32kind of into columns like this. There's
25:34also JSON. This is JavaScript object
25:36notation. This is what a lot of
25:38programmers and people that are a little
25:39bit more familiar with no code are going
25:40to prefer because this is just a
25:42standard convention JavaScript object
25:44notation. They know what the brackets
25:46mean and I don't know instead of it
25:47being kind of left to right like this
25:49which can be squished, it's sort of top
25:50to bottom instead. There's also schema.
25:53This is generally what I find most
25:54people in NAND prefer. They prefer
25:56schema views. Schema views are great.
25:58They're sort of like JSON. It's just
26:00instead of them being written in code,
26:02it's just sort of a little bit cuter and
26:03it's wrapped in like little bubbles and
26:05stuff. So this data is the same as this
26:07data and this data is the same as this
26:09data. They're all just different ways of
26:10showcasing um what the information looks
26:12like to you. I should also note that you
26:15can search the output which is cool. And
26:16a lot of people, even seasoned
26:18professionals at NA, they like have
26:19never clicked this little search button.
26:21So give it a try. If you um are looking
26:23for a particular filter, let's say the
26:25object that is output is actually huge.
26:26And you'll see you can output a ton of
26:28different parameters here. But you want
26:30to just see if the output contains
26:31something, you can do so very quickly
26:32just using this. Then only that field
26:34will show and then you can very quickly
26:36manipulate that as necessary. Um you can
26:38also do a couple of other things like
26:39pin uh data. Um and I'm going to cover
26:41pinning data later. Uh and then kind of
26:44like one of the neat things you can do
26:45as well is you could actually manipulate
26:46the output data. So you could pretend
26:48like this just output a different ID.
26:50Maybe instead of 1 1949, it was
26:531821 3 or something. The reason why this
26:57is valuable is because it will then
26:58allow you to propagate that data moving
27:00forward. And as you can see, we just
27:01changed that number. It used to be 1
27:021949. Now it's 1823. So when I search
27:051949, we don't have two fields coming
27:06up. We only have one. Right? If I want
27:08to search for the 181, I go 18. There we
27:11go. Okay, great. So that's what happened
27:14in N. But why do we give a crap about
27:15that? We don't. What we care about is
27:17did I receive the email? Okay. And now
27:19you can see we just received that email.
27:21If I give it a click, it now says,
27:22"Hello, comma space Nick with an
27:24exclamation point. Nick leftclick.ai."
27:26That's the connection of the account
27:27that I made. Then it says, "Hello, Nick.
27:29It's nice to meet you." Fantastic.
27:31Amazing. Great. Thank you, NAN, for this
27:33lovely email. Just for shits and gigs.
27:36I'm going to click this append n
27:37attribution just retest it just so you
27:38guys can see what that attribution is
27:40like. Um, but as I mentioned, I I
27:41wouldn't really recommend it for
27:42business purposes. You just got this
27:44little almost email signature that says
27:46it was sent automatically with N8N.
27:48Okay, so I'm just going to turn that
27:49off. And then voila, we're basically
27:50done our first example. This is the
27:51hello world of N8N. Um, if you've made
27:53it to this point, you now literally know
27:55how to set up a simple trigger and a
27:56simple action. You can do a lot of stuff
27:58with what we've just covered. Honestly,
28:00if you take the tips and sort of the the
28:02workflow here, you can put together
28:04probably like 10% of all workflows at
28:06this point. Um, so as you can see, you
28:08know, it's it's sort of simple to get up
28:09and running as long as you have a couple
28:11of core fundamentals down, as long as
28:13you know what triggers and actions are.
28:14And obviously, um, you know, if you did
28:17not know what you were doing before you
28:18tried to do it, it' be a little bit
28:19tougher. So you have the benefit of my
28:21foresight, but flows in a nutshell are
28:24not really more complicated than this.
28:25You always have some trigger, then you
28:27have some thing that happens, and then
28:28you have the action, which is this
28:29Gmail. So let's kick this puppy up a
28:32notch. Instead of just doing an email,
28:34why don't we do an email, but let's also
28:36add AI. And then instead of a manual
28:37trigger where we just click the thing
28:39and then it runs, why don't we use a
28:40form to begin our workflow instead? So,
28:43the very first thing I'm going to do is
28:44I'm just going to delete this. I'm just
28:46going to scroll down here to form fill a
28:48autoresponder. And what we're going to
28:50want to do as our trigger is instead of
28:53it being trigger manually like we did
28:55before, we're going to go on form
28:56submission. just that I could show you
28:58um how to do things a little bit more um
29:01complicated like things that don't just
29:03rely and yeah, it's going to try and add
29:05it um all the way back up here. So, I
29:06got to go drag it down uh just so we
29:09could see how do you get data in from a
29:12resource that like isn't this canvas.
29:14Instead of us just clicking a button,
29:15let's actually trigger it based off
29:16something. So, the way we're going to do
29:17it is on this on form submission node.
29:20So, I give this a click. Um you'll see
29:22that now there are way more fields and
29:23this can actually be pretty
29:24intimidating. it's the first time that
29:25you've ever mucked around with something
29:26like
29:27this. So, don't worry. It's actually not
29:29that scary. Um, we'll we'll make it
29:31pretty simple. Up at the very top here,
29:33we have some form URLs. There's a test
29:34URL. There's a production URL. Right
29:36now, it's not really worth knowing the
29:38difference between the two. Just know
29:39that this is the URL of your form. So,
29:41you'll be able to send this to somebody.
29:42You'll say, "Hey, um, I'm really excited
29:44to get up and running with you. Thanks
29:46so much for paying the invoice. All you
29:48need to do is fill out the information
29:49on this form and my team will get
29:50started." You use this as an onboarding
29:52form. Next you have an authentication
29:54basic off none. Basically in our case um
29:56this just refers to how you want to
29:59secure the form. In our case we don't
30:00want to secure the form at all. We just
30:02want to use it. Now we need to create a
30:03form title. So maybe let's just go
30:05onboarding form. Form description. This
30:07is an onboarding form for leftclick.
30:10Fill out the fields and our team will
30:13get back to you shortly. As you can tell
30:15I'm building this example. I guess I'm
30:17framing it as an onboarding situation
30:18where you're working with somebody and
30:20you just sign the deal. So, you send
30:22them over a form and that form includes
30:23a bunch of fields with information they
30:25need to fill out in order to get started
30:26with you. So, uh what is your name?
30:29Maybe we'll do the the first one. So,
30:31we'll go first name. Well, I mean, we
30:34should probably already know their first
30:35name if we're on boarding them, but for
30:36the purpose of this example, let's roll
30:37with it. We have a bunch of different
30:39fields we could choose here. We could do
30:41text, text area, password, number, file,
30:44email, drop down list, and date. So,
30:46there's a lot going on, but let's uh
30:47roll with first name first.
30:50The second one, let's do last
30:54name. And let's just use my own
30:56information as placeholders. So I'm
30:57going to do Nick as the first
30:58placeholder, Sarafh as the last
31:00placeholder. Let's make both of these
31:02fields
31:02required. Let's go down here. Let's go
31:05email address. Now, because it's an
31:08email, we can actually choose a specific
31:10type of form field. I'm going to choose
31:13email. The reason why is because I want
31:15to force people to put in a properly
31:16formatted email. If I'm going to use
31:18this flow to send an email to somebody,
31:19obviously I'm going to need to make sure
31:20that email is valid. What if somebody
31:22typed in this instead? Or what if
31:24somebody typed in that instead? Both of
31:26my emails wouldn't go through. It' break
31:27my flow. This sort of pre-planning is
31:29necessary when you're putting together
31:30more complex no um flows because you
31:33just want to make sure that like the
31:34data is correct from the get- go. The
31:36data is uh bad, so will the rest of your
31:38flow. So will be the rest of your flow.
31:40Okay, great. And then let's just ask for
31:42a phone
31:43number. Then down over here, you could
31:45see that we have access to a bunch of
31:46different fields. There's number. You
31:48might immediately think that a number is
31:49the one to go to. Um, I don't think I'm
31:51going to do number for this. Uh, I don't
31:53think there's a a native phone number
31:55formatting field. If we did number, then
31:57that would mean that people wouldn't be
31:58able to put a format in like this, for
32:01instance. So, I kind of want people to
32:03be able to. So, instead, I'm just going
32:05to go text and then I'm just going to
32:06add a placeholder.
32:10And the idea is this is just going to
32:12tell them sort of what sort of format to
32:14use for their number. We're going to go
32:15required. Okay, great. Down here we can
32:18now choose when we want this form to
32:20trigger. So when do we want it to
32:21trigger? When the form is submitted. So
32:23that's what we're going to use. And then
32:24down here we have some other options. We
32:26could choose like a pen nadn
32:27attribution. I'm just going to turn that
32:29off. There's uh button labels. We can
32:31change the button label if you want.
32:33Let's get started. I think the default
32:35one just says a submit. Um, and then
32:37there are a variety of other ones here
32:38which I'm not going to cover right now
32:40because I want to keep things simple and
32:42straightforward. Awesome. So now that we
32:44have this, I'm just going to click test
32:45step. This is going to open up my form.
32:48And you can see this honestly is not a
32:49bad looking form. So I'm going to go
32:51nick surive nick at
32:54leftclick.ai. I'm just going to add
32:56a sort of example e phone number and
32:59then click let's get started. What
33:01happens when I fill this in? If we just
33:04make this a little bit smaller and we
33:06couldn't see this in real time, but what
33:08happened right there was the output
33:09populated. And so now we actually have
33:11all of these fields accessible to us in
33:13our NAN flow. First name, last name,
33:15email address, phone number, submitted
33:17at form mode as well. Form mode uh
33:19wasn't and submitted at. These weren't
33:20fields that were put in by me when I
33:22filled out the form. These are what are
33:24called metadata. And the cool part about
33:26metadata a lot of the time is you can
33:27use this metadata to do something cool
33:29with. So, you know, we could very easily
33:31use this to update a Google sheet or
33:33something with a list of submitted at
33:34dates so that we could always be
33:35tracking and sort of know like which
33:37form entry made it in at which time. We
33:40could distinguish between test and
33:42production workflows. Production being a
33:43live workflow. Anyhoo, so now that we
33:46have access to all this data, what I
33:48want to do just to make my life simpler
33:49is in the top right hand corner, I'm
33:50going to click this little pin button.
33:52The value in pinning the data in n and
33:54this is kind of different from most
33:55other noode platforms. But the value in
33:57pinning the data is by pinning the data
33:59we will have access to that same data on
34:01all nodes that are downstream from the
34:03trigger node or the node that we are
34:05pinning the data from. And this is
34:07valuable because as you'll see naden's
34:09whole testing flow involves you know in
34:11in future nodes or subsequent nodes
34:13testing using data from the previous
34:15node. And if there is no data from the
34:16previous node you are going to have to
34:18fill out that data in order to proceed.
34:20So this is just going to save us a
34:21little step. Now that we've done the
34:23form submission what I want to do is I
34:24want to send this to AI. Okay. So, I'm
34:26going to give this a click and I'm going
34:28to go over here and I'm going to type in
34:31um open
34:33AI. From here, we have a variety of ways
34:36that we can communicate with our AI. I'm
34:38going to scroll down until I get one
34:40called message a model. This is the
34:43simplest um AI module that you AI node
34:46that you guys could possibly use. This
34:49is basically chat GPT. It's just instead
34:51of us using chatgpt on their website,
34:53you know, chat.opa.com, openai.com.
34:55We're basically going to be
34:56communicating with it now through API,
34:57which is way cooler and enables way more
34:59cool use cases. So, credential to
35:02connect with. As you can see, I already
35:03have connected to my own OpenAI account.
35:05I'm going to go to create new credential
35:06just to show you guys how this works.
35:07Now, unfortunately, this is not yet have
35:09an ooth 2 connection. So, that means
35:12that as I mentioned previously, you're
35:13not going to be able just to like give
35:14that click uh give that button a click
35:16and then have it open up the signin with
35:18Google button. Instead, what you're
35:19going to have to do is you're going to
35:20have to add an API key. Your question is
35:22probably Nick, how the hell do I do
35:23this? The good thing is Naden is very
35:25gratuitous and forthcoming with
35:27documentation. So if I didn't know how
35:29to do this, I would actually click on
35:30this button, open docs, go down over
35:32here, and then I would look through to
35:34see how to do this connection. And just
35:36because I want to show you guys, like I
35:38know how to do this connection, but I
35:39want to show you guys if I didn't know
35:40how to do this connection, how I'd
35:42approach it, I would literally follow
35:43the documentation one by one by one. So
35:46to generate your API key, log into your
35:48OpenAI account or create an account. So
35:49I already have an OpenAI account. I'm
35:51just going to go platform.openai.com.
35:52openai.com. That's how you get sort of
35:54like their main API. From here, let's go
35:57back to the docs. Open your API keys
36:01page. As you can see, there's even a
36:02button there. It says API keys. So, I'm
36:05actually just going to go API- keys cuz
36:08that's the link that they just gave me a
36:10moment ago, right? So, I'm going to
36:12paste that in. It's now going to take us
36:14to our API key page. Next up, what does
36:17it say? Create new secret key to create
36:19an API key. optionally naming the key
36:21and then copy your key and add as the
36:22API key 999. That sounds simple. Create
36:24new secret key. YouTube example.
36:27Awesome. I'm then going to create my
36:30secret key. We now have a secret key
36:32that I can copy. So, I'm just going to
36:34go back to NAN and then paste in my API
36:36key. Boy, is that a long API key. Great.
36:38Now, we're going to save. And as you
36:40see, it says credential successfully
36:42created. This credential is currently
36:43private to you. Now, one thing that I
36:45didn't cover when I created the
36:46credential to the Gmail was you can
36:48actually rename these credentials to
36:49make your life a little bit easier. So,
36:50I'm just going to call this
36:52YouTube. So, now I know that this is
36:54like my YouTube example. And obviously,
36:56I could have much better naming
36:58conventions for this stuff, but sue me.
37:00Cool. Connection tested successfully.
37:02We're good to go. We can now exit out of
37:03this. And we have now connected to the
37:05credential um with the API key, meaning
37:07this is now hooked up just like we can
37:09now uh previously we could get all of
37:10our Gmail information in NAND. Now we
37:12can get all of our open eye information
37:14in
37:15NAN. Okay, great. So the variety of
37:18fields here like text, assistant, image,
37:20audio, file, custom API call. I'm just
37:22going to stick with text cuz I just want
37:23to talk to the model over text.
37:25Operation is going to be message a
37:28model. We get to choose from a list.
37:30Now, as of the time of this recording,
37:32the most popular model, just scroll way
37:35down here, is GPT40, this one. But I'll
37:39be honest, these models change pretty
37:40quick. So, by the time that you are
37:41watching this, might be a couple days
37:42after I recorded this, might be a couple
37:44months, the model's probably going to be
37:46different. I would just head on over to
37:47like OpenAI's model page, and then I
37:49just look to see what the current
37:50recommended one is, the flagship model,
37:52for instance. As you see, GBT40 is kind
37:54of like in the driver's seat here. Um,
37:56has a bunch of data on it. Um, and I
37:57just sort of use that to, I guess, guide
37:59me. If you're using another service,
38:01then it won't be in exactly the same
38:02place, but I think you guys get the
38:04idea. Okay, great. Now, we can define
38:05our prompt. You know, when you talk to
38:06CHP and you say, "Hey, I want you to do
38:08this thing." Well, there's actually a
38:10term for what you just did. You prompted
38:13ChatGBT and specifically you did so
38:15using a user prompt. You're the user, so
38:18that makes sense. Basically, the user
38:21prompt is what you want chat GBT or want
38:23in our case GPT40 to do for us. But
38:26there's actually one other prompt that
38:27you don't really get unless you're using
38:29um a no code tool like this. It's called
38:31the system prompt. This is used to set
38:32the model's behavior or context for the
38:34next user message. So, we're going to
38:36click on system first. And the way that
38:38the system prompt works for AI is the
38:40system prompt tells the model how to
38:42identify. So basically I'm saying, hey,
38:44I want you to identify as uh you know
38:47worldclass philosopher. I want you to
38:50identify as a PhD in genomics. I want
38:52you to identify as a helpful intelligent
38:54writing assistant. And however you you
38:56put your system prompt, the better it'll
38:58be at that specific thing more
39:00generally. There's a little bit of
39:01nuance there. I'm not going to go into
39:03it too much, but in my case, I'm just
39:05going to say you're a helpful,
39:06intelligent email writing assistant.
39:08Then I'll go period. So, that's what the
39:10system prompt is. Now, we're going to
39:11click add message. And then the next
39:14prompt I'm going to do is a user prompt.
39:15If I click on roll, though, you'll see
39:17there's also an assistant prompt. This
39:19is pretty interesting. What what you can
39:20do with the assistant prompt is you can
39:21pretend that the assistant has actually
39:23already said something in your chat
39:25chain. If you want it to act a certain
39:27way, you can give it examples of how you
39:28want it to be. Anyway, in my case, I'm
39:30going to do something very simple. user.
39:32Then I'll say your task is to customize
39:35an email using the following
39:38data. Now I'm going to go enter. Enter.
39:41This is going to make this stretch this
39:42out a bit. I'm actually going to open
39:44this up a bit more. Then I'm going to go
39:47um and I'm going to drag this first name
39:48in
39:49here. You see when I drag the first name
39:52in here, something changed. We just went
39:54from fixed to expression. Why did we do
39:57that? Well, basically fixed is almost
39:59always just going to be static text.
40:01Okay, we don't want static text. We
40:03actually want to connect a variable from
40:06a previous node into this OpenAI module
40:09or OpenAI node call. So, I'm going to go
40:12back to expression to show you guys how
40:13this works. All I need to do if you want
40:15to connect the input of the previous
40:17node into the current node is just drag
40:20it and then drop it where you want it.
40:23So now this is
40:25populating the um result is populating
40:28with the actual data from the test. If
40:30we zoom in way here you can actually see
40:31it says result. Your task is to
40:32customize an email using the following
40:34data. Then in green it says Nick. Here
40:36it says curly curly dollar sign JS with
40:40a square bracket. Like this is really
40:42intimidating and scary. Well this is
40:43just the code representation and this is
40:45the actual thing that just got
40:46populated. Okay. So that's how we're
40:49going to do this. I'm going to say first
40:53name and then Nick. Then we're going to
40:56go last name. And I'm just going to go
40:58and drag last name in
41:01here. I'm going to go email address. And
41:05I think I might have just deleted that.
41:06So, let me just do this one more time.
41:08Last name. Beautiful. Email address.
41:12Nick
41:14leftclick.ai. Phone
41:16number. Drag this puppy in here.
41:21Cool. That looks pretty good to me. And
41:23now what we're going to do is I'm going
41:25to click I'm going to leave simplify
41:27output um as
41:29is. Then I'm just going to write my
41:31email template. So I'm going to go down
41:32here and go email
41:34template. Hey
41:37name. Let's go first
41:40name. How are you? Thanks for submitting
41:45your
41:46request, your brief or onboarding form
41:51moment ago. I see here your number is
41:54number. Let's do phone number. I'm just
41:57putting this text in so the AI sort of
41:59like knows what to fill in. If you think
42:01about it, it has the first name over
42:02here. And if you think about it, I could
42:03just fill all this stuff in
42:04procedurally, but I'll show you why I'm
42:05doing this in a second. We're actually
42:06going to like level up the data to make
42:07the customization a lot more valuable.
42:10Um, I see here your phone number is
42:12blank and your email is
42:14email. Could you let me know if I'm
42:17missing anything? Thanks, Nick. Okay,
42:21great. So now what I'm going to do is
42:23remember how we pinned the data before.
42:25All we need to do in order to test the
42:27step now is we just go up here top
42:29rightand corner click test
42:31step. If you test the step is actually
42:34sending this whole thing to AI. And now
42:36we have a bunch of content. It's a
42:38subject welcome to our program back
42:40slashn back slashn. If you guys are
42:43unfamiliar with what the back slashns
42:44mean here, back slashn just means um
42:46like a new line. So this is trying to
42:48write us a whole email and it's doing so
42:49with new line characters instead of new
42:51lines just cuz AI has no real way of
42:53like creating a new line um without
42:55this. So this is basically just a new
42:57line character. Hey Nick, how are you?
42:59Thanks for submitting your onboarding
43:00form a moment ago. I see here your
43:02number is 6045005000 and your email is
43:04nick leftclick.ai. Could you let me know
43:06if I'm missing anything? Thanks, Nick.
43:07That's pretty neat. Why don't we just
43:09pin this
43:10output and why don't we hook this up now
43:12to another email
43:14module. And just to show you guys how
43:17useful it is to know a little bit of
43:19like NAND hotkeys, if you just go back
43:22to the previous email module we had, if
43:23I just hold command and C, same thing as
43:25right clicking and pressing copy. See
43:27the copy to clickboard event just came
43:29down. And I actually just paste this.
43:31And I'm basically now just pasting the
43:33same module I had before. And then I'm
43:35connecting it to the output of the
43:37OpenAI module. And you'll see here this
43:40is now accessible to us as input. The
43:41content is which is pretty cool, right?
43:43I'm noticing actually that this includes
43:44a subject line. I don't like this. So
43:47why don't I go back to AI then I'll just
43:50tell it don't include the subject line.
43:52Let's do that and let's test it. Let's
43:55unpin. Let's test the data. And now that
43:58it doesn't include the subject line,
43:59let's pin it again. Let's go back to our
44:01next module or our next node, I should
44:03say. I keep on using the term module
44:04because I'm big on make.com. It was kind
44:06of the major noode platform I learned
44:08and make.com always uses the term module
44:11for everything that uses the term node
44:13for. Anyway, now I'm going to drag this
44:15content field to the
44:17message and as you can see it's already
44:19populating with the
44:21email. I'm going to say re your
44:24onboarding form and I'm going to test
44:27this. The connection's already set up.
44:30All of the rest of the parameters are
44:31set up. everything set up cuz remember
44:32all we did was we just copied that
44:33module with all of the settings. In
44:35practice, I find I copy modules a lot.
44:37Okay, great. Now going back to my email,
44:38you see we have read your onboarding
44:40forms. I'm going give that a click. Now
44:42it says, "Hey Nick, how are you? Thanks
44:43for submitting your onboarding form a
44:45moment ago. I see here your number is
44:476045000 and your email is Nick
44:49leftclick.ai. Can you let me know if I'm
44:50missing anything? Thanks Nick." The
44:52reason why this is sort of like an AI
44:54example right now is because we actually
44:55just used AI to write this email for us.
44:57But if you think about it, what we've
44:59done so far is we haven't really done
45:00anything that you can't just do by
45:01dragging and dropping the first name
45:03into the email module instead. So next
45:05up, I want to do something that's a
45:06little bit more creative. Uh I want to
45:07do something that paraphrases what a
45:09person said or summarizes it. And in
45:11order for me to do that, I'm going to
45:13have to go in and I'm going to have to
45:14change the way that the form was a
45:15second ago. But anyh who, we've now done
45:17a different hello world example.
45:19Basically, um the hello world example we
45:20just did was instead of a manual trigger
45:22of us just clicking test step, we now
45:24have a form that triggers this. So, let
45:27me make a couple of adjustments to the
45:28flow and then we'll actually run through
45:30the form one final time and we'll see
45:31what it all looks like when we put
45:32things
45:33together. The adjustments I want to make
45:35to this form. I don't just want to ask
45:37for all this
45:38information. I want to ask for let's say
45:42design
45:43preference. I'm going to add a drop-own
45:46item and I'm going to say
45:48sleek. I'm going to say um
45:52minimalistic. I'll say luxurious.
45:55Then over here I'll say
45:58playful. Then I'm going to add another
46:00form field. I'm going to say give us a
46:02brief description of your brand. Or
46:05maybe we'll just say um brand
46:09description. My
46:11brand or maybe we'll do company
46:14description. Leftclick builds growth
46:17systems for B2B agencies and creative
46:20teams, enabling them to scale without
46:24having to manually reach out to
46:26prospects. Let's just do something like
46:28that. We'll make that required. Now,
46:30what's one more thing that I could do
46:32that might be new?
46:34H, we'll ask
46:38it timeline. And we'll say how quickly.
46:42Let's say uh 3 to 6 weeks. There you go.
46:45We'll go required field. Awesome. Okay.
46:47So now I'm going to click test this
46:48step. It's going to overwrite the pin
46:49data, but now it's going to open up our
46:51form and it's going to have way more
46:52information here, right? So I'm going to
46:54go Nick Sarif.
46:57Nickclick.ai. Um design preference. I
47:00want my website to be minimalistic.
47:02Company description. Leftclick. Build
47:04sleek growth systems, high performing
47:07growth
47:09systems for B2B agencies and creative
47:12teams. And the timeline is I want like
47:15one to two weeks. Okay, let's get
47:17started. Awesome. Fantastic. We now have
47:19all the information that we need in the
47:20output panel here. I'm going to pin this
47:22data to make it accessible to subsequent
47:24modules. Now, I'm just going to go in
47:26here and edit the prompt a little bit.
47:28And if you think about it, I don't just
47:29want to edit it with, you know,
47:30information about the the name and stuff
47:32like that. That's not super relevant to
47:33me. What I want to do
47:35instead is your task is to is to
47:38customize an email template using the
47:39following data.
47:41Let's just add in more information here.
47:44Let's go design
47:46preference. Drag this puppy in. I want
47:49to give it more data to do the
47:50customization
47:54with. Down here, I'll go timeline. We'll
47:57go one to two
47:58weeks. Okay, great. And so, basically,
48:01instead of what I had before, just hey,
48:02first name, how are you? Thanks for
48:03submitting your onboarding form a moment
48:06ago. I loved reading about
48:12thing about company. Let's
48:16do let's go paraphrase company
48:19description.
48:22I see
48:23here that you're looking for design
48:30preference a design preference sort of
48:36site and you're looking to have it
48:45done. Would you mind confirming
48:48your number for me one last time? I'm
48:53going to say formatted phone
48:56number. Right. Also, okay. And obviously
49:00they know the email because we're
49:01sending it. Cool. This looks pretty good
49:03to
49:04me. Don't include the subject line.
49:06Let's actually give this thing a go now.
49:08Let's click test step. We're going to
49:10feed all this data in. Let's see what
49:12our email looks like. Hey Nick, how are
49:15you? Thanks for submitting your
49:16onboarding form a moment ago. I loved
49:17reading about how Leftclick built high
49:18performing autonomous growth systems for
49:19B2B agencies and creative teams. I see
49:21here you're looking for a minimalistic
49:22sort of site and you're looking to do it
49:23within one to two weeks. Would you mind
49:24confirming your number for me one last
49:26time?
49:26604700s 5,000. Right. You let me know if
49:29I'm missing anything. Thanks, Nick. So,
49:31basically what we've done is we've um
49:32taken in some of the information here
49:35and then we've paraphrased it. Um I
49:37guess in this case we didn't actually
49:38paraphrase. This looks like an exact one
49:40for one. Hm.
49:48Cool. Okay, great. Let's test this one
49:50more time just to make sure that we got
49:52a personalized but customized thing
49:53that's
49:56paraphrased. Cool. Looks pretty good.
49:59Um, what I'm going to do now is I'm
50:00going to go down to our Gmail
50:03module. Take the data. I'm going to test
50:06it. We've now sent an email and we
50:08should have received another one called
50:10read your onboarding form. This is the
50:12customized email, which looks pretty
50:14nice and sexy. And now that we figured
50:16out how to do this testing one by one by
50:18one, why don't we actually test the
50:19whole thing from start to finish? Okay.
50:21Yeah, let's actually just run this whole
50:22thing. So, I'm going to go down to the
50:25bottom. Instead of us testing the module
50:27one by one, which is where we click on
50:28it and then we click that test step,
50:29we're actually going to test the whole
50:30workflow. So, I'm going to click test
50:32workflow. It's using the pin data. It's
50:35running through. Uh, we don't actually
50:37want to pin the data, so I'm going to
50:38click unpin. Okay, now it's time to test
50:40out this flow. I'm just going to go back
50:42to the form submission and I'm just
50:43going to do a little bit differently to
50:44how we did before. I'm actually going to
50:45copy this form URL myself. Click test
50:48workflow and let me exit out of that.
50:50And I'll show you guys you guys can
50:51actually just test this from anywhere.
50:52I'm just going to go back here, open up
50:54an incognito tab, paste it in, and this
50:56is the same input now, right? So, I
50:58don't know, Nick um Sarah. Uh we'll go
51:01Nick at leftclick.ai. We'll do phone
51:04number. Then design preference
51:06minimalistic company description.
51:08NY's Donuts sells sleek, high-end
51:12donuts with a creative
51:15twirl. We're big on uh I don't know,
51:18let's do our favorites are chocolate and
51:22pink sprinkles or something. Uh timeline
51:24would be like 3 weeks or so. Then I'm
51:28going to click let's get started. It's
51:29now going to submit it. And I just
51:31wanted to show you guys this is like a
51:32live form. Like you can use this
51:33anywhere you want to test this thing.
51:34You don't have to just like click that
51:36button. Um what just happened in the
51:37background was these just went green.
51:38Green means that you know the flow has
51:40now been completed and that node has
51:42been done. So this node completed, this
51:45middle node completed and that last node
51:46completed. That means that if I go back
51:47to uh my page here, I should be able to
51:51see set input. So hey Nick, how are you?
51:53Thanks for submitting your onboarding
51:54for a m ago. I love reading about how
51:55Nick's donuts sell sleek high and donuts
51:56with creative twirl. I see here looking
51:58for a minimalistic sort of site and
51:59you're looking to do it in about 3 weeks
52:00or so. Um you know the data here was
52:02different. We're paraphrasing a fair
52:04amount which is pretty cool. Would you
52:05mind confirming your number for me one
52:06last time? 604500 5,000. Right. Could
52:08you let me know if I'm missing anything?
52:09Thanks, Nick. Very cool. Very cool.
52:12Okay, beautiful. So, that's the uh
52:15second example here with form fill and
52:17some AI autoresponder. Um, worth noting
52:20here that our AI autoresponder sent
52:21something immediately, but you can also
52:23use a delay. Like, hypothetically, if
52:25somebody fills that out, you don't
52:26really want to send it immediately. So,
52:27why don't we just cap this off with like
52:29a quick like 120 second delay to connect
52:33it. Um all we do is we drag we exit um
52:36both of these connections. We drag this
52:38over here and then we drag that over
52:40there. And now basically we have um the
52:42form submission coming through. AI then
52:44figures out what it wants to say. We
52:46wait for 120 seconds and then we send
52:48the Gmail. Pretty neat, right? Cool. So
52:51big fan of that flow. Um you can
52:53manipulate and you know improve that
52:55flow however you want. Obviously this
52:56paraphrasing here was pretty lowle and
52:58weak, but you could do a ton of things.
52:59You could ask it to generate you a list
53:00of questions to ask the onboard for
53:02instance. You could um have it uh I
53:06don't know suggest a bunch of actions
53:08based off of some form fields. There's a
53:10lot that you could do when you want to
53:12make the flow production ready or live.
53:15You'd have to click on production URL.
53:17This would then be the form that you
53:19would use instead of the test one. Then
53:20you'd have to activate your flow by
53:22clicking this button up here in the top
53:23right hand corner. So now basically
53:25anytime that uh the production form URL
53:28is filled out, we will fill out this
53:30flow and then send an email which is
53:32kind of neat, right? Not saying that
53:34this is what you guys should do right
53:36now. I just wanted to show you guys what
53:37that process looks like when you
53:38actually activate a node or workflow.
53:40Okay, great. Now let's use one final
53:42example to show you guys and level this
53:44up a little bit. Show you guys how you
53:45might actually use this in a real
53:46business flow. So maybe instead of an
53:48onboarding form, which is kind of
53:49contrived example here, we instead we
53:50have a calendar booking. What we want to
53:52do is when somebody books on my
53:54calendar, um, I want to reply to them
53:55and I want to make it seem like it's a
53:56personalized reply. Then after that, I
53:58want to add a new row to my CRM where
54:00I'm storing all this data. Okay, so
54:02there are going to be a couple of moving
54:03pieces here. And I'm just going to keep
54:04everything very light, but I'm also
54:06going to walk you through the process
54:07step by step. First of all, I have a
54:09cal.com set up,
54:13nick-leclick/inter, so you can book
54:14internal calls with me if you're on my
54:16team using this calendar. As you can
54:18see, 1:30 p.m. is open. What I want to
54:20happen is when I give this a click, I
54:22basically want to use this to trigger a
54:24flow that immediately sends them over an
54:26email. And it's an email from Nick. It's
54:28an email from me saying, "Hey, you know,
54:30just saw you booked today. Really
54:31looking forward to chatting with you."
54:32It's going to substantially improve the
54:33perceived personalization of this flow.
54:35It's going to make people think that I'm
54:37paying private and and one-on-one
54:38attention to them, which is great. Then
54:40what I want to do is I want to take that
54:41data and I want to use it to fill in a
54:44row inside of my CRM. Now, I'm using a
54:46um thing called ClickUp here for my CRM.
54:48Sorry, wrong account. Let's go over
54:50here. I'm using um a CRM called ClickUp.
54:53ClickUp is a fantastic high- quality CRM
54:55that allows you to do a ton of stuff. Um
54:57but for the purposes of this example,
54:58I'm just going to be filling in this
55:00creative agency template CRM that I set
55:02up a while ago. Basically, what I want
55:04to happen is when somebody fills out the
55:06calendar booking, I want to add them
55:08over here to this meeting booked um
55:10status so that I have their first name,
55:12their last name, their email address,
55:14some other information about them,
55:16company oneliner, maybe some meeting
55:17URLs. Let's actually get to like
55:19business uh flows now because I think
55:22honestly after like an hour, you guys
55:23know more than enough to do it. And let
55:25me show you guys what an actual
55:26automation build for something like
55:27this, an NN would look like. Okay,
55:30great. So the very first thing we have
55:31to do is we just have to set up our
55:34trigger here. So I'm going to go over to
55:36three NAND examples and then I'm going
55:40to just going to remove this on form
55:42submission trigger. The reason why is if
55:44you have um triggers in NAN um when I
55:46test the workflow it's going to test the
55:48the other trigger. So we just need one
55:50trigger per flow. I'm going to go down
55:52here and what I want to trigger is I
55:54just want to see if there's a cal.com
55:56node. Cal.com is the service that I'm
55:58using. There variety of other ones.
55:59There's kalanly as well which I know
56:01many people use very popular but I'm
56:02going to use cal.com and what I want is
56:04my trigger is I want onbooking
56:06created. So I have credentials that I
56:09can add here. What I'm going to do is
56:10I'll go create new credential and then
56:12you can see here I need to find my API
56:14key for um cal.com. There's also a bunch
56:16of docs over here. In my case I know
56:19where my docs are. You can see that I
56:20have YouTube nn example expires in 24
56:23days. I'm just going to delete that.
56:24I'll make a new one. And then I am going
56:25to have it expire just in case my silly
56:28brain forgets to update this. I'll save.
56:31I'm going to copy this. Then I'll go
56:33back here to my API key. I'm just going
56:36to paste that in. The host is
56:37autofilled. It's always api.cal.com. So
56:39don't worry about that. Then I'm going
56:40to click save. This is now going to
56:42successfully create my credentials. I'm
56:43now going to go over here, type YouTube
56:45just to make sure that I I name it right
56:46and everything. I'll save and test it
56:48one more time. Exit out. Okay. So there
56:50variety of events that I could use here.
56:52The one that I'm going to want is called
56:53booking created. But I want you guys to
56:54know you can also trigger a flow like
56:56this when a booking is canceled. You do
56:57it when a booking is rescheduled, when a
56:59meeting is ended even. You also have
57:01some options here um which are a little
57:03bit more advanced. I'm not going to get
57:04into all of them, but essentially these
57:06light is set like metadata and other um
57:08payloads and stuff like that for more
57:10advanced flows where you need to tag
57:11people and know where they're coming
57:12from and that sort of stuff. Anyway, so
57:14what I'm going to do is I'm going to
57:15click test step. When I do, it's now
57:18listening for one of my bookings. So I'm
57:20going to go over here to internal.
57:21Actually, you know what? I think I have
57:22a better one. Um, instead of internal,
57:26don't I have one that's
57:29for discovery calls? That's probably a
57:32little bit better. Yeah, let's do that.
57:34So, I'm going to go in and I'm going to
57:35book a meeting with myself. Uh, I'm
57:37going to pretend my name is Peter
57:39Jackson and my email address is just
57:42going to be my longer email address
57:45here. I'm going to fill my gross monthly
57:46revenue at 20K. And then for additional
57:49notes, I'll say, "I'm a big fan of your
57:52YouTube channel and would love to know
57:55more about how I can grow past 20K."
57:58Then I'm going to click confirm. After I
58:00click confirm, I'm just going to open up
58:02this page again because I want to watch
58:03the event come in live. And as we see,
58:05the event did indeed come in live. We
58:07have a ton of fields here. Trigger
58:08event, created at, booker, URL, type,
58:10title, on and on and on and on. Because
58:12remember at the beginning of this when
58:13we were just getting started with a
58:14simple flow, I was like, sometimes calls
58:16have a lot of fields. Well, this node
58:18output a ton of fields. So, what I'm
58:20going to do just to make sure I don't
58:21lose this is I'm going to pin this. And
58:24then what I want to do is I want to feed
58:26this into a Gmail node. Now, if you guys
58:28remember my previous hack was just going
58:30to the Gmail node, selecting it, command
58:33C, commandV. Very
58:36clean. And then I'm going to go double
58:38click on this. I have all the data
58:40accessible to me. And now instead of
58:42this, I'm just going to say re recent
58:44meeting. And then I'm just going to say,
58:46"Hey,
58:47Peter, instead of just text, why don't I
58:50do an HTML email?" Just to show you guys
58:51what this might look like. If you want
58:53to write an HTML email, a couple things
58:55you have to know. A new lines are this
58:57BR. So, if you want to add two new
59:00lines, you'd go BR BR. Hey, Peter, just
59:03saw you
59:06booked a and let's go
59:09type. Let's drag this over here.
59:13blank
59:15call looking forward to learning more
59:18about you slashthe business. Then I'm
59:21going to say
59:24br Thanks
59:27Brick. So when I send this email via
59:30HTML it'll say hey Peter new line new
59:32line. That'll be two lines. Just saw you
59:35booked at just saw you booked a
59:37discovery call. Looking forward to
59:38learning more about you/the business.
59:40Then it'll go new line, new line. Then
59:42it'll go thanks. Then it'll go new line.
59:44Then it'll go neck. In terms of um you
59:47know what this looks like. Let's see if
59:49we could customize this a little bit
59:50more. Maybe I'll go reming with and then
59:53I'll grab the first name
59:55in. So I say remeating with Peter.
59:58Perfect. Then in terms of the email
1:00:01address I'm going to be sending this to.
1:00:02I'm not going to hardcode this at
1:00:03Nicholas. Now, I'm actually going to
1:00:04enter in Peter's email, which is
1:00:06apparently going to be this value key,
1:00:08which will always say
1:00:10Nicholas@gmail.com with this example.
1:00:13Um, and then I think at this point,
1:00:14we've now filled out everything, right?
1:00:16Send HTML. Yep, looks good. Let's
1:00:18actually test this. Send myself an
1:00:20email. We've now received a um status of
1:00:23send, which is cool. So, you can see
1:00:25I've received two emails. The first was
1:00:27um cal.com letting me know that I've
1:00:29just booked a meeting with Peter. And
1:00:30the second one is the email that I'm
1:00:31supposed to be sending or receiving as
1:00:33Peter. Hey Peter, new line, new line.
1:00:36Just saw you booked a discovery call.
1:00:37Looking forward to learning more about
1:00:38you, the business. New line, new line.
1:00:40Thanks, Nick. That's pretty sweet,
1:00:41right? Looking forward to um that
1:00:44conversation with Peter. But I got to be
1:00:46honest, I think that we could probably
1:00:47customize this a little bit better. I
1:00:48don't really like the way that this is
1:00:50um so small and minimal. So, why don't
1:00:52we do a little bit of like um date
1:00:53customization? You guys see on the lefth
1:00:55hand side here, there's a start time and
1:00:56an end time. Well, this isn't a very
1:00:58particular format. datetime format that
1:01:00we can convert into natural language
1:01:02instead of this. How cool would it be if
1:01:03we could say, "Hey, looking forward to
1:01:04our chat on Tuesday, on Saturday, on
1:01:10Wednesday. See you." And what I'm going
1:01:12to do is I'm going to drag in the start
1:01:14time
1:01:15here. And what you'll find is because of
1:01:17the format of NAD, which can be a little
1:01:20bit intimidating if you're not familiar
1:01:21with it, we have these curly brace curly
1:01:24brace a dollar sign JSON dot and then
1:01:26the variable name start time. Well, the
1:01:28cool thing about Na is if I put a period
1:01:30here, I can actually do a ton of stuff
1:01:32with this. Like I can do a ton of stuff
1:01:34with this. What I want to do is I want
1:01:36to convert this to a date time, then I
1:01:39want to format this. And the way I want
1:01:42to format this is I want to format this
1:01:43as a date. So I don't go DD no M A.
1:01:51Sorry. There's a specific datetime uh
1:01:55formatting key thing here. here. So, I'm
1:01:57going to read the formatting guide
1:01:58really quickly. And we're just going to
1:01:59find out how to say like Monday or
1:02:01Tuesday or
1:02:03something. Okay. See this? So, it's
1:02:05CCCCC looks like. So, that's the token
1:02:07that I'm going to use. Or maybe it's E.
1:02:09I don't know. Let's try both. We'll
1:02:11format as
1:02:13E. Awesome. See you Friday. Perfect. You
1:02:16see how um that we're sort of just like
1:02:17iteratively developing or iteratively
1:02:19editing this. And it ends really cool
1:02:21because it actually shows you the value
1:02:22of the thing that you are currently
1:02:23manipulating down here. So, the purpose
1:02:26of this is not to have me for me to
1:02:28expect you guys to know how to do any of
1:02:29this date uh formatting for now. I just
1:02:31wanted to show you what might be
1:02:32possible with a little bit more complex
1:02:33JavaScript and and JSON formatting down
1:02:35the line. This dot notation is really
1:02:38valuable. It just allows you to very
1:02:39quickly manipulate things. In my case, I
1:02:41called this variable JSON.start time. I
1:02:44then converted it to something called a
1:02:45datetime variable. Then I formatted it
1:02:47as a day of the week and that's why it
1:02:50says Friday. Okay, great. So, now that I
1:02:52have that, let's test this flow.
1:02:55Let's just double check that Friday was
1:02:56formatted well. Everything looks good to
1:02:59me. And now let's move on with that last
1:03:01part of our example, which is going to
1:03:02be taking this and using it to update uh
1:03:04my CRM, which is ClickUp. So, I'm going
1:03:07to give this a click. Give this a click
1:03:09up. And then I'm going to go click up.
1:03:13And what I'm going to do next is I'm
1:03:14going to scroll all the way down to
1:03:17tasks. What I want to do is I want to
1:03:19create a task. Okay, great. Now, we have
1:03:22the ability to choose our credentials.
1:03:23So, if I go to create a new credential,
1:03:25you can see that it asks me to connect
1:03:27my ClickUp account. I'm going to click
1:03:28connect. It'll now say, do you want to
1:03:29connect with NSM? I'll say
1:03:31yes, the window can now be closed.
1:03:35Beautiful. And why don't we do that one
1:03:37more time? We'll call this YouTube.
1:03:39Click
1:03:40save. Awesome. Now, I'm going to exit
1:03:42out of this. And now we have access to
1:03:44the credential for for YouTube for my
1:03:46ClickUp account. So, basically, if you
1:03:47guys remember, what I wanted to do a
1:03:49moment ago was every time a new calendar
1:03:50booking comes in, I want to add a row to
1:03:52this meeting booked um space, and I want
1:03:55to say Peter Smith, person's first name,
1:03:57um status. We don't have the project
1:03:59type or email or company name or
1:04:01anything like that, unfortunately. So,
1:04:02I'm just going to leave most of this
1:04:03out. Why don't we just um hide these
1:04:06columns for
1:04:07now? But I just want to show a proof of
1:04:09concept to show you guys that we can
1:04:10indeed get the data in. And we're going
1:04:12to put the meeting URL here as well,
1:04:13which is going to be
1:04:15nice. And future videos will show you
1:04:17guys how to build CRM like this and
1:04:18connect them um using
1:04:20naden. Okay, awesome. So now let's head
1:04:22back over to this ClickUp module or
1:04:24ClickUp node rather. And uh we'll go
1:04:26operation create. What I want to do is
1:04:27create a task. The team name is NSM.
1:04:30It'll go and it'll find the space name
1:04:31which will be template creative agency.
1:04:34It'll find the folder name which is CRM.
1:04:36The list name will be sales. I know this
1:04:38because if I look on the right hand
1:04:40side, right, this is NSM. This is my
1:04:42template creative agency. This is my CRM
1:04:44folder. This is my sales list. So, I'm
1:04:46just going down top to bottom and
1:04:48connecting them. Then, we'll have a name
1:04:50here, and I'll be able to add the name.
1:04:52Now, what do I want to be the name? The
1:04:54reason why I picked this as an example
1:04:55is because we're going to be
1:04:57manipulating data from a node that's not
1:04:58just the previous node, but it's
1:05:00actually a couple nodes back now. And as
1:05:01you can see, this previous node here,
1:05:03all we have access to are a bunch of
1:05:04Gmail things, right? ID, thread ID,
1:05:06labels, label, ID. If you want to go one
1:05:08step back, what you have to do is you
1:05:09have to open up this cal.com trigger. So
1:05:12basically what we have here is at the
1:05:14very bottom, this is the very first node
1:05:16that we executed, this trigger, this is
1:05:18the second node we executed. The most
1:05:20recent node is always going to be on the
1:05:22top and then every node that's connected
1:05:23to the the previous node. Um it's just
1:05:26going to go lower and lower and lower
1:05:27and lower. So if we had a 20 node flow,
1:05:28for instance, the very first node in our
1:05:30flow would be down here, second would be
1:05:32here, third would be here, working all
1:05:34the way up until the final most recent
1:05:36one or the previous one up at the top.
1:05:38But anyway, now I want to access data
1:05:39from my cal.com trigger. So that is two
1:05:41nodes back. So it's not going to be um
1:05:43you know immediately behind us, but we
1:05:45could still open and access stuff as
1:05:46needed. What I want to do now is the
1:05:49name of this record, if you think about
1:05:50it, I want it to be the first and the
1:05:51last name of the person. I just wanted
1:05:52to say Peter Jackson. So I'm going to go
1:05:54here,
1:05:55Peter. And you'll notice that the syntax
1:05:57here changed pretty substantially, but
1:05:59we'll cover that later. Then I'll go
1:06:00space and then last
1:06:02name. So now it says Peter space
1:06:05Jackson. That's the name of the record.
1:06:07Okay. So, why don't I why don't I do
1:06:10this. Why don't I go back to my Gmail?
1:06:12Let's just pin this. Not that it
1:06:14matters. I'll go over here. What I want
1:06:16to do is I just want to test this step
1:06:18and show you guys what it looks like
1:06:19when something gets updated in my
1:06:20ClickUp. You guys see that Peter Jackson
1:06:23was just added. How cool is that? We've
1:06:24now just bridged the gap and we've added
1:06:26Peter Jackson who was previously inside
1:06:28of NAN whose data we got from click uh
1:06:30from cal.com which is a totally
1:06:32different software platform and we put
1:06:33it in ClickUp. But you'll notice that,
1:06:36you know, a couple things are off here.
1:06:37I want to make the status meeting
1:06:39booked. And then I also want to fill out
1:06:41this meeting URL. So in order to do this
1:06:44with ClickUp, what we have to do is we
1:06:45have to go and we have to fill out
1:06:46what's called a custom fields JSON. This
1:06:48is kind of annoying to do in ClickUp to
1:06:50be honest. Um I wish that there was an
1:06:51easier way to do this. Uh maybe at some
1:06:54point in time ClickUp will provide an
1:06:56easier way to do this through their API,
1:06:57but hey, what are you going to do? So in
1:06:59order to do this what we have to do is
1:07:00we have to go down here to where it says
1:07:03add additional fields rather what we
1:07:07have to do is we have to number one set
1:07:09the status name manually. We have to set
1:07:12it to meeting booked. Okay. And we also
1:07:13have to go over here and add custom
1:07:15fields JSON. Now this is pretty annoying
1:07:17to do unfortunately in um N8N. We have
1:07:21to basically figure out what the ID of
1:07:23the field is before we fill it out. And
1:07:25then in order to do so, we also have to
1:07:27do um use this format with like a square
1:07:29bracket then a space left curly bracket
1:07:32quote ID quote um colon space quote
1:07:36quote then inside of there we'll have
1:07:37the ID. Then we have the value which is
1:07:39the thing we're going to fill it in
1:07:40with. Sometimes you have to do this. I
1:07:42know the ID already. Um so I'm just
1:07:44going to paste that in. And then I'm
1:07:46just going to paste in the rest of this
1:07:47as well for
1:07:49simplicity. In this case um I'm just
1:07:52going to go expression go back here. ID
1:07:55will be this and then the value is going
1:07:58to be the meeting URL. So what I'm going
1:08:00to do is I'll go here. I'll go
1:08:02meeting. Maybe I'll go URL. There you
1:08:05go. Video call URL. I'm going to drag
1:08:07this over here between these two quotes.
1:08:10Okay. So now if you look at the JSON
1:08:13that I'm sending, it is now uh in the
1:08:15right format uh that uh ClickUp is
1:08:17requesting. Don't worry too much about
1:08:19the code aspect of this. I put this in
1:08:20here just to show you guys that like
1:08:22there is some knowledge that will make
1:08:23it a lot easier for you to do specific
1:08:25things that you want to do. For
1:08:26instance, if you didn't know this, it
1:08:27would probably take three or four more
1:08:29nodes in order to get there. And that's
1:08:30okay. Um, everybody needs to start
1:08:32somewhere. But in future videos as we
1:08:34cover all of the different functions and
1:08:36dot notations of NAD. Um, stuff like
1:08:38this sort of just adds fuel to the fire.
1:08:40Okay, great. So now I'm going to test
1:08:41this one more time. We'll go back to
1:08:44ClickUp and we'll see what we just did.
1:08:46We just added Peter Jackson except now
1:08:49we've done so with the status that says
1:08:50meeting book and also with the meeting
1:08:52URL of the call that we're going to
1:08:53have. So in this way we've created a
1:08:55very simple flow that when a new cal.com
1:08:58meeting comes in we reply with an email
1:09:01and then immediately after we log it in
1:09:03our CRM. This sort of thing is crazy
1:09:06effective for small to mediumsiz
1:09:08businesses. A lot of them lack
1:09:10organization and they don't really
1:09:11understand how to do these sorts of
1:09:12connections. Well, the great news is you
1:09:14can now, you know, assuming that you've
1:09:16you've built this out on your own and I
1:09:17highly recommend you build alongside me.
1:09:19You can now do this sort of thing, not
1:09:20just for ClickUp, but for any CRM out
1:09:22there and not just for Cal.com, but for
1:09:24any calendar booking platform out there.
1:09:26At the end of the day, they all they're
1:09:28all more or less the same. Awesome. So,
1:09:30the last thing I'm going to do, I don't
1:09:31call any build done until I test it end
1:09:33to end. So, I'm just going to remove the
1:09:35pin data here.
1:09:37Sorry. You got to go up here, top right
1:09:39hand corner, click unpin, then click
1:09:42unpin. Then what I'm going to do is I'm
1:09:44going to test this workflow from start
1:09:45to finish on actual data. If we double
1:09:48click on this, it's listening for a test
1:09:49event, so we have to actually go fill it
1:09:50out. I'm going to go back to my
1:09:51calendar. Now, I'm just going to make a
1:09:53second test booking at like a slightly
1:09:54different time. Let's open up a tab here
1:09:56and let's do it. Uh, we'll go 2 p.m.
1:09:59This will still be Nick. Well, let's say
1:10:01Sally. Oh, what did I say? Lozen or
1:10:03something. I forgot what her last name
1:10:04was. I think a lozenge is a thing you
1:10:07put in your mouth when you are
1:10:09sick. Okay. Anyway,
1:10:11confirm. This is now going to go through
1:10:13the booking flow. Go on my calendar.
1:10:16Apparently, book me. Uh, and then if we
1:10:18go over here, you'll see we just pulled
1:10:20in the data with Sally Lozenge.
1:10:22Apparently, if we go to our ClickUp,
1:10:24we'll go down here and we'll see Sally
1:10:25Lozen was now put in, which is pretty
1:10:27neat. So, yeah. Um, that's that for our
1:10:30third NN example. And just to cover
1:10:32things, what we did here was we didn't
1:10:34just learn how to use an app trigger
1:10:36like cal.com do an API connection using
1:10:39an API key. You know, send emails and
1:10:42stuff, but we also learned how to
1:10:42reference data a couple of nodes back,
1:10:44which is very important. And ultimately,
1:10:46you know, most of the complex flows that
1:10:47have value will be you referencing data
1:10:49from all over the freaking place, not
1:10:51just the previous node. So, I hope that
1:10:53this makes sense. What I'm going to do
1:10:54is I'm going to save this and I'll make
1:10:56this accessible for you guys to play
1:10:57around with. Note that we do not have
1:10:58the trigger nodes in this. That's okay.
1:11:00You guys now, if you've made it to this
1:11:02point of the video, know everything you
1:11:03need to know to get to the same point.
1:11:04Future videos, as I mentioned, are going
1:11:05to be covering a lot of the more code
1:11:07oriented stuff that I just did here for
1:11:09that last section with the IDs and the
1:11:11JSON and the dot notation in detail,
1:11:13just so you guys can add fuel to the
1:11:15fire and, you know, get a lot more
1:11:16competent with NAN and no code in
1:11:18general. Great work uncovering that
1:11:20first section. You now hopefully
1:11:21understand what NAND is, how to get set
1:11:23up on the platform, and even how to
1:11:25build some simple but useful workflows.
1:11:28But if you guys really want to
1:11:29understand NAND and not just NADN but no
1:11:31code in general, you need a little bit
1:11:32more knowledge in terms of logic data
1:11:35handling and then the ability to
1:11:36manipulate some of the data that we've
1:11:38seen already. That's what this next part
1:11:40is all about. We're going to dive into
Foundational concepts
1:11:41some more foundational concepts to
1:11:43separate maybe the NADN automation
1:11:45entrepreneur who is solely restricted to
1:11:47copying and pasting blueprints from the
1:11:49internet to somebody that can actually
1:11:51build templates of this kind out on
1:11:53their own. Just a quick note before we
1:11:54dive in. If you're serious and want to
1:11:56turn these technical concepts into a
1:11:58real business, definitely check out
1:12:00Maker School. It's my Noode AI
1:12:02automation community with daily
1:12:03accountability that shows you how to
1:12:05take this skill set that we're
1:12:06developing right now and actually put it
1:12:07in front of real customers. I have over
1:12:092,000 members in the community as of
1:12:11right now. We get new wins, thousands of
1:12:14dollars closed every day. And if you
1:12:16guys want the straightest line path
1:12:17between somebody that doesn't understand
1:12:19any of this to somebody that is actively
1:12:20running and managing a successful and
1:12:22thriving AI automation business, there
1:12:24is no better way. Anyway, whatever you
1:12:26do, let's dive into the next part. So,
1:12:28if you guys have seen some of the other
1:12:29videos on my channel, you'll know that I
1:12:30put a very big emphasis on building
1:12:32things practically. I don't really care
1:12:33much for the academic side of things. I
1:12:35prefer we just dive right in and then
1:12:36teach some of these concepts by actually
1:12:38putting nodes together, making workflows
1:12:40that you could sell for business
1:12:41purposes or implement into your own
1:12:42companies. And that's what we're going
1:12:44to be doing today. We can't really get
1:12:45away from doing some of the academic
1:12:47stuff with JSON just because, you know,
1:12:49if you don't know JavaScript object
1:12:50notation, you are going to have to learn
1:12:52some things like types and objects and
1:12:54what variables are and stuff like that.
1:12:55But for the most part, we're going to be
1:12:57learning all of these concepts down here
1:12:59by building two workflows. The first
1:13:01workflow is up here. And essentially
1:13:03what this does is it feeds in a bunch of
1:13:05lead data to artificial
1:13:08intelligence. This is the Google sheet
1:13:10containing four leads with a bunch of
1:13:12information here. So, we're going to
1:13:12feed in this information to AI. Then,
1:13:14what we're going to do is we're going to
1:13:15have AI generate a subject line for an
1:13:18email, an icebreaker for an email, an
1:13:19elevator pitch for an email, a call to
1:13:21action, and then a post script, little
1:13:23PS sign. The idea here is this is a real
1:13:26workflow that people pay me for. And so,
1:13:27these are the ones that I want to I want
1:13:29to start with. Essentially, this will
1:13:30allow you to customize email outreach
1:13:32that it seems as if you've done a lot of
1:13:33research into the person. Uh, which is
1:13:35very very valuable in a business
1:13:36setting. The second workflow is a little
1:13:39bit more peculiar, I guess. There's this
1:13:41service out there called source of
1:13:42sources. It used to be called helper
1:13:43reporter at Haro. Basically, the way
1:13:45that it works is this lovely gentleman
1:13:47here, Peter, will send you uh a bunch of
1:13:49information basically where journalists
1:13:51are looking for professionals in a
1:13:54certain industry to weigh in on some
1:13:57developments and then if you're a
1:13:59professional in the industry and you
1:14:00give the journalist some good info, they
1:14:02can actually tag you and then like use
1:14:03you in an article. It's quick and easy
1:14:05way to basically get listed in a
1:14:06magazine or some very authoritative data
1:14:08source. And what this system does is it
1:14:10basically gets an email like this. Then
1:14:12it pumps in the titles into AI, does
1:14:15some cool processing, and then we
1:14:16actually write a draft of that email as
1:14:18if we were an expert in that field,
1:14:20which all you need to do is just like
1:14:21quickly review, give a once over, edit a
1:14:23little bit, and then send off to
1:14:24journalists. There's another system that
1:14:25I've sold a number of times. And so I
1:14:27want the videos that I create on NAD to
1:14:29be practical in nature. I want them to
1:14:30be on things that you're probably going
1:14:32to be using for business purposes. So
1:14:33these are the two systems that uh we're
1:14:34going to be building. They're cool
1:14:35systems and all, but you know, for the
1:14:37purpose of this video, I kind of want to
1:14:38build them from scratch. So, why don't
1:14:39we just exit out of that puppy? That's
1:14:41the prompt that we're going to be using
1:14:42for AI. And for the rest of this, we'll
1:14:44just get rid of that. Okay. The very
1:14:46first concept I want to cover are fixed
1:14:48fields and expression fields. I'm going
1:14:50to be basically convincing you to just
1:14:51use expressions all the time. And I'm
1:14:52also going to show you how to map
1:14:53different field inputs cuz the last time
1:14:55that we jumped around Nadn, we built a
1:14:57couple of workflows, but I was sort of
1:14:59glancing over a couple of the um like
1:15:00some of the nuance behind fields and
1:15:02stuff like that. So, for the purposes of
1:15:03demonstration, it's going to be pretty
1:15:04easy. We're just going to build the
1:15:06first system out by clicking a button
1:15:08that is going to get a bunch of data
1:15:11from our Google sheet, and then we're
1:15:12just going to pass all of that data in
1:15:14kind of rowby row into AI. Pretty
1:15:16simple, pretty straightforward, but
1:15:17ultimately something that is very useful
1:15:18and you'll find yourself doing quite a
1:15:20bit if you do cold outreach. So, first
1:15:22things first, I'm just going to press
1:15:23tab. That's going to open up this
1:15:24trigger thing on the lefth hand side.
1:15:26And then, you know, if you type trigger
1:15:27here, there'll be if you type trig, I
1:15:29should say, you'll see a ton of options
1:15:31here. Um, you could either do that or
1:15:32you could just scroll down to the bottom
1:15:33where it says add another trigger and
1:15:34then press trigger manually. Either is
1:15:36fine, but for the purposes of demo, I'm
1:15:38just going to do that. And basically
1:15:40what I want to do is the second that I
1:15:42run this trigger when I click on test
1:15:43workflow, um, I want to uh, get all of
1:15:46the rows and all the data in my Google
1:15:48sheet. So, I'm going to go up here to
1:15:49nodes. I'm just going to type in sheet.
1:15:50We're going to get Google Sheets. Now,
1:15:52what I'm going to do is if you scroll
1:15:54down here, you'll see that there's this
1:15:55one node called get rows and sheets.
1:15:58That's what I'm going to click on. Now,
1:15:59I've already done a connection before.
1:16:01Um, what you're going to have to do if
1:16:02you want to connect to your Google
1:16:03Sheets account is go to create new
1:16:05connection. Now, because I'm on the
1:16:06cloud hosted offering, and keep in mind
1:16:08if you're not on the cloud hosted
1:16:09offering, um, these sorts of connections
1:16:10are a little bit more difficult. You
1:16:12have to go to Google Cloud Console and
1:16:13get set up there. But because I'm on the
1:16:15cloud hosted offering, all I need to do
1:16:16is click sign in with Google over here,
1:16:18and I'll actually go connect to my email
1:16:21account, and then it'll create a
1:16:22credential for me, which is pretty
1:16:23handy. So you can see it's saying it's
1:16:26already has some access just because
1:16:27I've already done this connection. But
1:16:28for the purpose of this demo, I just
1:16:29wanted to show you guys what that looks
1:16:31like. And then I'm just going to save
1:16:33this connection here with a name so that
1:16:34it's just nice and organized. Okay. And
1:16:36what we want to do is we just want to
1:16:37grab this Google sheet up here. Right?
1:16:39So in NAN there are variety of ways to
1:16:42do this, but I'm just going to I'm going
1:16:44to be looking for a document. Sorry, a
1:16:46sheet within a document. My bad. The
1:16:48document we're going to want to select
1:16:49is from the list. And we're actually
1:16:50going to go down. We're going to choose
1:16:52this one called leads, comma, space,
1:16:54January 27th, 2025. So, as you can see,
1:16:57we have already manually found that.
1:16:59Okay. And then the specific subshet that
1:17:02we want is this sheet one because I
1:17:04guess that's the only one that we have
1:17:05here. So, I'm just going to click on
1:17:07this. It's going to actually do an API
1:17:08call to Google Sheets. It's going to
1:17:10find that there's only sheet one here.
1:17:11Then I can give it a click and then
1:17:13voila. Let me just run test step and
1:17:15let's see what happens when I click
1:17:17test. Okay, great. So, I've offiscated
1:17:19this data. This data is not um actually
1:17:21one for one whoever this this person is.
1:17:23I've gone through and I've like renamed
1:17:25them and stuff like that just for
1:17:26privacy purposes. But as we see on the
1:17:28right hand side here, we we have a bunch
1:17:29of output and we can see the output in a
1:17:31variety of ways. Tabular JSON schema.
1:17:34Most people and they like the schema
1:17:36look because it just kind of compresses
1:17:37the information nicely. It's a little
1:17:39bit easier for them to see. I'm a little
1:17:40zoomed in here too. Um but uh yeah, you
1:17:43know, normally like you see most of the
1:17:45node variables which is pretty handy.
1:17:48But this JSON one over here, this is
1:17:50really intimidating for a lot of people.
1:17:51And so we're we're going to cover this
1:17:52in detail. I'm going to show you exactly
1:17:53how you read JSON, what all those things
1:17:55mean. But just I just want you guys to
1:17:56know that for the remainder of this
1:17:58course, I'm going to be using primarily
1:17:59the JSON and the schema view. But I'm
1:18:01actually going to tend towards JSON. And
1:18:02the reason why I'm going to be tending
1:18:03towards JSON is because like JSON says
1:18:06all the same stuff that the schema view
1:18:08does anyway. But unfortunately, part of
1:18:10the way you learn JSON is just by kind
1:18:11of staring at it a lot and squinting at
1:18:13it and kind of inherently and
1:18:14intuitively understanding the
1:18:15formatting. If we're going to be looking
1:18:16at outputs all day anyway, we might as
1:18:18well kind of get, you know, kill two
1:18:19birds with one stone. All of the same
1:18:21data in JSON is represented in schema
1:18:23anyway, it's just instead of like the
1:18:25quotes around key names and stuff, you
1:18:26just have sort of this light gray box
1:18:28alongside like a type sign here. So, I
1:18:31guess the point I'm making is we might
1:18:32as well double up and just learn how
1:18:33JSON looks while we're proceeding with
1:18:35the course. Um, and that's why I'm going
1:18:36to be using this. Even if it looks a
1:18:37little bit more intimidating, don't
1:18:38worry too much about it. Okay, so I said
1:18:39that I'd talk about fields, right? So
1:18:41fields in N&M just as I was covering on
1:18:43the previous video are stuff like this
1:18:46right we have this sort of center node
1:18:48config option here for our Google sheets
1:18:50node um you know one of the fields we
1:18:52selected was this YouTube credential to
1:18:55connect with another one was this
1:18:56resource sheet within document operation
1:18:59document sheet but I want you to know
1:19:00that these are actually all
1:19:02representable in code as well so as you
1:19:06see over here we have two different
1:19:07types of fields one's called fixed and
1:19:09the other is called expression
1:19:11So, by default, just to keep your life
1:19:13easy and to not like freak you the hell
1:19:15out, especially if you're like a newbie
1:19:16in NN, um they're going to keep all the
1:19:18fields to the fixed type. But if you
1:19:20click on
1:19:21expression, you'll see that things are
1:19:23now a little bit different. Notice how
1:19:26when I went to fixed, we had like a nice
1:19:29little, you know, it said um leads
1:19:30January 27, 2025. And then when I jump
1:19:32over to expression, now we have some big
1:19:34long ID. So, what is this? Why is it
1:19:37structured that way? And what exactly
1:19:39does any of this mean? Well, if we pay
1:19:41close attention, this ID field here, 1
1:19:44lowerase o t r r r r r r r r r r r r r r
1:19:46r r r r r r r a t4 C capital C and then
1:19:48the rest of this big long ID string over
1:19:50here. If we go to our Google sheet, what
1:19:53you'll see is that that ID string
1:19:55actually matches the URL of our Google
1:19:56sheet
1:19:57exactly. This takes me to a wider point.
1:20:00Most of the time, sorry about that. Most
1:20:02of the time, anytime you're accessing a
1:20:03resource on some API or even just on the
1:20:06internet, they will store the ID of the
1:20:08resource, which is sort of like a hidden
1:20:10representation of it, in the URL. So,
1:20:14you know, one of the examples that I
1:20:15provided the other day was I went over
1:20:16to ClickUp, right? And inside of
1:20:19ClickUp, I like searched around for some
1:20:21record. I'm just going to click on this
1:20:22here. This is this was my old content
1:20:23calendar. Um, how to send 1,000 cold
1:20:26Instagram DMs per day. That was one of
1:20:27the things I wanted to do. This right up
1:20:29here is the ID of the record.
1:20:3386B27A7Zm, right? If I wanted to do
1:20:36something with this through their API,
1:20:37this is the ID of the record that I
1:20:39would be calling. So, I want you to know
1:20:41that like ClickUp, uh, Monday, uh, like
1:20:43even Gmail, basically every service out
1:20:45there, they will store the ID of the
1:20:47thing you want to modify or update or
1:20:49whatever just in the URL. So if ever a
1:20:52field asks for an ID, you can almost
1:20:54always just go to the URL of the thing
1:20:56on the actual user um you know on the
1:20:58actual app like the user interface. Then
1:21:00you can find that URL thing. You just
1:21:02hardcode it in here. Okay. So that's
1:21:04just a just a brief look at some of the
1:21:06differences between fixed and
1:21:08expression. Basically fix a lot of the
1:21:09time just to to keep you guys um to make
1:21:12sure that like we're on the same page
1:21:13here. Fix is just the simpler version.
1:21:16Then expression is sort of what's
1:21:17actually going on under the hood. So,
1:21:19you know, um, NAND just defaults to fix
1:21:21like it just did here because it doesn't
1:21:24really want to scare you away. But in
1:21:25order to really unlock the value of NAN,
1:21:28we have to go to the expression, um,
1:21:30field. And I'm going to show you here
1:21:31why, you know, I basically just use
1:21:32expression for everything at this point.
1:21:35Okay. So, looking at the output here,
1:21:37what we have is we have we clicked and
1:21:39then we got a click event that was
1:21:40counted as one item. And so, N8 actually
1:21:42shows you the number of items that are
1:21:44passed on. Then we pumped that click
1:21:46event into Google Sheets and then that
1:21:48click event outputed four items. So now
1:21:49we actually we're working off of array
1:21:51data or tabular data which I'll cover um
1:21:53in a moment. But essentially with these
1:21:56four items now what we want to do is we
1:21:57want to pass each of these items into
1:21:59artificial intelligence and we want to
1:22:00have AI tell us something about it
1:22:02before um writing some cold email copy
1:22:05for us to insert into an email or maybe
1:22:06we could just send a Gmail directly or
1:22:08something. So what I'm going to do is
1:22:09I'm going to click on this button. I
1:22:11zoom out a little bit. What we want is
1:22:13we want um if you go down advanced AI,
1:22:16we want is we want this open AI node.
1:22:18And specifically what I want is I want
1:22:20the message a model. So if you've seen
1:22:22me connect this in the previous video,
1:22:24you'll notice that you know in order to
1:22:25create a new credential, you actually
1:22:26have to go and you have to find the API
1:22:28key from OpenAI in order to do this.
1:22:30This is pretty simple to do. You just
1:22:31type
1:22:33platform.openai.com/ I think it's like
1:22:35account/appi or something. You'll have
1:22:36to click on this button here to open the
1:22:38documentation to tell you more. But
1:22:40anyway, you can basically just create an
1:22:42API key for N8N. Um, it's very simple
1:22:44and very straightforward to do so. And
1:22:45I've already done this and I've called
1:22:47it YouTube. So, I'm just going to use
1:22:48that credential just so I don't have to
1:22:50like leak another API key. Now, again,
1:22:52we have a ton we have a ton of fields.
1:22:54We have resource text operation message
1:22:56model from list choose. Keep in mind the
1:22:59fields are again fixed, right? It's
1:23:01trying to make it really easy for us to
1:23:02select GPT40. So, I'm just going to go
1:23:04down here, type
1:23:06GPT four, and then I'm just going to
1:23:09click 40 O. And now we actually enter in
1:23:11the text that we're interested in. Okay.
1:23:14And this is really where you're going to
1:23:15start learning the differences between
1:23:17the fixed and the expression. So fixed,
1:23:19again, fixed is just I mean, it's what
1:23:20the name implies. It's fixed. It's text.
1:23:22You can't make this dynamic. You can't
1:23:24add variables to it. It's the simplest
1:23:26way to get up and running with a node,
1:23:28which is why NAND will default to fixed.
1:23:30Um, but over the course of the next few
1:23:31minutes, I'm going to convince you to
1:23:32basically always just use expression.
1:23:35Okay. So, I I saved my prompt somewhere
1:23:37else. The first thing I'm going to do is
1:23:38I'm going to add a system prompt. So,
1:23:39I'm going to go down here to system.
1:23:40I'll just say you are a helpful
1:23:42intelligent writing assistant. Usually,
1:23:44the way that you will do um AI calls is
1:23:46you will have a system prompt first.
1:23:49Then you'll have a user prompt after.
1:23:51And the user prompt is where you
1:23:52actually give it the instructions you
1:23:53want it to do. So, you know, in our
1:23:55case, it's going to be like, hey, I want
1:23:56you to write a bunch of fields that are
1:23:57templates that we're going to insert
1:23:58into a cold email later. And then after
1:23:59you have the choice to provide a bunch
1:24:00of examples. So you could provide an
1:24:01assistant prompt and then you could do
1:24:03another user prompt. Assistant prompt.
1:24:04User prompt. Assistant prompt. You can
1:24:06do that however many times you want just
1:24:07to show it how things work. For the
1:24:09purpose of this example, I'm just going
1:24:10to be providing a single user prompt.
1:24:11And what I'm going to be doing here is
1:24:13I'm just going to copy over my prompt
1:24:15below. Let me paste that in. And let's
1:24:18just read through this together. Your
1:24:20task is to personalize an email. You'll
1:24:22do this by taking as input a prospect
1:24:24LinkedIn profile. Then editing five
1:24:26templates for different sections of the
1:24:28email. Subject line, icebreaker,
1:24:30elevator pitch, call to action, and a PS
1:24:32or postcript field. If you're unfamiliar
1:24:34with postcript, you know, at the bottom
1:24:35of an email, it'll just say PS, I really
1:24:38miss you. Can't wait to see you. That's
1:24:40what a postcript field is. We basically
1:24:42want AI to automate that for us because
1:24:43there's a lot of value in making those
1:24:45postcript fields seem human written.
1:24:48Anyway, now we're offering it some
1:24:49templates. subject line. Hey, name I
1:24:52think I have something for you. Re and
1:24:54then cool thing about them that we
1:24:56discovered. Let's just go unique thing
1:24:58about them or their company. Icebreaker,
1:25:02I know you're doing thing and I've been
1:25:04following related thing for a while, so
1:25:06I figured it made sense to chat. Next
1:25:08elevator pitch, the TLDDR. I think I can
1:25:10add 5K a month to their paraphrase
1:25:13business with a few automated systems.
1:25:15And then there's a call to action. I
1:25:17just did this for a very similar
1:25:18industry company and we had 28,350 in a
1:25:21few months. They do related things. So
1:25:22I'm very confident I can duplicate this
1:25:24at minimum. Would be 100% risk-f free. I
1:25:26guarantee at least 20 appointments
1:25:28booked or you wouldn't have to pay.
1:25:30Pretty neat, huh? So then I give it a
1:25:32bunch of guidelines. And feel free to
1:25:33pause the video if you want to take a
1:25:34look at it. The last thing that I do is
1:25:36then I say respond in JSo N using this
1:25:40format. And if you've at all used AI
1:25:42before, you'll see this JSON thing come
1:25:43up again. JSON. JSON. JSON. We're going
1:25:45to cover that in just a few minutes, so
1:25:47buckle up. Okay, great. So, we've given
1:25:49it a ton of uh instructions in the first
1:25:51user prompt. So, what I do next is I
1:25:53just give it a user prompt with the
1:25:56actual body of the input that I want to
1:25:58give. And if you think back here, um you
1:26:01know what this Google sheet is just just
1:26:02so you guys um are all on the same page
1:26:04as me, is I've basically gone and I've
1:26:05scraped a bunch of data about random
1:26:07people on the internet that fulfill some
1:26:09criteria that I have. So, chief
1:26:10executive officer, director of demand
1:26:12generation, director of marketing,
1:26:13business development, manager, some
1:26:15dentistry person or something. Okay. And
1:26:17then I have a bunch of fields here. One
1:26:19of the fields I have is I have a summary
1:26:20field where people basically write their
1:26:21own summary of who they are and what
1:26:23they care about. We have a ton of other
1:26:24fields as well. We have company
1:26:25location. We have a description of their
1:26:28title. We have um I don't know their
1:26:30their industry. And the cool part about
1:26:32AI is you can just feed this into a
1:26:33large language model and have it have it
1:26:34automate something for you. Have it have
1:26:36it write something customized. And so
1:26:38that's what we're going to be doing
1:26:39here. The thing is though, right, how do
1:26:42I get dynamic data into this? So, I
1:26:44don't know, let's say um one of the
1:26:47things I want is I want to feed the AI
1:26:48the person's full name. Notice how this
1:26:50is fixed here, right? If I just typed
1:26:52Amy
1:26:53Wabe, then that means that every time I
1:26:56do an API call that includes their full
1:26:58name, I'm going to have it say Amy
1:27:00Wabby. This is fixed. It's the same
1:27:01thing every time. If you want to make
1:27:03this dynamic, what you have to do, there
1:27:05are variety of ways to do this, but I'm
1:27:06going to use the expression field, is
1:27:07you have to click
1:27:08expression and then you drag the field
1:27:11that you want and then you drop it. And
1:27:14you'll see that when I do that, we've
1:27:16now just inserted a little bit of code.
1:27:19This is in N8N's
1:27:22um code format, the equivalent of the
1:27:25variable that we just pulled from our
1:27:27pinned data or our our data from the uh
1:27:29input. And what you see down here is
1:27:31this is separated into two halves. The
1:27:33top half is the code representation. We
1:27:36said full name just in like regular
1:27:37characters. And I can manipulate this
1:27:39how I want. Then a colon, then a space.
1:27:41And then there's uh curly bracket curly
1:27:43bracket space dollar sign Js N. FU L N A
1:27:49M E space. And then a right curly
1:27:51bracket right curly bracket. Up here you
1:27:52have the code representation. And then
1:27:54notice that underneath here we have
1:27:55result. It actually shows us what the
1:27:57data that we're pulling in is from the
1:27:59input, which was right over here. Now,
1:28:02I'm going to be feeding it a bunch of
1:28:04data in order to have this personalized.
1:28:05I'm going to be feeding in their full
1:28:06name. I'm going to be feeding in the
1:28:07summary. I'm going to be feeding in the
1:28:08title. But I just want you guys to to
1:28:09notice how these these variables change
1:28:13between the full name, between the
1:28:15summary, between the title. And you're
1:28:16going to notice that there's kind of a
1:28:17pattern there. Okay. So, full name was
1:28:19that. We'll go title. I'm just going to
1:28:22drag this
1:28:23in. Paste it in. Notice how the first
1:28:26one was jso nf full name. Second one was
1:28:29jso n.title.
1:28:31Right. Let's see what the third one is.
1:28:34Let's go down here to
1:28:36company. Company. If I drag and drop
1:28:38this now says JSON company. You know
1:28:41that the C is capitalized. That looks a
1:28:42little bit new, but for the most part,
1:28:44it's still pretty self-explanatory. It
1:28:46seems to me if I were an alien staring
1:28:49at this and looking to try and figure
1:28:50out what the pattern here is. It seems
1:28:52to me that every single time I drag and
1:28:54drop one of these fields in there, it
1:28:55says dollar sign JSo N dot and then the
1:28:58name of the variable. The name of the
1:29:00variable tends to be whatever I'm
1:29:01looking at on the left hand side here.
1:29:03So what if hypothetically instead of me
1:29:06doing this drag and drop what
1:29:08if I were to actually just try and write
1:29:11this myself? Well, let's see what
1:29:13happens. If I zoom in a little bit, just
1:29:14so we could all see. If I go curly
1:29:16bracket curly bracket, you'll see that
1:29:19I'm now entering sort of the next level
1:29:21up in NN. I'm now manipulating like code
1:29:24or JavaScript, their version of
1:29:26JavaScript, the JMSE path, I believe
1:29:28it's called, directly in the expression
1:29:30editor. And this is where N gets really
1:29:32powerful because you also have a ton of
1:29:33built-in methods and built-in ways you
1:29:35can manipulate this data with literally
1:29:36one click, one little button tap without
1:29:38having to drag and drop all these
1:29:39modules everywhere. You can just do so
1:29:40in the convenience of your own field
1:29:43editor. Okay, so the very first thing
1:29:44that pops up is it says suggested JSON.
1:29:46If I just type that and then I press
1:29:47enter, you'll see that now I have access
1:29:49to all of the fields that I had access
1:29:52to earlier. So instead of me dragging
1:29:54and dropping all this stuff, what if I
1:29:56just wanted to write the word summary
1:29:57here to grab this, if I just type
1:29:59summary, notice how this now turned
1:30:01green. And we've added all of that
1:30:02information down here to the results
1:30:04tab. All that information is here. How
1:30:07cool is that? So now, you know, if I
1:30:10want to continue on, I'll go industry.
1:30:12I'll go dollar sign JSON industry.
1:30:15Voila. Next, we're going to go company
1:30:18location. I'm going to go um JSON.co
1:30:20company location. Voila. Notice how it's
1:30:24trying to autofill this for me, right?
1:30:25I'll go title description dollar sign
1:30:27JSON dot to ital description. Voila. And
1:30:32I basically have the ability to do this
1:30:34um infinitely depending on how nested
1:30:36the data is in the JSON structure of the
1:30:38input. I I'll run through how to do all
1:30:40of that um in a moment, but I just want
1:30:41you guys to sort of pattern match, look
1:30:43from the outside in. How am I actually
1:30:44referencing all these variables from
1:30:46from previous
1:30:47calls? Okay, great. So, to me, you know,
1:30:49as somebody that does this sort of
1:30:51personalization all the time, if we
1:30:52click on this little button here, we can
1:30:53actually open up, we can see all of the
1:30:55um code and all of the text. To me,
1:30:57somebody that does this all the time,
1:30:58this looks like sufficient amount of
1:30:59information for us to personalize an
1:31:01email off of. So, I'm actually just
1:31:02going to call it there, and we're
1:31:03actually going to just run this puppy.
1:31:04But basically what's going to happen is
1:31:06we're just going to be feeding in all of
1:31:07this stuff to artificial intelligence
1:31:09and we're going to be saying, "Hey man,
1:31:10based off of all of Amy's info, I want
1:31:12you to tell me something about her." And
1:31:14then I want you to write an email um
1:31:16based off of the template that I
1:31:17provided you earlier. The last thing I'm
1:31:19going to do is I'm going to go down here
1:31:20and press output content as Jason. Give
1:31:22this a click. And then I'm not going to
1:31:24modify any of the options here either.
1:31:26Um but I'm just going to click test
1:31:28step. Okay. Okay, so what's just
1:31:30happened or what is occurring as we
1:31:32speak is I'm feeding in four items to
1:31:33open AI. I'm basically Blitz going item
1:31:37one, item two, item three, item four,
1:31:38and it's happening all at once before
1:31:40they show us the output of each of
1:31:42these. So that's why it takes a little
1:31:44bit longer than usual. Um, but this is
1:31:46more or less what's happening under the
1:31:47hood. Okay, great. And we just received
1:31:49an output. Um, so what I'm going to do
1:31:51is I'm just going to zoom out a little
1:31:52bit just so we could see this in
1:31:54completeness. And I'll use schema for
1:31:56now just to make it easier for you guys.
1:31:57doesn't you don't have to like scroll
1:31:58all the way to the right to see it, but
1:32:00let's take a look. Um, the output was
1:32:02content, subject line, icebreaker,
1:32:05elevator pitch, call to action, PS. So,
1:32:06it actually went it outputed five fields
1:32:09for us and we can use those fields in
1:32:12future nodes very easily. The first
1:32:14thing in the subject line was, "Hey,
1:32:16Amy, think I have something for you
1:32:17regarding boosting online strategies."
1:32:19The icebreaker was, "I know you're
1:32:20leading creative web solutions and net
1:32:22directives and been following innovative
1:32:23marketing strategies for a while, so I
1:32:24figured it made sense to chat." The
1:32:26TLDDR, I think you can add 5K a month to
1:32:28your client focused internet marketing
1:32:29efforts with a few automated systems.
1:32:31The call to action, I just did this for
1:32:32a very similar IT consulting company. We
1:32:34hit this amount. They do e-commerce and
1:32:36marketing, too. How cool is that? So,
1:32:38I'm very confident I can duplicate this
1:32:39at minimum. Would be 100% risk-f free.
1:32:41I'd guarantee at least 20 appointments
1:32:42booked. You wouldn't pay. P.S., even if
1:32:45we just chat, I'd love to hear about
1:32:46what you're doing with video marketing.
1:32:48That sounds pretty cool to me, right?
1:32:49And if I were to receive an email like
1:32:50this, you know, aside from the subject
1:32:52line, which is a little bit vague,
1:32:53boosting online strategies, but you
1:32:55can't fault the AI for not being perfect
1:32:57100% of the time. Um, you know, even if
1:32:59I were to get something like this, it
1:33:01would seem as if, uh, you know, like the
1:33:03person that's reaching out to me did
1:33:04their did their research at minimum and
1:33:06is reaching out to me sort of in a
1:33:07personalized customized way as opposed
1:33:09to just like blasting me a big sequence.
1:33:11So, uh, what else do I want to do with
1:33:13this? Well, if you guys, you know,
1:33:14remember back to the beginning of the
1:33:15video, the there weren't just two or
1:33:16three nodes here. There was um there was
1:33:18a node that updated the Google sheet. So
1:33:20I'm going to show you how to update the
1:33:20Google sheet. And what we're actually
1:33:22going to do is we're going to take this
1:33:23one step further and I'm actually going
1:33:24to draft some emails to send to Amy and
1:33:26the rest of the people here. So actually
1:33:28the first thing I'm going to do is I'm
1:33:29just going to go over here and pin this
1:33:31output. The reason why is because if you
1:33:33think about it, me calling um OpenAI
1:33:35there, that was a little bit like
1:33:36computationally expensive. It took me a
1:33:38little bit of time. I don't actually
1:33:39want to have to rerun that over and over
1:33:40and over again. pinning the data just
1:33:42allows me to capture that, cache it, and
1:33:44now I can just like test all subsequent
1:33:46nodes using that, which is very
1:33:48straightforward. Okay, so what I want to
1:33:50do, I want to update this Google sheet.
1:33:51So I'm going to click here, search
1:33:53nodes, I'll type sheets, and what I want
1:33:54to do is I want to um update row and
1:33:58sheet. I'm going to select my
1:34:00credentials again, YouTube. The resource
1:34:02will be sheet within document. The
1:34:03operation will be update row. Let's
1:34:05instead of using the fix, let's actually
1:34:07just use the expression so I could show
1:34:08you how this works. Just going to grab
1:34:10the ID of this field or of this sheet.
1:34:13Paste that in there. Voila. Then the
1:34:15sheet that I'm going to be picking, it's
1:34:16just going to be sheet one. So notice
1:34:18that the top here we use the expression
1:34:20field view and then down here we just
1:34:22use the fix. So it actually use the
1:34:23expression field view to do an API call
1:34:25to their backend to discover that sheet
1:34:27one was the only sheet and then we
1:34:29selected it there. We can also just feed
1:34:30in an expression. And as you see when
1:34:32you go from fix to expression for the
1:34:34specific sheet type, it just says G
1:34:36equals Z. G equals Z just refers to the
1:34:38first sheet. um basically here. So we're
1:34:40we're always going to be selecting the
1:34:42first sheet. But anyway, for this I'm
1:34:44actually going to go from list and then
1:34:45I'll just go sheet one. Keep this
1:34:47simpler. Okay. Now it's going to be
1:34:48fetching a bunch of columns for us. And
1:34:50basically in order to do this update,
1:34:52what we have to do is um we have to grab
1:34:55the data from the previous nodes and
1:34:56then we have to update every single
1:34:58column here with that data. If I were
1:35:00just to, you know, scroll all the way
1:35:02down and update the columns that I care
1:35:04about, like subject, icebreaker,
1:35:06elevator, pitch, call to action,
1:35:07postcript, it would just leave the rest
1:35:09of these blank, which is kind of
1:35:10annoying if I'm being honest. But I
1:35:12don't want the rest of these to be blank
1:35:13and these to be filled. I want all of
1:35:14this data because I'm just going to
1:35:15import this into some cold email tool
1:35:16later, right? So, what we have to do is
1:35:20now, this is kind of the initial idea
1:35:21behind this system. I'm going to go
1:35:23through and I'm going to update every
1:35:24single one of these um using the
1:35:26expression tab, and then I'm going to be
1:35:27pulling data in. But I'm not going to be
1:35:29pulling data in from here. I'm going to
1:35:30be pulling data in from one node behind
1:35:31it. So you guys could see what it looks
1:35:33like in code basically. Okay. So the
1:35:35first thing we have to do is we just
1:35:36need a column to match on. In order for
1:35:38the automation to know which row should
1:35:41be updated, we have to find data that
1:35:43includes that email. So I'm going to go
1:35:45email. Then the first thing I'm going to
1:35:47do is I'm going to scroll down here to
1:35:49the previous node, not the OpenAI node,
1:35:51but the Google Sheets node, the one that
1:35:52like first listed us the data. I'm going
1:35:54to drag this feed that in there. And
1:35:57you'll notice that the format now looks
1:35:59different than it did before.
1:36:00Previously, we had a dollar sign JSON
1:36:02dot item. Right? Now we have a dollar
1:36:05sign and then a bracket single quote
1:36:07sign. The name of the node, another
1:36:10single quote sign and then another
1:36:11bracket. And then we go do
1:36:13item.json. So when you when you access
1:36:15node data from more than one node back,
1:36:17you have to use this new format here,
1:36:19which is kind of annoying, but you'll
1:36:21see how easy it is when we just like
1:36:22kind of copy paste and spam our way
1:36:24through. So, uh, how about this
1:36:26civility? I'm going to go to expression.
1:36:28I'm going to paste this in. Then,
1:36:29instead of email, I'm just going to go
1:36:32civility. How about this first name?
1:36:35Let's paste that in there. We'll go
1:36:36first name. How about this first name
1:36:40suggestion? Paste that in there. Go
1:36:41expression. Go first name
1:36:44suggestion. How about the last name? I'm
1:36:47going to paste this in there. Go last
1:36:49name. How about the full name? I'm going
1:36:52to paste that in there. Go expression.
1:36:54We'll go full name. How about the title?
1:36:56I'm going to paste this in there. I'll
1:36:58go title profile URL. So, you can see,
1:37:01you know, we're picking up the pace a
1:37:02little bit. It's getting a little bit
1:37:03faster and faster.
1:37:06Company, company, illegal
1:37:11name, company
1:37:14phone. And I'm just going to go ahead
1:37:16and um cut to me having actually filled
1:37:18all this stuff out just for brevity.
1:37:20Okay. Okay, elevator pitch, call to
1:37:22action. Looking good. And then last but
1:37:26not least, we'll do um I think it was
1:37:28just PS or was it a post script? Yeah,
1:37:30sorry, it was just PS for that. This is
1:37:32the one situation which uh the column
1:37:34name is a little bit different from the
1:37:35variable name down here. Okay, now that
1:37:37we're done with that, let's just quickly
1:37:39cover um just some little differences
1:37:41here in the formatting just so we can
1:37:43get a runup on the JSON, which I'm about
1:37:44to teach you. If you scroll all the way
1:37:46up here, you'll see that some of these,
1:37:48well, actually most of these followed
1:37:49this format. It was Oops, sorry about
1:37:52that. Let's go over here. It was um
1:37:55curly brace curly brace dollar sign the
1:37:59name of the node in single quotes dot
1:38:02item.json dot whatever the value was
1:38:04dots summary. In this case, this one was
1:38:07regular company URL. This one down here
1:38:09was VM ID. You'll notice that a few of
1:38:11these are actually a little bit
1:38:12different. a few of these in particular
1:38:14the variable names with spaces. They
1:38:15weren't just dot you know the name it
1:38:18was square bracket single quote and then
1:38:21the name of the variable that we're
1:38:23referencing. The reason why we had to do
1:38:26this instead of just doing the dot and
1:38:28then the variable name is because JSON
1:38:32in JavaScript object notation you can't
1:38:34query I mean the technical term is you
1:38:36can't query a key that has spaces
1:38:38basically just because spaces aren't
1:38:39really represented. So, you know, if we
1:38:42scroll down here to some of these
1:38:43variable names, first space name space
1:38:45suggestion, there's a bunch of spaces in
1:38:46there, right? So, the way that you get
1:38:48around this in uh NAN's formatting is
1:38:51instead of calling, let me get that
1:38:53specific example company legal name or
1:38:56was it uh first name suggestion. So, the
1:38:59way that you get around this is you
1:39:00can't just go first name suggestion cuz
1:39:03that kind of breaks the formatting here,
1:39:04right? The way you can get around this
1:39:06is two things. when you can make it so
1:39:07that the input data aka the columns in
1:39:09your Google sheet are all just one word.
1:39:11So if instead it was first name
1:39:13suggestion, this would be fine. You
1:39:15could also do something like first name
1:39:17suggestion. Some people do that format.
1:39:18I don't really like that. I don't know
1:39:20why. What I do is um called camelc case.
1:39:23It's kind of like a programming
1:39:25convention. And here we can get into
1:39:26like a a lifelong mutually assured
1:39:29destructive battle where some people
1:39:30prefer camel case, other people prefer
1:39:32underlining. Um, but I'm team Camel
1:39:34Case, so go team camel case. Um,
1:39:36instead, you know, if we want to
1:39:38represent the spaces, what we have to do
1:39:39is we have to go brackets here, um,
1:39:42single colon, first name, suggestion,
1:39:44another col, uh, another quote sign, and
1:39:46then another square bracket. So, don't
1:39:48don't sweat the small little formatting
1:39:50stuff too much. I just wanted to give
1:39:51you guys like the best way that I found
1:39:53to learn this is literally just to like
1:39:54spam a bunch of examples. Um, that's
1:39:56what I did when I was picking this stuff
1:39:57up. I didn't read a bunch of books on
1:40:00JavaScript object notation or
1:40:02expressions or whatever. I just spammed
1:40:03a bunch of examples. And the human brain
1:40:05is such that if you squint at it long
1:40:06enough, you'll sort of figure it out
1:40:08intuitively. Uh, okay, great. So, now
1:40:09that we've mapped all these, let's
1:40:10actually go and let's, um, let's update
1:40:12this data, right? That's the whole point
1:40:13of this. So, uh, now that we've mapped
1:40:15all the data, if I click test step, and
1:40:16then I go over here to my Google sheet,
1:40:18scroll all the way to the right, you
1:40:20see, and it just took us a second, but
1:40:21you see that we just, boom, we just
1:40:22updated all four of these
1:40:23simultaneously. Uh, we got the subject
1:40:26line for Amy, subject line for Joe,
1:40:27subject line for Mercedes, subject line
1:40:28for Susan. Same thing with all the
1:40:30elevator pitches, call to actions,
1:40:32postcripts. You'll see that the the the
1:40:34copy of the email is pretty similar, but
1:40:36um it it changes. So, this one's I know
1:40:38you're leading creative web solutions. I
1:40:40know you're le into leveraging customer
1:40:41voices. I know you're focused on
1:40:42building relationships. I know you're
1:40:43advancing digital dentistry. These are
1:40:45all basically like reframing or
1:40:48paraphrasing
1:40:49um the things that they said in their
1:40:51profile which ultimately uh you know is
1:40:53meant to make them go like oh okay this
1:40:54person did their research they read a
1:40:56little bit about me. So that's pretty
1:40:57cool. Um why don't we take this one step
1:40:59further now. Why don't we pin this and
1:41:00then I'm actually going to create a
1:41:02Gmail draft in my inbox just so we can
1:41:04see what's going on here. So I'm type
1:41:06draft create a draft. I'll connect with
1:41:09my Gmail credential and this is before I
1:41:11did the naming convention so it was
1:41:12probably number three. We're just going
1:41:14to create a draft. The subject line is
1:41:17going to be, let's just go to fix now
1:41:18that we know how to do this. It's going
1:41:20to be JSON dot uh subject right
1:41:25here. And then the actual message, it's
1:41:28going to be pretty interesting, but I'll
1:41:29show you I'll show you how we put it
1:41:30together. First thing we're going to do
1:41:31is we're going to go JSON dot. And then
1:41:33what I want to do is I want an
1:41:35icebreaker.
1:41:37Uh, sorry, I don't want an icebreaker. I
1:41:40want to go hi. And then I want to grab
1:41:42the person's name. So I'll go Jason
1:41:44first name right
1:41:46here. So hi
1:41:49Amy, then we have the the JSON
1:41:51icebreaker. Next up, I want to go JSON
1:41:53dot uh sorry dollar sign JSON dot and
1:41:56then what were we doing here? Was it the
1:41:58elevator pitch? Yeah, it was the
1:41:59elevator pitch. Paste that in there.
1:42:02Then we want to go dollar sign JSON dot
1:42:04what's the next one? Call to action.
1:42:07Beautiful. And we also want to go dollar
1:42:10sign JSON dot and I'm sure you guys can
1:42:11guess what the last one is, but very
1:42:13quickly make sure you do make sure you
1:42:15know u postcript. Now if we open up this
1:42:18thing in the bigger example window,
1:42:20you'll see the email says, "Hi Amy, I
1:42:22know you've been leading creative web
1:42:23solutions and net directives. Been
1:42:24following innovative marketing
1:42:25strategies for a while, so I figured it
1:42:26made sense to chat. The TLDDR, I think I
1:42:28can add 5K a month to your client
1:42:29focused internet marketing efforts with
1:42:30a few automated systems. I just did this
1:42:31for and even if we just chat, I'd love
1:42:33to hear about what you're doing with
1:42:34video marketing." I guess I actually
1:42:36need to add a PS sign here. And it looks
1:42:37like none of these have periods.
1:42:39Actually, I think this last one has a
1:42:40period, but not all of these do. So,
1:42:42just because I was a little bit um fast
1:42:44in kind of designing this and I didn't
1:42:46put periods over, I'm actually just
1:42:47going to add the periods directly into
1:42:48the expression editor. I'm go PS here.
1:42:52Okay. And now, if we open it up, this is
1:42:53what it looks like. We got periods
1:42:55everywhere. Cool. Wonderful. And then we
1:42:58have a little PS sign here. Even if we
1:42:59just chat, I'd love to hear what we were
1:43:00doing with video marketing. Very, very
1:43:02cool. Awesome. Awesome. So, now that we
1:43:03have that pinned data, um, why don't we
1:43:05just draft these emails? So, I'm going
1:43:07to, uh, create a draft. I'm not actually
1:43:09going to send this cuz I don't just want
1:43:10to spam a bunch of these people. I've
1:43:11also changed the email address and
1:43:13stuff, so I'd get a bunch of bounces.
1:43:14We're just going to test step. It's
1:43:17executing. We just executed four nodes.
1:43:19So, now if I go over here, go to
1:43:21drafts, you'll see here that we have,
1:43:24"Hey, Susan, think I have something for
1:43:25you. Red digital dentistry." Oh, gez,
1:43:27I'm realizing I didn't put the um email
1:43:28address in actually. Yeah, I did not put
1:43:31the email address in. I just did the
1:43:33draft. U in options you have to go to
1:43:35email. And then what we want to do is we
1:43:36just want to drag that back here. JSON
1:43:38email to get that address. Let's create
1:43:40four more drafts just for shits and
1:43:42gigs. Then why don't I just delete the
1:43:44ones that I just generated uh right over
1:43:48here. Going to just discard
1:43:50these. And then you see that the four
1:43:53that I just did now have just popped up.
1:43:54And they also have the email addresses
1:43:57there. So yeah, that's that with that
1:43:59example. Um, I think at this point you
1:44:01guys probably have an intuitive
1:44:02understanding of how these fields work.
1:44:04And hopefully I've made a case for why
1:44:06you should just always use expression.
1:44:07Like there's no real need to do fixed
1:44:09because if you think about it, like you
1:44:10could just write the same fixed thing.
1:44:12Like if I wanted to type, hey, think I
1:44:13have something for you regarding
1:44:14marketing strategies. And I just wanted
1:44:16to send the same thing every time. I
1:44:17could do so with the expression view of
1:44:19the field, right? Like same thing. It's
1:44:21just here I also have the ability to u
1:44:24modify uh code a little bit and like do
1:44:26something if I wanted to. So, I
1:44:29personally am always going to be using
1:44:30this moving forward. And the reason why,
1:44:33sorry, it can be kind of a lot to see if
1:44:35you muck around with. Just always put a
1:44:36dollar sign first if you're referencing
1:44:37data from the previous node. Uh, and the
1:44:40reason why is it's just going to be the
1:44:41easiest for me. Um, you know, you get
1:44:43all the variables up here anyway. It's
1:44:44no big deal. So, we're doing subject.
1:44:46Stick that in there. We got the subject
1:44:47line. We are good to
1:44:49go. So, uh, I think we probably learned
1:44:51a fair amount about the fixed fields and
1:44:53expression fields at this point. Um, the
1:44:55last thing I wanted to cover, I say
1:44:56mapping different field inputs to it.
1:44:57The last thing I wanted to cover was uh
1:45:00if we go back to Gmail
1:45:02here and if we scroll down to actually
1:45:06this is a bad example. Why don't we go
1:45:08back to open
1:45:09AI? You see here how um I selected the
1:45:13RO field and it was fixed and then I
1:45:15selected from a dropown user assistant
1:45:17system whatever. Well, I can actually
1:45:18just go expression and what you see here
1:45:20is this is just text that we are feeding
1:45:23this API the uh the node. We're actually
1:45:25just writing user. So instead of writing
1:45:27users, you could also write a system.
1:45:28This fix stuff. This is just made to
1:45:30make our life a little bit easier. But
1:45:31anytime you want to get the actual data
1:45:33representation, just move over to
1:45:34expression. So what are some examples of
1:45:36that? Well, like you see these simplify
1:45:38output and output content is JSON
1:45:40fields. We go to expression. You'll see
1:45:41that what we're actually passing is
1:45:43we're passing this true value. We're
1:45:45literally just writing true. Um output
1:45:48content is JSON. If we move it to
1:45:49expression, you can see we're actually
1:45:50just passing true here. For output
1:45:52content is JSON. The point that I'm
1:45:54making is um all of this is basically
1:45:56just um you know if we just strip away
1:45:58all of the basic simple stuff. You can
1:46:00start getting into what's actually going
1:46:02on behind the scenes. How we're actually
1:46:04communicating with these nodes. The way
1:46:05that we're actually communicating with
1:46:06these nodes in practice is we're sending
1:46:08the term true. Now the reason why this
1:46:10one has quotes around it I believe is
1:46:13because um true is a special case. It's
1:46:15called a boolean which I'm I'm about to
1:46:17cover right now. Um so I believe you
1:46:19need these quotes just for NAD to like
1:46:20not bug out at you. um just one of those
1:46:22unfortunate peculiarities of the
1:46:24platform. But that's that for fixed
1:46:26fields and expression fields. Okay, next
1:46:28up, let's talk more about JavaScript
1:46:30object notation. And if you guys already
1:46:32know JSON, if you've already
1:46:33experimented and and understand the
1:46:35various formatting types available here,
1:46:37feel free to skip on until we move on to
1:46:39how data in N8 is represented. Um should
1:46:41be about 15-ish minutes or so. Uh but
1:46:43for everybody in the audience that
1:46:44doesn't understand JavaScript object
1:46:46notation, I just want to go real deep
1:46:48into it and I want to make sure you
1:46:49understand everything about JSON because
1:46:51ultimately as opposed to a lot of other
1:46:52noode platforms, NAD it doesn't ignore
1:46:56code or try and shove code away. It
1:46:58actually embraces code. So understanding
1:46:59a little bit of some of the um code
1:47:01types like JSON for instance makes you
1:47:03way more powerful. This is really what
1:47:05like everybody that makes money with
1:47:07this platform uses. We just use JSON to
1:47:09send data back and forth. Um, and you
1:47:11know, if you don't know JSON,
1:47:12everything's going to be a little bit
1:47:13trickier for you. Okay. So, what's the
1:47:15best way to um intuitively understand
1:47:18JSON? Well, what I'm going to do next is
1:47:20I'm going to walk you through the
1:47:21various data types in JSON. Uh, I'm
1:47:22going to give you just like a a brief
1:47:24little um structure and format, and then
1:47:26we can actually just walk through JSON
1:47:28kind of step by step depending on
1:47:29different variables and stuff like that.
1:47:31So, I'm just going to go and type in
1:47:32JSON formatter. This is just the
1:47:34simplest and
1:47:36freesting platform I found online. As
1:47:38you can see, we got tons of ads in the
1:47:40middle here. you don't pay anything to
1:47:41use it, but basically what's happening
1:47:42under the scenes is behind the scenes is
1:47:44it's running um with every time you
1:47:46press a keystroke, it's just double
1:47:48checking to see if it's valid JSON. This
1:47:50is actually pretty useful for us because
1:47:51we can we can verify if something is
1:47:52indeed JSON or not just by looking at
1:47:54it. This isn't the only way to do it.
1:47:56Obviously, we could do a ton of
1:47:57different things. We could I could open
1:47:58up like a code platform like VS Code or
1:48:00something and do the same thing, but I
1:48:01just wanted to keep this thing
1:48:02accessible for all of us. All right. So,
1:48:05zooming way in here, um, just so I don't
1:48:07get ads in my face 24/7. So, what is
1:48:10JavaScript object notation? Basically,
1:48:13JSON um is just a way to represent data
1:48:19in a structured and standardized
1:48:22format that minimizes the number of
1:48:25characters and it also minimizes the
1:48:27ambiguity so that when we send data to
1:48:30and from some API or something, we could
1:48:32do so as efficiently as possible.
1:48:35So the way that JSON works, the way that
1:48:38you send and receive data is based off
1:48:41of two um two concepts. The first
1:48:43concept is a key. So I'm going to write
1:48:45a key here. This key is going to involve
1:48:47my name. The first name is going to be
1:48:50sorry um the the key name is going to be
1:48:52called first name. So the key is just
1:48:54you can think of it as like the name of
1:48:55a variable. So the variable is called
1:48:58first name, but what the variable equals
1:49:01is a whole different matter. And that's
1:49:03where the value comes
1:49:05in. So first name I'm going to set to
1:49:09Nick. So this here is proper or well
1:49:12formatted JSON. It's not yelling at us
1:49:14or anything like that. It's it's it's
1:49:16actually good, which is nice. So this is
1:49:17an example of one of the simplest
1:49:20JavaScript objects that you could build.
1:49:22It is a onekey uh one value object. The
1:49:25key being first name and the value being
1:49:27neck. You've undoubtedly seen examples
1:49:30of this before if you tried working with
1:49:32any noode or coding platform um you know
1:49:35nadn included. The thing is in JSON
1:49:39there are a few simple but consistent
1:49:41formatting quirks that you just have to
1:49:43pay attention to. So the first is there
1:49:46are variety of different data types. Now
1:49:48as you can see here what I've done is I
1:49:50have this open curly bracket and then
1:49:52close curly bracket. I have the key name
1:49:54over here, a a colon, that's just these
1:49:56two dots, and then I have the
1:49:58value, but what I've done is I've
1:50:00wrapped everything in these double quote
1:50:02signs here. So, first name, double
1:50:04quote, Nick, double quote. The reason
1:50:06why is because the data type that I'm
1:50:08going with here is called a string. It's
1:50:10actually a particular data type. A
1:50:12string is just like written text. Okay,
1:50:15so this is if if instead of first name I
1:50:17say ID, this here this is a string data
1:50:21type, but it's not like you don't only
1:50:23have strings available to you. Although
1:50:24a lot of platforms prefer strings, you
1:50:26also have a variety of other data types.
1:50:27Here's another data type we have access
1:50:29to. This is a number data type. It's
1:50:32numeric. So in order to um you know send
1:50:35and receive numbers, you don't actually
1:50:36have to wrap them in quotes. This red
1:50:39here just corresponds to it being linted
1:50:41or formatted or whatever by this JSON
1:50:43formatter as a number data type. So this
1:50:46is still valid JSON even though we don't
1:50:47have the quotes around this. Okay, this
1:50:51is not valid JSON, right? This does not
1:50:53mean anything because we're using string
1:50:56characters uh and we're inserting it in
1:50:58something that the software that we're
1:51:00going to be using NN is going to be
1:51:02expecting to be a number. So basic rules
1:51:05of thumb are uh you can't just write a
1:51:07string without wrapping it in
1:51:09quotes. And the unfortunate reality is
1:51:12numbers can be both numbers and
1:51:14strings. So three ways to do X. Maybe we
1:51:18call this titles, right? The three here,
1:51:19this is a number, right? But we are
1:51:21still wrapping this within the quotes of
1:51:23a string. However, this is different
1:51:26from this.
1:51:28And so in practice, the reason I harp on
1:51:30this is because uh in practice this
1:51:32usually doesn't matter that much. No
1:51:33code platforms will take care of like
1:51:35the type conversion for you between
1:51:36number to string. Um if you're using a
1:51:38number, if you're sending it as like
1:51:40just the three without the quotes around
1:51:41it, um for the most part, that's that's
1:51:43okay. You'll be able to use this as a
1:51:44string later on. But in like pure
1:51:46JavaScript and a couple of programming
1:51:48languages, you can't actually just like
1:51:49if you wanted to, I don't know, run a
1:51:51function after this that added a number.
1:51:54um you know maybe it was like here let
1:51:57me show you number of things then title
1:52:02template let's say I had some function
1:52:04where I wanted to add the number of
1:52:06things to the beginning of the title
1:52:08template so that it said three ways to
1:52:10create NAN flows five ways to create N
1:52:13flows 15 ways to create NAN flows some
1:52:15programming languages wouldn't let you
1:52:17do that in which case you'd have to
1:52:18convert this to um you know a string and
1:52:20then you could just go number of things
1:52:21plus title template equals 15 ways to
1:52:23create N
1:52:25flows. Okay, great. So, we've covered
1:52:27numbers. We've also covered uh and
1:52:29numbers, I believe they have some fancy
1:52:30name, int or or technically they could
1:52:32be floats. They could be a number of
1:52:33things, but um in our case, we're just
1:52:35going to go numbers. Next up, I want to
1:52:37cover a couple of additional data types.
1:52:40So, one of the data types is called
1:52:42bool. So, a bool stands for boolean.
1:52:45Boolean just means zero or one, true or
1:52:47false. So, true, see how this just
1:52:49turned into orange instead of gray. Um,
1:52:51true is an accepted bool and you don't
1:52:53actually need to wrap uh quotes around
1:52:55this true in order for it to technically
1:52:57be valid JSON. Now, for the most part, I
1:52:59will always just wrap quotes around all
1:53:00this stuff anyway because as I
1:53:01mentioned, they do type conversions and
1:53:02it doesn't really matter to me too much.
1:53:03But I just wanted you guys to sort of
1:53:05explain why sometimes you see stuff that
1:53:07is not wrapped in quotes, and that's one
1:53:09of them. You also have a few higher
1:53:11level data types. And one of the higher
1:53:13level data types um that I'm going to
1:53:14show you guys, I'm going to show you
1:53:15two. The first is I'm going to show you
1:53:17an array. An array looks like this. It's
1:53:18with square brackets. So you have a left
1:53:20square bracket and then a right square
1:53:21bracket. Then the other is another
1:53:24JavaScript object. And the really cool
1:53:27part about JSON is you can infinitely ne
1:53:29nest different data types within the
1:53:31values of uh of a key. So, I could
1:53:36theoretically wrap an array, which is
1:53:39just a number of things. And then inside
1:53:42of that
1:53:42array, I could wrap a number of other
1:53:46JavaScript objects that go infinitely
1:53:48deep. And I'll show you guys how to do
1:53:50this in practice. But maybe we'll just
1:53:52go items. Then here we'll go first name,
1:53:55Nick. Here we'll go first name. And
1:53:58we'll go Sally. Then here, uh, let's
1:54:00just do two so I don't run off the page.
1:54:02So now what we've done is we've created
1:54:04JSON where we have a key called items.
1:54:09Then inside of said key we have an array
1:54:12and inside of set array we have two more
1:54:14objects. Both objects have the key
1:54:17called first name and then they have
1:54:19different values. The first has a value
1:54:21of Nick, the second has a value of
1:54:23Sally. Now to make people's lives easy,
1:54:25usually the way that this works is you
1:54:27will do some level of uh formatting like
1:54:30this string formatting just to make your
1:54:32life really really easy. You'll be able
1:54:34to
1:54:35see like where the item starts and then
1:54:38there's usually like a fair amount of
1:54:39indentation and I don't know the exact
1:54:40amount of indentation but usually it
1:54:42looks something like this. Now at a
1:54:44glance you can kind of see the structure
1:54:45of this. It's sort of nested. You have
1:54:47um this top level array and inside of
1:54:49the array you have two objects. First
1:54:50name Nick, first name Sally.
1:54:53Okay, great. So, let's create a
1:54:55hypothetical JSON object. And just
1:54:57because I know the most about myself,
1:54:58I'm going to be creating this for
1:55:00myself. Let's hypothetically just create
1:55:02a JSON object. And let's just do like a
1:55:03user object. Okay. So, what I'm going to
1:55:06do is I'm going to go user. That's going
1:55:08to be the key name. Then I'm going to go
1:55:10uh colon. And then I'm going to create
1:55:13another
1:55:16object. Inside of my user object, I'm
1:55:18going to have first
1:55:19name. First name is Nick. We have a last
1:55:22name. My last name is
1:55:25Sarafh. Um I'll have city. My city for
1:55:29the time being is Calgary. I'll have
1:55:32um foods he enjoys or foods, let's just
1:55:38call it food preferences, right? Cuz if
1:55:39you say foods he enjoys, now you're um
1:55:42insinuating that has to be a he. And
1:55:43then what if you add a user in the
1:55:45future that is a woman? Do you want to
1:55:46change the key name? No, obviously not.
1:55:48So food preferences, I'm just going to
1:55:50add an array. And inside of my array are
1:55:51going to be a bunch of strings. So, one
1:55:52of my food preferences is um I don't
1:55:54know,
1:55:55Thai. I'm going to have another one that
1:55:58is uh I don't know, like Japanese. Okay,
1:56:01so I like Thai food and I like Japanese
1:56:02food. Apparently, I like absolutely
1:56:04nothing else. I have a very strict diet.
1:56:06Okay, cool. And then why don't we add
1:56:09um let's just add one more. And then I'm
1:56:12just going to add one called friends
1:56:14hypothetically. Um but because as we all
1:56:15know, I have absolutely no friends. Um,
1:56:17and then inside of friends, we're going
1:56:19to add a another object. We're going to
1:56:21add an array. And inside of that, we're
1:56:24going to have first name. We're going to
1:56:25have Peter, my uh dearest and longest
1:56:28friend, of course. Thank you, Peter.
1:56:30Then underneath that, we're going to
1:56:31have um last
1:56:35name Griffin because I am now
1:56:39uh loving family guy. And that's one of
1:56:42my friends. And then I'm just going to
1:56:44copy this over. I'm going to add a a
1:56:46comma because you need a comma in
1:56:47between all items in an array and also
1:56:48all items in an object. So, we have our
1:56:51object here. It's a pretty intense user
1:56:54um object. We have a first name, last
1:56:56name, the city the person lives in, the
1:56:57food preferences, we have a list of
1:57:00friends, right? The reason why I go into
1:57:02this much uh detail here to create this
1:57:04object is just because I want to impress
1:57:05upon you that you can make an object
1:57:07arbitrarily detailed. You can make it as
1:57:09detailed as a human being could ever
1:57:10possibly want. And a lot of the time
1:57:12you'll see that these APIs that you're
1:57:13accessing, these these calls that you're
1:57:15making to these different nodes that
1:57:16return you data about a particular
1:57:18software platform, they will be really
1:57:20really deep and they will have nested
1:57:22data like six or seven things uh levels
1:57:24deep essentially. So the easiest ones to
1:57:27use in my experience are just the ones
1:57:29that are all um you know surface level.
1:57:32You just have like a user object and
1:57:33then a first name and then a last name,
1:57:34a city and then maybe some food
1:57:36preferences. But in practice, you know,
1:57:37we need to be a little bit more capable.
1:57:39And understanding how data is structured
1:57:41in JavaScript object notation is uh
1:57:43probably like half the battle to be
1:57:45completely honest. So, I believe I've
1:57:47covered everything I wanted to cover.
1:57:48The last thing I'll mention is um you
1:57:50can't have a comma, I believe, be the
1:57:52last Yeah, it doesn't allow you to have
1:57:54a comma for the last item in an object
1:57:58or an array. So notice here how we have
1:57:59a curly bracket, then we have the key
1:58:01name user, then we have another object
1:58:03sign, and then we have the key name and
1:58:05then the value. The key name and the
1:58:07val, the key name, and then the value.
1:58:08Between each of these, we have a comma.
1:58:11But just know that at the last item in
1:58:14an array or the last item in an object,
1:58:16you can't have a comma. So you just need
1:58:18to remove that. If I press format or
1:58:19beautify, which is just my button that
1:58:20tells me everything's okay. Um, then you
1:58:22see that it is indeed formatted and
1:58:23beautified. Everything's everything's
1:58:25all right. Okay, cool. So that's the
1:58:27meandering um you know that's sort of
1:58:29how to understand this stuff from a
1:58:30bird's eye view. Moving forward what I'm
1:58:32going to be doing is just to make our
1:58:33lives a little bit easier. I'm going to
1:58:34be showing you guys in every module or
1:58:36every node I should say on what the JSON
1:58:39is of the input and the output. The
1:58:40reason why is it's just going to make it
1:58:41a lot easier for us to ultimately you
1:58:44know reference stuff and then do cool
1:58:45things with the data. So I go back to
1:58:47our Google Sheets example from earlier.
1:58:49I'm just going to move the input sorry
1:58:51I'm going to have the output be JSON.
1:58:53And you'll see that in this case what we
1:58:55have is we have an open JSON curly
1:58:57bracket. Then we have a bunch of top
1:59:00level keys. So row number over here,
1:59:03well that's a key. And you can see that
1:59:05it's represented as a two. Very similar
1:59:07to what we talked about earlier, right?
1:59:08You'll notice that the formatting here
1:59:10is a little bit different. Notice that
1:59:11this one has an underscore and then
1:59:12these other ones are all camel case and
1:59:14some of these are capitalized. Because
1:59:16these are within quotes, none of this
1:59:17stuff really matters. But just showing
1:59:19you guys that there's a there's a
1:59:20variety of like conventions that people
1:59:22do. Some people like capitalizing
1:59:24things, some people don't. So my
1:59:26recommendation to you just to keep
1:59:27everything really clean and and expected
1:59:29is just to pick one format and stick
1:59:30with it. If you like the underscores,
1:59:31use the underscores for everything. If
1:59:33you like the camel case like me, use the
1:59:34camel case for everything. But anyway,
1:59:36civility is Mr. First name Amy. First
1:59:38name suggestion, it's empty. You know,
1:59:40when something is empty in JSON, you
1:59:42just use these quotes. Notice that every
1:59:44item here has a comma in between it.
1:59:47last name, comma, full name, comma,
1:59:49right? Just going all the way down. And
1:59:51then if I zoom out, I scroll, you'll see
1:59:54now what do we have here? This was just
1:59:56one item. So if I just click on this
1:59:57little blue left curly bracket, it'll
1:59:59actually nest the item for me. And
2:00:01you'll see that inside of this item are
2:00:0338 other items, but it'll just nest it
2:00:04for me. And then I can see the next one.
2:00:06Now I can see the next one. Now I can
2:00:07see the next one. Right? We only have
2:00:09five. So that'll be it. But now I want
2:00:11to show you guys a little bit about how
2:00:13an format stuff because it's a little
2:00:15bit different than Jason I just showed
2:00:16you. But once you understand this,
2:00:17basically everything from here on out
2:00:18will be child's play. Notice how the
2:00:21very first character that you see on the
2:00:24output page on the JSON is a square
2:00:27bracket. Well, if you think back to the
2:00:28example that I gave you earlier, if we
2:00:30click out of this um Pizza Hut ad, as
2:00:32much as I love Pizza Hut, this array
2:00:35here starts with these square brackets.
2:00:38And so we see over here we have a square
2:00:39bracket as well. That means that this is
2:00:40an array basically. So the way that data
2:00:44is represented in NADN is all data on
2:00:46the platform is represented as an array
2:00:49of objects. Okay. So if I scroll down
2:00:52here to how data in NAN is represented.
2:00:54All of it is an array of objects. All of
2:00:56it will basically be those two square
2:00:59brackets on the outside of a number of
2:01:01items. And you could have as many items
2:01:03as you want. As we saw, we had four back
2:01:05over there. And inside of those four
2:01:07items, we had an additional 38 items
2:01:09nestled inside. But all data is an array
2:01:11of objects. Meaning that that's how you
2:01:13send and receive multiple objects.
2:01:16Remember at the beginning here we had
2:01:17one item. We just outputed a single
2:01:18variable there. Well, now after this
2:01:20Google Sheets call, we're doing four
2:01:21items. Those four items are represented
2:01:24in our JSON as an array inside of which
2:01:27is another object that has the key name
2:01:29row underscore number, civility, first
2:01:31name, first name, suggestion, and so on
2:01:33and so on and so forth. So all data in
2:01:34NAD is an array of objects. The number
2:01:37one gotcha that I always see when
2:01:39beginners start out with this is they
2:01:41end up not fully understanding how many
2:01:43objects the previous node is sending or
2:01:45the current node is receiving. And so
2:01:47then when they try and reference a
2:01:48particular item inside of the data
2:01:50structure, they find that it just
2:01:52doesn't exist or they need to like index
2:01:53it, they need to slice in to find a
2:01:55specific item inside of the array of
2:01:56items or some other problem. But this is
2:01:59the number one problem that I see in
2:02:00practice just running through reading
2:02:02like NA and help threads and stuff like
2:02:03that that people struggle with on this
2:02:05platform. So if you understand this the
2:02:08fact that all inputs and all outputs are
2:02:10an array of items represented as follows
2:02:12and now if you understand how to format
2:02:14JSON what JSON looks like and now
2:02:16further if you just make it so that you
2:02:18look at the JSON and not necessarily the
2:02:20table or the schema format every time
2:02:21you're sending and receiving data you
2:02:23will solve the biggest gotcha that
2:02:24people have within it's just going to be
2:02:26a lot easier for you moving forward to
2:02:28you know create flows. You're you're
2:02:29basically going to take so much of the
2:02:31load off that most other people spend
2:02:33like hours and hours and hours trying to
2:02:34debugging. um right from the get- go
2:02:36which is ultimately what I wanted to do
2:02:37here. Okay, great. So now we know that
2:02:39data in N8N is represented as an array
2:02:41of objects. So how do you actually
2:02:43reference that data? You guys remember
2:02:44earlier in that example here where we
2:02:46were using this Google sheet module?
2:02:48Sorry, this Google sheet node I should
2:02:50say. And if we scroll down here, we were
2:02:53updating a field using data not from the
2:02:56previous node but from a few nodes back.
2:02:59Well, basically if I go back to JSON
2:03:01here, what you can see is we can go one
2:03:03node back to open ad, two nodes back to
2:03:05Google Sheets, three nodes back to when
2:03:07clicking test workflow. Okay, let's just
2:03:09go to this Google sheet. In order to
2:03:11reference data, actually in this case,
2:03:13we will use the schema cuz you can
2:03:14actually see sort of them logically top
2:03:16to bottom. In order to reference data
2:03:18more than one node back, what we have to
2:03:19do, if we just want to redo this email
2:03:21one, we go curly bracket curly bracket
2:03:23dollar sign. Then what we want to do is
2:03:25we go this left round bracket. Then we
2:03:29have access to all of our earlier nodes.
2:03:30We can select the current node open AI,
2:03:32but we can also select Google Sheets.
2:03:34And we can also select when clicking
2:03:35test workflow we want is the Google
2:03:36Sheets. And then if you just dotindex,
2:03:38if you put a period, then you'll get an
2:03:41item. And the reason why I bring up this
2:03:43item is because basically all of this
2:03:46stuff is buried under this dot item
2:03:51syntax. And it's kind of annoying, but
2:03:53in order to reference, I don't know, the
2:03:55row number, what we have to do is we
2:03:56have to reference the Google sheet. Then
2:03:58we have to reference the item. Then we
2:03:59have to reference JSON. Then we have to
2:04:01reference the row number. Why? Because
2:04:03NAN actually hides some of this
2:04:05information from us. We don't actually
2:04:06see the nested data structure. All we
2:04:09see is the nice representation of it.
2:04:10Okay. So this isn't actually represented
2:04:13this way despite the fact that it looks
2:04:15kind of like it is. The way that this
2:04:17actually looks kind of underneath the
2:04:19scenes behind what NAN is showing us is
2:04:22it looks like this. And if you
2:04:23understand this, you'll understand how
2:04:24to reference basically any item in NAN.
2:04:27So this is equivalent to what we're
2:04:29seeing here. What we actually have is
2:04:30there's an additional two layers between
2:04:32us accessing the data through the dot
2:04:34thing. It's actually
2:04:35item.json and then we have the row
2:04:37number, stability, first name, first
2:04:38name, suggestion, stuff like that. Okay.
2:04:40So that means that when we want to
2:04:41access it kind of just just looking over
2:04:42here, the very first thing we have to do
2:04:44is we have to reference the Google
2:04:46sheet. Then think about it logically.
2:04:48Then we have to reference the item. So
2:04:50go item. Then we have to reference the
2:04:53JSON.js.
2:04:55And then we have to reference the row
2:04:56underscore number if we want to like
2:04:58that. And then we get that data. Okay.
2:05:01So big issue, big misunderstanding I
2:05:04would say with Naden. Um unfortunately
2:05:05their documentation in my experience is
2:05:07not clear enough to really elucidate
2:05:09what's going on here unless you have a
2:05:10programming background. Um but just want
2:05:12you guys to know that this is how it's
2:05:13done when you reference nodes that are
2:05:15more than one module back. If you wanted
2:05:16to just reference something in the
2:05:17previous node, it's a lot easier. You go
2:05:19dollar sign and then you go JS. then you
2:05:23can just go immediately into the
2:05:24variables. Message content or something
2:05:27like that dot subject line for instance.
2:05:30All right, so let's start looking at
2:05:31some of these foundational nodes over
2:05:32here because I think at this point we've
2:05:34done four different workflows and I
2:05:36think you guys probably have a
2:05:37reasonable understanding of how to put a
2:05:38workflow together now as well. Some of
2:05:40the more nuanced portions of NAN like
2:05:42the way that they do their JSON, some of
2:05:44the the nuances behind burying names
2:05:47inside of various keys and how to do
2:05:49arrays of objects and backtrack and all
2:05:51that fun stuff. Let's actually cover
2:05:53like nodes because nodes are ultimately
2:05:54what you guys are going to be using on a
2:05:56daily basis. After we're done that, then
2:05:57I'll I'll rebuild this flow up here and
2:05:59I'll show you guys how all that stuff
2:06:00works under the hood. This will allow us
2:06:03to use some of the more um I guess code
2:06:07oriented features of N&N. Then I think
2:06:09after this point, like you guys have a
2:06:11reasonable enough understanding to build
2:06:12most things. It's just a matter of like
2:06:14what can you build and how exactly do
2:06:15you put the various Lego blocks I've
2:06:17shown you together. That's what the
2:06:18subsequent videos in this course are
2:06:20going to are going to ultimately just
2:06:21show you. It's going to be non-stop
2:06:22building 24/7, baby. Anyway, so let's
2:06:26cover these foundational nodes. The
2:06:27first thing is we're going to cover
2:06:29nodes for doing things. So, HTTP
2:06:30requests, web hooks, and open AI nodes.
2:06:32And we'll cover nodes that modify flows.
2:06:34So, if filter, merge, split into
2:06:35batches. There are a couple of other
2:06:36ones, but these are the ones that we're
2:06:37going to be focusing on, at least for
2:06:39today. So, you know, in terms of nodes
2:06:41that do things, um, if you guys aren't
2:06:42familiar with, um, HTTP request, this
2:06:45stands for hypertext, I don't know,
2:06:47hypertext transfer protocol. And what
2:06:50we're doing when we do an HTTP request
2:06:52is we're doing the same thing that your
2:06:54browser does when it goes to a website.
2:06:56So just like when I go to google.com,
2:06:59I'm sending a request to Google,
2:07:01receiving a bunch of information what
2:07:02this web page looks like, and then I'm
2:07:04using my browser Chrome to render it
2:07:06into the beautiful, wonderful image you
2:07:08have in front of me. The HTTP request
2:07:10does the same thing. It just it just
2:07:11returns the thing to you in the code.
2:07:13You don't have that rendering portion.
2:07:15So I'm going to do a get request here.
2:07:17And the get request is just the simplest
2:07:19and most basic request. And this is
2:07:21ultimately what you're probably going to
2:07:22be using for for most cases. And the URL
2:07:24I'm going to be doing is just my own
2:07:26leftclick.ai. So leftclick.ai just for
2:07:28the purposes of this discussion. Looks
2:07:30like this. We build hands-off growth
2:07:32systems for B2B founders. There's a
2:07:33bunch of information about what our
2:07:34clients get, our leads. The lovely Joe
2:07:36Davies left me a testimonial. I should
2:07:38probably touch this website up at this
2:07:39point. It's been the same for a while.
2:07:40But anyway, I'm just doing an HTTP
2:07:42request using a method get to
2:07:45leftclick.ai I with no authentication,
2:07:47no nothing. We're just going to see what
2:07:48happens. So, let me click that test
2:07:49step. And the response that we've
2:07:51received is again an array of objects.
2:07:54Our one object has a key name data. Then
2:07:57inside of that key name, you'll see that
2:08:00there is a ton of code. HTML it's
2:08:03called. Okay. And just because this is
2:08:05not the easiest to see here, I'm just
2:08:06going to go to schema view so you can
2:08:08see a little bit more of it. But
2:08:09basically, this here is the code of my
2:08:11website. This is what my website looks
2:08:13like to the browsers. um you know and
2:08:15like what ultimately my browser uses to
2:08:17render it. You can see it says leftclick
2:08:19space vertical carrot space AI and
2:08:22amperand. This is just a symbol that um
2:08:24allows it not to break any characters.
2:08:26Process optimization. Left click is an
2:08:28AIdriven performance optimization agency
2:08:30is cutting edge tech to scale your
2:08:31company. This is all the code, right?
2:08:32It's pretty badass. If I were to go to
2:08:34leftclick and then I were to go to
2:08:37inspect, if I were to open this up, this
2:08:40is like the Chrome dev tool which allows
2:08:41you to see the code of the website. It's
2:08:43the exact same thing that's over here in
2:08:46the bottom lefthand corner, right?
2:08:47Literally no differences whatsoever. You
2:08:49built your agency, we'll scale it. The
2:08:51only difference is some symbols like the
2:08:52amperand or maybe the ad sign, they just
2:08:54have like little replacements here or
2:08:56there so they don't break any um string
2:08:57formatting. So that's the HTTP request.
2:08:59Why why does an HTTP request matter and
2:09:02why would we want to do an HTTP request?
2:09:03Well, the reason why is because you can
2:09:05do pretty cool stuff with this. Like if
2:09:08I go um HTML and then I say extract HTML
2:09:11content. What we can do is we could use
2:09:14the code of the page to pull out all of
2:09:16the text. Okay. So why don't I just go
2:09:18text? I'll go P. Uh let's just do H1,
2:09:20H2, H3, H4, H5, H6. Let's do P. I'm
2:09:24going to return this value as text. And
2:09:26then I'm going to return uh let's just
2:09:27test this and see what happens.
2:09:29What we're doing is we're basically
2:09:31feeding in the HTML and then we're using
2:09:33uh various CSS selectors they're called
2:09:35to extract a bunch of text for us. And
2:09:37it looks like I didn't do this right
2:09:38because we're not actually retrieving
2:09:40anything. Let's just try P for
2:09:42now. We'll do this. You're seeing
2:09:45already that we've extracted a bunch of
2:09:48P text. We've extracted basically like a
2:09:50specific type of
2:09:51tag inside this website that starts with
2:09:55a P. Okay. Now, we can do the same thing
2:09:57with a variety of other tags. Let's say
2:09:59I want to do H1. This is going to return
2:10:00all of the um top level selectors
2:10:03basically. So, let's do H1
2:10:06test. We build we build hands-off growth
2:10:08systems for B2B founders. That's pretty
2:10:10cool. If I return an array, let's return
2:10:12all of them. We build hands-off growth
2:10:14systems for B2B founders. A better way
2:10:15to build ops. What our clients get. If I
2:10:17do uh I think if I want to select
2:10:19multiple, I just would I just do P like
2:10:22this. H1 and P. Yeah, there we go. Okay.
2:10:25So now I'm getting all the text of the
2:10:27website. We build hands-off growth
2:10:28systems for B2B founders. Find the
2:10:29perfect offer. Automate your lead
2:10:30acquisition. Solve your project
2:10:31management. A better way to build ops.
2:10:33This is all the text of the website. And
2:10:35all I needed to do in order to feed this
2:10:37in was I basically went through and then
2:10:39I fed in a bunch of elements which I
2:10:40know just correspond to text like this.
2:10:44And then I pressed test step. It went
2:10:45through and it extracted all of them
2:10:47into this big fat array which is really
2:10:49cool. Now like if you think about it, I
2:10:51could actually do some pretty cool stuff
2:10:52with this. I could have AI tell me
2:10:55something about the site very easily.
2:10:57You're a helpful intelligent uh website
2:10:59scraping assistant. We'll go got to add
2:11:03my credential first. We'll go down here
2:11:06and I'm just going to have AI tell me a
2:11:09little bit about this website. Return in
2:11:10JSON just some data. I'll do that as my
2:11:13system prompt. And then here, your task
2:11:15is to take as input a bunch of scraped
2:11:19website text and return as output a JSON
2:11:23that follows this
2:11:26format. I'm going to say summary. I'm
2:11:30going to say three unique
2:11:33points. We'll do an array. We'll do um
2:11:37probable customer demographic. Okay, I'm
2:11:40going to have it return an object. we'll
2:11:43see contact
2:11:45information if any and then we'll do I
2:11:48don't know some sort of like array of
2:11:50objects. Okay. And then that's that's
2:11:53what we're going to have it return.
2:11:54We're going to output the content as
2:11:55JSON and then as input add a message.
2:11:58What we want to do is we just want to
2:11:59join this is um being output as an array
2:12:01right now. Right? Arrays as we see are
2:12:04many options or many different um things
2:12:06on various lines. What we want to do is
2:12:08we want to take all of this output data.
2:12:10We just want to turn it into one big
2:12:12long string. The way you do that here is
2:12:14I would use the expression tab and then
2:12:17I'm just going to add some lines so the
2:12:18AI knows that this is my input. Then I'm
2:12:20just going to go
2:12:21JSON.ext and then dot we'll just go
2:12:24join. Join is just a way to convert an
2:12:26array of items into just one big long
2:12:29string. And the thing you put inside of
2:12:30the join is you just put what you want
2:12:33to separate it by. So in my case, I'll
2:12:35just separate it all with a new line. If
2:12:37I enter the detailed editor here, you
2:12:39can see that now I've just turned all of
2:12:40this into one giant long string. I'm
2:12:43going to feed this into AI and I'm going
2:12:44to have it just tell me something about
2:12:45the
2:12:46website. So, this took us just a few
2:12:48seconds. And we already have a scraper
2:12:50that's basically capable of coming up
2:12:52with and then outputting a summary of
2:12:54what I do, three unique points that
2:12:57separate me from the competition,
2:12:59probable customer demographic
2:13:00information maybe I can use to do
2:13:02something, then contact information if
2:13:04any. And it looks like it separated that
2:13:06into a subobject that says method, book
2:13:07a call, details, get started today,
2:13:09platform, website. As I'm sure you guys
2:13:11can imagine, I spent 15 seconds putting
2:13:13this puppy together. If you guys wanted
2:13:14to maybe scrape emails or do something
2:13:16like that, you could put something
2:13:17together that does this pretty easily.
2:13:19So that's the HTTP request node. Pretty
2:13:21simple, pretty straightforward. The next
2:13:23thing I want to show you is I want to
2:13:24show you basically the inverse of the
2:13:26HTTP request node. Instead of us sending
2:13:28data, I want to show you a quick and
2:13:30easy way that we can receive a little
2:13:32bit of data if necessary. But it's
2:13:34nowhere near as hard as you think. There
2:13:35are a variety of different ways that you
2:13:36could do this, but I'm going to show you
2:13:37guys a really simple and easy one that I
2:13:40personally use all the time. It's called
2:13:41the web hook. So, I'm going to go over
2:13:43here, then I'm going to type a web hook.
2:13:47Starts the workflow when a web hook is
2:13:48called. Basically, what a web hook is is
2:13:51it's just a server URL that you spin up,
2:13:53almost like my website, leftclick. And
2:13:55every time that server gets a request to
2:13:57it, it'll show up here with all of the
2:13:59data. Why is this so valuable? Well, it
2:14:02allows us to do a million things.
2:14:04Connect workflow to workflow, add up and
2:14:06create our own API integrations, do a
2:14:08variety of things that otherwise we
2:14:10wouldn't really be able to do without
2:14:11them. This is basically the glue that
2:14:13holds the internet together. And this is
2:14:14a quick and easy way for you to make
2:14:15your own piece of that. So, this is what
2:14:17the web hook fields look like. We have a
2:14:18test URL, production URL. Don't worry
2:14:20about the distinction there for now.
2:14:21We'll just use test URL. HTTP method we
2:14:24want to allow to access our service.
2:14:26Think we might actually allow multiple.
2:14:27One of these I think allows us to do
2:14:29multiple, but we're just going to go
2:14:31with get for now. The path, we're going
2:14:32to leave the path as fixed. The path is
2:14:34just this URL string. Authentication,
2:14:36we're going to turn this off. We don't
2:14:37want any authentication. They recommend
2:14:39that you have authentication, but for
2:14:40simplicity sake, I'm just not going to
2:14:42have any because otherwise it might be a
2:14:43little bit too much at once. Then we're
2:14:45going to do respond immediately. What
2:14:47I'm going to do is I'm going to set up a
2:14:48test event for this URL. Okay. Actually,
2:14:50I don't know if I can do this within the
2:14:52same workflow. Actually, no, I can't
2:14:53because the workflow is already running.
2:14:54So, I'm actually going to make another
2:14:55workflow really quickly. And I'm going
2:14:57to use that to call this web hook to get
2:14:59some cool data. So why don't I create a
2:15:02workflow. We'll just call this three
2:15:04nadn concepts. And then we'll go web
2:15:07hooks http
2:15:09requests. I'm going to make a new HTTP
2:15:12request here. It's going to get this
2:15:14long thing that I've done over here.
2:15:16Okay. I'm going to test it. Then over
2:15:18here I'm going to grab that data. And as
2:15:21you can see like what just happened if
2:15:22you were paying close attention is this
2:15:24just ran. The second I sent the data
2:15:25from this node which is in another
2:15:27workflow over to this node which is on
2:15:29the current workflow we received a ton
2:15:31of info and the info that we received
2:15:33was received a big object one item
2:15:35inside of our array of objects here. So
2:15:37a single object with a key name headers
2:15:40which had a bunch of other data
2:15:42underneath params query body web hook
2:15:45URL execution mode test. So this might
2:15:48look a little bit dry and a little bit
2:15:49boring to us right now but what's the
2:15:51value here? The value is you can run
2:15:53something from one workflow, send it to
2:15:54another workflow really easily. So in
2:15:56our our first example, we sent no data.
2:15:58But what if I go back to my other
2:16:00workflow, okay, that's number three
2:16:02here. And then I send some query
2:16:03parameters and I say first name and I
2:16:06say Nick. Then I go here a last name
2:16:10surive. And then here maybe I go UU ID.
2:16:13That's just like user ID. And then I
2:16:15type something like this. Now if I go
2:16:17back here, then I listen for a test
2:16:20event. I go back here and then I send
2:16:21the test event. Now when I receive it,
2:16:24not only do I get the headers, sorry,
2:16:27the headers over here, not only do I get
2:16:28the params inside of our query are the
2:16:32variables that I just sent over inside
2:16:33of JSON. First name, last name, UU ID.
2:16:36So man, I can do so many cool things
2:16:38with this. It's crazy. I could connect
2:16:41this to any web service out there. just
2:16:43give this URL as the URL where the
2:16:46events are sent and then voila, I
2:16:48basically have like an infinite machine.
2:16:50I'll show you guys a quick example right
2:16:51now using
2:16:53ClickUp, but you guys can extend this
2:16:55example and do whatever the hell you
2:16:56want with it. So, ClickUp is just this
2:16:59project management platform that I have
2:17:02that allows you to send out web hooks.
2:17:03And most services that are good will
2:17:05allow you to do stuff like this. But you
2:17:07see there's a call web hook feature
2:17:09here. I'm going to go back to my web
2:17:11hook and I'm going to copy this URL.
2:17:14Now, this is for get only. I don't
2:17:15actually remember if ClickUp sends a get
2:17:17or a post. So, we're going to see what
2:17:18happens here. And then what I'm going to
2:17:20do is I'll just have status change.
2:17:24We're going to say from specifically
2:17:27hook to specifically
2:17:31outline. And we're going to create this.
2:17:33And basically what this means is when I
2:17:34change a field called status inside of
2:17:36my my project manager, it sends a web
2:17:38hook over to this
2:17:40address. So hook to outline find
2:17:42something that's hook. Maybe this one
2:17:44here. Now what I'm going to do is I'm
2:17:45going to go over here, listen for a test
2:17:46event. Then I'm going to change this to
2:17:48outline. And I don't remember if it's a
2:17:50get or a post request. So we might have
2:17:52to wait and try two or three. This
2:17:55unfortunately does not respond to the
2:17:56methods that are not the same. methods
2:17:59are, you know, kind of a deeper story,
2:18:00but basically there are variety of ways
2:18:02you can query a website or a web
2:18:04service. HTTP, most commonly, you'll do
2:18:06either a get or a post. Um, in this
2:18:10specific instance of ClickUp, it looks
2:18:11to me like they're probably using post.
2:18:12So, I'll go HTTP method. I'll go
2:18:14post. Now, I'll listen for this test
2:18:16event. I'll change this back to
2:18:19hook. Then, I'm going to change this
2:18:21back to outline. And now that it's
2:18:23outline, um, we're waiting for this this
2:18:25post request. Let's see if we we are
2:18:27receiving it from ClickUp. Okay, great.
2:18:29Looks like we received it. Now, what did
2:18:32we receive in reality? Well, excuse me.
2:18:34I'm like really close to sneezing, but
2:18:36I've decided not to, so I won't. Uh,
2:18:39before we updated the query field, now
2:18:41we're updating the body field. We see
2:18:42it's built into ClickUp. What we did,
2:18:44ClickUp has a number of default things
2:18:46that they send over when you do this web
2:18:48hook integration. One of them is the ID
2:18:49of the record. Now there's the trigger
2:18:51ID ID the trigger payload ID the name of
2:18:54the thing which was three chat GBT
2:18:56prompt engineering hacks you need to
2:18:57start using next some hooks some order
2:19:01in text some information about the
2:19:03person that created it the point that
2:19:04I'm making is we just created our own
2:19:05integration with ClickUp and it took me
2:19:07like 30 seconds realistically after I
2:19:08got off the HTTP method hump so in
2:19:11practice sometimes APIs like ClickUp I'm
2:19:14sure they have API documentation
2:19:15somewhere but sometimes they just don't
2:19:16tell you right at the point of creating
2:19:18the web hook whether it's going to be a
2:19:19get or a post request. So if your get
2:19:21request doesn't come in, just change the
2:19:22HTTP method to post and then rerun it
2:19:25with the post uh example and then one of
2:19:27those will work, which is pretty cool.
2:19:29Okay, so that's how you do it as a test
2:19:31URL. Ultimately though, we don't just
2:19:33care about having this workflow be sort
2:19:35of a test. We want it to be live. And so
2:19:36when your workflow moves to production,
2:19:39aka you publish it and you make it live
2:19:41to actually interact with the internet,
2:19:42you're going to want to go over to this
2:19:43production URL and then copy this URL
2:19:46and update all of your web hooks to send
2:19:47here. And this will enable you to
2:19:48activate this. If it's in test mode, you
2:19:50actually won't be able to activate this.
2:19:52Um, just I guess for safety or security
2:19:54purposes. It just makes the transition
2:19:56to publish it unfortunately involve an
2:19:57additional step, but it also makes your
2:19:59workflows a little bit more secure. So,
2:20:02that's how you do web hooks. The last
2:20:04thing I'll mention are these OpenAI and
2:20:05AI nodes. Now, I'm going to have many,
2:20:07many videos after this one be all about
2:20:10AI agents since that's obviously the big
2:20:11thing that's blowing up right now. What
2:20:13I'm going to do here is I'm just going
2:20:15to cover them super super briefly. I'm
2:20:17not even going to like run anything, but
2:20:18I just wanted to show you guys that NAN
2:20:20is very AI native. And so whereas I've
2:20:23been doing some very basic um OpenAI
2:20:25calls with this OpenAI module, there's a
2:20:27variety of things you could do. You
2:20:28could create an AI agent which generates
2:20:30an action plan and executes it. Uses
2:20:32external tools. You can have Open AAI
2:20:34message and assistant or GPT. This is
2:20:36what we've been using. Some basic LLM
2:20:38chains and a bunch of like specific
2:20:40tools that are used to do things like
2:20:42categorize information, summarize
2:20:44information, and so on and so forth. AI
2:20:46agent. Just to give you guys a very
2:20:48brief example, probably is one of the
2:20:50most intimidating looking modules or
2:20:51nodes, but it's actually one of the
2:20:53simplest in practice. When you create an
2:20:55AI agent, it'll automatically open up
2:20:57this when chat message receive node on
2:20:59the side. And then you'll see that down
2:21:00at the bottom of my screen, there's an
2:21:01additional button that allows me to chat
2:21:03with my with my model. But in order to
2:21:05make this work, what we need to do is we
2:21:07need to hook this up. Notice how there's
2:21:08this little um warning here. What we
2:21:11need to do is we need to go down to chat
2:21:12model. We actually need to select the AI
2:21:14module or AI node that we want the AI
2:21:17service I should say that we want to
2:21:18use. For most intents and purposes, I
2:21:21use OpenAI. This is just the best to me.
2:21:23But you could use O Lama, Mistral,
2:21:25Google, Gemini, Anthropic. Feel free to
2:21:27play around with this for whatever your
2:21:28use case is or whatever your data
2:21:29privacy security requirements are. So
2:21:32I'm going go down to my Open AI chat
2:21:33model. The model I'm going to be using
2:21:34for this is going to be GBD40. I just
2:21:36find it has better answers. And then now
2:21:39you'll see that the warning sign is
2:21:40gone. Now we have an additional node I
2:21:42can drag and drop here. And now I can go
2:21:44to chat and I could say, "Hey, how are
2:21:46you doing?" We've essentially opened up
2:21:47our own chat window. Hey, I'm just a
2:21:49computer program, but I don't have
2:21:51feelings, but I'm here and ready to
2:21:52assist you. Thanks, Chat GPT. And on the
2:21:54right hand side, probably the most
2:21:55valuable part about this is you could
2:21:56see a log of what is happening and how
2:21:58many nodes were called in order to get
2:22:01you the result. This is important
2:22:02because the whole point of AI agents is
2:22:04their ability to call other tools to do
2:22:06things for you. So this says system your
2:22:09helpful assistant human hey how are you
2:22:11doing? This is just their prompt setup.
2:22:12So the input to open AAI was this right
2:22:16here. And because we just asked how it's
2:22:18doing and so on and so forth um you know
2:22:20it didn't it didn't really do anything
2:22:21special. There were no additional tools.
2:22:22This is the same thing as you just
2:22:24sending a message to chat GBT
2:22:25essentially. Now in order to make an AI
2:22:28agent like really work you're going to
2:22:29want to add two things. The first thing
2:22:31you're going to want to add is you're
2:22:31going to want to add some sort of
2:22:32memory. If an AI agent doesn't have
2:22:34memory, then basically if I go back here
2:22:37to chat and then say, "What did I say in
2:22:40my last
2:22:41message, it will have no context or no
2:22:44idea. I don't have any access to past
2:22:46messages or personal data. Each session
2:22:48is independent." Basically, this is like
2:22:50a one it's like it's like a send a
2:22:52question, receive an answer sort of
2:22:53window. But we don't want that. We want
2:22:55this to actually have access to our chat
2:22:56history. We want it to see what we've
2:22:57been talking about over the course of
2:22:58the last like 20 or 30 minutes and be
2:23:00able to reference those. So, there are a
2:23:02variety of ways to do this. Basically,
2:23:03you need to implement some sort of
2:23:04database. I'll show you guys how to
2:23:05implement some more complex databases in
2:23:07the future, but the simplest one, the
2:23:08one that Naden provides right out the
2:23:10gate, the one that most people on
2:23:11YouTube are going to be talking about is
2:23:12this window buffer memory. Window buffer
2:23:14memory basically just allows you to
2:23:16store it here inside of the test window,
2:23:18which is the easiest to do. And the
2:23:20default is five messages. So, u
2:23:23basically every time you send it a
2:23:24message, it will send up to five pass
2:23:26messages. But just for the purpose of
2:23:28this discussion, I'm going to go 10. So
2:23:29now what I'm going to do is I'll go to
2:23:31chat and then I'll say hey how are you
2:23:34doing and I'm going to say what did I
2:23:37ask you in my previous message and
2:23:40you'll see that it's asking how it's
2:23:42doing right so we're actually now
2:23:43accessing the previous message using
2:23:46this buffer memory and on the right hand
2:23:48side you'll see here that the log has
2:23:50gotten a little bit more intense too so
2:23:52basically we called the AI agent up at
2:23:53the top the next thing that happened was
2:23:55we went through the buffer memory we fed
2:23:58this in and basically basically added
2:24:00this to some big long stack of message
2:24:02history. Then we fed that in plus the
2:24:05previous message. Then we said, "Hey,
2:24:07what did I ask you in my previous
2:24:09message?" This is the input that is
2:24:10currently being fed into the model on
2:24:12that second call. And then we went down
2:24:14into buffer memory. We saved all of this
2:24:16again. And then uh we kind of came up
2:24:18and then and sent the answer. How about
2:24:22now? Cool. So now we're three levels
2:24:25deep. And as you can see, this is just a
2:24:26quick and easy way to load the memory.
2:24:28make sure that we're always having some
2:24:29sort of topical contextual conversation,
2:24:31which is pretty cool. Now, the real
2:24:34juice in AI agents, the reason why
2:24:35they've gained so much popularity is
2:24:37just because of this tool section here
2:24:39where you can essentially call an action
2:24:41just like we were doing before
2:24:42procedurally, but you can call it using
2:24:44AI and you can automatically format and
2:24:46get information from different tools.
2:24:48So, there are variety of tools that are
2:24:49just sort of set up for you. Air table,
2:24:51base row, calculator, Gmail, Google
2:24:53calendar, Google Docs, Google Drive, all
2:24:55this stuff.
2:24:57What I'm going to do in this example,
2:24:58just because I don't want to spend all
2:24:59day on it um before I do my more
2:25:01detailed AI agent tutorials, is I'm just
2:25:03going to select Google Calendar. I'm
2:25:05going to create a new credential, sign
2:25:06in with my Gmail
2:25:09account, and then I'll go over
2:25:11here. I'll close this window. Now that
2:25:15I've uh I've connected my Google
2:25:16calendar agent, what I'm going to do is
2:25:18I'm going to select my specific
2:25:19calendar, which is nick
2:25:21leftclick.ai. And then now that it's
2:25:23connected to my AI agent, this is the
2:25:25create event. I don't want to create, I
2:25:27just want to get. So get all of my
2:25:28events basically from my calendar. Okay.
2:25:30And then in addition to that, what we
2:25:31have to do is we have to use this dollar
2:25:33sign from AI feature here. And we just
2:25:35have to paste that into the expression
2:25:36field. Um what this does is this just
2:25:38tells AI, hey, I want you to provide uh
2:25:41you know your own details for the value
2:25:43of a field. In our case, I wanted to
2:25:45feed in some options that say, hey, you
2:25:47know, I want you to grab data that is
2:25:49after this date, but before this date.
2:25:52So, if I'm asking
2:25:53AI like, "Hey, what's going on? Can you
2:25:57tell me what I'm doing tomorrow?" And
2:25:59I'll just say, "Jan 28, 2025." The whole
2:26:01idea here is AI now has access to my
2:26:03calendar. It also has the ability to
2:26:05call that API. Then it can actually go
2:26:07and retrieve specific events from my
2:26:09calendar and then return them here. So,
2:26:11as you can see, I have this call uh me
2:26:13and my my buddy Zach. And then it just
2:26:14has all of this information. Okay,
2:26:16great. How are you more generally? you
2:26:19know, I can also just chat with it like
2:26:20I'm chatting to chat GBT or something
2:26:22like that. So, I don't always have to
2:26:23use like the tool that I'm I'm calling.
2:26:25And the idea is you basically stack on
2:26:273, four, 5, 10, 15, 20 of these tools.
2:26:30Although, I find in practice when you
2:26:31get um past maybe six or seven, instead
2:26:33of calling a tool, what you want to do
2:26:34is you want to call another agent which
2:26:36then decides to call a tool. It's
2:26:37basically like a big almost like a
2:26:38search tree or something. But any more
2:26:40or less the AI side of things. The last
2:26:43thing I'll mention here is uh this
2:26:44OpenAI note doesn't just have the
2:26:46message a model text action like we've
2:26:48been doing before. There's a variety of
2:26:49other things you could do. You can
2:26:50create an assistant, delete an
2:26:52assistant, list assistance, message
2:26:53assistance, update assistance, analyze
2:26:55images, you can generate images,
2:26:57generate audio. Like you have a ton that
2:26:58you could do here, which is pretty
2:26:59sweet. I go down to generate audio and
2:27:02I'll say um I don't know, Nick is
2:27:05awesome and very pretty and I generate
2:27:07it using the Nova voice. Click this test
2:27:10step. Not only can I generate text and
2:27:13stuff like that, but I can also have
2:27:14this generate me an audio output I can
2:27:16then listen to. Variety of cool things
2:27:18you can do with this. Nick is awesome
2:27:20and very pretty. You're damn right I am.
2:27:23Um variety of cool things you can do
2:27:24with this, but definitely don't sleep on
2:27:26the AI nodes. Uh you know, don't just
2:27:28like stick to the one that I've shown
2:27:29you guys so far. Okay, great. So, those
2:27:31are the foundational ones. In practice
2:27:32with NAN, you're probably going to be
2:27:34using these quite often. What I'll do
2:27:35next is talk about some nodes that
2:27:36modify flow. And here are a bunch more
2:27:38that like you're going to want to read
2:27:39their docs and add them to your toolkit
2:27:41because this is like an everyday sort of
2:27:42thing. The first is an if. The second is
2:27:45filter. The third is merge. And the
2:27:46fourth is split into batches. So let me
2:27:49show you guys a very quick and and
2:27:51simple example of the if. If I go
2:27:53here and then I add my own trigger. Uh
2:27:56and I just want to trigger manually. Oh,
2:27:58sorry. It looks like I already have one
2:27:59somewhere in here. Right. So let's just
2:28:01repurpose this um manual trigger for an
2:28:04example workflow that I'm going to build
2:28:06down below.
2:28:07this example trigger. I'm going to click
2:28:09it. And then what we're going to do is
2:28:11we're going to use the edit
2:28:13fields. We're going to go down to JSON.
2:28:16This is just a handy dandy tool that
2:28:17allows you to set your own inputs and
2:28:19outputs. So I can now set my own um
2:28:21output. And I could say first name Nick,
2:28:25last name uh Sarif. And if I if I test
2:28:28this, if I test my whole workflow,
2:28:29you'll see this broke because um Sarif
2:28:31was not in quotes there. Got to make
2:28:33sure that all of your strings are in
2:28:34quotes. If I check out the JSON, you see
2:28:36the output of this module is now first
2:28:37name, Nick, last name, surf. Okay, I'm
2:28:39just going to pin this. Now, let's say I
2:28:41want to do something else, you know, if
2:28:43the if the input is Nick, I want to do
2:28:47something really cool. I want to provide
2:28:50prize. I don't know, um,
2:28:53$100. If the input is Nick, I want to go
2:28:56through my my sequence and then I want
2:28:57to generate another variable called
2:28:59prize, and I want to I want to have it
2:29:00be $100. Okay. But I only want to do
2:29:03that if the input is Nick. If the output
2:29:05is something else, then I want to have
2:29:10my prize be just $5. So Nick gets all
2:29:13the prizes here. He's very greedy. Okay.
2:29:15So how do you actually implement this
2:29:16sort of logic? Well, the simplest way is
2:29:17if I click this plus button and I just
2:29:19type if, you'll see I'll have this node
2:29:21pop up that says if wrote items to
2:29:23different branches, true or false. So
2:29:24I'm going to add that in there. And what
2:29:26I'm going to say is if first name, which
2:29:28by the way, we could still just drag if
2:29:29we wanted to. could say if first name is
2:29:31equal to Nick then proceed through the
2:29:35true node which is up here and if not
2:29:39we're going to want to proceed through
2:29:40this false node. Isn't that cool? So now
2:29:43we basically have two things that are
2:29:45occurring. Okay, prize up here was 100.
2:29:48Prize down here was five. I'm going to
2:29:51click test workflow. This is now going
2:29:53to run and I just want you guys to see
2:29:55what's happening. I clicked test
2:29:56workflow. We then edited our fields. We
2:29:58added Nick as the first name. We then
2:30:01went to the if and then as we saw here,
2:30:04first name was equal to Nick, meaning
2:30:06oops, if I double click this again, the
2:30:09output is now only going down the true
2:30:11branch with one
2:30:13item. And then the uh upper branch was
2:30:16illuminated. It's green. And then that's
2:30:17how we get to edit fields with the prize
2:30:19equal to $100. Now, if I change this,
2:30:21instead of Nick, if it's like Sally or
2:30:24something, and if we run this again,
2:30:27what you'll see is the
2:30:29data is flowing through here cuz I
2:30:31didn't unpin it. So, let's unpin it. If
2:30:33we if we test this now, uh what you'll
2:30:35see is the data didn't go through the
2:30:36top uh route anymore. Went through the
2:30:38bottom route. Okay, great. So, now with
2:30:39this example here, why don't we just
2:30:41pretend like we're emailing somebody.
2:30:43So, I'll go draft an
2:30:45email. I'm going to create my thing here
2:30:47and we'll say congrats you won. Good
2:30:51expression. Then what I want is dollar
2:30:53sign
2:30:54Jason.prise right over here. So like
2:30:57congrats you won $5. How cool is that? C
2:31:01title
2:31:03loser. Uh okay, great. And then I'm
2:31:05going to go here and I'm going to create
2:31:06a
2:31:07draft. Voila. I have it. Now if I go
2:31:09back here to my SOS media queries page,
2:31:12see it says, "Congrats, you won $5."
2:31:14There's nobody to because we didn't set
2:31:15the email to. But pretty neat, huh? We
2:31:18gave the same thing with this $100
2:31:22field. Go over here. You'll see that I
2:31:24just copied like all of the same logic.
2:31:26It says, "Congrats, you won Jason.
2:31:28Prize." It's grayed out right now
2:31:29because there's no data coming in. But
2:31:31you'll see that it'll work if I change
2:31:32the um input back to Nick. Then if I
2:31:35test this, I'll see it'll follow the top
2:31:37route and then also send me an email.
2:31:39Okay, great. So now let's look to use
2:31:40the filter node. Um, what I have here is
2:31:42I have my little first name Nick here.
2:31:45Um, what I'd like to do instead is I'd
2:31:46like to just change this a little bit.
2:31:48So, instead we'll create an array of
2:31:51names. And inside of this, we'll have
2:31:53Sally, John, and then Nick. Okay. And so
2:31:57now, if we test this, we see three
2:31:59entries in an array called names. We
2:32:01have our top level array, which contains
2:32:02an array of objects, and we have our
2:32:04object. And inside of that, we have key
2:32:06whose value equals a list of other
2:32:08objects or an array of other objects. I
2:32:09know the terminology can be kind of a
2:32:11lot and unfortunately there are many
2:32:13ways to refer to the same thing. So if
2:32:15something doesn't make sense just bear
2:32:16with me here and we'll in a moment.
2:32:17Okay, great. So let's say what we want
2:32:20to do if this names array includes Nick
2:32:23then um I want to continue with the
2:32:25flow. So I'll go array. Then what I want
2:32:28is I want to see if this array of of
2:32:30names feed that in here contains and I
2:32:34just want to say Nick. I'm going to test
2:32:36this out. What you'll see is that we've
2:32:39kept it because it does in fact contain
2:32:41Nick, which is pretty cool. If instead
2:32:43we wanted to see if it contains Peter,
2:32:44we test this. You'll notice that we are
2:32:46now following the discarded route. Okay,
2:32:49there's kept and then there's discarded.
2:32:51The thing is um it just goes down the
2:32:52same flow. Whereas if sort of split into
2:32:55two, there's a true and a false route.
2:32:56Uh this one actually just like continues
2:32:58and proceeds down the same flow. If
2:33:00something matches the filter, it will
2:33:01continue. Something doesn't match or the
2:33:03fil match the filter, then it won't. So,
2:33:05what we could do, if I just paste in
2:33:07this Gmail node, so we could basically
2:33:09build uh a very similar flow, but what
2:33:12we could do is if it is kept, then we
2:33:14could send a prize of $100 instead. We
2:33:17could hardcode that $100 in. So, I'm
2:33:19going to do is I'm going to check to see
2:33:20if it's kept. Okay, so right now name
2:33:21contains Peter, it's probably not going
2:33:22to be kept, right? So, test workflow.
2:33:24It's going to stop right here. Does not
2:33:26proceed any further. If instead I change
2:33:28the filter so that it contains Nick,
2:33:29then we test it. What we see is we're
2:33:31going to move on and we're actually
2:33:33going to like proceed with the rest of
2:33:34our flow. So, this filter here just
2:33:36allows us to kind of stop if it doesn't
2:33:38match our condition or or continue. And
2:33:40you can add as many conditions as you
2:33:41want. You can go and or or um you can
2:33:43add whatever sort of logic you'd like. I
2:33:45used array logic here too, but there's
2:33:47also a lot. There's like string. You
2:33:48could check to see if something exists
2:33:49or matches array x, number, date and
2:33:52time, boolean, array, and then there's
2:33:54also a bunch of object ones as well. So,
2:33:57that's filter. Pretty straightforward.
2:33:58But I would say the last thing is two
2:34:01more. There's one called merge and then
2:34:03there's split into batches. What I'm
2:34:04going to do here is I'm going to have
2:34:06two routes or two outputs of a module
2:34:08and then I'm going to combine them back
2:34:10into one. And I'll show you guys what I
2:34:11mean by this. Remember earlier how we
2:34:13had some HTTP requests. What I'm going
2:34:15to do is I'll go first name
2:34:20Sally and I'm going to
2:34:23have let's just say second name.
2:34:26Actually, let's
2:34:28go person one. Go person two. Just for
2:34:32the purpose of this example, we're going
2:34:34to have two people. Person one, Sally.
2:34:35Person two is Nick. Okay. Next, what
2:34:37we're going to do is we're going to add
2:34:38an AI node. You going to down to open
2:34:41AI. And I'm just going to message a
2:34:42model. Then here, I'm going to say write
2:34:45a
2:34:46detailed fun story about. What I'm going
2:34:49to do is I'll go I don't know person
2:34:52one. So, JSON.person one. This example
2:34:55is sort of silly if I'm honest because
2:34:57we could just hardcode the names in
2:34:58there. But I just wanted to do this to
2:35:00show you guys how this logic of the
2:35:02merge node would work. I'm going to
2:35:04select
2:35:06GPT40. And then I'm, you know, because
2:35:08this is just a very quick and easy
2:35:09example, I'm actually going to add a
2:35:10user
2:35:12prompt. Okay, it's now going to go and
2:35:14it's going to write me a fun story about
2:35:15Jason.person one. Person one was Sally.
2:35:18So, we're going to see it in a
2:35:20second. Very fun. Thank you very much
2:35:22for the detailed story.
2:35:26Q Jeopardy
2:35:28music Q other elevator
2:35:31music. All right, it's taking its sweet
2:35:33ass time. Could be for a variety of
2:35:34reasons. I might have like a little bit
2:35:35of rate limit action going on on my end
2:35:37just because of all the examples that I
2:35:38provided, but could also be something
2:35:40else. I don't
2:35:42know. Let's see
2:35:45here. Okay, cool. Looks like it did once
2:35:47upon a time in the vibrant city of
2:35:49Elmssworth, where the streets hummed
2:35:51with the rhythm of hopeful dreams and
2:35:52endless possibilities. Okay, so we just
2:35:54uh you know we just wrote a cool story
2:35:56about Sally. What what you can do in N8
2:35:58is you can actually connect the same
2:36:00output to multiple um multiple future
2:36:03nodes. So what I've done is I've you
2:36:05know I have one over here which I'm
2:36:06going to rename write story about uh
2:36:10Sally. Then I have another one over here
2:36:12which I'm going to say write story about
2:36:16neck. Then down over here, I'm going to
2:36:19say write a story about person two
2:36:22instead of person one, which is, you
2:36:23know, now going to equate to neck,
2:36:24right? If I test the step, same thing's
2:36:26going to happen. It's going to call
2:36:28GPT40, it's going to write me a cool
2:36:30story. The issue is if you think about
2:36:32it logically, we now have two routes. We
2:36:35have one top route that writes a story
2:36:36about Sally, another bottom route that
2:36:38writes a story about Neck. Um, so if we
2:36:40wanted to do something with these
2:36:41stories, like I'd kind of have to repeat
2:36:42the same logic up here. Let's say I
2:36:43wanted to email this to somebody. Well,
2:36:45I'd have to Gmail up here. and I'll set
2:36:46to Gmail down here, right? I have to
2:36:48duplicate it. And it then provides a
2:36:50pretty simple and easy built-in way to
2:36:51avoid that. It's called the merge node.
2:36:53So, you can merge data of multiple
2:36:54streams once data from both is
2:36:56available. So, if you just click on it,
2:36:58you'll see that there's a mode append or
2:37:00combine or SQL query. I'm just going to
2:37:03stick with append for now. I'm just
2:37:06going to feed in these
2:37:08inputs. And in this way, what I can do
2:37:10is I could actually just write, you
2:37:12know, one Gmail node here instead of
2:37:14two. Um, and maybe I could like append
2:37:16both of these stories or something. But
2:37:18let me actually show you um what this
2:37:20looks like. Now, I'm actually going to
2:37:21test this workflow from end to end. So,
2:37:23you see it first does the top route and
2:37:25you can see this is orange because it's
2:37:26like filling out the um story about
2:37:29Sally right now. This is currently
2:37:30active. It's waiting to fill in the
2:37:32merge the second this is finished. And I
2:37:34think I probably should have set some
2:37:35character limit to the story cuz now I'm
2:37:36thinking about I was probably writing a
2:37:38lot of my
2:37:40tokens. And then after it's done with
2:37:43the story about Sally, it's gonna go and
2:37:46just gonna do the same thing. Write a
2:37:47story about Nick. Um hopefully this
2:37:49finishes before the next ice age. Okay,
2:37:50that took way too long, but uh just make
2:37:52sure you put in some sort of limits next
2:37:54time you do one of these calls.
2:37:55Otherwise, you'd be waiting here until
2:37:56the end of time. However, what we see as
2:37:59our final product is the top route
2:38:01completed and then populated the merge
2:38:03and the bottom route also completed and
2:38:04populated the merge. Now we had one item
2:38:07from a top route, one item from the
2:38:08bottom route. Then we also carried
2:38:10forward one end from the top route, one
2:38:11item from the bottom route. But what
2:38:13you'll see is the output of this merge
2:38:14is now two items instead of one. The
2:38:16reason why it's two items is because we
2:38:18use the the append. So now we have uh
2:38:21you know the story number one and we
2:38:22have the story number two. Basically we
2:38:25don't actually have to just output two
2:38:26things. We could actually just output
2:38:27like one item instead. Um but because in
2:38:29N8 um outputs are arrays of items, you
2:38:33kind of have a choice there. Now, since
2:38:34we output two items, what we could do is
2:38:36we could add our little Gmail node.
2:38:38Stick that down here. Connect
2:38:41it. Then I'm just going to pin this. And
2:38:45what I could do is I could email myself
2:38:47this
2:38:49story. I could say story about just cuz
2:38:51I back myself into a corner here. I need
2:38:53to write kind of like a little bit more
2:38:54difficult of a line of code. But I don't
2:38:57have access
2:38:58to Nick here, right? Like I don't have
2:39:00access to a single variable that
2:39:02contains the value that I'm looking for.
2:39:03So this is person one, Sally, person
2:39:04two, Nick. So I mean I could select
2:39:06person one, but then my second run would
2:39:10also say Nick, right? So both of these
2:39:12would say story about Sally, story about
2:39:14Sally, even though they'd have different
2:39:15stories. So what I'm going to do is I'm
2:39:16going to say I'll look at the actual
2:39:19story. So I'll go
2:39:23uh sorry, I'm going to go to the merge.
2:39:24I'll look at the actual story here,
2:39:28which now that I think about it is
2:39:29actually just JSON. Then I'll go
2:39:31message. I'll go content. Then if it
2:39:33includes the term
2:39:36Nick, then I'm just going to return
2:39:38Nick. Otherwise, I'm going to return
2:39:40Sally. That's how that works. So if this
2:39:43contains Nick, I'll return Nick. If not,
2:39:45I'll return the ter I'll ret the term
2:39:48Sally. This is just a kind of a
2:39:49shorthand way to use the if um else
2:39:52logic. Same as what we had before. So,
2:39:54I'm just going to pop this puppy
2:39:57open. Um, and let me take a look at the
2:40:00data. Story about Nick. Nick was an
2:40:02ordinary guy with an extraordinary
2:40:04dream. I wanted to become the first
2:40:05person to ride a unicycle all the way
2:40:06across the United States. Then Sally,
2:40:09uh, Once Upon a Time in the quaint town
2:40:11of Lavender Hill, I think, uh, this was
2:40:13the one where I timed out or something
2:40:15because of the rate limit,
2:40:16unfortunately. So, it doesn't look like
2:40:17it generated me anything more than Once
2:40:19Upon a Time in the Quaint Town of
2:40:20Lavender Hill. But, I'm sure we could.
2:40:22Yeah, like I could rerun this. Let me
2:40:24just make sure that the prompt is a
2:40:26little bit
2:40:27shorter. Less than 100 words. Let's just
2:40:30do
2:40:32that. And then good. Uh, awesome. We
2:40:36should be good now to actually produce
2:40:37this puppy. Let me just go over here and
2:40:40delete
2:40:41these examples that I don't need in
2:40:44preparation for the next run. And cool.
2:40:47We We warmed up two
2:40:49Gmails. Now we have a story about Sally,
2:40:51who's a curious hamster. And then I am a
2:40:53curious inventor. Lovely. Wonder why uh
2:40:56they use the term curious both times. H.
2:40:59But anyway, I hope you guys see now that
2:41:00like basically the merge connects two
2:41:02things together. The if statement sort
2:41:03of does the opposite. It kind of creates
2:41:04two routes,
2:41:06right? Yeah. This is kind of neat when
2:41:08you contrast and compare them like that.
2:41:11So I believe now uh we have everything
2:41:13we need except for the split into
2:41:15batches run. Split into batches is kind
2:41:17of a a little trickier of a thing to
2:41:19conceptualize. So, I'm going to show you
2:41:20a real example from a source that I used
2:41:22to extract a bunch of data. So, let me
2:41:25take a quick peek here at
2:41:27um I think I was doing depersonalization
2:41:30system. Yeah. So, I created a video on a
2:41:32depersonalization system a while ago and
2:41:34as part of it um what I'm doing is I'm
2:41:36waiting over here for data to come in
2:41:38through a web hook. I send in data to
2:41:41this web hook and then I use it to call
2:41:43an API that gets a bunch of data set
2:41:46items. The data set items are pretty
2:41:48big, right? As you can see over here,
2:41:49it's a bunch of data about specific
2:41:50leads. But notice how it says 128 items
2:41:53above, right? Anytime you output more
2:41:55than one item in N8N, what you can do is
2:41:58you could loop over every item. Then you
2:42:00could perform something individually on
2:42:02just that item. And then once you're
2:42:05done with that, you could go back to the
2:42:07loop over and over and over and over
2:42:08again until you're completed. So in my
2:42:10case, I had a lot of items in this. I
2:42:14had 128 for Christ's sake, right? And
2:42:16what I wanted to do is I wanted to run
2:42:18my five column personalization flow
2:42:19similar to what we saw earlier. And then
2:42:21I also wanted to add a row to my
2:42:22spreadsheet. Now unfortunately every
2:42:24time I did that I consumed one API uh
2:42:27call and a lot of these platforms have
2:42:29pretty intense rate limits. So instead
2:42:32of me um one issue I always found I
2:42:34found very frequently was I just kept on
2:42:36getting timed out. It would say 400
2:42:37error or 403 error or whatever.
2:42:40Basically, the gist of that is that, you
2:42:42know, I'm over the rate limit and
2:42:44they're not going to allow me to make
2:42:44any more requests for a certain amount
2:42:45of time. So, what I did instead is
2:42:47instead of me just submitting all of
2:42:49those requests simultaneously, I added
2:42:51this to a loop over items and then I
2:42:52added a designated weight node. The
2:42:55weight node is a simple node in N that
2:42:57allows you to wait for a certain number
2:42:58of seconds. In my case, five. And in
2:43:00this way, I was able to basically take
2:43:02one item, go from start to finish, wait
2:43:055 seconds, and then loop back and then
2:43:07proceed with my next item. And I
2:43:09basically just went, you know, one after
2:43:11the other after the other after the
2:43:13other over and over and over and over
2:43:15again. So that's just to give you guys
2:43:17some context on on what that actually
2:43:18might look like. If I go down
2:43:20here and I set um my items here, I'm
2:43:24just going to use a future a feature in
2:43:25NAN that allows you to automatically set
2:43:27like your own test data. So I'm going to
2:43:29say, you know, there's there's first
2:43:31item and then there's second
2:43:33item and my data for that. Where is the
2:43:36edit fields? Right over here.
2:43:39If I zoom way in, you'll see that I'm
2:43:42not outputting two items, right? So,
2:43:44what I can do is I can go loop over
2:43:45items, split in batches. You set the
2:43:48batch size to one. What it'll do now is
2:43:51it will go first item and then second
2:43:53item. What I'll do is when you add a
2:43:56loop over items, it immediately adds a
2:43:57replace me node. And this is what you're
2:43:59supposed to basically replace with the
2:44:00thing you want to do. So, in my case, I
2:44:01just want to wait 5 seconds. So, I'm
2:44:03just going to go over here and go wait.
2:44:06wait exactly five seconds. What I want
2:44:09to do is for the loop route, for the
2:44:10route that is going to be looping over
2:44:12my items. So basically for every item,
2:44:15you can think of this as I want to wait
2:44:18and I want to wait 5 seconds. Very cool.
2:44:22Then the output of this needs to feed
2:44:24back into the input. This is kind of
2:44:25like the tricky
2:44:27part. So when you go through a loop, I'm
2:44:29going to click a test workflow. I'm
2:44:30going to generate two items and then I'm
2:44:32just going to pull one item out of that
2:44:33and I'm going to wait 5 seconds. I'm
2:44:35going to go to the second item and I'm
2:44:36going to wait 5 seconds. Is this going
2:44:38to do anything? No. But notice that
2:44:40there is both a loop route and then
2:44:41there's a done route. Basically in NAN
2:44:43once you're done with the loop route, it
2:44:45just automatically goes to the done
2:44:46route. So I could do something like this
2:44:47and maybe I send myself an email. Let's
2:44:49just
2:44:51draft. And then let's say um you
2:44:55know done
2:44:58looping. You successfully waited 10
2:45:01seconds.
2:45:04Awesome. So, we're going to wait 5
2:45:07seconds and then 5 seconds. Then we're
2:45:08going to Gmail. Okay. So, that's that.
2:45:11I'm going to test this workflow. That's
2:45:13the first 5 seconds
2:45:16here. And that's the second 5 seconds
2:45:20here. And once this is done, we can now
2:45:23send over an email draft or queue up an
2:45:25email draft, I should say, which is
2:45:27right over here. I should note that I
2:45:29may have ran this twice. I feel like I
2:45:31just ran this twice. Looks like it's
2:45:33carrying all of these here. Oh, yeah.
2:45:35Sorry. It'll it'll output all of the
2:45:37records that you feed it in basically.
2:45:39So, I fed it in two records and then the
2:45:41third run it went and then fed both of
2:45:42those records in as input to my Gmail
2:45:44branch. Um, what I could do is I could
2:45:46take these two items and I could convert
2:45:47it into just one item by combining them.
2:45:49Um, and then I wouldn't have to deal
2:45:50with this, which is kind of neat. So,
2:45:52that's probably what I would do in
2:45:53practice. I wouldn't actually proceed
2:45:55here with two items. I would just do
2:45:57one. There's a really cool built-in way
2:45:59to do this in NAN just called execute
2:46:01once. So if you just go to the settings
2:46:03page of any node and then just click
2:46:05execute once, you basically stop the
2:46:07multiple executions regardless of the
2:46:09number of elements that precede it. So I
2:46:11just clicked execute once and instead of
2:46:13me sending two emails, now it's only
2:46:14going to send one. That's run number
2:46:17one. That's run number two. Then it'll
2:46:20go and it'll feed one item as an output.
2:46:24So if I refresh this now, instead of
2:46:26two, I'm only going to have one. Quick
2:46:28and easy hack. Um, and yeah, you know,
2:46:30because we're building stuff live,
2:46:31hopefully you guys get to see the
2:46:32applications of this in real time as we
2:46:34put something together. All right, so
2:46:36now I think we are at the point where we
2:46:37can realistically build out
2:46:38substantially more complicated flows.
2:46:40What I'm going to do now is basically
2:46:41run almost like a test of sorts where
2:46:44we're going to take all the information
2:46:45that I just tried to shove into your
2:46:47brain and we're going to use it to build
2:46:48out a flow that actually does something
2:46:50business worthwhile, a flow that I've
2:46:51sold many times before and a flow that's
2:46:53made people a fair amount of money. So
2:46:55this is what the flow looks like right
2:46:57now. I'm actually going to simplify it.
2:46:58I've decided to do it a little bit
2:46:59simpler just over the course of the last
2:47:01like 20 minutes thinking about it. But
2:47:02basically, just to keep things make a
2:47:04long story short, there's this service
2:47:05out there called SOS. Um, and I
2:47:07mentioned this at the beginning of the
2:47:08video, they send out like a a query
2:47:10every day from journalists uh where the
2:47:13journalists are looking for people that
2:47:14match their criteria to answer
2:47:16questions. So, uh, for instance, you
2:47:19know, this one up here is from Jordan
2:47:20Rosenfeld who's saying, "Seeking
2:47:22healthcare Medicare specialist weigh on
2:47:24how RFK Junior and Dr. Medat Oz might
2:47:25affect benefits or healthcare if
2:47:27appointed. know that this is usually
2:47:28like US specific. I think they have kind
2:47:30of like a like a global arm sometimes
2:47:32too, but most of this is going to be USD
2:47:34uh US specific. And then it says, "Hey,
2:47:38um I'm looking to speak to people in a
2:47:39nonpartisan way, but the possible
2:47:40changes, things like Medicare,
2:47:41healthcare, insurance, these are two
2:47:43stories. Specify what you're commenting
2:47:44on can be both. Robust and longer
2:47:46answers are prioritized. You must have
2:47:47the relevant experience. We'll link back
2:47:48to your site. Please include pronouns."
2:47:50There's a lot going on here, right?
2:47:51Basically what we want to do is we just
2:47:52want to take this whole long
2:47:55email and we just want to extract all of
2:47:59these. So this would be
2:48:02one, this would be one, this would be
2:48:07two, this would be three, and so on and
2:48:10so forth. And we want to feed this into
2:48:12AI. And we just want AI to give us a
2:48:14very simple answer. Hey, is this
2:48:15relevant to me based off of some
2:48:16characteristics I'm going to give you?
2:48:18and two, if it is, can you like
2:48:20pre-draft an email for me? So, pretty
2:48:22pretty simple, pretty straightforward
2:48:23stuff, right? Let me show you how
2:48:25straightforward this flow can be given
2:48:27what you now know. And I want you to
2:48:28treat this as like a test. Basically,
2:48:30like you've made it this far, let's
2:48:32actually see if you could build
2:48:33something out that's business
2:48:34worthwhile. If something that I'm saying
2:48:36doesn't make sense, uh, pause the video
2:48:38and look for the specific part that I've
2:48:39covered the concept in, cuz that's
2:48:41that's basically the purpose here. I
2:48:42just want you guys to be able to
2:48:43reaffirm your knowledge and show you how
2:48:44now you can do something pretty cool.
2:48:46Okay, so the first thing I'm going to do
2:48:47is I'm just looking for a Gmail trigger
2:48:48there. I'm going to select my
2:48:50credential. Sorry, not create a new
2:48:52credential. I'm going to select my
2:48:54credential, Gmail account 3. And the way
2:48:56that this module or node works is it
2:48:58extracts emails from my inbox that match
2:49:00my specified filters. And it does so in
2:49:02the timing that I give it. So every
2:49:04minute, hour, day, week, month, x,
2:49:06custom, whatever. I'm just going to say
2:49:07once a day for now. It's going to be
2:49:09zeroth hour, zeroth minute, simple
2:49:11stuff. The event I'm looking for is
2:49:13message received. Then what I need to do
2:49:15is I I need to add a filter down here.
2:49:17And there's one called search where I
2:49:18basically just look for emails from SOS.
2:49:22Luckily for me, they're all formatted in
2:49:23very similar ways. SOS media queries. So
2:49:25if I want to get all the emails from
2:49:26SOS, this is just what I do. Now I don't
2:49:28just want to get any email. I just want
2:49:29to get the specific email just to show
2:49:31you guys what I'm working with. Later
2:49:32on, we'll then um we'll separate it. So
2:49:34it's just SOS media queries will work
2:49:36with any of them. But for now, I just
2:49:37want to grab this one. Here's what you'd
2:49:38do. You just go
2:49:41subject and then you'd feed this in.
2:49:44This is a Gmail operator. So just use
2:49:46whatever same filtering mechanism you do
2:49:47for your own emails in Gmail. Uh and
2:49:49just feed it in over here and it'll work
2:49:51fine. Okay. Now let's test this out.
2:49:53Let's grab the data. We've received a
2:49:56ton of data. Uh this is an object with
2:49:5811 items inside. But this simplify is
2:50:02sort of working against us here. The
2:50:04Gmail trigger just natively always has
2:50:06simplify on. We actually want to get rid
2:50:08of this. So, I'm going to go to
2:50:08expression just like we know how and
2:50:10press and and type in false. This is the
2:50:12same, by the way, is just turning this
2:50:13off. I just wanted to be clear that I
2:50:15always use the expression field. And now
2:50:17I'm going to get the actual data of the
2:50:19email, which is way more as you can see
2:50:21here. Instead of whatever it was 12 or
2:50:23something, now it's or six, now it's 13.
2:50:25And uh the headers object has 27 items
2:50:29buried in it just in and of itself. The
2:50:31thing we're looking for is this text
2:50:32variable, which is the same as what we
2:50:34had before. Tell friends to join source
2:50:35of sources. It's always free. want to
2:50:37know how to strengthen your relationship
2:50:39with journalists blah blah blah. We're
2:50:40then going to pin this. So now we have
2:50:42access to all of this JSON in future
2:50:44nodes. And I think I got lost here with
2:50:47my Gmail
2:50:48trigger. And now let's actually go ahead
2:50:51and let's let's split this data. Let's
2:50:52basically get our data so that it's just
2:50:55a bunch of these. How are we going to do
2:50:56this? Just think about this. We got a
2:50:58bunch of text processing features
2:50:59available to us. We know a little bit
2:51:01about the JSON uh JavaScript and and
2:51:03stuff like that. But what are some ways
2:51:04we might actually realistically be able
2:51:06to do this? Well, the way that I see it
2:51:08is the great news about source of
2:51:10sources and the previous uh service
2:51:12called Haro is that they just have the
2:51:14same like characters everywhere. So,
2:51:16they have a bunch of stars here. Then
2:51:18between every story is basically just
2:51:20like these underscores. So, underscores
2:51:23there, underscores there, underscores
2:51:26there. So when you see a similar pattern
2:51:30like this, it becomes very easy for you
2:51:32to like process this in a noode tool
2:51:35using a term or a function called split
2:51:37where you basically just feed in a whole
2:51:38big string and then you just split it
2:51:40based off something that you want. So
2:51:42I'm probably I'm going to probably need
2:51:43to split this twice. The first thing I'm
2:51:44going to do is I'm going to split based
2:51:45off this up here and then is you know
2:51:49there's like this top section and then
2:51:50there's going to be this whole bottom
2:51:51section. Then after that I'll grab the
2:51:53bottom section. I'll split it based off
2:51:55of uh this probably. then I'll just be
2:51:57able to get like the individual
2:51:58sections. If that sounds like rocket
2:51:59science to you right now, don't worry.
2:52:01We're going to go over here, press edit
2:52:03fields. And what I'm going to want to do
2:52:06is for now I'm just going to go manual
2:52:07map and click add field. This allows me
2:52:09to create my own variable basically
2:52:11based off of um you know the the
2:52:13previous module. So I'm going to type
2:52:15above. Uh
2:52:18actually yeah, let's let's just call
2:52:20this
2:52:22below. And then what I'm going to do is
2:52:25I'm going to feed in where is this text.
2:52:28Ah, it's right over here. We'll go to
2:52:30the expression field. Then I'm just
2:52:31going to type dollar sign JSON dot. And
2:52:34what I want is I want text. Okay. So now
2:52:37if we open up this big fat editor here,
2:52:38we got all the text right here. Pretty
2:52:40sweet, right? We don't want all the
2:52:42text. We only want the stuff that is uh
2:52:44below this line. So I'm going to copy
2:52:46this. And then I'm just going to go over
2:52:48here and press dot. Now we have a bunch
2:52:49of functions. And I haven't covered all
2:52:51these functions yet. I will in the
2:52:52future videos. Um, but one of the
2:52:54functions that I use all the time is
2:52:56called split. Just press split. And all
2:52:58we need to do now is we just need to
2:52:59feed in the thing that we want to split
2:53:00it by. So I'm going to feed in what I
2:53:02just copied a moment ago. Okay. And now
2:53:06instead of just seeing the string, we
2:53:08actually see an array. And this is what
2:53:09arrays look like when they're output in
2:53:11um naden. It says bracket array and then
2:53:14colon space. And then we actually have
2:53:16the whole array here. And this array is
2:53:18split based off of wherever this was. So
2:53:22I think it's going to be split right
2:53:24over here. The last character before it
2:53:25will say information week. Okay. So we
2:53:28go information week. I'm going zoom way
2:53:31in. And yeah, that's what the array
2:53:34looks like. We have a comma. So this
2:53:35whole thing was a string. Then we have
2:53:37um quotes and then a comma, a space, and
2:53:39then we have another quote. And this is
2:53:40the beginning of everything underneath
2:53:41it, which is awesome for us. Okay, so
2:53:44this is basically what we get. Um, and
2:53:46now the really cool thing that allows us
2:53:48to do is it allows you to pull objects
2:53:50out of an array. So this is an array
2:53:52with two items inside of it. The one
2:53:55string that's everything above those
2:53:56lines, this little star line, then
2:53:58another string that's everything below
2:53:59the star line. We can just go dotlast.
2:54:02And now we'll just pull out the actual
2:54:04string itself, which is this. All of
2:54:07this. How cool. Now what else we could
2:54:11do is theoretically we could just split
2:54:12this again. We could split this again
2:54:14and then extract everything split based
2:54:18off of these characters. So I go
2:54:21dotsplit feed this in. Now we have
2:54:23another array, right? How many items are
2:54:25in here? I don't know. Let's find out.
2:54:27So I'm going to test the step. You click
2:54:29on test step. And now we have a bunch of
2:54:30different items. So yeah, just make sure
2:54:32you like set the array um here anytime
2:54:35you're screwing around with data.
2:54:37Otherwise, I believe they have a field
2:54:38like autotype convert or something. Um I
2:54:40haven't used that one before. type
2:54:41conversion errors or something. Um, I
2:54:43actually just set the specific, uh, data
2:54:45type that I want. In this case, I'm
2:54:47creating an array. I'm splitting stuff
2:54:48to turn it into array. So, uh, I'm going
2:54:51to be doing so with this array drop
2:54:53down. Okay, but anyway, now we have a
2:54:54big array. Pretty cool,
2:54:56right? And it looks like we have 19
2:54:59items in total. What I want to do with
2:55:00this is, first of all, I'm going to pin
2:55:03this. Second of all, I'm going to go
2:55:04over here to extract titles. And I'm
2:55:06just going to copy this because I don't
2:55:07want to have to rewrite the whole
2:55:08prompt. I think that would probably take
2:55:10like 15-ish minutes or so once when all
2:55:12is said and done. Um, what I want to do
2:55:14is I want to um grab this data which
2:55:17looks just like this. And all I want to
2:55:19do is I just want to feed this into AI
2:55:21now. And I just want to have AI tell me,
2:55:23hey, am I good? You know, if I'm good,
2:55:25then go ahead and like draft an email.
2:55:28If I'm not good, then um then don't. And
2:55:30I know just from experience that this is
2:55:32sort of split into two parts here.
2:55:35So, I'm just going to copy this
2:55:38over. I'm going to use it to create my
2:55:41prompt. Okay. What does this prompt look
2:55:43like? You're a helpful intelligent
2:55:44administrative assistant. Very on brand
2:55:45for me. That's a system prompt. Then,
2:55:47hey, I'm a business owner specializing
2:55:49in AI, automation, marketing, and
2:55:50software. Then what I'm going to say is
2:55:52below is an email requesting a
2:55:58uh below is an email requesting let's do
2:56:01an email request from a
2:56:04journalist looking for a
2:56:08story about sorry information about
2:56:12their story.
2:56:14Then just going to paste a bunch of data
2:56:20in. Your task is to determine whether it
2:56:23is relevant to me and if so pre-draft an
2:56:27email that answers their questions using
2:56:30my tone of voice and I'll say casual
2:56:33Spartan. Some
2:56:35information about me. I own one second
2:56:38copy. Here are my
2:56:41links. Then I will say
2:56:46uh sorry I just got a lot going on here
2:56:48because I'm piecing this together
2:56:50between two different
2:56:51um prompts. But anyway, some information
2:56:54about me. I own one second copy a
2:56:56successful AI marketing company came up.
2:56:57My name is Nick Stra here. My links
2:56:58don't use unless asked links and then
2:57:03um below is a request by a journalist
2:57:06for outreach. Write a syncing spartan
2:57:07email responding to each query.
2:57:09says spart an email be concise use the
2:57:13following
2:57:16format.
2:57:18Okay. Then I will
2:57:23say if it is relevant return a JSON
2:57:27object as
2:57:30follows.
2:57:32True. Email body. Email body goes here.
2:57:40If it is not
2:57:45relevant, return false for relevance and
2:57:48leave email body
2:57:52blank. Some information about me.
2:57:57Good. Use the following email format.
2:58:00Email template when responding to
2:58:02relevant inquiries. Cool.
2:58:08Make sure to respond in
2:58:11JSON. Very sweet. Okay, great. And now
2:58:14all I'm going to do is I'm going to
2:58:17provide as input
2:58:22um the specific item that I am
2:58:25referencing. So what you'll find is when
2:58:28you're referencing a an array like this,
2:58:30what it'll do is it'll grab the specific
2:58:32item of the array. So JSON.blow0ero,
2:58:34below zero. I don't actually want that.
2:58:36Um what I want to do is I I basically
2:58:37want to loop through this array and then
2:58:39for every item I want to feed this in as
2:58:41input. Um this is selecting the first
2:58:43item here with the zero. Um everything
2:58:45is zeroth indexed. So this is 0 1 2 3 4
2:58:48and so on and so forth. Um so in order
2:58:50to do that we're going to have to take
2:58:51our data and do just a little bit of
2:58:52pre-processing first.
2:59:00Um, we're going to want to combine a
2:59:02field from many items. Sorry, uh, turn a
2:59:04list inside items here using the split
2:59:06out node. I don't believe I talked about
2:59:09split out, but rest assured, all this
2:59:11does is it turns an array into a bunch
2:59:13of items. So, you can run them one by
2:59:14one. Okay, great. So, below, no other
2:59:16fields. And now we have uh 20 items on
2:59:18the right hand side. And now, basically,
2:59:20we can feed in every one of those 20
2:59:21items to AI.
2:59:24So all I'm going to do now is I'm just
2:59:26going to feed in uh this below field.
2:59:29And now instead of me having to go JSON
2:59:31items.0 below one below two because we
2:59:34are now splitting this into a top level
2:59:37uh array instead of before how it was uh
2:59:39an array and then the curly bracket
2:59:42below and then another um array with
2:59:44like 20 records. Now it's just below
2:59:46below below below below. It's going to
2:59:47run basically once for every item that
2:59:49we've received. So yeah, that's that.
2:59:52Um, we should be able to get some JSON
2:59:54here. Uh, I don't want to run it on all
2:59:5620 as a test, though, cuz all we're
2:59:57doing is testing. So, what I'm actually
2:59:59going to do is I'm going to go in
3:00:00between these and type in limit. Limit
3:00:02allows us to restrict the number of
3:00:04items. So, I actually only want to run
3:00:06this twice to start, and I want to see
3:00:08what happens. So, I'm actually going to
3:00:09do this on two items. Then, we're going
3:00:11to see what those two item outputs are.
3:00:13And if they're good, then we'll
3:00:14continue. We'll pin them and then move
3:00:15on. And if not, then we won't. We'll be
3:00:17able to modify them before we actually
3:00:18waste 20 uh tokens worth of data. And
3:00:22I'm just going to pin all the data
3:00:23moving forward. And then I'm going to go
3:00:24over here to limit. And then I'm just
3:00:25going to press test
3:00:27step. Okay. I'm going to pin this now.
3:00:29So now we have the two items. So I'm
3:00:31going to go over here. And then I'm
3:00:32going to test this
3:00:34step. Looks like we are now producing.
3:00:37Uh and it looks like both of these were
3:00:38false. So I'm going to want to up this
3:00:40limit just a little bit. Maybe we'll try
3:00:43three last items instead. We'll
3:00:45overwrite the data that's pinned. We'll
3:00:47pin it again. I'll go back to extract
3:00:49titles. Now we're feeding in the last
3:00:50three enterprise genai users. Yeah, this
3:00:52is probably
3:00:56me. Edge AI and stuff. Looks like they
3:00:58kept their AI entries at the end, so
3:01:00that makes
3:01:03sense. And we're now doing three API
3:01:07calls. It looks like uh there were two
3:01:10TRS. So true up here, true up here. This
3:01:12looks like it was just junk data. So we
3:01:14could actually cut that out. Show you
3:01:15how to do that later. Um but now we
3:01:17actually have like emails drafted. Hey
3:01:18Pam, I own one second copy accessible
3:01:20blah blah blah. Here's a big answer to
3:01:22all of these questions. That's pretty
3:01:24cool. All we need to do now is we just
3:01:26go Gmail. We draft. Oh, you know
3:01:29what? Uh, we need to grab the email,
3:01:32don't we? Yeah, I don't think I actually
3:01:34grabbed the email address of the
3:01:36person. Yes, I did not. So, let's
3:01:38actually change our prompt a little bit
3:01:39and let's edit it so that we actually
3:01:41output the email
3:01:43to. So, I'm going to go back here. I'm
3:01:45actually go
3:01:51um email address
3:01:56um discovered or let's just go their
3:02:03email. Okay, there you go. That should
3:02:07probably be
3:02:10sufficient. Let's actually test this one
3:02:12more time. So now we should actually
3:02:13extract their email address as well,
3:02:14assuming the AI does what I what it's
3:02:17silly human overlord tells it to
3:02:21do. And now that we have the the email
3:02:24um address, we'll actually be able to
3:02:26like use that to feed into a draft.
3:02:27Yeah, I kind of forgot about that. So
3:02:28we'll go back to Gmail. I'm going to go
3:02:31draft create a draft credential Gmail
3:02:34account 3 resource draft operation
3:02:37create. Then I'll say
3:02:39re and then I'll say SOS inquiry. I'm
3:02:44going go message and then all I'm going
3:02:45to do is I'll go back to my schema. Just
3:02:47going to drag my email body in here.
3:02:50Then I'm going to add an option called
3:02:53uh now we'll go to email and then we're
3:02:55actually just going to feed that puppy
3:02:57in there. And now we can actually test
3:02:59this out on three. So let's go one, two,
3:03:02three. So we have three items. All of
3:03:04them just wrapped up. We go back to my
3:03:07email inbox, go down to
3:03:09drafts, we'll see that uh I created one
3:03:12for each. It looks like I created an
3:03:14additional one, but anyway, I'll cover
3:03:15that in a second. The first was this one
3:03:17to this lovely Pam lady. Very nice.
3:03:20Second was this other one to this lovely
3:03:22John
3:03:24fella. Very cool. Uh, everybody followed
3:03:27my email template. No issues. And then,
3:03:29yeah, looks like we just used one
3:03:30additional um
3:03:32email. I think the reason why we sent
3:03:34that additional email is because we
3:03:36technically outputed an item. So, I
3:03:38wonder if we could just not output an
3:03:39item. That'd be one way to do
3:03:41[Music]
3:03:43it. Yeah, we could just not output the
3:03:45item. Or, you know, we could just add a
3:03:48filter like I uh was showing us how to
3:03:50do so
3:03:52before. So, if uh let's just go down
3:03:56here. Let's go JSON dot
3:04:03Let's go item
3:04:06three. We'll go down to
3:04:08[Music]
3:04:10JSON.relevance
3:04:14message.content.relevance. So basically
3:04:16if this is equal to true then we'll
3:04:17continue and then if not we won't. So we
3:04:20should get two, right? Yeah, there you
3:04:22go. We uh kept two items and now we're
3:04:24only going to be sending emails on the
3:04:25two items that passed our filter. So,
3:04:28just because I always like to do an end
3:04:30toend flow, I'm just going to discard
3:04:32some old drafts here, delete everything,
3:04:34and then run this one final
3:04:36time just to show you guys what all this
3:04:38looks like. We will use the Gmail
3:04:40trigger, edit the fields, split them
3:04:42out. I'm going to have the limit be
3:04:43three items just for now because I don't
3:04:45want to like draft a bunch of emails.
3:04:47Extract the titles, add a filter, and
3:04:48then create three drafts. Let's run this
3:04:50from start to finish. We're now
3:04:52extracting the titles. And by sorry
3:04:54extracting the titles I mean we are um
3:04:57filtering and creating an email. And
3:04:59then the end result is we have two
3:05:00drafts in our inbox which is kind of
3:05:02neat. And if we wanted to take this even
3:05:04further what we could do is we go down
3:05:05to Gmail and then we could add a label
3:05:07to this message. Just to make it
3:05:09abundantly clear if I select the message
3:05:12ID that we just created. It's going to
3:05:14be right over
3:05:15here. Uh I could just call this public
3:05:19relations or something. And
3:05:22now basically it'll just automatically
3:05:24apply a label to these drafts inside of
3:05:25my inbox that I just know that these
3:05:27are, you know, these are public
3:05:28relations inquiries basically. Um these
3:05:31are not, you know, other email drafts
3:05:33for some purpose. And that's kind of
3:05:35cool of a flow, but I'm actually just
3:05:37going to stick that right over there.
3:05:38And then because I'm already getting
3:05:40mixed up with the extract titles, I'm
3:05:42just going to say filter and respond to
3:05:44email or maybe create email body. There
3:05:48you go. A little bit simpler. So yeah,
3:05:50we used a ton of new functions here. Um,
3:05:53we use the split. I then use the split
3:05:55out. Uh, I don't actually use all of
3:05:57these super often. We did use the
3:05:59filter, which I talked about and
3:06:00covered. And then the limit is just
3:06:02basically like an internal tool that I
3:06:03like to use to uh make sure that I'm not
3:06:05screwing around with token usage or
3:06:07spending a ton of like executions or
3:06:09anything like that. Um, I think this
3:06:11system is a lot cleaner than that other
3:06:12system that I was going to build with
3:06:13you guys before. It's also a little bit
3:06:15more simple. Here I have just a ton of
3:06:16code unfortunately, but we'll get rid of
3:06:18that. We'll use this as the two
3:06:23templates for us. Then I'll also just
3:06:26make this nice and easy to see. And
3:06:29yeah, I hope you guys appreciated this.
3:06:30Um, just so that we could do a quick
3:06:32recap and because in my experience doing
3:06:35a recap of the stuff is sort of how you
3:06:37remember it. Um, we started off by
3:06:39talking a little bit about fields
3:06:40specifically two types of fields. There
3:06:42were fixed fields and then there were
3:06:44um, expressionbased fields. I sort of
3:06:46made a case for you as to why you should
3:06:47probably favor expressionbased fields
3:06:49over fixed fields whenever possible
3:06:51because you could do the exact same
3:06:52thing anyway. And you also just get like
3:06:54a ton of code options. So I always just
3:06:56toggle little expression. I then showed
3:06:58you how all of these different field
3:06:59inputs, even like the little toggle
3:07:00buttons, these really are just
3:07:02expressions at the end of the day. You
3:07:04know, if it's a toggle button, it's true
3:07:05or false. If you're selecting a Google
3:07:07sheet or something, there's actually an
3:07:08ID behind it. And so now you know a lot
3:07:10more about sort of the underlying data
3:07:12and the way that NAN structure stuff. I
3:07:14then covered JSON JavaScript object
3:07:16notation in probably pretty excruciating
3:07:18detail. Hopefully that wasn't too
3:07:19boring. But we covered a bunch of
3:07:20different variable types. Just to recap
3:07:22them, there was a string, there was a
3:07:24number, there was a bool or boolean,
3:07:26true or false. There was an array, and
3:07:28then there was also another object. So
3:07:30you could bury JavaScript objects inside
3:07:32of JavaScript objects. There were key
3:07:34names, values. We learned a little bit
3:07:36about the formatting with quotes, um, as
3:07:37well as commas and and brackets and that
3:07:39sort of stuff. But the reality is if you
3:07:41just like stare at JSON long enough,
3:07:42kind of give it a good squint or two,
3:07:44eventually it'll start making sense. And
3:07:46that's why I've now changed all of the
3:07:48input and outputs inside of our NAND
3:07:50course tutorial to to favor a JSON
3:07:52JavaScript object just so you guys could
3:07:53see it and kind of get used to it. From
3:07:56there, we covered a little bit about how
3:07:57data is represented in NAN. So
3:07:59specifically, all data, all inputs and
3:08:02outputs in NAD are structured as an
3:08:03array of objects. So there's some top
3:08:06level square bracket and inside there's
3:08:08just a bunch of those JavaScript objects
3:08:09nestled in it. And if you want to
3:08:11reference the most previous node, then
3:08:13all you need to do is just use this
3:08:15little dollar sign JS O N syntax. If you
3:08:18want to reference nodes from 2, 3, four,
3:08:21or nodes back, n standing for whatever
3:08:23number, then you would do the dollar
3:08:25sign, but then you'd have to like
3:08:26specifically reference the name of the
3:08:28node. No big deal. Naden actually does a
3:08:30lot of that selection for you. And
3:08:31there's usually a little drop down or
3:08:33toggle button that you can just click to
3:08:34get there. We talked about how to
3:08:35reference earlier fields, how to do some
3:08:37backtracking with like dot notation and
3:08:39square bracket notation. Then I also
3:08:40covered some common gotchas. The most
3:08:42common gotch in NAN, just to be clear,
3:08:43is people don't understand that it is an
3:08:45array of objects that you're referring
3:08:47to. And so NAD will run once per item in
3:08:49the array. If you're trying to reference
3:08:51one item, but you're really referencing
3:08:52all of them, obviously you're going to
3:08:53get an error message. It's not going to
3:08:55work. Likewise, if you're trying to
3:08:56reference a number of items, but you
3:08:58only reference some subset of them,
3:08:59you're going to have some error, a
3:09:01message, and you know, you're going to
3:09:02get that dreadful red text that I think
3:09:03we all hate so much. So, understanding
3:09:05that everything is just an array of
3:09:06items and array of objects. This goes a
3:09:08long way towards insulating you against
3:09:09that. Finally, we covered some
3:09:11foundational notes. We started off with
3:09:12the HTTP request node, which allows us
3:09:14to basically request or do the same
3:09:17thing that your browser is doing when
3:09:18you access a website, pull all of the
3:09:20code, and then I also showed you guys
3:09:22how to do cool stuff with AI, where you
3:09:25take the extracted or parsed components
3:09:27of that node, like my leftclick website,
3:09:30and then turn that into some sort of AI
3:09:32structured data, like a summary, like
3:09:33some interesting tidbits about that
3:09:35website, maybe the contact details if
3:09:37you could find it. I then covered a
3:09:38little bit about web hooks. If you guys
3:09:39are familiar, if you guys remember, web
3:09:40hooks are just like the glue that holds
3:09:42so much of the internet together. I
3:09:43showed you guys how to send a request
3:09:45from one workflow and receive it in
3:09:47another workflow. And I also showed you
3:09:48guys how to use a third party platform,
3:09:50in this case, ClickUp, but you can
3:09:52really use whatever the hell you want to
3:09:53send a request upon some triggers. So
3:09:55now I'm like connecting NAN and ClickUp
3:09:57with my own native integration without
3:09:59even necessarily having to know too much
3:10:01code. And then at the tail end there, I
3:10:02covered OpenAI and AI agent nodes. The
3:10:06real value of N8N in comparison to most
3:10:08other no code tools in addition to its
3:10:10ability to self-host is their AI agent
3:10:12functionality that just works fresh out
3:10:13of the box. So rest assured, we're going
3:10:15to be covering a lot more of that moving
3:10:16forward. But we built a very simple
3:10:18example where I essentially asked my AI
3:10:20agent what was going on for the day and
3:10:22then it pulled data from my calendar
3:10:24intelligently while also still being
3:10:25able to like talk back and forth in
3:10:27natural language. We covered some nodes
3:10:28that modify flows as well, including the
3:10:30if, the filter, the merge, the split
3:10:32into batches or bundles. We covered the
3:10:35split out and then finally we also
3:10:36covered while I was building that last
3:10:38example the limit. And then from there I
3:10:40showed you guys how to build a super
3:10:41simple and easy essentially email
3:10:43autoresponder type flow but one that
3:10:46does a very high leverage highv value
3:10:48business purpose which is parsing out
3:10:50defining whether a journalist inquiry is
3:10:52relevant to us or not than if it is
3:10:54actually writing out an example based
3:10:55off of a template. Okay. So now that you
3:10:57understand how data works in NAD and how
3:10:59information flows through a workflow,
3:11:01let's cover some of the more complex
3:11:02aspects of NADN. And these are parts of
3:11:04nodn that usually keep beginners away
3:11:06from this tool. What I'm covering now is
Javascript functions
3:11:09JavaScript functions. N uses a very
3:11:11specific take on JavaScript functions,
3:11:13dot notation, JavaScript functions. And
3:11:15there's just so many of them that it's
3:11:17very difficult and intimidating for
3:11:18beginners to know which is the right one
3:11:20to use. And that's what we're going to
3:11:21cover over the course the next hour or
3:11:23so. You're going to learn how to
3:11:24transform data, how to filter it, how to
3:11:26map it, how to reduce it. And if none of
3:11:28these concepts make sense to you right
3:11:29now, they certainly will in a few
3:11:30minutes. Okay, let's get building. I
3:11:32have an NAN workflow open over here
3:11:34called all NAT functions. I'm going to
3:11:36click add tag and go down to NAD course
3:11:38just so I can help organize it a little
3:11:40bit. And all we have is we have a start
3:11:42node. This begins a flow when I click
3:11:44test workflow down here. So I give this
3:11:46a click. You'll see that this just
3:11:47turned green. This just tells us that
3:11:49this has triggered the flow. Uh
3:11:50peculiarity of the start node is when
3:11:52you click it and when you get it going,
3:11:54it doesn't actually output any data. It
3:11:55just starts the flow. So obviously if we
3:11:57want to do something here, we're going
3:11:58to have to add another node. So, let me
3:12:00click on that right little plus sign.
3:12:02And then the nodes that we're going to
3:12:04be using in this video, I'm going to be
3:12:05using pretty gratuitously. They're
3:12:07called the edit fields node. And the
3:12:08edit fields node, for anybody that's
3:12:10coming from maybe a different noode
3:12:11editor, especially something like
3:12:12make.com, you can just think of this as
3:12:14a way to set variables, rename fields,
3:12:16and that sort of stuff. So, I'll go down
3:12:18to edit fields over here. Give us a
3:12:19click. And now, you know, we have the
3:12:22start node on the left, and that's the
3:12:23input. And then in the middle here, we
3:12:25have an edit fields node with a couple
3:12:27of different modes. There's manual
3:12:28mapping and there's JSON. Basically,
3:12:30what this allows you to do is if you
3:12:31give this a click, you can define your
3:12:32own variables
3:12:34here. And if I click test step, you'll
3:12:37see that we now have a new variable
3:12:39accessible to us in the output called
3:12:40hello world. Now, what I'm going to be
3:12:43doing is I'm going to be using the JSON
3:12:45option here. And I've already created a
3:12:47bunch of JavaScript um that I'm just
3:12:48going to be using for the purposes of
3:12:49running through all the functions. So,
3:12:51this is what the object looks like. We
3:12:52have a string called hello, number 3.5,
3:12:56an array with names of Sarah, Sally, and
3:12:58Stephanie, an object, and this object
3:13:00has some parameters like first name,
3:13:02last name, height, and centimeters. Then
3:13:04we also have a bool that stands for
3:13:05boolean, and that's just set to true.
3:13:07I'm doing this because these are all of
3:13:09the different function types that we're
3:13:10going to be working through in the rest
3:13:11of this video. And so I just wanted an
3:13:13easily accessible way for us to get all
3:13:15of these and then do cool stuff with it.
3:13:17I can now add, let's just give this a
3:13:19quick rename. Let's just say set example
3:13:21JSON. Then what I'm going to do is I'm
3:13:23going to go and do another edit fields.
3:13:25And this edit fields is where I'm
3:13:26actually going to be mapping the output.
3:13:28So I'm going to call this output. And
3:13:30then for now we'll go off of a string
3:13:32data type. And what I'm going to do is
3:13:33I'm just going to drag this string into
3:13:35the value. And now we have access to it.
3:13:37Now, the way you use functions in NAND,
3:13:39as I'm sure you're probably already
3:13:40aware, but just to reiterate, is all you
3:13:42do after you've selected a variable from
3:13:44an input and it's turned green, like
3:13:46this one here, all you need to do is
3:13:48just click the dot. A period then opens
3:13:51up this function editor. And now we have
3:13:53access to tons of stuff. So, you can see
3:13:55there's some suggested functions here.
3:13:57This is just because while Anaden gives
3:13:58you a large library of functions that
3:14:00you can do stuff with um in practice you
3:14:02don't actually end up using the majority
3:14:03of them. But I'm still going to run you
3:14:05through every single one of these for
3:14:06completeness's sake and then if I touch
3:14:08on something that I actually use pretty
3:14:09often either for my own workflows or uh
3:14:12workflows that I've seen other people
3:14:13use then I'm going to I'm going to
3:14:15mention it. Okay, great. So let's start
3:14:16with the very first one. Now if you
3:14:18remember if I click back here this turns
3:14:20green and we see a result down here to
3:14:21hello. If you remember the value of this
3:14:24string right now is currently hello.
3:14:26Okay, so keeping that in our minds, what
3:14:29we start with is the includes function.
3:14:32The way that the includes function works
3:14:33is basically we can use this to search
3:14:35within a string to see if something
3:14:37includes a substring that we're looking
3:14:40for. So right now we have hello and what
3:14:42we're basically saying is does hello
3:14:44include what I'm about to write inside
3:14:46of here. So if I write h the result will
3:14:50be true. But if I write something like
3:14:52x, you'll see the result will change to
3:14:54false. Keep an eye on this result panel
3:14:56because this is going to be your best
3:14:58friend anytime you're manipulating
3:14:59functions. Uh because most of the time
3:15:01it'll give you some sort of real time uh
3:15:02feedback. So you know if I wanted to see
3:15:04whether or not my string contains the
3:15:06word hell. I don't know maybe I am very
3:15:08pious or something. I type helen here.
3:15:10You see h e l l is a four-letter
3:15:13substring that is inside of hello.
3:15:14Obviously this is going to turn true.
3:15:16But if I were to jumble up the letters,
3:15:18right? vertigo l e h you'll see that
3:15:21this is false because this is reading
3:15:23all strings left to right. So this is a
3:15:25pretty quick and easy one. Um you know
3:15:26it's kind of useful to see whether or
3:15:28not something includes obviously if you
3:15:30have a very large string you can
3:15:32instantly do this just to search and see
3:15:34whether or not that string includes just
3:15:35some tiny little thing that you're
3:15:36looking for a mention of something
3:15:38perhaps. The next one I'm going to cover
3:15:39is called split. Now split is something
3:15:41that I use basically all the time. I use
3:15:43it at least once a day. Um, and I use it
3:15:45across a variety of no code tools just
3:15:47because it's so goddang useful. Now, the
3:15:49way that split works is you essentially
3:15:51take your string h l exclamation point
3:15:55in this case and then you convert it
3:15:57into an array. And the way that you do
3:15:58so is you give it a character that you
3:16:00want to split the thing by. So, let me
3:16:03give you a very simple example. If our
3:16:05input string is h e l o, let's
3:16:07hypothetically say I wanted to split
3:16:09this into two halves. And the way that I
3:16:11wanted to split it was based off of the
3:16:13presence of the L and the L here. Okay.
3:16:15So, what I could do is I could say
3:16:18JSON.string.split and then in quotes and
3:16:20you have to use quote signs. If I go LL,
3:16:24you'll see that I've now split this
3:16:26string into two um substrings basically
3:16:29and then plopped them in an array. Now,
3:16:31if you're unfamiliar with what an array
3:16:32is or how an array works, that's okay.
3:16:34We'll get into that later. But for now,
3:16:36all you need to know is that we
3:16:37basically taken one input and we've
3:16:39turned it into an array that contains
3:16:40two outputs, the H E and the O. If you
3:16:43split it based off of the presence of an
3:16:45L, you'll see that we are now generating
3:16:47an empty space. Why? Well, this is sort
3:16:50of nuanced, but if you look at our input
3:16:52over here, that's H E L L. If we're
3:16:54splitting based off of an L, and what
3:16:56this is doing is it's catching the empty
3:16:57string in between these two L's. So
3:17:00hypothetically, if I wanted to split
3:17:01this by something else, let's say the E,
3:17:03you see that this is now splitting into
3:17:05a substring that's H and then LL O. If
3:17:08you wanted to do this based off of the
3:17:09presence of nothing, you'll see that it
3:17:11splits it based off every character. So
3:17:13this is just its default um if you don't
3:17:14feed it in any input whatsoever. So if
3:17:17you have an empty string like this, it's
3:17:18h e l l o exclamation point. And
3:17:21splitting is really useful just as a
3:17:23quick and easy way to take something,
3:17:24usually some sort of tabular or CSV
3:17:26data, and then just turn it into, you
3:17:28know, an array that you can use naden
3:17:29for. So, let me give you a quick little
3:17:31example. Right now, this editor is set
3:17:33to dollar sign JSON.string. We're
3:17:34referencing a variable from a previous
3:17:37um, you know, uh, node. There's actually
3:17:39a little hack in Naden that you can do.
3:17:41If you want to like create something
3:17:42directly in the function editor to do so
3:17:44with a string, all you do is you add
3:17:46quotes and then you do something like
3:17:48Sarah,
3:17:49Sally, Stephanie. Everything within
3:17:53these two quotes still technically
3:17:55counts as a string. And so you can
3:17:57dotindex it. You can slice it into uh
3:17:59you can use dot notation, I should say,
3:18:01in order to attach a function to the end
3:18:02of it. So hypothetically, let's say we
3:18:04had three names here and these three
3:18:06names were just somewhere, I don't know,
3:18:07they're in some data source that we're
3:18:09scraping. Well, we can turn this into an
3:18:10array very easily just by adding the
3:18:12delimiter of comma and then space. Now,
3:18:16because we're going comma and then
3:18:17space, as you can see, we've turned this
3:18:20string of Sarah, Sally, and Stephanie
3:18:22into an array. That's a quick example of
3:18:24split. Split's pretty awesome. I use
3:18:25split all the time because we just
3:18:27deleted all of this. We need to reselect
3:18:29our string. So, I'm going to go dollar
3:18:30sign JSON. Then, I'm going to go dot st
3:18:33i n g. That's the name of the key in our
3:18:36JSON that we fed. And so now we have the
3:18:38hello again. Let's proceed. Next we have
3:18:41starts with. Starts with is kind of what
3:18:43it sounds like. If you want to see
3:18:45whether or not a string starts with a uh
3:18:47series of of letters or not necessarily
3:18:50letters, numbers and stuff like that as
3:18:51well, characters I should say, then you
3:18:53can just use starts with. So in our
3:18:55case, if we wanted to see whether it
3:18:57started with h e l or something like
3:19:00that, then this would return true. But
3:19:02if we wanted to instead uh I don't know
3:19:04let's say we wanted to see if the string
3:19:06started with the term by then it would
3:19:07obviously be false. Similarly to starts
3:19:10with as you could see we also have ends
3:19:13with and so the way that this works is
3:19:16very similarly essentially all we're
3:19:17doing is we're starting at the back and
3:19:18we're just working our way forward. So
3:19:20if the hello exclamation point string
3:19:23sorry getting a call there um but it
3:19:25looks like it went to voicemail. If the
3:19:27hello exclamation point string is, I
3:19:29don't know, exclamation point, this is
3:19:31obviously going to be true, right? But
3:19:32if it's a dollar sign, it's going to be
3:19:34false because we don't have a dollar
3:19:35sign present in our string. If we were
3:19:37instead to go e l, this would again
3:19:40revert to true. So, lots of options
3:19:42there. And there are a lot of uh
3:19:44functions in reality that you'll find
3:19:45are just the inverse of each other. So,
3:19:47if there's something for starts with,
3:19:48odds are there's something that ends
3:19:49with. There's something for uppercase,
3:19:51odds are there's something for lowerase.
3:19:52We're going to cover all of that over
3:19:54the course of the rest of the video.
3:19:56Okay, great. There's also this other
3:19:57function here which I find myself using
3:19:59quite often. It's called replace all.
3:20:00And so replace all sort of a power
3:20:02function. Basically what it allows you
3:20:04to do is allows you to take this string
3:20:07which we have here is hello exclamation
3:20:09point and we can just replace any
3:20:10character we want in there with another
3:20:12character. So let's say we're some crazy
3:20:14anime weeaboo. What we do is we
3:20:17replace the first letter L and we go
3:20:21comma and we replace it with W. What
3:20:24we're doing now is replacing all of the
3:20:25L's in the string of hello with a bunch
3:20:28of W's, hello. Right? So we have a lot
3:20:30of um you know granularity and control
3:20:32there. If you look over the expression
3:20:34and function uh documentation over here,
3:20:37you'll see that this is the first
3:20:38instance in which we're now splitting
3:20:39this into two parts. So you know we
3:20:41actually have two variables that we're
3:20:42feeding into the replace all function.
3:20:44There's a pattern aka what we're looking
3:20:46to replace and then the actual thing
3:20:47that we're going to be using to replace
3:20:48it. I could just as easily replace the
3:20:50term the O, right, with nothing. And if
3:20:52I do that, it actually just cuts it out.
3:20:53Just removes that character completely.
3:20:55So replace all is pretty powerful. I
3:20:57find myself using this all the time when
3:20:58I'm developing flows. Um, and I'm glad
3:21:00that it's in the suggested editor up
3:21:02here alongside with split cuz you know,
3:21:03these are the two most common ones
3:21:04realistically. Okay, great. Moving our
3:21:06way down, you'll see that there's a very
3:21:08interesting looking function. This
3:21:09technically isn't a function. I believe
3:21:11this is a parameter in JavaScript. Uh,
3:21:13you know, like technically speaking,
3:21:14that's why it doesn't have the two
3:21:15little brackets next to it. But this is
3:21:17just a quick and easy way to determine
3:21:18the length of a string. So you know if h
3:21:21e l l o exclamation point this is 1 2 3
3:21:244 5 6 right we should expect this to say
3:21:26six that's exactly what happens when we
3:21:28feed in length hypothetically if I were
3:21:31to replace this with hey how's it going
3:21:34men you'll see that the character length
3:21:36of this string is now 24 so uh length is
3:21:40super valuable I use length all the time
3:21:42I use length to determine you know
3:21:44whether or not the input that I'm
3:21:45feeding into a large language model is
3:21:46too much right a lot of the time you can
3:21:49average out the token length of a big
3:21:51string just by multiplying the number of
3:21:54um characters per word on average. And
3:21:56if you look up number of characters per
3:21:59word, the average is 4.7. Uh and then if
3:22:03you want to get the number of tokens per
3:22:05word average, you'll see that that's uh
3:22:08something like 2 to three. A paragraph
3:22:09is 128 tokens. I guess I should have
3:22:11said number of words per token. This
3:22:14ends up being about um 0.75. So, from
3:22:17there, if you feed in a string of 1,000
3:22:19uh characters, right? Uh what was the
3:22:22the math there? 4.7 or something, I
3:22:24believe. Yeah, 4.7. So, 1,000 characters
3:22:27divided by 4.7 is 212 words. 212
3:22:34words* 1 / 0.75 gives us 282 tokens. You
3:22:39know, odds are if you do this
3:22:41calculation and you get the length of
3:22:42your your string, you're going to know
3:22:44that every time you call a large
3:22:45language model, you're going to be using
3:22:46282 on average over a large uh enough
3:22:49data set,
3:22:50282.6 tokens in order to do so. So, you
3:22:54know, if you're not working with large
3:22:55language models, maybe a little bit less
3:22:56applicable, but there's still a variety
3:22:57of reasons why you might want to use
3:22:59length. So, um yeah, length is
3:23:01definitely one of the big boys. Okay, so
3:23:02working our way down the function panel
3:23:04here, uh, we have B 64 decode and it's
3:23:07partner B 64 encode. Now, if you guys
3:23:10aren't familiar with what B 64 is, you
3:23:12can think of it in a really simplified
3:23:13way. It's just a slightly different
3:23:15alphabet used to represent strings. Um,
3:23:18if I were to zoom into this example, the
3:23:20letters H E L L O when they are base 64
3:23:24encoded translate to A, capital G,
3:23:26capital V, SB, capital G8, and then
3:23:28little equal sign. So this is basically
3:23:30just a way to to like uh I don't know
3:23:32like rotate characters according to some
3:23:34formula this base 64 um function. And
3:23:37the reason why they have a function
3:23:39available is because a lot of servers
3:23:41and uh some web services will only
3:23:44accept base 64 encoded versions of the
3:23:46strings that you send them. This is both
3:23:48a security purpose and I believe there's
3:23:49also some sort of compression purpose as
3:23:51well. Um but to keep things really
3:23:52simple, we'll start with B 64 encode.
3:23:54Then I'm going to feed in the thing that
3:23:55we just B 64 encoded into a B 64 decoder
3:23:58just so you can see that they're the
3:23:59same thing. Okay. So if I were to attach
3:24:01B 64 encode over to the string H E L O
3:24:04exclamation point, you'll see that it's
3:24:06very similar to the string that I just
3:24:08showed you guys um without the
3:24:09exclamation point. The only difference
3:24:10is the last letter I think is an h or
3:24:12something like that instead of an an
3:24:14equal sign. So as you can see it's very
3:24:16similar. Now, if I were to take this
3:24:18string and then I were to attach another
3:24:20function to it,
3:24:21base 64 decode. Notice how we've
3:24:25basically just regenerated our initial
3:24:27hello string. We could do this an
3:24:29arbitrary number of times. I go back to
3:24:30base 64 encode, then base 64 decode. And
3:24:34hypothetically, we could make this
3:24:35thing, you know, the distance from here
3:24:36to Mars. Um, but as I'm sure you guys
3:24:38can guess, it's kind of pointless to do
3:24:40so. So, this is sort of a niche
3:24:42function. I do use that function. Uh, I
3:24:44use one of the two functions reasonably
3:24:46often when I'm doing certain API calls
3:24:48because sometimes you need to base 64
3:24:50encode an API key or base 64 encode
3:24:52credentials, usernames, passwords, that
3:24:54sort of thing. The only thing I want you
3:24:56guys to take away from this if you're
3:24:57unfamiliar with it is next time you know
3:24:59a service says, "Oh, you'll need to base
3:25:0064 encode a string." Well, now you know.
3:25:02All you need to do is just go to your
3:25:03string, press period, and then type in B
3:25:0664 encode. Voila, you're done.
3:25:08Okay, continuing on down, we now get to
3:25:12another function that I use reasonably
3:25:13often, one called concat. Concat
3:25:15basically just allows you to take your
3:25:17string and then add on another string to
3:25:19it. Kind of think of this as like a
3:25:21string addition, right? You're like
3:25:22manipulating the string. You're sticking
3:25:23two strings together. So, if I were to
3:25:25press enter here, go to concat, and then
3:25:27inside of quotes, I were to say space
3:25:31world, you can see here that my string
3:25:33has now changed from hello exclamation
3:25:34point to hello exclamation point space
3:25:36world exclamation point. right? The
3:25:38cardinal example of um you know you
3:25:40doing something cool with a computer for
3:25:42the first time. Now I should note that
3:25:43you can also feed in uh more than one
3:25:45string. So you could actually feed in an
3:25:47array of strings. That's why the
3:25:49concatenate function is kind of cool. So
3:25:50I could technically feed in world and
3:25:53then I could go how are
3:25:56you? And then you'll see that you know
3:25:58we've now taken um three strings. We've
3:26:00stuck them all together. The first was
3:26:02hello, the second was world. The third
3:26:03was how are you right? The next series
3:26:05of functions I use all the time and
3:26:07they're the extract functions for
3:26:09strings. So we have four. Extract
3:26:11domain, extract email, extract URL, and
3:26:13then extract URL paths. And basically
3:26:15the way that this works is this is just
3:26:17something that allows you to pull out a
3:26:18domain name from a string that you
3:26:20supply that might include it. You can
3:26:21pull out like email addresses. You can
3:26:23pull out the whole URL instead of just a
3:26:25domain. Or you can pull out everything
3:26:26after the backslash at the end. I'll
3:26:28show you what I mean by all this uh
3:26:29right now. So I'm going to use extract
3:26:31domain first. The way that extract
3:26:32domain works is you either feed in a URL
3:26:34or you feed in a believe like an email
3:26:37and it'll basically tell you what the
3:26:38domain is. Obviously, you know, this
3:26:39isn't rocket science. If I delete the
3:26:41hello string here, because this doesn't
3:26:42actually have any domain inside of it,
3:26:44which is why it's returning undefined.
3:26:45If I were instead to type something like
3:26:47Nick at leftclick.ai, you'll see that
3:26:50extract domain extracts
3:26:53leftclick.ai. Okay. Uh, conversely, if
3:26:56you were to just go leftclick.ai, it
3:26:57would remain the same. If you were to go
3:26:59https back/backslash, it would only
3:27:02extract the leftclick.ai portion. And
3:27:04there are variety of instances in which
3:27:05this is useful. Um, you know, a lot of
3:27:07the time when I'm web scraping for
3:27:08either myself, you know, people pay me
3:27:09to build a web scraper for them, or if
3:27:11I'm doing it for one of my businesses,
3:27:13you know, a lot of the time I'm scraping
3:27:14the web for strings using a regular
3:27:17expression that follow a certain
3:27:19pattern. Maybe something like this.
3:27:20Well, this is just a quick and easy way
3:27:21where I could feed those strings in and
3:27:22then it could extract the the domain
3:27:24name because domain names and URLs are a
3:27:26little bit different. And a lot of the
3:27:27time you need a domain name for
3:27:28something that you don't necessarily
3:27:29need a URL for. So that's just a quick
3:27:31example of something that allows you to
3:27:32extract. If I were to add um some spaces
3:27:35over here though, you'll see that it it
3:27:36breaks. So this does not work if you
3:27:38feed in like multiple or something like
3:27:40that. It's only really going to work if
3:27:41you feed in one and then you just want
3:27:42to extract a portion of it. But this is,
3:27:45you know, comparable to you slicing the
3:27:47string in halves. instead of you having
3:27:49to do some sort of fixed type of data
3:27:50processing where like you're looking for
3:27:52the string that occurs after the second
3:27:54backslash, you know, you can just put
3:27:55extract domain in there and it'll
3:27:57basically just always get you exactly
3:27:58what you want whether or not there are,
3:28:00you know, threeletter tople domain
3:28:02endings or twolet like I have over here,
3:28:04right? So very flexible, very nice. The
3:28:07second function that I'm going to show
3:28:08you is called extract email. So as I'm
3:28:11sure you guys can imagine, if you feed
3:28:12an email into this, it will return with
3:28:14said email. If I go back to that other
3:28:16example and go nickleclick.ai AI. As we
3:28:18see here, we're now extracting Nick at
3:28:20leftclick.ai. You know what's pretty
3:28:22cool? If I add a bunch of other text
3:28:24here to the beginning and then to the
3:28:25end. This is different than the extract
3:28:27domain. Unfortunately, the documentation
3:28:28is pretty poor. But if I feed in a bunch
3:28:30of additional information, let's say I
3:28:32scraped a website and we just have tons
3:28:33of text. And then just somewhere in this
3:28:35text, there's one little line that says
3:28:37Nick leftclick.ai. Okay, one tiny little
3:28:40line. This will extract and pull out the
3:28:42nick at leftclick.ai based off of like
3:28:44an email formatting mechanism. um
3:28:46whereby it looks for a little string and
3:28:48then it looks for some at symbol and
3:28:50then it looks for some domain ending. So
3:28:52that's really really useful. You can use
3:28:53this just as your email extractor. You
3:28:55know, you are going on a website or
3:28:57something like that. You feed in the
3:28:59entire string of the scraped website to
3:29:01this function and then it just pulls out
3:29:03the email addresses for you. I think you
3:29:04guys could probably come up with a
3:29:05million use cases for something like
3:29:07that. Okay, let me just put this back in
3:29:08here cuz I hate when it screams at me
3:29:10with red. And we're going to move on to
3:29:11the next function which is extract URL.
3:29:14So similarly, the way the URL works is
3:29:17uh a little bit differently from extract
3:29:18domain. In case you guys weren't aware,
3:29:20this is the domain name right over here,
3:29:21but this is the URL. So the URL tends to
3:29:24have some sort of I think this is just
3:29:27the protocol. Then you have some
3:29:29standardized delimiter which is usually
3:29:31this colon and then these two
3:29:32backslashes and then you have the domain
3:29:33name. Okay, that's how that works. So uh
3:29:36this will actually extract a URL based
3:29:38off of the presence of this. Now, if I
3:29:40take out the P, right, it's going to
3:29:41break because there is no protocol
3:29:42called
3:29:43HTTS. But I could take out the S and
3:29:45that would work cuz there is a protocol
3:29:46called HTTP. I'm unsure if FTP works.
3:29:50Yes, FTP works. Um, does SSL work? No.
3:29:53Um, SSH, sorry. Uh, no. Anyway, there
3:29:55variety of these protocols. Feel free to
3:29:57look them up if you guys are curious
3:29:58what sort of URL protocols there are and
3:30:00sort of like URL structures. But yeah,
3:30:02this is just a quick and easy way to get
3:30:03the whole URL, which can be very useful.
3:30:05And then from here, what I want to do is
3:30:06show you the last one, which is called
3:30:07extract URL path. And the way that
3:30:09extract URL path works is as opposed to
3:30:12getting the URL itself, which is
3:30:13everything sort of if I put a slash
3:30:15here, it's everything before this line
3:30:17in like the HTTP protocol, they call
3:30:19everything after this first slash the
3:30:21path. And a lot of the time websites and
3:30:23services and stuff like that, they'll
3:30:25actually store a ton of important
3:30:26information after that backslash. If I
3:30:28show you guys what this looks like on NN
3:30:29in particular, you'll see that this is
3:30:31my cloud account. So if I were just make
3:30:33this practical, this is the URL right
3:30:35over here. It's https
3:30:39back/nixerive.app.n.cloud. Okay, this is
3:30:41like the the root part of the URL. This
3:30:43is the protocol. This is the domain
3:30:46name. And then this over here is a URL
3:30:50path called workflow slash and then I
3:30:53have the ID of my particular workflow
3:30:55that end uses to grab data from its
3:30:57server and then display it to me. So, if
3:30:59I wanted to extract this URL path, if I
3:31:01just feed in this whole thing, just as
3:31:02an example and replace my little
3:31:03leftclick.ai example, you'll see that
3:31:06what results when I extract the URL path
3:31:08is basically it goes to this backslash
3:31:11and then it gives me the backslash plus
3:31:14the term afterwards workflow plus
3:31:16everything after um you know the next
3:31:18slash. And the way that URLs work is you
3:31:20can go arbitrarily deep over here. Okay,
3:31:22if we continue down the function list,
3:31:24the next one up is called hash. Now, if
3:31:26you're unfamiliar what a hash is, a hash
3:31:29is basically like a mathematical
3:31:31algorithm applied to a string that
3:31:34converts it into just some big long
3:31:36number. The confusion with hash tends to
3:31:39be that the number that it generates has
3:31:41letters in it. So, if I take this string
3:31:44https
3:31:46back/back/nix.app.cloud, if I take this
3:31:48here, then if I hash it according to
3:31:50their default algorithm, which I believe
3:31:52is MD5, you can see we get this long
3:31:54result here. And the reason why a lot of
3:31:56people don't understand these hashes and
3:31:57you know they're so scary is just
3:31:59because this isn't actually like a
3:32:01string. This is a number um in something
3:32:04called hexadimal. Hexadesimal is just
3:32:06another number system where instead of
3:32:10it going up to 10, it goes 0 1 2 3 4 5 6
3:32:137 9 8 9 and then it goes a b cde e and
3:32:18f. You know how binary is zero and one?
3:32:21Well there's technically a bunch of
3:32:22different number formats. There's binary
3:32:24which is 0 and 1. I think there's
3:32:25quadinary which is 0 1 2 and 3. Um you
3:32:29know there are a bunch of other ones
3:32:30right there's like a number system based
3:32:32off five number system based on 6 7 8 9.
3:32:35Our number system just tends to be based
3:32:37off of 10. That's why it's 0 through 9.
3:32:39But this hexadimal is a number system
3:32:40based off 16. And the thing is we just
3:32:43don't have any other characters that we
3:32:44can use. So uh or I don't know it just
3:32:47wasn't convenient to invent new
3:32:48characters for the 10th thing, the 11th
3:32:50thing, the 12th thing, the 13th thing,
3:32:51the 14th thing, the 15th thing. So what
3:32:54uh computer programmers or scientists
3:32:55the people that developed this um you
3:32:57know standardized format did is they
3:32:59just decided to use the letters A B CDE
3:33:01E and F. So you can think of it as this
3:33:03uh you know the number three corresponds
3:33:05to the number three. Um A corresponds to
3:33:08the number 10. B corresponds to the
3:33:10number 11. C is 12, D is 13, 14, and
3:33:14then this is 15. And the reason why it
3:33:16stops as 15 is because we start from
3:33:18zero. So 0 to 15 is technically 16
3:33:21different numbers. So you know this is
3:33:23one of the main issues with people in
3:33:24hashing I find you know the hexodimal
3:33:26doesn't really explain super easily u
3:33:28but essentially all all that a hash does
3:33:30is a hash is just like an algorithm that
3:33:32takes a string. So if we just go hello
3:33:34instead of this takes a string and then
3:33:36just performs a bunch of mathematical
3:33:38manipulations on the value of h which I
3:33:40don't know might be 85 or something
3:33:42whatever the the computer programmers
3:33:44that came up with the standard for the
3:33:45the numerical value of every letter is
3:33:47and then it turns it into something that
3:33:49is just not easily interpretable by by
3:33:51humans. Um the benefit of having a hash
3:33:53is you can then de de hash this and then
3:33:56you can regenerate this from you know
3:33:58this
3:33:595D4142 back into hello and what you find
3:34:02hashes commonly used for as I'm sure
3:34:03you're aware are security applications.
3:34:05So things like hashing a password for
3:34:07instance there's this big common saying
3:34:09in any sort of computer security and
3:34:11that's never store passwords in plain
3:34:13text. The alternative to plain text is
3:34:14hashing the password in some way. So I'm
3:34:16not going to go too much into this as
3:34:17I'm sure you can imagine it's very niche
3:34:18and this doesn't really make you money
3:34:19to be honest. I mean like you know if
3:34:21you in some computer security thing
3:34:23possibly but there are some values you
3:34:25can feed this and the only real values
3:34:26that matter here are MD5 base 64 SHA1
3:34:31SHA224 SHA 256 Shaw 384 Shaw 512 Shaw 3
3:34:35RIPE MD160 these are all just different
3:34:37algorithms so if the default is MD5 if I
3:34:39were to go instead and go base 64 you'll
3:34:41see that we've now basically done the
3:34:43same thing that we did with the base 64
3:34:45encode function right but uh if instead
3:34:47we want to do Shaw 1 or something you
3:34:49know we get shot 224, um, shot 256, shot
3:34:53512. These tend to get longer and longer
3:34:54and longer the higher the the SHA number
3:34:57thing at the end, just because this
3:34:59basically represents more and more
3:35:00complexity. So, I'm going to leave it at
3:35:02that, but just know that there are going
3:35:04to be a couple of instances that may ask
3:35:06you for hashing on some point in the
3:35:07future, but as somebody that's made tons
3:35:09of money with no code platforms, uh, you
3:35:11know, I don't know, in like over a 100
3:35:13projects, I've had maybe one uh require
3:35:15me to hash something, and that was just
3:35:17really briefly for like one tiny
3:35:18section. Okay, the next function I want
3:35:19to run you guys through is one called
3:35:21quote. It is similar in hash in so far
3:35:23that I don't use it a lot. Um, all quote
3:35:25really does uh from a bird's eye
3:35:27perspective is just wraps your thing
3:35:28around um your your string in quotes,
3:35:30right? So, if I just remove this, you'll
3:35:31see that it is now hello. And if I go
3:35:33back, it now wraps it in these these
3:35:35quote signs. But quote can actually do a
3:35:37lot more than that. It's actually kind
3:35:38of useful when you start getting into
3:35:39sending and receiving data through um
3:35:41you know HTTP requests or web hooks just
3:35:43because a lot of time you have to
3:35:44sanitize the data that's being sent. Let
3:35:46me show you guys a quick example. So, if
3:35:48there's one thing that you guys might
3:35:49not know, um, you know how earlier we
3:35:51defined a string with these two double
3:35:52quotes and then I, you know, wrote it
3:35:53down over
3:35:55here. Okay. Um, well, hypothetically,
3:35:59let's say somewhere in my string I
3:36:00wanted to use another quote. What
3:36:03happens if I try and do this? Well, this
3:36:06breaks the whole string, right? And the
3:36:07reason why is because there's just some
3:36:08built-in logic in string parsers. Parser
3:36:11is just the thing that determines
3:36:12whether or not it's a string. But
3:36:13there's some built-in logic in string
3:36:15parsers that sees this quote, then it
3:36:17sees this one and says, "Oh, this must
3:36:18be the string." Then it sees that one
3:36:20and then that one and goes like, "Oh,
3:36:21no, no, no. This must be the string."
3:36:22Then it sees that one and that one. It's
3:36:24like, "No, no, no. This must be the
3:36:25string." Well, how many strings are
3:36:26there? I can't do this. And then it just
3:36:28quits. So, there are a couple
3:36:30workarounds uh when you're using quotes
3:36:32inside of a string. The first is instead
3:36:33of wrapping in double quotes, what we do
3:36:35is we just wrap it in single quotes. And
3:36:36the second you do that, like this
3:36:38technically, this this is now
3:36:39technically a valid string again. But
3:36:41you'll see, you know, if I just go back
3:36:43here, you'll see that if I try and add
3:36:45quotes inside of this now with this
3:36:47quote function, um, something really
3:36:48interesting happens. And basically what
3:36:50happens is this this feature called
3:36:52escaping. So a lot of the time in order
3:36:55to prevent this exact issue that I was
3:36:57talking about from occurring, what you
3:36:58can do is you can escape a quote sign,
3:37:00which is um, you can proceed it with
3:37:02this like reverse backslash character.
3:37:04What this reverse backslash character
3:37:06does is this just like cancels out.
3:37:08Actually, is this a backslash? I don't
3:37:09know. was a reverse backslash or a
3:37:11forward slash. Anyway,
3:37:14um that's funny. I've probably been
3:37:16calling one the other my entire life,
3:37:18but hey, might as well have that
3:37:19realization during filming of a YouTube
3:37:21video, right? So, uh the way that this
3:37:23works is we are escaping this character
3:37:25with this backslash with this slash
3:37:27character. I'm just going to use slash
3:37:28to like keep my sanity. And then because
3:37:31we have this slash in front of it, um,
3:37:33basically all string parsers and
3:37:36formatterers will will take a look at
3:37:37this and say, "Oh, okay. I can actually
3:37:38ignore the formatting of what happens
3:37:40next." So, let me show you guys an
3:37:42example using what I did earlier. You
3:37:44see how it says Nick says hi. Well, if I
3:37:46actually put a slash here and then a
3:37:48slash here, it's now like an acceptable
3:37:49string, right? But I have to do that
3:37:51manually every time, right? This is kind
3:37:53of annoying. Anytime I'm I'm I'm writing
3:37:55or adding something and I basically have
3:37:56to go find all the quotes and replace
3:37:57them. Well, guess what? That's what our
3:37:59quote uh function over here does. It
3:38:00just does all that automatically for us.
3:38:02So, if you wrap the outside with the
3:38:03single quotes instead, then I remove
3:38:05this
3:38:08uh like this, you'll see that it's
3:38:09actually gone through and it's added in
3:38:10the the the slashes for us. Um so, this
3:38:14is just a form of I don't want to say
3:38:16niche because this can be quite often,
3:38:19you know, used in quite often in many
3:38:21applications depending on what you like.
3:38:23Um it says up here it's useful when
3:38:24constructing JSON SQL. These are all uh
3:38:27you know formatting conventions for
3:38:29sending and receiving data over the
3:38:30internet. But this this allows you to do
3:38:32that. This has one parameter. It's the
3:38:34mark. So you can u actually select the
3:38:36quotation mark that you want to cancel
3:38:37it out with, which is pretty neat. So uh
3:38:39if you want to wrap something, let's
3:38:41just go back to our hello example. If
3:38:43you want to wrap this in different
3:38:44quotes, then you could go single quotes
3:38:47like this. You could also just create
3:38:48whatever quote you want. So
3:38:50hypothetically, let's say that the I
3:38:51don't know the underscore is my new
3:38:53quote character. Well, I can just um
3:38:55have that wrap everything. Okay, let's
3:38:57cover the next string function. As you
3:38:59can see, we are making some good time.
3:39:01The next one here is one called remove
3:39:03markdown. Now, markdown is another
3:39:06example of a formatting convention. And
3:39:07you'll see that this is in large part
3:39:09what string manipulations are for. They
3:39:11take some formatting convention and they
3:39:12just fix it for you. So, the way that
3:39:14markdown works, and this is kind of
3:39:16beyond the purpose of this discussion,
3:39:19uh let's just look this up really
3:39:20quickly. There's some basic syntax guide
3:39:22here. Feel free to check this out if you
3:39:23want. But this is very commonly used
3:39:25when you are calling um large language
3:39:27models and open AAI and claude and these
3:39:29various services to turn text um so that
3:39:32it's not just plain text but actually
3:39:34has some sort of formatting. So here's
3:39:36markdown on the left. Markdown. If you
3:39:37want to like create a header, what you
3:39:39do is you add a dollar sign, dollar
3:39:41sign. You add a number sign and then a
3:39:42space and then the header. If you want
3:39:43to do like an H2, you go two
3:39:46H3. They show us what it looks like in
3:39:48HTML as well, which is another markup or
3:39:50rendering language over here. And you
3:39:52can see that, you know, if you want to
3:39:53do the equivalent thing for markdown in
3:39:54HTML, you need to wrap this in some H1
3:39:57tags. Markdown's a little bit more
3:39:58efficient. As you can see, the total
3:39:59number of characters used to represent
3:40:01the same information was just two here
3:40:02instead of 1 2 3 4 5 6 7 8 9. And so
3:40:07when you communicate with large language
3:40:08models, you know, obviously the main
3:40:09benefit there is the fewer tokens, the
3:40:12fewer characters, the less money you
3:40:13tend to be built, especially with these
3:40:14bigger APIs. So that's why everybody
3:40:16just tends towards markdown in order to
3:40:17get rendered outputs like this. So all
3:40:19that function that remove markdown does
3:40:20is hypothetically if I go back to
3:40:22creating my own string again and then I
3:40:24were to say heading one, you'll see that
3:40:26this just takes out the markdown
3:40:28formatting. It has a built-in parser
3:40:30again that looks specifically for
3:40:32instances of these number signs for
3:40:33headings. If I were to add 2 3 4 5 6 7
3:40:368, you know, as you can see, nothing
3:40:38really changes here. You know, it does
3:40:39add a space, which is interesting, but I
3:40:40don't believe it adds a space um on
3:40:42anything up to six. Yeah. So anything up
3:40:44to and including six doesn't add a
3:40:46space. It does on seven. Why? cuz this
3:40:48is no longer considered um like uh like
3:40:51there is no heading seven hypothetically
3:40:52and so now it says okay this just must
3:40:54be like a bunch of bogus markdown um
3:40:57number symbol stuff so this must
3:40:59actually be a real character we're going
3:41:01to render the space peculiarities of
3:41:03markdown aren't super important just
3:41:04know that you can remove it all with
3:41:06something like this if you want
3:41:07similarly there's also a function called
3:41:09remove tags which works as I'm sure you
3:41:11can imagine very similar to remove
3:41:12markdown it's just all this does is
3:41:14instead of removing markdown if we go
3:41:16back to our markdown in HTML comparison
3:41:18here. It just removes the HTML tags. So,
3:41:20this is considered a tag in HTML. If I
3:41:23were to go back to my end function and
3:41:24if I were to try and create a new
3:41:27heading called heading one, what this
3:41:30will do is it'll jump in. It'll actually
3:41:31just remove all instances of this. Now,
3:41:34when is this useful? Um, well, I'll give
3:41:36you guys a quick and easy example just
3:41:37because I think that this is something
3:41:39that I do often enough for it to
3:41:41represent like for it to be valuable.
3:41:43But if I go and I do an HTTP request to
3:41:45my own website, notice how on the right
3:41:47hand side here, I receive a bunch of
3:41:48HTML. That's kind of a lot of HTML.
3:41:50Right? Now, if I go and I add another
3:41:52edit fields node and then I go manual
3:41:55mapping and then I go um no tags. If I
3:41:59feed in my
3:42:01data and then if I go remove tags, what
3:42:05you'll see is I've basically gone
3:42:07through and if I just expand this a
3:42:08little bit so we could see big. I've
3:42:10basically gone through and I've taken as
3:42:11input all of this ugly looking HTML.
3:42:14Then I've gotten as output just the
3:42:15plain text of the website basically. And
3:42:18when you have the plain text of the
3:42:19website, not only is it a lot more token
3:42:20efficient when you're calling large
3:42:21language models and stuff like that, you
3:42:23know, you could you could run like
3:42:24searches over this uh it' be easier,
3:42:25faster and so on and so forth. So this
3:42:27is just a principle of like removing
3:42:29waste. So that's how you'd use that. The
3:42:31next function I want to talk about if we
3:42:32just go back here and then select my
3:42:34dollar sign JSON and then go back to
3:42:36string. The next function I want to talk
3:42:39about is called replace. Now, as opposed
3:42:41to replace all, which I use a lot more
3:42:43often than replace. What replace does it
3:42:45just replaces the first element that uh
3:42:47it sees with another element, it doesn't
3:42:49just replace every instance of it in the
3:42:50entire string. So, remember how earlier
3:42:52replace all took L's and then I replace
3:42:54them all with W's and then it was hello.
3:42:56Well, in this case, if I were to try and
3:42:58replace an L with a W, it would go hello
3:43:00instead cuz it's only grabbing the first
3:43:02one. If I switch this back now to
3:43:04replace all, it does um all characters.
3:43:06But if I go back to replace, you see it
3:43:07only does one. So it's kind of neat. Um,
3:43:09you know, it's a little bit niche. I
3:43:10mean, there aren't too many situations
3:43:11in which you want to replace one
3:43:13character and not replace all
3:43:14characters. At least in my experience.
3:43:16There's another function here called
3:43:17replace special cars. Basically, you
3:43:19know, a lot of other languages than
3:43:21English will have things like accents.
3:43:22So like alone, you have deja, you have
3:43:29excuing characters that sometimes,
3:43:31unfortunately, APIs do not support. What
3:43:34this does is it just allows you to take
3:43:35them out. So if you know I had uh how
3:43:40the hell am I going to write
3:43:41that? I just realized that I don't
3:43:44necessarily have any of these. Um you
3:43:47know if I was going to write something
3:43:49like you know
3:43:51zuer let's go back here. What this will
3:43:55do, you know, if you feed Ju into
3:43:57replace special characters, um the
3:43:58output is just going to be zu like
3:44:00without the the exaltu um on the right
3:44:02hand side of this. And you know, this
3:44:04doesn't just apply to French. Obviously,
3:44:06there's a ton of languages out there
3:44:07with all sorts of things above letters
3:44:09like um and stuff like that in German. I
3:44:11believe that's how you pronounce them.
3:44:12Anyway, any Germans in my audience, feel
3:44:14free to roast the hell out of me. Yeah,
3:44:15it's just a quick and easy way to just
3:44:16replace those before you do an API call
3:44:18to a service that doesn't support them.
3:44:20So, if you're calling a service and then
3:44:22it just like keeps on giving you weird
3:44:23error messages that you don't fully
3:44:24understand and your input includes one
3:44:26of these characters with like accent
3:44:29above or some sort of marking or symbol,
3:44:31call replace special cars and give it
3:44:32another try. I use this maybe like 5% of
3:44:35the time. Most APIs are pretty good now,
3:44:36but some of them are still sort of
3:44:38modernizing. Okay, the next function is
3:44:40called slice. Now, slice is pretty
3:44:42interesting. I use slice all the time.
3:44:44If I go and select JSON string, what
3:44:46slice does is it basically allows you to
3:44:48select a substring, but not based off of
3:44:51characters, but actually based off of um
3:44:54the number of characters from the start
3:44:56or the finish. So, we're not slicing
3:44:57based off of L to O. Well, I mean, like
3:44:59we can if we want, but I guess what I'm
3:45:01trying to say is we're feeding in the
3:45:03character order and the position and
3:45:04then we're using that to extract a
3:45:06substring. So, everything is zero index.
3:45:08That just means it starts at zero at an
3:45:09ind. This is technically the zeroth
3:45:10character. This is the first character.
3:45:12This is the second character. If I were
3:45:13to try and grab everything from zero to
3:45:160, 1st, 2nd, 3rd, I think fourth, maybe
3:45:20I'd go 0 to four and then it would say
3:45:22hell, right? You know, if I just wanted
3:45:24to grab the O, I'd go four to six, then
3:45:26I grab the O, and then the exclamation
3:45:28point. There is some nuance regarding
3:45:30the start position, and I believe the
3:45:31second one is inclusive. You also don't
3:45:34necessarily always need to have uh the
3:45:36second value here. So, you can actually
3:45:38just feed it in a start, and then it'll
3:45:40just automatically run till the end of
3:45:41the string. That can be pretty useful
3:45:43because you know sometimes you don't
3:45:44know the length of the string, right?
3:45:45Sometimes you just want to grab
3:45:46everything from like the third character
3:45:47onwards. If you think about it using our
3:45:49previous example, let's say I have
3:45:51something like this. Well, instead of
3:45:52using the extract domain, you could use
3:45:54slicing as an alternative to you
3:45:56extracting a domain if you wanted to.
3:45:58Obviously, the only issue would be if
3:46:00somebody removes the S and it's instead
3:46:02like an unvalidated or nonsecure
3:46:03request, then all of a sudden we lose
3:46:04the first letter. So, it's usually
3:46:06better uh in those cases to do to use
3:46:09the tools that were sort of meant for
3:46:11this. and you'll be able to handle any
3:46:12flexible amount that you'd like. Yeah,
3:46:14slicing has a number of uh cool use
3:46:16cases, I would say. So, generally a fan
3:46:19of the slice function. Let's go back to
3:46:21JSON. And let's see what's next. We
3:46:24already covered split, so I'm just going
3:46:25to cover that. Next up, we have
3:46:26something called substring. Substring
3:46:28is, from my understanding, basically the
3:46:30exact same thing as slicing. I'm not
3:46:32really sure why there are two to be
3:46:34completely honest. Um, all this does is
3:46:36just returns the same thing that slice
3:46:37does. So, let me give you an example. If
3:46:39we were to go uh 0 to four, it's hell.
3:46:42If we just replace this with slice, you
3:46:44see the result doesn't really change.
3:46:46So, I'm not really sure why substring
3:46:47exists to be completely honest, but this
3:46:49is just personally uh what I always use.
3:46:51I like slice better than substring cuz
3:46:53how much cooler does slice sound? We're
3:46:55slicing a string than versus we're
3:46:58extracting a substring. You should just
3:47:00operate purely off of vibes, clearly. Um
3:47:02anyway, next up we have a function I use
3:47:05pretty often. It's called trim.
3:47:06Basically, what happens a lot of the
3:47:07time, especially when you're scraping
3:47:09resources, is you will get data, but
3:47:10that data will tend to have like a
3:47:11variable amount of white space to the
3:47:13left and to the right. Whites space just
3:47:14means a bunch of spaces or new lines or
3:47:16something. Trim just removes all of that
3:47:17for you. So, um, you know, I mean, they
3:47:19give you an example of lonely. Let me
3:47:21show you what this might actually look
3:47:22like with a string that we type in. You
3:47:24know, this is, hey, how's it going?
3:47:27Google.com and then we have another
3:47:29space. What this does, as you can see
3:47:31here, there are three spaces. There's
3:47:32one at the beginning, there's one in the
3:47:34middle, and then there's one at the end.
3:47:35Uh what this does is it just removes the
3:47:36ones on the end. Same thing, you know,
3:47:38if we added well, I mean, you can't
3:47:39really do it, but if we added like a
3:47:40bunch of new line characters, uh tab
3:47:42characters as well. This isn't actually
3:47:44like taking any of those because the
3:47:45part of the way that this works is it
3:47:47just looks for the presence of that
3:47:48slash and then the nt and I think
3:47:50there's one more. These characters just
3:47:52denote like a new line. Pretty useful to
3:47:54use. So yeah, I like to use trim
3:47:56basically anytime that I'm feeding in a
3:47:58string that may have some sort of
3:47:59variable white space. Uh when I'm
3:48:00scraping, I use trim all the time. you
3:48:02know, just kind of make sure that my
3:48:03data is standardized, formatted well,
3:48:05and that I'm not just like asking for
3:48:06any additional like I'm not using any
3:48:08additional characters or tokens. There's
3:48:10trim end and then there's trim start.
3:48:11Um, this just does the same thing that I
3:48:13showed you guys earlier. It's just it
3:48:14preferentially removes things at either
3:48:16the start or at the end. So, trim end
3:48:18obviously just takes this out. If I were
3:48:19to change this to trim start, it would
3:48:20obviously just take that out, but I just
3:48:22tend to use trim more generally. We have
3:48:24two more functions under edit, and those
3:48:26are URL encode and then URL decode. Now,
3:48:30if you're unfamiliar with how this
3:48:31works, usually um when you are dealing
3:48:33with a URL of some kind, you have
3:48:36characters that look kind of like this.
3:48:38You have percentage signs, threes, um I
3:48:40think those rep uh percentage sign 3D, I
3:48:43think those represent an equal sign.
3:48:44Percentage sign 20 that represents a
3:48:46space. The reason why you do this is
3:48:48because you can't actually just legally
3:48:49have, you know, like if if this is my
3:48:51URL, you can't actually legally have um
3:48:53a bunch of spaces. So, actually, let's
3:48:55go back and let's go docs.google.com.
3:48:58Like you can't say hello, how are you?
3:49:00Uh this would not be a valid URL, right?
3:49:02But what you could do is you go um
3:49:04number sign 20 number sign 20 number
3:49:06sign 20 number sign 20 and now this
3:49:08would be like an actual URL. It's not a
3:49:10URL somebody has created but it is a
3:49:12real URL like we can actually press
3:49:14enter and and format it. So all that
3:49:16this does is it basically converts
3:49:18something that may include those
3:49:20characters into something that doesn't
3:49:21and uh vice versa. So let's
3:49:23hypothetically say you wanted to go to
3:49:24leftclick.ai AI and then you want it to
3:49:26go to blog post call. Let's go blog and
3:49:31then we go a post with the name of
3:49:36awesome. Okay. If we URL encoded this,
3:49:39what it would do is it would take all of
3:49:41the characters that aren't really like
3:49:43legally allowed. So, you know, in our
3:49:45case, mostly these spaces, although you
3:49:47see it actually also does some
3:49:48transformations under the hood to colons
3:49:51and backslashes and stuff like that just
3:49:52because these characters aren't
3:49:53technically being rendered. you know,
3:49:54it's just kind of a quirk of how the
3:49:55browsers are rendering these to us. But
3:49:57in reality, when you like request to a
3:49:58server or something like that, they're
3:49:59they're being encoded. And then uh what
3:50:01you can do is you can then subsequently
3:50:03decode this and you can kind of
3:50:04transform it back to your initial URL.
3:50:07So sometimes you'll just see an API or
3:50:09something that'll say, you know, this
3:50:10requires like URL encoded um or I don't
3:50:13know this this requires stuff encoded in
3:50:14a certain way. You can use URL encode
3:50:17when you're sending and receiving and
3:50:18making requests to things. I basically
3:50:20never really use this in practice, but
3:50:22it is uh something that they offer to
3:50:24you as a tool in case you need to. Okay,
3:50:26next up we have a bunch of query
3:50:27functions. We've already covered ends
3:50:28with and includes. Now I'm going to
3:50:30cover index of. Index of is pretty cool.
3:50:32It basically allows you to find a
3:50:33substring that is present inside of the
3:50:35string and then tell you at what index
3:50:38did that substring occur. This can lead
3:50:40to some really interesting string
3:50:41manipulations and some cool use cases
3:50:43where like you'll find the index of
3:50:44something first and then you will use
3:50:46that to take a slice or something from
3:50:49from one character to another and then
3:50:50do a bunch of other cool stuff. Send and
3:50:52receive data that way. But uh yeah, I
3:50:54mean in our hello example, right, if I
3:50:56were to feed an index of H, what do you
3:50:59think would happen? We'd feed in zero. E
3:51:01would be one. L the thing about L is
3:51:04notice that you know I have two L
3:51:05characters there, right? So if I really
3:51:07wanted to get the index, I'd have to go
3:51:09L because that's a unique character
3:51:12there. Could also go O, which would be
3:51:13four. Then I go exclamation point, which
3:51:15be five. I go L. I could go L. I could
3:51:19go L L. I could go low. And then I could
3:51:23go O exclamation point. And then I could
3:51:25get like basically a a sliding window of
3:51:28two characters instead. But just notice
3:51:29how it always grabs the beginning of
3:51:32that. in their example steam and then t
3:51:35we're finding the first um index because
3:51:38s is at zero t is at one and then even
3:51:40though it's three characters te ea it
3:51:43still starts at one which is pretty neat
3:51:45so yeah I use index of not super often
3:51:47to be honest I usually don't need to
3:51:49search through things um numerically
3:51:51like that but you know it's a good
3:51:53function to understand last index of is
3:51:55very similar to index of but it solves
3:51:56that problem that we had a moment ago
3:51:58with the l so um you know if we go index
3:52:00of and we just type in and L the result
3:52:03is two. But if there are instances where
3:52:05we might have you know some characters
3:52:08repeated multiple times or something you
3:52:09can grab the last index of L and notice
3:52:11how that is now three in our hello
3:52:12string. Next we have match. Match is
3:52:14pretty interesting and you sort of need
3:52:16to understand a term called regular
3:52:17expressions in order to really get it.
3:52:19But essentially this is a much more
3:52:21powerful find and replace sort of tool.
3:52:24Um I don't know if this function in
3:52:26particular allows you to replace
3:52:27something. I don't believe so. But it
3:52:28does allow you to find the thing. And
3:52:29then you could always just like grab
3:52:30that thing and then replace it later.
3:52:32But um basically let's say we have a
3:52:34string, right? And instead of hello, I'm
3:52:36going to use a much more varied example.
3:52:38I'm going to say hey man, how are you
3:52:41doing today? Okay. And hypothetically,
3:52:44let's say we want to find the man or um
3:52:47we want to extract the man string. So if
3:52:50man is present inside of this, we want
3:52:52to extract it. If it's not, then we
3:52:53don't want to. Okay. What we do in order
3:52:56to do this is we build up something in
3:52:58what's called the regular expression I
3:52:59think like templating language. So
3:53:02instead of just like identifying the
3:53:03thing, we're actually going to extract
3:53:04it. And the regular expression
3:53:06templating language like it looks kind
3:53:07of weird. As you can see here, there's
3:53:08some there's some backslashes and then
3:53:10some up arrows and stuff like that. It's
3:53:13it's not super difficult to do. If I
3:53:14were to type in a backslash and then man
3:53:16and then another backslash and I really
3:53:19got to stop using the term backslash
3:53:20here. Um, you can see that it did in
3:53:22fact extract men. But hypothetically, I
3:53:25could also instead of just looking for
3:53:27man and like hard- coding it like this,
3:53:28cuz this really doesn't do anything for
3:53:30us, right? Instead, what I can do is I
3:53:32could look for all instances of
3:53:33threeletter words. Okay? So, um, in this
3:53:36language, it would be a to z to z. Then
3:53:43it would be a to z to z. But I just copy
3:53:47that one last
3:53:48time. And then we do that one more time.
3:53:52Now, um, in our case, we're we're
3:53:54matching the first instance of this. Um,
3:53:55but if we wanted to match all, I think
3:53:57we we'd feed in a G operator, which
3:54:00would be on this backslash and this
3:54:02slash and then this G at the end, just
3:54:04because regular expressions are sort of
3:54:05outside of the scope of a video like
3:54:07this, and because it's an entirely new
3:54:09language, um, my go-to is if you want to
3:54:11build a regular expression, if you need
3:54:12one, and there are many, many instances
3:54:14in which you will need one, head over to
3:54:15this website over here, reax 101. You
3:54:18can insert whatever your string is that
3:54:19you want. Hey, how are you doing today?
3:54:22And then sorry, you'd actually insert
3:54:24the test string down here. And then you
3:54:26actually have the ability to play around
3:54:27live and see how your changes extract
3:54:29various parts of um the text. So as you
3:54:32can see, we have this backslash at the
3:54:33very beginning. Dang, this slash at the
3:54:35very beginning. We have this slash at
3:54:37the end, and then we have some options
3:54:39here. Um these options always just occur
3:54:40after the last slash. So in our case,
3:54:42global and multi-line. Um again, this uh
3:54:45this resource will explain everything to
3:54:46you if you look at it. But if you wanted
3:54:48to extract the man, you might type man.
3:54:50Um, it's going to say that it's not
3:54:51matching the subject string because we
3:54:53don't have man in it. But if we say how,
3:54:54right, you'll see that as I type H, it
3:54:57illuminates two elements that are being
3:54:59extracted. H O, now it's these and then
3:55:01H O. There also a bunch of really cool
3:55:03things. Maybe we want to go like you
3:55:05doing, right? But maybe instead of you
3:55:08doing, we just want to find the presence
3:55:10of U and then we want to extract
3:55:11everything from U all the way to the
3:55:12end. Well, if I were to do that, then um
3:55:14I could just go period, which matches
3:55:17any character, and then I could multiply
3:55:18it an infinite number of times to go to
3:55:20the end. Or maybe I want to grab
3:55:21everything before the U. So, I'd go
3:55:24period U. And now I extract everything
3:55:26here. You can also play around with the
3:55:28presence of um these two brackets. This
3:55:30allows you to extract specific sub
3:55:33elements or substrings from the parent
3:55:35string. Um so, as you can see here, now
3:55:36we have a green section that is
3:55:38illuminated because we've wrapped this
3:55:40in a capture group. And then the the
3:55:42blue U section is sort of also captured,
3:55:44but it's not in our captured group. And
3:55:47yeah, that's just more or less a quick
3:55:48little rundown of what you can expect if
3:55:50you were to go super deep in regular
3:55:52expressions. Uh I should also note that
3:55:54an AI is really really good at coming up
3:55:56with regular expressions for you. Like
3:55:57if I were to feed in this and then I
3:56:01were to say I want a regular
3:56:03expression to capture
3:56:06um all threeletter words in the above
3:56:10string. If I were to press enter and I'm
3:56:12just using a new model called 03 mini
3:56:14high. Uh it's new as of the time of this
3:56:16recording and probably not going to be
3:56:17new by the time that you guys watch it.
3:56:19Uh but if I were to do this uh I would
3:56:21get something like this. And notice that
3:56:23it's always going to start with a slash.
3:56:24It's always going to end with a slash.
3:56:26And if I were to feed this
3:56:28in, if I were to remove the beginning
3:56:31and at the end, what you can see is we
3:56:32basically gone through we we've
3:56:33extracted all threeletter characters.
3:56:35Um, and it threeletter words, and it's
3:56:37done a really good job of it. So, you
3:56:39know, over the course of the last, I
3:56:41want to say 6 months or so, AI has
3:56:42gotten to the point where he can do
3:56:43this, um, as of the time of this
3:56:44recording. Uh, and if you know, you're
3:56:46wondering how exactly to do regular
3:56:48expressions and you're watching my video
3:56:49and you're like, "What the hell is that
3:56:50guy doing?" Um, AI can can do an even
3:56:52better job than I can like 90% of the
3:56:54time already. So, they're automating my
3:56:56regular expressions. What a dang shame.
3:56:59Next, we have a another uh module or
3:57:02another function that uses regular
3:57:04expressions, but instead of returning
3:57:05the actual extraction, what we're doing
3:57:08is we're returning the place that the
3:57:11character occurred. So, in this case,
3:57:13we're searching for n and then we're
3:57:16going um I don't know, I think this is
3:57:18like at the beginning of a word and then
3:57:21anything else after that. And so it
3:57:23tells us, hey, what time does the first
3:57:24word start or in what position does the
3:57:26first word starting with n occur? In
3:57:28this case, it's 0 1 2 3 4 and then five.
3:57:31Um, and keep in mind that regular
3:57:33expressions tend to be case sensitive
3:57:34unless I think you specifically turn
3:57:36that off. So, uh, it's not capturing the
3:57:38first capital and it's capturing the the
3:57:40second. I don't really use search
3:57:41basically ever to be completely honest.
3:57:43Um, search to me just doesn't really
3:57:44have any value that index of doesn't.
3:57:46So, uh, from here on out, we are now
3:57:49moving into the validate section. So now
3:57:51we have a suite of functions that I use
3:57:53very often to validate whether something
3:57:54is a domain, whether something is an
3:57:56email, whether something is empty,
3:57:58whether something is not empty, whether
3:58:00something is numeric or whether
3:58:01something is a URL. Let's start with
3:58:02domain. So remember earlier how we fed
3:58:06in https
3:58:08back/back/leclick.ai. Right? And then I
3:58:10said that this was a URL and inside of
3:58:13the URL you had a protocol, you had some
3:58:15sort of delimiter, and then you had the
3:58:16domain name. Well, this will tell you
3:58:18whether or not what you're feeding in is
3:58:19a domain name. So what do you think? If
3:58:21I feed this in, is this a domain? The
3:58:23answer is no because we include we've
3:58:25included the protocol and the delimiter
3:58:26as well. If I take this out, is domain
3:58:28now reverse to true. Now, alternatively,
3:58:31if I change this to is URL, you'll see
3:58:33that this is true. But if I just feed in
3:58:35a domain name, you'll see that this is
3:58:36false because a URL requires all of the
3:58:39other subsequent
3:58:40components. Okay, we have a couple of
3:58:42other ones that we can go into as well.
3:58:43We can do empty. So if a string is
3:58:45empty, you can very quickly validate and
3:58:47check it. So obviously, is this empty?
3:58:49No. Right. But if I were to take this
3:58:52and delete everything, then yes, it is
3:58:53empty. We can go is not empty, which is
3:58:56just the inverse of is empty. So is is
3:58:58this not empty? Yes, true. This is not
3:59:00empty. There is a bunch of stuff inside.
3:59:02If I take it out, is this not empty? No,
3:59:04it is empty because there's nothing
3:59:05inside. And then similarly in the same
3:59:07vein, um we can do a little bit of
3:59:10checking to see whether or not something
3:59:11is an email. So if nick at
3:59:15leftclick ai, you'll see that this
3:59:18converts to true because there is
3:59:19currently no tople domain. That's just
3:59:21the thing at the very end here. Um that
3:59:23isn't at least two characters, right?
3:59:26But if I were to just feed in a domain
3:59:27name, that would obviously be false.
3:59:29Quick and easy way to do validation and
3:59:31verification. And then there's also one
3:59:33for a numeric, which is somewhat
3:59:34interesting. Basically, what you have is
3:59:36the ability to check whether or not all
3:59:38that you fed in is is a number.
3:59:40So you can feed in um integers, you
3:59:42could feed in like decimals, you could
3:59:43feed in like negative numbers and stuff
3:59:45like that. Um and if it's a number,
3:59:46it'll tell you. If you feed in an f or
3:59:48an e or whatever, um then you know
3:59:51obviously this is no longer just a
3:59:52number. It's also a bunch of other
3:59:54characters here, which is why is numeric
3:59:55is now reverting as false. Okay, the
3:59:57next functions are very simple and very
3:59:59straightforward. There are a bunch of
4:00:00case functions. So there's two
4:00:02lowercase, two sentence case, two snake
4:00:04case, two title case, and two uppercase.
4:00:06Lowerase is hopefully self-explanatory.
4:00:09Hello. How are you doing, Nick? If I
4:00:12feed in this, which has two
4:00:15capitalizations, it just lowercases
4:00:17everything. This might be useful when, I
4:00:19don't know, you're trying to convert
4:00:20something into a domain. So, if I were
4:00:22to go uh sorry, convert something like
4:00:24like into a blog post slug. So, let's
4:00:25say I had a blog post title and it's 38
4:00:28ways to make money online, right? And I
4:00:31wanted to convert this um into something
4:00:33that I could stick onto my my URL.
4:00:35Basically, what I could do first is I
4:00:37could replace
4:00:38all instances of a space and I could do
4:00:42so with a dash and then I could just go
4:00:46lowercase. And what I'm doing now is I'm
4:00:49converting um this over to something
4:00:51that might actually fit inside of my
4:00:52URL. Pretty cool, right? That's what
4:00:55lowercase does. Now, obviously, there is
4:00:57an alternative and that is if I just
4:00:59remove this here, um there are a bunch
4:01:02of other similar functions that change
4:01:04the case of the of the string that
4:01:06you're feeding in. So, if I were to say
4:01:0838 ways to feed, sorry, to make money
4:01:10online, and then I would go to go
4:01:12uppercase, well, then we would just
4:01:14scream 38 ways to make money online. But
4:01:16there are a couple of other cases as
4:01:18well. There's something called sentence
4:01:20case. The way that sentence case works,
4:01:21if you're unfamiliar, is it basically
4:01:23just capitalizes the first letter of the
4:01:25entire string. So, ways to make money
4:01:27online, right? If I were to remove this
4:01:30to sentence case, you'll see that I'm
4:01:31basically taking all of these and then
4:01:33I'm I'm pumping them. Uh, I'd have to
4:01:36remove this dot as well. And then I'm uh
4:01:38bringing up all of the subsequent first
4:01:39letters of every word back up to capital
4:01:41case. For to put this in, I just remove
4:01:43that. And then there's a there's a
4:01:44couple more. There's one called snake
4:01:46case. Snake case is pretty interesting.
4:01:48Um, this basically does uh almost like
4:01:50what I was what I was saying earlier
4:01:52with the URL replacement, but instead of
4:01:53a dash, we're doing an underscore. And
4:01:55this is just like a way to like create
4:01:56variable names really quickly because
4:01:58there are two naming conventions for
4:01:59variables. There's um camelc case and
4:02:01then there's snake case. Snake case just
4:02:03always has underscores between every
4:02:04word because uh spaces are not
4:02:07represented well in programming because
4:02:08parsers break. And then the last one is
4:02:11to um title case. And what you'll see is
4:02:15nothing changes between this and this.
4:02:17The reason why is cuz this is already in
4:02:19title
4:02:21case. All title cases is it grabs the
4:02:24first letter of all major words. So I
4:02:26think uh words that are not connectors
4:02:28like to or at or a or 'the' and it makes
4:02:31them capital. So ways make money man if
4:02:36I were to go at I guess that
4:02:39is oh no it's not if I were to go at
4:02:42then at would not be a connector the
4:02:45right most would but not the so yeah I
4:02:48mean all of these are just different
4:02:49ways to turn something into um something
4:02:52else which is nice. Okay the next
4:02:53function is called parse JSON. It's
4:02:55pretty interesting. Uh, but basically
4:02:56the way that it works is a lot of the
4:02:58time when you receive queries uh from
4:03:00the internet like when you do some sort
4:03:02of scraping or when you consult an API,
4:03:04what you get is you get something that
4:03:06has a lot of those escaped delimiters
4:03:08that I mentioned, the slashes before
4:03:09certain characters. So I'll give you
4:03:11guys a quick example and you'll
4:03:12understand this intuitively. Let's say I
4:03:13have a string here. Okay? And this
4:03:15string is like a JSON object. So I'm
4:03:17going to go name and in order to do this
4:03:20I'm going to cancel it out and then I'll
4:03:22go you know Peter like this and then
4:03:26I'll wrap it. Uh if I feed this into
4:03:28parse JSON, you'll see what happens is
4:03:30I'm actually parsing this out into an
4:03:32object. Like previously, this is a
4:03:35string, right? The string is uh this
4:03:38curly brace, the quote sign, name other
4:03:41quote sign colon uh quote sign uh Peter
4:03:44and then quote sign and then this other
4:03:46curly brace. But if I go parse JSON,
4:03:48what I'm actually doing is I'm
4:03:49converting this to an object. I'm
4:03:50literally converting the data type into
4:03:52another data type um which I will be
4:03:54showing you um you know, cool things
4:03:56about. And if you if you parse this, if
4:03:58you click test step,
4:04:00um what you'll see is sorry uh what I'm
4:04:02what I mean to say is now that it's
4:04:04parsed, what you can do is you can
4:04:05actually reference things inside of the
4:04:07variable of the thing that you just
4:04:08parsed. So now, for example, I can
4:04:09actually just extract the name from
4:04:11this. So I mean, you know, uh obviously
4:04:13I'm just writing this all out right now,
4:04:14which is why this doesn't seem very
4:04:16useful. You can imagine how if you
4:04:17receive a big long string, well, you can
4:04:19actually parse it directly in your
4:04:21expression editor, which makes this
4:04:22super powerful. Um, you know, as I
4:04:24mentioned, I don't use this super often.
4:04:26Uh, just because I'm not like calling a
4:04:27lot of dedicated or hidden APIs where I
4:04:30find that this typically comes up. Um,
4:04:32but you know, you can you can use this
4:04:33so that you don't have to like add
4:04:35another node. You don't have to like
4:04:36render something or or parse something
4:04:38in this node and then deal with it
4:04:39later. What you can do is actually just
4:04:41like get a string that contains
4:04:42JavaScript, parse it out, and then
4:04:45you'll be able to extract whatever value
4:04:47you want. So, you know, because this is
4:04:49an object, I can now reference keys or I
4:04:52can get values, right? I can do a lot of
4:04:53other stuff with it. Um, and I'm going
4:04:55to be running you guys through the
4:04:56object functions in a moment. Okay, the
4:04:58next function is to boolean. Boolean's
4:05:00pretty simple. Um, basically if I feed
4:05:02in a one or a zero, what I do is I
4:05:05convert this data type from a string
4:05:07into this boolean which is true or
4:05:09false. So zeros are false, right? Zero
4:05:11is is um no, it's off. It's false in
4:05:15boolean logic. One is on, it's true,
4:05:18it's good, right? So um I'm basically
4:05:21converting this from a string into like
4:05:24a separate data type called true. I
4:05:26rarely use this in practice because most
4:05:27of the nodes in n that I'm realistically
4:05:30going to care about. They're going to
4:05:31have some sort of type conversion built
4:05:32in. This next one is called to date
4:05:34time. This is actually super useful um
4:05:36because a lot of the time you're going
4:05:37to be converting to and from some
4:05:39standardized datetime format in order to
4:05:41do things like add a certain number of
4:05:42minutes, add a certain number of hours.
4:05:44The context here is NAN uses this
4:05:47specific type of datetime formatting
4:05:48called Lexon datetime. But basically all
4:05:50this does is it just allows you to
4:05:51convert like a string into another type
4:05:54of object that you can now do math with
4:05:56basically uh which is pretty cool. So
4:05:58I'll give you guys a quick example um
4:05:59just to show you guys just how many
4:06:01things are representable as dates. If
4:06:02you just feed in like the number one, it
4:06:04will find the first date of 2001. Why? I
4:06:07I don't know. There's just some logic
4:06:08that's going on under the hood. But
4:06:10hypothetically, if I were to grab the
4:06:11current date in um I think like uh day
4:06:15day no month month day day year year
4:06:17format it would be 0131
4:06:20uh 2024. Right? So now this is
4:06:23converting um the current date to the
4:06:26standardized date format. Sorry I guess
4:06:282025 it converts into the standardized
4:06:30detype format. What's the cool thing
4:06:32about this? Well, if I press uh dot here
4:06:34now, what I can do is now I have a whole
4:06:36other function suite available to me
4:06:38that includes datetime specific
4:06:41functions. So now we can do a bunch of
4:06:43really cool things. We could convert to
4:06:44local string and now this actually
4:06:46converts this into um the specific uh
4:06:49basically they grab my local and then it
4:06:52converts it into the specific type of
4:06:53string that people are most likely to
4:06:54see here. So you can imagine this might
4:06:56be really really useful if you're
4:06:57working in databases or something like
4:06:59that. There are a variety of other
4:07:00datetime functions as well which we're
4:07:02going to get into. But yeah, you can do
4:07:03things like extract certain times. You
4:07:05can do things like subtract uh I don't
4:07:07know five days from January the 31st to
4:07:10give us January the 26th. All this stuff
4:07:12ends up being super super valuable um
4:07:14when you're working. Okay, great. The
4:07:16last thing I want to cover is to number.
4:07:18So let's say I have the number
4:07:22123,54. Okay. All this does is it takes
4:07:26the string that is 123,54 and converts
4:07:29it to a number. What do I mean by this?
4:07:31Well, um numbers and strings are
4:07:33different, right? And so, um all this is
4:07:35doing is it's allowing me to do a
4:07:36conversion from the string format of
4:07:391,120,54 to the number format
4:07:42123,54 which means now I can do things
4:07:45like I can add. So, I just added five,
4:07:47right? If I were to try adding five to
4:07:50the string, all we do is we actually
4:07:52literally add the string five to it. You
4:07:54guys kind of see what I mean? If I go 1
4:07:562 3504 + 5, what I'm doing is I'm
4:07:58appending five to this four. I'm
4:08:02concatenating. But if I make this into a
4:08:04number, well, now we can actually
4:08:05perform a logic on it. We can we can I
4:08:07don't know, multiply it by five or 12,
4:08:09right? If you were to not, then you
4:08:11know, if you were to try and multiply a
4:08:13string by 12, um, I guess it would allow
4:08:15you to because this is like a very clear
4:08:17operator. But yeah, the the plus
4:08:20specifically is sort of like the the
4:08:21breaking example of doing mathematical
4:08:23operations on strings. And this is
4:08:25equivalent to concat
4:08:2712 as we could see here. So basically
4:08:30all this is doing is it's just verifying
4:08:32that this thing is a number. And then
4:08:34once it's a number, we can do a ton of
4:08:36like really cool, you know, math and
4:08:37stuff like that with it. I use two
4:08:39number reasonably often. Yeah, a lot of
4:08:40the time like I'll grab a string, that
4:08:41string is formatted in like a particular
4:08:43way and then I extract it. I turn it
4:08:45into a number and then once I've turned
4:08:47it into a number um you know I can I can
4:08:49do really cool things with it. And then
4:08:51there's one other example here in NADN
4:08:53where um you can have a number that's
4:08:55like 1.23 E10. That's like 1.23 raised
4:08:58to the 10. Well, you can actually take
4:08:59the string and then you can convert it
4:09:01into like a usable number that you can
4:09:02perform mathematical operations on. This
4:09:04is sort of like more of a scientific
4:09:05need. So you're not going to use it
4:09:06super often, but I do use two number
4:09:08just to make sure that my my types are
4:09:10okay. Okay. Next up, we have the number
4:09:12family of functions. This is pretty
4:09:14straightforward. Now that we've done
4:09:15string, I'll say that string and array
4:09:16are probably the most difficult ones.
4:09:17This one's going to be a little bit
4:09:18easier. Um, let's just type in the
4:09:20number. And now let's reveal all the
4:09:22functions available to us. So the first
4:09:25one we're going to cover is round. Round
4:09:27is kind of what it sounds like. If I
4:09:29were to feed in JSON number, which in
4:09:31our case is 3.5, into round, what
4:09:33happens? This goes up to four. If I were
4:09:36to try and uh change the number of
4:09:37decimal places and go two, it'll round
4:09:39to 3.5. If I go three, it won't do
4:09:42anything because this number doesn't
4:09:43have any more decimal points, right? But
4:09:45yeah, this will automatically round up
4:09:46to four, which is just default behavior.
4:09:48Anything um up to 3.499 repeater will
4:09:51round down. Anything at 3.5 and up will
4:09:54round up. Um and yeah, this is just sort
4:09:55of like default behavior. It's it's
4:09:57great for like removing complexity from
4:09:58numbers and stuff like that. Now, I
4:10:00should note I want to show you guys a
4:10:02little bit more context here. I don't
4:10:03just want to use JSON number. So, if you
4:10:04want to write a number in NAD, you could
4:10:07do so just by wrapping round brackets
4:10:08around it like this. So, if I'm rounding
4:10:11234.5, this will be 235, right? I'm
4:10:14going 499, it'll be down. But what if I
4:10:17go this and then I want to round to the
4:10:20second decimal point. How about the
4:10:22third decimal point? The fourth decimal
4:10:23point. I don't think there
4:10:26uh yes, sorry, I was just getting a lag
4:10:28actually. If I wanted to round to the
4:10:29sixth decimal point, all the way over
4:10:31here, right? This is a two, a three, it
4:10:33would be down. If it's a a six, it would
4:10:35be up, right? Because we have a five
4:10:37down here. Anyway, point I'm making is
4:10:38you can round stuff and rounding is
4:10:40cool. All right. Now, why don't we do
4:10:42the uh more directed version of round,
4:10:45which is where we specifically say, am I
4:10:48aiming for the floor or am I aiming for
4:10:50the ceiling? So, if I aim for the floor
4:10:52of 3.5, what do you guys think is going
4:10:54to happen? This is going to return me
4:10:56the number three. If I aim for the seal
4:10:58of 3.5, what's going to happen? This is
4:11:01going to return me the number four. So
4:11:03basically this is just a directed way to
4:11:04perform your rounding operation sort of
4:11:06manually. Right? 3.8 is always going to
4:11:09go up to four. 3.1 is going to go up to
4:11:11four. Um if I were to replace this now
4:11:13with the number three ceiling of three
4:11:15would be three. 2.9 would be would be
4:11:18three. 2.1 would be three. Two would be
4:11:21two. 2.001 would be three. So it's
4:11:25interesting um you know just how much
4:11:27granularity NN gives you in being able
4:11:29to manipulate numbers with this. Uh but
4:11:31yeah, that's the way that seal works.
4:11:34The next number function is called ABS.
4:11:36That stands for absolute, not my ripped
4:11:39six-pack. Uh basically, when you feed in
4:11:41something like a number here, um you can
4:11:44do so uh you know, with with positives
4:11:46or with negatives or whatever, all this
4:11:48does is just returns to you uh what's
4:11:50called the the absolute value of that
4:11:52number. So, ABS just says, hey, if
4:11:55there's any negatives, something like
4:11:56that, I just want you to get the
4:11:57absolute magnitude of it. If I feed in
4:11:592.001, 0 01 it'll just return me two. So
4:12:03you can kind of think of it as just a
4:12:04way to strip negatives get only the
4:12:05actual magnitude of the thing. Magnitude
4:12:07being the distance from zero. Okay. On
4:12:09top of that we also have a few other
4:12:11interesting ones like format. Now the
4:12:13way that format works is basically you
4:12:15know how sometimes Americans and
4:12:17Europeans will format numbers
4:12:18differently. Like sometimes Europeans
4:12:20might put like the euro at the end of
4:12:22the sign or something uh end of the
4:12:23number and then Americans sometimes
4:12:25might put the dollar sign or usually at
4:12:26the beginning of the number. Um,
4:12:28sometimes they use periods as delimiters
4:12:31in thousand separators instead of commas
4:12:33and stuff. Format just deals with all of
4:12:34that. Now, I'm feeding in 3.5 and I'm
4:12:36trying to format it. That doesn't really
4:12:38make much sense for me. So, let me just
4:12:39feed in a bigger number and show you
4:12:40guys uh show you guys how it works
4:12:41intuitively. Let's say I fed in
4:12:493,459,221. If I were to leave this up to
4:12:51the standard way that the format module
4:12:54or format function I should say formats
4:12:56things, I'm basically converting this
4:12:57and then I'm adding a bunch of these
4:12:59little um delimiters. But I could also
4:13:01change this if I just add a period
4:13:03instead. Oh, sorry. If I uh my bad, you
4:13:06didn't actually add the delimiter. If I
4:13:07had the local string instead, right? If
4:13:09instead I wanted to go
4:13:11French, you'll see that we've now added
4:13:13a space in between instead of the uh
4:13:15comma. If I wanted to go um Dutch
4:13:19instead, I think Dutch, I may be
4:13:22mistaken, but if I wanted to go Dutch
4:13:24instead, um we now add periods, right?
4:13:26This can be useful when I don't know,
4:13:28you want to drop like a dollar sign in
4:13:29front or something like that, right? If
4:13:31I go en here, then now we have uh
4:13:35basically like a number that maybe we've
4:13:37done some math on to get to this point.
4:13:38Um and now we've turned this into
4:13:40something that is like realistically
4:13:41readable as I don't know, a string,
4:13:43which we could do um tons of things
4:13:45with. we could pass it into a a pandadoc
4:13:47proposal and template out, you know, the
4:13:49amount of money it costs. Make things
4:13:50look a little bit prettier essentially.
4:13:52So, that's pretty neat. I'm a fan of
4:13:54format. I use format pretty often. Um,
4:13:57aside from that, we have a couple of
4:13:58very simple functions. Um, is even just
4:14:00tells you whether or not this number is
4:14:02even. So, is this number even? No,
4:14:03because there's a one at the end. But if
4:14:04it's a zero, then it'll be true.
4:14:06Likewise, there's is odd. So, is this
4:14:08number even? No. Is this number odd?
4:14:10Yes. Is this number odd? No.
4:14:13Uh there are a few other ones like is
4:14:15integer. Now if you guys are unfamiliar
4:14:17an integer just sort of means like a
4:14:19like a like a number that doesn't have
4:14:20any decimal points. So this is an
4:14:22integer because there's no decimal
4:14:23points. But if I were to do this and
4:14:25this would not no long no no longer be
4:14:26an integer. This can be important
4:14:29sometimes but to be honest I don't
4:14:30really use these type conversions or is
4:14:32even or is odd very often. Um there are
4:14:34certainly places for them though. Next
4:14:36up we have um some conversion functions.
4:14:39So two boolean similarly to what we had
4:14:40before. 2 boolean will convert this to
4:14:43true. Like if I go uh zero, this will be
4:14:45false. If I go one, it's true. Then if I
4:14:47go any number above one, it's also true.
4:14:49So basically zero is just the only
4:14:51negative. And then even like negative
4:14:53numbers and stuff like that are
4:14:54technically true. This is some nuance
4:14:55that isn't super important to
4:14:56understand, but um yeah, just to say
4:14:58that you can convert this into the true
4:15:00or the false boolean type. There are
4:15:03also ways to convert numbers to
4:15:04datetimes. So 43 uh you know is
4:15:08extracted as this. If I wanted to
4:15:09convert this number to a datetime, um, I
4:15:12would go and I'd get a time
4:15:14stamp. Unix time stamp is the number of
4:15:16seconds since January the 1st, 1970. So,
4:15:19I'm just going to copy this. Going to go
4:15:22over here. I'm going to feed this in.
4:15:24What this does is it tells me what the
4:15:26current date time is. I think I have to
4:15:27add three zeros actually. Um, when I do
4:15:29that, because I think this one does it
4:15:30with thousands, but anyway, as we can
4:15:32see, the date time here is now
4:15:352025131. Um, it is
4:15:38300641 according to my time zone, which
4:15:40is nice. They automatically do minus07
4:15:42because that's where I'm at. Uh, but
4:15:44yeah, you know, you can convert a number
4:15:46of things from numbers or numeric um uh
4:15:50like like numbers into um dates as well
4:15:52to perform functions on later. And I
4:15:54should note that, you know, this is a
4:15:56number um you know like like this right
4:15:59over here is a number. So what you could
4:16:00theoretically do is you could probably
4:16:03do this
4:16:06So, you know how early I had to add that
4:16:08um thousand separator? If you just
4:16:10multiply this by a th00and first
4:16:12instead, then this is still technically
4:16:13like a like a functioning um number,
4:16:16right? Cuz basically what I'm doing is
4:16:17I'm I'm taking this number. I'm defining
4:16:19it. Then I'm multiplying it by a th00and
4:16:21then I'm converting that to a datetime
4:16:23which is now rendered correctly. Um you
4:16:25know, this will sort of muck up the date
4:16:26time, but a thousand in my case. It's
4:16:28just the nadn conversion between a Unix
4:16:31epoch time stamp over here. Um and then
4:16:33you know what what NNN is comfortable
4:16:36with. Okay, great. Um we have a couple
4:16:39of additional ones. Uh the only ones
4:16:42that are are really important are the
4:16:44local string. Um, so this converts
4:16:46things from I don't know, let's say 500
4:16:50uh 500 and then
4:16:5350,34 sorry
4:16:5750,50,34 automatically converts this
4:16:59into a string with those commas and
4:17:02everything like that um in them. There
4:17:03are a variety of things that you can do.
4:17:05Um you could use the same settings that
4:17:07we had before. So remember how earlier
4:17:09if I go to the C full list
4:17:13uh remember how earlier you know I fed
4:17:14in um fr well there's also a variety of
4:17:17other ways that things um can be
4:17:20formatted and this is just like a master
4:17:21list of all of them and some of them
4:17:23will be well most of them are going to
4:17:25be very similar to each other but some
4:17:26of them are also going to be a little
4:17:27bit different. This just allows you to
4:17:28format things into the particular local
4:17:30or it allows you to format it into a
4:17:31string that is of the particular local
4:17:33of the people that you want and sort of
4:17:35like an an automatic basis which is
4:17:38pretty nice. And then the last one is
4:17:39obviously just two string. Um two string
4:17:41just converts a number which you perform
4:17:44functions on um sorry perform
4:17:45mathematical operations on into a string
4:17:48that you can now do things like
4:17:50concatenate with the term hello. Right?
4:17:54So, you couldn't just add the term hello
4:17:56to uh
4:17:5850,50,34 cuz that doesn't really make
4:17:59sense. But since we converted to a
4:18:01string first, this is now basically
4:18:03this. And then we can easily concatenate
4:18:05any string to this if we want. All
4:18:07right, that is the number family. Let's
4:18:08move over to the array family. Um, and
4:18:11let's knock these out. What I have over
4:18:13here on the left hand side is I have an
4:18:14array with three items, Sarah, Sally,
4:18:16and Stephanie. This is clearly an array
4:18:18of names. You can also create your own
4:18:19array in N8 similarly to how we've been
4:18:21doing so far just by using the square
4:18:24bracket
4:18:27operator. All right, this is technically
4:18:29now um rendered as an array in code that
4:18:31we could do things with just by dot
4:18:32notating. But in our case, as usual, I'm
4:18:35going to start off with that just to
4:18:37show you guys how all of this works. Um
4:18:39and we can see our array has now been
4:18:40pulled and rendered as a variable from
4:18:42the previous node. So if I click period,
4:18:44what sort of functions are available to
4:18:46me? Well, the first is length, which is
4:18:48probably pretty similar to the string
4:18:49one. It's just instead of counting the
4:18:51number of characters, what we do is we
4:18:52count the number of elements in the
4:18:53array. So, we had S Sarah, Sally, and
4:18:55Stephanie. Those are three elements.
4:18:56It's not surprising then that we have a
4:18:58length that equates to
4:19:00three. Now, we have some other functions
4:19:02here. Last, if I were to put this in,
4:19:05what do you think would happen? Well,
4:19:06we'd extract the last element,
4:19:07Stephanie. Likewise, if I were to
4:19:09extract the first element, Sarah,
4:19:13um, we can do includes. This one in
4:19:15practice I use very often. Um, and this
4:19:17just verifies whether or not there is
4:19:18the element that I'm looking for in this
4:19:20array. So sometimes APIs will return big
4:19:22arrays with tons of elements. And all
4:19:23I'm curious about is, hey, does this
4:19:24contain the thing that I want? Well, you
4:19:27know, does this contain Sally? Yes. Does
4:19:29this contain Saul? No. But does this
4:19:31contain Sally? Yes. Remember, we're now
4:19:33doing this on array basis. So we're
4:19:35looking for the array elements that need
4:19:37to match these strings exactly as
4:19:39opposed to just the string basis. If we
4:19:41did a string and then we to typed a
4:19:43substring or a slice of that, it would
4:19:45have returned as true, right? But now
4:19:47that we're operating off of arrays, we
4:19:48need to make sure that they match one to
4:19:50one. Okay, we have map and we have
4:19:51filter. And these are a little bit more
4:19:52complicated, so I'm going to leave them
4:19:54till the end. But, uh, moving our way
4:19:55down, the next function is append. Now,
4:19:58append is just a way that you can add an
4:20:00additional element to an array. Um, if
4:20:02you append something, you're sticking it
4:20:04on the end. So, if I were to add the
4:20:06guy's name here, let's go Eric. Then if
4:20:09we append quote Eric quote, we've now
4:20:13added something to the end of that
4:20:15array. So I use this pretty often. Um
4:20:17the interesting part here that people
4:20:19don't know most of the time is that you
4:20:20can actually just feed in another
4:20:22array. So maybe we have like a guy's
4:20:24array over
4:20:27here. Um you can append a number of
4:20:30things. In my case, you know, I've just
4:20:31appended another array inside of that
4:20:33array. Uh you can also append other data
4:20:36types like numbers. So, keep in mind
4:20:38Sally, Sarah, and Stephanie, they all
4:20:39have quotes around them. You can also
4:20:41append things like objects. So,
4:20:46um I believe in order to do this, we
4:20:49actually need to go like this. No, my
4:20:51bad. There are so many quote signs here.
4:20:53I don't know what the hell's going on.
4:20:55So, in order to append this
4:20:58puppy, we'll remove that. And then we
4:21:01can see that the next element over here
4:21:03is uh is an object, right? Right? It's
4:21:05an object with name equals Peter. So
4:21:08yeah, you can append a variety of things
4:21:10um to an array. Uh but append is just a
4:21:12way to add to the end of it. Another
4:21:14function I'll show off is chunk. Chunk
4:21:16is pretty cool. Uh basically if we have
4:21:17an array and the array has I don't know
4:21:21uh in this case it has three elements.
4:21:22So this isn't really going to work. But
4:21:24basically let's say it has like I don't
4:21:25know 10 elements or something like that.
4:21:27We can chunk it into subarrays of two.
4:21:29So let me make one really
4:21:32quickly. Okay. Okay. And if I just copy
4:21:34this and then if I feed this in over
4:21:38here,
4:21:40um, basically what we can do is we can
4:21:42chunk this into uh a bunch of subarrays
4:21:45that contain the number of elements that
4:21:47we specify in our chunk. So laptop,
4:21:49backpack, smartphone, notebook, pen,
4:21:50headphones, water bottle, whatever.
4:21:52We're now chunking this into array where
4:21:53we have two items. So I don't know,
4:21:55maybe in this specific case we're asking
4:21:56people to bring um, you know, everybody
4:21:58brings two items or something and then
4:22:00like we all get them together. that way.
4:22:02I don't know. We're sort of at like the
4:22:03same level carrying wise. Nobody's
4:22:04carrying a bunch of stuff. Um, if you
4:22:07wanted to chunk this more, maybe you'd
4:22:08go three, you go five. Um, you know, if
4:22:10you want to do one, that's just
4:22:11obviously um sort of silly because
4:22:13you're just nesting every element inside
4:22:15of another element. Um, zero breaks, so
4:22:17don't do that. Um, but yeah, that's
4:22:18that's kind of how chunk works. Do I use
4:22:20chunk? Basically, never. Um, but I
4:22:22figured I'd at least mention what chunk
4:22:24was. Okay. Um, we'll go down to chunk.
4:22:28Sorry, we'll go down to JSON. And then
4:22:31working our way down here, we also have
4:22:33a very interesting function called
4:22:34compact. Hypothetically, let's say we
4:22:37had that array that we had earlier. But
4:22:39let's also say that I don't know a bunch
4:22:40of these elements weren't empty. So if
4:22:42we look at what's being returned here,
4:22:45you see we're being returned an array
4:22:47that still has, you know, 10 elements,
4:22:48but three of them are empty. Well,
4:22:50hypothetically, um, what you can do is
4:22:52if you just wanted to only get the
4:22:53elements in the array that had values,
4:22:55you just type in compact, but it would
4:22:57actually strip everything that is empty.
4:22:59I should note that these quotes aren't
4:23:01the only things that you can have. You
4:23:02can also have null. Um, this null is not
4:23:04wrapped in quotes and it's a special
4:23:05series of characters. It's just like
4:23:07understood by JavaScript to mean that
4:23:08there's like a null entry there. Um, but
4:23:11yeah, compact is just a quick and easy
4:23:12way to get rid of these null entries or
4:23:14empty entries. And this can be valuable
4:23:15because sometimes this is how APIs send
4:23:17information back and forth, right?
4:23:18You'll receive some big long array and
4:23:20then like 50 of the fields inside will
4:23:22be empty. Well, this way allows you to
4:23:24just strip those and then only operate
4:23:26off of the data that actually matters to
4:23:27you. Okay, the next function is concat.
4:23:29So, as you can imagine, this is very
4:23:31similar to pend in so far that you can
4:23:33add a bunch of things to it. In this
4:23:35case, you know, if I wanted to add um
4:23:37Sarah or something, we've now added an
4:23:39additional element inside called Sarah,
4:23:42but I could also add um like I did
4:23:44before an array with Peter and then I
4:23:47don't know, Eric. And now what I've done
4:23:50is I haven't added a subarray. So, it's
4:23:52not like I've added an additional array
4:23:54inside like I did with append. And what
4:23:55I'm actually doing is I'm just like
4:23:56taking these two arrays and I'm just
4:23:58sticking them together. So you can kind
4:23:59of think of it as like squishing two
4:24:00arrays together without really
4:24:02preserving um like the data type uh
4:24:04necessarily. Next up we have a very
4:24:06interesting function, one that I use
4:24:08quite often called difference. I'll also
4:24:10show you its intersection which is um
4:24:13inter uh sorry I'll show you its inverse
4:24:15which is called intersection. But I'm
4:24:18just going to create a new array and
4:24:19I'll go 1 2 3. Then I'm going to go
4:24:21difference. Then I'll go three, four,
4:24:24four,
4:24:25five. So basically, oh, sorry, I need to
4:24:28make this an array. So basically, what
4:24:30difference does is difference just
4:24:32returns you all of the elements from the
4:24:35first array that are not in the second
4:24:37array. Okay, so one and two are not in
4:24:41the second array. Three is in the second
4:24:43array. So we're only getting one and
4:24:45two. Difference doesn't care about all
4:24:47of the elements here. like you don't
4:24:49insert any of these elements here. It
4:24:51only ever uh uses the the the first
4:24:53array that you feed in as like the
4:24:54primary data. So if I were to say two,
4:24:58what do you think would happen? Well, if
4:25:00I click two, obviously this is now going
4:25:02to disappear because one of the elements
4:25:05here is now over here and the only
4:25:07element that is unique. You kind of
4:25:08think of this as like a unique element,
4:25:10although um there's another function
4:25:11called unique. So it might not be good
4:25:12to to conceptualize that way. Um, but
4:25:14all of this does is this just takes all
4:25:16of the elements here that are not in
4:25:18this array. So, there are tons of ways
4:25:21and and reasons why you should use this.
4:25:23One way that I just used this the other
4:25:24day is I'm tracking a bunch of other
4:25:26people on YouTube that are about the
4:25:27similar size to me. Uh, just because I
4:25:29want to see if there's differences in
4:25:30posting schedule, lengths of the videos
4:25:32or something like that. And so, I'm
4:25:33calling a YouTube RSS feed. The YouTube
4:25:35RSS feed brings me an array of a bunch
4:25:37of YouTube posts that they make. Well, I
4:25:39can store their YouTube post in a
4:25:41database. And then all I can do is I can
4:25:42just compare to see, hey, um, you know,
4:25:45is this RSS feed array different from
4:25:47this RSS feed array? Oh, it is. Okay.
4:25:49Well, what's the difference? Is it that
4:25:51post? Okay, great. Well, now I know that
4:25:52that's the post that I'm going to take
4:25:53to like update my database with. I'm
4:25:55going to add that post essentially. So,
4:25:57uh, yeah, variety of ways you could do
4:25:59this. If we use our example
4:26:01here of um you know
4:26:04names
4:26:07maybe maybe what I'm doing is I'm just
4:26:10looking for um any name from this array
4:26:14that is not in this array back here. So
4:26:18Stephanie for instance is not in Sarah,
4:26:20Sally or Peter. Hence why I'm returning
4:26:21Stephanie. Now the inverse of this is
4:26:24called intersection. And this is
4:26:26similarly another function that I use
4:26:28all the time. An intersection is super
4:26:29valuable. Basically, instead of looking
4:26:31for the difference, it looks for the
4:26:32instances in which we have both data.
4:26:35So, we have Sarah in both arrays, so
4:26:37that's what I'm going to return. We have
4:26:38Sally in both arrays. That's what I'm
4:26:39going to return. Do we have Stephanie in
4:26:41both arrays? No. We have another name
4:26:42called Peter, right? So, intersection
4:26:45and difference are both fantastic, and
4:26:47they're things that uh you know, if
4:26:48you're working with any sort of like
4:26:49real industrial or enterprise data, I
4:26:52think you're going to find yourself
4:26:53using all the time. Okay. The next
4:26:55function I want to cover is called find.
4:26:57find is pretty pretty sweet. Um,
4:26:59basically it allows you to use math as
4:27:01part of your function. So, if you just
4:27:03press enter, you'll see that we've now
4:27:04added it doesn't just allow you to use
4:27:06math, sorry, it allows you to use like
4:27:07any sort of operator. Um, now we've
4:27:09added this cool little syntax which is
4:27:12called like arrow notation or arrow
4:27:14syntax in JavaScript where um we've got
4:27:17now we have an element. So, we now have
4:27:19some some variable that we're calling
4:27:21item and we're saying true. This is
4:27:24pretty interesting. Um, the way that
4:27:26this works is think of item as the
4:27:28individual item in the array. So all
4:27:30we're doing is we're basically saying,
4:27:31hey, array zero is equal to item. So
4:27:35item is just the name that we're going
4:27:36to use to reference the specific uh item
4:27:38in the array that we are currently at
4:27:40because it's going to go through all of
4:27:41the items. So this is kind of a piss
4:27:44poor example and I don't really know why
4:27:45they do that, but let me show you
4:27:46something that you can do with this.
4:27:48What if we want to return all of the
4:27:50elements in an array that are greater
4:27:53than let's see uh I don't know they're
4:27:56greater they have more characters than
4:27:59six. So um Sarah has six charact or five
4:28:02characters. Sally has five characters
4:28:04but Stephanie has way more than six.
4:28:06Realistically I think has like 10 or
4:28:08something like that. So maybe I don't
4:28:09know we're just looking to see if there
4:28:11are any names in our array that are
4:28:13longer than a certain number of
4:28:14characters. How would you do this? Well
4:28:15it's actually really easy. We go dollar
4:28:17sign JSON.array.find and then we take
4:28:19the thing item. Then we just check to
4:28:21see if item length is over six. And if
4:28:26so, then our result is Stephanie. We're
4:28:28finding an element in an array that
4:28:30corresponds to this. Okay. Now, there's
4:28:33some nuance and some some things here
4:28:35that I should explain. Um there's
4:28:36another function that does something
4:28:37very similar to this called map. Uh
4:28:39sorry, called filter, which I'll cover
4:28:40in a second. But this element is special
4:28:43because it only returns the first
4:28:45instance of the element that uh
4:28:48satisfies the request. So
4:28:51JSON.array.find we define our item and
4:28:53we're saying the constraint is the
4:28:54item.length needs to be less than six is
4:28:57going to return uh Sarah but it's not
4:29:00going to return Sally even though Sally
4:29:02also fulfills that request technically.
4:29:04So find is super powerful. I don't use
4:29:06find as much as I use map and filter.
4:29:09Um, but I'm I'm going to cover all of
4:29:11them regardless. The very important
4:29:12thing to know here is you just need to
4:29:14be comfortable using array syntax. Um,
4:29:16um, arrow syntax. This is called an
4:29:18arrow function in JavaScript. So, I
4:29:20should note that it doesn't need to say
4:29:21item. It could say I as long as the
4:29:24element or the way that you've named it
4:29:26on the left is the same as the way
4:29:27you've named it on the right. This
4:29:29satisfies the condition. So, in our
4:29:31case, um, I is just a symbol that we're
4:29:33using to denote all of the different
4:29:35elements in the array um, one by one.
4:29:38Okay, great. So, that's fine. Find fine
4:29:40is pretty awesome. Let's now cover um
4:29:42index of. Index of, as I'm sure you can
4:29:45imagine, is very similar in the array
4:29:46format to the way that things are
4:29:48represented in the string format. If we
4:29:50are looking to find the index of the
4:29:51entry called
4:29:52Sally, well, then the entry is one. This
4:29:56is zero. This is one. This is two. What
4:29:58if we wanted to find Sarah? It'll return
4:30:00zero. What if we wanted to find
4:30:01Stephanie? This will return two. Right?
4:30:03So, that's what index of does. Um, and
4:30:06one common theme that you'll find is
4:30:07that arrays and uh strings are actually
4:30:09pretty similar in terms of what's going
4:30:11on under the hood
4:30:12mathematically. Next up, we have is
4:30:14empty. If I feed in this array with
4:30:16three elements to is empty, obviously
4:30:18it's going to return false. We also have
4:30:20is not empty, which is the inverse. And
4:30:22then we have a very special uh function,
4:30:25one that I use very often, called join.
4:30:27And all join is is it's the inverse of
4:30:30split. Remember how earlier we took a
4:30:32string and then we split it into an
4:30:33array. Well, join takes an array and
4:30:35then it turns it into a string. So in
4:30:38our case, we have Sarah, Sally, and
4:30:39Stephanie here. We can actually just
4:30:40join all those together and then we can
4:30:42get Sarah, Sally, Stephanie. This is now
4:30:44a string. So hypothetically, what if I
4:30:47wanted instead to put plus signs between
4:30:49them? Sarah plus Sally plus Stephanie.
4:30:51Well, all I do is I go space plus and
4:30:54then space. So what join does is it just
4:30:57gets all the elements as they're laid
4:30:58out. Then it adds whatever characters
4:31:00you want between all of them. So, we go
4:31:03comma space. We could go this. We go
4:31:09underscore, right? We have a ton of
4:31:11options
4:31:12here. Uh, we we have a ton of options
4:31:15here for how we want to do the
4:31:16separator. Uh, which is pretty cool. So,
4:31:18I use this all the time. I mean, this is
4:31:20how I turn a bunch of array data into
4:31:21like a string or something, right? I
4:31:23also use this to convert things into
4:31:24like CSV format, which is where you have
4:31:26like a comma between. And then the cool
4:31:28thing is you can just take the CSV, you
4:31:29can actually make a file of it and just
4:31:30upload it to a Google Drive or
4:31:31something. So, tons of examples here.
4:31:34You know, they show you how to do three
4:31:35with a space plus space. Um, if you just
4:31:38join with nothing, then if you join with
4:31:40um like an empty string, it'll just kind
4:31:42of stack them all together. This is very
4:31:43similar to like a text aggregator sort
4:31:45of function if you're using make or um
4:31:47some sort of aggregation function in
4:31:49most no code
4:31:50platforms. Okay, great. Let's now cover
4:31:53merge. Now, all merge does is it allows
4:31:55you to take a specific type of array and
4:31:58that's the type of array that has um
4:31:59objects as elements instead of just um
4:32:02numbers, strings or booleans or
4:32:04subarrays and allows you to basically
4:32:06take them all and then stick them into
4:32:08one big object. So, if you think about
4:32:09this, what we're really doing is we're
4:32:10converting from an array into an object.
4:32:12I'll give you guys a quick example of
4:32:14what that looks like by actually
4:32:15creating my own. If I were to grab my
4:32:18own array, and then I were to create an
4:32:20object inside of set array where I have
4:32:24name, that's object number one, and then
4:32:26I were to say city. The automatic curly
4:32:28brace adding is kind of annoying. Okay,
4:32:30so name Nick. Uh, let's do city Calgary.
4:32:34And then we'll go, I don't know, height.
4:32:36And then we'll go like 188 or something.
4:32:40Just like
4:32:41this. Right? We now have an array that
4:32:44contains three elements. We have name
4:32:46neck. We have city Calgary. And then we
4:32:48have height 188. What if we just wanted
4:32:50to convert this into one object? Well,
4:32:52we just go merge. Sorry, that's not
4:32:54going to work because we're outside of
4:32:55these curly brackets. Let me just add a
4:32:57space here to make our lives easier. We
4:32:59go domerge now. And now we basically
4:33:01taken an array and we've converted it
4:33:03into an object where all of the um array
4:33:07elements are now just key names in one.
4:33:10So it's name, nick, city, calgary,
4:33:11height, 188. This is now just one
4:33:13object. And now instead of a bunch of
4:33:15array functions, we actually have a
4:33:16bunch of object functions available to
4:33:18us, which I'm going to go over later. So
4:33:20merge is, you know, I mean, like I
4:33:21understand why they put merge in, but do
4:33:23I ever actually use it in practice? No,
4:33:24not really. Next up, we have pluck.
4:33:26Pluck is pretty badass. Um, basically
4:33:28what we get to do is if I were to feed
4:33:30in the same thing that I just fed in
4:33:31before, then instead of merging it, I
4:33:34were to pluck it. What I can do is I can
4:33:36extract the specific things from this
4:33:41array of objects. Like if I had name and
4:33:44then uh I mean you know this this isn't
4:33:46a very good example but if I were to
4:33:47pluck out the name what I'd get as a
4:33:49result is I'd get nick. Okay. Pluck just
4:33:52allows you to extract the value of
4:33:55something that has a key name equal to
4:33:57what you've put in here. So
4:33:59hypothetically if I were to just have
4:34:01another person in with a name Sally.
4:34:03What I've done is I've plucked out all
4:34:05of the names. I've plucked out Nick.
4:34:06I've plucked out Sally. This is another
4:34:09one of those manipulation functions
4:34:10which I don't really use too often. Um,
4:34:12but it's not bad to know. The next
4:34:13function we have is called random item.
4:34:15It is fantastic. Random item is just a
4:34:16quick way to select something from an
4:34:18array. I use this all the time. I use
4:34:20this in like roundroin scheduling. Well,
4:34:22not round robin scheduling, sorry, like
4:34:23uh random scheduling. I use this when
4:34:25like I'll generate a a list of random
4:34:27numbers and I'll just select one.
4:34:28Although to be fair, there is like a
4:34:30random function that you can use. I use
4:34:31these to like, you know, statistically
4:34:34randomly and uniformly just take things
4:34:36from an array and then do things with
4:34:37it. The next function is called rename
4:34:39keys. You guys remember that example
4:34:41function I had earlier? If I just go
4:34:42back to it, if I had a bunch of entries
4:34:45with name, name name, and then name, and
4:34:49instead of using pluck, I were to use
4:34:51rename keys. What rename keys allows you
4:34:54to do is it basically allows you to to
4:34:56search for a specific key name of the
4:34:57object. So in this case, name, then
4:34:59convert it to something else. So maybe
4:35:01instead of name, what I want is I
4:35:03actually want to call it first name.
4:35:05Well, this will now um create another
4:35:07array, but it'll automatically go in and
4:35:10it'll rename all the keys and all the
4:35:11objects in set array. This is another
4:35:13one of those like more complicated like
4:35:15data formatting functions that I don't
4:35:17really find myself using often, but I
4:35:19have used this before and uh it's worth
4:35:20at least knowing. Okay. And JSON.array
4:35:23reverse does probably what you're
4:35:24expecting it to do. Um it just takes as
4:35:26input an array. So, in my case, an array
4:35:28of Sarah, Sally, and Stephanie, then it
4:35:30reverses it. But for some weird reason,
4:35:31every time I put JSON array at reverse
4:35:34in, it crashes my NAND server entirely
4:35:36and then I have to spin it up again. So
4:35:38this is a very interesting development
4:35:39if I'm honest. I wasn't expecting this
4:35:41one function to just consistently crash,
4:35:43but I've repeated the behavior a number
4:35:45of times and just does not really seem
4:35:46to be cooperating. Anyway, imagine if it
4:35:48said Sarah, Sally, and Stephanie in your
4:35:50input. Um the output would be Stephanie,
4:35:52Sally, and then Sarah. Sally is the
4:35:54middle unit, so it wouldn't necessarily
4:35:56change. Anyway, I'm going to exit this
4:35:57page, fix it, and then come back. Okay,
4:35:59next we have the slice function. Um, the
4:36:01slice function works the exact same in
4:36:03an array as it does in a string. If we
4:36:05wanted to slice between zero and two, we
4:36:07get Sarah and Sally. If we want to go
4:36:08one and three, we'd get Sally and
4:36:10Stephanie. Next up, we have a very
4:36:12interesting one called smart join. Uh,
4:36:14basically, I'm going to rely off the
4:36:16given example here just because it's
4:36:18such a nuanced and and I want to say
4:36:20uncommon function to use that I don't
4:36:22really use it basically ever. But you
4:36:24know over here you see how we have um an
4:36:26object that is specifically formatted as
4:36:28follows. Field age value 2 field city
4:36:31value Berlin. Okay, let me copy this
4:36:34over. I'll show you guys what this
4:36:36means.
4:36:38I were to pump this in and I were to go
4:36:41to smart join. And if I were to feed in
4:36:45um field and then value and I close it
4:36:48off and what this would do is it would
4:36:50basically take as input my array and my
4:36:52array is broken down into basically an
4:36:54object with a field and a value for
4:36:56every thing. Like if you think about it,
4:36:58there's no need to break it into a field
4:37:00and then an age and then a value and
4:37:01then a two. You could just go age and
4:37:03then two, right? City and then Berlin.
4:37:05Um, but it takes this very particular
4:37:06formatting and then it basically plucks
4:37:08similar like to what we were doing
4:37:10before. It plucks out the fields and
4:37:12then the values and then it uses it to
4:37:14turn into a new object where the first
4:37:16element that you feed in is going to be
4:37:18the key and then the second element that
4:37:20you feed in is going to be the value. I
4:37:22don't really ever use this so I probably
4:37:24wouldn't worry too much about
4:37:24understanding it if you don't. Next up
4:37:27we have sort. Sort just sorts things
4:37:29alphabetically to start. Um, if you want
4:37:31to do anything more complex than
4:37:32alphabetical sorting, you're going to
4:37:34have to use one of those arrow functions
4:37:36that we talked about again. And
4:37:37unfortunately, the way that the arrow
4:37:39function works is not very intuitive.
4:37:40It's just a handme-down of um I guess uh
4:37:44you know like some programming or
4:37:45JavaScript conventions. Basically, you
4:37:47want to grab A, which is going to be
4:37:48your earlier element, and you want to
4:37:50grab B, which is your later element. You
4:37:51just always want to wrap it like this.
4:37:52And then in order to turn this bracket a
4:37:55comma b into some sort of inverse order,
4:37:58what you'd have to do is you have to go
4:37:59to b localal compare and then go a like
4:38:02this. It's kind of annoying, but we've
4:38:04just reversed it. Basically, we've
4:38:06sorted this. Well, we didn't reverse it
4:38:07actually. We sorted this based off of
4:38:09the presence of the characters in the
4:38:12alphabet. You know, SA comes before S,
4:38:15which comes before ST. Uh because we're
4:38:17we're doing this inverse comparison. If
4:38:19you were to go alphabetically, it would
4:38:20just be standard. it just be a and then
4:38:22b um why you have to use the localal
4:38:24compar in this particular format to be
4:38:26honest I don't really understand or get
4:38:28um I don't really ever sort anything
4:38:30other than numbers um from like largest
4:38:33to greatest or strings um alphabetically
4:38:35ascending and then if you think about it
4:38:37if you sort things one way you can also
4:38:39just sort it and then you can just
4:38:40reverse it in order to get the other
4:38:41thing right so like most of the time in
4:38:43practice I'll sort first and then I will
4:38:45reverse after now I'm not going to type
4:38:47the two brackets there because I have a
4:38:48feeling it's probably going to break my
4:38:50my nan add an instance again for
4:38:51whatever reason. But yeah, that's that's
4:38:53how that works. Next up, we have JSON
4:38:55string. Um, this just converts all of
4:38:56the elements in an array into like a
4:38:58JSON string that you could do stuff
4:39:00with. So, this is now a string. It's not
4:39:02an object. It's a string and you can do
4:39:04string manipulations on it. A lot of the
4:39:06time you have to convert things into
4:39:07JSON strings in order to send or receive
4:39:09them through API. So, I'll use this
4:39:11reasonably often. Next, we have two
4:39:12spliced. Two splice is actually really,
4:39:14really interesting and I could see a lot
4:39:16of cool uses for it, but I personally
4:39:17don't use it very often. Essentially
4:39:19what it allows you to do is allows you
4:39:20to take as input an array. Then what you
4:39:23do is you will add specific elements at
4:39:27an index that you specify then remove a
4:39:30bunch of elements after that and then
4:39:32actually designate the thing that you
4:39:33want to add. So I know that sounds kind
4:39:34of difficult but let me show you as as
4:39:36our example Sally Sarah Stephanie. Let's
4:39:38say this is the zeroth position. This is
4:39:41the first position and this is the
4:39:42second position right? Let's say I want
4:39:45to add something at the first position
4:39:48right over
4:39:49here. So, in order to add something, I
4:39:51go one and then I go comma zero. And
4:39:54I'll show you why in a moment. And then
4:39:55let's say I just wanted to add another s
4:39:57name. Let's
4:39:58say s Oh jeez, I already have
4:40:02Sally. Samantha. Yeah, Samantha. I would
4:40:06type in uh like this. What I've done is
4:40:08I've inserted Samantha into the first
4:40:10place of our array. If I wanted to move
4:40:13it so that it's after Sarah, I just go
4:40:14two. If I want to do it so it's after
4:40:16Stephanie, I go
4:40:17three. And I know can I add it in
4:40:20fourth? No, I can't because of the it
4:40:21takes the length of the string length of
4:40:23the array and then it uh sticks it in at
4:40:24the end. So yeah, this is me just
4:40:27bringing some at the back. Baby, that's
4:40:28what I'm doing now. I'm bringing her
4:40:30forwards. I have the power. Uh next up
4:40:33is uh the second parameter is kind of
4:40:36interesting. Basically what this does is
4:40:37it deletes a certain number of entries.
4:40:39Uh which is kind of kind of neat. You
4:40:41can delete the number of entries from
4:40:44the start index onwards. If I want to
4:40:46delete, let's say three entries or
4:40:47something. I think I have to refresh
4:40:48this unfortunately. Sorry. Let's do one.
4:40:51Yeah. Yeah. Because we can't delete
4:40:52anything at the third index because
4:40:54there's nothing left. But
4:40:55hypothetically, we go 0 0 first. If I
4:40:58delete everything from the zeroth index
4:41:01and then I go one out, I'm going to
4:41:03delete between zero and one, which is
4:41:05this, right? If I go two, I'll delete
4:41:08Sarah as well. If I go three, I'll
4:41:09delete Stephanie. That still allows me
4:41:11to add Samantha though. Um, sometimes
4:41:14the NAD editor will sort of bug out like
4:41:16this if you have an additional comma.
4:41:18So, just be really careful. But anyway,
4:41:20this still allows me to add Samantha.
4:41:21So, the way that I like to think about
4:41:22this function is this function is just
4:41:24sort of like an all-in-one. Um, if you
4:41:26wanted to do two or three things
4:41:27simultaneously, if you wanted to add an
4:41:29element at a specific place, then if you
4:41:31wanted to remove a bunch of elements,
4:41:32um, and then if you wanted to, I don't
4:41:35know, like designate a specific element
4:41:37to add, um, then you'd be able to to do
4:41:39so here. And the cool thing is this is
4:41:41this can be an array. So I could add
4:41:42more Peter uh more people here too. So I
4:41:45could add like Samantha, Peter, and then
4:41:48Stacy. And then I could use that to if
4:41:50you think about it logically um replace
4:41:52the three elements that I have in here.
4:41:54So like you know this is what the string
4:41:55looks like when I concatenate them. This
4:41:56is them afterwards. So this is just sort
4:41:59of like a I don't know. It's like a it's
4:42:01like a three in one if that makes sense.
4:42:03Do I use this one often? No, I do not.
4:42:05Uh still pretty cool though. You know,
4:42:06you could probably impress some people.
4:42:09The next one I want to cover is called
4:42:11union. Union is pretty awesome. Um this
4:42:13is uh like it's the union operator in
4:42:15logic. And basically if you feed in two
4:42:17arrays and they have overlapping
4:42:19elements, it will just ignore the
4:42:20overlapping elements and then just give
4:42:21you a unique um total array which only
4:42:24contains unique elements. So you know
4:42:26how we have Sarah, Sally, and Stephanie.
4:42:28Let's say I feed in another one with
4:42:29Sarah, Sally, and then
4:42:33Stacy. What we do is we basically add
4:42:35these two. perform a union on the first
4:42:37which was Sarah um Sally and then
4:42:40Stephanie and then the second which is
4:42:41Sarah Sally and Stacy and we don't
4:42:44duplicate the Sarah and Sally elements
4:42:46right these are unique we just add the
4:42:48single new element that's sort of like a
4:42:49difference between the two so you can
4:42:51kind of think of this as similar to the
4:42:52intersection and the difference
4:42:54functions this one just doesn't
4:42:56preferentially add things from the
4:42:57beginning or the end it just does it
4:42:59with both equally which is nice function
4:43:01is unique and I use unique all the time
4:43:03it displays only the things that are
4:43:05unique in your um array. So this is a
4:43:07very quick way to dduplicate data. If I
4:43:09if you think about, you know, an array
4:43:11and I have 1 2 3 4 5 and I pass it
4:43:14through the unique function, I'm only
4:43:15going to have five remaining. If I go 3
4:43:174 5 23, you can see I've added nothing.
4:43:20But if I go six, now I've added a single
4:43:22additional element. And it does so by
4:43:23preserving the placement as well, which
4:43:25is quite handy. So I use unique all the
4:43:27time. Very very common for me to use
4:43:29unique.
4:43:30Okay, let's now cover um the two
4:43:33functions that I've been leaving until
4:43:36the very end here. Actually, three
4:43:37functions if we count reduce as well.
4:43:39Map, filter, and reduce. These are
4:43:42extraordinarily powerful. Um I use map
4:43:44and filter all the time specifically.
4:43:46And these, you know, if you figure them
4:43:47out, will end up being probably your
4:43:48most used array functions um because
4:43:50they are just the cardinal v array
4:43:52functions. So, the first thing that I'm
4:43:54going to do is I'm going to do map. Now,
4:43:55if you remember back to um that previous
4:43:57function that I showed you guys, um we
4:43:59are now going to be using arrow syntax
4:44:00again where we have some item and then
4:44:02what we're doing all the map does is map
4:44:04just does something to the item. Okay,
4:44:07so let's hypothetically say I wanted to
4:44:10append gmail.com to all of these
4:44:13entries. I could do so very simply just
4:44:16by
4:44:17concatenating gmail.com. Let's
4:44:19dogmail.com like that. So what I've done
4:44:23is I've taken my item which is I and
4:44:26then I've said for every item I want you
4:44:28to perform this function I do concat and
4:44:31then gmail.com. Pretty sweet, right?
4:44:33Well, why don't we now make them all um
4:44:36lowercase as well to lowercase. Then I
4:44:39double up on the brackets. Um now you
4:44:40can see that we have basically all of
4:44:42these formatted as email addresses. So
4:44:44now I'm kind of mixing and matching
4:44:45combining functions which is cool. Okay,
4:44:48so what's really cool about the map is I
4:44:50mean I just did this with a string,
4:44:52right? But you can do this with whatever
4:44:53data type. Like hypothetically, if
4:44:55instead of JSON array, I fed in 1 2 3
4:44:58into map. What I could do is I can just
4:45:00multiply this by two, then I can
4:45:02instantly change all of these a
4:45:04proportional amount. If I divide these,
4:45:06you know, I could do a bunch of cool
4:45:07stuff with that as
4:45:09well. U modulo 2 probably like like
4:45:12there's there's so much that you could
4:45:13do with a map function, it's crazy. I'm
4:45:15not even going to like start, but um
4:45:16just know that this solves like 99.9% of
4:45:19all array queries. Now, similar to
4:45:22similarly to the map function, you also
4:45:23have one called the filter function. If
4:45:24you've never used the filter function
4:45:26before, I'm just going to give it a
4:45:27click because it'll automatically check
4:45:28this out for me. What the filter
4:45:30function does is it basically does the
4:45:32same thing as map in so far that it goes
4:45:33it goes over every element in your
4:45:35array, but it allows you to like filter
4:45:37out elements that don't match the
4:45:39criteria. So let's say I have a simple
4:45:41array here 1 2 and three and I filter
4:45:43out all elements where I is less than
4:45:46three. Right? So all elements where I is
4:45:48less than three. Well 1 is less than
4:45:50three. Two is less than three. Three
4:45:52logically is not less than three. It is
4:45:54three. Um so I only have 1 and two.
4:45:57Okay. If I were to do this with um my
4:46:00array, I could also filter based off of
4:46:03string u constraints. So my array, if
4:46:06you think about it, is Sarah, Sally, and
4:46:07Stephanie. What if I was only interested
4:46:10in returning um entries that had a
4:46:13length of less than six? Sally and Sarah
4:46:18more than six, Stephanie. So, we're
4:46:20basically doing the same thing as find,
4:46:22but we're we're doing it a little bit
4:46:23differently. We're sort of proceeding
4:46:24with it a little bit differently. So,
4:46:26map and filters I mentioned are
4:46:27fantastic. I use them all the time.
4:46:29There's one more which employs similar
4:46:30logic, but you're probably not going to
4:46:32end up using it anywhere near as much.
4:46:33It's called reduce. Now, reduce can be
4:46:35very complicated to understand. Um, so
4:46:37I'm just going to cover it like really
4:46:39really briefly. Um, but essentially what
4:46:40it allows you to do is it allows you to
4:46:42define your own function and then you
4:46:44can do stuff to things iteratively. So
4:46:47let's say I have 1 2 3 4 5. Okay, I'm
4:46:51reducing. What you do is you have some
4:46:54accumulator then you have some initial
4:46:56value and then you have an arrow where
4:46:58you go accumulator plus initial
4:47:02value. So what's happening? I think it's
4:47:05a c I think it's called initial value. I
4:47:06might have some other term for it. I
4:47:08might be misunderstanding but basically
4:47:10you have like a and then you have b and
4:47:12what you want to return is you want to
4:47:13return a plus b. So what this does is it
4:47:17says a is your current element. So a
4:47:20would be uh for the first pass around be
4:47:221 and then b would be the one next to
4:47:24it. Okay? So 1 + 2. Then it would take
4:47:29the result of 1 plus 2, which is 3, and
4:47:31then it would add it to the next thing,
4:47:32which would be 3 + 3. Then it would take
4:47:34that result, which would be six, and add
4:47:35it to the next thing, 6 + 4. Take that
4:47:38result, which is 10, add it to the next
4:47:39thing, 10 + 5. What do we get as a
4:47:41result? We get
4:47:4315. Now, you can do a number of things
4:47:45that aren't just mathematical functions
4:47:47to this. Um, but this is sort of like an
4:47:49accumul like it like it aggregates
4:47:50things the further it goes along. So
4:47:51obviously large arrays, you know, that
4:47:53you're running some functions on um will
4:47:55be bigger and bigger and bigger
4:47:57mathematically. You can do things like
4:47:59divide too. So I don't know, a divided
4:48:01by b. It's kind of interesting. A * b
4:48:03obviously grows. A minus b you're going
4:48:05to get a negative number, right? Cuz
4:48:06you're going backwards, but I'll leave
4:48:08reduce there just because, you know, in
4:48:09practice, you're probably rarely going
4:48:11to use it. Okay, that now takes us to
4:48:12the object suite of functions. So I'm
4:48:14just going to change the type to object
4:48:16here. And I'm now going to be extracting
4:48:18data from this, which is an object that
4:48:20is nested one level deep with a first
4:48:22name, a last name, and a height in
4:48:24centimeters. Apparently, Kof Arladen,
4:48:26uh, one of my favorite characters from
4:48:27fantasy, is 186 cm. Wonderful. So, um,
4:48:31I'm going to go JSON dot object. And I
4:48:35have access to this. And I'm going to
4:48:36press dot. And the first thing you're
4:48:38going to see when you're operating with
4:48:39an object is you're going to see some
4:48:41additional fields up at the top. So
4:48:43basically we'll go in we'll parse this
4:48:44out and then we have access to the first
4:48:46name the last name and the height in
4:48:47centimeters. So these aren't functions
4:48:49these are parameters but I'm going to
4:48:50write them down anyway. First name will
4:48:52equate to both right last name will
4:48:55equate to Arllin and then height and cm
4:48:58will equate to 186. Pretty neat huh? So
4:49:00these aren't functions as I mentioned.
4:49:01These are just ways to reference um you
4:49:03know uh values in in set array. Let's
4:49:06actually get into the functions. There
4:49:07aren't too many of them so it's going to
4:49:08be pretty straightforward. The first is
4:49:10called keys. Keys is pretty
4:49:11self-explanatory. All we do is we just
4:49:13get the keys and we pluck it out and
4:49:14turn it into an array. So in our object
4:49:18first name, last name and height in
4:49:19centimeters. These are all the keys. On
4:49:21the right hand side, both Arland and
4:49:23186, these are all the values. So if we
4:49:25want to extract the keys, we use keys.
4:49:27Similarly, if we wanted to extract the
4:49:29values, well, you just type values. So
4:49:30now we're extracting kind of the other
4:49:31half, right? Both Arland and 186 instead
4:49:34of first name, last name, height, and
4:49:37centimeters. In addition to that, um you
4:49:39can do is empty. This just tells you
4:49:40whether or not the object is empty. So,
4:49:42this object clearly not empty. There are
4:49:44a lot of things there, right? Is not
4:49:46empty. That's dang right it's not empty.
4:49:48There's a lot going on in
4:49:50there. Next up, we have has field. Has
4:49:53field is pretty self-explanatory.
4:49:55Basically, we're just looking to see if
4:49:56there's a field called um whatever. So,
4:49:59maybe we're feeding in an object. We
4:50:00just want to check to see if there's a
4:50:01field called first name. Well, we just
4:50:03go first name. That's true. But what if
4:50:06we wanted to check if there was a full
4:50:07name field? Full name in this case would
4:50:09be false because there's no key that
4:50:10corresponds to full name. Realistically,
4:50:12they probably should have called this
4:50:13has key and not has field. But what are
4:50:15you going to do, right? JavaScript.
4:50:17Okay, great. Next up, we have compact.
4:50:19Compact just does the same thing uh in
4:50:21objects as it does to arrays. So,
4:50:22basically, if we had any empty um values
4:50:25here, um we could we could uh basically
4:50:26remove them instantly. I'll show you
4:50:28guys an example. If I go first name
4:50:31Nick, then I go um last name, and then I
4:50:35go empty, the end result of feeding this
4:50:37in to our compact function, it just
4:50:40removes this last um element in field
4:50:42entirely because it's empty. If I put an
4:50:44X there, you'd see it had populated.
4:50:45Okay, the next function I want to talk
4:50:47about is going to be called um keep
4:50:50fields containing. This is kind of an
4:50:52interesting one because I don't know,
4:50:54they they change the the name or the
4:50:55meaning of fields over and over and over
4:50:57again. Basically, you see over here how
4:50:59I have first name, last name, Arlin,
4:51:00height, and centimeters. Well, what if I
4:51:02only wanted to extract parts of this
4:51:04object that have both in it. So, I want
4:51:06to extract the field name and the value
4:51:09of the field and value that contain. If
4:51:12I put that in there, you see that I've
4:51:13now created a smaller object called
4:51:15first name. And that's it. I don't
4:51:17really ever use this in practice, and to
4:51:19be honest, I don't use most of the
4:51:20object manipulators in practice, but we
4:51:23have remove field. Remove field just
4:51:24allows you to specifically take things
4:51:26out that you don't want. So maybe we
4:51:27want to remove the last name. We want to
4:51:29remove the height in centimeters, right?
4:51:31We also have remove fields containing.
4:51:33So this will go and take out fields that
4:51:36contain a value that we want or don't
4:51:38want. So in our case, we don't want any
4:51:40fields containing the value of both. So
4:51:41we take first name out entirely. And now
4:51:43it's just last name, height, and
4:51:44centimeters. And then we have our
4:51:46obligatory tojson string which just
4:51:47takes in the object and then it turns it
4:51:49into a JSON string that we can send to
4:51:50receive uh basically um through API
4:51:53call. So you know if you're trying to
4:51:55send an API call or trying to send data
4:51:56somewhere and it keeps on telling you
4:51:57that your JSON is misformatted just try
4:51:59passing it through to JSON string first.
4:52:01Um I use it pretty
4:52:02often. Last thing I'm going to show you
4:52:04is URL encode. This is pretty
4:52:06interesting. Um but basically you know
4:52:08how earlier we were talking about URLs,
4:52:09right? Let's hypothetically say I have
4:52:12some database available. Okay. What you
4:52:14can do with a URL is you can encode what
4:52:15are called query parameters. Query
4:52:16parameters look like this. You put a
4:52:18question mark and then after you put the
4:52:20name of the variable or the key name and
4:52:22then the value and if you want to add
4:52:25more the name of the variable or the key
4:52:26name and then the value and name of the
4:52:29variable uh aka the key name and then
4:52:32the value. So what this allows you to do
4:52:34is allows you to turn a JSON object
4:52:36which is sort of like this structured
4:52:37thing, right? and it allows you to just
4:52:39instantly encode it as one of these URL
4:52:42parameters or query parameters. This is
4:52:44pretty uh useful anytime you want to
4:52:45send or receive data add it to a website
4:52:47or something like that because instead
4:52:48of you having to like manually put all
4:52:50this stuff out like hypothetically I
4:52:52could totally go first name equals and
4:52:55then I could go dollar sign
4:52:57JSON.object first name, right? Be kind
4:53:00of similar. Um, but I'd have to do this
4:53:02sort of structure over and over and over
4:53:06again, which would just be a massive
4:53:07pain in the ass, right? Hypothetically,
4:53:10instead of me doing this,
4:53:13um, what if I just went, you know, this
4:53:15is, as you can see, it's just really
4:53:17unseammly. Um, you know, instead of
4:53:19doing this, if I just went, uh,
4:53:22JSON.object URL encode, u, you know,
4:53:24this is kind of a lot more
4:53:25interpretable, a lot shorter, a lot
4:53:26easier. So, I use URL encode pretty
4:53:28often. Okay, let's cover boolean
4:53:30functions. And boy, do I have a surprise
4:53:32for you. If we go
4:53:33JSON.boolean.bool, I should say, um,
4:53:35you'll see that there really only two
4:53:36functions. There's two number and then
4:53:38there's two string. So two number just
4:53:40turns a true into a one and then a false
4:53:42into a zero. In our case, what we have
4:53:44is we have a true down here. So the
4:53:47output is going to be a one, right? If
4:53:50we wanted to instead turn this to a
4:53:52string, this just turns the bool, which
4:53:54is uh technically even though this is in
4:53:56letters like t r ue e, this technically
4:53:58isn't considered a string. So what this
4:54:00allows us to do is allows us to take a
4:54:02bool and then convert it into a string.
4:54:04So we could do things like, you know, to
4:54:05uppercase or something. If we were just
4:54:08to go bool to uppercase, um, as you see,
4:54:10it doesn't really allow us to because
4:54:11this isn't like a function that you can
4:54:13apply to bools. So you got to go to
4:54:14string first, uh, basically. Okay, the
4:54:17last thing we're going to be doing is
4:54:18talking about datetime functions. Now
4:54:19the first thing we have to do in order
4:54:20to get a datetime function is we have to
4:54:22get a we have to get a date time right.
4:54:24So if you guys remember the way that I
4:54:26did this in order to get the Luxen date
4:54:28time it was called was I went uh
4:54:3201 sorry 3101 2025 then I went to date
4:54:38time saying that it can't convert it. Uh
4:54:41why was that? I think my format might
4:54:42have been different
4:54:44actually. 01 was it 01? Yeah, sorry. It
4:54:47was um I think it was 0131. Yeah, deluxe
4:54:51and datetime. Okay. Anyway, uh okay. So,
4:54:53once we have something in the
4:54:54standardized datetime format, um there
4:54:57is a million in one things that you can
4:54:58do. All you do is you press period. And
4:55:00now the standardized datetime format
4:55:02offers just uh god I don't know 20 or 30
4:55:05functions. Now, I'm not actually going
4:55:06to show you every single one of these
4:55:07because some of these are such uh, you
4:55:09know, obvious variants of each other,
4:55:11like you can plus a date, you can
4:55:12subtract a date, and that sort of thing.
4:55:14But I am going to cover all the ones
4:55:15that are important that I find myself
4:55:16using pretty often. So, the first one's
4:55:18called format. Format is super valuable.
4:55:21Basically, it allows you to get
4:55:22something that is a datetime, okay? Like
4:55:24this that allows you to format it
4:55:26however the hell you want. So, you know
4:55:28how there are millions of datetime
4:55:29formats out there or millions of date
4:55:31formats? Some people want it uh year
4:55:33year slashmon month/ day. Other people
4:55:36want it month/ year uh day/ year year.
4:55:40Well, this allows you to do so using
4:55:43characters that are um designated in
4:55:46this formatting guide. So, basically you
4:55:49have tokens like S, tokens like
4:55:51lowercase U, tokens like Z, tokens like
4:55:54K, right? And all these correspond to
4:55:56things like hypothetically if you wanted
4:55:58to um instantly translate any time into
4:56:02an extraverbose localized datetime you
4:56:05could just type fff or sorry ffff and it
4:56:08would automatically do that. So let me
4:56:10show you. If I just typed
4:56:12fff I've now converted this into a
4:56:16datetime and then I've immediately
4:56:17formatted it into this super
4:56:19extraordinarily complicated looking date
4:56:22which is just like a string
4:56:23representation. I could remove some
4:56:24complexity with FF. I could remove even
4:56:26more with FF. And I could just go FF to
4:56:28get some other format. Likewise, I
4:56:30actually create my own format if I
4:56:31wanted to. So maybe I wanted to go um
4:56:33year year year. Okay, sorry. Y I meant
4:56:37to say um because you got to lowercase
4:56:39Y's. Then month and then date date. And
4:56:42then let's say I wanted to go hour hour
4:56:46minute second. Okay, I've taken this
4:56:50date then I've converted it to a date
4:56:52time. Then I've formatted it in this
4:56:54specific structure. As you can see, we
4:56:56end up with um not only the year, the
4:56:58day and the month, and the day, we also
4:57:00end up with like the number of hours,
4:57:02minutes, and seconds. Now, in this case,
4:57:03it's 00 0. Why is it 00 0? Well, um I've
4:57:07been inserting standardized date times
4:57:09here. What you can actually do is
4:57:11there's a specific function that grabs
4:57:13the current date and time called dollar
4:57:15sign now. So, dollar sign now, if I were
4:57:19to just remove this, dollar time, dollar
4:57:20sign now is already in a date time. So
4:57:22you actually don't need to convert this
4:57:23to a date time. Um all you would have to
4:57:25do is you you just format this um as
4:57:28follows. Year year
4:57:32um month month day day and then
4:57:35h mm
4:57:39ss or maybe hh I think if I want to get
4:57:41three and then I think you just go a
4:57:45uh no p it'd say like am or pm or
4:57:49something like that. Uh, I kind of
4:57:50forget how to do that though. But
4:57:52anyway, um, now you know you can format
4:57:54the exact current time, uh, which is
4:57:56pretty cool and pretty useful. And I
4:57:58believe there used to be, and I don't
4:58:00know if there still are. I think there
4:58:01was like a time stamp variable or or
4:58:03something else, but I'll I'll leave that
4:58:04out um, just for the purposes of this
4:58:07discussion. Okay, great. So, if I just
4:58:09go back to my previous um, example,
4:58:11which just had sort of a simpler look at
4:58:13a date because we didn't have a bunch of
4:58:14seconds and stuff like that. If I press
4:58:17period again, you'll see that now we
4:58:18also have a few options. We have minus,
4:58:20we have plus, and then we have diff 2,
4:58:24and then extract. And these are the most
4:58:26commonly used datetime functions and
4:58:28ones that I use basically all the time.
4:58:30Minus just subtracts a given amount of
4:58:32time from a date, and it allows you to
4:58:34designate things just in like natural
4:58:36language. Well, not natural natural
4:58:37language, but like using dates, uh,
4:58:38days, hours, uh, weeks, that sort of
4:58:40thing. And then plus adds. Let me show
4:58:42you what this looks like. So, you know
4:58:43how right now this is like 0000? Like
4:58:47basically there's no there there's not
4:58:49even a single second to the day. Well,
4:58:51what if I wanted to add, you know, 30
4:58:54then seconds? Well, you'll see we've
4:58:56just changed this here. 40 seconds, 50
4:58:59seconds, 60 seconds, 70 seconds, 80
4:59:02seconds, 90 seconds. Let's say
4:59:04hypothetically we wanted to add 10 days
4:59:06to this. Well, now it's February the
4:59:0810th. How about 10 weeks? Well, now it's
4:59:10March the 11th. Well, now how about 10
4:59:12months? Well, now it's November the
4:59:1330th, right? You could even add years.
4:59:16Um, this is pretty standard, right? If
4:59:18you wanted to take this out, you just
4:59:19subtract instead by using minus. So,
4:59:22variety of different functions uh
4:59:24available to you for just doing like
4:59:25simple date manipulations. Um, a couple
4:59:27of other ones that I use pretty often.
4:59:29Uh, there's this one here called diff 2.
4:59:31Basically, what you do is you feed in
4:59:33the most commonly used one is now. But
4:59:36basically, you feed in the starter over
4:59:39here on the left and then you get the
4:59:42difference between that and the second
4:59:44date over here, which in our case, we're
4:59:46just going dollar sign now. And then we
4:59:48get the number of days. Hypothetically,
4:59:50what we could also do if you wanted to
4:59:52reverse this, right, this is a negative
4:59:54value. We could go dollar sign now diff
4:59:562. Then we could feed in this whole
4:59:58thing. And then we'd get that it's been
5:00:01667 days from this, aka I'm about 66%
5:00:04done. um the current day because this
5:00:06was counting from like the zeroth
5:00:08minute, the zeroth second, the zeroth
5:00:10hour of, you know, January the 31st,
5:00:132025. Likewise, we could uh show this
5:00:15off in weeks. We could do this in
5:00:17minutes. We could do this in seconds.
5:00:19Man, it's kind of crazy to me that 960
5:00:20minutes have already gone by in my day.
5:00:22What the hell have I been doing? Anyway,
5:00:24um aside from the existential value,
5:00:26obviously there's just a lot that you
5:00:27can you can do and get
5:00:29done. And then, uh we could also
5:00:31extract. So we could extract things from
5:00:33this really easily. Like now is
5:00:35obviously January the 31st, 2025, right?
5:00:38What if I wanted to extract the month?
5:00:40Well, we get the first month of the
5:00:41year. If I wanted to extract the year,
5:00:43what if I wanted to extract the day,
5:00:44right? I can basically go in, I can
5:00:46extract the current second, man. I can
5:00:48extract the the minute, right? The
5:00:50minute of the hour of the day. Um, so I
5:00:52have I have a lot of options available
5:00:53to me. Uh, and so this this ends up
5:00:55being pretty valuable when
5:00:58uh I don't know, usually when I'm
5:00:59sending or receiving something or when
5:01:01I'm performing logic for stuff like
5:01:02invoice follow-ups or email follow-ups.
5:01:05Um, using all of these functions just
5:01:06makes a lot a lot easier to calculate
5:01:09how long it's been since something has
5:01:10occurred and and so on and so forth.
5:01:12Variety of other functions. Um, this one
5:01:14uh is end of. This allows you to round
5:01:17up to the end of the month. So if I were
5:01:19to give you an example, this doesn't
5:01:21really make sense because I'm at the
5:01:23end. So, why don't we do start of
5:01:24instead? Um, start of just does the same
5:01:26thing. It just rounds um in the opposite
5:01:28direction. But if I want to round out my
5:01:30current date to the start of, then
5:01:33basically what I've done is I've rounded
5:01:36my date, which was January the 31st, to
5:01:38the the beginning of the month, which
5:01:41was the first. So, this is very similar
5:01:43to the floor function. It's just you're
5:01:45technically flooring like a date, which
5:01:47is pretty wild. Um, if I wanted to go
5:01:49start of the year, it would be the same
5:01:50thing cuz this is January, right? If I
5:01:52wanted to go end of year, you can see
5:01:54that we're now 2025, 12, 31, 23, 59, 59,
5:01:589999, so on and so forth. This goes all
5:02:00the way to the very very end of the
5:02:01year. I don't remember if you could do
5:02:03decade. No, you can't do decade. Uh,
5:02:04could you do millennium? Yeah. Anyway,
5:02:06lux and datetime is a something for
5:02:09another time. Lux and daytime is for
5:02:11another daytime. Uh, if you guys want to
5:02:14check the myriad cool functions, um,
5:02:17just Google this and then you'll see a
5:02:19variety of dot functions similar to what
5:02:21we've been screwing around with here.
5:02:22Luxon's extraordinarily powerful, but
5:02:24obviously some of the syntax and stuff
5:02:26like that can be a little trickier.
5:02:27Okay. And then aside from that, there
5:02:28was just a couple other ones that I used
5:02:30pretty often. Um, oh yeah, yeah, they're
5:02:33components. So, you know how earlier we
5:02:35were extracting things and we were doing
5:02:37so by saying like month. Well, you can
5:02:38actually just get like day, you can get
5:02:40like month, you can get like year. Uh,
5:02:42and you can you can dotindex it that
5:02:44way. Um, there's also zone. Um, so, you
5:02:48know, a lot of the time when you feed in
5:02:51a datetime object that you get from an
5:02:52API or something, it will
5:02:54include stuff like this minus 07. Well,
5:02:58what you can do is if you just type in
5:02:59zone, it'll tell you what the name of
5:03:01that time zone is. uh which can be
5:03:03really useful you know just when
5:03:05clarifying stuff contractual documents
5:03:06can be useful because a lot of services
5:03:08also require you to feed in a time zone
5:03:10and a lot of these also just use like
5:03:12zone codes or there's like a lot more
5:03:15names to these zones than I understand
5:03:16so in practice I usually end up using
5:03:18something like that in order to
5:03:19reference it and then there's um just
5:03:21some helper functions like is weekend so
5:03:23like you know you can find out if the
5:03:25date is a weekend let's say you're
5:03:27sending some sort of invoice follow-up
5:03:29well you can you know do your math and
5:03:30then you can determine if something is a
5:03:31weekend and then if it is a weekend, you
5:03:33can grab the date and then you can add
5:03:34one to it or two to it and then you can
5:03:36send it on the Monday instead. You have
5:03:37a lot of options, I should say, which is
5:03:38pretty neat with formatting, you know,
5:03:40date times as things like, you know,
5:03:42whether it's a weekend or in this case
5:03:43whether it's a leap year or so on and so
5:03:46forth. So, yeah, I'm going to leave the
5:03:48daytime functions there, but definitely
5:03:49check that out um if you guys want a lot
5:03:51more power and control over the way that
5:03:53works. I didn't add daytime functions in
5:03:54the batch of 106 just cuz these aren't
5:03:56technically like NADN functions. These
5:03:58are functions outside a library called
5:04:00uh Luxen and uh you know that's not like
5:04:02native to NAND or anything like that but
5:04:04obviously they're still super powerful
5:04:05to know so I highly recommend it. Okay,
5:04:07hopefully by this point you now have a
5:04:09reasonable understanding of NAD
5:04:11functions. Again, I know I mentioned
5:04:12this a few times in the video but you
5:04:14don't have to memorize all these. You
5:04:15can grab all of the stuff just straight
5:04:16from the documentation and the NAND AI
5:04:19tool is also pretty good at just
5:04:20figuring out sort of the finer nuances
5:04:23behind some of these functions. So,
5:04:24what's more important than knowing the
5:04:26specific information itself is just
5:04:28knowing how to find the information if
5:04:30you need to. And that's really what most
5:04:31modern developers do. It's not like
5:04:32we've all memorized every single
5:04:34function on planet Earth. We're just
5:04:35capable of going through a list of
5:04:37functions, reading a little bit of
5:04:38documentation, and figuring out which
5:04:39ones apply for which use case. Now,
5:04:41let's take your NAD knowledge to another
5:04:43level by transitioning from solely cloud
5:04:46hosted environments to self-hosted
Setting up self-hosting
5:04:48environments. To make a long story
5:04:50short, self-hosting just refers to the
5:04:51idea that you actually take the NAND
5:04:54source code and then you put it on a
5:04:56server. Now, you are doing it on the
5:04:58cloud. Technically, you're putting it on
5:04:59some sort of cloud server out there,
5:05:01although you can certainly do it on your
5:05:02own computer as well. It's just a little
5:05:03bit of nuance that I don't really think
5:05:05most people care for these days, but
5:05:06there are a number of benefits to
5:05:07self-hosting. The biggest one is cost.
5:05:09So instead of you spending a fixed
5:05:11amount per you know thousand operations
5:05:13or executions or or or workflow node
5:05:16runs what you can do with a self-hosted
5:05:18environment is you could basically pay a
5:05:20monthly rental to the service that hosts
5:05:22the server. Then you could run as many
5:05:23executions as you want. So instead of
5:05:25you spending you know hundreds if not
5:05:27thousands of dollars to run let's say 1
5:05:29million executions per month you could
5:05:30spend maybe 10 or 15 bucks to rent a
5:05:32server and then um you don't have to
5:05:34spend any money whatsoever to NAD. you
5:05:36just take care of all those executions
5:05:38within the the server rental. That
5:05:39sounds a little bit more complex to you,
5:05:40don't worry. I'm going to dive into how
5:05:42to do all of this stuff in the next few
5:05:43minutes. It's also really good for data
5:05:45security and privacy concerns. There's
5:05:47some niches that you work in,
5:05:48specifically healthcare, uh, legal, some
5:05:50financial, where you can't actually send
5:05:53like customer or patient data up to the
5:05:55cloud or you can't have it, I don't
5:05:57know, leave the bounds of your country.
5:05:59And so in this way what you can do is
5:06:00you can rent servers that are within
5:06:02your country or maybe on premises and
5:06:04then you know run an NAN install there
5:06:06making sure that you're not leaking any
5:06:07customer or member or patient data. This
5:06:10to be honest isn't super important in
5:06:11practice but there are a few industries
5:06:13in which this applies and self-hosting
5:06:14is the primary solution for a lot of
5:06:16those industries. The first and simplest
5:06:18way to self-host is using Render. For
5:06:20those of you that are unfamiliar, they
5:06:21call themselves the fastest path to
5:06:23production for a reason. Now, I'm not
5:06:24affiliated with them, but I'll show you
5:06:26how you can get up and running with
5:06:27Render in just a couple of minutes. This
5:06:29is easily the simplest way to go ahead
5:06:31and do so. So, first things first, just
5:06:33create an account over here. Now, I
5:06:34already have an account, so I'm just
5:06:35going to put in a fake one here. Fake
5:06:37email address and the fake password.
5:06:40We're going to click create account.
5:06:41They're going to ask you to verify your
5:06:42email next. Now, since I've already gone
5:06:44through and done all of the sign up, I
5:06:46can then go and then sign in. So, I'm
5:06:49going to sign in with my account. After
5:06:51you are done verifying your email,
5:06:53you'll be taken to a screen that looks
5:06:54like this. It'll say deploy a web
5:06:56service, static site, Postgres database,
5:06:57or explore all service types. Now,
5:06:59unlike a lot of the other videos here,
5:07:00I'm actually signed up to the service.
5:07:02I'm actually going to be paying when I
5:07:03need to. But I want to let you guys know
5:07:04that like, you know, the these videos
5:07:06tend to be invalidated pretty quickly
5:07:08because all of the platforms that we are
5:07:09signing up for self-hosting on, they all
5:07:11tend to have different UIs and UXs and
5:07:13they change the way that their
5:07:14dashboards look and stuff. So instead of
5:07:16paying attention to the very specific
5:07:17buttons I'm clicking and stuff like
5:07:18that, just try to understand what I'm
5:07:20doing more generally. So what you're
5:07:22going to want to do is you're going to
5:07:22want to find an area in the page that
5:07:24says deploy a web service and then go
5:07:26down to where it says existing image.
5:07:28What you're going to need to do is
5:07:29you're just going to paste this in uh
5:07:30verbatim. So nadn has a deployment
5:07:33method called a docker. Docker is just a
5:07:36very simple and easy way to grab like an
5:07:38image of the nadn install off of the
5:07:41internet. So, if you just Google, you
5:07:43know, nadn docker like I'm doing here,
5:07:45you'll get a page that looks something
5:07:47like this on the docker hub. And if you
5:07:49just scroll down, you'll find a URL that
5:07:51looks something like this.
5:07:54Docker.n.io/nadn.io/nadn. This is just
5:07:56what you copy. Then you go back to
5:07:58render and just paste it in where it
5:08:00says image URL up here. And then you
5:08:02click connect. I'm going to leave
5:08:04everything else as blank. And I'm going
5:08:06to click on free for hobby projects. In
5:08:09reality, what you're probably going to
5:08:10want to do is you're going to want to
5:08:11launch a starter uh standard or pro plan
5:08:13depending on your usage. If you are
5:08:15doing thousands of requests a minute,
5:08:17pro is probably uh sufficient for you.
5:08:19If you're just getting up and running
5:08:20and maybe have like two or three clients
5:08:22or two or three um you know, systems
5:08:24that you're you're maintaining that send
5:08:26workflows every few minutes, starter
5:08:27sufficient for you. If you do free, just
5:08:29note that they'll automatically spin
5:08:30down the service. This can be kind of a
5:08:32pain in the butt, but I'll just leave it
5:08:34at that. Once you're done, it's going to
5:08:36go through. It's actually going to spin
5:08:37up the Docker image and you're going to
5:08:39set up your server. So, let me cut in a
5:08:41second. By the way, it was on this
5:08:42website that I first found what NN
5:08:44actually means. Uh, it was written by
5:08:46the creator himself and he says that it
5:08:48means nodemation and it is pronounced as
5:08:51N8N. Apparently, the reason why was he
5:08:54just didn't really like typing a ton of
5:08:55characters. So, he said Nad, nodemation.
5:08:58Good enough. Okay. And then after a
5:08:59couple minutes, you're going to get a
5:09:00message that looks something like this
5:09:02with editor being accessible on this
5:09:03local host. All you need to do is go up
5:09:05here to the link, give it a click, and
5:09:07then you'll have the ability to set up
5:09:09your owner account. So that's what I'm
5:09:10going to do
5:09:13here. And once I'm done, going to click
5:09:16next. This will then send a verification
5:09:19email using my server actually, which is
5:09:22interesting. Do some fun little
5:09:25onboarding. Heard about y'all from
5:09:27Google. Then we actually have the
5:09:28ability um and this may not necessarily
5:09:30be the case when you guys are watching,
5:09:32but as of the time of this recording, we
5:09:33have the ability to get a bunch of paid
5:09:34features for free with a license key. So
5:09:36I've already done this on a bunch of
5:09:37other ones. I'm going to skip it, but
5:09:38yeah, now naden is here. We could start
5:09:40any workflow we want from scratch. This
5:09:42is running entirely in our own server.
5:09:44You'll see that because it's a free
5:09:45server, it's going to be a little bit
5:09:46slower than usual. Um but all hot keys,
5:09:49everything you could possibly want
5:09:51works. And because you're using a Docker
5:09:52image, it's going to be up to date. So
5:09:54this is by far the simplest and easiest
5:09:55way to get up and running with this. I
5:09:57should note this isn't the only way to
5:09:58set up Naden on render and we've also
5:10:01glossed over a fair number of like the
5:10:02configuration options that you have. If
5:10:04you want to check out some of those
5:10:05configuration options, feel free to
5:10:06check um the Nad Docker page, there are
5:10:09variety that allow you to like switch
5:10:10the database that you're using by
5:10:11modifying environment variables and
5:10:14changing basically a bunch of things
5:10:16related to encrypting and and so on and
5:10:17so forth. If you also look up the NAN
5:10:20community environment variables and just
5:10:21pump that into Google, you'll find a
5:10:23bunch of different settings that people
5:10:24use to optimize their NAND installs. Um,
5:10:26but that's just beyond the course of
5:10:27this video. The second simplest way to
5:10:29set up NADN in a self-hosted environment
5:10:31is using Railway. Now, for those of you
5:10:33that don't know, Railway is very similar
5:10:35to Render in that it allows you to very
5:10:37quickly and easily spin up servers and
5:10:39spin up databases for those servers. But
5:10:41our signup here is going to be a little
5:10:42bit different to what we were doing
5:10:43before. We're actually going to have to
5:10:44continue with GitHub. For those of you
5:10:46that are unaware, GitHub is a way to
5:10:48host your code or repositories that
5:10:50you've worked on. Uh, make a long story
5:10:52short, all you need to do to make sure
5:10:53that this method works is spin up a
5:10:55GitHub profile. on. I believe you have
5:10:56to add some authentication. So,
5:10:59github.com. Let me just open this in an
5:11:01incognito tab. There you guys can see
5:11:02what it'll look like when you do not
5:11:04have an account. Then click sign up over
5:11:06here. Add your credentials as necessary
5:11:08in order to get that account up and
5:11:15running. Then all you have to do is go
5:11:17back and authorize your rail railway
5:11:19app. This will give you $5 in free trial
5:11:22credits as of the time of this
5:11:23recording. And now we have an account
5:11:25here that I just have to accept a bunch
5:11:27of terms for. Then move on to deploy a
5:11:30template. The one you're going to want
5:11:31to click is n with workers. It's
5:11:32currently the most popular one um on the
5:11:34platform. Then just type in deploy. And
5:11:37basically what's going on now is we're
5:11:38using our $5 in free trial credit to
5:11:40spin up an NN instance with workers
5:11:43which are just a little addition and I
5:11:45believe it's a postcre database with
5:11:47Reus Reddus. I don't really know how you
5:11:49pronounce that. But the specifics of the
5:11:51implementation aren't super under aren't
5:11:53necessary to know or understand until
5:11:55you actually get up and running with NN.
5:11:56So the purpose of this is just to make
5:11:58sure that you you have an NN self-hosted
5:12:00instance. We can actually access it
5:12:01using um a public URL. So let's queue up
5:12:04some Jeopardy music and let's see how
5:12:06things go. At a certain point, you'll
5:12:07get a page that looks something like
5:12:08this. All of these will turn green. This
5:12:10is the actual deployment process and
5:12:11it'll say it's applying a bunch of
5:12:12changes. You'll get updates in the right
5:12:14hand column here that show you that
5:12:16various deployments were done. So in my
5:12:18case, it started with Reus, then it went
5:12:19to Postgres, and it's kind of working
5:12:21its way backwards over to the primary
5:12:23and add an instance before finishing off
5:12:25with the worker. Eventually, all of
5:12:26these nodes will have green little check
5:12:28marks associated with them. And all I
5:12:29have to do is go back to primary, then
5:12:31give this URL a click. It'll open up
5:12:33your NAD instance, same as we had
5:12:35before, and I can go through and I can
5:12:38add all of the information that I want.
5:12:40And because it's a new instance,
5:12:42obviously, it's asking me to go through
5:12:43the onboarding again. And so this is
5:12:45going to happen every time that you set
5:12:46up a new instance. It's going to offer
5:12:48to give me paid features for free
5:12:50forever. Um, and then voila, you know,
5:12:52we're basically good to go. Again, we
5:12:53have our NAND instance up and running.
5:12:55The third simplest way to get NAN up and
5:12:57running in a self-hosted environment is
5:12:58using Digital Ocean. They have a
5:13:00one-click NAN install template. Very
5:13:02simple, easy, and straightforward. You
5:13:04just type in Digital Ocean into Google,
5:13:06and this will be one of the first hits.
5:13:08I'm going to sign up to an account here
5:13:09from scratch. Show you guys what it
5:13:11looks like. So, just pumping in my email
5:13:13address and my password. I like Digital
5:13:15Ocean's design. Very
5:13:17nice. It's now going to do some bot
5:13:20verification just to make sure that I'm
5:13:21a real human
5:13:22being. And once we are in Digital Ocean,
5:13:25we're going to have to go through our
5:13:28confirmation
5:13:30sequence. And we have some onboarding
5:13:32that I'm very quickly going to get up
5:13:34and
5:13:36running. And then once we're here, you
5:13:39do have to enter in some payment
5:13:40details. So, in my case, I'm going to
5:13:42enter some payment details just to
5:13:43secure the account. I'm going to do that
5:13:44offscreen, of course. Okay, great. And
5:13:46now we are registered in Digital Ocean.
5:13:49And in order to get all this stuff up
5:13:50and running, it's very, very easy. All
5:13:52I'm going to want to do is go over to
5:13:53the Digital Ocean um I believe it's
5:13:55called their marketplace or their store.
5:13:58So, go back over
5:14:00here. Let me go. I think it's
5:14:02marketplace. There we go. And what we
5:14:04want to do is we want to click on or
5:14:06search for
5:14:08N8N. be a one-click install. All we're
5:14:11going to do is create an NN droplet.
5:14:13It's now going to connect back to our
5:14:14account. We can select the specific
5:14:17server area we want. Um, just select
5:14:19whatever is closest to you. It should
5:14:20automatically do this. And then it
5:14:22should automatically select an Ubuntu
5:14:24version. In my case, it's 22.04 on the
5:14:27marketplace. I'm just going to use the
5:14:28basic plan. Um, it's going to try and
5:14:30like get you up to the the peak. Um, but
5:14:33I'm just going to go down to regular.
5:14:35And then I'm going to go down to six
5:14:37bucks a month or 9 cents an
5:14:39hour. Actually, 9 cents an hour, I
5:14:42should
5:14:43say. Now, you're going to have to create
5:14:45a root password. So, I'm going to do
5:14:47this
5:14:48here. Looks like it needs to be a little
5:14:51bit
5:14:54longer. H. Uh, one uppercase letter. O
5:14:57man, this is
5:14:59tough. Oh jeez. Uh, why don't we just
5:15:03go
5:15:05to Okay, that's rough. So, I'm totally
5:15:08going to forget that. So,
5:15:12y three. That sounds good. Paste that
5:15:15puppy in there. I'm going to store it
5:15:17very securely on YouTube where everybody
5:15:20could see it. And then we're going toh
5:15:22create the
5:15:24droplet. Now, this is going to do the
5:15:26whole deploy procedure similar to like
5:15:28how we, you know, what we've seen
5:15:29before. very same idea. It's just going
5:15:32to obiscate or obscure some of that data
5:15:34from Digital Ocean. I find it's just a
5:15:36little bit less I don't know, they put
5:15:37that stuff a little less front and
5:15:38center. Um it's also an older platform
5:15:40versus something like Railway or Render,
5:15:42which is focused a lot more on uh
5:15:44obviously, you know, user experience and
5:15:46being modern and stuff like that. So,
5:15:48we're going to give it a few minutes and
5:15:49let it finish. Okay. And then your
5:15:50droplet should be up and running. The
5:15:52issue in Digital Ocean and the reason
5:15:54why this is like third instead of first
5:15:56is because you can't just access it via
5:15:58the IPv4, the IP address. Paste it in,
5:16:01you'll have some some issue. It will
5:16:02refuse to connect. So, we have to do
5:16:04instead is you have to actually add this
5:16:05to a domain um using DNS. What I'll show
5:16:08you guys how to do here is on my own
5:16:11leftclick.io. I go to advanced DNS here.
5:16:14Then add an A record. The host is going
5:16:16to be NAD. The IP address is going to be
5:16:18this. And I'm just going to try and do
5:16:19this as quickly as possible. So click 1
5:16:21minute. What this is going to do is it's
5:16:23going to provide me a publicly
5:16:25accessible URL at
5:16:27nadn my domain
5:16:30name.ai that routes to this address
5:16:33here. So if you don't have this um
5:16:36you're going to have an error every time
5:16:37you try and access the IP the IPv4 which
5:16:41is the IP address. So I'm going to give
5:16:43it a minute and then I'm going to access
5:16:45n.click.ai. After that all we need to do
5:16:47is go to console here. Give that a
5:16:48click. It'll open up this window, which
5:16:50looks pretty scary, make you feel like a
5:16:52computer hacker. All you have to do is
5:16:54press enter, enter in the domain name.
5:16:56Enter in whatever the email address you
5:16:58want to use for their encryption
5:16:59protocol is, and then um I'm just going
5:17:02to not set up a time zone. It's actually
5:17:04going to go through and run some
5:17:05additional configuration options for us.
5:17:07So, here it is. It's now building this
5:17:10out. Once you're done, it'll say
5:17:11installation complete. Access your new
5:17:13edit end server in a browser to continue
5:17:15at this address. So, I'm going to copy
5:17:17that
5:17:17over. Go back here. Open up a new tab.
5:17:20And as you can see, we now have the
5:17:22owner account screen. Same as we had
5:17:26before. We can set it up. It's going to
5:17:28ask us some onboarding
5:17:31info.
5:17:32And voila, you can now go in and then,
5:17:35you know, muck around in our canvas.
5:17:36Again, the fourth way to set up Naden in
5:17:39a self-hosted environment is using
5:17:40Heroku. Now, if you just Google Heroku,
5:17:43spelled H E R O K U, you'll get to a
5:17:45website like this. Heroku is definitely
5:17:47a lot older of a platform. You can see
5:17:48they have some updates that are coming.
5:17:50So, maybe that has changed as of the
5:17:51time of this recording, but we will type
5:17:53in N Heroku. What you want is you want
5:17:55this GitHub repo here or a GitHub repo
5:17:58that looks something like it. Now,
5:18:00GitHub actually has a native deploy to
5:18:01Heroku button. So, what you can actually
5:18:02do is you just click this button and
5:18:04then it'll deploy it to Heroku. They've
5:18:06done some updates over the course of the
5:18:07last 3 months. I should note that every
5:18:08time we're doing this, we're getting
5:18:09slightly different versions of NAND and
5:18:11stuff, but you click on that button,
5:18:12you'll then be taken to Heroku where you
5:18:14can log in to an account, which I have
5:18:16yet to do. So, I'm actually sign up to
5:18:18an
5:18:21account. That's what I'm doing here. Uh,
5:18:23no company. So, enter your email
5:18:26again. And I am in the United States.
5:18:31Let's say
5:18:33Delaware. Now, creating my account. So,
5:18:36we're going to check my email like I did
5:18:38a moment ago. Okay, now we have to add a
5:18:40bunch more info. Um, and it looks like
5:18:42you have to make your password super
5:18:44long. Okay, now we have to enter some uh
5:18:47two-factor
5:18:49authentication. I don't really know what
5:18:50I want to do here. Um, one time
5:18:52authenticator. Yeah, that's probably
5:18:54what I'm going to do. I then have to go
5:18:57and download an app called Authenticator
5:19:00from the um Google Play Store or the
5:19:04Apple Store. The way that this works is
5:19:06it'll basically just generate a code
5:19:07based off of the current date and time
5:19:10multiplied by some secret key thing that
5:19:12Heroku has installed. Then what it'll
5:19:14allow you to do is you're actually going
5:19:15to be able to scan it using something
5:19:18that looks just like this. And basically
5:19:20you put in your little QR code in that
5:19:23in that center area here, which is what
5:19:24I'm
5:19:26doing. And it's just given me a
5:19:28verification code that I can now pump
5:19:30in, which will be
5:19:33this. There are multiple different
5:19:35authenticator apps. You could use
5:19:37whichever one floats your boat. I like
5:19:38using the Google authenticator one. Just
5:19:40simpler and easier for
5:19:42me. Okay, now we have some more
5:19:45onboarding questions just to go
5:19:47through when this puppy finally loads.
5:19:49That is, am I doiciled in Italy? No.
5:19:53Awesome. Okay, great. So now once we're
5:19:54signed in, we can go back to that N8
5:19:56Heroku GitHub install. Click deploy to
5:19:59Heroku and it'll actually just do that
5:20:01oneclick deploy for us.
5:20:03going to call this nadnick common
5:20:06runtime and I'm going to dismiss this.
5:20:10And then the only things that we have to
5:20:12do is are we have to change the
5:20:13encryption key. So we have to change it
5:20:14to whatever the heck we want. I'm going
5:20:16to do
5:20:17um I don't know Nick is super awesome
5:20:22and jacked. All
5:20:24true. Um and then the app name is going
5:20:26to be the Heroku application name which
5:20:28is naden Nick. So naden-nick. Cool. and
5:20:32we click deploy.
5:20:34Beautiful. As this is a one-click
5:20:36deploy, all of the configuration
5:20:38settings are just up on their own. So,
5:20:40as you can see, there's some config
5:20:41variables here. These are the same
5:20:42things the environment variables and
5:20:43render um and then railway that we saw
5:20:45earlier. But I'm just going to let it
5:20:47play and we'll see what happens. Great.
5:20:48You're going to get a bunch of green
5:20:49check marks as per usual. And then we're
5:20:51just going to go view. Now, because we
5:20:53don't have um like HTTPS installed
5:20:56basically and Heroku, which is a little
5:20:58bit behind on this stuff, you're
5:20:59probably going to get a dangerous site.
5:21:00What you're going to want to do is
5:21:02you're going to want to go visit this
5:21:03unsafe site down here. It'll actually
5:21:05take you to the page. And as you can
5:21:06see, there's no real difference in the
5:21:08uh that's okay. There's no real
5:21:10difference in um any of the the safety
5:21:13here. Um it's just like it's your own
5:21:14website. They're just lacking the
5:21:16protocol that we'd be interested
5:21:17in. So yeah. Um voila. We are now on our
5:21:22website. We're going to go software
5:21:23business owner, myself, um less than 20
5:21:26people, and then Google as per usual.
5:21:29And we got some paid features. And then
5:21:30voila, we can now start from scratch all
5:21:32over again with our naden install
5:21:35self-host number four. The next way to
5:21:36selfhost naden is actually just do it on
5:21:38your own computer using Docker. Uh you
5:21:40can do so on like your laptop or maybe
5:21:42you have some server rack or something
5:21:44like that. I don't necessarily recommend
5:21:45this unless you know what you are doing,
5:21:47but I'm putting it in here just for
5:21:48completeness sake. What you're going to
5:21:49want to do is just head over to
5:21:51docker.com. It'll allow you to download
5:21:53the Docker desktop version. Now I have
5:21:55an Apple Silicon Mac, so I'm going to
5:21:57give this a click.
5:21:58This is then going to go through the
5:22:00download process. Once I'm done with
5:22:02that, I have my docker.d image. Again,
5:22:04this is going to be different if you're
5:22:05running a um I don't know, like a Mac or
5:22:08a PC or something. Make sure to download
5:22:09the right one for your version. In my
5:22:11case, I'm copying this over to the
5:22:12applications folder, which takes its
5:22:14sweet ass time. Then after that, you can
5:22:16just search for Docker, whatever way
5:22:19that you are currently interacting with
5:22:21your FileFinder. That's how I do
5:22:23mine. It'll verify the package. Yes, I
5:22:27want to open the package. That is why I
5:22:29doubleclicked it. And then uh you can
5:22:31accept and then use these advanced
5:22:34settings. My case, I need to enter my
5:22:36password to do so. Okay, great. So, um
5:22:40you can sign in, you know, through go
5:22:42through the whole rigomeroll if you want
5:22:43to like creating an account and stuff.
5:22:45I'm just going to skip all this. And
5:22:46what you want is up up here where it
5:22:48says search, you're just going on paste
5:22:50in not that um just look for NAD. So
5:22:54naden io/naden is right over here. So
5:22:58what you're going to want to do is
5:22:59you're going to want to click pull.
5:23:00That'll go through setting this up on
5:23:02your own computer basically. And once
5:23:04you've pulled it, you're going to want
5:23:06to run it. Now I should note that you
5:23:08can do this through terminal as well.
5:23:10You don't need to necessarily do this
5:23:11just through like the Docker desktop.
5:23:12Docker desktop's just a much easier way
5:23:14of getting up and running with this. And
5:23:16then you're actually going to want to
5:23:17instantiate this by clicking run. And
5:23:19when you do so, it'll ask you for some
5:23:20optional settings. I'm going to do 5678
5:23:24right over here. Volumes, host path,
5:23:26environment variables. I'm just going to
5:23:27leave that as is. And I'll just do
5:23:29n-nick. Going to give that a run. And
5:23:31you'll see that, you know, my computer's
5:23:32a lot faster than a lot of the other
5:23:34ones we've been using. So, it's already
5:23:35done with the deploy. If you click 5678,
5:23:38you'll now be at localhost 5678. Which
5:23:40is again my own server. And now I'm
5:23:42actually running n directly on my
5:23:44computer. So, because I have way more
5:23:47server resources than, you know, most of
5:23:48these ones that I could rent out
5:23:49realistically, I bought like one of the
5:23:51swankier MacBooks. Um, you know,
5:23:52everything here is going to run way, way
5:23:54faster than, you know, if I were to do
5:23:56so using some sort of cloud instance.
5:23:58You also need to keep in mind I'm not um
5:24:00I don't have to send and receive data.
5:24:02It's actually just all locally here. I
5:24:03could see this making sense for people
5:24:05that want to play around with like
5:24:06higherend applications. Just keep in
5:24:08mind that this does complicate the
5:24:09process quite a bit because now, you
5:24:11know, your web hook urls are all local.
5:24:13Now, if you want to um find a way to
5:24:15expose, right, if I go back here, if I
5:24:17type web web hook, but you'll see that
5:24:20we can't currently access this. So, if
5:24:22you want to, I'm actually going to go
5:24:23back to my docker container. I'll stop
5:24:25it. If I click delete here, so we're
5:24:27going to want to find the nio this one.
5:24:29Uh we can pull it if we want, but in my
5:24:31case, I'm going to click run. What I
5:24:32want is I want to set the web hook URL
5:24:35to this. And then the host port I'm just
5:24:37going to leave at 5678. We'll call this
5:24:40NAN-IK again. So now when I run this
5:24:43after it uh gets up and running I'll
5:24:45have access to my local host setup
5:24:47again. So let me just go through the
5:24:48rigomearroll of the
5:24:51signup. And now if
5:24:53I I need to find a way to automate this
5:24:57just given how many times I'm signing up
5:24:59to all these. No thank you. Now if I
5:25:01start from scratch and I add a web hook
5:25:03URL, what you'll see here is it
5:25:06automatically puts in um this address.
5:25:08Now this still isn't enough to make it
5:25:10accessible. But what we need to do is we
5:25:11need to find a way to pass in requests
5:25:13from
5:25:15naden-nick.leclick.ai to our local NAD
5:25:17instance. And that specific thing is
5:25:19beyond the purpose of this tutorial.
5:25:21Essentially, what you're going to have
5:25:22to do is you're going to have to set up
5:25:24ngx, which is uh basically an HTTP web
5:25:26server that makes it so that when you
5:25:28send a request over to that address, um
5:25:31it'll automatically forward it over to
5:25:33your local host on your machine. But
5:25:34there's a ton of great documentation
5:25:36written on all this stuff on NAD. Um,
5:25:38feel free to check out configuration
5:25:40environment variables and then if you
5:25:42just type nadnx right over here, it'll
5:25:45show you guys uh well there variety of
5:25:46like answers direct from the founder of
5:25:48nadn himself um that walk you guys
5:25:50through what that process looks like.
5:25:51The last way I'm going to show you on
5:25:53how to set up nad in a self-hosted
5:25:54environment easily and quickly is using
5:25:56Hostinger. For those of you that are
5:25:58unfamiliar, Hostinger is very similar to
5:25:59the other tools that I mentioned here.
5:26:01Um they just kind of hold your hand
5:26:02through the process a little bit more.
5:26:04So, if you just type in NAND and then
5:26:05Hostinger up here, it'll take you to
5:26:07this page. There's a one-click VPS
5:26:10template, which will get you up and
5:26:11running quickly. Um, these are the
5:26:12prices on a 24-month term, but when you
5:26:14click on it, you'll actually be able to
5:26:15select a uh a smaller term if you want.
5:26:17So, period 24 months. Let's go down to 1
5:26:19month here. I'm going to click on
5:26:21continue. It's obviously then going to
5:26:23ask me to create an account and do all
5:26:24my pricing information and stuff, but
5:26:26let's do this one. Okay, good to go.
5:26:28We're now going to click get started.
5:26:30That's going to take us to our H panel.
5:26:33H panel is just like the hosting or
5:26:35panel. And we have a guided setup here.
5:26:38I'm going to choose just the the default
5:26:39options because they walk you through it
5:26:41fair amount. The template that I'm
5:26:43looking for is NAN. So that's the one
5:26:45that you're going to want to do. It will
5:26:46launch um it will ask you to set up some
5:26:49malware scanning BS. I never do that.
5:26:51And then you do have to set up a root
5:26:53password of some kind. It'll be the same
5:26:54sort of idea as before. That looks
5:26:57pretty good to me. Oh, 12 to 50
5:26:59characters. Can I just double this up?
5:27:02Yes, I can. We have the VPS host name.
5:27:06We had an SSH key, which I don't really
5:27:07need. It's going to save all this stuff.
5:27:10All this looks good to me. I'm going to
5:27:11click finish setup, and it's going to
5:27:12run through the process now of setting
5:27:14up my VPS. After that, you'll get a
5:27:16message saying the VPS is ready. We'll
5:27:18click manage VPS here. Um, it's going to
5:27:20obviously ask us some fun stuff. Thank
5:27:22you for the onboarding. Then, we have to
5:27:23do is head to panel access. Click on the
5:27:25login URL and this will take us to our
5:27:29lovely hopefully familiar at this point
5:27:31um NAN signup
5:27:33page and then from there you can proceed
5:27:36through the onboarding as I've done five
5:27:38times already. Click get started skip
5:27:41the paid features trial and then you are
5:27:43now good to go. We are in the canvas.
5:27:45Perfect. So now you not only know how to
5:27:47put together workflows in Naden and
5:27:49drive real business value but you know
5:27:50how to self-host. we've actually leveled
5:27:53up on the deployment side of things,
5:27:54which is historically very difficult to
5:27:56do. What I'd like to do next is I'd like
5:27:58us to take a step back, zoom out a bit,
5:28:00and then look at naden not isolation
5:28:02anymore, but as one of many tools that
5:28:04you could choose. And particularly what
5:28:06I'm going to do in this video is compare
Comparing n8n vs make & which to use when
5:28:07naden to make.com. These are two sort of
5:28:10competing noode platforms, and I know we
5:28:12haven't talked too much about them up
5:28:13until now, but I think it's important
5:28:15for you to understand the merits because
5:28:16some organizations are going to want one
5:28:17solution, some organizations are going
5:28:19to want another. And especially if
5:28:20you're doing any sort of consulting,
5:28:22you're going to want to know enough of a
5:28:23difference between the two platforms to
5:28:25be able to make strong educated
5:28:26decisions. Yeah, let's start with module
5:28:28availability. I've also included a
5:28:29winner here. So I think that the winner
5:28:30in module availability is make if we go
5:28:32back to NAND here and then I click on
5:28:34this plus arrow on the right hand side
5:28:36and I type action in an app and I scroll
5:28:37through. Don't get me wrong, there are
5:28:39lots of platforms but I don't know in
5:28:41total maybe a couple hundred, right?
5:28:44These are all the platforms that NN is
5:28:46natively um connected to. Whereas, if we
5:28:48go back over here to make, we click on
5:28:50this plus button, scroll through, I
5:28:53mean, that's probably to where NAN was.
5:28:55So, I don't have a numeric way of
5:28:56figuring this out, but I'd say make.com
5:28:58is probably at least 15 to 20, maybe 25
5:29:01times as many platforms. And that's not
5:29:03taking into account community platforms
5:29:05and stuff either, although I don't
5:29:06really know if that's fair considering
5:29:08that NN probably has some community
5:29:10functionality as well. But yeah, I guess
5:29:11the point that I'm making is since
5:29:13Make.com's been around a little bit
5:29:15longer if you're just looking for like
5:29:16direct out of the box connections that
5:29:17just tend to work, make.com is probably
5:29:19your your better bet. Um, it's
5:29:21definitely substantially more
5:29:23streamlined to get up and running as
5:29:24opposed to you having to make your own
5:29:25API calls or that sort of thing. Okay,
5:29:28the next is JSON and code integration.
5:29:30So, you know, as I mentioned earlier, if
5:29:32we click on label general Q&A, we scroll
5:29:35in a little bit. Message ID, JSON ID.
5:29:37This is pretty interesting because we
5:29:39actually have like code in our no code
5:29:41or low code tool I should say. And the
5:29:44really cool part about it is naden
5:29:46actually allows you to use JavaScript
5:29:47just natively in any of these fields as
5:29:49long as you um go over here and click
5:29:51expression. So for instance if I just
5:29:53like you know I don't know wanted to do
5:29:55something to this JSON ID. Okay. I
5:29:58wanted to uh check if it starts with the
5:30:00number three or something. Uh like I I
5:30:03can do that. I can I can literally do
5:30:05that. Um, let me check what this
5:30:07actually was. This is a one. If I click
5:30:09one here, you see it just turned to
5:30:10true. Two, false. One, true. So, I can't
5:30:13understate how crazy this is to me as
5:30:15somebody that, you know, kind of like
5:30:17back in back in the hood, man, like the
5:30:19make.com hood, things were rough out
5:30:21there. We didn't have any JavaScript or
5:30:23anything like that. Uh, we we had to
5:30:25make do with like built-in make.com
5:30:26functions. The second that you sprinkle
5:30:28a little bit of code onto your Note Code
5:30:30platform, like like basically everything
5:30:32becomes possible very very quickly and
5:30:34easily. Um, you know, make doesn't
5:30:36really want to let you do that because
5:30:37obviously if you could just like do
5:30:38something like this with one little, you
5:30:40know, like a few characters, then how
5:30:41are they going to make their money,
5:30:42right? Like obviously it's uh the
5:30:44simplicity and effectiveness of the no
5:30:47code automation platform in a way is
5:30:48directly opposed to their ability to
5:30:50monetize if it's being built on a per
5:30:53operations basis. So NAN definitely
5:30:55wins. There's no comparable feature in
5:30:57make.com. The only thing that's even
5:30:58somewhat comparable is they uh there's
5:31:01this third party service called customjs
5:31:03and this isn't even like a like makes
5:31:05company like this is some other company
5:31:06that like built a way to do this. You
5:31:08can actually like add some code yourself
5:31:10in JavaScript but as you see it's
5:31:12nowhere near as dynamic. You don't get
5:31:13any feedback. You don't know when the
5:31:15code was sent or received. Uh you don't
5:31:17have little tool tip windows that pop
5:31:19up. It's just nowhere near as as
5:31:21dynamic. And you actually have to pay
5:31:22another platform in order to run
5:31:24JavaScript inside of make which is
5:31:25hilarious. So, JSON and code
5:31:27integration, N wins hands down. There's
5:31:29no, it's not even close. Um, I could
5:31:31show you, you know, a bunch of other
5:31:32stuff here. Like, you could literally
5:31:34make your own JavaScript window. You
5:31:35could write as much code as you want
5:31:36here. Um, but I'm not going to cuz I
5:31:38think it's pretty clear who wins that
5:31:39one. Okay, the next up is flow control.
5:31:42N wins flow control. Now, what is flow
5:31:44control? Essentially, you know, earlier
5:31:46I was talking about how this is one of
5:31:47the simpler flows that you could build,
5:31:48right? This is sort of like in one
5:31:49direction. It's unidirectional. You
5:31:51don't have like loop backs and stuff
5:31:52like that. And it can get pretty
5:31:53complicated with that stuff, but in
5:31:54general, it's it's much more powerful in
5:31:56nuance than anything that make.com could
5:31:58hope to do. Um, a good example of this
5:32:01is just this text classifier. As you
5:32:02see, this Gmail trigger feeds into a
5:32:04text classifier which natively outputs
5:32:06like five different if then statements.
5:32:08Okay, cold outreach, general Q&A,
5:32:10Gumroad notifications, invoices and
5:32:12receipts, unknown. It just automatically
5:32:13does this built-in. If we wanted to do
5:32:15something similar here in make.com with
5:32:18a
5:32:18router, which is the equivalent um
5:32:21function that kind of splits flows
5:32:24up, I would have
5:32:28to go and add a filter for every route.
5:32:32I have to say, you know, category has to
5:32:35be equal to um you know, cold
5:32:39outreach. I have to label it. And then I
5:32:41have to do that like, you know, six
5:32:42times or however many times I did.
5:32:45Um, so, you know, for one, we we just
5:32:48tend not to have that built-in kind of
5:32:50filtering or or uh what's the term flow
5:32:54functionality. On the other hand, um, I
5:32:56find loops are just a lot better done in
5:32:58N8. Now, I'm not going to show you an
5:33:00example of a loop here, but you can
5:33:02actually just like natively loop things
5:33:04back into each other in N8. Um, it's
5:33:06kind of crazy to me just to be able to
5:33:08do that to drag the output of one
5:33:09function into the input of another.
5:33:11There is no native way to do this in
5:33:13make. Like I can't can of do that. And
5:33:15the main reason why is they just don't
5:33:16want to like you know over complicate
5:33:17the hell out of the process for you. Um
5:33:20so instead the way that it works is if
5:33:21your previous module outputs multiple
5:33:23bundles then all um subsequent modules
5:33:26will run for the same number of times or
5:33:30they will run the same number of times
5:33:31that there are bundles in the previous
5:33:33module. If I give you guys a very simple
5:33:36example with a parse JSON module, which
5:33:38is just a way for me to convert um
5:33:40JavaScript object notation into
5:33:43something that's accessible by
5:33:45make.com. If we go array and then I go
5:33:49here and
5:33:50then go
5:33:52one
5:33:54to if I were to run this, what would
5:33:57happen is my first module would run once
5:34:01because I just outputed an array. I just
5:34:03converted this into make.com's format.
5:34:05So an array was um produced with three
5:34:08elements. I then iterated over this
5:34:10array which basically just means to turn
5:34:12an array of elements into three separate
5:34:15runs. So this is run number one, bundle
5:34:16one, run number two, bundle two, run
5:34:18number three, bundle three. Then it ran
5:34:20this set variable module three times. If
5:34:22I make um the value of this the
5:34:25value I run this
5:34:28again you'll see that I don't really
5:34:30have like a looping feature but we do
5:34:33run the same number of times as there
5:34:34are bundles in the previous section.
5:34:36What I mean by that is if the input to
5:34:38this is uh one bundle then the output is
5:34:40that same bundle but we didn't just
5:34:44input that one bundle we output three
5:34:46and then three outputs were made
5:34:48simultaneously. Operation three has a
5:34:50value of three. Operation two has a
5:34:52value of two. Operation one has a value
5:34:53of one because that is the value that I
5:34:55extracted from the particular bundle run
5:34:58um from that parse JSON module at the
5:35:00beginning. So without really beating a
5:35:03dead horse at this point, I'm just going
5:35:04to call it there. But n is is certainly
5:35:08far far better than make.com in flow
5:35:11control. Um they have the ability to
5:35:13filter just like make.com does, but then
5:35:15also have built-in ifs, loop over items.
5:35:17They can merge data from two different
5:35:19data sets. uh they have built-in error
5:35:21handling. It's
5:35:23fantastic. Another thing I want to bring
5:35:24up is testing. If you guys remember
5:35:26earlier when I was attempting to test
5:35:28the NA10 flow, all I did was I pinned an
5:35:31example and then I could actually
5:35:32manually modify the content of that
5:35:34example here. Then all I needed to do
5:35:37was I just ran the subsequent modules or
5:35:39subsequent nodes rather one by one,
5:35:41right? And it always just used that same
5:35:43input. I can't overstate how valuable it
5:35:46is to have that ability in a noode tool
5:35:49because the alternative is basically
5:35:51make.com where if I want to run
5:35:53something from left to right, I
5:35:55basically need to make an API call to my
5:35:57email server every single time I do
5:35:58that. So there's no caching of data.
5:36:00There's there's nothing that easy. If
5:36:01you wanted to build that in, you'd
5:36:03actually have to manually do that by
5:36:04using something like a set variable
5:36:06module, setting it to whatever you want.
5:36:10Yeah.
5:36:11And then on all downstream modules
5:36:13having to reference that set variable
5:36:15module for your testing and then anytime
5:36:17that you wanted to switch from staging
5:36:19to production basically you'd have to
5:36:21switch back over and over and over and
5:36:23over again. Um which means you'd have to
5:36:24go through every module and then change
5:36:25the email body variable back to uh you
5:36:28know the text the email text variable
5:36:30over and over and over again. And that's
5:36:32really annoying. It's also annoying
5:36:33because they kind of charge you a little
5:36:34bit more for it. So not even close and
5:36:37AD's just much better with testing
5:36:39authorizing and connecting. Uh, make
5:36:41wins for sure. Um, I know that I showed
5:36:43you some pretty simple connection flows
5:36:44here where all you needed to do is log
5:36:46into your Gmail, but in reality, Naden's
5:36:48connection flows are substantially
5:36:50harder most of the time. Um, if you
5:36:52wanted to connect, I don't know, like a
5:36:53Google sheet or
5:36:56something. Actually, you know what? Now,
5:36:58you could probably do one click off,
5:36:59right? Yeah. Okay, I take that back. You
5:37:01can do one click off here. But
5:37:02previously, if you wanted to do um I
5:37:04don't know, something like a Google
5:37:05Drive, you would have to create a
5:37:08credential and then you would have to go
5:37:10and use um you'd basically have to like
5:37:13do a whole API connection, which is
5:37:15obviously extraordinarily intimidating
5:37:16for new users. So like really, you're
5:37:18going to have to go into the Google
5:37:20Cloud Console and get the OOTH redirect
5:37:22URL, the client ID, the client secret,
5:37:25and you have to read super annoying but
5:37:27also very intimidating documentation on
5:37:29how to do this. you know, honestly, you
5:37:30could screw up and it could take you
5:37:32forever and you could be totally
5:37:33dead-ended. Whereas, if you wanted to do
5:37:34the same thing with make.com, you would
5:37:36just add a, you know, a Google Drive
5:37:37module here. And then the connection to
5:37:40this is literally just again sign in
5:37:41with Google. It's sort of a one-click
5:37:43sort of deal. So, very straightforward.
5:37:45Make.com even despite the fact that they
5:37:48have like 10 times the built-in modules,
5:37:50it's just much much better there. So,
5:37:52make definitely wins uh on that respect.
5:37:54For web hooks and mail hooks, u make
5:37:56wins as well. It's extraordinarily
5:37:58simple. And this isn't going to make
5:38:00sense unless you have like a um no code
5:38:02background, but it is extraordinarily
5:38:05simple to set up a custom basically
5:38:08event handler in make.com. All you do is
5:38:11you click add, you make new web hook.
5:38:14Let's just do YouTube example. I've had
5:38:16to start writing YouTube example cuz I
5:38:18went through all of my connections a
5:38:19little while ago and there were like 8
5:38:20million that were just ASDF. I'm just
5:38:23going to say YouTube example and 8N
5:38:25versus make web hooks. They just give
5:38:27you an address and you can just send a
5:38:28request to this address anytime you want
5:38:30and then something will automatically
5:38:31populate here. It's crazy if you think
5:38:33about it. And NAD, you know, they have
5:38:34an equivalent feature if you go down to
5:38:36web hook, but I find in general um it's
5:38:38just it's just a lot clunkier and it's a
5:38:40lot more annoying to use. The NA web
5:38:41hooks are substantially more annoying to
5:38:43deal with. If you do the wrong request
5:38:45type instead of a get or you do a post
5:38:47or something like that, they won't just
5:38:48tell you that you did the wrong request
5:38:49type. You'll just be stuck here waiting.
5:38:52uh there's a difference between test
5:38:53URLs and then production URLs which you
5:38:56know is important if you're like a
5:38:57computer programmer or something but the
5:38:58vast majority of nontechnical folks they
5:39:00won't remember to change um the test to
5:39:02the production likewise and then they
5:39:04ask for some sort of like off usually um
5:39:06by default so it's a lot more secure
5:39:07don't get me wrong but if you want to
5:39:09just get up and running with this stuff
5:39:10make is is definitely superior another
5:39:12issue is uh there's no built-in mail
5:39:14hook feature make basically coined the
5:39:16term mail hook like a lot of people
5:39:17expect this a mail hook is just like a
5:39:19web hook it's just instead of a web hook
5:39:20it's an email address. So if you send an
5:39:23email to this address, like if I go back
5:39:25here and if I were to just make an
5:39:27email, I could actually like have a flow
5:39:31set up that, you know, basically like
5:39:33does something every time you send an
5:39:34email to this address. Think of the uh
5:39:36possibilities and opportunities here.
5:39:38You could basically instantly, you know,
5:39:40create a system that you CC something
5:39:41and it does something else. It it it
5:39:43adds a record to ClickUp. or if you BCC
5:39:46or something like that, maybe it
5:39:47automatically starts following a user on
5:39:49a social media platform. Like the
5:39:51abilities here for mail integrations
5:39:52particularly are limitless. So if that's
5:39:54something that you're looking to do a
5:39:55lot of, you know, definitely look more
5:39:57towards make AI features. Uh I hope that
5:39:59this is self-explanatory, but um NAN
5:40:01wins hands down. Uh I know I covered the
5:40:03text classifier here, but the biggest
5:40:05module and probably the most popular one
5:40:08is the AI agent module here. As I
5:40:10mentioned, the really cool part of the
5:40:11AI agent, if I just exit out of this and
5:40:13kind of scroll down, is it even has this
5:40:15inherent chat feature, which is crazy,
5:40:17but uh there's nothing like this in
5:40:19make.com. Make's not even close. You
5:40:20basically have to rebuild the wheel
5:40:21every time you want to do something like
5:40:22this. So, uh you know, when a chat
5:40:24message is received, and you could even
5:40:26you could chat with the model right
5:40:27here. It will go and it will call a chat
5:40:30model of your choosing. So, open AI chat
5:40:32model. Going to select my
5:40:35credentials. Uh sure, let's do GPT4
5:40:38mini. Then it'll also talk to a uh
5:40:42memory store that you have which stores
5:40:45five or however many messages you want
5:40:47from your past conversation history. And
5:40:49then depending on that you can choose a
5:40:51tool that you want it to do which is
5:40:53pretty crazy. So uh I don't know this is
5:40:55the the simplest API in the whole wide
5:40:57world. Um I don't know if I'm actually
5:41:00going to do a tool usage. I'm trying to
5:41:01like find a very simple example. Maybe
5:41:03we'll we'll do the Gmail API and then
5:41:06we're just going to read through
5:41:10Um, let's not send. Let's
5:41:14get maybe get many. We're going to
5:41:17simplify
5:41:18them. And then now we're going to chat
5:41:20with our little AI agent. Hi, how's it
5:41:24going? Our AI agent is already here and
5:41:27ready to help you. What can you do for
5:41:30me? It can retrieve information, do
5:41:32email management, task assistance, and
5:41:34general advice. Like, that's pretty
5:41:35crazy. Could you retrieve the most
5:41:38recent email from
5:41:39info@leftclick.ai? We're just going to
5:41:40send it a message, ask it to retrieve
5:41:42the most recent email from info
5:41:44leftclick.ai. It's then going to call my
5:41:46little tool and it's going to take a
5:41:47while for that tool to obviously consume
5:41:49and do whatever it is that it needs to
5:41:52do. But then it goes through and it
5:41:54finds the tool in my email inbox just
5:41:56using natural language. And as you can
5:41:57see, I set that up in like 3 seconds,
5:41:59right? So it includes a snippet,
5:42:01includes all the data and all that
5:42:02stuff. Um, you can make this arbitrarily
5:42:04complicated. I added a single tool here.
5:42:06You could add 500. I mean, you probably
5:42:08shouldn't add 500, but what you can do
5:42:10is you can add five and then one of the
5:42:12other ones you can add is another AI
5:42:13agent which filters some other stuff.
5:42:14Essentially, what you're doing is you're
5:42:16you're making this big decision tree,
5:42:17which is pretty neat. And you can chain
5:42:19together however many of these things
5:42:20that you want. Um, it does start to
5:42:22break down after a certain point. And I
5:42:24won't say that it's like super business
5:42:26um capable at the moment, but it's very
5:42:27clear that this is going to be the
5:42:28future of the vast majority of
5:42:30businesses. They're just kind of a
5:42:31agents that route decisions and do
5:42:33queries. So yeah, not even close. Nad
5:42:36wins hands down. If you're looking to
5:42:38get more involved in AI agents and
5:42:39that's like kind of the the the next
5:42:41step you want to take, then NAN's the
5:42:43one for you. Sharing and collaborating
5:42:45functionality, Nad also wins on that
5:42:47front. Um, if I just go over here, uh,
5:42:50if I wanted to share this flow, which,
5:42:51you know, it's kind of two parts. So,
5:42:52let me just delete this Agent. Sorry
5:42:54buddy, you're not taking my job just
5:42:55yet. We click share over here. Sorry,
5:42:58not share. Well, we could we can
5:43:00collaborate with other people in our um
5:43:01workspace very easily with that button.
5:43:02But if we go over here and then we click
5:43:04um download uh you can basically um very
5:43:08quickly and easily download like a
5:43:10blueprint file or a JSON uh which is
5:43:12similar to um what make.com allows you
5:43:14to
5:43:15do. And what this data is is it's
5:43:18basically like a code representation of
5:43:19all of the modules in your flow along
5:43:21with all the connections and like the
5:43:22positions on the page and all the test
5:43:24data and stuff like that which is
5:43:26obviously pretty neat, right?
5:43:28The benefit to this though is if you
5:43:30think about it um there there's also the
5:43:32ability to import from a URL um which is
5:43:34kind of new. So you can actually import
5:43:36a workflow from a URL. You can remember
5:43:38how earlier we said that there were a
5:43:39bunch of templates. Well this is what's
5:43:41happening under the background. You can
5:43:42actually just click any one of these
5:43:43workflows and instantly just import it
5:43:46to your um a workspace. You can also
5:43:48copy the template to your clickboard and
5:43:50I can just paste this in and it'll
5:43:51literally just like paste in this huge
5:43:53Lego block like thing. And as you can
5:43:55see, you know, you can get arbitrarily
5:43:57big and complicated with this stuff. I
5:43:59mean, you know, this flow could be, I
5:44:01don't know, it could start here or go
5:44:02all the way down here. There could be 8
5:44:04million modules involved. Not that I
5:44:05recommend you build flows that have 8
5:44:06million modules, but I think you guys
5:44:07see what I'm saying, um, with this copy
5:44:09and paste stuff. Make.com's a lot more
5:44:11annoying, I find, with this. Um, you
5:44:13have to use this little import blueprint
5:44:15thing, and they have to choose a file on
5:44:17your computer. Um, there's nowhere near
5:44:18as big of a template library available.
5:44:20Like, there are templates, don't get me
5:44:21wrong. I just find that the templates
5:44:23are nowhere near as nuanced or as
5:44:24valuable and this is coming from
5:44:26somebody that like actually uses these
5:44:27to make real money. These are usually
5:44:28just one or two step flows and like yeah
5:44:30they're cool and stuff and that's nice
5:44:32but nowhere near as detailed as like the
5:44:34thriving developer open source community
5:44:35that NAN has unfortunately. So your
5:44:38ability to collaborate is definitely
5:44:39impacted. Hotkeys NAN definitely crushes
5:44:42it with hotkeys. Not just um uh like the
5:44:44the availability of the hotkeys but also
5:44:46the fact that they like teach you
5:44:47everything. If you mouse over stuff,
5:44:49it'll just tell you what hotkey you need
5:44:50to click in order to have it happen. So,
5:44:52top right hand corner here, I'm mousing
5:44:54over this plus button. It says, "Hey
5:44:55man, quit clicking this button. Next
5:44:57time, just press tab instead." Right?
5:44:58Variety of other examples of this, but
5:45:00yeah, they lend themselves to this
5:45:01little text interface quite a bit, which
5:45:03I like. And uh you know, there aren't
5:45:05very many hotkeys in make.com at all if
5:45:07I'm being honest, aside from just like
5:45:08the built-in ones in your browser. Like,
5:45:10you know, you can tab through fields for
5:45:12sure, but really like that's it. I could
5:45:14just tab through fields. Is there really
5:45:15nothing else? If I wanted to um copy
5:45:18something, the
5:45:19copy, paste, you know, cut. I mean, like
5:45:23these are all things that are obviously
5:45:24native to my um native to my computer,
5:45:27not really built into make.com. And I
5:45:29consider it such a shame because I think
5:45:30make.com could be so much more easy to
5:45:32use with some hotkeys, but they are
5:45:33really just targeting that total noob
5:45:35demographic, I would say. Um note-taking
5:45:37and documentation, naden wins for sure.
5:45:39Um if I wanted to document a flow in
5:45:41make.com for this, I would have to click
5:45:43on this notes feature. I'd have to right
5:45:45click on this, go add a note, and I'd
5:45:48say, you know, note about
5:45:50XYZ, then click exit out of this. I'
5:45:53right click this, add a note, note about
5:45:58ABC. Not only is this just not very
5:46:00intuitive, like the only way to see my
5:46:03notes is I have to physically go down
5:46:04here to notes and then give it a click
5:46:06and then and only then will I see it.
5:46:08Not only is this not very intuitive,
5:46:09it's just it's very limited with like
5:46:11what you can do. I mean, sure, you could
5:46:12make this really long if you wanted to,
5:46:14I guess, but I don't know. There's like
5:46:15no there's no formatting. You can only
5:46:17see it if you click on the button. You
5:46:19have this little arrow. I guess what I'm
5:46:21trying to say is NAD just does a much
5:46:22much better job on notes because
5:46:24remember that template that I just
5:46:25copied and pasted a moment ago. If I
5:46:26copy this again and go back here, like
5:46:29if I paste this puppy in, just look at
5:46:31the way that this is documented, right?
5:46:33You have a variety of different
5:46:34formatting um options natively accepts
5:46:36markdown, which is just a text
5:46:38formatting method. You can drag and drop
5:46:39these to be visible anywhere you want.
5:46:41There's so much information basically on
5:46:43everything that you can you can like
5:46:44document any flow that you possibly want
5:46:47uh for you or somebody else in your team
5:46:49for instance. So that makes it just a
5:46:51lot easier and clearer to use in
5:46:52general. Okay, let's do the financial
5:46:54comparisons and then at the end I'll
5:46:55talk about which platform I would use if
5:46:56I were in your shoes right now and I
5:46:58were kind of at the start line of my
5:46:59business versus if I were sort of
5:47:00halfway through. So financial comparison
5:47:03wise um now I think you know how each
5:47:05platform works realistically. Let's now
5:47:07turn to the major topic that is on most
5:47:09people's minds and is honestly the main
5:47:11reason why most people choose one
5:47:12platform or the other. Um, the
5:47:14financials involved. So, how much money
5:47:16could you realistically expect to spend
5:47:18on each platform if you wanted to? What
5:47:19I'm going to do next is I'm going to
5:47:20break costs down below so you guys can
5:47:22make the best decision for you. To keep
5:47:23things relatively equal across each of
5:47:25these, I'm going to be using a
5:47:26hypothetical example. We just need to
5:47:28run the system that I built 2,500 times
5:47:30per month or a little under 100 times
5:47:31per day. So, 2,500 times per month. I
5:47:34don't know, it's like 80 times a day or
5:47:36something like that. I'm assuming that,
5:47:38you know, you get 80 emails a day. That
5:47:39may seem a little crazy for you, but I
5:47:41guess if you think about it logically,
5:47:42if you're running like a big info ad
5:47:44email or hello ad or something, 80
5:47:46emails a day, while on the higher end of
5:47:47the number of emails you might receive,
5:47:49it's actually not that crazy to
5:47:50consider. So, we're going to start by
5:47:52doing a financial breakdown of NAN and
5:47:54then I'm going to do a financial
5:47:54breakdown of make.com as well. If I
5:47:56start with this N8N financial breakdown.
5:47:59Basically, the way that their pricing
5:48:00works is, and I I've clicked monthly on
5:48:02all of these. You can also buy annual
5:48:03plans, and I think the pricing is a
5:48:04little bit different, but not by that
5:48:06much. NAND is absolutely 100% free if
5:48:11you self-host it. I'm going to cover
5:48:12that in a second, but I just want to
5:48:14make sure that everybody here knows
5:48:14that's like one of the main draws of the
5:48:16the self-hosting feature. Now, I'm going
5:48:18to be comparing this on a cloud hosting
5:48:20to cloud hosting um basis just because
5:48:22doesn't really make sense to compare
5:48:23apples to oranges. Let's compare oranges
5:48:25to oranges to start. If you were to
5:48:27compare oranges to oranges and then go
5:48:28cloud um based hosting for both nand and
5:48:32make.com, here's what it looks like. Um
5:48:34you will pay $24 a month for 2,500
5:48:37workflow executions and five active
5:48:40workflows. What is a workflow execution?
5:48:44To be clear, a workflow execution is
5:48:48this. One run of this is a workflow
5:48:50execution. So that runs 80 times a day.
5:48:53you're consuming 80 workflow executions
5:48:55a day. You are allowed five active
5:48:56workflows. What is an active workflow?
5:48:58If we go back to personal here, I'm just
5:48:59going to save this flow and exit out and
5:49:01go back to the dashboard. Five would be
5:49:04five systems that are clicked to active.
5:49:07So 1 2 3 4 5. That is all you would be
5:49:10able to do for $24, which to be honest,
5:49:14pretty crappy. The fact that they limit
5:49:16the number of active workflows you have
5:49:17on the $24 month plan, that's kind of
5:49:19crappy. Um, so not very good there
5:49:21because I mean I can think of a dozen
5:49:23scenarios where well scenarios is a
5:49:25funny word. Uh, I can think of a dozen
5:49:27instances where you could have where you
5:49:30would need substantially more than five
5:49:31to do even like some of the more basic
5:49:32things um in a business. So I really
5:49:34don't like how they limit the number of
5:49:36active workflows. It's probably like the
5:49:37shittiest part of their pricing model to
5:49:39be honest. But obviously, you know, the
5:49:41self-hosting comes in handy and anytime
5:49:43you're over five, that's typically what
5:49:44people do. So, if we were to run a
5:49:46scenario 2,500 times, you know,
5:49:48obviously this would be under the $24 a
5:49:50month plan because we have one active
5:49:51workflow. That's how much it would cost.
5:49:53$24, I should say, per month. Now, let's
5:49:56chat really quickly about the
5:49:57self-hosting. If you self-host an N
5:49:59workflow, you don't pay them a dime.
5:50:00Your only costs are the server that you
5:50:02are going to be using to host your NA10
5:50:05open- source instance. That's it. So,
5:50:07most of the time in practice, a server
5:50:08costs like at the beginning and low end
5:50:10of the range might be 5 to 10 bucks a
5:50:11month. the higher end of the range, you
5:50:13might be spending like 30, 40, 50 bucks
5:50:14a month if you have like a pretty good
5:50:16server. If you want to spend like a
5:50:17couple hundred bucks a month or
5:50:18whatever, you'll have like the best
5:50:19server ever, but you probably don't
5:50:21really need to unless you're doing
5:50:22something mega enterprise. So, what that
5:50:24means is, you know, you can kind of get
5:50:26away with five bucks a month and
5:50:27theoretically on that five bucks a
5:50:28month, you could like probably scale to
5:50:30over 100,000 workflow executions. So,
5:50:32like that's 40 times what you're getting
5:50:34for €24 a month. You know, there are so
5:50:36many options like there's render, that's
5:50:38one uh service, digital ocean, easy
5:50:40panel. I mean I could throw out like 500
5:50:42here but yeah you can you can get you
5:50:44know servers and all these for like 5 to
5:50:4610 bucks a monthish and then you could
5:50:47run 100,000 uh workflow executions and
5:50:49since a workflow execution in nn is very
5:50:51different from an operation consumption
5:50:53in make like this is pretty huge right
5:50:56if the average make scenario has 10
5:50:59operations or 10 modules and it run it
5:51:01takes 10 operations every run like
5:51:03theoretically this is like a million
5:51:04operations a month for like five bucks a
5:51:06month so that's what's really attractive
5:51:07to a lot of people that do make.com uh
5:51:10and that's one of the reasons why a lot
5:51:11of people are switching over to
5:51:12NANN. Now, in terms of scaling, they're
5:51:15not captured in our example. Um, the key
5:51:16point in NN is how affordably it scales.
5:51:19Make.com doesn't really scale very
5:51:21affordably. A single scenario can
5:51:22consume many ops, usually between 5 to
5:51:2425, I want to say. Um, N8N will only
5:51:26ever count a single workflow on their
5:51:29cloud offering. Additionally, if you're
5:51:30doing self-hosted, you can run an
5:51:32infinite number of workflows for the
5:51:33same or slightly elevated cost per
5:51:35month, which is nothing. So, that's
5:51:37pretty cool. Obviously, um, NAN has, uh,
5:51:40quite a lot of big deck energy there. If
5:51:42you could just self-host your make thing
5:51:44and just never have to pay them, how
5:51:45great would that be, right? Moving on,
5:51:47let's do a make.com financial breakdown.
5:51:49So, as you see here, there are variety
5:51:50of plans on the monthly side of things.
5:51:52There's a free plan, there's a core
5:51:54plan, a pro plan, themes plan,
5:51:55enterprise plan. I should note that um,
5:51:57you technically don't have like a free
5:51:58plan here for the cloud hosting. It's
5:52:00just the self-hosting. So, technically
5:52:01like make.com is more accessible um, at
5:52:03the lower levels. You can get started
5:52:05for free, right? All right, you don't
5:52:06actually have to pay a dime, nor do you
5:52:07have to know any computer programming or
5:52:08anything. You can actually get up and
5:52:09running for $0. But generally, if you
5:52:12want to do anything meaningful in a
5:52:13business, you're going to need you're
5:52:14going to need core or up. Um, the good
5:52:15news is core starts at just $1059, so
5:52:1810,000 ops a month. Pretty simple. When
5:52:19I wrote this, I thought that our
5:52:20scenario would include five modules. I
5:52:22believe it only ended up including four,
5:52:24right? Yeah, it only ended up including
5:52:26four. So, um, this is actually even less
5:52:28than this. So the logic that I did here
5:52:30with five was I said, you know, if we
5:52:32run this 2,500 times a month, we have
5:52:34five modules which get executed. 5*
5:52:372,500 is
5:52:3812,500. 12,500 would be over the limit
5:52:41of most built-in $10,000 and ops a month
5:52:43plans like core for$1059 or pro for 1882
5:52:46or teams for uh 3412. So you'd have to
5:52:48upgrade. Um that would then cost $18.82
5:52:51per month on this plan on 20,000
5:52:52instead. Um, but you know, because we're
5:52:54doing this for just uh I don't know,
5:52:56four time. Technically, this fits under
5:52:58the core plan for $1059 a month, which
5:53:01makes a lot more cost- effective than
5:53:03NNN's cloud hosted offer for this
5:53:04example. Uh, this does make it less cost
5:53:07effective than their self-hosted offer
5:53:08still in most cases because you can
5:53:09usually get a server for less than this.
5:53:11Um, and that server would be able to run
5:53:12like 100 times this, right? Now, the
5:53:15issue with make.com, I would say pricing
5:53:17wise, is it just scales really fast. Um,
5:53:19most scenarios are going to include a
5:53:21ton more modules than our little example
5:53:22did with five or four I should say. And
5:53:25a lot of the time there'll be some sort
5:53:26of looping functionality where you might
5:53:28run the scenario once, but you have 50
5:53:30bundles. So 50 * 5 or four is instantly
5:53:33200. And if you run that like more than
5:53:35a few times a day, you basically are
5:53:36like using your entire month's operation
5:53:38budget with just one scenario. So that
5:53:40kind of sucks. Um, yeah, I'm not going
5:53:42to graph it for you guys, but
5:53:43essentially it's like more affordable at
5:53:46the beginning and then it like spikes
5:53:48way up. And what's interesting, um,
5:53:50depending on how long you guys have been
5:53:52in, you know, the no code business for
5:53:54is this is basically the comparison
5:53:55between Zapier and Make.com. Um, a few
5:53:58years ago, Zapier was kind of the one
5:53:59that was like, you know, scaled way the
5:54:00hell up. And if you were like a pro and
5:54:02you wanted to like get better at this
5:54:03stuff, you'd move over to make. But now
5:54:05that same determination is kind of being
5:54:06made between Make and and N. And it
5:54:09makes sense if you think about it
5:54:10because the market itself in no code is
5:54:12getting more sophisticated like I don't
5:54:14know five or 10 years ago. I mean how
5:54:15many people were out there developing no
5:54:17code stuff? Fewer, right? But over the
5:54:18course of the last 5 years like some of
5:54:20those people have become really good and
5:54:22the median ground of the market has
5:54:24become reasonably good. So if you're
5:54:25really good or reasonably good, it makes
5:54:27sense that you'd start going towards
5:54:28more developer friendly applications,
5:54:30right? That's just logical. Anyway,
5:54:32which one should you choose? Drum roll,
5:54:34please. This is probably what most
5:54:36people here were waiting for. Nick, what
5:54:38would you choose if uh you were in my
5:54:39shoes? Let me tell you, it depends. I'd
5:54:43pick uh I'd pick one or the other
5:54:45depending on circumstance. So, as I
5:54:47mentioned before, almost all no code
5:54:49platforms are capable of the same
5:54:50things. If you can do something in make,
5:54:52you can absolutely do it in NAD. It's
5:54:53not just a matter of is this possible?
5:54:55It's a matter of how many steps would be
5:54:57required in order for me to do this? How
5:54:58difficult would this be? Right? So, I I
5:55:00really want to like prove that to you
5:55:02guys that you can do anything in either
5:55:03one. And that's why I built that same
5:55:05system in both. and we had relatively
5:55:07different approaches for them. Now, a
5:55:09simple answer to the question is make is
5:55:10going to be easier for simpler things.
5:55:12Nad is going to be easier for more
5:55:14complex and operationally intensive,
5:55:15more expensive things. So, if you find
5:55:17yourself doing easier things more often
5:55:20and if you're not very technically
5:55:21competent, you know, it's easier for
5:55:23simple applications. Nad is going to be
5:55:25better for you if you're operationally
5:55:26intensive. Congratulations. You guys
Outro
5:55:28have now made it to the end of the NAND
5:55:29mastery course. You went from somebody
5:55:31that probably had no idea what NAN was
5:55:34or how to put together a workflow to
5:55:36somebody that is now comfortable and
5:55:37confident enough to do this sort of
5:55:39thing regularly while also understanding
5:55:40some of the finer nuances related to
5:55:42data related to some of the nodes that
5:55:44most people don't get stuff like the
5:55:46merge node the split node and then how
5:55:48to um coral those hundreds of NAD
5:55:50functions into something that actually
5:55:52works and hopefully makes money. After
5:55:54that we covered self-hosting. though you
5:55:56learned how to actually deploy a real
5:55:58live instance of nadent directly from
5:56:00the source code. Then finally we looked
5:56:01at nad not in isolation but as a
5:56:03comparison to make do one of the
5:56:06competing tools right now that a lot of
5:56:07people are also using. At this point you
5:56:09are no longer an NAND beginner. You are
5:56:11an NADN master. You have spent more time
5:56:13on this tool than most people ever would
5:56:15believe it or not in just a few hours.
5:56:16You guys can reference anything in this
5:56:18video using the bookmarks and using the
5:56:20chapter headings down below. So don't
5:56:23feel like now that you've gone through
5:56:24it, you can never brush up on any of
5:56:25these skills again. I've tried to make
5:56:27this as organized a resource as humanly
5:56:29possible. Now knowledge is not valuable
5:56:32in isolation. So now that you know all
5:56:34of this stuff intellectually, it's time
5:56:36to actually go out there and do
5:56:38something with it. And this is what I
5:56:39think the main gap is between people
5:56:41that understand AI and automation
5:56:43concepts as builders and then people
5:56:44that understand AI and automation
5:56:46concepts as strategic business people.
5:56:49Now, I'm obviously leaning more towards
5:56:50the latter. Everything that I teach is
5:56:52always in a business context, but to be
5:56:54honest, that's really where no code
5:56:56shines. It's not really great for hobby
5:56:58projects. It's more of a thing to
5:56:59actually drive actionable revenues. So,
5:57:01if you guys like what you've done so
5:57:02far, you guys see potential in potent
5:57:05and maybe wanted to start a business
5:57:06model doing something like this, then
5:57:09join my community, Maker School. It is
5:57:11the simplest, straightest line road map
5:57:13to go from a total beginner who has
5:57:14never sold any sort of AI automation in
5:57:16their life to an experienced business
5:57:19professional who runs a thriving AI and
5:57:21automation company. Inside you guys are
5:57:23going to find a 90day road map that
5:57:25takes you from a total automation agency
5:57:28beginner to somebody that has their
5:57:30first client guaranteed or your money
5:57:32back. daily accountability and
5:57:34step-by-step guidance where I will
5:57:36legitimately check in with you at least
5:57:38every 24 hours to make sure that you're
5:57:40on the right path. Copy and paste
5:57:43outreach and sales templates that are
5:57:45closing deals right now. A library of
5:57:47proven naden and make.com workflows and
5:57:50blueprints that you can copy and paste
5:57:52immediately. And coaching calls that I
5:57:55do live with thousands of people where I
5:57:57answer specific questions that you guys
5:57:59ask. Plus, you'll see me there every
5:58:01day. I respond to the bulk of community
5:58:03posts. I record customized videos for
5:58:05all of you. And I'm essentially just a
5:58:07pillar of that community. So, if you
5:58:09guys are serious about making money for
5:58:10yourselves rather than just watching
5:58:11videos on YouTube or a bunch of other
5:58:13people do that, then this is the sign.
5:58:15I'm giving you permission to go out
5:58:17there and try something new. We'd love
5:58:19to have you. And uh if you do end up
5:58:20joining, definitely say hi. Would love
5:58:22to help coach you through the first few
5:58:24steps of your AI and automation journey.
5:58:26Thank you for completing this course and
5:58:27I earnestly hope to see you inside a
5:58:28maker school and just on my YouTube more
5:58:31generally.