Features
Scales bid adjustments proportionally based on distance from target Blended ACOS using adaptive timing controls.
✓ 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
Daily Automation: Change Bid using Set ($) with $target_bid
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.
Rather than fixed percentage changes, adjustments scale based on distance from target:
This creates smooth, predictable bid curves that converge toward target without dramatic swings.
The blueprint automatically selects the shortest period with sufficient blended profit:
This ensures high-volume keywords respond quickly to performance changes while low-volume keywords use more stable long-term data.
Cooldowns match data period length to prevent over-adjustment:
Keywords using longer lookback periods get longer cooldowns because their performance signals change more slowly.
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.
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.
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.
The range of possible bid adjustments. Minimum ensures changes are meaningful when made. Maximum prevents dramatic swings that could destabilize performance.
Define where maximum adjustments kick in:
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.
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.
/*
=== 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
/*
=== 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
© Merch Jar LLC