Engage & Convert Creative Demand GenMarketing

AI Video Ads from One Point of View: A Claude Code Pipeline That Cuts Ten Variants a Week

Most B2B video ads die in the queue: one script, one edit, three weeks, one variant that nobody wanted to test because it cost too much to make. This play turns AI video ads into a pipeline instead. Claude writes a hook matrix from your point of view and your customers' own words, scripts each hook at 6, 15, and 30 seconds with a caption track, and renders the cuts from HTML scenes you own, so ten named variants ship into a test on Monday and the losers cost nothing to kill.

StageEngage & Convert
Time to buildA weekend
DifficultyIntermediate
Best forDemand Gen, Marketing
THE TEMPLATE

The ad script template

One file per cut. The spoken line and the on-screen line sit side by side with a timestamp, the proof carries its source, and the header is the variant name. Save it as creative/script-template.md and the brief makes Claude fill it for every hook at every length.

creative/script-template.md
SCRIPT · {{hook-type}}-{{audience}}-{{length}}s · from hooks.md row {{n}}
Hook type: {{pain | proof | contrarian | question}}
Audience: {{who is watching, one title}}
Phrase: "{{the customer's exact words}}" ({{deal, call date}})
Proof: {{one number or outcome}} (source: {{proof.md entry}})

{{start}}-{{end}}  SPOKEN: {{the hook, under 14 words, said aloud}}
           ON SCREEN: {{the same idea, no longer than the spoken line}}
           VISUAL: {{what is on screen, one sentence}}

{{start}}-{{end}}  SPOKEN: {{the proof, with the number}}
           ON SCREEN: {{the number and its label}}
           VISUAL: {{...}}

{{start}}-{{end}}  SPOKEN: {{the call to action and the product name}}
           ON SCREEN: {{domain · action}}
           VISUAL: end card, logo, animated arrow

Ratios: {{4x5, 9x16, 1x1}} with a note on what changes per ratio
Captions: inside safe area; bottom 20% clear on 9x16
Music: {{file}} at {{level}}, none on the end card

Rules
- Every on-screen line is a complete sentence. Smaller type, never a clip.
- No number that is not in proof.md.
- The 30s version exists only if the proof is a before-and-after.
- The file name is the variant name is the ad name.

The line I would keep if you strip everything else: the on-screen line is never longer than the spoken one. Silent autoplay means the captions are the ad, and a caption that lags the voice is a video people scroll past without knowing why.

The stack

The stack

How the tools connect
What a run costs
Per week
one Claude Code run to write and compose 20-25 scripts and 60-70 renders; a few dollars of tokens, render time on your laptop or a CI runner
Hyperframes
open source; no per-render fee. Avatar tools are the only paid line, and only for the hook families that need a face
Setup
a weekend: brand.css and the script template, the brief, one manual run you review frame by frame before the second
Output
ten named hook variants in three ratios each Monday, and a variants.csv that says which eight died and why
The problem

The problem

The reason most B2B teams run image ads is not that images work better. It is that a video costs three weeks and a freelancer, so you make one, and one video is not a test, it is a bet. The brief goes out in week one, the edit comes back in week three, someone asks for the logo to be bigger, and by the time it is live the campaign it was cut for has moved on. The team learns nothing about which message works because there was never a second message to compare it with. AI video ads are supposed to fix this, and mostly they have replaced the freelancer with a subscription while keeping the one-video habit.

The tools sold as the fix start from the wrong end. Avatar generators start from a face, stock-clip assemblers start from a library, and both hand you a template that looks like every other ad in the feed, because it is. The hook, which is the only part of a paid social video that decides whether the next two seconds get watched, is the part these tools leave to you, and it is the part the team has the least practice at. So you get a polished 30-second video of a point nobody would stop scrolling for.

Meanwhile the platforms have quietly made the format problem worse. LinkedIn wants 4:5 or 9:16 on mobile, Meta's feed wants 4:5 and Reels wants full-screen vertical, Shorts wants 9:16 and cuts you off at 60 seconds. One master edit re-cropped three ways puts your caption under a button on one placement and your logo off-screen on another. Every variant now multiplies by three formats, which is exactly why teams that could afford one video cannot afford ten.

