Alchemy RecipeIntermediateworkflow

AI-powered SaaS user onboarding video series from feature documentation

Published

Creating onboarding videos for SaaS products is tedious work. You need to capture feature screenshots, write scripts, generate voiceovers, animate the content, and stitch everything together. Most teams do this manually, which means weeks of back-and-forth between product, design, and video teams. If your product updates frequently, you're essentially rebuilding your entire onboarding library each quarter.

The real opportunity sits at the intersection of three underrated tools: ElevenLabs handles text-to-speech with natural-sounding voices, Hour One generates avatar-based videos from scripts, and Widify turns static documentation into structured, explorable content. When you wire these together with an orchestration platform, you can feed feature documentation into one end and get polished onboarding videos out the other, with zero manual handoff....

This workflow is particularly useful for B2B SaaS companies that update features monthly or more frequently. Rather than maintaining a sprawling video production process, you can automate the entire pipeline. Documentation changes trigger the workflow, and new onboarding videos are ready within hours. This post walks through the specific configuration, API calls, and orchestration setup you need.

The Automated Workflow

Overview of the Flow

The workflow operates in five stages: documentation extraction, script generation, voiceover creation, video generation, and distribution. Here is what happens at each step:

  1. New or updated documentation is detected (via webhook or scheduled check)
  2. Widify parses the documentation and structures it into clear feature descriptions
  3. Claude or GPT generates a natural onboarding script from the structured content
  4. ElevenLabs converts the script into a professional voiceover with your chosen voice
  5. Hour One creates an avatar-led video using the script and audio
  6. The final video is saved to your distribution channel (Vimeo, S3, or internal server)

For this intermediate workflow, I recommend n8n as your orchestration tool. It has strong native support for HTTP requests, file handling, and conditional logic. Zapier works but is less flexible for complex data transformation. Make (Integromat) is solid but slower at webhook processing.

Step 1: Trigger on Documentation Changes

The workflow starts by monitoring your documentation. Most SaaS platforms store docs in Notion, Confluence, or a custom CMS. For this example, I'll assume Notion.

Set up an n8n webhook that listens for POST requests from your documentation pipeline. When a new feature doc is published, your CMS or Notion integration sends a webhook payload like this:


POST https://n8n.yourinstance.com/webhook/documentation-trigger

{
  "feature_id": "feature_auth_mfa",
  "feature_name": "Multi-Factor Authentication",
  "documentation_url": "https://docs.yourapp.com/features/mfa",
  "documentation_text": "Multi-Factor Authentication adds a second layer of security...",
  "updated_at": "2024-01-15T10:30:00Z"
}

Alternatively, use n8n's Notion integration to schedule a daily or weekly check that pulls all updated pages from a "Video Queue" database. This is more reliable if your CMS doesn't support webhooks.

Step 2: Parse Documentation with Widify

Widify extracts structured data from unstructured documentation. You send raw documentation text and receive back a JSON object with clear sections: overview, key features, setup steps, and use cases.

Call the Widify API in n8n using an HTTP Request node:


POST https://api.widify.io/v1/parse

{
  "content": "{{ $json.documentation_text }}",
  "content_type": "markdown",
  "extract_sections": true
}

This returns something like:


{
  "overview": "Secure your account with MFA. Require a second factor...",
  "key_features": [
    "TOTP app support",
    "SMS backup codes",
    "Hardware key support"
  ],
  "setup_steps": [
    "Navigate to Security Settings",
    "Click Enable MFA",
    "Choose authentication method",
    "Scan QR code or enter backup codes"
  ],
  "estimated_completion_time": 5,
  "sections": [...]
}

Step 3: Generate Onboarding Script

Use Claude (via API) or GPT-4 to generate a natural script suited for video voiceover. The script should be conversational, concise, and structured in 60-90 second segments (roughly 150-200 words).

In n8n, add an HTTP Request node calling Claude:


POST https://api.anthropic.com/v1/messages

{
  "model": "claude-3-sonnet-20240229",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "Write a 90-second onboarding script for a SaaS onboarding video. The script should introduce the feature, explain its benefits, and show basic setup. Use conversational language suitable for voiceover. Feature: {{ $json.feature_name }}. Details: {{ $json.overview }}. Key features: {{ $json.key_features.join(', ') }}. Setup steps: {{ $json.setup_steps.join('. ') }}."
    }
  ]
}

Claude returns a natural, ready-to-read script. Here is an example output:


