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 metricsinsights-adsets.route.ts→ ad set-level metricsinsights-ads.route.ts→ ad-level metricsinsights-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?"
Open campaign
Expand ad sets
Sort by Conversions descending
Top ad sets are the converters
"Which ad in this winning ad set is the actual winner?"
Expand the ad set
Sort by ROAS descending (or CTR if conversion data sparse)
Top ad is your winner — scale it up
"Which creative is the worst?"
Drill into an ad set with many ads
Sort by CTR ascending OR by conversions ascending
Bottom ad = candidate to pause
"Where is spend going within a campaign?"
Expand campaign + ad sets
Sort ad sets by Spend descending
Top spend = where most money flowing (often a CBO winner)
"Which audience is underdelivering?"
Drill into ad sets
Look at delivery columns (Impressions vs Reach)
Low impressions = audience too narrow or bid too low
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
Ads Manager overview — context
Bulk actions — act on drilled results
Campaign statuses — understand status badges per level