The cost is invisible because it shows up as absence. The campaign that ran on a single video for two months had a CPM and a CTR and a dashboard, and nobody could say whether the message was wrong or the format was, because there was nothing to compare it to. The team that ships ten cuts a week, kills eight, and re-cuts the two that held attention past three seconds is running a different sport. This play is how a two-person marketing team gets into that sport without hiring an editor.

How it works

How it works

The workflow, end to end
  1. 01 Write the POV Youone paragraph, ten customer phrases
  2. 02 Hook matrix Claude Code4 types x audiences, each traced to a phrase
  3. 03 Scripts + captions Claude Code6s, 15s, 30s per hook, timed
  4. 04 Scenes in HTML Claude Codebrand.css, three ratios, complete sentences
  5. 05 Render Hyperframeslint, then MP4 per cut
  6. 06 Name + log variants.csvhook-audience-length-ratio
  7. 07 Test, then read Campaign Manager + ads skillone family per ad set; cut again or kill
  • You write one point of view in a paragraph and paste the customer phrases from your last ten won deals; that file is the only creative brief the pipeline ever gets
  • Claude Code builds a hook matrix from it: four hook types (pain, proof, contrarian, question) crossed with two or three audiences, each hook one spoken sentence with the customer phrase it came from
  • For each hook it writes three scripts, 6, 15, and 30 seconds, each with a caption track timed to the spoken line and a single on-screen proof point
  • Each script becomes a set of HTML scenes in your brand's type and colors; Hyperframes renders the scenes to MP4 at 4:5, 9:16, and 1:1 from the same source, so every placement gets a real cut, not a crop
  • If a hook needs a face, the same script goes to an avatar tool and the rendered clip drops into the scene set as one more layer; the pipeline does not care where the pixels came from
  • Every cut gets a name that encodes hook type, audience, length, and ratio, and a row in variants.csv; that name is what shows up in Campaign Manager and what the ads skill reads a week later
  • Monday the cuts go into a test, one hook family per ad set; the following Monday the ads skill reads the test by family and format and tells you which rows to cut again
See it run

See it run

zsh
$# Monday: one point of view in, a named set of cuts out (renders to video/out/, nothing published)
$claude -p "$(cat briefs/video-ads.md)" --allowedTools Read,Write,Bash
Read creative/pov.md (1 POV, 11 customer phrases) · creative/proof.md (3 audiences, 3 proof points with sources)
Hook matrix: 4 types x 3 audiences = 12 hooks · 2 rejected (no traceable phrase) · 10 written to creative/hooks.md
Scripts: 10 hooks x 6s/15s · 30s written for 3 (before-and-after proof), skipped for 7 · caption tracks timed
Compositions: 23 scripts x 3 ratios = 69 in video/ · brand.css only · 0 clipped lines (type reduced on 4)
npx hyperframes lint: 0 errors, 6 font warnings · render --quality high: 69/69 · video/out/ 1.9 GB
variants.csv: 69 rows appended, status=rendered · e.g. pain-revops-15s-9x16.mp4, question-cmo-6s-4x5.mp4
$# the following Monday: read last week's test by hook family and ratio (the ads skill, read-only)
$claude -p "Read variants.csv and last week's LinkedIn account by layer. Report by hook family: 3s hold rate, CTR, CPC per ratio. Propose cut-again and kill lists." --system "$(cat skills/linkedin-ads-optimization/SKILL.md)"
Cut again: contrarian-revops (3s hold 41%, best on 9x16), proof-cfo (3s hold 36%, best on 4x5) · add 30s with new proof
Kill: 6 rows (3s hold under 20%) · rewrite: pain-revops as contrarian from the same phrase · variants.csv updated, 8 rows status=killed
$
The playbook

The playbook

Write the point of view before you think about ai video ads

Every video that stops a scroll starts with a sentence someone would argue with. Before a single frame, write the one thing you believe about your buyer's problem that a competitor would not say, in a paragraph, in plain words. Then pull the exact phrases customers used on your last ten won deals, from the call recorder or the CRM notes: 'we had three tools that all disagreed', 'I found out from the customer'. Those phrases are the hooks. A hook written by a marketer sounds like a marketer; a hook lifted from a customer sounds like the person watching.

