How I Automated Faceless Shorts with AI in n8n (free template)

Dr. Violet Howard walks through an n8n workflow that turns Google Sheet ideas into YouTube Shorts. An LLM writes image prompts, Flux generates four vertical images, Runway converts them to video clips, ElevenLabs creates narration, and Creatomate stitches everything together before uploading to YouTube. The whole process costs about $1 per video and comes with a free template.
Chapters
Today I'm really excited to share this end-to-end workflow that I built with you guys that's going to help you generate and publish faceless AI Shorts on autopilot. Once you have this thing up and running, you can generate as many Shorts as you want per day. So you're basically going to be able to grow a YouTube channel while you sleep. And the best part about it is I'm giving all of the resources that you need to get this thing set up away for free. So all you have to do is join my FreeSchool community and all the resources will be in there. So let's not waste any time, hop straight into a demo, and then we'll break down each node and see what's going on. Cool, so this is what the workflow looks like. And before we actually hit test workflow, let's look at this Google Sheet real quick that has all of our ideas that triggers the workflow. So I'm gonna hop into it. This is what it looks like. As you can see, we've already created 4 different videos that we'll look at in a sec. And you can see that the video status on them are created, the publish status is processed, and the video link is— the final video link is right here as well. And in order for you to plug in this workflow and hit run, you need to have your sheet set up just like this. so you'll also be able to grab this template and then everything will be mapped correctly for you. But anyways, when we go back into N8N and we hit run, we're gonna be pulling in this row right here, which is gonna be futuristic cyberpunk rebels, and it's gonna be tiger, bear, rhino, pig. It's gonna know to grab this row because we have the video status set to to-do. Now that we're back in N8N, let's hit test workflow. It should be pulling in that last row we just looked at, and it's feeding in those 4 animals and the style into this image prompt agent. The only reason I'm using an agent here is because I wanted to be able to plug in different chat models and test out different image prompt generation. And so right now we're going to 4.0, but now it's cleaning up those prompts, getting rid of any newlines and punctuation, just because we want to make sure that they're able to feed into our API call here where we're doing a text-to-image API. And then we'll have to wait about a minute, 90 seconds, in order for the images to be generated. Then we're going to grab them, and then we're going to feed those images into an image-to-video generator, and then we're going to wait for 2 minutes, and then we're going to grab those videos, and I'll explain the rest of the process. Okay, so those images just finished up. As you can see, we pull them back into NN and then we feed them into this next node that converts the images to videos. Not really converts, but makes videos out of them. So now we're going to wait for those to finish up. And while we're waiting, I thought it would be a great opportunity to hop back into here and take a look at some of these finished products. So this one is Viking Conqueror Animals. Cool. So now let's also look at Cowboy Wild West. All right, so that's— you get a feel for it, right? If you noticed, each video has a different audio. So we have this sound agent down here kind of looking at the style and then creating a sound prompt that we're gonna send over to ElevenLabs to generate that audio. So I wanted to switch back into the workflow because I had a feeling that we're approaching that 2-minute mark and I wanted to just show you guys live the process of getting videos and then sending it down and we'll see how the merge works and everything over here. Okay, so that just finished up and now we're downloading the videos back into EditN and we're sending it off this way to create that audio. As you can see right now, ElevenLabs is what we're using to create that, you know, sound effect, audio, whatever you want to call it. And then what we're going to do is upload that to Drive. We're going to share it within our Google Drive, and then we're going to merge back and actually do the full render and upload. So it's being uploaded now, it's going to get shared, and then we're going to come over here, we're going to split it out to parts, we're going to make our request to a service called Create-A-Mate to actually render that template, and then we're going to wait for 25 seconds It doesn't usually take that long, but always just want to make sure. And then we'll pass it over, download the video, upload the video to YouTube, and the rest is history. There we go, just finished up. Download, upload, and then we're gonna upload— update our sheet, and then we're gonna get an email notification. So let's go ahead and pop over to the Google Sheet right here. We can see it just got updated to created, processed, and a final video link. So let's click into this. I think that one's my favorite. That one's, that one's kind of crazy. We didn't look at the Egyptian Warriors, so we can click into this one real quick too. Okay, so that one had some weird sound effects, but first thing I want to point out is these first 3, we used an image-to-video generator called Kaling, and for the second 2, we're using one called Runway. So you've got a little bit of flexibility here. As you can see right now, we're using Runway, but I also included the API calls down here, and you would basically just plug and play these 3 instead of these 3, and then you would use this code node right here if you use Cling instead of this current CodeNode. So you've got some flexibility here. You can try out some different things. The only reason I switched away from Cling is because we were accessing Cling through an API and we were just running into issues with rate limiting because their service was receiving so many requests. And Cling takes like 6 minutes to download or render and Runway is much, much quicker. So I went with this one. But if you notice the difference in the video quality there, that's why. And here we are at email. You can see that we got a new short process futuristic cyberpunk. And then I can click on this link right here. It's gonna pull up my YouTube Unlisted and we can see all these Shorts that we have. We could also click in here to validate that it is a Short. So that's exactly what we just saw and we have the caption filled out as well as the title. So let's hop back into the actual workflow here and break it down. So I know this seems like kind of a complicated workflow. It may look like there's a ton going on, but it's not too bad. But if you're looking for a more hands-on step-by-step approach, then you should definitely check out my paid community. The link for that's down in the description As you can see, I already uploaded this as a step-by-step tutorial. And then I also did another version of this template, sort of a V1, where I did straight text-to-video generation rather than using images first. And in my paid community, I also did a step-by-step of this tutorial as well. But like I said, you can still access all this content for free if you join my free school community, click on YouTube resources, click on the post associated with this video, and then you'll have the JSON file right here to download and import into your own N8N. Alright, but let's get into the actual breakdown of this build. So right now we have two triggers. We have a manual one because I was able to just hit test workflow, or we have a scheduled trigger and you could set this to go off at, you know, 3 times every day at these 3 times or whatever you want. We can use a scheduled trigger so it can really grow this channel while we're sleeping. So the first thing that we're doing, of course, is we're hitting our Google Sheet with our content ideas and we're grabbing back one row. And so we do this by saying, okay, We're gonna look and we're gonna filter through the column video status, and the value has to equal to-do. So back in our template, we have the column called video status, and if it equals to-do, then we pull in this row. But right now, since none of them equal to-do, if we hit run, nothing would come back. And we also want to make sure that we're only returning the first matching row, because ideally you'll have like 20 or 30 ideas ready to go, but you only want to do one at a time. So that's gonna make sure we only pull out one. And then we're going to get the row information like the title, the animals, and then the style, all that kind of stuff. From there, what we're doing is we're just going to turn that— those 4 animals into a list. And so we do this by setting a field called animals. We change the data type over here from string to an array. And then in here, we're basically just dragging in animal 1, animal 2, animal 3. We're putting that within square brackets, and we're putting quotation marks around each animal. And on the right, you can see it comes through as a tiger, a bear, a rhino, and a pig. And this way, no matter what 4 animals you have in your sheet, they're always going to be populated into this array. And then the last thing I did was set the style, which is just dragging in the style from the sheet over to the middle. That way the output is very clean. We have the 4 animals that we want image prompts created on, as well as the style for all 4. Then what we wanted to do is split out the list that we just created of our animals so we could have 4 separate items, because then we can feed in 4 items into the agent and the agent will split out 4 different prompts. So that's the idea here. And all we have to do is say, hey, which array do we want to split out? Which list are you trying to split out? And we just dragged in animals. And now you can see it's always going to be looking for a field called animals. And then it's going to create basically 4 items from that list. So now we have our 4 animals all separated and they're ready to go into the image prompt agent. Within this agent, once again, the only reason I'm using one is to be able to play around with different chat models rather than having to do different requests. So that's the only reason I'm using an agent. Obviously there's no tool calls going on here, but we have our user message and our system message. So the user message, just think of this like an actual, you know, your chat bar with ChatGPT. Something you type something different every time, but the system prompt is behind the hood. You know, OpenAI has prompted ChatGPT in a certain way. So that's the difference here. But the user message is going to be different for each run. So there's 4 items coming in, there's 4 items coming out. If we click into here, we can see that we're giving the agent the animal as well as the style. And on the right, we can see the 4 different runs. So the first time it's getting a tiger, second time it's getting a bear, third time it's getting a rhino, and fourth time it's getting a pig. Cool. So now if we go into our system message, we can see that we're basically telling the agent how to act. So we give it an overview, which is that you are a master prompt generator specialized in crafting detailed, high-quality prompts for advanced image models like Flux, which is actually the one that we're going to use. Your task is to generate vivid, well-structured prompts that accurately depict an animal dressed in a specific style with a matching background that complements the theme. So we're going to get a really, really solid image prompt here. We gave it some instructions like clearly describe the animal's appearance, specify the output and accessories that reflect the given style, include details about the background that reinforce the style, use rich descriptive language, avoid generic terms, and never output quotation marks or new lines because, as I said earlier, that would break our JSON body request. Then we gave it an example input and output. So we said an animal, fox, style cyberpunk, and then a good image prompt. And then finally, this is something very important that I had to figure out when I was testing. All prompts must be family-friendly. No sensitive words should be used. No references to weapons, even toy guns. No references of showdowns or violent events. So if you remember, we saw an example of a Wild West. One of the prompts was a dog that was holding a gun. And, um, The video prompt generator didn't like that, or sorry, the video generator didn't like that. So that's why I put that in there. A great example of reactive prompting. I wouldn't have done that beforehand. So now we're getting 4 items in and we're getting 4 high-quality prompts back. So we have a majestic tiger, an imposing brown bear, a robust rhino, and a muscular pig. I love that. So we have our 4 prompts right now. You can see there's no quotation marks or new lines, but what we have here is a code check just to make sure that there's no new lines. I actually didn't work in the quotation mark thing, getting rid of quotation marks here. As you can see, I'm only replacing newlines. But so far so good. That would be an easy fix using something like Claude 3.7. But as you can see, we didn't get any newlines, but if we did, we have to clean those up. And when I was playing around with Gemini Flash 2.0, I was getting newlines, so that's why I put that in there. And then finally, I'm just setting prompts in a field called prompts, just so if we want to reference them later, we know exactly where they're coming from and just to clean things up. So we Right now with 4.0, I don't think that these two steps are necessary, but sometimes just good to have some extra, you know, guardrails in there. And I like to set fields frequently. I also like to save items frequently. So if you're building this out step by step, save your workflow after every node because you'll learn the hard way. Anyways, we're ready now to move into this blue section down here, which is gonna be our generating images. And so as I touched on earlier, for some of them, I used our Cling API, which you can find down here. We're actually hitting CLING, which is a model for video generation through a service called PyAPI, which I'll show off in a sec because we use PyAPI to hit the LUX model as well. But I have a code node here that if you do decide to test out with CLING, you will put the code node there instead of this one. And same thing for these 3 nodes, you'll just swap out these 3 nodes. So if you want to experiment, go ahead. But anyways, when it comes to generating images, let me click into this node. What we're doing here is we're accessing an API called PyAPI in order to hit the Flux image generation model. So this is PyAPI. Leverage our AI APIs for your AI application developments. It's kind of like a router, the same way OpenRouter lets you connect to different chat models. This lets you connect to different image generation and different models, as you can see right here, Midjourney, all this kind of stuff. So once you get in here, you'll make an account and you'll be able to get your API key from down here in the bottom. You'll create your key. And then what we're going to be looking at is, first of all, image models. So we have Midjourney or Flux. And in Flux, what we do is if we click on run API, we can see here is the information of how to actually get this configured. Okay, so what we see first of all is we have an endpoint. And honestly, all the endpoints for PyAPI are the same. Where you specify the model and the action is going to be down here. So down here you can see in our body request, the model is going to be required, and we'll fill in that with Flux. And then for task type, we'll put in text-to-image. So anyways, we have our endpoint, so that's going to be a POST to this endpoint. So copy that in, and we have that figured— filled out. The next thing that we see is we have a required field, which is our API key. So this is going to go in the header, and I'm going to show you guys a really cool trick that you can do when you have stuff like header parameters or query parameters that are authentication. So what I did in here is rather than sending it over as a header right here where I would type like x- API-key, and then I put my key right here. Rather than doing that, I want to make sure that I can save my credential every single time, so that's why I have this PyAPI header here. You're going to go to Authorization, Generic Credential Type. You're going to go to Header Auth, and then you, you can see I have a ton of other ones set up. But when you create new credential, all you have to do is type in the x-api-key right here and then put your actual API key right here, and then you can save this and name it whatever you want. So that later if you ever are building another workflow and you want to, you know, use PyAPI, you already have this saved. So like, you know, I have Twitter, Tavalley, Runway, Perplexity, ElevenLabs, and now I have all of these always saved. And then if we go back to the documentation, we have to send over different body parameters. So the first thing you want to think about is which ones are required. So we need a model, we need a task type, and then we need an input. Um, and that's all that's required. So I basically just copied this example from over here and I pasted that down here, and then we can configure it. So The only thing I really changed was the width and the height because we want the aspect ratio to be, you know, the vertical 9 by 16 for YouTube Shorts. And then I drug in the actual prompt. So I was just able to grab this from the previous node because we had just set our prompts and they're all cleaned up at this point. And once again, this is going to run 4 different times. So the first run is for the tiger, second run is for the bear, third run is for the rhino, and the fourth run is for the muscular pig. Cool. So what happens after we send this request to Pi it basically comes back with 4 items. So one for each of the prompts and says, okay, here's the prompt and here's the status of your picture. So right now they're all pending because they're pending. And we know that if we came into PyAPI, we're in the Flux playground and we're looking at our task history, we can see that each run is taking about 30 seconds. And we can also see that each run is costing about 2 cents, a little less. So it's going to be what, about 6 total cents for you to run this every time just for the image generation. We'll get into the other cost later, but about 6 cents here for each run for your text-to-image generation. And, um, we can see these will be like processing for 30 seconds or so. And so that's why over here what we did was wait for 90 seconds just to be safe. After we wait for a minute and a half, we will do another request, and it's going to be to the exact same endpoint. So you can just copy the endpoint from the previous node, put it over here, and then instead of a POST, we're going to be doing a GET. And we're referencing the IDs that are coming from the left-hand side. So we're just dragging in task ID and putting it at the end of the endpoint, as long as we put a slash after the task and there's no space between the slash and the ID. And so the reason this works is because you can see here, every single image has a task ID associated with it. So this one was the tiger. And if we open up the image URL, we can see it was the picture of the tiger. This next one is a different task ID. and this one was the brown bear. So we can open this one up as well if I can copy this correctly. And we can see that this is a different unique image. So that's just how we're able to track what image is what. And also on, you know, Flux's side, they can have every single task associated with a new image. So now that we have our 4 images right here downloaded pretty much into NN, not really, but we have the URL, we're able to feed that URL into this next node, which is hitting Runway to create videos from a prompt and also an image combined. So I'm going to open up the Runway API documentation right here. We're at the API reference, and this one is even easier because we have a curl command right here. So we'll copy this curl command, we'll come back into n8n, and all we have to do is click on import curl and then paste it right in here. And then when we hit import, it's going to fill in everything we need except for like a few blanks, like your API key you'll have to pop in, and then you have to configure some of this own stuff, but I'll walk through what's going on here. But it'll by default throw an API key section right here in the headers, and we don't want to do that. We want to set up our header so we can store it and use it later. It's just best practice. So that's how I got my header here. Once again, we also need to set up the x-runway-version, which we can see right here. It's required, x-runway-version, and it needs to always be exactly this value. So we're just going to copy and paste that right into here. And then finally, we're setting up the actual body request. So back in the documentation, the first thing that's required is a prompt image. So all I did is I put in prompt image and I'm dynamically dragging in the image from the left to the right. So on the left-hand side, this is where the image URLs are. So I just drag this in right here. Then we have to set up our model. So the only model right here is Gen 3A Turbo. So we basically just filled that in right there. We have the option to fill in a ratio down here, and there's only two accepted values. So we grabbed this one because that's basically the equivalent of a 9 by 16 aspect ratio. We were also able to configure the duration as an integer. We could only do 5 or 10, so we filled in 5 right here. And then finally, we have the option to fill in a prompt text. And once again, we filled in the prompt text right here. Notice with the prompt text, it has to be less than or equal to 512 characters. So maybe within your image prompt generator agent, you might want to say, make sure it's not longer than 512 characters if you're using Runway. If you're using Flux, they can be maybe up to like 2,500 or something. So you have a little bit more wiggle room there. So that's all we did. We run this and then we're getting back 4 IDs. So similar concept is what happened earlier, where each of these IDs is associated with a video, but they're not ready yet. So Waiting 2 minutes is good. I think a minute-ish is probably the average, but I just want to be safe. And then after we wait, we're able to do the exact same thing as before where we're just going to be getting rather than post, and we're going to use the same endpoint except for after tasks we're going to do slash the ID. So we're able to see that because right here, this is the get task details, and then we basically will just copy this curl. We can paste it in here, import the curl, and then we'll fill it out again. You still need to have the header of x-runway-version and you still need to have your credential. And then all you need to put in is the 4 different, um, task IDs from the left-hand side. And now we can see we have these different ones. And if we open up this, um, URL, this should be a video and this one is the rhino. So now we have the images turned into videos. This one turned out really nice with him walking. So I love that. But we have the videos. So now we're kind of branching off 2 different ways. The first thing is that we're putting it over here for later because we, we're done with them for now, but Don't think about that yet. We are going to be going down this path now to generate the audio. So the first thing that we're doing is we're going to limit it to 1 item. And this is really because, as you can see from here, we had 4, and then there was 4 items going down this entire process, which was fine because we wanted 4 images to be generated and 4 videos to be generated. But we don't want 4 audios to be generated. We're just going to generate 1 20-second long audio. And also just a quick reminder, in Runway, when you create your, you know, looking at my dev portal, I put in $10 for— it was 1,000 credits. Each 5-second video is going to be 25 credits. So each video that you do is going to be about $1. So $1 for each video. It's very similar for Flux. It's about $1 per video as well. And then we're at, what do we say, like 6 cents for the images. And so there'll be some other costs that we have to think about, like generating audio and, you know, calling this agent or whatever, also Creatamate. But right now we're at about a dollar. So anyways, we limit it to 1 because we don't want to send 4 updates to Google Sheets. We don't want 4 sounds. We don't want 4 audios. So we limit it to 1. And it's okay because we're going to merge everything back again later. So after we limit it to 1, which all I did in here was just literally said keep 1 first item. Then we're gonna update the video status in our sheet. So we're selecting our document, we're selecting our sheet, and we're saying what column do we want to match on? And we chose row number. And so in order to get row number, I just drag this all the way down to the node that started this process, which was our Google Sheet. And I just dragged in the row number right here. So this is saying, okay, whenever the row number equals 6, which should only be once, we're gonna change the video status column to created. And that's how it was able to change it from to-do to created, and it would update like that. Cool. So as you can see, that was successful. That's all that happens here. And then we go to a sound agent where we're feeding in the style. So once again, I dragged all the way down to the original style. We could also look later, like right here, we set the style. So I grabbed it from the sheet, but there's multiple places you could grab the style. That's the user message because every run is going to have a different style. But in the system message, we kept this one pretty short. I said, overview, you are a master sound prompt generator. Given a style, generate a vivid 1 to 2 sentence prompt that describes the ambiance, tone, and key sound elements to create an immersive audio scene. Use evocative language to capture the essence of the style. And then we gave it one quick example with the haunted ghost hunters, eerie whispers, there was echoes, floorboards creaking, all this kind of stuff. I think that this can definitely be optimized because some of those sounds were pretty bizarre, but in general, I wanted to just create like a sound out of our style with the minimal things that we were given, which was just style. So in this case, our prompt was neon signs flicker amidst a downpour in a grimy alley. Augmented voices shout rebellious slogans. So that's a little bit weird. I should probably dim it down a little bit. But as you can see, this one outputted a new line at the end. So we used Flash 2.0. If you used Flash 2.0 up here, you're probably going to get new lines. So that's good that you have that there. But that's exactly what I was talking about. This would break the request. So what I did here is in order to get rid of that newline, I just at the end I dragged in— here, I'll actually just show that real quick. So I dragged in the JSON.output, and the newline doesn't show up right here in the expression, but you can still see it over here. So what I did was I at the end of output, I typed in.trimEnd, and then it basically just trims off that newline, and you can see it's gone over here. So now we have a clean audio prompt ready to feed into ElevenLabs. So now we're making a request to ElevenLabs. Once again, we're going to go to ElevenLabs, and we will— first of all, what you want to do is get your API key. So go to API keys, you'll create one. I think you probably want to be on the $5 starter plan in order to do this, but $5 starter plan is going to get you a ton of credits. I've been doing a ton of testing here, um, and I've never run over. But anyways, then you're going to go to your API documentation. We're going to click up here on API reference. We're going to look at the different endpoints. So we can do text-to-speech, speech-to-text. We want to do sound effects, and we want to create a sound effect. And then once again, we have a curl command. So we'll copy this, come into AnyDen, import curl, paste that, and then when we hit import, it's going to populate these fields. Except for once again, this is going to put your API key in the header. So it's going to throw it right here as an actual header field. We don't want to do that. We want to save it our own as a header auth that we can use later. Then from there, we're just setting up two things in our JSON body, which is the actual text to make a sound effect with, and then the duration in seconds, which we know is going to be 20 because we're generating 4 5-second-long clips. So we want a 20-second audio. And then once that comes back, it's going to be a binary file. You can hit view. Anyways, that's going to be the 20-second file. And then what we have to do with that file is we have to upload it to the Google Drive, and we have to share it somewhere to make sure it's publicly accessible. So anyways, we're uploading our binary data, which is right here on the left, to a specific folder. And right here we can see input data field name is data, which is this field right here. So that's gonna be automatically grabbed in. Then we have to set the file name. So what I did was I went to schema, I went all the way back down to the first Google Sheet, and I grabbed the title, or actually no, I think I grabbed the style. I grabbed the style. And then I put at the end of style.mp3. And so that's how it's gonna come through. Then you can see I chose the parent folder, which is called audio files. So right here is my audio files in my drive. And you can see we have Cowboy Wild West Showdown, Futuristic Cyberpunk Rebels, Viking Conquerors. And they all have this little people thing next to it because it's publicly accessible and shared. If it wasn't, then there'd be no little two people. So anyways, what we get back is the ID of that file. We have like information about— anyways, what we get back is the ID of the file, which is what we need for this next node to actually share it. So we're doing a share file operation, we're doing the file by ID, so we just drag in the ID from the previous node right here. And then we just have to add a permission that says reader, anyone, and then we allow file discovery. So what we're looking for is right here when we have this in the Drive, we're looking for this web content link. And so if you pasted this into your browser before you shared it, it would be an error 403 because you don't have permission. But now that we shared it and it says Drive permission anyone, anyone reader, now if you copy and paste that into your browser, you'd be able to access it. Okay, so we generated images, videos, and audio. Now it's time to actually like, how do we get that all together in one format? So we're going to merge everything back together. What we did here is we just combined by all possible combinations, because if you combine by matching fields, that's like saying Okay, I have two tables and whenever name equals Nate, I want to match all those rows together. And so that's not what we're doing here. You could also do it by position, which would just say, okay, 4 items on the right, 4 items on the left, we're gonna match that together. And that would only keep one item really. And if we're just doing by all possible combinations, it's just gonna throw everything together. Honestly, this isn't super, super crucial just because we're not— we're kind of splitting it out later anyways. But you might as well just throw it together like this. We just want to get all the data brought back together in one space. So from there, we're splitting out the parts because what we have over here is our, um, video files right here in a field called output. But because these are 4 items, we would basically be making 4 separate runs like we've been doing in the past with creating 4 separate images or 4 separate prompts or, and that kind of stuff. We don't want to create 4 separate videos anymore. We want everything together in one item. So we can create one holistic video. So I had Claude write this code, of course, and all it's doing is it's splitting up these 4 items into 1. And so now we have 1 item here with all 4 video URLs that we need. As you can see, this is actual, um, video URL. This one is probably going to be the pig. Yep, there we go. That's the Cyberpunk pig. And so now we have everything right there, which is great because we can easily drag it into this next node, which is making an API call to Creatomate. So here is my Creatomate, and here is my animal video template. So what we have here is a 20-second long video template, an audio track that's all 20 seconds, and then we have text and video that's going to be dynamic. And we have them each, you know, 4 of them total that are in increments of 5 seconds. So if you want this template, in order to plug it into your automation, basically you open the source editor, and this code right here will be able to— I'll have it in the classroom. So once again, you can get all this for free, um, and you can just copy and paste this code into the template, and then you're able to actually access this template for your N8N HTTP request. So how you do that is you click on Use Template, you click on API Integration, and what you're going to do is once again copy this curl command. This is great because it's already going to have your API key in there when you fill it in. So copy this You'll make a new HTTP request, import curl, paste that in there, and then when you hit import, um, it's going to automate— automatically populate all this stuff. And by the way, the reason I haven't been actually importing the curl is two reasons. I don't want to mess up the flow, and also with the newest update of n8n, it's been buggy. So if you're unable to click the import button, then maybe try to go down one version of n8n and that should fix your problems. But anyways, It fills in your method, which is POST, because we're sending over data. And so here's an example of— I didn't save this authentication. I have it just sitting here in my header parameters, so maybe I should save that up there. But this is what it would look like typically if you don't save it. Now, when you have this header authorization schema where it's authorization, you have to make sure there's a space between bearer and your API key. If there's not that space, it's going to fail. So make sure you have that space there. And then finally, our JSON body. So what this looks like is we have our 4 video sources, we have our audio track source, and then our 4 text sources. And this is why we had to split everything up, because now we can just drag everything in from the left into the middle. So here was URL 1, I dragged that in there. Here was URL 2, I dragged that in there. Same for 3 and 4. So now we have our 4 videos. For audio track, I went down to the node where we shared the— where we uploaded the file to our Google Drive. And right here, the web content link, that's the one we're looking for. Because we shared it, it's accessible now for Creatomate. So we dragged that in right here. And then for the actual text fields, what we did was we got this all the way from the beginning because all I did here, you know, super creative of me, all I did was just put in the animal. So I— animal 1, drag that in there. Animal 2, drag that in there. 3 and 4. And so that's how we have tiger, bear, rhino, pig. We have all these different files. And basically it knows to use this template and make a video for us, which is cool. So the video obviously takes a little bit to render. So it takes like about 10 seconds from my experimentation. I set it to 25 just to be safe. You can come into your Creatamate and click on API log, and you can see all the templates that we've done. So this was the most recent one, the cyberpunk one with the tiger. And then all you have to do once again is we're just going to be making a GET request. We don't need any authorization. So it's literally just a GET request where we feed in the URL. That comes from Creatomate. So if I go back to the render video, we get a response with the URL right here, and this is the final video. So all we're doing is we're dragging in that URL from the node render video, or you could just do it from the wait node because it passes everything over. And we dragged in the final video URL right here, and then we're able to view it. And we got the— sorry, that is awful sound, really should rework that prompt. But now we have that final video right here and edit in. As binary data for us to pass through to the YouTube API. So that's the next step. Right here we have the upload video operation to YouTube. You will fill out this credential the same way that you did with your Google Drive, where you have to get your client ID and your client secret. But if you've already made that, you're good to go. And then once you're good there, all you have to do is basically fill out a few things. So the first one is a title. For title, I went to schema, I went all the way back down, and I dragged in the title. For description, which is a field that you have to add, there's tons of options down here. I added an option for description, and that's the caption, and I dragged in the caption. And then you just fill in like, you know, your region code, your category name or ID, which I did film and animation. There's one down here for Shorts, and I tried that and it errored. And, um, because we're sending over an aspect ratio of 9:16, YouTube automatically makes it a Short. As you saw earlier when I clicked into my Shorts, these are all already here as Shorts. But, um, Yeah, so you can play around with the different categories. We're dragging in once again the input binary field is data, so we have data right here, which is our video, as you remember. Sorry about that. Um, and so then the final thing you want to do is privacy status unlisted. I accidentally made one public from my, um, my real Nate Hurk A Automation YouTube channel. So if any of you guys got that notification or saw a short that was about a creepy basement door. That's why. That was an accident. But anyways, this is successful, so it's been uploaded, unlisted. And now the last two things we're doing is just sending a notification and updating the sheet. So when it comes to updating the sheet, we are grabbing that exact same document, the same sheet. We're matching on row number once again like we did earlier. So I grabbed row number 6, and then we're setting the published status to processed because in here we can either be processed or not processed. So we set that to processed And then for the actual video link, we're dragging in the final video which we got from this URL right here. So that's all we do. And then as you can see, it populates all these final links over here. And then from there, the last thing is really just sending ourselves an email notification just in case you have this running at like 6 AM every day and you can wake up, you'll see an email that it was unlisted, then you can go in there and check and make sure you like it. But anyways, I've pretty much just filled this stuff. I filled in the email I've made it fixed because I'm always going to be sending this to me. We have, um, the title where I put New Short Processed, and I dragged in the title of the short from the Google Sheet, changed the email type to text, and then I made a quick body which just says, hey Nate, a new short has been created and is awaiting your approval. It is called blank. And then I dragged in my just URL from my YouTube Studio where it shows my shorts, and that way I could just click right into it from the email. And then I said cheers. So the last thing we did is we added an option called Append N8N Attribution, and I turned that off just so at the end of the email, you know, if you don't turn it off, there'll be a message right here that says this message was sent by N8N. So just turn that off to clean it up, and that is the end of the process. Okay, so just to recap now, a couple things. So the first one is this template is a really good starting point, but you have so much stuff that you can do to expand on top of it. For example, you can optimize these prompts. You can then make it send over 8 videos and 8 images rather than just 4. So you can increase the template length rather than making it just 20 seconds. Obviously you can improve the sound agent, you can make the prompts better, you could also do narration instead of just sound effects, all this kind of stuff. You can play around with CLING, you can play around with different image models as well. You can, you can customize the schedule on this. So you can obviously say, hey, I want this to run 4 times a day or 10 times a day, whatever it is. And then the next piece would be making the idea generation within the actual Google Sheet, making that more automated. Because right now I was just talking to ChatGPT and I generated these 5 stories. But what you could do is set up a very similar workflow where you have, um, an agent that is trained on like what you're doing and it can access this database and it will just every day pump out like 5 more. And then once those are pumped out, this workflow will pretty much grab them and create those shorts. So just a couple more things to keep in mind. It's gonna be. Roughly a dollar, maybe a little bit over a dollar per run on this current, you know, 4 images and 4 videos we're generating. Um, ElevenLabs, you'll have probably want to get on the $5 a month starter plan depending on the different models you're using in here. It could either be free or it could be a little more expensive. And then with CreatorMate, right now I'm on the free version, and as you can see, I've only used 36% of my credits, and in my API log, I've done quite a few requests. So Definitely just get in there and play around with it for now. And then you can look at if you actually do want to create this, you know, just a YouTube channel that runs on autopilot, then you'll probably want to obviously upgrade that account. So I know that might have been a lot, but I would really recommend for you to go to the school community and grab this template, import it into your workflow, and then, you know, have it pulled up, but build out this whole workflow on your own. And then you can customize each step, you know, as exactly as you want it and exactly the type of Shorts that you want to create. Once again, you'll be able to have all the resources, the source code for the Creatamate template, the actual template right here for your faceless Shorts, um, that you want to feed through. Because once again, everything right now is mapped to my template. So you need the exact same column names and values if you want this thing to just be able to import and hit test workflow. So just something to keep in mind. But anyways, that's gonna be it for this one. Really appreciate you guys making it to the end of this video. As always, if you enjoyed it or if you learned something new, please give it a like. It definitely helps me out a ton, and I will see you guys all in the next video. Thanks.










