---
name: scale-horizontally-with-duplication
description: >-
  Grows total spend by duplicating a winning ad set into a new audience, geo, lookalike percentage,
  or creative concept instead of forcing more budget through an already-saturated cell, the move
  for when scale-budget-vertically stalls because frequency is climbing and CPA is breaching target
  at the current spend level. Changes exactly one expansion axis per duplicate, preserves the
  proven optimization_goal/placements/bid settings, checks the duplicate for audience overlap
  against every live ad set (not just the source), labels it clearly, and creates it PAUSED for
  preview and approval before activation. Also the right move to reset an ad set whose delivery
  history is poisoned, since a fresh duplicate starts learning clean instead of inheriting bad
  data through repeated in-place edits. It ends at an expanded footprint, overlap between the
  original and its duplicates is managed in set-exclusions-and-suppression.
---
# Scale Horizontally with Duplication and New Audiences

## Purpose
Every audience has a ceiling: past a certain spend level, the same pool of people gets shown the ad too
often, frequency climbs, efficiency drops, and no amount of extra budget on that one ad set fixes it.
Horizontal scaling grows total spend by duplicating what works into new audiences, geos, lookalike
percentages, or creative concepts instead of forcing more money through a saturated cell, the tradeoff is
a new risk, since the duplicate can end up competing with the original for the same people if the
expansion axis isn't genuinely new.

## When to run
- Vertical scaling has stalled: CPA breaches target as budget rises, or frequency/CPM signal saturation
  before the growth goal is met.
- A winning ad set exists and there is a clear next audience, geo, or lookalike percentage to expand into.
- Creative fatigue is compounding saturation (frequency climbing, CTR falling) and a new creative concept
  is ready to pair with the expansion.
- A broken ad set needs a clean learning reset rather than another in-place edit on a poisoned delivery
  history.

## When NOT to run
- The current ad set still has vertical headroom (CPA well under target, frequency low) →
  `scale-budget-vertically` first; it's the cheaper lever.
- No genuinely new audience/geo/lookalike-% exists to duplicate into, duplicating into an identical
  audience just creates a second bidder against the first.
- The account is already fragmented → `consolidate-fragmented-account` first; adding duplicates to a
  fragmented base worsens the self-competition problem.
- The goal is fixing overlap that already exists between live ad sets, not adding new ones →
  `set-exclusions-and-suppression` handles that directly.

## Prerequisites
- A winning ad set identified with documented CPA/ROAS, frequency, and audience/creative definition to
  duplicate from.
- A genuinely new expansion axis available: an untapped geo, a wider or narrower lookalike %, a new
  low-overlap interest cluster, or an unused creative concept, not a cosmetic variation of the same
  audience.
- Naming convention in place (`design-account-structure`) so duplicates stay identifiable.
- Confirmation the source ad set is not itself mid-learning-reset from a recent edit.

## Procedure
1. **Confirm vertical is actually stalled, not just untried.** Check the source ad set's recent budget
   history and CPA/frequency trend via `mads_run_insights`, horizontal answers saturation, not a
   default first move.
2. **Pick one expansion axis.** New geo, new lookalike % (e.g., a proven 1% tested up to 2-3%), a new
   interest cluster with low overlap against the source, or a new creative concept for the same audience.
   One axis at a time keeps the result attributable.
3. **Duplicate the winning ad set** (or campaign, for a whole-structure scale-up) rather than building
   from scratch, preserving the proven `optimization_goal`, placements, and bid settings. Use the
   platform's duplicate function, or mirror the source's configuration with `mads_create_adset`.
4. **Swap exactly the expansion axis on the duplicate.** Change only the audience/geo/lookalike-% or
   creative; leave objective, optimization_goal, and bid strategy matching the original so the test stays
   clean.
5. **Check for overlap against every live ad set, not just the source.** A new lookalike % or a broadened
   interest cluster can overlap with other campaigns' audiences too. IF overlap is unavoidable, THEN apply
   exclusions (`set-exclusions-and-suppression`) rather than letting duplicates compete in the same
   auction.
6. **Label the duplicate clearly.** Follow the account naming convention plus an explicit marker (the new
   axis value and the date) so `mads_list_adsets` stays legible and nobody mistakes a duplicate for organic
   growth.
7. **Create PAUSED.** `mads_create_adset` (and `mads_create_ad` for its ads) at `status=PAUSED`. HUMAN
   STEP: preview the full duplicate configuration against the source, get explicit approval, then
   activate as a separate confirmed step.
8. **Use duplication to reset a broken ad set when needed.** IF an ad set's delivery is poisoned (bad
   early data, a policy flag, a corrupted learning history) rather than merely saturated, THEN duplicate
   it fresh and retire the original instead of continuing to edit in place, in-place edits only stack
   more resets onto the same bad history.
9. **Track the duplicate as its own learning cycle.** It re-enters learning like any new ad set (~50
   events); don't compare its day-3 CPA against the source's mature CPA.

## Decision rules
- **Horizontal beats vertical when:** frequency is elevated and climbing, CPM is rising with flat or
  falling results, or CPA already breached target during a vertical attempt, the audience, not the
  budget, is the constraint.
- **Duplicate-to-reset vs. edit-in-place:** minor iteration (small creative refresh, small budget tweak)
  → edit in place. Structural fix needed, or delivery history is compromised → duplicate fresh and retire
  the original.
- **Overlap tolerance:** IF the new axis is expected to overlap more than ~20-30% with an existing live
  audience, THEN add exclusions before launch rather than discovering the cannibalization in the data a
  week later.
- **One axis per duplicate.** Changing geo and creative and lookalike % in the same duplicate makes it
  impossible to attribute the result to any single change.
- **Lookalike expansion order:** widen in small steps (1% to 2-3%, not 1% to 10%), large jumps dilute
  quality faster than they add volume.
- **Done means:** expansion axis chosen and documented, duplicate created PAUSED with proven settings
  preserved and only the axis changed, overlap checked and excluded where needed, clear naming applied,
  and the duplicate tracked as its own learning cycle rather than judged against the source's mature
  numbers.

## Common failure modes
- **Duplicating into an audience that's actually the same people.** A "new" interest cluster overlapping
  80% with the source just creates a second bidder against yourself.
- **Changing multiple axes at once**, leaving it impossible to tell whether the geo, the creative, or the
  lookalike % drove the result.
- **Judging a duplicate's day-2 numbers against the source's 60-day-mature numbers** and killing it
  prematurely, it's mid-learning, not underperforming.
- **Forgetting exclusions between the original and the duplicate**, especially on broad/Advantage+
  audiences where overlap is invisible until the insights report shows two ad sets splitting the same
  impressions.
- **Duplicating a structurally broken ad set's mistakes along with its wins**, duplication preserves
  whatever the source is configured with, bad settings included; verify the source is healthy before
  treating it as the template.

## Related skills
- Alternative: `scale-budget-vertically` (try this first when there's still headroom).
- Requires first: `consolidate-fragmented-account` (don't horizontally scale an already-fragmented
  account).
- Related: `set-exclusions-and-suppression` (manages the overlap these duplicates create),
  `design-account-structure` (naming/shape conventions the duplicates should follow).