Save both as creative/pov.md. That file is the only brief the pipeline gets, and it is deliberately short. The creative concepts play covers how to get from positioning to distinct angles if you are starting from a blank page; this play starts where that one ends, with angles worth filming.

Decide the proof point per audience while you are here. A 15-second video has room for one number or one named outcome. Pick it now, with a source you could show a prospect, so the scripts do not invent one later.

💡

TipIf you cannot name the customer phrase a hook came from, cut the hook. Invented hooks are what makes an ad look like an ad.

Pick the route: own the pixels, or rent a face

There are two honest ways to make video with a model in the loop, and the choice is about the offer, not the tool. The first route is type-forward: the video is text, motion, and your brand's colors, rendered from HTML and CSS the way this site renders its own launch videos. Every element is a line of code you can diff, the brand is exact because it is your stylesheet, and a new variant is a new file. It suits a product that is explained better than it is shown, which is most B2B software.

The second route is a talking head. Tools like HeyGen and Tavus put a face on the script, either a stock presenter or a clone of yours. It suits a founder-led brand, a testimonial-shaped hook, or a market where trust in a person carries the offer. The trade-off is that the face is the creative, so every variant looks the same at a glance and the hook has to do all the work in the words, and a cloned face reading a script it never said is a decision to make with your eyes open.

The pipeline below treats both as scene sources. The default is the type-forward route because it costs nothing per render and every variant is a real variant. When a hook calls for a face, the same script goes to the avatar tool and the clip drops into the scene set as a layer with captions over it. Do not pick a route for the whole quarter; pick it per hook family and let the test decide.

Script every hook at three lengths, with the caption track built in

Claude writes three scripts per hook, and the lengths are not one script trimmed. The 6-second cut is the hook and the product name, nothing else; it exists to be seen on mute in a feed. The 15-second cut is hook, one proof point, one call to action, and it is the workhorse for every placement the platforms let you buy. The 30-second cut earns its length only if the proof needs a before-and-after; if the 30 is just the 15 with more adjectives, delete it.

Captions are not an accessibility afterthought here; on paid social most video plays silent, so the caption track is the script. The script template below puts the spoken line and the on-screen line side by side with a timestamp, and the rule that the on-screen line is never longer than the spoken one. The model is good at this when told the constraint and bad at it when left to write 'a script'.

Make it write the visual column too: what is on screen at each timestamp, in a sentence. For the type-forward route that column becomes the scene list. For the avatar route it becomes the B-roll and the caption placement over the face. Either way the video is planned in a text file you can review in a pull request before anything renders.

  • 6s: hook line (spoken and on screen), product name, end card. Built to work on mute.
  • 15s: hook (0-3s), the one proof point with its source (3-10s), call to action and product name (10-15s).
  • 30s: only when the proof is a before-and-after. Hook, the before, the after, the number, the call to action.
  • Every script carries: hook type, audience, the customer phrase it came from, the proof source, and a caption track with timestamps.

Render the cuts from HTML scenes with Claude Code

This is the step that looks technical and is not. A Hyperframes composition is a folder with an HTML file and a small JSON manifest; each scene is a div with your type and colors, and the timing is a short GSAP timeline. Claude Code writes those files from the script's visual column, in your brand's stylesheet, at three canvas sizes. Then a lint and a render command turn the folder into an MP4. The Hyperframes repo documents the manifest; the brief tells Claude the rules that keep the output usable.

The rules matter more than the tool. Every on-screen line is a complete sentence from the script, never a clause clipped to fit; if it does not fit, the type gets smaller. The logo sits in the same corner on every frame except the end card. Captions live inside the safe area for each ratio, because a 9:16 cut on Shorts has the channel name and the buttons over the bottom of the frame, and Meta's Reels placement has the same problem. Nothing moves faster than a reader can read it. A brief that states these rules produces cuts you can ship; a brief that says 'make it look good' produces motion graphics.

