> ## Documentation Index
> Fetch the complete documentation index at: https://docs.theoptimizer.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Generate Campaign Variations

> Use Groups, Campaign Restructuring, and Duplication to turn a simple base campaign into dozens or hundreds of targeted variations.

export const ArcadeVideoButton = ({id, title = "Watch interactive demo", label = "Watch Video"}) => {
  const [open, setOpen] = useState(false);
  return <div style={{
    display: 'inline-block'
  }}>
      <button type="button" onClick={() => setOpen(true)} style={{
    display: 'inline-flex',
    alignItems: 'center',
    gap: '8px',
    backgroundColor: '#3e47ec',
    color: '#ffffff',
    border: 'none',
    padding: '10px 18px',
    borderRadius: '8px',
    fontSize: '15px',
    fontWeight: '600',
    cursor: 'pointer'
  }}>
        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="white">
          <polygon points="5,3 19,12 5,21" />
        </svg>
        {label}
      </button>

      {open && <div onClick={() => setOpen(false)} style={{
    position: 'fixed',
    top: 0,
    left: 0,
    width: '100%',
    height: '100%',
    backgroundColor: 'rgba(0, 0, 0, 0.85)',
    zIndex: 9999999,
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'center'
  }}>
          <div onClick={e => e.stopPropagation()} style={{
    width: '90%',
    maxWidth: '1100px',
    aspectRatio: '16 / 9',
    borderRadius: '12px',
    overflow: 'hidden',
    position: 'relative'
  }}>
            <iframe src={`https://demo.arcade.software/${id}?embed&embed_mobile=tab&embed_desktop=inline&show_copy_link=true`} title={title} frameBorder="0" loading="lazy" allowFullScreen allow="clipboard-write" style={{
    width: '100%',
    height: '100%',
    border: 'none',
    colorScheme: 'light'
  }} />
          </div>

          <button type="button" onClick={() => setOpen(false)} style={{
    position: 'fixed',
    top: '20px',
    right: '24px',
    background: 'rgba(255,255,255,0.15)',
    border: 'none',
    color: '#ffffff',
    fontSize: '24px',
    lineHeight: 1,
    width: '40px',
    height: '40px',
    borderRadius: '50%',
    cursor: 'pointer',
    display: 'flex',
    alignItems: 'center',
    justifyContent: 'center'
  }}>
            ✕
          </button>
        </div>}
    </div>;
};

export const ArcadePopoutModal = ({id, title = "Interactive demo"}) => {
  const [isPopout, setIsPopout] = useState(false);
  const iframeRef = useRef(null);
  useEffect(() => {
    function onArcadeIframeMessage(e) {
      if (e.origin !== 'https://demo.arcade.software' || !e.isTrusted) return;
      if (!iframeRef.current || !iframeRef.current.contentWindow) return;
      if (e.data.event === 'arcade-init') {
        iframeRef.current.contentWindow.postMessage({
          event: 'register-popout-handler'
        }, '*');
      }
      if (e.data.event === 'arcade-popout-open') {
        setIsPopout(true);
      }
      if (e.data.event === 'arcade-popout-close') {
        setIsPopout(false);
      }
    }
    window.addEventListener('message', onArcadeIframeMessage);
    return () => window.removeEventListener('message', onArcadeIframeMessage);
  }, []);
  return <div style={{
    position: 'relative',
    paddingBottom: 'calc(54.4737% + 41px)',
    height: 0,
    width: '100%'
  }}>
      <iframe ref={iframeRef} src={`https://demo.arcade.software/${id}?embed&embed_mobile=tab&embed_desktop=modal&show_copy_link=true`} title={title} frameBorder="0" loading="lazy" allowFullScreen allow="clipboard-write" style={{
    position: isPopout ? 'fixed' : 'absolute',
    top: 0,
    left: 0,
    width: '100%',
    height: '100%',
    zIndex: isPopout ? 9999999 : 'auto',
    colorScheme: 'light'
  }} />
    </div>;
};

The variation generation system is what makes the Facebook Campaign Launcher fundamentally different from Facebook Ads Manager. Instead of manually creating every campaign, ad set, and ad, you use one — or a combination — of three mechanisms to generate your full structure from a simple starting point.

***

## Using Groups

Groups let you define multiple values for a targeting section, and the system generates a variation for each group automatically.

