← Template Library Download Template ↗

Automation template

Core: Search Term Waste Elimination

Stop ad spend waste by automatically negating inefficient search terms across all campaigns.

Ready to use Merch Jar workflow
Version
1.0
Type
Last updated
2025-09-26T00:00:00.000Z
Active
Yes

Download this template

Description

Purpose

Stop ad spend waste by automatically negating inefficient search terms across all campaigns.

This Template is for:

  • Accounts with wasteful search terms draining budget without converting
  • Sellers managing multiple campaigns who need global search term control
  • Performance-focused advertisers wanting sophisticated waste elimination with profit protection
  • Accounts with Target ACOS configured for dynamic threshold management

Key Features

  • Four intelligent negation paths: waste, efficiency, performance, and irrelevance detection
  • ROAS-based protection prevents negation of profitable terms despite high click counts
  • Dynamic scaling adjusts click requirements based on conversion history
  • Target ACOS integration eliminates need for hard-coded thresholds across different campaign types

Configuration Guidance

  • Target ACOS Setup: Configure Target ACOS in Ad Manager for different campaign types rather than excluding campaigns. Target ACOS cascades from account to campaign to ad group level.
  • Scaling Settings: Start with default scaling (20 clicks per order, $5 spend per order) and adjust based on your average CPC and profit margins. Higher-margin products can handle more aggressive scaling.
  • ROAS Protection: The 50% ROAS safeguard protects terms performing at half your target efficiency. Increase for more protection, decrease for more aggressive negation.

Daily Automation: Create Negative Exact Match using built-in logic

How it works

How the Logic Works

The blueprint uses four distinct evaluation paths to identify wasteful search terms while protecting valuable converters. Zero-order terms are evaluated on click efficiency, converting terms are assessed on both efficiency and ACOS performance, with dynamic thresholds that scale based on conversion history.

Key Technical Concepts

  • Efficiency vs Performance Evaluation: Terms with fewer than 5 orders use click-per-order efficiency, while terms with 5+ orders switch to ACOS-based performance evaluation
  • Dynamic Threshold Scaling: Click and spend requirements increase with order history (base + orders × scaling factor) to allow proven terms more testing room
  • ROAS Protection Layer: Calculates target ROAS from Target ACOS and protects any term exceeding 50% of that target, preventing negation of profitable terms regardless of efficiency metrics

Configuration Deep Dive

  • Scaling Interaction: Click and spend scaling work together - terms need to exceed both thresholds. Consider your average order value when setting spend scaling, as higher AOV justifies higher spend requirements.
  • Irrelevant Terms vs Protected Terms: Irrelevant terms bypass all other logic and negate at just 10 clicks, while protected terms never negate regardless of performance. Use irrelevant for obvious mismatches, protected for strategic terms.
  • Safeguard Hierarchy: Order safeguard (10+ orders) overrides ROAS protection, which overrides efficiency evaluation. Terms hitting multiple safeguards show the highest-priority protection reason.

Diagnostic Property Interpretation

  • "Exceeds click-per-order limit": Term is converting but requiring too many clicks per order based on your scaling settings
  • "ROAS above safeguard threshold": Term is protected because it meets your profitability requirements despite appearing inefficient
  • "Zero orders, met click threshold": Classic waste - high clicks with no conversions and sufficient spend investment
  • "ACOS far above target threshold": Term converts well but at unsustainable efficiency levels (400% above target)

Common Performance Patterns

  • High-confidence negation: Terms showing "greatly exceeds" language have clear efficiency problems and represent the safest negations
  • Protected by ROAS: These terms may look inefficient but generate acceptable returns - consider reviewing rather than forcing negation
  • Insufficient data patterns: Terms needing "more clicks" or "more spend" are in data collection phase - let them accumulate more performance history before evaluation

Syntax