Render at 4:5, 9:16, and 1:1 from the same scene source, and treat 16:9 as optional. On LinkedIn the vertical ratios are what the platform recommends and what mobile shows; the square cut covers the desktop feed. Each ratio is a real layout, not a crop: the 9:16 scene stacks what the 4:5 scene sets side by side. Claude does this from one script because the scenes are code, and that is the entire economic argument for the route.

The video-ads brief (briefs/video-ads.md)
Read creative/pov.md (the point of view and the customer phrases) and creative/proof.md (one proof point per audience, with source).

1. Build the hook matrix: hook types {pain, proof, contrarian, question} x audiences in pov.md. One spoken sentence per hook, under 14 words, with the customer phrase it came from. Write it to creative/hooks.md. Reject any hook you cannot trace to a phrase.

2. For each hook, write three scripts (6s, 15s, 30s) using the template in creative/script-template.md. Every script has: spoken line, on-screen line (never longer than the spoken line), what is on screen, timestamp. The 30s exists only if the proof is a before-and-after; otherwise skip it and say so.

3. For each script, write a Hyperframes composition in video/<variant>/ at 4:5 (1080x1350), 9:16 (1080x1920), and 1:1 (1080x1080). Rules:
- Use css/brand.css only. No new colors, no new fonts.
- Every on-screen line is a complete sentence from the script. If it does not fit, reduce the type size; never clip.
- Logo top-right on every frame except the end card.
- Captions inside the safe area for the ratio (bottom 20% clear on 9:16).
- Minimum 1.2 seconds per on-screen line; nothing animates faster than it can be read.
- Music from assets/music/ under the spoken line; silence is fine.

4. Name each cut: {hook-type}-{audience}-{length}s-{ratio}, e.g. pain-revops-15s-9x16. Append a row per cut to variants.csv: name, hook, phrase, audience, length, ratio, proof, render path, status=rendered.

5. Run: npx hyperframes lint (0 errors) then npx hyperframes render --quality high --output ../<name>.mp4 for each composition. Report the failures and stop; do not retry silently.

Do not publish anything. Renders go to video/out/ for review.
💡

TipPut the brand stylesheet in the repo before the first render. The model matches an existing css/brand.css exactly and invents one badly.

Cut per platform spec and name every variant

Specs change and the numbers below were read from the platforms' own pages on 5 September 2026; check them again before a big flight. LinkedIn accepts 16:9, 1:1, 4:5, and 9:16, recommends 4:5, allows three seconds to 30 minutes and says 15 to 30 seconds performs best across placements. Meta's feed placement recommends 4:5 at 1440 by 1800, and Reels is full-screen vertical. YouTube Shorts ads run vertical 9:16, can be up to three minutes, but only the first 60 seconds play in the Shorts feed, and Google recommends staying under 60. A horizontal asset on Shorts serves with blurred bars, which is a polite way of saying it looks like a mistake.

The practical rule that falls out of those numbers: the 15-second 4:5 cut is the one that plays everywhere, the 9:16 cut is for Reels and Shorts and LinkedIn mobile, and the 6-second cut is a feed-stopper on mute. Ship all three ratios of the 15 for every hook you are testing; ship the 6 and the 30 only for the hooks that survive the first week.

The name is the analytics. A cut called pain-revops-15s-9x16 tells the ads skill next week which hook type, which audience, which length, and which ratio it is reading, without a lookup table someone forgot to update. Put the name in the ad name field in Campaign Manager or Ads Manager, exactly as rendered, and keep variants.csv as the record of what shipped where. Ten videos with names like final_v3_new.mp4 are not a test.

  • LinkedIn video ads: 16:9, 1:1, 4:5 (recommended), 9:16; 3 seconds to 30 minutes, 15-30 seconds recommended; MP4, 75 KB to 500 MB. Source: LinkedIn Marketing Solutions help, video ads specifications.
  • Meta feed video: 4:5 recommended, 1440 x 1800; Reels is full-screen vertical, so keep the bottom of the frame clear. Source: Meta ads guide, Facebook feed video.
  • YouTube Shorts ads: vertical 9:16; up to 3 minutes, first 60 seconds play in the Shorts feed; under 60 seconds recommended. Source: Google Ads help, YouTube Shorts ads asset specs.
  • Naming: {hook-type}-{audience}-{length}s-{ratio}; the ad name in the platform matches the file name and the row in variants.csv.