"Hey there. Let me show you how to set up multi-factor authentication in just a few minutes. Multi-factor authentication, or MFA, adds an extra security layer to your account. Even if someone gets your password, they still can't access your account without a second factor. We support TOTP apps like Google Authenticator, SMS backup codes, and hardware keys. To get started, head to your Security Settings. Click Enable MFA, then choose your authentication method. If you're using an authenticator app, scan the QR code or enter the backup codes manually. That's it. You're now protected."

Step 4: Generate Voiceover with ElevenLabs

ElevenLabs converts the script into natural speech. You can choose from hundreds of pre-built voices or clone your own voice. For professional onboarding, I recommend their "premium" voices like "Rachel" or "Marcus" which sound natural and authoritative.

Configure an n8n HTTP Request node:


POST https://api.elevenlabs.io/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM

{
  "text": "{{ $json.script }}",
  "model_id": "eleven_monolingual_v1",
  "voice_settings": {
    "stability": 0.5,
    "similarity_boost": 0.75
  }
}

Note: 21m00Tcm4TlvDq8ikWAM is the voice ID for "Rachel". Replace with your chosen voice ID. Set stability to 0.5 for natural variation, and similarity_boost to 0.75 for clarity.

The API response includes binary audio data. Save this to a temporary location (use n8n's file handling or upload directly to S3 for processing in the next step).

Step 5: Generate Video with Hour One

Hour One creates a video with an animated avatar speaking your script. The API accepts a script and returns a video URL you can download or embed.

Add an HTTP Request node in n8n:


POST https://api.hourone.com/api/videos

{
  "script": "{{ $json.script }}",
  "avatar_id": "alice",
  "audio_url": "{{ $json.audio_url }}",
  "title": "{{ $json.feature_name }} - Onboarding",
  "background": "office",
  "quality": "1080p"
}

Hour One accepts several avatar options: alice, bob, maya, james. The audio_url should point to your ElevenLabs voiceover (either from S3 or a temporary signed URL). Processing takes 10-15 minutes. Hour One returns a webhook callback when the video is ready.

Configure n8n to listen for Hour One's completion webhook:


POST https://n8n.yourinstance.com/webhook/video-complete

{
  "video_id": "vid_12345678",
  "status": "completed",
  "video_url": "https://videos.hourone.com/vid_12345678.mp4",
  "duration": 94,
  "created_at": "2024-01-15T11:45:00Z"
}

Step 6: Save and Distribute

Once the video is ready, download it and store it in your distribution system. Most teams use Vimeo (for embedded players), AWS S3 (for CDN delivery), or a custom video server.

Use n8n to download the video and upload to S3:


POST https://s3.amazonaws.com/your-bucket/onboarding-videos/{{ $json.feature_id }}.mp4

{
  "source_url": "{{ $json.video_url }}",
  "metadata": {
    "feature_id": "{{ $json.feature_id }}",
    "feature_name": "{{ $json.feature_name }}",
    "created_at": "{{ now }}",
    "duration": "{{ $json.duration }}"
  }
}

Then, optionally trigger downstream actions: update your docs with an embedded video link, send a Slack notification to your product team, or add the video to a user-facing library.

Complete n8n Workflow Configuration

Here is a simplified JSON representation of the complete n8n workflow:


{
  "nodes": [
    {
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "documentation-trigger",
        "httpMethod": "POST"
      }
    },
    {
      "name": "Parse with Widify",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "method": "POST",
        "url": "https://api.widify.io/v1/parse",
        "body": "{\"content\": \"{{ $json.documentation_text }}\", \"extract_sections\": true}"
      }
    },
    {
      "name": "Generate Script",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "method": "POST",
        "url": "https://api.anthropic.com/v1/messages",
        "headers": {"x-api-key": "{{ $env.CLAUDE_API_KEY }}"}
      }
    },
    {
      "name": "Create Voiceover",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "method": "POST",
        "url": "https://api.elevenlabs.io/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM",
        "headers": {"xi-api-key": "{{ $env.ELEVENLABS_API_KEY }}"}
      }
    },
    {
      "name": "Generate Video",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "method": "POST",
        "url": "https://api.hourone.com/api/videos",
        "headers": {"Authorization": "Bearer {{ $env.HOURONE_API_KEY }}"}
      }
    },
    {
      "name": "Wait for Video Completion",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "video-complete",
        "httpMethod": "POST"
      }
    },
    {
      "name": "Upload to S3",
      "type": "n8n-nodes-base.aws",
      "parameters": {
        "resource": "s3",
        "operation": "upload",
        "bucketName": "{{ $env.AWS_BUCKET }}",
        "fileName": "onboarding-videos/{{ $json.feature_id }}.mp4"
      }
    }
  ],
  "connections": {
    "Webhook Trigger": [["Parse with Widify"]],
    "Parse with Widify": [["Generate Script"]],
    "Generate Script": [["Create Voiceover"]],
    "Create Voiceover": [["Generate Video"]],
    "Generate Video": [["Wait for Video Completion"]],
    "Wait for Video Completion": [["Upload to S3"]]
  }
}

