Automation template
KDP Core: Adaptive Budget Management
Prevents budget waste on underutilized campaigns while scaling spend for constrained high-performers.
- Version
- 1.0
- Type
- —
- Last updated
- 2026-01-08T00:00:00.000Z
- Active
- Yes
Description
Purpose
Automatically scale budgets up for high-performing campaigns and rightsize bloated budgets that aren't being utilized.
This Blueprint is for:
✓ KDP advertisers with campaigns hitting budget caps while maintaining good Blended ACOS
✓ Accounts with oversized budgets that consistently underspend and need rightsizing
✓ Sellers wanting hands-off budget optimization that accounts for KENP revenue
✓ Accounts with Target ACOS configured at the campaign level or above
Key Features
- Blended ACOS performance gating - only increases budgets when
Blended ACOSjustifies more spend - Multi-period evaluation - uses
7d,14d, or30ddata based on blended profit volume for reliable decisions - CPC-based minimums - ensures budgets support minimum daily clicks for data collection
- Intelligent rightsizing - reduces bloated budgets to actual usage plus buffer, with cooldown protection
Configuration Guidance
- Blended Profit Minimum ($12): Threshold for reliable Blended ACOS evaluation. Lower for low-royalty books, raise for accounts with higher average transaction values.
- High Utilization (90%): When daily spend hits this percentage of budget, campaign is considered capped. Most accounts should leave at default.
- Low Utilization (50%): Campaigns consistently below this trigger rightsizing. Raise to 60-70% for tighter budget control.
- Cooldown Period (14d): Wait time between rightsizing actions. Prevents over-correction on campaigns with variable spend patterns.
Recommended Workflow
Daily or Multiple Times Daily Automation: Change Daily Budget using Set ($) with $new_budget
How it works
How the Logic Works
The blueprint manages budgets through two distinct paths: increases for high-performing campaigns hitting budget caps, and rightsizing for campaigns with sustained low utilization. Performance evaluation uses Blended ACOS to capture both sales and KENP royalty revenue, ensuring KDP-specific profitability drives budget decisions.
Key Technical Concepts
Budget Increase Path
Campaigns qualify for budget increases through two routes:
- Budget Capped + Good Performance: Any day in the last 4 days hit 90%+ utilization AND Blended ACOS is within 130% of target
- Data Starved: Current budget is below CPC-based minimum needed for adequate daily clicks
When triggered, budgets increase by 20% (configurable). This creates steady scaling rather than dramatic jumps.
Budget Rightsizing Path
Campaigns qualify for rightsizing when:
- Average utilization over 14 days is below 50%
- Cooldown period (14 days) has passed since last budget change
- Current budget is above the effective minimum (CPC-based or absolute floor)
Rightsized budget = average daily spend × 130% buffer, with floor protection.
Multi-Period Blended ACOS Evaluation
The blueprint selects the most recent period with sufficient blended profit for reliable evaluation:
- 7-day Blended ACOS if blended profit ≥ $12
- 14-day Blended ACOS if 7-day insufficient
- 30-day Blended ACOS if 14-day insufficient
- No performance gate if all periods lack sufficient data (allows increase for data collection)
CPC-Based Budget Minimums
When enabled, the blueprint calculates minimum budget needed for data collection: Average CPC × minimum daily clicks (default 5). This prevents budgets from dropping so low that campaigns can't gather meaningful performance data.
Configuration Deep Dive
Blended Profit Minimum ($12 default)
Defines how much blended profit a time period needs before its Blended ACOS is considered reliable. This prevents small sample sizes from driving budget decisions. Adjust based on your typical book economics:
- Low-royalty books: Consider $8-10
- Standard KDP titles: $12 default works well
- High-value box sets: Consider $15-20
Utilization Thresholds
High Utilization (90%): The percentage of budget that indicates a campaign is effectively capped. Lower values (80-85%) trigger increases earlier but may scale campaigns that aren't truly constrained.
Low Utilization (50%): The percentage below which campaigns are considered oversized. Higher values (60-70%) rightsize more aggressively but may cut budgets on campaigns with legitimate spend variability.
Cooldown Period (14 days)
Prevents rapid-fire budget decreases. The blueprint checks if any budget change occurred within this window before rightsizing. This protects campaigns with naturally variable spend patterns from being repeatedly cut.
CPC Minimums (enabled by default)
When enabled, budgets won't drop below what's needed for minimum daily clicks. This is particularly important for KDP where individual clicks can be expensive and data collection requires consistent impression share.
Diagnostic Property Interpretation
$reason values
- "[X%] Below CPC minimum threshold" → Budget too small for data collection, increasing regardless of utilization
- "[X%] Above high utilization threshold, blended ACOS acceptable" → Capped and performing well, scaling up
- "[X%] Above high utilization threshold, blended ACOS too high" → Capped but poor performance, no increase
- "[X%] Below low utilization threshold" → Consistently underspending, rightsizing down
- "[X%] Below low utilization threshold, cooldown active" → Would rightsize but waiting on cooldown
- "[X%] Budget below rightsizing minimum" → Already at floor, can't decrease further
- "[X%] Within acceptable utilization" → Spending appropriately, no action needed
$result categories
- "Budget Increase: CPC Minimum" → Raising to support data collection
- "Budget Increase: High Utilization" → Scaling successful campaign
- "Budget Decrease: Rightsizing" → Reducing bloated budget to actual usage
- "No Action" → Budget appropriate for current performance
Common Performance Patterns
Gradual scaling on winners: Campaigns hitting caps with good Blended ACOS will increase 20% per cycle. Running multiple times daily accelerates scaling for high-performers.
Rightsizing clusters: After enabling, expect a wave of budget decreases on campaigns that were set high "just in case." This is normal and frees up budget for better performers.
Cooldown blocking: You may see campaigns with low utilization showing "cooldown active." This is the blueprint protecting against over-correction - the campaign will rightsize after the 14-day window.
CPC minimum increases: New or low-budget campaigns may get increases purely for data collection. This is intentional - campaigns need clicks to prove performance.
No action on poor performers: Campaigns hitting budget caps but with poor Blended ACOS won't get increases. The blueprint protects you from scaling waste.
Syntax
/* === KDP Core: Adaptive Budget Management === Purpose: Prevents budget waste while ensuring adequate spend for data collection and performance scaling. Recommended: Change Daily Budget | Set ($) using $new_budget | Daily or Multiple Times Daily */ // === Core Settings === let $high_utilization = 90%; // CORE: Daily spend % that indicates budget constraint let $low_utilization = 50%; // CORE: Daily budget utilization % that triggers rightsizing let $enable_cpc_minimums = 1; // ADVANCED: Enable CPC-based budget minimums (1=yes, 0=no) // === Budget Increases (High Utilization) === let $t_blend_acos_threshold_increase = 130%; // STRATEGY: Increase budget when blended ACOS ≤ (Target Blended ACOS × 130%) [e.g., 100% target = 130% threshold] let $budget_increase_pct = 20%; // STRATEGY: Percentage increase when scaling up let $blend_profit_min = 12.00; // STRATEGY: Minimum blended profit needed for reliable ACOS evaluation ($12.00 threshold) let $acos_eval_short = 7d; // TIME: Recent performance period let $acos_eval_medium = 14d; // TIME: Medium-term performance period let $acos_eval_long = 30d; // TIME: Long-term performance period // === Budget Rightsizing (Low Utilization) === let $spend_buffer = 130%; // STRATEGY: Buffer above avg daily spend when rightsizing (budget set to 130% avg daily spend) let $budget_min = 5.00; // STRATEGY: Absolute minimum budget floor for rightsizing let $cooldown_eval_period = 14d; // TIME: Period for sustained utilization evaluation let $cooldown_period = 14d; // TIME: Wait period between rightsizing actions // === CPC-Based Budget Minimums === let $min_daily_clicks = 5; // ADVANCED: Minimum clicks per day budget should support let $cpc_eval_period = 60d; // ADVANCED: Period for calculating average CPC for minimum budget // === Segment Filters === let $include_campaigns = [""]; // FILTER: Apply to all campaigns, or specify terms like ["SP-", "Auto"] let $exclude_campaigns = ["NEVER_MATCH"]; // FILTER: Exclude campaigns containing these terms, e.g., ["Brand", "Test", "Archive"] // ============================================================================ // === Blueprint Logic === // ============================================================================ // Advanced logic below - modify carefully // Increase Path: Individual daily budget cap analysis let $today_spend = spend(0d..0d); let $yesterday_spend = spend(1d..1d); let $day2_spend = spend(2d..2d); let $day3_spend = spend(3d..3d); let $today_capped = case($today_spend >= budget * $high_utilization => 1, else 0); let $yesterday_capped = case($yesterday_spend >= budget * $high_utilization => 1, else 0); let $day2_capped = case($day2_spend >= budget * $high_utilization => 1, else 0); let $day3_capped = case($day3_spend >= budget * $high_utilization => 1, else 0); let $any_day_budget_capped = case( $today_capped = 1 or $yesterday_capped = 1 or $day2_capped = 1 or $day3_capped = 1 => 1, else 0 ); // Increase Path: CPC-based data sufficiency check let $avg_cpc = cpc($cpc_eval_period); let $min_budget_for_data = case( $enable_cpc_minimums = 1 and $avg_cpc > 0 => $avg_cpc * $min_daily_clicks, else 0 // Data minimums disabled or no CPC data ); let $budget_too_small = case( $enable_cpc_minimums = 1 and $avg_cpc > 0 and budget < $min_budget_for_data => 1, else 0 ); // Increase Path: Performance evaluation for increases (prioritize recent data) let $blend_profit_short = blended profit($acos_eval_short); let $blend_profit_medium = blended profit($acos_eval_medium); let $blend_profit_long = blended profit($acos_eval_long); let $performance_blend_acos = case( $blend_profit_short >= $blend_profit_min => blended acos($acos_eval_short), $blend_profit_medium >= $blend_profit_min => blended acos($acos_eval_medium), $blend_profit_long >= $blend_profit_min => blended acos($acos_eval_long), else 99999 // No reliable blended ACOS data ); let $acos_good_for_increase = case( $performance_blend_acos = 99999 => 1, // No blended ACOS data = allow increase target acos <= 0 => 0, // Invalid target $performance_blend_acos <= (target acos * $t_blend_acos_threshold_increase) => 1, else 0 ); // Rightsizing Path: Sustained utilization analysis let $total_spend = spend($cooldown_eval_period); let $days_in_eval = 14; // Days in 14d period let $avg_daily_spend = $total_spend / $days_in_eval; let $avg_utilization_rate = case( budget > 0 => $avg_daily_spend / budget, else 0 ); // Calculate effective minimum for decreases early let $effective_min_for_decreases = case( $min_budget_for_data > $budget_min => $min_budget_for_data, // Use CPC minimum if higher else $budget_min // Otherwise use absolute minimum ); let $rightsizing_cooldown_passed = case( is_null(last budget change) => 1, last budget change < now() - interval($cooldown_period) => 1, else 0 ); // Decision logic by path let $should_increase = case( $budget_too_small = 1 => 1, // Data-starved campaign $any_day_budget_capped = 1 and $acos_good_for_increase = 1 => 1, // Budget-capped + good performance else 0 ); let $should_rightsize = case( $rightsizing_cooldown_passed = 0 => 0, // Cooldown period active budget <= $effective_min_for_decreases => 0, // Already at or below minimum - don't rightsize $avg_utilization_rate < $low_utilization => 1, // Sustained low utilization (including 0% from no spend) else 0 ); // Calculate new budget let $increase_budget = budget * (1 + $budget_increase_pct); // For rightsizing, calculate based on actual usage plus buffer let $rightsized_budget = case( $avg_daily_spend > 0 => $avg_daily_spend * $spend_buffer, else $budget_min // No spend = use minimum budget ); let $calculated_budget = case( $should_increase = 1 => $increase_budget, $should_rightsize = 1 => $rightsized_budget, else budget ); // Apply minimums - different rules for increases vs decreases let $final_minimum = case( $should_rightsize = 1 => case( $effective_min_for_decreases > 1.00 => $effective_min_for_decreases, // Use effective minimum if higher than platform else 1.00 // Otherwise platform minimum ), $should_increase = 1 and $budget_too_small = 1 => case( $min_budget_for_data > 1.00 => $min_budget_for_data, // Use CPC minimum for data generation increases else 1.00 // Platform minimum ), else 1.00 // Platform minimum for budget-capping increases ); let $new_budget = case( $calculated_budget < $final_minimum => $final_minimum, else $calculated_budget ); // Diagnostic properties let $reason = case( target acos <= 0 => "No target blended ACOS set", $should_increase = 1 and $budget_too_small = 1 => case( $avg_utilization_rate <= 0.10 => "[0-10%] Below CPC minimum threshold", $avg_utilization_rate <= 0.30 => "[10-30%] Below CPC minimum threshold", $avg_utilization_rate <= 0.50 => "[30-50%] Below CPC minimum threshold", $avg_utilization_rate <= 0.70 => "[50-70%] Below CPC minimum threshold", $avg_utilization_rate <= 0.90 => "[70-90%] Below CPC minimum threshold", else "[90%+] Below CPC minimum threshold" ), $should_increase = 1 => case( $avg_utilization_rate <= 0.70 => "[50-70%] Above high utilization threshold, blended ACOS acceptable", $avg_utilization_rate <= 0.90 => "[70-90%] Above high utilization threshold, blended ACOS acceptable", else "[90%+] Above high utilization threshold, blended ACOS acceptable" ), $rightsizing_cooldown_passed = 0 => case( $avg_utilization_rate = 0 => "[0%] Below low utilization threshold, cooldown active", $avg_utilization_rate <= 0.10 => "[0-10%] Below low utilization threshold, cooldown active", $avg_utilization_rate <= 0.30 => "[10-30%] Below low utilization threshold, cooldown active", $avg_utilization_rate <= 0.50 => "[30-50%] Below low utilization threshold, cooldown active", else "[50%+] Below low utilization threshold, cooldown active" ), $should_rightsize = 1 => case( $avg_utilization_rate = 0 => "[0%] Below low utilization threshold", $avg_utilization_rate <= 0.10 => "[0-10%] Below low utilization threshold", $avg_utilization_rate <= 0.30 => "[10-30%] Below low utilization threshold", $avg_utilization_rate <= 0.50 => "[30-50%] Below low utilization threshold", else "[50-70%] Below low utilization threshold" ), $any_day_budget_capped = 1 and $acos_good_for_increase = 0 => case( $avg_utilization_rate <= 0.70 => "[50-70%] Above high utilization threshold, blended ACOS too high", $avg_utilization_rate <= 0.90 => "[70-90%] Above high utilization threshold, blended ACOS too high", else "[90%+] Above high utilization threshold, blended ACOS too high" ), budget <= $effective_min_for_decreases => case( $avg_utilization_rate = 0 => "[0%] Budget below rightsizing minimum", $avg_utilization_rate <= 0.30 => "[0-30%] Budget below rightsizing minimum", else "[30-50%] Budget below rightsizing minimum" ), else case( $avg_utilization_rate = 0 => "[0%] Within acceptable utilization", $avg_utilization_rate <= 0.10 => "[0-10%] Within acceptable utilization", $avg_utilization_rate <= 0.30 => "[10-30%] Within acceptable utilization", $avg_utilization_rate <= 0.50 => "[30-50%] Within acceptable utilization", $avg_utilization_rate <= 0.70 => "[50-70%] Within acceptable utilization", $avg_utilization_rate <= 0.90 => "[70-90%] Within acceptable utilization", else "[90%+] Within acceptable utilization" ) ); let $result = case( $should_increase = 1 and $budget_too_small = 1 => "Budget Increase: CPC Minimum", $should_increase = 1 => "Budget Increase: High Utilization", $should_rightsize = 1 => "Budget Decrease: Rightsizing", else "No Action" ); // === Final Filter === state = "effectively enabled" and (campaign name contains any $include_campaigns) and (campaign name does not contain any $exclude_campaigns) and ($should_increase = 1 or $should_rightsize = 1) and $new_budget != budget