Multi-Ad Creative Testing for Music Ads: Automatic Per-Video Pruning on Meta (2026)
A Meta multi-ad (flexible ad) holds up to 10 videos inside a single ad object (media_sourcing_spec) so Meta Andromeda can deliver the best variation to each viewer. The catch in standard Meta Ads Manager is that weak videos inside a multi-ad can quietly eat impressions while you cannot easily prune a single video without rebuilding the ad. In song.so, the Campaigns builder automatically groups batches of 5 to 10 generated videos into multi-ads, and the "Optimize multi ads" rule judges every individual video once via Meta video_asset breakdown starting at a quarter of your impressions gate (50 impressions by default): videos with zero link clicks or a cost per result above your RCPR benchmark are automatically removed by swapping a pruned creative onto the same ad ID, while the best video always stays.
By the song.so team
Why multi-ads (flexible ads) are central to Meta Andromeda music campaigns
When you export 30 to 120 video variations from the song.so bulk creative generator - such as 10 rotated clip orders combined with 10 text hooks, a lyrics-only version, and an overlay-only version - creating 120 separate single-video ads in one ad set hits Meta 50-ad limit and fragments impression delivery across too many ad IDs.
Multi-ads solve that by grouping related variations (up to 10 videos per ad) into one flexible ad creative. When you import generated videos into a Release Campaign in song.so, any creative group with 5 or more videos automatically defaults to Multi-Ad Creatives: one multi-ad for a clip with its up to 10 hook variations, one for all lyrics-only variants, and one for all overlay-only variants. See from creative generator to live Meta campaign.
| Creative batch group | Default ad format in song.so | Why this structure works |
|---|---|---|
| 1 clip with 5 to 10 text hooks | 1 Multi-Ad (up to 10 videos) | Tests all hook angles of the same visual clip inside one ad ID without hitting the 50-ad cap |
| All lyrics-only variants (up to 10) | 1 Multi-Ad | Groups pure lyric-caption variants into one concept |
| All cover-overlay-only variants (up to 10) | 1 Multi-Ad | Groups branded artwork-overlay variants into one concept |
| 1 to 4 standalone videos | Single Ads (or optional Multi-Ad toggle) | Gives standalone hero concepts their own dedicated ad ID |
The hidden problem with multi-ads in Meta Ads Manager
In Meta Ads Manager, a multi-ad reports one blended row in the main table. To see which of the 10 videos inside it actually earned clicks or conversions, you have to open Breakdown -> By Dynamic Creative Element -> Video, and even then: first, URL tags like utm_content={{ad.id}} only identify the parent ad, not which video asset inside media_sourcing_spec was served; second, Ads Manager does not give you a simple "pause this one video inside the multi-ad" button that runs automatically on an impressions threshold.
Without per-video pruning, two or three weak hooks or slow opening clips inside a 10-video multi-ad can absorb 30 to 40 percent of the ad impressions at zero clicks, dragging down the whole multi-ad RCPR until the entire ad gets paused - killing the 2 or 3 winning videos buried inside it.
How song.so "Optimize multi ads" prunes individual videos automatically
To solve this, meta-ads-adset-select in song.so includes a dedicated hourly multi-ad optimization pass (controlled by the Optimize multi ads toggle in Automation Rules, ON by default). Every hour, it fetches Meta video_asset breakdown (spend, impressions, inline_link_clicks, and ViewContent actions per video asset) for every active multi-ad in your campaign.
Because utm_content is shared by all videos in the same multi-ad, song.so evaluates individual videos on their asset-level Meta link clicks and ViewContent cost per result (spend / results) against the exact same RCPR benchmark and tolerance percentage as your campaign rules. Each video inside a multi-ad is judged once:
| Video delivery stage inside the multi-ad | Impressions threshold (when rule = 200) | What song.so does | Optimization log action |
|---|---|---|---|
| 1. Early learning | Under 1/4 of impressions rule (< 50 impressions) | Waits; never removes a video on tiny sample noise | None (still gathering data) |
| 2. Quarter-gate dead-weight check | From 1/4 of impressions rule (>= 50 impressions) with 0 link clicks and 0 results | Removes the video from the multi-ad immediately so it stops wasting impressions | remove_video (Red badge in log) |
| 3. Click-Without-Result grace window | 50 to 199 impressions with >= 1 link click but 0 results yet | Gives the video until the full impressions gate (200) to convert a click into a result | Waits until 200 impressions |
| 4. Full evaluation | Has >= 1 result (at >= 50 imp) OR reached full impressions gate (>= 200 imp) | Compares video cost per result against the RCPR benchmark (+ threshold %): if it meets the benchmark, it passes permanently; if above, it is removed | keep_video (Green badge, never judged again) or remove_video (Red badge) |
| 5. Best-video protection | Always active | The best-performing video in the multi-ad is never removed, ensuring at least 1 video remains | Protected |
How a video is removed without losing the ad ID or campaign structure
Meta Graph API does not allow mutating an existing adcreative object in place. When song.so removes one or more failing videos from a multi-ad, it reads the current creative spec (object_story_spec and media_sourcing_spec.videos), filters out the failed video_id entries while keeping the surviving videos and their thumbnails, applies applyCreativeOptOut (so Meta AI enhancements and multi-advertiser ads remain strictly disabled), creates a new adcreative, and updates the existing ad to point to the new creative.
That means:
| What changes on Meta | What stays untouched |
|---|---|
| The adcreative attached to the ad now holds only the surviving videos | The ad_id itself stays identical, so utm_content={{ad.id}} attribution history in song.so is unbroken |
| The ad briefly re-enters Meta review with the cleaner video set | Ad set structure, budgets, and campaign history remain intact |
| Once only 1 video remains in the multi-ad, it is treated as a standard single-video ad | From that point on, the hourly ad optimizer judges it on true first-party song.so RCPR |
| If all videos in a multi-ad together reach the impressions gate (200) and none meets the RCPR benchmark | The entire multi-ad is turned off (pause), respecting Prevent campaign death |
End-to-end workflow: from 120 bulk variations to pruned multi-ad winners
Combine bulk creative export with multi-ad pruning for the highest-leverage testing loop in music marketing:
| Step | Action in song.so | Result |
|---|---|---|
| 1. Produce a batch | Create 5 to 10 clips in Edit, Cinematic, UGC Lipsync, or Upload mode and stack up to 10 text hooks | Up to 120 distinct videos rendered in the background |
| 2. Import as Multi-Ads | Open the Release Campaign wizard -> Import generated videos; groups of 5+ auto-select Multi-Ad Creatives | Each clip + its hooks becomes 1 Multi-Ad (up to 10 videos) instead of 10 separate ads |
| 3. Quarter-gate pruning (50 imp) | Hourly optimizer checks video_asset breakdown once each video passes 50 impressions | Videos with 0 link clicks or poor CPR are stripped out automatically (remove_video) |
| 4. Ad-level & ad-set convergence (200 imp) | Surviving single-video ads and multi-ads are judged on verified first-party RCPR (utm_content) | Budget concentrates on the exact hook and clip combinations that drive real Spotify streams |
Read Meta ads automation rules explained and how automated Meta campaigns for music work for how multi-ad pruning fits into the full hourly optimization pass.
Worked example: pruning a 10-video hook batch inside one Multi-Ad
Suppose you export 10 hook variations of your chorus performance clip and import that group into your Release Campaign. Because the group has 10 videos (5 or more), song.so creates one Multi-Ad in each of your three ad sets (Broad, Genre, and Similar Artists). Your Analyze after impressions rule is set to the default 200 impressions, and your RCPR target is EUR 0.22.
| Hour / Milestone | What happens inside the Multi-Ad | Action taken by song.so |
|---|---|---|
| Hours 1 to 6 | Meta distributes early impressions across 6 of the 10 videos; 4 videos have under 50 impressions | Waits; videos below 50 impressions (1/4 of 200) are not judged yet |
| Hour 8 | Video #3 and Video #7 cross 55 impressions with 0 link clicks and 0 ViewContent results | Removes Video #3 and Video #7 immediately (`remove_video`), swapping an 8-video creative onto the same ad ID |
| Hour 14 | Video #1 reaches 90 impressions with 2 ViewContent results at EUR 0.16 cost per result; Video #4 reaches 210 impressions with 1 result at EUR 0.41 | Video #1 is marked `keep_video` (green in log, never judged again); Video #4 is removed (`remove_video`) |
| Day 3 | Two winning hook videos remain in the Multi-Ad, both converting below EUR 0.20 | The Multi-Ad continues scaling with only the proven hooks receiving budget |
| If all 10 videos had failed | Combined impressions cross 200 and no video meets EUR 0.22 | The entire Multi-Ad is turned off (`pause`), and an untested backup ad is activated if needed |
Every video removal appears in your Optimization Log modal with its exact thumbnail, video name, impressions, link clicks, Meta results, and cost per result, and is included in your 12-hour or daily visual digest email.
When to use Multi-Ads vs Single Ads in music campaigns
| Scenario | Recommended format | Why |
|---|---|---|
| Testing 5 to 10 text hooks on the same visual clip | Multi-Ad (auto-selected for 5+ videos) | Lets Meta Andromeda match hook lines to viewer segments while song.so prunes 0-click hooks at 50 impressions |
| Testing 10 rotated clip orders from a bulk montage | Multi-Ad | Finds the strongest opening 2-second visual cut without cluttering the ad set with 10 separate ads |
| Comparing a Cinematic 3-shot movie scene against a UGC Lipsync character | Separate Single Ads (or separate Multi-Ads per concept) | Gives each distinct creative format its own ad ID and first-party song.so RCPR measurement |
| Running a single hero video you want to force-deliver regardless of metrics | Single Ad with "force" in the name | Bypasses both ad-level and multi-ad automation completely |
FAQ
What is a multi-ad (flexible ad) in Meta music campaigns?
A multi-ad bundles up to 10 videos into a single Meta ad (media_sourcing_spec) so Meta Andromeda can test different hooks and visual openings while keeping your ad set well below the 50-ad limit.
How does song.so decide which videos to remove from a multi-ad?
With Optimize multi ads enabled (on by default), song.so checks Meta video_asset breakdown every hour. Once a video inside a multi-ad reaches a quarter of your impressions gate (50 impressions by default), it is removed if it has zero link clicks, or if its cost per result exceeds your RCPR benchmark.
Does a video that passes the multi-ad check get judged again later?
No. Each video inside a multi-ad is judged once. When a video meets the RCPR benchmark, song.so logs keep_video (shown in green in the Optimization Log) and never judges that video again.
What happens when only one video is left in a multi-ad?
The best video in a multi-ad is always protected from removal. Once only one video remains, the ad is evaluated like any standard single-video ad on verified song.so RCPR (utm_content).
When is an entire multi-ad turned off?
When the videos inside the multi-ad together reach your full impressions gate (default 200) and none of them meets the RCPR benchmark, the multi-ad itself is turned off.
Does removing a video from a multi-ad change the ad ID?
No. song.so creates a new creative without the removed video and swaps it onto the same Meta ad ID, preserving your utm_content={{ad.id}} click attribution history.