In several sections across the campaign, ad set, and ad levels, you will see a **Group Card** — a row starting with one default group and a **+** button to add more. Each group you create represents a separate variation of the entity you are working on. Click on each group tab to customise its settings independently.

For example, if you create two audience groups at the ad set level — one targeting the US and one targeting the UK — TheOptimizer produces two ad set variations, identical in every way except their audience targeting.

**Managing groups.** Click the three-dot menu (⋯) on any group to:

* **Rename** — give the group a meaningful name (e.g., "US Audience" or "Budget \$50"). Group names can be referenced in dynamic naming templates.
* **Clone** — duplicate this group's settings into a new group.
* **Clone Bulk** — duplicate the group multiple times at once.
* **Delete** — remove the group.
* **Manage combinations** — open the combinations manager scoped to this group only, so you can toggle which combinations involving this specific group are active. See [Manage Combinations](#manage-combinations) below.

**Bulk group actions.** Click the **hamburger icon (≡)** to the left of the group tabs to open the group management panel. You can select multiple groups simultaneously using the checkboxes, then apply **Clone**, **Rename**, or **Delete** to all selected groups at once — useful when you have many groups and need to reorganise or bulk-remove them.

<Frame>
  <img src="https://mintcdn.com/theoptimizer/O8iFyEbm57dw8ihy/images/bulk-group-management.png?fit=max&auto=format&n=O8iFyEbm57dw8ihy&q=85&s=bfcd5ec51227bde42c56f00a19008327" alt="Bulk group management panel — select multiple groups and clone, rename, or delete them in bulk" width="1320" height="1692" data-path="images/bulk-group-management.png" />
</Frame>

**Where groups are available:**

| Level        | Section           | Group name in UI | What varies between groups                                            |
| ------------ | ----------------- | ---------------- | --------------------------------------------------------------------- |
| **Campaign** | Budget            | Budget Group     | Daily budget amount, bid strategy                                     |
| **Ad Set**   | Budget & Schedule | Budget Group     | Per-ad-set daily/lifetime budget, schedule                            |
| **Ad Set**   | Audience Controls | Audience Group   | Locations (include/exclude), age, gender, languages, custom audiences |
| **Ad Set**   | Placements        | Placement Group  | Advantage+ vs manual placements, platform/position selections         |
| **Ad**       | Identity          | Identity Group   | Facebook Page, Instagram Account                                      |
| **Ad**       | Ad Creative       | Creative Group   | Media (images/videos), primary text, headlines, descriptions          |

**How permutations are calculated.** Groups at the same level multiply with each other. If you create three budget groups and three audience groups at the ad set level, the system generates 3 × 3 = 9 ad set variations. Add two placement groups and you get 3 × 3 × 2 = 18 ad set variations.

The **Variation Preview** panel on the right updates in real time as you add groups. Always check this counter before proceeding.

<Warning>
  Permutations can grow quickly. Three groups in three different sections produces 27 variations. Make sure the total in the **Variation Preview** is intentional before moving forward.
</Warning>

***

## Using Campaign Restructuring

Campaign Restructuring lets you take the variations you have built and distribute them across separate campaigns and ad sets exactly the way your testing strategy requires. Unlike older versions of the launcher where restructuring was a late step, **restructuring is now defined at the very beginning of the campaign creation flow**, immediately after selecting an ad account and naming your campaign.

This means you can plan your final structure upfront — before you even configure audiences or upload creatives — which prevents surprises at the end and makes the whole process faster.

Restructuring is split into two independent sections: one at the **campaign level** and one at the **ad set level**. Both sections have a **Preview** button that shows the complete campaign tree — with naming templates applied — based on your current settings and any groups you have already defined.

***

### Structure Your Campaigns

The **Structure your campaigns** section sits at the top of the **Create Campaign** step (Step 1). It controls how your total set of ad sets and ads gets distributed across campaigns.

<Frame>
  <img src="https://mintcdn.com/theoptimizer/ZHMpEyoJnNrJjwpl/images/restructure-campaign-level.png?fit=max&auto=format&n=ZHMpEyoJnNrJjwpl&q=85&s=2fafeb3c8a9c3f6572506639a1dc8e55" alt="Structure your campaigns — campaign-level restructuring UI" width="1144" height="778" data-path="images/restructure-campaign-level.png" />
</Frame>

There are two options, each independently toggleable. You can enable one, the other, or both simultaneously.

**Option 1 — Generate campaigns based on Ad Set groups**

This option lets you specify which ad set groups each generate a separate campaign. For example, if you have defined Audience groups and Placement groups at the ad set level, you can tell the system: "Give each unique combination of audience and placement its own campaign."

Selecting a group here moves that dimension of variation from the ad set level up to the campaign level. The result: each campaign contains ad sets that share the same audience/placement combination, and different campaigns are used to isolate different targeting setups.

Multiple groups can be combined. The number of campaigns created equals the number of unique combinations across all selected groups. For example:

* 5 Audience groups × 3 Placement groups = **15 campaigns**, each containing ad sets for one specific audience + placement pair
* Any other groups you defined but did not include here (e.g., Budget groups) remain as ad set-level variation inside each campaign

This option did not exist in the previous version of the launcher. Previously, you could only separate campaigns by the number of ad sets — you had no way to say "I want a separate campaign for each audience I'm testing."

<Tip>
  Use group-based campaign separation when your testing strategy is audience-first or placement-first. It gives you clean, isolated campaign budgets per targeting dimension without having to manually create each campaign.
</Tip>

**Option 2 — Generate campaigns based on the number of Ad Sets per campaign**

This is the same option that existed in the previous version, now surfaced earlier in the flow.

Toggle it on and set a number — for example, 1. The system will create as many campaigns as needed to give each ad set its own campaign. Set it to 2 and each campaign gets two ad sets, and so on.

Example: you have generated 20 ad set variations total. Setting this to "1 Ad Set per campaign" creates 20 campaigns, each with 1 ad set. Setting it to "2 Ad Sets per campaign" creates 10 campaigns, each with 2 ad sets.

**Combining both options**

If both options are enabled at the same time, their results are multiplied together.

Example: you have 5 Audience groups and 3 Placement groups selected in Option 1, generating 15 base campaigns. You also have 20 total ad sets and have enabled Option 2 with "1 Ad Set per campaign". The final campaign count becomes 15 × 20 = **300 campaigns**.

The **Preview** button at the bottom of this section shows the full resulting structure — including naming templates — so you can verify the outcome before you've finished building the campaign.

***

### Structure Your Ad Sets

The **Structure your ad sets** section works at the ad level — controlling how your ads get distributed across ad sets.

<Frame>
  <img src="https://mintcdn.com/theoptimizer/ZHMpEyoJnNrJjwpl/images/restructure-adset-level.png?fit=max&auto=format&n=ZHMpEyoJnNrJjwpl&q=85&s=e1f779cd8d24cd8ba0cff19081ce64ca" alt="Structure your ad sets — ad set-level restructuring UI" width="1150" height="778" data-path="images/restructure-adset-level.png" />
</Frame>

It has the same two-option layout as the campaign-level section, and also has a **Preview** button.

**Option 1 — Generate ad sets based on Ad groups**

This option lets you specify which ad-level groups each generate a separate ad set. For example:

* Select **Identity group** → each Facebook Page / Instagram Account combination gets its own ad set
* Select **Creative group** → each creative group (images, videos, copy variations) gets its own ad set
* Select both → each combination of identity and creative gets its own ad set

This is particularly useful for:

* **Testing images vs. videos in separate ad sets** — create one Creative group with images and one with videos, select it here, and each gets its own ad set
* **Running ads under different Pages in separate ad sets** — identity isolation per ad set without manual duplication
* **Testing different copy groups on separate ad sets** — group ads by copy variation and isolate each group

This option did not exist previously. In the old version, groups were only used at the ad level to generate ad variations — there was no way to say "I want a separate ad set for each creative group." Now you can.

**Option 2 — Generate ad sets based on the number of Ads per ad set**

Toggle this on and set the number of ads per ad set. The system generates the necessary number of ad sets to accommodate all your ads at that count.

Example: you have uploaded 30 images (30 ads). Setting this to "5 Ads per Ad Set" creates 6 ad sets, each containing 5 ads. Setting it to "1 Ad per Ad Set" creates 30 ad sets.

**How ad set restructuring affects campaign restructuring**

The total number of ad sets generated by the ad set-level restructuring feeds directly into the campaign-level restructuring calculation. If the ad set structure produces 30 ad sets and you have "1 Ad Set per campaign" enabled at the campaign level, you will end up with 30 campaigns — regardless of how many you started with.

Always use the **Preview** button after configuring both sections to see the final campaign count and structure.

***

### Manage Combinations

By default, when you define multiple groups across levels, the system generates every possible combination of those groups. **Manage Combinations** gives you precise control over which specific combinations actually get created — letting you remove nonsensical pairings without deleting any groups.

The **Manage combinations** option appears at the top of both the **Structure your campaigns** and **Structure your ad sets** sections — above the two generate/restructure toggles. Click the **Manage** button to open the combinations manager.

<Frame>
  <img src="https://mintcdn.com/theoptimizer/O8iFyEbm57dw8ihy/images/new-restructure-section-with-manage-option.png?fit=max&auto=format&n=O8iFyEbm57dw8ihy&q=85&s=bf0ecfd971f26a968dc4e9e8ad1d57eb" alt="Structure your campaigns section — Manage combinations option with Manage button, above the two restructuring toggles" width="2522" height="1424" data-path="images/new-restructure-section-with-manage-option.png" />
</Frame>

#### The Manage Combinations Dialog

The dialog lists every possible combination of your current groups. Each row shows the groups involved (e.g., CREATIVE **EN** + DESTINATION **EN-LP01**) and a toggle to include or exclude that combination.

<Frame>
  <img src="https://mintcdn.com/theoptimizer/O8iFyEbm57dw8ihy/images/manage-combinations-dialog-all-combinations.png?fit=max&auto=format&n=O8iFyEbm57dw8ihy&q=85&s=3c5b9ace1ee17470671dbea9276668df" alt="Manage Combinations dialog — list of all group combinations with individual toggles, showing Active and Excluded counts" width="1608" height="1446" data-path="images/manage-combinations-dialog-all-combinations.png" />
</Frame>

At the top of the dialog, a counter shows how many combinations are **Active** vs. **Excluded** in total. A search field lets you find a specific combination by name. Use the **Filter by** dropdowns to narrow the list by group type (e.g., show only combinations involving a specific Destination or Creative group).

At the bottom, three bulk action buttons let you act on the filtered list:

* **Enable shown** — activate all combinations currently visible in the filtered list
* **Disable shown** — exclude all combinations currently visible
* **Disable everything** — exclude every combination at once (useful for starting from zero and enabling only what you want)

#### Auto-Match by Name

Instead of toggling combinations manually, use **Auto-match by name** to automatically pair groups that share a name across levels. This is the fastest way to set up localisation-style structures where each creative group should only run with the matching destination group.

**Match by full name** — pairs groups whose names are identical. For example, a Creative group named "EN" is automatically enabled only with Destination groups also named "EN", while all cross-language pairings are excluded.

**Match by pattern** — pairs groups that share a common prefix when you split the name by a delimiter. Set the delimiter (e.g., `-`) and the part to match on (e.g., "First part"), then click **Match**. For example, with delimiter `-` and match on "First part": a Creative group named "EN" matches Destination groups named "EN-LP01" and "EN-LP02" (both start with "EN-"), while "KO-LP01" and "MR-LP01" are excluded.

<Frame>
  <img src="https://mintcdn.com/theoptimizer/O8iFyEbm57dw8ihy/images/manage-combinations-dialog-match-by-prefix.png?fit=max&auto=format&n=O8iFyEbm57dw8ihy&q=85&s=d112496c2b57625b64216d44b780d198" alt="Manage Combinations dialog — Match by pattern tab showing delimiter and 'First part' match settings" width="1608" height="1562" data-path="images/manage-combinations-dialog-match-by-prefix.png" />
</Frame>

<Tip>
  Auto-match by name is especially powerful for localisation campaigns: name your Creative groups by language code (EN, KO, MR, …) and your Destination groups as {language}-{lander} (EN-LP01, KO-LP01, …). One click of Match by pattern wires up all the correct creative-to-lander pairs and excludes every cross-language mismatch automatically.
</Tip>

***

### Restructuring Examples

**Example 1 — Isolate each creative in its own campaign (full budget isolation)**

Goal: 20 image ads, one campaign per creative, each with its own budget.

Setup:

* Ad set level → Option 2 → 1 Ad per Ad Set → generates 20 ad sets
* Campaign level → Option 2 → 1 Ad Set per campaign → generates 20 campaigns

Result: 20 campaigns, each with 1 ad set and 1 ad. Every creative has a completely isolated budget.

***

**Example 2 — Test audiences in separate campaigns, creatives in separate ad sets**

Goal: 3 audiences each tested in their own campaign; within each campaign, each creative gets its own ad set.

Setup:

* Ad Set level → Audience groups (3 groups) → selected in Campaign level Option 1 → 3 campaigns
* Creative group (5 creatives) → selected in Ad Set level Option 1 → 5 ad sets per campaign

Result: 3 campaigns × 5 ad sets = 15 ad sets total. Each campaign targets one audience; within each campaign, each creative has its own ad set.

***

**Example 3 — Test pages in separate ad sets, audiences in separate campaigns**

Goal: Run ads under 2 different Facebook Pages; test 4 different audiences, each in a separate campaign.

Setup:

* Ad level → Identity group (2 groups, one per Page) → selected in Ad Set level Option 1 → 2 ad sets per campaign
* Ad Set level → Audience group (4 groups) → selected in Campaign level Option 1 → 4 campaigns

Result: 4 campaigns × 2 ad sets = 8 ad sets total. Each campaign targets one audience; within each campaign, there is one ad set per Facebook Page identity.

***

## Reviewing the Preview

Both the campaign-level and ad-set-level restructuring sections include a **Preview** button. Clicking it generates a complete, expandable campaign tree showing:

* Every campaign that will be created, with its name (using your naming template)
* Every ad set inside each campaign, with its name
* Every ad inside each ad set

The preview updates dynamically as you add groups and change restructuring settings throughout the campaign creation process. Use it frequently — especially before moving to the Review Variations step — to catch misconfigurations early.

***

## Reviewing Variations (Step 2)

Once you complete the Create Campaign step (Step 1), clicking **Review Variations** takes you to a full read-only summary of the structure you are about to launch.

<Frame>
  <img src="https://mintcdn.com/theoptimizer/ZHMpEyoJnNrJjwpl/images/review-variations.png?fit=max&auto=format&n=ZHMpEyoJnNrJjwpl&q=85&s=5659c9a9841245790a6fbb80c9ffed4c" alt="Review Variations step — information cards and campaign tree" width="2726" height="1838" data-path="images/review-variations.png" />
</Frame>

The Review Variations step is now purely a review screen. Restructuring is no longer done here — it was moved to Step 1 in the latest version of the launcher.

**What you see in Step 2:**

At the top, a row of summary cards shows:

* Number of Campaigns
* Number of Ad Sets
* Total Daily Budget (for ad set-level budgets)
* Number of Ad Set Variations
* Number of Audiences
* Number of Ads
* Number of Headlines
* Number of Descriptions
* Number of Ad Variations

Below the summary cards is the full campaign tree — Campaign → Ad Set → Ad — with each item showing its final name (naming templates applied). Every item in the tree has a **toggle switch** you can use to enable or disable that specific variation. Disabling a campaign disables everything inside it; disabling an individual ad set or ad removes just that item from the launch.

This is where you make any final adjustments — for example, removing a specific ad from one ad set, or disabling a campaign variation you no longer want — without going back and re-configuring the whole structure.

***

## Using Duplication

The third way to generate variations is by manually duplicating items in the left panel tree. Click the three-dot menu (⋯) on any campaign, ad set, or ad and select **Duplicate** (to copy with all settings) or **Create New** (to start a fresh one).

Duplication creates an exact copy of the selected item and everything inside it. You can then click on the copy and modify its settings — different creatives, different destination URLs, different structure.

This is the most manual approach, but it gives you full control over exactly what goes inside each campaign, ad set, or ad.

***

## Groups vs. Restructuring vs. Duplication — When to Use Which

| Method            | Best for                                                                                                                 | Control level                                                    |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- |
| **Groups**        | Testing combinations of variables (budgets × audiences × placements) — you want all permutations generated automatically | You control the variables; the system generates all combinations |
| **Restructuring** | Deciding how ad sets and ads are distributed across campaigns — audience isolation, creative isolation, budget isolation | You control the distribution rule; the system does the splitting |
| **Duplication**   | When you need specific creatives in specific ad sets, or different destination URLs per ad — full manual control         | You control everything; no automation                            |

In practice, most workflows use a combination: Groups define what varies, Restructuring decides how variations are distributed across campaigns and ad sets, and Duplication handles the parts that need manual precision.

***

## Next Steps

* [Multi-Ad Account Launch](/ad-networks/facebook/campaign-uploader/multi-account) — launch the same structure across multiple ad accounts simultaneously
* [Dynamic Naming Templates](/ad-networks/facebook/campaign-uploader/naming-templates) — auto-generate meaningful names across all your variations