/*
=== Core: Search Term Waste Elimination ===
Purpose: Intelligently negate wasteful search terms using efficiency targets and performance analysis.
Recommended: Create Negative Exact Match | Daily
*/
 
// === Core Settings ===
let $clicks_threshold = 20;                  // CORE: Base click threshold for zero-order terms
let $spend_threshold = 5.00;                 // CORE: Base spend requirement for zero-order terms
 
// === Strategy Settings ===
let $orders_min_for_acos_eval = 5;           // STRATEGY: Orders required for ACOS-based evaluation
let $clicks_min_for_acos_eval = 100;         // STRATEGY: Clicks required for ACOS-based evaluation
let $t_acos_threshold_negate = 400%;         // STRATEGY: Negate if ACOS ≥ (Target ACOS × 400%) when min clicks & orders are met [e.g., 30% target = 120% threshold]
 
// === Advanced Settings ===
let $clicks_scaling_per_order = 20;          // ADVANCED: Additional clicks allowed per order [e.g., 2 orders = 20 + (2 × 20) = 60 clicks]
let $spend_scaling_per_order = 5.00;         // ADVANCED: Additional spend required per order [e.g., 2 orders = $5 + (2 × $5) = $15 spend]
let $irrelevant_terms = ["NEVER_MATCH"];     // ADVANCED: Aggressively negate search terms containing these keywords (unrelated terms)
let $irrelevant_clicks_threshold = 10;       // ADVANCED: Clicks required to negate irrelevant terms (ignores all scaling and spend requirements)
 
// === Safeguards ===
let $safeguard_orders = 10;                  // SAFEGUARD: Never negate terms with this many orders or more
let $safeguard_min_roas_ratio = 50%;         // SAFEGUARD: Protect terms with ROAS ≥ (Target ROAS × 50%) [e.g., 3.33 target ROAS = 1.67 protection]
let $protected_terms = ["NEVER_MATCH"];      // SAFEGUARD: Never negate search terms containing these keywords (your brand, product names, strategic terms)
 
// === 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"]
 
// ============================================================================
// === Blueprint Logic ===
// ============================================================================
// Advanced logic below - modify carefully
 
// Pre-calculate performance metrics
let $lifetime_orders = orders(lifetime);
let $lifetime_clicks = clicks(lifetime);
let $lifetime_spend = spend(lifetime);
let $lifetime_acos = acos(lifetime);
let $lifetime_roas = roas(lifetime);
 
// Calculate scaled thresholds based on order history
let $allowed_clicks = $clicks_threshold + ($lifetime_orders * $clicks_scaling_per_order);
let $spend_required = $spend_threshold + ($lifetime_orders * $spend_scaling_per_order);
 
// Data sufficiency check (both clicks and spend)
let $sufficient_data = case(
    $lifetime_clicks >= $allowed_clicks and $lifetime_spend >= $spend_required => 1,
    else 0
);
 
// Calculate efficiency for converting terms\
let $actual_clicks_per_order = case(
    $lifetime_orders > 0 => $lifetime_clicks / $lifetime_orders,
    else 999  // Treat zero-order terms as infinitely inefficient
);
 
// ROAS-based protection calculation
let $target_roas = case(
    target acos > 0 => 1 / target acos,
    else 0
);
 
let $roas_protection_threshold = case(
    $target_roas > 0 => $target_roas * $safeguard_min_roas_ratio,
    else 0
);
 
let $roas_protected = case(
    $lifetime_orders > 0 and $target_roas > 0 and $lifetime_roas >= $roas_protection_threshold => 1,
    else 0
);
 
// Search term relevance analysis
let $protected_term = case(
    search term contains any $protected_terms => 1,
    else 0
);
 
let $irrelevant_term = case(
    search term contains any $irrelevant_terms => 1,
    else 0
);
 
// Protection safeguards
let $high_order_protection = case(
    $lifetime_orders >= $safeguard_orders => 1,
    else 0
);
 