Ship into a test, read it by hook family, cut again

Launch one ad set per hook family with the three ratios of the 15-second cut inside it, same audience, same budget, for a week. That structure is what makes the result readable: the ad set tells you whether the hook works, the ad inside it tells you which format carried it. Mixing hook families in one ad set lets the platform pick a winner for reasons you cannot see, and you learn nothing about the message.

A week later, the LinkedIn ads skill or its Google counterpart reads the account by layer and reports by name: which hook families held attention past three seconds, which ratio each family won on, and which rows to kill. Because the names encode the matrix, the report is a filled-in version of hooks.md, not a spreadsheet you have to translate.

Then the pipeline runs again with a smaller matrix. The two hooks that held attention get new proof points and a 30-second cut; the pain hook that died gets a contrarian rewrite from the same customer phrase; the six that lost are rows in variants.csv with status=killed and a date. Ten cuts a week sounds like a content mill until you see that most of them exist for one week and cost a render. That is the point.

💡

TipJudge the hook on the three-second hold, not the click. A video that holds and does not click has a proof problem; one that does not hold has a hook problem, and no edit fixes a hook.

Inside the prompt

Inside the prompt

The scoring prompt is short, but every line is there for a reason. Here is what each one is doing and why.

Why each line is in the video-ads brief
Reject untraceable hooks"Reject any hook you cannot trace to a phrase"
The single rule that keeps the output from sounding like an ad. The model would happily write twelve clever lines with no customer behind them.
Three lengths, one conditional"The 30s exists only if the proof is a before-and-after"
Otherwise the 30 is the 15 with adjectives, and it costs a render and a test slot.
Complete sentences or smaller type"If it does not fit, reduce the type size; never clip"
The most common way generated video looks broken is a clause cut mid-thought. This rule removes it.
One stylesheet"Use css/brand.css only. No new colors, no new fonts"
Brand consistency is a constraint, not a review step. The model matches an existing file exactly and invents one badly.
The name is the schema"{hook-type}-{audience}-{length}s-{ratio}"
What makes the test readable a week later by a skill that has never seen hooks.md.
Render, report, stop"Report the failures and stop; do not retry silently"
A render that fails twice usually means a clipped line or a missing asset. You want to see it, not have it papered over.
What you get

What you get

One row of the hook matrix carried through to a 15-second script with its caption track, as Claude writes it to creative/scripts/. The spoken and on-screen lines sit side by side, the proof carries its source, and the file name is the variant name.

Example output
SCRIPT · contrarian-revops-15s · from hooks.md row 7
Hook type: contrarian · Audience: RevOps lead · Phrase: "we had three tools that all disagreed" (won deal, Northwind Freight, call 2026-07-14)
Proof: pipeline number reconciled across CRM, ads, and billing in one weekly run (source: proof.md, customer quote with permission)

00.0-03.0  SPOKEN: Your pipeline number is wrong, and so is the other one.
           ON SCREEN: Your pipeline number is wrong. So is the other one.
           VISUAL: two large numbers in ink, $4.2M and $3.7M, side by side; both flicker

03.0-07.5  SPOKEN: Three tools, three numbers, and the board saw the biggest one.
           ON SCREEN: Three tools. Three numbers. The board saw the biggest.
           VISUAL: three source labels (CRM, ads, billing) with mismatched totals

07.5-11.5  SPOKEN: One Claude agent reconciles them every Monday and shows the deltas.
           ON SCREEN: One agent. One number. The deltas shown.
           VISUAL: the three totals collapse into one, a small delta table beneath

11.5-15.0  SPOKEN: Get Wicked Growth. The playbook is free.
           ON SCREEN: getwickedgrowth.com · Read the playbook
           VISUAL: end card, logo centered, green arrow nudging right

