This recipe creates a Notion page for every new transcript Scriptube produces from a channel you're tracking â no manual export, no copy-paste. It needs three nodes: a channel batch submission, the official Scriptube trigger, and n8n's Notion node.
It assumes you've already installed n8n-nodes-scriptube and set up the Scriptube API credential â if not, start with n8n-youtube-transcript-automation, the pillar guide for the node.
Step 1: Submit the channel once
Channel transcripts don't appear until you submit the channel as a batch â the trigger only fires on work Scriptube is actually doing. Build a small setup workflow:
- Manual Trigger
- Scriptube > Batch > Create â URLs field:
https://www.youtube.com/@example-channel
Run it once. Channel URLs become their own background batch (available on every plan â see youtube-channel-transcripts-limits-and-costs for cost). You don't need to keep this workflow active; it's a one-time kickoff, or something you re-run manually when you want to pull a channel's new uploads.
Step 2: React to transcript.ready
Build the real automation as a separate, always-on workflow:
[Scriptube Trigger: Transcript Ready] â [Scriptube: Transcript > Get] â [Notion: Create Page]
Add a Scriptube Trigger node, set Event to Transcript Ready, and activate the workflow. n8n registers the webhook for you using the Webhook Secret on your Scriptube API credential â every delivery arrives signature-checked, so nothing fires unless it genuinely came from Scriptube.
The trigger's payload carries data.batch_id, data.item_id, data.video_id, and data.title, plus a short data.transcript_preview (up to 500 characters) â enough to populate a page title immediately without a second call.
Step 3: Pull the full transcript
The trigger's preview is intentionally short. For the full text, add a Scriptube > Transcript > Get node right after the trigger:
- Transcript ID:
{{$json.data.batch_id}}(the batch the item belongs to) - Format: Plain Text (or JSON if you want per-track metadata too)
This calls GET /api/v1/transcripts/{batch_id}/export?format=txt and returns the full transcript text for the batch. If the channel batch has several videos finishing independently, each transcript.ready event still points back at the same batch id â filter the export, or use GET /api/v1/transcripts/{batch_id}?include_metadata=true on the Batch > Get Items operation instead to pull just the one item by data.item_id.
Step 4: Create the Notion page
Add n8n's native Notion node, operation Create Page, pointed at your target database. Map fields from the upstream nodes:
| Notion property | Source |
|---|---|
| Title | {{$('Scriptube Trigger').item.json.data.title}} |
| Video URL | https://www.youtube.com/watch?v={{$('Scriptube Trigger').item.json.data.video_id}} |
| Page body | The plain-text transcript from the Transcript > Get node |
If you'd rather keep the Notion page scannable instead of one long block of text, convert the export to SRT/VTT first and extract just the timestamps you care about â see timestamped-show-notes-from-chapters for a pattern that turns timed segments into structured notes rather than a wall of text.
Keeping it running unattended
Use an API key with read scope for the Transcript > Get step if this workflow never submits new batches itself â only the one-time channel submission in Step 1 needs a full-scope key. Splitting the key like this means a leaked credential on the always-on workflow can't be used to spend credits. See api-keys-scopes-rotation-revocation for the full scope breakdown.
If the channel is large, new uploads will trigger several transcript.ready events close together. n8n queues them and the Notion node processes one item at a time by default, so pages won't collide â just be aware a big backlog (a freshly-submitted 300-video channel, for example) means a burst of pages landing in Notion at once rather than trickling in.
Tracking which channel a page came from
If you're running this recipe against more than one channel, tag each channel's submission with its own External ID in the Batch > Create step (for example notion-sync-example-channel). The value is echoed back in data.batch_id's parent batch and in every webhook for it, so you can filter or branch the Notion-creation workflow by channel instead of running a separate n8n workflow per channel you track.
Avoiding duplicate pages on a re-submit
Be careful about resubmitting the same channel to pick up new uploads: processing always charges, even for a video you already hold, so a repeat submission re-fires transcript.ready for every video in the channel, not just the new ones â and bills for it. Left unguarded, that means a second run of Step 1 creates a duplicate Notion page for every video you'd already synced.
Add an n8n Notion > Search step before Create Page, checking for an existing page with the same video URL, and branch with an IF node to skip creation when one already exists. It's one extra node and it's the difference between an idempotent sync and a channel resubmission silently doubling your Notion database and your credit spend.
Troubleshooting
- No events arrive: confirm the workflow is active (inactive workflows don't hold a registered webhook) and that the channel batch actually has work to do â resubmitting a channel you already fully hold won't produce new
transcript.readyevents for videos you've already processed. - 401 on the webhook: the Webhook Secret in your credential doesn't match what was used at registration â delete and re-add the credential, then reactivate the workflow so it re-registers.
- Notion page created but empty: check that the Transcript > Get node ran before the Notion node in the execution log â a failed export with Continue On Fail enabled will pass an empty item downstream silently.
Full node reference and more recipes: /docs.