Free YouTube Transcribe

Video transcript

N8N FULL COURSE 6 HOURS (Build & Sell AI Automations + Agents)

Nick Saraev · 80,763 words · 368 min read

Want to search this transcript, jump the video from any line, or download it as TXT, SRT, or VTT?

Open in the transcript tool

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.

More from Nick Saraev

Recently added transcripts

Browse the whole transcript library

This transcript was generated from the captions YouTube publishes for this video. Get the transcript of any YouTube video atfreeyoutubetranscribe.com, free, unlimited, no sign-up.