Automation template
KDP Core: Dynamic Bid Management
Scales bid adjustments proportionally based on distance from target ACOS using adaptive timing controls.
- Version
- 1.0
- Type
- —
- Last updated
- 2026-01-08T00:00:00.000Z
- Active
- Yes
Description
Purpose
Scales bid adjustments proportionally based on distance from target Blended ACOS using adaptive timing controls.
This Blueprint is for:
✓ KDP advertisers wanting performance-based bid optimization that accounts for KENP royalties
✓ Accounts with keywords/targets generating page reads where standard ACOS understates true performance
✓ Sellers who want proportional adjustments - bigger changes when further from target, smaller when close
✓ Accounts with Target ACOS configured at campaign, ad group, or target level
Key Features
- Proportional bid scaling - adjustments range from 3-10% based on how far Blended ACOS is from target
- Multi-period data selection - automatically uses 7d, 14d, 30d, or 60d based on blended profit volume
- Adaptive cooldowns - longer lookback periods get longer cooldowns to prevent over-adjustment
- CPC-based bid limits - caps maximum bid at 2× average CPC to prevent runaway increases
Configuration Guidance
- Blended Profit Minimum ($6): Threshold for reliable Blended ACOS. Lower for low-royalty books, raise if you want more conservative data requirements.
- Buffer Zone (±10%): No changes when Blended ACOS is within 10% of target. Widen to 15% for less frequent adjustments, narrow to 5% for tighter optimization.
- Max Change (10%): Largest bid adjustment per cycle. Conservative default prevents dramatic swings - raise only if you want faster convergence.
- CPC Multiplier (2.0×): Bid ceiling based on historical CPC. Lower to 1.5× for tighter control, raise to 2.5× if you're comfortable with higher bids.
Recommended Workflow
Daily Automation: Change Bid using Set ($) with $target_bid
How it works
How the Logic Works
The blueprint calculates a performance ratio by comparing actual Blended ACOS to target, then scales bid adjustments proportionally. Keywords far from target get larger adjustments (up to 10%), while those closer get smaller tweaks (down to 3%). A buffer zone around target prevents unnecessary churn on keywords already performing well.
Key Technical Concepts
Proportional Adjustment Scaling
Rather than fixed percentage changes, adjustments scale based on distance from target:
- Blended ACOS at 50% of target or better: Maximum increase (10%)
- Blended ACOS between 50% and 90% of target: Scaled increase (3-10%)
- Blended ACOS between 90% and 110% of target: No change (buffer zone)
- Blended ACOS between 110% and 200% of target: Scaled decrease (3-10%)
- Blended ACOS at 200% of target or worse: Maximum decrease (10%)
This creates smooth, predictable bid curves that converge toward target without dramatic swings.
Multi-Period Data Selection
The blueprint automatically selects the shortest period with sufficient blended profit:
- 7-day data if blended profit ≥ $6
- 14-day data if 7-day insufficient
- 30-day data if 14-day insufficient
- 60-day data if 30-day insufficient
- No action if all periods lack sufficient data
This ensures high-volume keywords respond quickly to performance changes while low-volume keywords use more stable long-term data.
Adaptive Cooldown Periods
Cooldowns match data period length to prevent over-adjustment:
- 7-day data → 2-day cooldown
- 14-day data → 3-day cooldown
- 30-day data → 5-day cooldown
- 60-day data → 7-day cooldown
Keywords using longer lookback periods get longer cooldowns because their performance signals change more slowly.
CPC-Based Bid Limits
Maximum bid is capped at 2× the 90-day average CPC. This prevents runaway bid increases on keywords that historically convert at lower click costs, protecting against overpaying for traffic.
Configuration Deep Dive
Blended Profit Minimum ($6 default)
The threshold for considering a time period's Blended ACOS reliable. Lower values allow faster response but risk acting on noisy data. Higher values are more conservative but may leave low-volume keywords unoptimized.
- Aggressive optimization: $3-4
- Balanced (default): $6
- Conservative: $10-12
Buffer Zone (±10% default)
Keywords within this range of target get no bid changes. This prevents constant small adjustments on keywords that are essentially at target. The buffer is symmetric - both slightly above and slightly below target are left alone.
- Tight optimization: ±5%
- Balanced (default): ±10%
- Minimal churn: ±15-20%
Min/Max Change (3%/10% defaults)
The range of possible bid adjustments. Minimum ensures changes are meaningful when made. Maximum prevents dramatic swings that could destabilize performance.
- Conservative: 2%/7%
- Balanced (default): 3%/10%
- Aggressive: 5%/15%
Threshold Settings (50%/200% defaults)
Define where maximum adjustments kick in:
- Max Increase Threshold (50%): Blended ACOS at half of target or better triggers maximum bid increase
- Max Decrease Threshold (200%): Blended ACOS at double target or worse triggers maximum bid decrease
The asymmetry (50% vs 200%) reflects that it's easier to overspend than underspend - the blueprint is more patient with high ACOS before applying maximum decreases.
Diagnostic Property Interpretation
$reason values
- "No target blended ACOS set" → Configure Target ACOS in Ad Manager
- "Insufficient blended profit data across all lookback periods" → Not enough conversions for reliable optimization
- "[Volume Level] Within target buffer zone" → Performing close to target, no adjustment needed
- "[Volume Level] Recently changed - cooldown active" → Waiting for recent change to take effect
- "Limited by CPC-based maximum" → Increase was capped by CPC limit
- "[Volume Level] Blended ACOS below target threshold" → Outperforming, bid increasing
- "[Volume Level] Blended ACOS above target threshold" → Underperforming, bid decreasing
$result categories
- "Bid Increase: Max" → Excellent performance, 10% increase
- "Bid Increase: Upper Range" → Strong performance, 6.5-10% increase
- "Bid Increase: Lower Range" → Good performance, 3-6.5% increase
- "Bid Decrease: Lower Range" → Slightly over target, 3-6.5% decrease
- "Bid Decrease: Upper Range" → Significantly over target, 6.5-10% decrease
- "Bid Decrease: Max" → Poor performance, 10% decrease
- "No action needed" → Within buffer, cooldown active, or no change calculated
Common Performance Patterns
Gradual convergence: Keywords typically take 3-5 adjustment cycles to reach target range. This is intentional - gradual changes are more stable than dramatic swings.
Buffer zone clustering: Over time, most active keywords should cluster within the buffer zone. If you see many keywords consistently outside the buffer, consider adjusting your Target ACOS or buffer width.
Volume-based response times: High-volume keywords (using 7-day data) respond within days. Low-volume keywords (using 60-day data) may take weeks. This is by design - low-volume keywords need more data before confident adjustments.
CPC limit hits: If many keywords show "Limited by CPC-based maximum," either your bids are approaching reasonable limits (good) or you may want to raise the CPC multiplier for more headroom.
Cooldown blocking: Seeing many keywords in cooldown is normal, especially early on. The blueprint is pacing changes to let previous adjustments take effect before making more.
Syntax
/* === KDP Core: Dynamic Bid Management === Purpose: Scales bid adjustments proportionally based on distance from target ACOS using adaptive timing controls. Recommended: Change Bid: Set ($) using $target_bid | Daily */ // === Core Settings === let $blend_profit_min = 6.00; // CORE: Minimum blended profit required for reliable ACOS evaluation ($6.00 threshold) let $bid_min_change = 3%; // CORE: Minimum bid adjustment when change is warranted let $bid_max_change = 10%; // CORE: Maximum bid adjustment when ACOS is at or beyond target ACOS thresholds // === Target ACOS Thresholds === // Between buffer and thresholds: bid adjustments scale linearly from min to max change percent let $t_blend_acos_buffer_min_change = 10%; // STRATEGY: No-change buffer around target blended ACOS - min changes start outside this zone (Target Blended ACOS ± 10%) [e.g., 100% target = 90-110% no-change zone] let $t_blend_acos_threshold_max_increase = 50%; // STRATEGY: Max increase when blended ACOS ≤ (Target Blended ACOS × 50%) [e.g., 100% target = 50% max increase threshold] let $t_blend_acos_threshold_max_decrease = 200%; // STRATEGY: Max decrease when blended ACOS ≥ (Target Blended ACOS × 200%) [e.g., 100% target = 200% max decrease threshold] // === Time Periods === let $period_short = 0d..7d; // TIME: Primary evaluation period (7 days including today) let $cooldown_short = 2d; // TIME: Wait period after bid change for short data periods let $period_medium = 0d..14d; // TIME: Secondary evaluation period (14 days including today) let $cooldown_medium = 3d; // TIME: Wait period after bid change for medium data periods let $period_long = 0d..30d; // TIME: Tertiary evaluation period (30 days including today) let $cooldown_long = 5d; // TIME: Wait period after bid change for long data periods let $period_extended = 0d..60d; // TIME: Final fallback evaluation period (60 days including today) let $cooldown_extended = 7d; // TIME: Wait period after bid change for extended data periods // === Advanced Settings === let $bid_limit_cpc_multiplier = 2.0; // SAFEGUARD: Max bid = Avg CPC × 2.0 [e.g., $0.50 CPC = $1.00 max] let $bid_limit_cpc_period = 90d; // SAFEGUARD: Period for calculating CPC-based bid limits // === 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 // Multi-period data selection with extended coverage let $blend_profit_short = blended profit($period_short); let $blend_profit_medium = blended profit($period_medium); let $blend_profit_long = blended profit($period_long); let $blend_profit_extended = blended profit($period_extended); let $evaluation_blend_acos = case( $blend_profit_short >= $blend_profit_min => blended acos($period_short), $blend_profit_medium >= $blend_profit_min => blended acos($period_medium), $blend_profit_long >= $blend_profit_min => blended acos($period_long), $blend_profit_extended >= $blend_profit_min => blended acos($period_extended), else 99999 // No reliable data ); // Track which period was used for diagnostics let $data_quality = case( $blend_profit_short >= $blend_profit_min => "High Volume: Short Lookback", $blend_profit_medium >= $blend_profit_min => "Med Volume: Medium Lookback", $blend_profit_long >= $blend_profit_min => "Low Volume: Long Lookback", $blend_profit_extended >= $blend_profit_min => "Very Low Volume: Extended Lookback", else "insufficient" ); // Adaptive cooldown periods based on data source let $cooldown_cutoff = case( $blend_profit_short >= $blend_profit_min => now() - interval($cooldown_short), $blend_profit_medium >= $blend_profit_min => now() - interval($cooldown_medium), $blend_profit_long >= $blend_profit_min => now() - interval($cooldown_long), else now() - interval($cooldown_extended) ); // Calculate performance ratio with Target Blended ACOS validation let $blend_acos_ratio = case( $evaluation_blend_acos = 99999 => -1, // No reliable data target acos <= 0 => -1, // Invalid target blended ACOS else $evaluation_blend_acos / target acos // Performance ratio ); // Check if within no-change buffer zone let $within_buffer = case( $blend_acos_ratio < 0 => 1, // No change if no data or invalid target $blend_acos_ratio >= (1 - $t_blend_acos_buffer_min_change) and $blend_acos_ratio <= (1 + $t_blend_acos_buffer_min_change) => 1, else 0 ); // Proportional scaling for bid adjustments let $performance_gap = case( $blend_acos_ratio < 0 => 0, // No gap if no data // Max increase region: ACOS at 50% of target or better $blend_acos_ratio <= $t_blend_acos_threshold_max_increase => 1, // Scaled increase region: ACOS between 50% and buffer zone (90% of target) $blend_acos_ratio < (1 - $t_blend_acos_buffer_min_change) => ((1 - $t_blend_acos_buffer_min_change) - $blend_acos_ratio) / ((1 - $t_blend_acos_buffer_min_change) - $t_blend_acos_threshold_max_increase), // Max decrease region: ACOS at 200% of target or worse $blend_acos_ratio >= $t_blend_acos_threshold_max_decrease => 1, // Scaled decrease region: ACOS between buffer zone (110%) and 200% of target $blend_acos_ratio > (1 + $t_blend_acos_buffer_min_change) => ($blend_acos_ratio - (1 + $t_blend_acos_buffer_min_change)) / ($t_blend_acos_threshold_max_decrease - (1 + $t_blend_acos_buffer_min_change)), else 0 // Within buffer zone - no adjustment ); let $adjustment_percent = case( $within_buffer = 1 => 0%, // No change within buffer zone // Increase adjustments for ACOS below target $blend_acos_ratio <= $t_blend_acos_threshold_max_increase => $bid_min_change + ($performance_gap * ($bid_max_change - $bid_min_change)), $blend_acos_ratio < (1 - $t_blend_acos_buffer_min_change) => $bid_min_change + ($performance_gap * ($bid_max_change - $bid_min_change)), // Decrease adjustments for ACOS above target $blend_acos_ratio > (1 + $t_blend_acos_buffer_min_change) => -1 * ($bid_min_change + ($performance_gap * ($bid_max_change - $bid_min_change))), else 0% ); // Calculate target bid with CPC-based limits let $initial_target_bid = bid * (1 + $adjustment_percent); let $avg_cpc = cpc($bid_limit_cpc_period); let $dynamic_max = case( $avg_cpc > 0 => $avg_cpc * $bid_limit_cpc_multiplier, else 999 // No CPC data = no dynamic limit ); let $target_bid = case( $avg_cpc > 0 and $initial_target_bid > $dynamic_max => $dynamic_max, else $initial_target_bid ); // Cooldown validation let $cooldown_ready = case( is_null(last bid change) => 1, last bid change < $cooldown_cutoff => 1, else 0 ); // Diagnostic properties let $reason = case( target acos <= 0 => "No target blended ACOS set", $evaluation_blend_acos = 99999 => "Insufficient blended profit data across all lookback periods", $within_buffer = 1 => case( $data_quality = "High Volume: Short Lookback" => "[High Volume: Short Lookback] Within target buffer zone", $data_quality = "Med Volume: Medium Lookback" => "[Med Volume: Medium Lookback] Within target buffer zone", $data_quality = "Low Volume: Long Lookback" => "[Low Volume: Long Lookback] Within target buffer zone", $data_quality = "Very Low Volume: Extended Lookback" => "[Very Low Volume: Extended Lookback] Within target buffer zone", else "Performance within target buffer zone" ), $cooldown_ready = 0 => case( $data_quality = "High Volume: Short Lookback" => "[High Volume: Short Lookback] Recently changed - cooldown active", $data_quality = "Med Volume: Medium Lookback" => "[Med Volume: Medium Lookback] Recently changed - cooldown active", $data_quality = "Low Volume: Long Lookback" => "[Low Volume: Long Lookback] Recently changed - cooldown active", $data_quality = "Very Low Volume: Extended Lookback" => "[Very Low Volume: Extended Lookback] Recently changed - cooldown active", else "Recently changed - cooldown active" ), $target_bid = bid => "No bid change calculated", $avg_cpc > 0 and $initial_target_bid > $dynamic_max => "Limited by CPC-based maximum", $adjustment_percent > 0 => case( $data_quality = "High Volume: Short Lookback" => "[High Volume: Short Lookback] Blended ACOS below target threshold", $data_quality = "Med Volume: Medium Lookback" => "[Med Volume: Medium Lookback] Blended ACOS below target threshold", $data_quality = "Low Volume: Long Lookback" => "[Low Volume: Long Lookback] Blended ACOS below target threshold", $data_quality = "Very Low Volume: Extended Lookback" => "[Very Low Volume: Extended Lookback] Blended ACOS below target threshold", else "Blended ACOS below target threshold" ), $adjustment_percent < 0 => case( $data_quality = "High Volume: Short Lookback" => "[High Volume: Short Lookback] Blended ACOS above target threshold", $data_quality = "Med Volume: Medium Lookback" => "[Med Volume: Medium Lookback] Blended ACOS above target threshold", $data_quality = "Low Volume: Long Lookback" => "[Low Volume: Long Lookback] Blended ACOS above target threshold", $data_quality = "Very Low Volume: Extended Lookback" => "[Very Low Volume: Extended Lookback] Blended ACOS above target threshold", else "Blended ACOS above target threshold" ), else "Performance at target" ); let $result = case( $within_buffer = 0 and $cooldown_ready = 1 and $target_bid != bid => case( $adjustment_percent >= $bid_max_change => "Bid Increase: Max", $adjustment_percent >= $bid_max_change * 0.5 => "Bid Increase: Upper Range", $adjustment_percent > 0 => "Bid Increase: Lower Range", $adjustment_percent <= -1 * $bid_max_change => "Bid Decrease: Max", $adjustment_percent <= -1 * $bid_max_change * 0.5 => "Bid Decrease: Upper Range", $adjustment_percent < 0 => "Bid Decrease: Lower Range", else "No action needed" ), else "No action needed" ); // === Final Filter === state = "effectively enabled" and (campaign name contains any $include_campaigns) and (campaign name does not contain any $exclude_campaigns) and $within_buffer = 0 and $target_bid != bid and $cooldown_ready = 1