skills/ad-creative/references/imessage-video-ads.md
A family of 9:16 social-native video formats that recreate a familiar iOS surface in real time and let the brand emerge inside it. The flagship is the iMessage chat reveal — someone sends a screenshot of a result or product, a friend reacts and asks what it is, and the conversation reveals the brand, usually with a promo code. Message bubbles pop in over ~15–22 seconds with authentic send/receive sounds, then a static brand end card lands the CTA. The same architecture powers ChatGPT reveals, Apple Notes reveals, and AirDrop reveals — covered in Other iOS-Native Reveal Surfaces below.
The format works because it borrows the most-read UI on earth. A chat thread is a familiar, high-attention dramatization — it mirrors how real recommendations happen, so the viewer leans in instead of scrolling past. The CTA arrives conversationally ("use code FREEPACK") instead of as a hard sell, which keeps the ad-skip reflex from firing until the pitch has already landed. Run it only as a clearly labeled paid placement (Meta's "Sponsored" tag does the disclosure work); never seed it organically as if it were a real leaked conversation.
Credit: this reference distills the format popularized by Shiv Sakhuja and the Gooseworks team (@shivsakhuja, gooseworks-ai/gooseworks-ads-skills), who report the format performing strongly on Meta.
Good fit:
Poor fit:
Platform fit: Built for Meta Reels/Stories placements (9:16, 1080×1920) with a 1:1 center-crop variant for feed. Works on TikTok and YouTube Shorts with the same master file.
This is a dramatization — a scripted conversation, not a real one. That's a standard, legitimate ad device, but two rules keep it honest and on the right side of FTC guidance:
If a claim needs a disclaimer on your landing page, it needs one on this ad too.
Most iMessage ads fit one of six angles. Pick the angle before writing any copy — the most common failure mode ("script is fine but the ad feels off") is an angle mismatch, not bad lines. The strongest hooks share one of three traits: a specific number, a small act of self-trust, or a physically novel product mechanic.
| Angle | The hook attachment | The reveal |
|---|---|---|
| Result-as-screenshot | A number that brags by itself — race time, app summary, dashboard stat | "X minutes a day. that's it." |
| Setup flex | A photo of your space — tiny apartment gym, race-kit corner, desk setup | "this is the whole setup" |
| Cancellation moment | A confirmation receipt — gym cancellation email, "subscription cancelled" page | "$X/mo → $Y/mo. do the math" |
| Feature-as-punchline | A short clip of the product mechanic in motion | The mechanic is the brand |
| Friend-asks-friend (inverse) | The peer opens with the wow — "how are you doing this 😭" | You reply with the brand |
| Receipt-as-hook | A mundane financial document — statement, App Store receipt | A small act of self-trust |
0:00 Hook attachment lands (the screenshot the whole chat is about)
↓ short reactions, 250–450ms apart ("bro no way" / "wait is that real")
0:06 The question — "what app is that??"
↓ typing indicator … then the brand-name reply
0:12 The pitch, in texting voice — one or two bubbles max
0:15 The code — "use FREEPACK, first pack's free" (code renders link-underlined)
0:17 Beat of silence, then the closer — "bet" / "ok downloading"
0:18 300ms crossfade → static brand end card: logo, code, tagline (~3s)
Script rules:
Three ways to produce it, in order of control:
Gooseworks distributes their pipeline as an installable agent skill — npx gooseworks install --all, then invoke the goose-ads skill from your agent. It handles rendering, recording, SFX, and stitching end to end. Use this to validate the format before building anything custom. (Their ads-skills source repo is public but carries no open-source license — treat it as reference reading, not code to vendor.)
The architecture that produces a convincing result: render the chat as HTML/CSS mimicking the iMessage UI, drive the animation with a timeline script, record it headlessly with Playwright, and assemble audio + end card with ffmpeg.
from, text, attachment paths, typing-indicator flags), theme, header. The script is reviewable and re-renderable without touching code.display: none — not opacity: 0, or the thread pre-allocates space and never "grows"). A driver script walks a timeline array revealing each bubble, driving the composer, and auto-scrolling. Never record scene-by-scene and concat — every page reload causes a visible micro-flicker.viewport and recordVideo.size to 1080×1920 — if you omit recordVideo.size, Playwright records a scaled-down video by default. Recording small and upscaling ships soft, blurry bubble text.xfade requires both inputs to match in resolution, pixel format, and frame rate — render the end card to a fixed-frame MP4 at the same specs as the chat recording before fading. Export the 9:16 master plus a 1:1 center crop.Once a winning script structure emerges, rebuild it as a Remotion composition (see generative-tools.md) with the thread JSON as props. Then variations — new hooks, new codes, new personas — are data changes, not re-productions. Right move at the "we're testing 10 script variants a week" stage, not for the first ad.
These are the difference between "feels like a real chat" and "feels like a mockup":
bigsoundbank.com/UPLOAD/mp3/1313.mp3, ~0.5s) and receive tritone (bigsoundbank.com/UPLOAD/mp3/1111.mp3 — trim to ~1.4s with a 400ms fade). Normalize loud (≈ -9 LUFS) so they cut through the music. Note the recordings being CC0 doesn't mean Apple has licensed its sound marks or UI trade dress — this is standard practice in the format, but regulated brands and risk-averse legal teams should review the iMessage mimicry as a whole; a generic chat-app skin (neutral bubbles, non-Apple sounds) is the fallback that keeps the mechanic.amix divides volume by input count by default — pass normalize=0 or the whole mix comes out mysteriously quiet. Then run the mix through a limiter with the ceiling just under full scale (e.g. alimiter=limit=0.95, ≈ -0.4 dB) so it's loud without clipping.Before shipping:
Treat the thread as the variable and the pipeline as fixed. Test in this order — hook first, everything else after:
The same architecture extends to further surfaces too — WhatsApp, Slack, a search box — same timeline-driven recording, different UI shell.
Everything above about production (UI mockup → timeline-driven continuous recording → deterministic SFX cues → static end card), grounding, and disclosure carries over unchanged. What changes per surface is the persuasion mechanic and a handful of craft details.
| Surface | Persuasion mechanic | Reach for it when |
|---|---|---|
| iMessage | A friend's recommendation — social proof through dialogue | The product is discovered through results people share ("what app is that?") |
| ChatGPT | An authoritative answer to the viewer's own question | The problem is question-shaped — something people would literally type into ChatGPT |
| Apple Notes | A private confession made public — first-person, no dialogue | The angle is transformation or realization ("things nobody told me about 45") |
| AirDrop | A spontaneous peer share — "someone nearby thought this was worth sending you right now," with a built-in accept/decline decision | The product is something people pass to each other (a deal, a link, a find, a file) and the accept-tap can be the reveal |
The strongest signal for choosing: which of these surfaces already fills your audience's day. Recommendation products want iMessage; advice-seeking problems want ChatGPT; identity/transformation stories want Notes; and anything people spontaneously pass to each other wants AirDrop.
The viewer identifies with the asker. The typed question is the hook and must be the target customer's verbatim question — awkward phrasing and all ("why is my stomach so bloated all of a sudden at 47?"). The streaming answer names the problem's real mechanism, then the solution category; the brand lands in the answer's recommendation or in a typed follow-up ("what's the best one?").
Craft details:
Compliance — stricter here than anywhere else in this family. The "answer" is your ad copy wearing a lab coat: an authority costume. Every claim in it needs the same substantiation as a claim in your own voice, and the format's borrowed authority raises the bar, not lowers it. Do not put health, medical, or financial advice in a fabricated AI answer without legal review — that's the highest-risk version of this format. And never present the exchange as a real, unprompted ChatGPT output endorsing your product; it's a dramatization, same as the iMessage thread.
A different genre from the chat formats: confession, not conversation. The viewer watches someone type a private note — a list of realizations, a "things I wish I knew" entry — with the keyboard visible. The note's title is the hook and does the job slide 1 does in a carousel ("Things nobody told me about 45."). The product appears as one item in the list, named the way a person would actually write it to themselves — not the way a brand would.
Craft details:
The grounding rule hits differently here: the confession is a dramatization of a composite, true customer story — pull the realizations from real reviews and interviews (the Grounded Inputs corpus), and keep any numbers or outcomes to documented ones.
The one interaction-native format in the family: the hook is an incoming AirDrop request, and the Accept tap is the reveal. The viewer watches from the receiver's POV — a translucent AirDrop card slides up, "[Sender] would like to share [preview]," with a gray Decline and a blue Accept. The curiosity is structural ("what is this and who's sending it?") and the accept/decline choice is a built-in micro-conversion beat baked into iOS itself. Tapping Accept transfers the item — and that's where the product, the offer, or the result lands.
Craft details:
Grounding is the same family rule: it's a dramatization of a share, not a claim that a real person actually AirDropped your product. Every claim on the transferred item is substantiated per the Grounded Inputs rules, and the exchange is never presented as a real, unprompted endorsement.