Drill-down from campaign to ad set to ad

Last updated: May 19, 2026

Drill-down from campaign to ad set to ad

Ads Manager's 3-tier hierarchy lets you navigate from campaign → ad sets → ads. Click any row to expand its children. Per-level metrics + actions per row. Critical for troubleshooting: "campaign ROAS is 1.5x — which ad set is dragging it down? Which ad within that ad set?"

Who is this for

Mediabuyers investigating underperformance. Anyone wondering "the campaign looks bad, but is it ALL ad sets or just one"?

The hierarchy

Campaign C1 (ROAS 1.5)              ← campaign-level rollup
├── Adset A1 (ROAS 2.8)              ← good
│   ├── Ad 1 (ROAS 3.2)              ← winning
│   └── Ad 2 (ROAS 2.3)              ← decent
├── Adset A2 (ROAS 0.8)              ← bad
│   ├── Ad 3 (ROAS 0.6)              ← losing
│   ├── Ad 4 (ROAS 1.0)              ← break-even
│   └── Ad 5 (ROAS 0.9)              ← losing
└── Adset A3 (ROAS 1.2)              ← below target
    ├── Ad 6 (ROAS 1.1)              ← below
    └── Ad 7 (ROAS 1.3)              ← marginal

The campaign's 1.5x ROAS hides three different situations. Action plan emerges from drill-down:

  • Adset A1: scale (winning)

  • Adset A2: kill (losing)

  • Adset A3: refresh creative or kill (marginal)

Per-ad granularity refines further (kill Ad 3, keep Ad 4 even if break-even — has potential).

How to drill down

Step 1: Find the campaign in Ads Manager

Filter / search to the campaign of interest.

Step 2: Click the row to expand

Click anywhere on the campaign row (not on a per-row action button). Row expands to show its ad sets indented below.

Step 3: Drill into ad sets

Click an ad set row → expand into its ads. Indented further below.

Step 4: Per-ad detail drawer

Click an ad row → side drawer opens with:

  • Full creative (image / video preview)

  • Full copy (primary text, headline, description, CTA)

  • Audience config snapshot

  • Performance breakdown

  • Action buttons (pause / edit / duplicate)

Per-level metrics

Level

Metrics that matter most

Campaign

Total spend, overall ROAS, total conversions (rollup)

Ad Set

Per-audience ROAS, CPA, frequency, audience size estimate

Ad

CTR, conversion rate per ad, creative fatigue indicators

Drilling down narrows from macro view (campaign-level decision) to creative-specific (which ad to keep).

Endpoints behind the drill-down

Verified apps/backend/src/routes/api/:

  • insights-campaigns.route.ts → campaign-level metrics

  • insights-adsets.route.ts → ad set-level metrics

  • insights-ads.route.ts → ad-level metrics

  • insights-sync.route.ts → sync trigger

Per-level data fetched lazily as you expand (not all loaded upfront).

Drill-down for specific use cases

"Which ad set in this campaign is converting?"

  1. Open campaign

  2. Expand ad sets

  3. Sort by Conversions descending

  4. Top ad sets are the converters

"Which ad in this winning ad set is the actual winner?"

  1. Expand the ad set

  2. Sort by ROAS descending (or CTR if conversion data sparse)

  3. Top ad is your winner — scale it up

"Which creative is the worst?"

  1. Drill into an ad set with many ads

  2. Sort by CTR ascending OR by conversions ascending

  3. Bottom ad = candidate to pause

"Where is spend going within a campaign?"

  1. Expand campaign + ad sets

  2. Sort ad sets by Spend descending

  3. Top spend = where most money flowing (often a CBO winner)

"Which audience is underdelivering?"

  1. Drill into ad sets

  2. Look at delivery columns (Impressions vs Reach)

  3. Low impressions = audience too narrow or bid too low

  4. Action: broaden audience or increase bid

Cross-level actions

Action

Where applicable

Pause

Campaign, Ad Set, or Ad

Edit budget

Campaign (CBO) or Ad Set (ABO)

Edit targeting

Ad Set only (audience lives at adset level)

Edit creative

Ad only

Duplicate

Campaign, Ad Set, or Ad (am-106)

Add new ad

Right-click ad set → Add ad (am-109)

Cascade behavior: pause campaign → all ad sets + ads also pause. Pause ad set → all ads in that ad set pause. Pause ad → only that ad pauses.

Expand all / collapse all

Top toolbar:

  • Expand all: opens every campaign's ad sets (and optionally ads)

  • Collapse all: returns to campaign-only view

For workspaces with 100+ campaigns: expand all is slow. Use per-campaign expand instead.

Mobile drill-down

Mobile UI (mobile-ads-manager.tsx) supports drill but with simplified controls:

  • Tap to expand

  • Per-row swipe actions for pause/resume

  • Full edit requires desktop

Performance considerations

  • Campaign-level data: cached aggressively (5 min)

  • Ad set + ad data: fetched on expand (1-3 sec lazy load)

  • For very large hierarchies (1000+ ads in one campaign): pagination within the ad list

What you'll see during drill-down

  • Indentation shows hierarchy level

  • Hover row → action buttons appear

  • Click row → expand

  • Click again → collapse

  • Per-row selection checkbox (for bulk actions across levels — but typically actions are level-scoped)

Common issues

  • "Expand button doesn't work": row may not have children (ad set with 0 ads). Check the ad set was created with at least one ad.

  • "Wrong metrics on ad set vs campaign rollup": campaign aggregates ad sets; sometimes ad set data is stale and campaign refreshed (15-min sync lag). Refresh both.

  • "Cannot find an ad I expected": filter out archived. Toggle "Show archived" in filter.

  • "Expand all very slow": large workspace. Use selective expand instead.

Best practices

Always drill before bulk action

Before pausing a campaign, drill in. Maybe one ad set is great + you'd kill it by killing the campaign. Drill to identify just the bad ad set + pause that instead.

Use drill to identify scale targets

Same approach: drill to find the ONE ad in a winning ad set that's the actual winner. Scale that one with higher budget; pause the rest.

Document findings in audit-friendly notes

When you pause something via drill, note WHY in a comment field (if available) OR in your team's runbook. Future you will thank you.

Related