let $protected_overall = case(
    $high_order_protection = 1 => 1,
    $protected_term = 1 => 1,
    $roas_protected = 1 => 1,
    else 0
);
 
// Four negation paths: irrelevant, zero-order waste, efficiency, and ACOS performance
let $irrelevant_candidate = case(
    $irrelevant_term = 1 and $lifetime_clicks >= $irrelevant_clicks_threshold => 1,
    else 0
);
 
let $zero_order_waste_candidate = case(
    $lifetime_orders = 0 and $sufficient_data = 1 => 1,
    else 0
);
 
let $efficiency_candidate = case(
    $lifetime_orders > 0 and ($lifetime_orders < $orders_min_for_acos_eval or $lifetime_clicks < $clicks_min_for_acos_eval) => case(
        $actual_clicks_per_order > $clicks_scaling_per_order and $sufficient_data = 1 => 1,
        else 0
    ),
    else 0
);
 
let $performance_candidate = case(
    $lifetime_orders >= $orders_min_for_acos_eval and $lifetime_clicks >= $clicks_min_for_acos_eval => case(
        target acos > 0 and $lifetime_acos > target acos * $t_acos_threshold_negate => 1,
        else 0
    ),
    else 0
);
 
let $negation_candidate = case(
    $irrelevant_candidate = 1 => 1,
    $zero_order_waste_candidate = 1 => 1,
    $efficiency_candidate = 1 => 1,
    $performance_candidate = 1 => 1,
    else 0
);
 
// Diagnostic properties
let $reason = case(
    $high_order_protection = 1 => "Protected - too many orders to negate",
    $protected_term = 1 => "Protected - contains protected keyword",
    $roas_protected = 1 => "Protected - ROAS above safeguard threshold",
    $irrelevant_candidate = 1 => "Contains irrelevant terms, met click threshold",
    $irrelevant_term = 1 and $lifetime_clicks < $irrelevant_clicks_threshold => "Contains irrelevant terms, needs more clicks",
    $zero_order_waste_candidate = 1 => "Zero orders, met click threshold",
    $efficiency_candidate = 1 and $actual_clicks_per_order >= $clicks_scaling_per_order * 2 => "Greatly exceeds click-per-order limit",
    $efficiency_candidate = 1 => "Exceeds click-per-order limit",
    $performance_candidate = 1 => "ACOS far above target threshold",
    $sufficient_data = 0 and $lifetime_spend < $spend_required and $lifetime_clicks < $allowed_clicks => "Insufficient spend and clicks",
    $sufficient_data = 0 and $lifetime_spend < $spend_required => "Insufficient spend",
    $sufficient_data = 0 => "Insufficient clicks for order level",
    $lifetime_orders > 0 and ($lifetime_orders < $orders_min_for_acos_eval or $lifetime_clicks < $clicks_min_for_acos_eval) => "Converting within click-per-order limit",
    $lifetime_orders >= $orders_min_for_acos_eval and $lifetime_clicks >= $clicks_min_for_acos_eval => "ACOS below negation threshold",
    else "Zero orders, needs more clicks"
);
 
let $result = case(
    $zero_order_waste_candidate = 1 => "Negate - Zero Orders, High Clicks",
    $irrelevant_candidate = 1 => "Negate - Irrelevant Term",
    $efficiency_candidate = 1 => case(
        $lifetime_orders = 1 => "Negate - Single Order, High Clicks",
        $lifetime_orders >= 2 => "Negate - Converting but Inefficient", 
        else "Negate - Over Click Limit"
    ),
    $performance_candidate = 1 => "Negate - High ACOS (Converting Well)",
    $high_order_protection = 1 or $protected_term = 1 or $roas_protected = 1 => "Protected - No Action",
    else "No Action"
);
 
// === Final Filter ===
negated = false
and (campaign name contains any $include_campaigns)
and (campaign name does not contain any $exclude_campaigns)
and $negation_candidate = 1
and $protected_overall = 0