Skip to main content
The built-in reports (daily check, bleeders, winners, fatigue) cover 90% of ad management. But when you need to dig deeper — audience demographics, device performance, placement analysis — you need custom reports.

Basic Structure

Every custom report has three components:
  1. Level — Campaign, adset, or ad
  2. Fields — Metrics to include (spend, CTR, CPC, etc.)
  3. Breakdowns — How to slice the data (age, gender, device, etc.)

Command Syntax


The Level Parameter

Controls which object type you’re analyzing.
Use when: You want account-level or campaign-level performance.
Example Output:

Available Fields

Specify which metrics to include in your report.

Performance Metrics

Conversion Metrics

Engagement Metrics

Identity Fields

Not all fields are available at all levels. For example, ad_name only works with --level ad.

Breakdowns

Slice your data by demographic, placement, or device.

Demographic Breakdowns

Performance by age range.
Example Output:
Insights:
  • 25-34 is the highest performing age range (3.4% CTR, 14 conversions)
  • Consider shifting budget to 25-44 age range

Placement Breakdowns

Facebook vs Instagram performance.
Example Output:
Insights:
  • Instagram placements outperform Facebook (3.4% vs 2.8% CTR)
  • Instagram has lower CPC (0.89vs0.89 vs 1.12)
  • Consider shifting budget to IG placements

Time Breakdowns

Example Output:
Use --time-increment 1 for daily breakdowns. This is how the fatigue check works under the hood.

Real-World Examples

Example 1: Find Best Performing Demographics

Goal: Identify which age/gender combo drives the most conversions.
How to use the output:
  1. Sort by cost_per_conversion (lowest = best)
  2. Identify winning segments (e.g., Women 25-34)
  3. Create dedicated ad sets targeting those segments
  4. Exclude poor performers from broad targeting

Example 2: Instagram vs Facebook Performance

Goal: Decide where to allocate budget.
How to use the output:
  1. Compare CTR, CPC, and ROAS across platforms
  2. If Instagram outperforms, shift budget there
  3. Or create platform-specific creatives optimized for each

Example 3: Track Creative Fatigue Over Time

Goal: See day-by-day CTR decline for a specific ad.
How to use the output:
  1. Plot CTR over time
  2. Identify when decline started
  3. Correlate with frequency — does fatigue start at frequency > 3?
  4. Use this to predict when future creatives will fatigue

Example 4: Audience Comparison

Goal: Which audience (adset) is most efficient?
How to use the output:
  1. Sort by cost_per_conversion
  2. Check frequency — audiences with frequency > 3 are saturated
  3. Scale winners (low CPA, frequency < 2.5)
  4. Pause or refresh fatigued audiences (high frequency, rising CPA)

Advanced: Combining Reports

Chain multiple custom reports to build a full analysis.

Workflow: Optimize an Underperforming Campaign

1

Campaign-level overview

Identify the underperforming campaign (low ROAS, high CPC).
2

Ad-level breakdown

Find which specific ads are dragging performance down.
3

Demographic breakdown

Identify if certain demographics are causing the high CPA.
4

Placement breakdown

Check if specific placements (e.g., Audience Network) are inefficient.
5

Take action

Based on findings:
  • Pause underperforming demographics
  • Exclude inefficient placements
  • Pause bleeders
  • Scale winners

Tips for Custom Reports

Requesting too many fields slows down the API and makes output hard to read.Good:
Too much:
Request only the metrics you need for the specific analysis.
Each breakdown multiplies the number of rows in the output. Combining 3+ breakdowns can create overwhelming data.Good for exploration:
Too granular (hard to interpret):
Pipe output to a CSV for analysis in Excel/Sheets:

Common Questions

Built-in reports (bleeders, winners, fatigue) are pre-configured for specific use cases and include analysis + recommendations.Custom reports are raw data queries — you get the metrics you ask for, but no interpretation.Use built-in reports for daily workflow. Use custom reports for deep dives and one-off analysis.
Not directly in the command. Instead:
  1. Run the full report
  2. Export to CSV
  3. Filter in Excel/Sheets/Python
Or use the raw social-cli command with filtering:
Possible reasons:
  1. Metric not available at that level: E.g., ad_name only works with --level ad
  2. Insufficient data: If the time range is too short, some metrics won’t populate
  3. Conversion tracking not set up: Metrics like purchases require proper event tracking

Next Steps

Reports Overview

See all available reports and when to use each

Fatigue Detection

Learn how to use time-increment reports to catch fatigue