How to Batch Generate On-Brand YouTube Titles and Descriptions from a Video Brief
Upload a CSV of upcoming video briefs and let a Spojit workflow loop through each row, draft an on-brand title, description, and tag set with an Agent-mode Connector node grounded in your brand voice, then return a finished CSV of metadata drafts you can paste straight into YouTube.
What This Integration Does
As a creator, naming videos and writing descriptions is the unglamorous tax on every upload. You already know the topic and the angle from your planning doc, but turning a one-line brief into a click-worthy title, a structured description with timestamps and calls to action, and a clean tag list takes real time, and it drifts off-brand when you are tired or rushing. This workflow takes a spreadsheet of briefs (one row per upcoming video) and produces a polished metadata draft for every row in a single run, written in a voice that matches your channel. You stay in control: Spojit hands you drafts to review and upload, it does not post anything to YouTube on your behalf.
The run model is simple and repeatable. You start it yourself with the Run button (a Manual trigger), passing in the CSV text of your briefs. A Connector node on the csv connector parses the CSV into rows, a Loop node walks each row, and inside the loop an Agent-mode Connector node drafts the title, description, and tags. A Knowledge node in Query mode pulls your brand-voice rules into each draft so the tone stays consistent across the whole batch. After the loop, a Transform node and the csv connector rebuild everything into one downloadable CSV. The workflow holds no state between runs: every run is a fresh batch driven entirely by the CSV you pass in, so re-running with a corrected sheet simply produces a new, clean output.
Prerequisites
- A Spojit workspace where you can open the Workflow Designer and create a new workflow.
- A persistent Knowledge collection holding your brand-voice guide: tone, banned words, title style, description structure, hashtag conventions, and a few example titles you love. See the guide on creating a collection linked below if you have not built one yet. Note the collection name; you will select it in the Knowledge node.
- A CSV of video briefs with a stable header row. This tutorial assumes columns
topic,angle,audience, andkeywords, but you can use your own as long as you reference the same column names in the agent prompt. - The csv, json, and text connectors are built-in utilities (no connection or auth needed), so nothing to set up there.
Step 1: Start with a Manual trigger and supply the briefs
Create a new workflow and leave the Trigger node as Manual. A Manual trigger runs from the Run button, and its output is whatever request body you pass in. Plan to pass your spreadsheet as a single CSV string under a field named csvText, so the trigger output looks like this:
{
"csvText": "topic,angle,audience,keywords\nBudget travel in Japan,Save money without missing the highlights,first-time visitors,japan travel;budget tips\nBest mirrorless cameras 2026,Honest picks under 1500,hobbyist creators,camera review;mirrorless"
}
You will reference this later as {{ trigger.csvText }}. When you run the workflow you paste the CSV text into the run dialog. Keep the header row intact; the column names drive everything downstream.
Step 2: Parse the CSV into rows with the csv connector
Add a Connector node in Direct mode on the csv connector and select the parse tool. Direct mode is deterministic and costs no AI credits, which is exactly what you want for a predictable parse. Map the input to your trigger field:
{
"csv": "{{ trigger.csvText }}",
"header": true
}
With header set to true, each parsed record becomes an object keyed by your column names (topic, angle, audience, keywords). Save the node output to a variable such as rows so you can iterate it next. If you want to sanity-check the shape before building the loop, you can temporarily add a Connector node on the csv connector using the info tool, which reports row and column counts.
Step 3: Loop over every brief
Add a Loop node set to ForEach and point it at the parsed rows, for example {{ csv_parse.data }} (use whatever variable name your parse step produced). Each pass exposes the current row, which you reference inside the loop as the loop item, for example {{ item.topic }}, {{ item.angle }}, {{ item.audience }}, and {{ item.keywords }}. Everything in the next two steps lives inside this loop body so it runs once per video brief. Keep the per-row work lean: a single Knowledge query and a single agent call per row keeps the batch fast and predictable.
Step 4: Pull brand-voice guidance with a Knowledge node in Query mode
Inside the loop, add a Knowledge node in Query mode. Set Collection to your persistent brand-voice collection, set Result Count to around 4, and write a Prompt that fetches the rules most relevant to this specific brief so the agent only gets what it needs:
Brand-voice rules for a YouTube video about "{{ item.topic }}"
for {{ item.audience }}. Include title style, description
structure, banned words, and hashtag conventions.
Choose a synthesis Model for the query, and save the result to an Output Variable such as brandVoice. This Knowledge node, not Miraxa, is the part of the workflow that reads your brand guide at run time; Miraxa is the chat surface you use while building and debugging this workflow, and you can ask it to scaffold these nodes for you. To learn the query options in depth, see the Knowledge nodes guide linked below.
Step 5: Draft the metadata with an Agent-mode Connector node
Still inside the loop, add a Connector node in Agent mode. Agent mode lets the agent reason over the brief and the retrieved brand voice, and its Response Schema forces clean JSON so the rest of the workflow can rely on the shape. Use the text connector (its tools like truncate, count-chars, and slugify are useful for enforcing length limits and tag formatting) so the agent has utilities on hand. Write a prompt that feeds in the row and the brand voice:
Draft YouTube metadata for this video.
Topic: {{ item.topic }}
Angle: {{ item.angle }}
Audience: {{ item.audience }}
Target keywords: {{ item.keywords }}
Brand voice rules to follow exactly:
{{ brandVoice }}
Write a title under 70 characters, a description of 3 to 5
short paragraphs ending with a call to action, and 8 to 12
lowercase tags. Stay on-brand and avoid clickbait.
Set the Response Schema so the output is reliable:
{
"type": "object",
"properties": {
"title": { "type": "string" },
"description": { "type": "string" },
"tags": { "type": "array", "items": { "type": "string" } }
},
"required": ["title", "description", "tags"]
}
Save the structured result to a loop variable such as draft. If you want the agent to do real format work (for example normalizing tags), it can call the text connector tools itself; if you prefer determinism, format after the loop instead.
Step 6: Reshape each row with a Transform node
Still inside the loop, add a Transform node to flatten each draft plus its source brief into one flat record ready for a spreadsheet. The tags array needs to become a single cell, so join it with the text connector join tool (delimiter , ) or inline in the Transform. Produce a row shaped like this:
{
"topic": "{{ item.topic }}",
"title": "{{ draft.title }}",
"description": "{{ draft.description }}",
"tags": "{{ draft.tags }}"
}
Collect these flattened records as the loop output so you end the loop with an array of finished metadata rows.
Step 7: Build the finished CSV and return it
After the loop, add a Connector node in Direct mode on the csv connector and select the from-json tool to turn the array of row objects into CSV text. Map its input to the collected loop output, for example:
{
"json": "{{ loop.results }}",
"header": true
}
This emits a single CSV with a header row and one line per video, columns topic, title, description, and tags. If you would rather inspect the data as structured output too, run the json connector prettify tool on the array first. To get the file off the platform, you can pipe the CSV into a Send Email node body, or attach it and email it to yourself, so the finished metadata batch lands in your inbox ready to upload.
Tips
- Keep brand-voice rules in a persistent Knowledge collection, not embedded per run, so every workflow you build can read the same guide and you update tone in one place.
- Use the Response Schema on the Agent-mode node religiously. Forcing
title,description, andtagsmeans the Transform and CSV steps never break on a stray sentence of prose. - Enforce the YouTube title limit downstream with the text connector
truncateorcount-charstool so an over-long title never reaches your CSV. - Scaffold the whole canvas fast by describing it to Miraxa (for example, "add a Loop over the parsed rows with an Agent-mode Connector node inside"), then fine-tune each node in the properties panel.
Common Pitfalls
- Mismatched column names: if your CSV header says
Topicbut your prompt references{{ item.topic }}, the value comes back empty. Keep header casing and the variable references identical. - Forgetting
header: trueon the csvparsetool leaves you with positional arrays instead of named fields, and the loop references break. - Tags arriving as an array land oddly in a CSV cell. Join them to a string before the
from-jsonstep, or downstream tools will stringify them with brackets. - Querying the brand-voice collection with a different embedding model than it was embedded with returns weak matches. Always embed and query a collection with the same embedding model.
Testing
Before running a full slate, test with a two-row CSV covering two very different topics. Run the workflow from the Run button, then open the execution in the run history and step through each node: confirm the csv parse output has named fields, that the Loop ran twice, that the Knowledge node returned relevant brand-voice text for each row, and that the Agent-mode node produced valid JSON matching your Response Schema. Check that the final CSV opens cleanly in a spreadsheet with one row per video. Once two rows look on-brand and correctly shaped, scale up to your real batch.