Transcription
Hey everybody, today I'm going to show you how to build your very own LinkedIn Outreach system in n8n. This video is perfect for anybody that wants to automate their LinkedIn Outreach with a system that creates a targeted lead list in Apollo using just natural language, enriches those leads with detailed profile data, uses AI to generate personalized messages, sends connection requests and follow-up safely, and tracks the entire campaign within a Google Sheet.
My name is Nick. I've made over a million dollars with AI and automation, so today I'm going to walk you through building this entire system step by step. Let's get into it.
Okay, so here's a demo of the system from start to finish. We start with a form that I fill out, which I'll show you in a second. That form basically asks for us to define the search parameters in natural language. So, I am going to get to say, "I'm looking for creative agencies between one and a thousand people that are in the United States," and it will actually create an Apollo search URL for me completely autonomously.
We're then going to generate a search URL here, then run an Apify actor. Um, I'm setting a limit node here. For those of you that don't know, a limit node is just sort of a testing node. It allows me to set a lower limit so I don't overwhelm an API. We're then doing a personalization step right over here. Um, then I'm adding this to a Google Sheet database. You can find this Google Sheet database, um, right over here. This Google Sheet database is very simple. We're just logging the ID of the LinkedIn account, the first name, the last name, the full name, sometimes I like to have that LinkedIn URL, the title, the email status, the photo URL, and then the icebreaker.
Then finally, we are aggregating all of that data so that I could send an API call to a tool called Phantom Buster. And I'm going to cover all this stuff in a second, but for now, let me just show you guys what this looks like in practice and what the end result is.
I'm going to test workflow. It's going to ask me to define my audience type in plain English. So, I'm going to say, um, "I'm looking for creative agencies around one to, let's say, 100 people, staff across the United States. I want the decision-makers." So, come up with a bunch. Then I'm going to click submit.
Now that I've done this, what's happening is it's going through and it's generating a search URL. Now, the way that this works is the service that I'm using basically takes as input a giant search string. And so, I'm having AI generate the search string. The search string is ultimately what is going to allow us to do said search that looks just like this. I'm going to copy this over. If I paste this in, um, what this will do is it'll actually go through and then get decision-makers that are within my custom audience in my case, 996 people across the United States.
If we proceed with this, it will then, um, run, uh, what's called an Apify actor. It's a service that we're going to be using to scrape this group of people. That Apify actor, I can find back over here. What this is doing is it's going and it's identifying who these people are. It's extracting their email addresses completely autonomously, and then it's also getting me a bunch of additional data on them.
Okay, after we're done with that, we then pass through a limit node. We have an AI model here, GPT-4, that actually goes and creates customized icebreakers for the connection requests. And then what we do is we'll actually dump that into a Google Sheet before aggregating that and then triggering a Phantom Buster. And Phantom Buster is the tool that we're going to be using to grab the data from this Google Sheet right over here, then actually physically produce our LinkedIn connection request over here.
Okay, and what that looks like on, um, their end is we are now running this Phantom Buster Auto Icebreaker Connect, and it's actually going through and it's simulating real human activity in order to send the message, essentially, and the connection request. Finally, as this proceeds down the list, we will have the actual data right over here alongside the specific status, whether or not this has been sent. Um, and so we have actually gone through and we've sent a bunch of connection requests at various times of the day to these various people using the system, and it was all done 100% automatically.
So, I want to make something super clear. As of this moment, I have not actually built the system yet. I wanted to show you guys what a live, real build process looks like from start to finish by somebody that actually does this for, uh, for a living on a daily basis. I think right now on YouTube, it's really fancy and popular to like put a finished product in front of people and be like, "Here's a system, here's how to put it together." But people don't actually show what, like, the live development process looks like in reality. The live development process is filled with a lot of detours, a lot of ups and downs, a lot of, um, guesses that, you know, don't actually end up panning out. And, you know, I want to show people how to actually build systems that make people money. I don't just want to show people, like, a finished, kind of sanitized version of it. Um, so that's why you guys are going to see me do it all from scratch, and that's why, you know, I'm structuring this video in this way. It's very important to me not just to, like, show somebody a picture of the Eiffel Tower and then be like, "Hey, now that you've seen the picture, you know how to build it, right?" It's like, no, I actually want to, I want to show people the building process. I want to show people the schematics and the diagrams, if that makes sense, because for the most part, that's my audience. So, yeah, uh, this is the roadmap. At this point in time, basically, what I'm thinking I'm going to do is I'm going to start by scraping Apollo leads using Apify. Then I'm going to enrich leads with personalizations, and I'm going to send a Phantom Buster for LinkedIn DMs.
Now, if you don't know what any of these platforms mean, I'll explain them to you right now. Apollo is basically a big database that allows us to get a bunch of information based off search filters like dentists in the United States with one to 50 staff members, okay? The issue with Apollo is it's a very expensive database, and so instead of me just getting leads directly from Apollo, what I'm going to do is I'm going to use this tool called Apify. It's kind of a scraper which allows us to plug in an Apollo URL, and then it goes in, it actually like scrapes the HTML of the page to find us the leads, okay? So this is kind of a hack, but this is basically what everybody's doing right now to scrape, um, scrape Apollo. And the reason why, you know, everybody's saying that that's okay is because Apollo is just scraping LinkedIn Sales Navigator. So it's kind of like, you know, scraping the thing that scrapes the place that scrapes, you know, um, anyway. So this is our scraper. I'll show, I'll show you all these platforms in a second.
Then OpenAI is obviously like our AI tool. And the reason why we're using an AI tool here is because, um, we need to personalize the messages that we're going to be sending to people. You know, after we find the people, we're also going to get a bunch of information about them. We're going to figure out where they live, we're going to figure out their interests, we're going to figure out their job titles and stuff. Well, if you actually just feed all that stuff into, um, AI, you can have AI write something that seems pretty customized. Like, it's not like, "Hello, dear person, I would like to sell you stuff." It's like, "Hey Peter, you know, saw that you went to, I don't know, like the U of A. That's super cool. I love that you did X, Y, and Z. And this may be totally out of left field, but I thought we should connect." Something like that, right? It's obviously, I'm going to write it way better, um, but just to give you guys like a, give you guys some insight into that process, that's basically what everybody is doing right now in any sort of cold outreach, anyway.
After we have the personalization and all the lead data and the LinkedIn profile URL, and basically after we've done these first three steps, okay, what we need to do is we need to send the outreach. And so I'm going to be using a tool called Phantom Buster to do that. And finally, we need to do it, you know, on LinkedIn. So I threw in LinkedIn over here, but let me make this clear. Uh, this is a very short moment of time in which you use all of these tools together in the way that I'm about to show you. So, you know, because we have access and availability to these tools, we can do the really cool thing that I'm that I'm about to do. Um, if these tools didn't exist, you could still do it, it'd just be like way harder and it'd be a lot more difficult. So I prefer to use pre-made tools wherever possible just to expedite my workflow. That's sort of like my guiding principle here as somebody that does automation, okay?
All right, so Apollo kind of looks like this. As you can see, it's literally just a database on the left-hand side of people, okay? So hypothetically, let's say I want creative agencies, I'm just going to type in "creative agency" as a keyword. This is not the most effective way to do this, by the way, but I just wanted to show you guys what it looks like. And then, um, under job titles, maybe I'll go owner, CEO, I'll go founder, I'll go partner. So I'm just typing in, like, titles of the people that I'm looking for, right? Um, okay, anyway, I'm just going to leave it at that, and what do I end up with? I end up with 844 creative agencies in, I think I put United States here somewhere, maybe I didn't. Oh, yeah, location: United States. Cool. So that's all Apollo releases for. I mean, I could go into more detail about it, I'm not going to, just for the purposes of this, but essentially we can, we can generate a list of people, okay?
And so once I have this list of people, the question becomes, all right, like, how do I actually extract something meaningful from this? How do I actually, like, get, I don't know, an email address? How do I get, like, a LinkedIn profile URL? How do I actually, you know, get their phone number or whatever? So normally, you know, I would export this in Apollo, but it costs a ton of money. And so instead, what we're doing is we're going on a tool called Apify, which is basically a big library of scrapers that people have put together, and we're going to find a tool that allows us to scrape all these. So I'm just going to run a proof of concept first before I even build automated systems, and I'm just going to run through this whole thing manually. Um, so let's do it. Let's do Apollo. Pump that in there, and I'm just going to use this one here. I think I've used this one many times before, so I just want to verify that I have access to it. Yes, I do. Okay. All right, so I'm just going to paste this search URL in here. This is just how the tool works. It costs $1.20 per a thousand leads. So if we want to scrape a thousand leads, it costs you $20. I should note that you can only do a few, like 100 or 150 LinkedIn connection requests totally cold per week per account. So like, you can think of this as basically $120 will give you enough money to run this LinkedIn campaign for a whole month, um, at least in terms of leads. You obviously still need to pay for the rest of the software platforms, but anyway, uh, here we pump in some search records. So 500 search records, get work emails, get personal emails, find whatever. I'm going to click save and start, and let's just see what happens.
Okay, we're running this manually. We're not doing any sort of API yet. I will, I will put the system together in n8n after. But, okay, cool. So as we see, it's saying it's found 100 results. That's cool. Now it's getting some more. If I go to this output tab, you can see the actual results. Pretty neat, huh? We're getting all these people's data, and oh man, are there a ton of fields? Right, there are a lot of fields. I'm not going to go into detail on all the fields, but I'll just show you that, you know, you can just, you can just run these searches, basically free, which is pretty cool. And yeah, we just live in a, we live in a pretty specific point in time where you can actually do that.
Okay, anyway, I'm just going to manually export this, and I'm going to do it as a CSV. Why? Because I just want to visualize this in Google Sheets. And now I'm thinking, okay, like, once I visualize it, I can actually go through and I can use AI to do some stuff. So this is my thought process, just trying to narrate it live so we see what's going on. I've built out many similar systems like this, so obviously because I built similar systems like this, I kind of, I kind of have a feel for like where things are going, but, uh, I'm just going to import now, and then I'm going to go to upload, and then drag and drop this file that I just exported. And I, the reason why is I just want to visualize it, and I'm going to go append to current sheet. That's just going to allow me to, you know, I just change the title, I don't want to have to redo it all.
Okay, cool. So I'm going to hide these so I don't expose every single person's email address, but, as we see here, we now have a big list with city, country, departments, department email, domain, email status, employment, employment, you know, creative agencies, obviously all of these companies have the term "creative agency" in their title, which is great because I'm looking for creative agencies in this hypothetical, founder and CEO, right? And we got a ton of other ones too. I think, um, Apollo just exports all of the fields about their job history, which is why it's so long. So people have had like 10 jobs, it'll actually like export all of them. Good God. Okay, but the one we really, the one we really want is we want LinkedIn URL, which is this one right here. And as we see, we don't get the LinkedIn URL for everybody. But how long is this list? This is 101. Okay, it's 101. I'm just going to scroll up and then select all these. Looks like we got 66. I guess we're counting that one too, so 60. I think it's like 66 out of 100, so we get about 66% of these as LinkedIn profiles, which is great. Um, you know, if I go down to email, I bet you we probably get a ton of emails as well. You always got to check the source data, which is why I'm doing what I'm doing. We got 77, so we actually got more email addresses than we did LinkedIn profiles. That's really interesting. But anyway, whatever.
So I'm sure you guys can imagine, any sort of outreach campaign that you guys run, you guys could send emails and do LinkedIn DMs, right? And that's kind of like the golden, um, the golden egg, the golden goose that's kind of like the golden goose egg. You know, if you hit a person on more than one platform, then that's obviously ideal. Um, today I'm just going to be building a LinkedIn system that does that outreach, but I want you guys to know that I've built the Omni Channel, supposedly that's what they're called, Omni Channel scrapers and systems and stuff like that, a ton of times. Um, it's, it's no major issues at all. And, um, if there's demand for it, then I could show you guys how you, like, kind of combine these two. But, okay, so now we have a lot of stuff, right? We have profile fields, we, we, we have everything. It's great. Um, so the question is, where do we go from here?
Well, what I want to do now, if we go back to our little roadmap, is now that I've verified we can actually scrape Apollo leads using Apify manually, this little blue checkmark is going to mean manually, the green one will be after I'm done, it'll be automatic. We need to enrich the leads with personalization. Okay, what is personalization? Well, we basically need to write, like, a really small little snippet that we could stick at the very top of our LinkedIn, okay? So that when somebody gets a connection request, you know, it's, it's just going to be a short little message that says, like, "Hey Peter, how's it going? Love your stuff and really want to connect with you." Okay? And that's what we're looking for. We're looking for something over here. "Hello, Fem Bernard and Anna, hopefully you guys appreciate the views." Um, so actually, can I just, going to show a little bit more here so I could see if I get an example? You see this from this lovely dude, and now who I think is in my, yeah, he's in Maker School. Um, I think I recognize him. He said, "Hey Nick, I just joined your community of school. I'm excited to start this journey." Okay, okay.
So we, we basically want to personalize this just like Anel did. Although obviously, you're not going to be able to say that you joined my community. But by doing this, there'll be a much higher conversion rate on the back end. People are going to be a lot more likely to actually click the accept button if they see a message like, you know, a lot of these other guys have joined my communities and stuff like that, and that's fine. But, like, you know, how much more likely am I to accept an Anel because I see that he's written me that message, right? A ton. That's the same logic we're going to be using.
All right, all right. So, uh, where are we? So we just need to determine that we can personalize this. But, um, I know that LinkedIn has specific limits around how long we can do this. So, LinkedIn connection requests character limit. I'm just going to Google this really quickly, and it looks like we have a character limit of about 300 characters. That's actually pretty, that's pretty small, eh? So, okay, so 300 characters to words. Let's see how long that is in words. It's between 42 and 75, so it's probably about 50 words or so. So we actually got to make sure that our personalization snippet is super, super short, okay?
Um, anyway, let me go to GPT-4 here, and let me just define a little prompt. "You are a helpful, intelligent writing assistant. I'll say your task is to take as input." You guys might not be able to see all of this here just because I have my, my face sort of covering it. I wonder if I can make this smaller. No, I can't. Anyway, trust me when I say this is going to be the most banger prompt of all time. Your task is to take as input a, a bunch of LinkedIn profile information of a user and then generate a very short, very punchy icebreaker that I can use as a variable in the introduction in my connection request. So I'm just asking it to do stuff like I'd ask a staff member to be honest. AI is at that point now where it's intelligent enough to basically fully understand the context. Uh, if you go back to my previous videos from like a year ago, things have changed a lot. But now you can just ask like you would ask for any from anybody. So, return results in this format. I'm going to have it return it in JSON, JavaScript Object Notation. I know this may seem complicated to some people, but, um, this just, uh, allows me to automate it later, and I just want to verify I can do this. So return, um, your results in this format. Let's say, "Icebreaker: Icebreaker goes here."
"In order to ensure icebreakers are punchy and high quality, make them follow this template: Hey X, hey name, love seeing thing about them. I'm also into other thing. Plausible tie-in. Thought I connect."
Okay, so now I'm just going to see the length of this. I'm going to go to a website called Word Counter. So this one's 12 words, right? That's easy. And I think it's actually going to be even better because if I just scroll down here, you see how, yeah, you see how this message is like, basically also about 12 words or so. So this is going to appear right before the "See More" badge. I think it's going to be great. This is going to be super, super valuable. So, um, yeah, that's what I'm going to do. Um, so I'm going to, I'm going to add this in, and then I'm going to say, "LinkedIn fields," and I'm actually going to give it like an example of the data that I wanted to personalize based off of, and then I'm going to see how it performs. And then assuming all the stuff is good, then I'm just going to pump it into n8n like one shot, and it's going to be perfect. And by the way, um, this kind of, this is a good opportunity for me to talk a little bit about why I'm doing all this stuff like manually as opposed to going into n8n. And the reason why is because, um, I'm sure I could make it look really sexy and clean if I just did it all on n8n, but I don't normally actually build systems like this. I will start by just doing it manually at least once and just verifying that it kind of looks the way that I think it's going to look and works the way that I want it to look, works the way I want it to work. And then assuming that it does, then I pump it into n8n and then, you know, actually work through the, the automation bits. Because the way I see it, there's the use case and then there's the automation of the use case. Okay? So that might provide a little bit more context, and hopefully that, uh, makes things clear.
But okay, so we just need to feed in a bunch of fields here that'd be relevant. So what are we going to do? Obviously, we're going to need the name, right? So I'm just going to grab Danielle, who is row number four, just go Morgan here, then I'm just going to dump it all in in plain text. Okay, let's just go Fort Lauderdale, like this. Um, that's probably pretty relevant. DM creative agency, it's probably pretty relevant. Founder and CEO, so maybe I'll go founder and CEO at DM Creative Agency. Cool. What else is like interesting and unique about her employment history? Um, I guess I could include it, but let me just see if there's anything else that might be a little bit better than employment history. I'm just going to drag this all the way to the right. Florida. H. Okay, so I mean, really, I don't have too much information here. I really only have like the company name, though it looks like a bunch of interests about the, or sorry, keywords about the organization. I might be able to feed that in there. Um, okay, well, I think in that case, like, I'm going to have to feed in some of the past employment history, right? That makes sense. And that way my, um, you know, my outreach can talk about like, you know, it's, I like that you went from doing like sales at whatever to being a founder of your own company. That must be interesting, or I did something similar, or whatever, right? Like that's basically the vibe I want to go for. Previous experience. And then I'm just going to say Outlast Eyewear. And then sorry, I, I'm jumping around a lot here, but then I will say Account Director at, man, I cannot get these all tabs right, at Red NY. Okay. And then I'm going to have it generate me the breaker.
"Hey Danielle, love seeing your journey from Regional Sales Director to founder. I'm also in a creative leadership. Thought I connect."
That's that's okay. That's okay. I don't really like the usage of the keywords here, "Regional Sales Director." I want, um, I don't want to use the variables exactly because I want to imply that I've actually like read through it. So either I will lowercase them or I'm going to paraphrase them. Okay, make sure to follow this template. So what I'm going to do here is I'm just going to zoom out a bit. I'm going to go over here and edit the prompt for "thing about them" and "plausible tie-in." Never use the exact variable, never use the exact information provided in a LinkedIn field. Instead, always paraphrase. This makes it seem human-written instead of just an AI or an automated message. Let's do that. Okay, I'm going to delete this and we'll just run it one more time. Okay, and I'm also going to provide a little bit more context now because I don't like the result. What we had is, "Hey Danielle, I love seeing your entrepreneurial journey with DM Creative Agency. I'm also passionate about turning vision." It's funny, DM Creative Agency, I guess it's your name, but like, I'm, I'm about to DM the hell out of this person. "I'm also passionate about turning vision into reality. Thought I connect." That seems kind of weird. I don't like that.
So what I'm going to do is I'm just going to like make it super incredibly punchy. Also make it super short. Don't say stuff like "or anything like that." Be extremely laconic, laconic and Spartan. Let's try that one more time. Well, let's try that a couple more times so we figure it out. Cool. Yeah, this, this looks pretty good, right? "Spotting your creative agency journey. I'm also into entrepreneurial ventures. Thought I connect." I mean, you know, it's not like the best in the whole wide world, but that's much better than before. "Diving into brand innovation. Thought I'd connect." Cool. That's pretty good. Let's run this again. "Startup life. That's great. See that's a pretty good icebreaker. Building brands. Thought I'd connect." Cool. That seems pretty reasonable. All right, cool. So I think like four out of the five so far have been all right. "Fascinated by startups." All right, I think like four out of the five are pretty good. So I'm just going to leave it at that. That seems to me like a pretty good prompt, which means like my next kind of major task in this system is done, right?
The last thing I'm going to do is I'm going to send this to Phantom Buster for LinkedIn DMs. Now, this is this is kind of interesting, a little bit more nuance, but basically what we have to do now is we have to take all of this data and we have to like send it to the platform that we're going to be using to actually like trigger the outreach. Now, that platform is called Phantom Buster. The way the Phantom Buster works is you basically pay for, um, some execution time. Just a fancy way of saying that you're paying for, like, the amount of time it takes for the servers to run. I'm going to go over here to this, um, specific one that I've put together called LinkedIn Auto Connect. And when I build out the whole n8n system in a second, I'll, um, you know, I'll rename it and I'll make it nice and sexy. But basically, the way that it works is I go to setup, and then what I have to do is I have to define a Google Sheet. And I'll actually have it go down my Google Sheet, okay? So I'm going to do that, and then I'm just going to add a column here called "Icebreaker." Okay? Then I'm just going to make this like one, one person. It's just going to be this person that I was just doing the testing on, which I think was here, right? So I'm going to delete these two, and I'm actually just going to delete all the rest of these as well, because I just wanted to pull literally one record. Okay? So that's cool. I know I have a ton of redundant fields and whatever, but that's fine. Um, and then under "Icebreaker," what I'm going to do is I'm just going to feed in this, um, the data that it just generated for me. I'm going to paste that in here, and then voila.
Okay, great. So now we have an icebreaker. Now, the reason why I'm doing this is because I can now grab this Google Sheet and I can feed it in here, okay? And now I can actually run this using just, feed that in, I can actually run, like, I can actually go and I can do, um, some LinkedIn outreach. Basically, the way that Phantom Buster works is you will connect your LinkedIn account using a, um, little Phantom Buster Chrome extension, which they will ask you to download when you actually get up and running with the service. Um, and then from there, you know, I'll just click save. And then here is the message that I will write. Now, I'm just going to write, um, they allow you to write a bunch of things. I mean, you could say, "Hey, first name," right? Then it'll pull the first name variable. But, you know, I've actually just had AI write me a whole thing, right? So I'm just going to use that whole thing, which is called "Icebreaker." Okay?
All right, so now I'm going to click save. Uh, I'm not going to do anything for email discovery. I don't care about that. They just try and upsell you on stuff. Invitations to send per launch: maximum 10 per launch. Then save. Then launch manually whenever I click on it. And now I'm, you know, again, I'm starting at the end. Just want to make sure I can actually do the thing that I'm asking for. So I'm going to click the start button. And once we've verified that we can worry about, um, you know, running it completely automatically.
So what are we seeing? We're seeing that I am indeed connecting to the LinkedIn. I'm connected as Nick. I'm going through the whole rigmarole here, signing up, opening, sending the DM and stuff like that. It's going to take a while because it wants to, um, basically like simulate real profile activity. It doesn't want to think, it doesn't want to make LinkedIn think that I'm like a, like a bot or whatever. So it's going to take, I think, like a minute or two per profile. Okay. And as we can see, it just updated to one invitation already sent. Still pending. That means that the invitation is actually gone out. Um, so we are now 100% good to go. We've verified that all of this system, or all of what I wanted to do with this system, works. Now I'm actually going to go through and I'm going to build it live in n8n. How fun and exciting is that? Never forget this step when you're actually building out systems. Make sure you can do the thing manually before you do it automatically, otherwise you're putting the cart before the horse. I've seen a ton of people do this and just really waste all their time with it.
So I have an n8n canvas here called "LinkedIn Connection Request System." If you think about it, what do we have to do? Okay, we have to start this system by scraping Apollo leads using Apify. Okay? Um, one thing that I think is really fun that I think I'm going to do today, just for kicks and giggles, is this URL here. This actually includes all the information of the, of the search, right? So what I think I'm going to do is I'm actually just going to AI generate this URL for me. Like, that'd be pretty sweet, right? I'm seeing owner, person titles equals CEO, person titles equals founder. I'm just going to go, "What can you tell me about this URL?" Feed this whole thing in here, and let's see if we can just extract all the data. Yeah, so our located in the US, owner, CEO, founder, partner, creative agency. Cool, cool. So I mean, like, I'm just going to have AI do this. I mean, how cool would it be if you could just say, "Hey, I want you to find me a list of all the creative agency owners in Texas and California or something?" That'd be sweet, right? And then we just like have it done for us. Hell yeah.
So I'm going to go over here and I'm actually going to start it with an n8n form input. Okay, and that's how this is going to work. When a new n8n form input is done, let's call this "Lead Finder." LinkedIn Lead Outreach Trigger. Insert an audience for your LinkedIn lead outreach. Let's say "LinkedIn Outreach Campaign" here. Then here, I'm just going to do like a text area and I'm going to say, "Describe your audience in plain English." I'll make it required. And then what I want is a placeholder. Audience type, uh, I don't know, company, let's do like company type, location, etc. That should be good. Okay, let's test this step now. And I'll say, "I want all creative agencies in the United States with company sizes between 1 to 1,000." That's what I want. Okay, I'll click submit.
And now that I have this, I'm actually going to feed this into AI, just right off the bat. So go OpenAI. We'll go "Message an Assistant." Credential: Li us is February 4th, YouTube. From the list, uh, I think I'll just use, oh, sorry, I think I'm messaging an assistant. I don't actually want to do that. I just want to do text. My bad. So "Message a Model." I think what I'm going to do here is I'll just do GPT-4.5. I just want to see how, like, smart it is. Um, "You're a helpful, intelligent sales assistant." So I'm defining a system prompt. Start. That's where I tell the model what I think it is, identifying as, what I like it to identify as. Then underneath I'm going to say, "Your task is to take as input a, a natural language description of, um, of a prospect audience. Turn that into an Apollo search URL. Here's an example of an Apollo search URL." Okay? And then I'm going to go back to this and I'll say, "This URL describes a search for people that are, let's do located." So I'm just telling it now that, um, this is an example of formatting. Basically, you can change those fields and only those fields. Return your response in JSON using this format. Let's do "Apollo," let's just call it "Search URL." Then I'll go, "Search URL goes here." Nice. Then down at the very bottom, this output content is JSON. I'm not going to add another message. And let's just pin this now and add end so we can do some testing with it. Go right over here and let's see what it pops up when I, when I paste this in, and let's see if this is a valid Apollo search URL. I mean, you know, it's kind of like the first thing that you got to figure out, right?
I paste this into Apollo. Yeah, this has, wow. Oh, this even broke down, like, the search size. That's very cool. Um, United States. I'm not seeing any keywords though. That's an issue. So I think, like, the way that I, I always do these searches with a keyword like "creative agency." I think there's something broken here. Just want to make sure. If I delete all these, yeah, we're still not getting. Hide filters, show filters. Okay, so there's some, some broken about the way that I did this list a moment ago. So let me just do this one more time. Um, let's do this. Let's just define my search a little bit more over here because I want to give it more examples. We'll go one to 200, and then we're going to go "creative agency," and I'm going to tell it it can only, these are the fields you can change. Um, and I'm going to say "organization locations," "keywords," "associated keywords." Sorry, one sec. "Keywords" and "person titles." Cool. Do not add or change any other fields. Return your. Okay, let's test this now and let's see if that maybe is a valid search. Uh, no, no, no. Do I not add or change any other fields? Use the above template. Well, actually, maybe this is good. Let me try. All right, yeah, that did work. Location, number of employees seem a little bit off though. Oh, yeah, sorry. I think I need to add number of employees here. Um, one more. Let's go back to where it says "number of employees" up at the top. So "organization num employees ranges." There we go. That was the secret sauce. "Person titles" and "organization num employees ranges." Let's just go back to my search. Just copy this in here. I'll paste that in too. Okay, now I'm going to run a test, and I think I should be able to get most of what the information is that I want. Um, if I just copy this now and paste this in. Okay, this search correctly had the 1 to 1000, correctly had the United States, correctly had the term "creative agency." Looks good to me, man. Cool.
So we now have a system that can basically, you just put in a search term for what you want, it'll come out with an Apollo search URL. That's sick. Okay, so now what do we have to do? Um, we have to scrape the leads using Apify. So two components to this, right? The first is we need to, well, we need to call an Apify actor. So we basically need to replicate what I just did over here with an Apify, but we need to do it in n8n. So how are we going to do that? Well, Apify has an API, so I should be able to run this using an API. So if I want to trigger a run, um, I'm going to have to view the API reference first. How do we get a run? "Run actor." "Run actor synchronously with input and return output." Okay, this looks to me like basically what I want. Cool thing about n8n is it allows me to just create a, a request using an HTTP call. So, sorry, a curl call. So that's what I'm going to do. Is see it says curl over here? I'm just going to copy this whole thing, but actually before I do that, I'm actually going to put in the data. So I need an HTT, um, I need a key. It looks like, like an API key. So I'm going to need to put that in there. Then I'm going to need an actor. Okay, so see this is where I'm going to put an actor in. So I'm going to go back here and you see where it says "actors" and then "JJ" whatever. This is the actor ID. Um, you'll always find the actor ID up at the top, between the term "actors" and then "input" on Apify. There's probably another way that I could get this as well, but that's just kind of the hack that I use. So I'm going to go, sorry, I'm going to go back over here and now what I'm going to do is under "parameters," I'm going to feed in the actor ID. Okay? And the bearer token. I basically need an API key. So I don't know where I get my API key on Apify. I've already forgotten. I'll probably get it in settings, API and Integrations. Yeah, okay. So I'm going to create a new token. I'll call this "YouTube" and create. I now have a new token. So I'm going to copy this and I'm going to go back to the API specification, which was just docs.apify.com. Then I'm going to paste in the bearer token. Okay, that looks pretty good. It looks like I need a body. Okay, it's this example from schema or example. So I don't really know what that means. Just "body required as an object." So what is this supposed to mean? Just looking for the term "body" here now. Well, it's telling me that it's required, so I'm just going to give this a try and see what happens. I guess. Let me just, yeah, let me just copy over all the curl. Go back here and go to HTTP request. Import curl. Paste this in. It should now map this. So maps it to the specific actor. That's cool. Um, I don't actually have my token in here, so apologies, I kind of wasted our time. I'm just going to copy this now and feed it directly in. So this is where the API key token would go. Go authorization, and then there's this format like "Bearer token" format, which is what most, um, services use. So just make sure the bearer starts with a B, capital, and then there's a space in there, and there's your actual token. Okay, so we need to do a POST request. Good. JSON body parameters are "foo" and "bar." I don't really know. We're going to feed in the body, to be honest. I don't really know about this "follow redirect" thing either, so I'm just going to take that out. I think what we need to, we need some query parameters, right? I think maybe we don't. I don't know. Anyway, in situations like this, where I don't know what I do is I just run it and I see what happens, and then sometimes it'll tell me what the issue is. So "input.url" is required. Okay, so we need in the body probably, we need "input." I'm just going to do this in JSON. I'm going to go "input" and then I'm going to go "url." Okay, so then I'm going to go over to my Sales Navigator search URL, which is right over here. Uh, nope, that kind of stuck at the very bottom. Just take that back in. Paste this in here. Okay, so that should now have the URL field input. Now it's still saying that it's required, so there's probably something that I'm, um, persistently messing up here with the format. So let me go back to my actor run. Okay, go back here and then, sorry, where it says JSON, let me just get all this. Okay, this, this might be all I need. I don't know for sure. We're going to give it a try though. We're going to test this. Yeah, so that is, so the JSON here is just the input because, you know, it's executing, it's taking time. Now, so now I don't actually know if it's running, right? So I'm just going to exit out of this stuff. I'm going to go to runs. Okay, cool. So it is running. So now verify that I've, I've just triggered it inside of Apify, uh, inside of n8n, and now it's running in Apify. Fantastic.
So basically, what I need to do is, you see this big URL here? Well, we don't need that. What we need is we need this, right? I'm going to feed this in. And "total records." I mean, you know, you can put however many you want. I'm just going to do a thousand. If you leave that blank, I think you get all of them. "Personal emails," "work emails." I think this just means it takes a little bit longer. Then, while this is working, let me just do some renaming. So I'll say "Run Apify Actor and Get Results." A little bit longer than usual. Uh, I think I might have just broken this. Yeah, I think I just broke this by renaming it. Okay, maybe you don't rename this live. That might be bad. Anyway, um, I'm then going to call this "Personalize," not "Personalize," I'm going to "Generate Search URL." Okay, I'm going to save this whole thing. I'm obviously going to have to rerun this now because I've just broken my whole thing. Kind of unfortunate, but it is what it is. Um, let's just test the step again, and I'm just going to pin the output next time. So let's just make sure this works. Feed that in again. Yeah, persistently working, which is nice. Can pin this now. Let's feed that in right over here. Test this again. So my memory limit may be an issue. We'll see. It's executing. So yeah, we're running a separate, we're running a separate query. I'm going to abort the first one. I'm not going to give it 30 seconds. I don't care. I'm aborting you. Um, cool. And now we just have to wait until this finishes, basically until we get all the results, and then when we get the results, it should populate on the right-hand side of this.
Okay, looks like this did output, but it returned something empty. Looks like the reason why is I probably used the wrong, um, actor. I used "Run actor synchronously and return output." I didn't do "Run actor synchronously with input and get data set."
items. That's the one that you want. So, woe is me. Um, but I'll basically have to rerun that puppy, is what it is. Um, I have the actor ID hardcoded here. So, I'm just going to paste this in my URL bar. Copy this over here, paste this in here, and go back that way. And then, just for records, I got to do 500 cuz I just waited like 5 minutes to do 1,000, and I don't really want to wait that long. So, let's test this again. I'm seeing that it is indeed executing. Going back over here to runs, and you know, we are, we are now doing a run, which is nice. Um, yeah, looks like the run is running. Okay, great. And that looks like it just wrapped up. We got 500 items because I went back and I changed the number of total items to 500. Um, and now we basically have everything that we need in order to proceed with and then complete this whole flow. And as you can see, not super complicated. We had one form submission, one module or node to generate a search URL, and one module or node to run an Appify actor and then get the results. And because I never, ever want to have to do that again, I'm just going to pin this. And what I'm thinking is by me pinning this, I'm just not going to have to run that same actor over and over and over again. I'm not going to have to like have those crazy wait times. That's an important point for me to make more generally. Like, um, I find a lot of people, they will, um, test stuff using like repeat manual inputs over and over and over again. So, if they're testing a form or something, they'll actually fill out the form every time. And it doesn't seem like that adds a lot to the process. But consider, I might test a flow 20 times over the course of my development. If I test 20 times and every time takes me an additional minute to fill out the form, I basically like added 20 minutes to my whole workflow, right? And as you see, I build these pretty simple but very high ROI systems like over the course of an hour or so in a video. Um, if I were to do that, I would materially improve, increase my production times, um, impacting them like 20, 30, maybe 40%. So I just like to pin data wherever possible. Helps avoid like a lot of the BS.
Okay, now that I have this Appify actor, um, output, we, we've got a bunch of items here. I'm going to go back to my roadmap. What do you really need to do? Well, next up is we need to enrich these leads with personalization. So that's going to be pretty easy. You know why? Because we've already done most of the work. I'm going to go to OpenAI and then I'll go message a model. Okay. And then, if you guys remember, I already, I already wrote most of this prompt. So I'm just going to copy and paste this prompt right over here. So I'm going to select my own credential. If you don't have a credential, make sure to set it up. You need to just copy over your, um, OpenAI API key. I'll select GPT 4.5. I'll paste this in as my system prompt. And then I'll just move down and copy all of this as my user prompt. Okay. I'll make a couple of changes. Why? Because I don't actually need these lines and stuff. What I can do is I can actually just take this and feed this in as an additional user prompt instead. And here I can feed in an assistant prompt. Have it give me an example, right? Because I want it to then I can go back here, feed in another user prompt. And then this is going to be my actual live data, right? So what information did I put in? I put first name. So I will do first name here. Oh, that's ugly. One sec. I'm going to go to expression, paste this in, and I'm going to call this LinkedIn fields. You can, you know, actually add all of the information and, um, like in JSON if you want, but it, it doesn't really make any difference, right? And doing this, I get to save a couple of, uh, tokens, which may not make that big of a difference in isolation, but it does definitely make a big difference, um, if you zoom out a little bit and like look at it over the course of, I don't know, a month of running this, a year of running this system. So I need to find the city. Is it City? I think it's City. Okay. So City's Grand Rapids. So I'm just going to grab this here, paste this in right there. Then what I need next, I need job title. Go title, creative director. That's cool. At, and then the company name. What is the current company name? Headwind Agency. It looks like the, um, employer employment history zero is always that. Then previous experience. And then I'm going to go co-founder, COO at Mission 3 Media. That's cool. Um, let's do one more. We'll say producer at self-employed. At least for this guy. Um, feed that in. Okay, great. So what does this look like now? LinkedIn fields. Grand, whatever, Grand Rapids. Okay. Very nice. Self-employed. Beautiful, beautiful. I'm then going to output my content as JSON. Go test step. And from here, our output should generate some cool personalization that we can then also map directly because it'll be on JSON variable. Should note that I'm using 4.5 preview for this. You don't need to be using 4.5 preview. I just like to use the best models for stuff. Why? I don't know. It's a flex. I like flexing. See these muscles? Just screwing around. This one's taking a little bit longer than usual. Uh, might be because of token usage or something on my account. I'm not entirely sure. So when I run into issues like this, just going to see if I could stop this. Doesn't look like I can. Okay, cool. I did end up stopping this. Maybe I'm just going to use. Okay, let me just try rerunning this now with that test data. Okay, once that's done, we've enriched lead personalizations. Then we just have to send a Phantom Buster. And the way that we're going to do the, the sending to Phantom Buster is I'm going to, um, just connect to their API and I'll send like an API request trigger with the, uh, with the Google Sheet that I'm dumping to. So actually, there's an intermediary step here where I need to dump stuff to a Google Sheet, which I haven't really put together. Um, but we'll, we'll talk about that maybe. Actually, I guess what I should do then, I should probably dump leads to Google Sheet. Right. Then four should be sent to Phantom Buster. Send sheet to Phantom Buster for LinkedIn DMs. Right. Trigger Phantom Buster for LinkedIn DMs. That's probably what I'm going to do. And I mean, this now looks kind of weird, weird. But copy and paste that everywhere. Yeah, this is taking its sweet ass time. So I'm not really sure what's going on with that. But as I'm sure you guys know, um, a lot of the time when you make an automation, there will be platform bugs or some minor issue with the nodes or the modules. I'm going to just change this model and see if that makes it snap out of it. So we're just going to go GPT 40. And then I'm going to test this. Uh, actually looks like I have a bunch of additional new lines here. I don't know why. Should probably remove that. Check this out here as well. No, that's fine. How about this one? This one have any additional new lines? Can't really drag it open, which is unfortunate. I guess I have to give it a click. Well, looks pretty good. Yeah, no problems there. Oh man, I'm so stupid. It's because I'm doing 500 items, duh. Oh my God, I'm probably racking up my. Man, that's crazy. Okay, so what I need to do is I put up, put max items here. Just set max items to one. That way it's only going to generate one icebreaker. I was trying to erroneously generate 500 icebreakers. Don't be silly or stupid like me. Anyway, now that that's done, uh, we verify that this does in fact work. I can go back over here now and I could go and I could check enrich leads with personalizations. Duh.
Okay, next up, we need to dump this to a Google Sheet. So what am I going to do? I'm going to go to Sheets right over here. Going to, um, append row and sheet. I'm going to select my credential. I already have one called YouTube, but in your case, you might have to like connect it and do your OAuth and stuff. Then the operation is just going to be append row. I'm just going to be adding these to a new sheet, right? Append or update a row, sorry. I'm going to make a new sheet. So we'll go sheets.google.com. And then what I'm going to do is I'm just going to go to my account, which I know has a connection, which is this one here. I'm going to create a new one. This is just going to be called leads. Um, I'm going to go to document, look up leads, see if we can find something. I can. The sheet I'm going to choose from is just going to be sheet one. We're going to map each column manually. No, can we just map automatically? That'd be great. Just dump literally. Oh, no, we can't because we're only going to dump in this stuff. Then [Music] right. I wonder, can I just grab? I would like to have all of this information automatically in the Google Sheet without me having to manually add every, um, manually add everything. Otherwise, I'm going to have to manually add everything. That'd be brutal. Yeah, that'd be kind of, kind of crazy. The columns in Google Sheets. Oh, I get it. I get it. I need to set column names here. Okay. So what I'm going to do is I'm just going to set these column names. Create a CSV of these header names. See, string of these header names that I can paste into Google Sheets. Just going to paste this in. And then what I want is I want LinkedIn URL. And then I also want icebreaker. And I mean, you can put in as much of this information as you want. All of this additional information. I don't really want to. I just want to just, you know, get this up and running. So that's what I'm going to be using as an example. So this now has all of the sheets. It's telling me that one of the headers is twice. So I'm just going to go to data and then I'll go split text to columns. So I have two. Yeah, I do have two instances of LinkedIn URL. That's okay. I'm going to go over here and now I have my leads sheet, which is nice. I'm going to go back and now I'm going to go map each column manually. And then it's going to match on ID. What I want to do is, can I just actually, maybe I can. Going map each automatically. I don't know. I don't know if this is right. So let's just give this a test. See what happens. Just supposed to be adding a single row in here and it's not. Um, and the reason why is because it's grabbing data from the OpenAI node instead of the previous, uh, limit node, which is what I want. So I'm actually going to map each column manually. It's going to find all the ones for me. Then what I want is, um, under this, I'm going to use ID for ID. First name's obviously going to be Frank. Last name is going to be whatever, um, name is going to be full name, I guess. Let me see. First name, then LinkedIn URL. So I need to find the LinkedIn URL somewhere. Should be right over here. Then what else did we have? Title. Let's go title. Email. _step. I don't really know why I put that in there, but whatever. Basically just mapping a bunch of irrelevant fields right now, just to show you guys what the process would look like. Then finally, icebreaker. The icebreaker would be the, um, message from the OpenAI node, right? Okay. So now we're going to test this. Giving it a go. See the icons changed here. And voila, right? We've now dumped in the records. That's nice.
So now that we have this Google Sheet, what does this mean for us? Well, we can actually just take this Google Sheet. I'm going to go editor. Maybe I'll change it to viewer. Actually, I don't really want you to, uh, somebody always on from my YouTube. Somebody will always find some of my sheets and then like come in and then just like draw dicks on them or something. It's, it's hilarious. Whoever you are, or whatever group of people you are, keep fighting the good fight. I'm just going to, uh, I'm going to start locking these down a little bit more. Okay, so that's that. Now that I have this Google Sheet, what I do is I just go into Phantom Buster. Okay. Right over here. I'm going to, you know, I go to LinkedIn Solutions, LinkedIn, and then down here I go connection request or auto. And it'll be an auto connection sender, essentially. So I don't know where this is. Somewhere here might be connect request, auto invitation, maybe auto connect. There we go. This one here. So I'm going to use this. What I'm going to do is I'll change the input into a spreadsheet URL. So now I'm going to paste the spreadsheet URL in. Okay. The value of this is it's publicly accessible. Then from here, the name of the column containing profile URL is going to be this LinkedIn URL one. I'm going to keep all of these columns in my output file because I'm, I'm going to want them. Now I then select my LinkedIn account. So in my case, I'm going to select this one here. And I should note that if you want to send the LinkedIn, um, messages with like the, um, customized connection requests, uh, to any that's not like a, a second connection or something, you need a, you need a LinkedIn Sales Navigator subscription. Now I have everything that I need. I can just go icebreaker, right? So that's what I'm going to be sending people. I go back to save. Going to click none for this behavior. I'm going to do 10 per launch. Then I'll just leave this at manual. And I'm going to rename this now. Auto Icebreaker Connect. And voila. Now what I'm going to do is I'm going to grab the ID of the Phantom, which is going to be up here. Okay. And now I have to do an API call basically to trigger this. So we need to go to Phantom Buster and check their API. How do we do this? Uh, we go up here. Sorry, up here. There we go. And I think the, I don't, I don't know for sure. I'm thinking it's probably agent. And it looks like they have a V2 API. That's what I'm going to use. I'll go to agent, agent launch, probably. Yeah, yeah, this is the one. Then I'm going to grab a curl. Is there a curl? Yeah, there's a curl right over here. So I'm going to copy this over. If I just try this, am I going to run? Cannot validate data. Should have required property ID. Oh, yeah, ID of the agent to launch. There we go. If I feed this, oh, yeah. Okay. So what I'm going to do is I'm going to go to my LinkedIn agent and then I'm going to grab the, um, the Phantom ID, which is up here. I'm going to paste it in. And that's going to now include that data. If I click try now, should 200. And then if I go back here, it's probably running now, right? Yeah, it's running. Sick. Cool. So we just verify that we can actually now run this. Now, is it possible to abort this mid-run? Because I don't actually want to connect to LinkedIn and do all that fun stuff. Uh, it is. Cool. So what I'm going to do now is I'm going to just recreate my HTTP CW request. I'm going to go back to the API, copy this curl request, go back to Naden, import curl, paste this in. It's now going to automatically map all of these fields. Then if I scroll down, I have my Phantom Buster key. On Phantom Buster, you need to create an API key. So you just go over here to API Keys, you click create API key, and then voila, you have another one. And then I'm just going to delete the one afterwards, but you can only copy it once, um, basically. So make sure to copy it when you can. Then feed it in as an X-PhantomBuster-Key API key up here. The ID of the specific agent is right over here. I mean, it's just mapped all correctly. And now I'm just going to click test step. And it's executing now. Phantom Buster won't return, um, a note saying that like you're good to go. It's just going to return a 200 and say container ID. The reason why is because they allow you to check on your container ID later. So what you realistically could do, okay, is you could have a container ID. You could have a webhook sent to another scenario or another node, another workflow. You can check that. You could use that to update this record saying sent question mark. And then we can go down one by one. So that's what I'm going to do. So I'm just going to rename this now to trigger Phantom Buster agent, just so I have this. And then over here, it's going to be add to Google Sheet. Wonderful. This here was, um, personalize outreach. And now that we have everything, all we need now is we need a webhook trigger that basically triggers another portion of this flow. So a variety of different things we could do. Um, what I'm going to do is I'm just going to add a separate node or a separate workflow. I'll say trigger Phantom Buster agent. So I'm going to go number one. Then I'm going to have another number two. And that number two is going to basically watch for the completed run. I'm going to start with a webhook. I'm going to paste the title in. I'll call this two. And then instead of trigger Phantom Buster agent, it's going to be update Google Sheet with Phantom Buster connect requests. These are getting pretty long. So you can call the stuff whatever the hell you want. But now what I have to do is I have to figure out how to send a webhook. I know that you could send a webhook somehow. So I'm going to go back to dashboard, go back here, and there's got to be a way to send a webhook, right? Advanced settings, probably. Yes, there it is. Webhook. Cool. Custom webhook URL. So now I'm going to go into Naden. I have a little webhook set up. And what I'm going to do is, um, [Music] looks like webhooks will post a payload. When they post a payload, that just means that in order for you to receive it in Naden, you need to change the HTTP method to post. Okay. If it's get, you're not going to get anything. It's just going to hang forever. So we're posting the payload. It's going to have everything here with a container ID. This is probably what we're going to use to, um, to get the data. Now that I'm thinking about it, that's what it's going to look like. So we have the container ID. We're going to have to do something else. All right, that's fine. So, um, um, let's listen for a test event. And let's just, uh, well, is this done yet? I think I bored this, right? Okay, well, let's just, let's just trigger this then one more time. Trigger me, baby, one more time. Should get a container ID. Cool. And now, just while, while we're listening for this, because this is listening right now, um, I believe I can just continue building this. And if you think about it, like I need to do is once I have the webhook, I need to get the data from the container ID, right? So I'm going to go back to my API reference and then containers. Let's just fetch output. Fetch the output of a container, right? That's what I want. So now I'm just going to copy over this, um, go back here, do an HTTP request, import this curl. We're going to map it all, including the ID and everything that I need. And we're hardcoding the container ID, right? I think. Let me just go back to wherever that container ID was. Yeah, I think we're, I think we're hardcoding the container, right? I'm pretty sure. And that's going to include the output. Now, the output is going to include a list of all of the records that we've actually sent the request to, which is nice. So from there, I should essentially be able to do everything I need to do. Okay, so I mean, the trigger event's taken forever. And let me just see if I could run this as is. Oh, sorry, it's going to be executing the webhook node. So let me just add a manual trigger first. And then let's connect this. Now let's exit out of this. Now click test workflow. Nope, just this. Thank you. It's saying the resource I'm requesting could not be found. So why is that? Um, there must not be any data. There's probably no data. So I'm just going to see if we can get the container ID. Is there a container ID? I'm not seeing any container ID. Identity, maybe identity ID might be container ID ID. Not really sure. I don't know if that's what that means. Um, well, it did work. It actually went and it sent the request. That's pretty badass. So what are we going to call? I think it might be this identity ID. Unfortunately, doesn't look like I can copy it. Doesn't let me. So that sucks. Um, H, how am I going to get the container ID of the thing? Um, I guess I could just, uh, grab a different container. This, this one, maybe. Just let's try this. Okay. Oh, what the heck's this? I don't know what this means. This looks like a test. H, that's the, that's the output, huh? Weird. So I don't actually know if that's what we want. Do we want the container ID? Then no, we want, um, agents fetch output. Get the output of the most recent container of an agent. Maybe we just need this. Okay. It's designed so it's easy to get incremental data from an agent output of the most recent container. Okay, well, I'm just going to, I'm just going to call this then like, right? Yeah, let's just do that. Um, let's not even worry about all this stuff. Let's just get the ID of the agent. Okay. Should be right over here. Now let's do an HTTP request, but this time we'll do it to fetch output. Okay. So I'm going to copy this over, paste this in the test field, try it. And no, we did get a weird, we did get a really weird output. Not really sure what that means. Process finished. Spreadsheet is empty or everyone has already been added. Okay, okay. Yeah, no, we did, we did actually get the, we did actually get the output. Um, maybe there's something that I'm missing here because it looks like I'm fetching, I'm not fetching what I want. Um, I'm fetching something different. Okay. So let me see if I could feed in the right container. Basically, what we want is we just want the big list, right? So how am I going to do that? If omitted or set to, okay, you know what, maybe, maybe it's actually this. Maybe we go to agents, um, fetch output, then we feed this in. Let me try it. Oh, sorry, I'm feeding in a container ID to something that wants something called an agent ID. That's kind of killing me a little bit. Uh, all right, that's fine. Let's just kind of circle back. Um, I was using a post request or a get request. I don't remember. Let me paste this in now. Now let me test this. Says it's a bad request. I need to check my parameters. So why is that? Could be that the, um, ID is not the ID of an agent. So I'm going to go back here to where I define the ID of my agent. And I'll go back here and I'll paste the ID of my agent in. And no, we do get just this weird output file, which doesn't actually have anything. So that makes me think that in order for me to do this, I should probably test with another lead. So not just one lead, but two leads. So why don't we just test with with another lead? Now I'll go over here. We just delete Frank. And [Music] then actually, why don't I just test this on my, on my real data? That'd be interesting. Let's go back here and then instead of a limit of one, I I just do a limit of three. That'll allow three things to move, which will allow us to generate two more rows, basically. Those two rows should dump here. So just, I'm testing all this iteratively right now. So we should have two more. Now we do with the icebreakers, right? So the rest of the system works fine. And now we just need to send it to this Phantom Buster agent. Okay. So, um, let's do it. I'm going to send to. Okay, actually, this is a good opportunity for me to test my, um, uh, my webhook, right? So why don't I grab this? Listen for this test event. Then over here, I'm going to test sending all of these results to my webhook. Looks like it's already running, which is a problem. H, it is running. Interesting. I get it. I know why it's running. It's running because we're just doing, we're, we just sent three results over. We need to aggregate the results in between these two. So I'm going to use aggregate. Okay. I don't think I need any field name at all. I think I can just aggregate these. So that these three items become one item. Let's see. No, I guess we do need a field to aggregate. We'll aggregate them based off of ID. No, I just want to aggregate all of them, really. Um, let me just see if maybe there's another field that I need to use that's not aggregate. Can I just combine these all into one item? No, I think I do need to use aggregate. Just going to aggregate all item data into a single list. Put it inside of this object called data. And then from here, I'm now going to have one item. And then I can just trigger this once instead of, you know, however many times I've done so. All right, well, I'm glad that I spotted that. That otherwise would have been a catastrophic error. Um, let's see how our agent's doing. Looks like we're processing two new records, which is nice. So this obviously understands and is capable of like kind of mediating, modulating, whatever the hell you want to call it, um, the output. Just make sure this webhook is set. Oh, the webhook URL is not set. Oops. Save, save, save, save and close. Yeah, this probably ran without that webhook URL. So that, that, that makes sense. I'm kind of silly. Okay, looks like we did indeed finish that run. Two invitations were sent. I'm not getting a webhook here unfortunately, which is kind of annoying. So I'm just going to, um, leave that for at the end of the video when I do a demo. For now, I'm just going to pretend like I did get the, the webhook and then I'll just continue manually triggering the rest of this flow. So, um, yeah, because we triggered that flow right at the very end there. And then if I go to my execution history, I should see a record of the flow at the very end where the error was. Uh, I don't know what. Oh, that looks like okay. That looks kind of weird. I don't remember doing that. It's probably this one here. Something is weird happening here. This is like messing around with the. Okay, that might be a bug of some kind. Um, anyway, I should be able to grab the ID of the agent, right? So I should then just be able to feed this directly in, which is the same as before. We should be able to test it. Should be able to get the, the data. But no, I'm not really getting the data. Not really wondering. I'm really wondering why I'm not getting the data here. Looks like this is good. I mean, I sent it up, but why we sending it in this format? I don't want it in whatever the hell this is. I want in JSON, right? I'm just getting this all as one big text string. So could I get this agents fetch output? H, yeah, that's kind of annoying. You know what, we might not actually be able to do it. Kind of sucks. I think instead we're going to have to do. So we're just going to have to go like when it is sent, we're going to have to mark this as XXX, basically. Um, yeah, I mean, there's no other way of doing so. I mean, it's not ideal and it's not technically one to one, but looks like the only alternative to that would be madness. We'd have to parse out all of those people using AI, and this would not be reliable. And then, um, it also cost way too much in order to do it. So I guess we're going to scrap that. We're going to do is we're just going to keep with, keep on with this one scenario that triggers the Phantom Buster agent. And then after the Phantom Buster agent, uh, well, we're not even going to have a sent column really. It's just anybody that's here will obviously have just made it through the Phantom Buster agent. So that's what we're gonna, that's what we're going to say. And then, yeah, the Phantom Buster agent, we'll just run it, um, every time we add new people to this list. And then I think we could also probably just run it once a day or something, once every couple of days, because it actually automatically has the deduplication functionality inside of it, right? So, yeah, I guess there's no real reason to have like a, like a done column anyway. It's not that that was a silly thought. Ideally, you should track this, but there is, there is really no need to split it into. I suppose because if it is on the sheet, Phantom Buster will automatically dup it. And so we just basically anything that goes in the sheet will eventually be taken care of, I suppose. Um, and if you want to see how far down you are, you just go to results and you basically just have a list of everybody that you sent to. So, yeah, we do have that taken care of automatically. And as we can see, you've already sent some of these DMs. Um, so I'm probably going to get like some actual connection requests from these people, which is nice. Looking forward to meeting you, Frank, Greg, and Atina. Um, so let me just think, is there anything else that we need to do in order to make this work? I don't really think so. I think that's about it. Just did it with creative agencies. So now we just going to trigger the Phantom Buster agent and have that go. Yeah, looks pretty good.
And there you have it. It is a complete AI-powered LinkedIn outreach system built entirely in Naden. The system will save you hours of manual work every week while actually improving your response rates. And the personalization that we built in goes far beyond what most other automated tools offer. As of right now, and then finally, the benefit is you own the entire workflow. A few important things that I'd recommend you keep in mind. I think you should start with small batches, maybe 5 to 10 requests per day as opposed to large ones. LinkedIn imposes a message limit of about 100 outbound DMs of this form, aka connection requests, per week. So start with 5 to 10, gradually increase as you get more comfortable. You should also regularly check your LinkedIn account to quickly respond to any replies. I mean, if you can respond to people on average within a minute, your conversion rate, um, jumps up by something like 400%. I'd also recommend you update your message templates just every couple of weeks to keep them fresh. Then finally, monitor your metrics closely to see what's working and what isn't. You know, cold outreach is basically all about iteration. Um, the very first campaign that you guys send out, it's probably going to be the worst campaign you'll ever do. If you guys run into any issues or you want to share your results, just drop, drop a comment down below. I'd love to obviously hear how the system works for you. And then if anybody has any questions or something that I might be able to help with, you know, I'm much more likely to respond to comments than the average YouTuber. And for those of you who are serious about building AI automation systems just like this one, I highly encourage you to check out Maker School. It's my own community where over 1,400 entrepreneurs are building and scaling their AI automation agencies. Thanks for watching and peace out.