Skip to content

template

Investigate spend changes

Find the campaigns or targets driving a change in spend.

Changes nothingWhen you investigate a change

How it works

When it helps. Account spend changed and you want to know which campaigns or targets contributed to it.

It looks at

  • Spend in two periods
  • Clicks and CPC
  • Orders, sales and ACoS
  1. 1Compares recent spend with a baseline, applying the configured reliability thresholds.
  2. 2Breaks the change into click-volume and CPC contributions and adds performance context.

What you get back

An investigation view showing the entities driving the change. It reads and reports; it does not change bids, budgets or campaign state.

Make it fit your account

Your Copilot helps you choose the settings before previewing the results.

  • Recent and baseline periods
  • Dataset, minimum data and change thresholds
View logic and technical details
Version
1.1
Dataset
Any level (Campaigns to Search Terms)
Item ID
insight-anomaly-detection-spend
View versioned source

Download source file

Segment Logic

/*
=== Anomaly Detection: Spend ===
Version: 1.1
Docs: merchjar.com/templates?t=insight-anomaly-detection-spend
Changelog: v1.1 - Exclusion filter fixed to `does not contain all` (the `any` form silently disabled it); diagnostic renamed $result -> $planned_action per guidelines.

Purpose: Identifies entities driving spend changes for account-level investigation. Surfaces spend anomalies and attributes each to click-volume vs CPC, with performance context. Read-only investigation tool - takes no action.
Dataset: Any level (Campaigns to Search Terms)
Recommended: Ad-hoc investigation tool | Change dataset based on investigation depth needed
Tags: anomaly, spend, diagnostics, one-off, find-opportunities
Risk: read-only
Schedule: on-demand
Goal: understand
Requires-Properties: none
Pairs-With: performance-check, troubleshoot
Last-Updated: 2026-09-04
Min-Pack-Version: 1.0.0
*/