The Manual Alternative

If you prefer human oversight at certain points, adjust the workflow to add approval gates. After Step 3 (script generation), route the script to a Slack channel for review. A team member approves or edits the script, and only then does n8n proceed to voiceover creation.

Add a Slack node after script generation:


POST https://slack.com/api/chat.postMessage

{
  "channel": "#video-approvals",
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*New Onboarding Script Ready for Review*\n\nFeature: {{ $json.feature_name }}\n\n{{ $json.script }}"
      }
    },
    {
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": {"type": "plain_text", "text": "Approve"},
          "value": "approve"
        },
        {
          "type": "button",
          "text": {"type": "plain_text", "text": "Reject"},
          "value": "reject"
        }
      ]
    }
  ]
}

The workflow waits for button interaction before continuing. This adds human review without stopping the entire pipeline; reviewers can check scripts daily in batch.

Pro Tips

Manage Rate Limits Across APIs

ElevenLabs throttles at 10,000 characters per minute on free plans. Hour One queues videos during high traffic periods. To avoid hitting limits, add deliberate delays between requests. In n8n, insert a "Wait" node set to 30 seconds between voiceover creation and video generation. This prevents queueing bursts.

Monitor your API usage via each service's dashboard, and configure n8n to retry failed requests with exponential backoff:


{
  "retry_policy": {
    "max_attempts": 3,
    "backoff": "exponential",
    "initial_delay_ms": 1000
  }
}

Handle Script Tone Variation

Different features need different tones. A compliance feature should sound formal; a design tool feature should sound creative. Add a tone parameter to your Claude prompt, controlled by metadata in your documentation trigger. For instance:


"Tone: {{ $json.tone || 'professional' }}"

Set tone to "professional", "friendly", "technical", or "casual" based on your feature type. This keeps videos cohesive across your product without manual intervention.

Monitor Video Quality

Hour One's output quality varies with avatar choice and background complexity. Test all avatar options with your preferred voice and save the best combination. Some avatars animate more naturally than others; document which works best for your brand.

Also request 1080p video quality in your Hour One request, as mobile viewing is increasingly common. Lower resolutions (720p) save processing time but look poor on modern screens.

Cache Generated Assets

If the same feature documentation is processed multiple times (e.g., daily triggered checks), cache the generated voiceover and script. Store these in a simple n8n database node or external cache (Redis) keyed by feature_id and documentation hash. This saves API costs if documentation hasn't changed.


cache_key = md5(feature_id + documentation_text)
if cache.exists(cache_key):
  use cached_script, cached_audio
else:
  generate new script and audio
  cache.set(cache_key, script, audio)

Test the Workflow with Dry Runs

Before enabling live triggers, test the entire pipeline with sample documentation. Use n8n's "Execute Workflow" button to run through each step manually. Check the output at each stage: Does Widify extract the right sections? Does Claude generate a coherent script? Does ElevenLabs produce clear audio? Does Hour One render the video properly? Only after confirming all outputs should you enable automatic triggers.

Cost Breakdown

ToolPlan NeededMonthly CostNotes
ElevenLabsPay-as-you-go (after free tier)£5–£99 depending on volume11,000 characters free monthly; ~£0.003 per 1,000 characters thereafter
Hour OnePro or Custom£49–£299Pro includes 30 videos/month; custom for higher volumes
WidifyProfessional£29–£79Professional tier needed for API access; 10,000 documents/month included
Claude APIPay-as-you-go£0.50–£5 depending on usage~£0.003 per 1K input tokens; script generation typically uses 500–1,000 tokens
n8nSelf-hosted or Cloud£0–£120Self-hosted is free but requires DevOps; Cloud Pro is £120/month for reliability
AWS S3 (video storage)Standard£0.023 per GB stored10 videos at 50MB each costs ~£0.01/month; bandwidth varies
Total for small teamAll included~£110–£200Scales well for 5–20 videos/month

This workflow is most cost-effective for teams producing 10+ onboarding videos per month. Below that, manual production may be cheaper. Beyond 50 videos/month, negotiate custom pricing with Hour One and consider dedicated video infrastructure.

More Recipes