Meta Budget Optimizer
Daily and weekly budget allocation rules for Meta app campaigns. Apply after meta-campaign-setup launch and initial meta-campaign-audit at 48h.
Scale winners in small steps. Kill losers fast. Never let a bad ad eat 70% of spend unchecked.
Initial Assessment
- Read
app-ads-context.md— target CPA, LTV, monthly cap - Confirm active campaigns via
meta_ads_list_campaigns - Pull last 3 days ad-level insights before any change
Core Rules Engine
| Condition | Confidence | Action |
|---|---|---|
| CPA < 0.8× target, 20+ conv | High | +20% daily budget |
| CPA 0.8–1.2× target | Medium | Hold budget |
| CPA 1.2–1.5× target, 15+ conv | Medium | Hold; watch 48h |
| CPA > 1.5× target, 15+ conv | High | −20% budget or pause weakest ad |
| Spend > 2× CPA, 0 conv | High | Pause ad immediately |
| Frequency > 3.5, CTR down 25%+ | Medium | No scale — add creative first |
| Ad set CPA < target, budget capped noon | High | Raise budget +20% |
| Campaign hits monthly cap | — | Reallocate from losers |
Scale Increment Cap
Never increase > 20% per day on campaigns under $500/day — disrupts learning phase.
| Current daily budget | Max single increase |
|---|---|
| $30–100 | +20% ($6–20) |
| $100–500 | +20% |
| $500+ | +15–20% (test impact) |
| $2K+ | +10–15% optional cost cap test |
Daily Workflow
Step 1 — Pull Data
meta_ads_insights
target_type: "ad_account"
level: "ad"
date_preset: "last_3d"
fields: "spend,impressions,clicks,ctr,cpc,frequency,actions,cost_per_action_type"
limit: 100
Or ad set scoped:
meta_ads_insights
target_type: "adset"
target_id: "<adset-id>"
level: "ad"
date_preset: "last_3d"
fields: "spend,impressions,clicks,ctr,frequency,actions,cost_per_action_type"
Step 2 — Rank Ads by CPA
Sort ads with ≥ 5 conversions by CPA ascending. Ads with 0 conversions: check spend vs 2× CPA kill rule first.
| Tier | Definition | Budget share target |
|---|---|---|
| S | CPA < 0.8× target | 50–70% of ad set spend |
| A | CPA 0.8–1.0× target | 20–30% |
| B | CPA 1.0–1.2× target | 10–20% hold |
| C | CPA > 1.2× target | Pause or min delivery |
| F | 0 conv, spend > 2× CPA | Pause |
Step 3 — Apply Rules
Document each action before executing.
Step 4 — Execute Updates
Pause loser:
meta_ads_update_ad
ad_id: "<ad-id>"
status: "PAUSED"
Scale ad set:
meta_ads_update_adset
adset_id: "<adset-id>"
daily_budget_minor: 6000
Scale campaign (CBO only):
meta_ads_update_campaign
campaign_id: "<campaign-id>"
daily_budget_minor: 15000
Reduce budget:
meta_ads_update_adset
adset_id: "<adset-id>"
daily_budget_minor: 4000
Writes: 2 Appeeky API credits each.
Weekly Workflow
| Day | Action |
|---|---|
| Monday | Full audit — meta-campaign-audit scorecard |
| Tue–Thu | Daily optimizer (this skill) |
| Friday | Creative fatigue check; plan refresh |
| Weekend | Light check unless high spend |
Weekly Reallocation
If running multiple ad sets:
- Sum spend-weighted CPA per ad set
- Shift 10–20% budget from worst quartile to best
- Do not move > 20% total budget in one day
Budget Cap Safety
Monthly Pacing
Monthly cap from app-ads-context: $10,000
Days remaining: 12
Spend to date: $7,200
Remaining: $2,800 → max $233/day
If current run rate exceeds cap, reduce budgets proportionally — don't wait for month-end.
Learning Phase Protection
| Situation | Rule |
|---|---|
| Ad set < 50 conversions total | Avoid > 20% budget changes |
| New creative added same day | Don't scale budget same day |
| Geo expansion launch | Start at test budget; don't scale 7d |
Frequency Gate (no scale)
Before any scale action, check winner frequency:
meta_ads_insights
target_type: "ad"
target_id: "<winner-ad-id>"
date_preset: "last_7d"
fields: "frequency,ctr"
| Frequency | Scale? |
|---|---|
| < 2.5 | Yes if CPA good |
| 2.5–3.5 | Scale cautiously (+10%) |
| > 3.5 | No scale — ad-creative-edit or new variant first |
CBO vs ABO Strategy
| Mode | When | Optimizer focus |
|---|---|---|
| ABO (ad set budget) | Testing phase | Per ad set rules |
| CBO (campaign budget) | 1+ proven ad sets | Campaign-level cap; pause bad ad sets |
| Hybrid | Scale phase | CBO on winners campaign; ABO on tests |
Testing: ABO — you control spend per test. Scaling: CBO — Meta shifts to winners within campaign.
Cross-Channel Rules
Pull comparison from cross-channel-performance:
| Condition | Action |
|---|---|
| Meta CPA > TikTok CPA by 30%+ | Flag for cross-channel-budget |
| Meta ROAS best in portfolio | Protect Meta share |
| Meta CPA rising 3 days straight | Check creative fatigue before cut |
| ASA brand cheap, Meta broad expensive | Normal — different intent |
Do not slash Meta purely on CPA if LTV by channel differs — use campaign-profitability.
Decision Log Template
# Meta Budget Optimizer — [Date]
**Target CPA:** $20 | **Period:** last_3d
## Actions Taken
| Entity | Before | After | Reason |
|--------|--------|-------|--------|
| Ad set US-iOS | $50/day | $60/day | CPA $14, 22 conv |
| Ad D - Transform | ACTIVE | PAUSED | $45 spend, 0 conv |
| Ad C - Premium | ACTIVE | ACTIVE | Hold — CPA $19, 8 conv |
## Ad Rankings
| Ad | Spend | Conv | CPA | Tier | Action |
|----|-------|------|-----|------|--------|
| B - UGC | $120 | 18 | $6.67 | S | Benefiting from scale |
| A - Problem | $95 | 12 | $7.92 | S | |
| C - Premium | $60 | 3 | $20.00 | B | Hold |
| D - Transform | $45 | 0 | — | F | Paused |
## Tomorrow
- [ ] Recheck C tier after 24h
- [ ] A′ creative on B if frequency > 3
## Monthly Pace
- Spend MTD: $X / $cap — on track / over
Scenario Playbook
Scenario: One ad dominates spend, good CPA
- Action: Allow — Meta found winner. Ensure losers paused if CPA bad.
- Optional: Duplicate winner to new ad set for incremental scale at 50+ conv.
Scenario: All ads mediocre CPA (1.2–1.5×)
- Action: Hold budget. Run
ad-creative-editon best CTR ad. - Do not scale hoping it fixes itself.
Scenario: CPA spiked after scale
- Action: Revert last budget increase. Check frequency and creative age.
- Rule: If CPA > 1.3× target for 48h post-scale, roll back.
Scenario: Budget spent by 2pm daily
- Action: +20% budget if CPA < target. If CPA bad, don't raise — delivery is telling you something.
Scenario: iOS reporting lag
- Action: Use MMP CPA for decisions. Hold kills unless 2× CPA spend rule.
Benchmarks
| Metric | Scale signal | Cut signal |
|---|---|---|
| CPA vs target | < 0.8× | > 1.5× |
| 3-day CPA trend | Flat or down | Up 25%+ |
| Frequency | < 3 | > 3.5 |
| Spend pacing | Even delivery | Front-loaded junk |
| Winner conv count | 20+ | < 5 (hold) |
Common Mistakes
| Mistake | Fix |
|---|---|
| +50% budget day | Max +20% |
| Scaling with frequency 4 | Refresh creative first |
| Not pausing 0-conv ads | 2× CPA kill rule |
| Daily major restructures | One change type per day |
| Ignoring monthly cap | Pacing math weekly |
| CBO too early | ABO for tests first |
| Emotional creative loyalty | Data tier system |
Pre-Flight Checklist
- [ ] last_3d insights pulled
- [ ] Target CPA from app-ads-context.md
- [ ] Losers identified (F tier)
- [ ] Frequency checked on scale candidates
- [ ] Budget increase ≤ 20%
- [ ] Monthly pace checked
- [ ] Actions logged for user
Automation Cadence
| Spend level | Check frequency |
|---|---|
| < $50/day | 1× daily |
| $50–200/day | 2× daily (morning, evening) |
| $200+/day | 2× daily + weekly audit |
| $1K+/day | Consider rules + human review |
Don't hover hourly — Meta delivery fluctuates intraday.
Related Skills
meta-campaign-audit— full diagnostic scorecardmeta-campaign-setup— structure referencead-creative-edit— fatigue refresh before scalead-creative-variants— new batch when all tiers weakcampaign-profitability— LTV-weighted decisionscross-channel-budget— reallocate vs TikTok/ASAcross-channel-performance— channel comparison dataapp-ads-context— caps and targets