// === Time Periods ===
let $period_recent = 0d..7d;                    // TIME: Recent spend window (7 days)
let $period_baseline = 8d..35d;                 // TIME: Baseline comparison (28 days)
// === Reliability Thresholds ===
let $spend_min = 5.00;                          // CORE: Minimum baseline spend for reliable analysis [e.g., $5+ spend]
let $impressions_min = 50;                      // CORE: Minimum baseline impressions for meaningful context [e.g., 50+ impressions]
let $clicks_min = 5;                            // CORE: Minimum baseline clicks for reliable spend attribution [e.g., 5+ clicks]
// === Shift Detection ===
let $spend_moderate = 30%;                      // STRATEGY: Moderate spend shift threshold [e.g., 30% = $100 to $130 or $70]
let $spend_severe = 75%;                        // STRATEGY: Severe spend shift threshold [e.g., 75% = $100 to $175 or $25]
let $component_threshold = 25%;                 // STRATEGY: Click/CPC shift to attribute root cause [e.g., 25% shift = meaningful driver]
// === Performance Context ===
let $acos_acceptable_threshold = 120%;          // STRATEGY: ACOS threshold for performance assessment [e.g., 120% = 30% target → 36% acceptable]
let $acos_problem_threshold = 150%;             // STRATEGY: ACOS threshold for problem identification [e.g., 150% = 30% target → 45% problem]
// === Segment Filters ===
let $include_campaigns = [""];                  // FILTER: Apply to all campaigns, or specify terms like ["SP-", "Auto", "Research"]
let $exclude_campaigns = ["NEVER_MATCH"];       // FILTER: Exclude campaigns containing these terms, e.g., ["Brand", "Test", "Archive"]
// ============================================================================
// === Segment Logic ===
// ============================================================================
// === Baseline & Recent Metrics ===
let $spend_recent = spend($period_recent);
let $spend_baseline = spend($period_baseline);
let $impressions_recent = impressions($period_recent);
let $impressions_baseline = impressions($period_baseline);
let $clicks_recent = clicks($period_recent);
let $clicks_baseline = clicks($period_baseline);
let $cpc_recent = cpc($period_recent);
let $cpc_baseline = cpc($period_baseline);
let $acos_recent = acos($period_recent);
let $acos_baseline = acos($period_baseline);
let $orders_recent = orders($period_recent);
let $orders_baseline = orders($period_baseline);
// === Data Reliability ===
let $sufficient_data = case(
    $spend_baseline >= $spend_min and $impressions_baseline >= $impressions_min and $clicks_baseline >= $clicks_min => 1,
    else 0
);
let $sufficient_for_acos = case(
    $orders_recent >= 1 and $orders_baseline >= 1 => 1,
    else 0
);
// === Calculate Changes ===
// Spend = Clicks × CPC, so analyze these components
let $spend_change = case(
    $spend_baseline > 0 => ($spend_recent - $spend_baseline) / $spend_baseline,
    else 0
);
let $clicks_change = case(
    $clicks_baseline > 0 => ($clicks_recent - $clicks_baseline) / $clicks_baseline,
    else 0
);
let $cpc_change = case(
    $cpc_baseline > 0 => ($cpc_recent - $cpc_baseline) / $cpc_baseline,
    else 0
);
let $acos_change = case(
    $sufficient_for_acos = 1 and $acos_baseline > 0 => ($acos_recent - $acos_baseline) / $acos_baseline,
    else 0
);
// === Severity Assessment ===
let $spend_severity = case(
    $spend_change >= $spend_severe => "severe_increase",
    $spend_change >= $spend_moderate => "moderate_increase",
    $spend_change <= -1 * $spend_severe => "severe_decrease",
    $spend_change <= -1 * $spend_moderate => "moderate_decrease",
    else "normal"
);
let $has_anomaly = case(
    $spend_severity != "normal" => 1,
    else 0
);
// === Root Cause Analysis ===
// Determine if spend change is driven by click volume or cost per click
let $driven_by_clicks = case(
    $clicks_change >= $component_threshold or $clicks_change <= -1 * $component_threshold => 1,
    else 0
);
let $driven_by_cpc = case(
    $cpc_change >= $component_threshold or $cpc_change <= -1 * $component_threshold => 1,
    else 0
);
let $change_driver = case(
    $driven_by_clicks = 1 and $driven_by_cpc = 1 => "clicks_and_cpc",
    $driven_by_clicks = 1 => "click_volume",
    $driven_by_cpc = 1 => "cost_per_click",
    else "minor_shifts"
);
// === Performance Assessment ===
let $performance_status = case(
    $sufficient_for_acos = 0 => "insufficient_data",
    target acos <= 0 => "no_target",
    $acos_recent > target acos * $acos_problem_threshold => "poor_efficiency",
    $acos_recent > target acos * $acos_acceptable_threshold => "acceptable_efficiency",
    $acos_recent > target acos => "near_target",
    else "good_efficiency"
);
// === Spend Impact Assessment ===
let $spend_impact = case(
    $spend_recent >= 50.00 => "high_impact",
    $spend_recent >= 20.00 => "medium_impact",
    $spend_recent >= 5.00 => "low_impact",
    else "minimal_impact"
);
// === Diagnostic Properties ===
let $reason = case(
    $sufficient_data = 0 => "Insufficient spend history",
    $has_anomaly = 0 => "No significant spend shift detected",
    // Severe increases with performance context
    $spend_severity = "severe_increase" and $performance_status = "poor_efficiency" and $change_driver = "click_volume" => "Severe spend increase from click volume growth with poor ACOS",
    $spend_severity = "severe_increase" and $performance_status = "poor_efficiency" and $change_driver = "cost_per_click" => "Severe spend increase from CPC escalation with poor ACOS",
    $spend_severity = "severe_increase" and $performance_status = "poor_efficiency" => "Severe spend increase with poor efficiency",
    $spend_severity = "severe_increase" and $change_driver = "click_volume" => "Severe spend increase driven by click volume growth",
    $spend_severity = "severe_increase" and $change_driver = "cost_per_click" => "Severe spend increase driven by CPC escalation",
    $spend_severity = "severe_increase" and $change_driver = "clicks_and_cpc" => "Severe spend increase from both click volume and CPC rises",
    $spend_severity = "severe_increase" => "Severe spend increase detected",
    // Moderate increases with performance context
    $spend_severity = "moderate_increase" and $performance_status = "poor_efficiency" and $change_driver = "click_volume" => "Moderate spend increase from click volume with poor ACOS",
    $spend_severity = "moderate_increase" and $performance_status = "poor_efficiency" and $change_driver = "cost_per_click" => "Moderate spend increase from CPC rise with poor ACOS",
    $spend_severity = "moderate_increase" and $performance_status = "poor_efficiency" => "Moderate spend increase with poor efficiency",
    $spend_severity = "moderate_increase" and $change_driver = "click_volume" => "Moderate spend increase from click volume growth",
    $spend_severity = "moderate_increase" and $change_driver = "cost_per_click" => "Moderate spend increase from CPC rise",
    $spend_severity = "moderate_increase" and $change_driver = "clicks_and_cpc" => "Moderate spend increase from click volume and CPC",
    $spend_severity = "moderate_increase" => "Moderate spend increase detected",
    // Decreases with performance context
    $spend_severity = "severe_decrease" and $performance_status = "good_efficiency" and $change_driver = "click_volume" => "Severe spend drop from lost clicks despite good ACOS",
    $spend_severity = "severe_decrease" and $change_driver = "click_volume" => "Severe spend drop due to lost clicks",
    $spend_severity = "severe_decrease" and $change_driver = "cost_per_click" => "Severe spend drop due to CPC decrease",
    $spend_severity = "severe_decrease" and $change_driver = "clicks_and_cpc" => "Severe spend drop from both click and CPC declines",
    $spend_severity = "severe_decrease" => "Severe spend decrease detected",
    $spend_severity = "moderate_decrease" and $performance_status = "good_efficiency" and $change_driver = "click_volume" => "Moderate spend drop from reduced clicks despite good ACOS",
    $spend_severity = "moderate_decrease" and $change_driver = "click_volume" => "Moderate spend drop from reduced clicks",
    $spend_severity = "moderate_decrease" and $change_driver = "cost_per_click" => "Moderate spend drop from CPC decrease",
    $spend_severity = "moderate_decrease" and $change_driver = "clicks_and_cpc" => "Moderate spend drop from click and CPC declines",
    $spend_severity = "moderate_decrease" => "Moderate spend decrease detected",
    else "No significant spend pattern change"
);
let $planned_action = case(
    $sufficient_data = 0 => "insufficient_data",
    $has_anomaly = 0 => "insufficient_data",
    // Problem increases (high spend + poor efficiency) - sort to top
    $spend_severity = "severe_increase" and $performance_status = "poor_efficiency" and $spend_impact = "high_impact" => "Problem: Severe Increase + Poor ACOS [High $]",
    $spend_severity = "severe_increase" and $performance_status = "poor_efficiency" => "Problem: Severe Increase + Poor ACOS",
    $spend_severity = "moderate_increase" and $performance_status = "poor_efficiency" and $spend_impact = "high_impact" => "Problem: Moderate Increase + Poor ACOS [High $]",
    $spend_severity = "moderate_increase" and $performance_status = "poor_efficiency" => "Problem: Moderate Increase + Poor ACOS",
    // Neutral/good increases
    $spend_severity = "severe_increase" and $performance_status = "good_efficiency" and $change_driver = "click_volume" => "Scaling: Severe Increase (Clicks) + Good ACOS",
    $spend_severity = "severe_increase" and $change_driver = "click_volume" => "Increase: Severe (Click Volume)",
    $spend_severity = "severe_increase" and $change_driver = "cost_per_click" => "Increase: Severe (CPC Spike)",
    $spend_severity = "severe_increase" and $change_driver = "clicks_and_cpc" => "Increase: Severe (Clicks + CPC)",
    $spend_severity = "severe_increase" => "Increase: Severe",
    $spend_severity = "moderate_increase" and $performance_status = "good_efficiency" and $change_driver = "click_volume" => "Scaling: Moderate Increase (Clicks) + Good ACOS",
    $spend_severity = "moderate_increase" and $change_driver = "click_volume" => "Increase: Moderate (Click Volume)",
    $spend_severity = "moderate_increase" and $change_driver = "cost_per_click" => "Increase: Moderate (CPC)",
    $spend_severity = "moderate_increase" and $change_driver = "clicks_and_cpc" => "Increase: Moderate (Clicks + CPC)",
    $spend_severity = "moderate_increase" => "Increase: Moderate",
    // Opportunity decreases (good performers losing volume)
    $spend_severity = "severe_decrease" and $performance_status = "good_efficiency" and $change_driver = "click_volume" => "Opportunity: Severe Decrease (Clicks) + Good ACOS",
    $spend_severity = "moderate_decrease" and $performance_status = "good_efficiency" and $change_driver = "click_volume" => "Opportunity: Moderate Decrease (Clicks) + Good ACOS",
    // Normal decreases
    $spend_severity = "severe_decrease" and $change_driver = "click_volume" => "Decrease: Severe (Click Loss)",
    $spend_severity = "severe_decrease" and $change_driver = "cost_per_click" => "Decrease: Severe (CPC Drop)",
    $spend_severity = "severe_decrease" and $change_driver = "clicks_and_cpc" => "Decrease: Severe (Clicks + CPC)",
    $spend_severity = "severe_decrease" => "Decrease: Severe",
    $spend_severity = "moderate_decrease" and $change_driver = "click_volume" => "Decrease: Moderate (Click Loss)",
    $spend_severity = "moderate_decrease" and $change_driver = "cost_per_click" => "Decrease: Moderate (CPC Drop)",
    $spend_severity = "moderate_decrease" and $change_driver = "clicks_and_cpc" => "Decrease: Moderate (Clicks + CPC)",
    $spend_severity = "moderate_decrease" => "Decrease: Moderate",
    // Catch-all for any edge cases
    else "insufficient_data"
);
// === Final Filter ===
state = "effectively enabled"
and (campaign name contains any $include_campaigns)
and (campaign name does not contain all $exclude_campaigns)
and $sufficient_data = 1
and $has_anomaly = 1
and $planned_action != "insufficient_data"