n8n YouTube Description Updater – Technical Reference & Configuration Guide
The n8n YouTube Description Updater template automates bulk maintenance of YouTube video descriptions. It reads existing descriptions via the YouTube Data API, isolates the video-specific portion using a configurable delimiter, appends or replaces a standardized footer, updates only those videos where the description has changed, and optionally notifies a Slack channel after each successful update.
This guide is written for users already familiar with n8n concepts such as nodes, credentials, expressions, and workflow execution. It focuses on the architecture of the template, node-by-node behavior, configuration details, and safe rollout strategies.
1. Workflow Overview
The workflow implements a linear, deterministic pipeline for description updates:
- Trigger the workflow (manual or scheduled).
- Load configuration for the splitter and standardized footer.
- Retrieve a set of videos from a YouTube channel.
- Generate a new description for each video using an n8n expression.
- Compare the new description with the existing one.
- Update the video on YouTube only when a change is detected.
- Notify a Slack channel about successful updates.
The core pattern is a splitter-based description rewrite: the workflow preserves all content before a unique delimiter and redefines everything after it as a shared footer. This ensures per-video content remains intact while maintaining a consistent call-to-action and link section across your entire channel.
2. Architecture & Data Flow
2.1 High-level node sequence
- Manual Trigger – initiates the workflow run.
- Config – stores the delimiter (
splitter) and standardized footer (description). - List Videos – uses the YouTube API to fetch video metadata, including existing descriptions.
- Generate Description – computes the new description string using an n8n expression.
- Description Changed (If) – evaluates whether the generated description differs from the original.
- Update Video Description – calls the YouTube
videos.updateendpoint to persist the new description. - Notify Slack – sends a message to a Slack channel summarizing the update.
2.2 Data propagation
The typical data path for each item (video) is:
- List Videos outputs
snippet.descriptionandidfor each video.- Generate Description reads:
- Existing description from
$json.snippet.description. - Splitter and standardized footer from the Config node via
$('Config').
- Existing description from
- Description Changed (If) compares:
- Original description from List Videos.
- New description generated in the previous node.
- Update Video Description consumes:
videoIdfrom List Videos.- New description from Generate Description.
- Notify Slack receives:
- Metadata about the updated video (for example title, ID, URL) to construct a human-readable message.
Each node operates on items in sequence, so the workflow scales to handle multiple videos in a single run while preserving item-level context.
3. Core Expression for Description Generation
3.1 Expression logic
The Generate Description node uses an n8n expression to reconstruct the description based on a splitter and a standardized footer. The expression in the template is:
= {{ $json.snippet.description.split($('Config').item.json.splitter)[0] }}{{ $('Config').item.json.splitter }}
{{ $('Config').item.json["description"] }}
3.2 Behavior breakdown
- Splitting the existing description
$json.snippet.description.split($('Config').item.json.splitter)[0]- Reads the current description from the YouTube
snippet.descriptionfield. - Splits the string using the configured
splitterfrom the Config node. - Takes the first element of the resulting array (
[0]), which corresponds to all text before the splitter.
- Reads the current description from the YouTube
- Reinserting the splitter
{{ $('Config').item.json.splitter }}- Appends the same splitter string back into the description after the preserved video-specific content.
- Appending the standardized footer
{{ $('Config').item.json["description"] }}- Appends the standardized footer text defined in the Config node.
- This footer typically includes global CTAs, links, social profiles, and other shared information.
3.3 Edge cases to consider
- No splitter present in the original description If the splitter is not found,
split()returns an array with the full description as the first element. The workflow then treats the entire existing description as the “pre-splitter” section and appends the splitter and footer. This is usually acceptable for first-time runs but is worth verifying on test videos. - Multiple occurrences of the splitter Only the text before the first occurrence is preserved. Any content after the first splitter is discarded and replaced by the standardized footer. Use a unique delimiter to avoid accidental matches inside normal text.
- Empty or missing description If a video has an empty description, the pre-splitter part is an empty string. The workflow will then produce a description that consists of the splitter followed by the standardized footer.
4. Setup & Configuration Steps
4.1 Configure YouTube credentials
The workflow authenticates with the YouTube Data API using a YouTube OAuth2 credential in n8n. This credential is required for both reading and updating video metadata via videos.get and videos.update.
- Create a Google OAuth client in the Google Cloud Console with appropriate YouTube scopes.
- In n8n, add a new credential of type Google OAuth2 following the official documentation: n8n Google credential docs.
- Assign this credential to the YouTube nodes in the template (for example the List Videos and Update Video Description nodes).
Note: Use the smallest set of OAuth scopes needed to modify YouTube videos and ensure only trusted users can access or modify this credential in n8n.
4.2 Configure the Config node
The Config node centralizes the two key parameters used across the workflow:
- splitter A unique delimiter that separates per-video content from the standardized footer.
- Example:
--- n8ninja --- - Choose a string that is highly unlikely to appear in normal text to avoid unintended splits.
- Example:
- description The standardized footer that will be appended to every processed video.
- Typical contents: CTAs, website link, “Try n8n for free” link, social handles, template credits, or legal notes.
Adjust these values directly in the node so that other nodes can reference them through the $('Config') expression.
4.3 Initial testing with Manual Trigger
The template ships with a Manual Trigger node. Use it for controlled testing:
- Open the workflow in n8n and leave the trigger as Manual.
- Run the workflow on a small sample of videos, ideally:
- A single unlisted video, or
- A small subset filtered via the List Videos node.
- Inspect the output of the Generate Description node to confirm that:
- The pre-splitter content is preserved correctly.
- The splitter and footer are appended as expected.
- Verify that the YouTube video description is updated exactly as intended.
4.4 Scheduling or running on demand
Once you are satisfied with the behavior:
- Replace the Manual Trigger node with a Cron node if you want periodic execution, for example:
- After policy changes.
- When starting or ending a campaign.
- On a weekly or monthly maintenance schedule.
- Alternatively, keep the Manual Trigger and run it on demand for ad hoc updates.
5. Node-by-Node Breakdown
5.1 Manual Trigger
Purpose: Start the workflow only when explicitly invoked from the n8n UI or via an API call.
- Used primarily during development, staging, or one-off update runs.
- Can be replaced later by a Cron or other trigger (for example Webhook) when automation is stable.
5.2 Config
Type: Typically a Set node or similar configuration node.
Fields:
splitter– custom delimiter string.description– standardized footer text.
Usage:
- Other nodes access these values using
$('Config').item.json.splitterand$('Config').item.json["description"]. - Centralizing configuration here simplifies maintenance when you need to update the footer or change the delimiter.
5.3 List Videos
Purpose: Retrieve a list of videos from your YouTube channel using the YouTube Data API.
Key behaviors:
- Uses the configured YouTube OAuth2 credential.
- Returns video metadata, including:
id(videoId).snippet.title.snippet.description.
Filtering options (recommended):
- Limit results by:
- Date range.
- Playlist ID.
- Search query or keywords.
- Restricting the scope of this node helps:
- Control which videos are updated.
- Manage API quota usage.
- Reduce risk during initial deployment.
5.4 Generate Description
Purpose: Construct the new description for each video using the splitter pattern and standardized footer.
Implementation details:
- Uses the expression described in section 3.
- Preserves content before the splitter from the existing description.
- Re-inserts the splitter and appends the standardized footer from Config.
Outcome:
- Produces a new description string that will be compared against the original and potentially sent to the YouTube API.
5.5 Description Changed (If)
Type: If node.
Purpose: Prevent unnecessary updates and conserve API quota by only proceeding when the description has actually changed.
Behavior:
- Compares:
- Original description from List Videos (for example
$json.snippet.description). - New description generated in Generate Description.
- Original description from List Videos (for example
- If the two values differ, the item follows the “true” branch and continues to the update node.
- If they are identical, the item is filtered out and no update call is made.
Benefits:
- Reduces API calls to
videos.update. - Prevents redundant writes and keeps version history cleaner.
5.6 Update Video Description
Purpose: Persist the new description to YouTube using the videos.update endpoint.
Key configuration aspects:
- Uses
videoIdfrom List Videos as the target video. - Writes the new description computed by Generate Description into the
snippet.descriptionfield. - The template also includes
categoryIdandregionCode:- These values are set in the node configuration.
- Review and adjust them if your channel uses different categories or regions.
Error handling considerations:
- Failures at this node can result from:
- Insufficient OAuth scopes or revoked access.
- Quota limits or API errors.
- Invalid or missing
videoId.
- Monitor node execution logs in n8n to detect and resolve such issues.
5.7 Notify Slack
Purpose: Inform your team whenever a video description is successfully updated.
Behavior:
- Runs only for items that passed the Description Changed check and were successfully updated.
- Posts a message to a specified Slack channel using a configured Slack credential.
- The message can include:
- Video title.
- Video URL or ID.
- Timestamp or other metadata.
Customization:
- Adjust the Slack message format to:
- Tag specific team members.
- Include links to internal documentation.
- Provide a summary of what changed.
6. Best Practices & Operational Tips
- Use a highly unique splitter Choose a delimiter that does not occur naturally in your descriptions to avoid truncating legitimate content.
- Start with a small test set Run the workflow on a single unlisted video or a small subset before applying it to your full library.
- Respect YouTube API quotas Process videos in batches and schedule runs during off-peak hours when possible.
- Maintain backups Before updating, consider writing the
