01 · Generate shorts
generateShorts moves youtubeVideoId into options, removes videoSource and adds an empty webhook.
Verify: the intended video reaches a provider-accepted request body.
01 / Client release brief
Swiftia video-to-shorts workflow · A review of the request, status and downstream delivery changes a consultant needs to explain before release.
Self-initiated analysis of historical public source. Pages 1–3 show the documented review and eight full-workflow acceptance cases, all awaiting execution in the target environment. Page 4 adds an isolated n8n execution example under a separate service scope.
generateShorts moves youtubeVideoId into options, removes videoSource and adds an empty webhook.
Verify: the intended video reaches a provider-accepted request body.
renderShort replaces id, target and a computed styling key with shortId and renderOptions.
Verify: current-item ID and styling remain paired; serialized types are accepted.
iscompleted ? changes type = done to the exact comparison status = COMPLETED.
Verify: completion exits polling and reaches metadata generation.
isError ? changes type = error to status = FAILED. Its true branch returns to renderShort.
Verify: repeated render requests follow an agreed stop policy.
Unchanged connections still carry new behavior: FAILED triggers another render POST; a nonmatching completion response loops through Wait1. Before sign-off, establish the provider contract, item pairing and bounded rerender/polling policy, then verify the final upload. The 22-node set is static reachability, not observed runtime impact.
Source: MI, © 2025 · n8n-youtube-to-shorts-workflow · MIT-licensed workflow. Full license.
Before: 5b4f23c → After: 7cd32c2 · Migration commit · Full analysis. Fixtures omit pinned data and export-instance metadata; credential/webhook identifiers are replaced consistently. Original node IDs, parameters and graph are retained.
02 / Requests & completion
Use controlled response fixtures in the target n8n environment. Capture evaluated values and branch outputs; attach evidence by case ID. Confirm the intended provider contract before accepting a payload.
preparingField.videoId = "fixture-video"; videoSource = "youtube".generateShorts JSON body. Require options.youtubeVideoId to contain the source ID, retain functionName: "VideoShorts" and the intended empty webhook. Confirm the provider accepts removal of videoSource.['data.shorts'].id values 42 and 43, each with a distinct styling object.renderShort body per item. Each shortId must come from the corresponding current_item_ref['data.shorts'].id; renderOptions must preserve the intended type and fields. Reject cross-paired IDs or styling..toJsonString(). Evaluate each combination. Record JSON validity and provider-required types; specify which inputs are supported and how unsupported inputs stop.{"status":"COMPLETED"}.isError ? takes false, then iscompleted ? takes true. Continue to metadata generation without another render/poll cycle for that item.Keep credentials out of the evidence packet. Record a redacted evaluated body and an execution reference rather than a credential-bearing request.
03 / Failure, polling & delivery
Establish the retry budget and timeout with the release owner. The exported graph shows cycles; it does not establish a safe runtime limit.
{"status":"FAILED"}.isError ? takes true back to renderShort. Record POST count and item identity. Accept repeat requests only within the agreed retry/stop policy; demonstrate the terminal outcome.{"status":"PENDING"}, then {"status":"COMPLETED"}. PENDING is a synthetic nonmatching value, not an asserted provider state.{}, {"status":null}, {"status":"completed"}, {"type":"done"}, {"type":"error"}.Retry / timeout policy: ________________________________________________________
Decision (proceed / hold / revise): ______________ Open issues: __________________
Release owner: __________________ Reviewer: __________________ Date: __________
04 / Separately scoped executed-checks example
Recommended next step: revise the render payload, then complete target-environment acceptance before rollout. The original expression failed on object-valued styling and on the retry path.
Executed 5 Oct 2026 · n8n 2.41.7 / Node.js 26.10.0. A loopback-only Linux network namespace hosted n8n and a local HTTP mock. Render fixtures use two shorts, numeric IDs 42 and 43, with distinct styling.
Tested slice: original render-loop nodes, expressions and wiring, with synthetic input and service responses, shortened waits, and a terminal recorder replacing metadata and upload. Results below cover that isolated slice; the eight full-workflow cases on pages 2–3 remain Not run.
| Payload / response fixture | POST / GET | Observed result |
|---|---|---|
| Original · object stylingImmediate completion | 0 / 0 | Fail · first request blocked[object Object] makes the JSON body invalid. |
| Original · JSON-encoded stylingFailed → replacement | 1 / 1 | Fail · retry body invalidThe status-response input supplies no styling; execution stops at the second render attempt. |
| Revised · object stylingImmediate completion | 2 / 2 | Pass · 2 terminal outputsIDs and styling stay paired. |
| Revised · object stylingPending → completion | 2 / 4 | Pass · 2 terminal outputsEach short completes after polling. |
| Revised · object stylingFailed → replacement → completion | 4 / 4 | Pass · 2 terminal outputsTwo render attempts per short; IDs and styling stay paired. |
Set renderShort.parameters.jsonBody to an object expression. Read both fields from the paired source item on initial and retry executions:
={{ {
shortId: $('current_item_ref').item.json['data.shorts'].id,
renderOptions: $('current_item_ref').item.json.styling
} }}
Full eight-scenario result record · Reproduce the checks and inspect adaptations · Historical workflow: MI, MIT (source and license on page 1).