Ratios: 4x5, 9x16 (stack the three sources vertically), 1x1
Captions: inside safe area; bottom 20% clear on 9x16
Music: assets/music/low-pulse.mp3 at -18 dB, none on the end card
Anatomy of one cut
contrarian-revops-15s-9x16.mp4 · hooks.md row 7 · status: cut again
hook typecontrarian
One of four in the matrix. The name carries it so the ads skill can read results by type without a lookup.
phrase"we had three tools that all disagreed" (Northwind Freight, 2026-07-14)
The customer's words, with the call it came from. A hook with no phrase does not get written.
proofone reconciled pipeline number, weekly (proof.md, with permission)
From the proof file, not the model. The brief forbids any number not in it.
on-screen lineThree tools. Three numbers. The board saw the biggest.
Never longer than the spoken line, always a complete sentence. Silent autoplay means this is the script.
ratio and safe area9:16, 1080 x 1920; bottom 20% clear
A real layout for Reels and Shorts, not a crop of the 4:5. The source labels stack instead of sitting side by side.
result, week 13s hold 41%, best ratio in its family
Read by name from the account. The decision is 'cut again with a 30s and new proof', logged in variants.csv.
Pitfalls to avoid

Pitfalls to avoid

⚠️

Starting from the toolAn avatar or a clip library hands you a template and leaves the hook to you. Write the point of view and the customer phrases first; pick the route per hook family after.

⚠️

One master edit, three cropsA 16:9 cut cropped to 9:16 puts captions under the platform's buttons. Render each ratio as its own layout from the same script; the scenes are code, so it costs nothing.

⚠️

Clipped linesA sentence cut mid-clause to fit the frame reads as a bug. The rule in the brief is complete sentences or smaller type, never a clip.

⚠️

Invented proofA model asked for a script will write a number. Give it proof.md with a source per audience and forbid anything not in it.

⚠️

Hook families mixed in one ad setThe platform picks a winner for reasons you cannot see and you learn nothing about the message. One family per ad set, ratios inside it.

⚠️

Judging on clicksThe hook's job is the first three seconds. Read hold rate first; a video that holds and does not click has a proof or CTA problem, which is a cheaper fix.

FAQ

Questions people ask

What are AI video ads?
Short-form paid social videos where a model does the writing and the assembly: the hook variants, the scripts per length, the caption track, and the scenes that get rendered to MP4. The version on this page uses Claude Code to write everything from your point of view and your customers' phrases, renders the cuts from HTML scenes you own, and names each variant so a test can be read by hook family a week later. The model does the production; you still own the opinion and the proof.
Do I need HeyGen or a similar tool?
Only for hooks that need a face. The default route here renders type, motion, and your brand from HTML with Hyperframes, which is open source and costs nothing per render. Avatar tools earn their fee when a founder-led or testimonial-shaped hook carries the offer; treat them as one more scene source inside the same pipeline, with the same script and captions.
How many variants should I ship a week?
Enough that most of them can lose. Ten hook variants at 15 seconds, in three ratios each, is a comfortable weekly cadence for a two-person team once the pipeline runs. Launch one hook family per ad set, judge the three-second hold first, then cut the two that held again with new proof and kill the rest in variants.csv.
Which aspect ratio should I make?
The 15-second 4:5 cut plays almost everywhere and is LinkedIn's recommended ratio. Add 9:16 for Reels, Shorts, and LinkedIn mobile, and 1:1 for desktop feeds. Render each as its own layout from the same script rather than cropping a master; the specs were checked against the platforms' own pages on 5 September 2026 and are listed in step five.
Does the hook really matter more than production quality?
On paid social, yes, because the platform only shows the rest of the video to people who stayed past the first seconds, and most of them are watching on mute. A polished 30-second video of a point nobody would stop for gets the same result as a bad one. That is why the brief spends its strictest rule on tracing every hook to a customer phrase.
Can I do this without Claude Code?
You can write the hook matrix and scripts in a Claude Project and hand the scene-building to a designer, and you will still be faster than the three-week freelancer loop. The render step is where Claude Code pays for itself: it writes 60-odd compositions in your stylesheet and runs the lint and render commands, which is not a job a chat window can do.
How long does it take to build?
A weekend. Saturday for the brand stylesheet, the script template, and the point-of-view file with your customer phrases; Sunday for the brief and one manual run you review frame by frame. The second run is the first one you ship.
Related

Related plays

Want playbooks like this in your inbox?

A new AI use case, prompt, or teardown every couple of weeks.

Subscribe →