Budget recommendation — AI suggestions
getOptimalMixRecommendation. RULE-BASED (NOT AI). Returns platform, current_budget_pct, recommended_budget_pct, multiplier from historical ROAS+spend.
Written By Salvatore Sinigaglia
Last updated About 4 hours ago
getOptimalMixRecommendation. RULE-BASED (NOT AI). Returns platform, current_budget_pct, recommended_budget_pct, multiplier from historical ROAS+spend.
Budget recommendation — AI suggestions
The Budget recommendation block in Cross-Channel mode suggests how to reallocate spend across platforms. Backed by
getOptimalMixRecommendation()inapps/backend/src/services/cross-channel-analytics.service.ts. ReturnsMixRecommendation[]. RULE-BASED logic (not machine learning): over a fixed 30-day window it shifts budget toward higher-ROAS platforms usingclamp(sqrt(roas / averageRoas)), clamped to ±50% (MAX_BUDGET_SHIFT_PCT = 50). Guardrails require ≥14 days with spend, a meaningful daily spend, and positive ROAS. Use for weekly budget allocation; apply gradually (auction systems dislike abrupt changes).
Who is this for
Mediabuyers + admins making cross-platform budget allocation decisions. Especially valuable when running 3+ platforms simultaneously and rebalancing across weeks / months.
What the recommendation shows
For each selected platform:
UI typically renders as a table or stacked bar comparison (current vs recommended).
How it works (the rule)
The logic is rule-based, not AI / ML:
- Over a fixed 30-day window (
windowDays: 30, not the page date range), compute each platform's ROAS - Compute the average ROAS across platforms
- Derive each platform's budget multiplier as
clamp(sqrt(roas / averageRoas)) - Clamp the multiplier to ±50% (
MAX_BUDGET_SHIFT_PCT = 50) to prevent disruptive reallocation - Return current vs recommended split
Guardrails must pass first (otherwise no recommendation is returned): each platform needs ≥ 14 days with spend, at least a meaningful daily spend (~€100/day equivalent), and a positive average ROAS.
No machine learning. No external data feeds. Pure historical performance.
This is deliberate:
- Transparent + auditable (you can verify the math)
- Predictable (same input → same output)
- No training-data drift risk
- Marketers retain control (rule explains itself)
How to use the recommendation
Weekly cadence
Every Monday: review the recommendation. Compare with last week's actuals. Decide:
- Accept fully: apply suggested multipliers to per-platform budget caps
- Accept partially: shift partway toward recommendation (e.g. half the delta)
- Reject: keep current allocation (e.g. you have a strategic reason ROAS-only doesn't capture)
Apply gradually
Don't shift +50% on a platform overnight. Auction systems (Meta, Google) react poorly to abrupt budget changes — bid prices spike, audience auctions destabilize.
Apply over 2-4 days in smaller deltas (e.g. +15% Monday, +15% Wednesday, +15% Friday for a +50% total).
Compare with intuition
If recommendation contradicts your intuition: investigate. The rule sees ROAS only. Maybe:
- The high-ROAS platform is small-scale (won't sustain doubled budget at same ROAS)
- The low-ROAS platform has strategic value (brand reach, new market test)
- Postback lag is masking real performance (see an-114)
Decide with full context.
Pair with channel comparison
Recommendation is the "what should be". Channel comparison (an-108) is the "what is". Read together.
Constraints + caveats
Fixed 30-day window
The recommendation always computes ROAS over a fixed 30-day window (windowDays: 30), independent of the page's date-range picker. You can't shorten or lengthen the recommendation window from the UI. The guardrail requires at least 14 days with spend inside that window before a recommendation is produced.
Spend floor sensitivity
A platform with €100 spend and ROAS 5 may show "scale up" recommendation, but doubling to €200 won't necessarily preserve ROAS — diminishing returns kick in.
The rule doesn't model diminishing returns. You must.
Postback lag
ROAS within the last 24-72h is incomplete (Meta API delay, postback lag). Since the recommendation window is a fixed 30 days, the most recent 1-3 days are only a small slice, but be aware the freshest days are still settling.
Strategic dimensions not captured
ROAS-only logic doesn't see:
- Brand reach value (TikTok awareness today → Meta conversions next quarter)
- New-market testing (intentional low-ROAS spend on a new geo)
- Audience cap (you can't infinitely scale Meta — eventually you exhaust the addressable audience)
These need human judgment on top of the recommendation.
What it's NOT
To be clear about scope:
- ❌ NOT an AI / ML model — pure rule
- ❌ NOT predictive (no forecasting)
- ❌ NOT applied automatically (you decide whether to apply)
- ❌ NOT considering competitive dynamics, seasonality, or external factors
- ❌ NOT a substitute for Rules Engine (which acts on entity-level conditions; recommendation is allocation-level)
Connection to Rules Engine (PRD-17)
The recommendation tells you "shift more to Meta". The Rules Engine (rul-*) acts at the entity level (campaign / adset / ad). They're complementary:
- Recommendation: strategic budget mix (cross-platform)
- Rules Engine: tactical entity action (intra-platform)
Workflow: use recommendation weekly to set per-platform total budget caps; use Rules Engine continuously to optimize within each platform.
See rul-105 actions.
Constraints
- Fixed 30-day ROAS window (
windowDays: 30) — not driven by the page date range - ±50% multiplier clamp (
MAX_BUDGET_SHIFT_PCT = 50) - Guardrails: ≥14 days with spend, meaningful daily spend, positive average ROAS — otherwise no recommendation
- target_currency required (no native currency option)
- Feature gating:
ENABLE_CROSS_CHANNEL_ANALYTICS(route returns 404 when off)
Common mistakes
- Applying recommendation in full overnight: auction shock; apply gradually over days
- Treating it as AI prediction: it's rule-based on historical ROAS only
- Ignoring spend column: small-spend platforms have noisy ROAS; rule may over-recommend
- Skipping postback lag check: short windows give incomplete ROAS data
- Reading recommendation without channel comparison: missing context
FAQ
Is Wevion's budget recommendation powered by AI?
No — despite the "AI suggestions" label, Wevion's Budget recommendation is rule-based, not machine learning. Backed by getOptimalMixRecommendation(), it shifts budget toward higher-ROAS platforms using historical patterns only. This is deliberate: the rule is transparent, auditable, and predictable, with no training-data drift and no external data feeds.
How does the budget recommendation rule work?
Over a fixed 30-day window, the rule computes each platform's ROAS and the average ROAS, then derives a budget multiplier of clamp(sqrt(roas / averageRoas)). It clamps that multiplier to ±50% (MAX_BUDGET_SHIFT_PCT = 50) to prevent disruptive reallocation, then returns the current versus recommended split. Guardrails (≥14 days with spend, meaningful daily spend, positive ROAS) must pass first.
Should I apply the budget recommendation all at once?
No — apply it gradually. Auction systems like Meta and Google react poorly to abrupt budget changes, causing bid spikes and destabilized audience auctions. Spread a large shift over 2-4 days in smaller deltas, for example +15% Monday, +15% Wednesday, and +15% Friday for a +50% total.
What date range does the budget recommendation use?
It uses a fixed 30-day window (windowDays: 30), not the page's date-range picker — you can't shorten or lengthen it from the UI. A guardrail requires at least 14 days with spend inside that window before a recommendation is produced. Since ROAS in the last 24-72 hours is still settling, treat the freshest days with some caution.
Does Wevion apply the budget recommendation automatically?
No. The Budget recommendation is never applied automatically — you decide whether to accept it fully, accept it partially, or reject it. It's also not predictive and doesn't model diminishing returns, competitive dynamics, or seasonality, so pair it with human judgment and the Channel comparison block.
FAQ
Is Wevion's budget recommendation powered by AI?
No — despite the "AI suggestions" label, Wevion's Budget recommendation is rule-based, not machine learning. Backed by getOptimalMixRecommendation(), it shifts budget toward higher-ROAS platforms using historical patterns only. This is deliberate: the rule is transparent, auditable, and predictable, with no training-data drift and no external data feeds.
How does the budget recommendation rule work?
Over a fixed 30-day window, the rule computes each platform's ROAS and the average ROAS, then derives a budget multiplier of clamp(sqrt(roas / averageRoas)). It clamps that multiplier to ±50% (MAXBUDGETSHIFT_PCT = 50) to prevent disruptive reallocation, then returns the current versus recommended split. Guardrails (≥14 days with spend, meaningful daily spend, positive ROAS) must pass first.
Should I apply the budget recommendation all at once?
No — apply it gradually. Auction systems like Meta and Google react poorly to abrupt budget changes, causing bid spikes and destabilized audience auctions. Spread a large shift over 2-4 days in smaller deltas, for example +15% Monday, +15% Wednesday, and +15% Friday for a +50% total.
What date range does the budget recommendation use?
It uses a fixed 30-day window (windowDays: 30), not the page's date-range picker — you can't shorten or lengthen it from the UI. A guardrail requires at least 14 days with spend inside that window before a recommendation is produced. Since ROAS in the last 24-72 hours is still settling, treat the freshest days with some caution.
Does Wevion apply the budget recommendation automatically?
No. The Budget recommendation is never applied automatically — you decide whether to accept it fully, accept it partially, or reject it. It's also not predictive and doesn't model diminishing returns, competitive dynamics, or seasonality, so pair it with human judgment and the Channel comparison block.
Steps
- Over a fixed 30-day window (windowDays: 30, not the page date range), compute each platform's ROAS
- Compute the average ROAS across platforms
- Derive each platform's budget multiplier as clamp(sqrt(roas / averageRoas))
- Clamp the multiplier to ±50% (MAXBUDGETSHIFT_PCT = 50) to prevent disruptive reallocation
- Return current vs recommended split
Last updated: 2026-05-17