Help
Troubleshooting
Start with the row’s error column and the error_log tab (time, workflow, execution URL, failed node, message). Open that execution in n8n and inspect the red node.
#Import and credentials
Nodes show “credential not found” or REPLACE_ME.
Expected after import. Open each Sheets or HTTP node and select the credential you created in setup. Header Auth names must be exact: x-api-key for JSON2Video, Authorization with a Bearer prefix for Zernio and OpenRouter.
Google Sheets 403 or “The caller does not have permission”. The OAuth account cannot see the Sheet. Share the Sheet with that Google account, or recreate the credential with the owner account. On self-hosted n8n, a Testing OAuth client’s refresh token can die after 7 days — re-consent or publish the Google Cloud app.
Form submits but no row appears.
The workflow is not published (a production form URL only works when the workflow is active). During tests use Execute workflow and the Test URL. Check Normalize Form Row: the clip must start with http:// or https://. Check Append Queue Row’s error output and the Error Page.
#JSON2Video render
Create returns 401 / quota. The key is wrong, or the plan is out of credits. Official 401: exceeded movies in the plan, or resolution larger than the plan allows.
Create returns 400 and mentions settings.
Subtitle settings only accepts the official closed list (style, word-color, line-color, box-color, outline-color, font-family, font-size, and the other documented keys). A key like color is rejected. Edit Config subtitle_settings and keep it valid JSON.
Render stays running until failed / poll limit.
Default 40 × 10 s is about 6–7 minutes. Longer clips need a higher poll_max_attempts. Official client-side timeout is also treated as fatal. Check render_message on the failed execution.
preview_url worked yesterday and now 404s.
JSON2Video deletes the MP4, thumbnail, and ass file after 7 days. Approve and post inside that window, or re-queue the clip to render again.
Captions missing or wrong language.
The subtitles element must be at movie level (the workflow already does this). Unclear audio transcribes poorly. Set subtitle_language to a supported code (for example en) instead of auto. Add keywords only if you use whisper or deepgram. Word highlighting needs auto-transcription or an ASS file with word timings — not a plain SRT.
The output is 25 fps, not 30.
Official movie docs: fps is accepted but every movie currently renders at 25 fps. YouTube Shorts still accept this.
Two charges / two projects for one row.
POST /v2/movies is not idempotent. The workflow saves json2video_project and will resume a rendering row instead of creating again. Do not manually set a row back to queued while a project is still running. If a crash happened after create but before Save Project ID (rare), a new create can start — check the JSON2Video dashboard and set the row to rendering with the existing project id to resume.
Signed clip URLs expire mid-render. JSON2Video downloads media during the render, not at submit time. Give signed URLs enough lifetime, or use a stable public URL.
#Titles (OpenAI / OpenRouter)
401 on Draft Metadata.
Wrong credential, or llm_provider does not match the node that ran (set openai or openrouter in Config). Plus/Pro chat subscriptions are not API keys.
Empty or broken title, but the preview looks fine.
Parse Metadata falls back to the topic or “Untitled Short”. Check the LLM node output for a non-JSON reply or a rate-limit error. The row is still awaiting_approval, so you can type a title by hand before approving.
#Zernio / YouTube
Post never runs.
Status must be exactly approved. preview_url and title must be non-empty. Typo statuses are skipped.
201/207 but no public Short.
Default visibility is private. Open YouTube Studio. For a scheduled public post, Zernio uploads early as private and lets YouTube release it at scheduledFor.
YouTube did not treat it as a Short.
Official rule: duration ≤ 3 minutes and vertical or square. Confirm duration_sec and that the file is 1080×1920. There is no Shorts flag to send.
Views blocked or a policy warning about kids / synthetic media.
Always send madeForKids (the workflow does). Set contains_synthetic_media to true on the row or in Config when it applies.
409 or a duplicate post.
Zernio Idempotency-Key is the row id (24-hour window). Identical content to the same account within 24 hours can also 409. Change the id only if you truly want a second post.
Custom thumbnail missing on a Short.
Zernio documents Shorts custom thumbs (verified 1 November 2026) only on phone-verified channels. The workflow sends mediaItems[].thumbnail when thumbnail_url is present.
#Scheduling and time zones
Scheduled time feels an hour off.
A scheduled_at without Z or an offset is read in Config timezone (default Asia/Taipei). Use an offset (2026-11-15T18:00:00+08:00) if you want to be explicit. The Wait node itself always uses n8n server time for intervals; that does not affect Zernio’s scheduledFor.
#n8n Cloud vs self-hosted
This pack does not use Execute Command. If you installed a different ffmpeg-based workflow, remember Execute Command is disabled by default on 2.47.3 (NODES_EXCLUDE) and is not available on Cloud. That does not apply here.