ROAS decay detection
Two methods run in parallel: z-score against a 30-day rolling baseline (threshold z < -2.0) and linear regression slope over 14 days (threshold < -1.5% per day). Both required to surface a card.
Anomaly detection
Most anomaly detection runs on platform-reported numbers. TrustData's runs on your deduplicated first-party metrics, the only numbers that haven't been inflated. ROAS drops detected here are real drops.
Two methods run in parallel: z-score against a 30-day rolling baseline (threshold z < -2.0) and linear regression slope over 14 days (threshold < -1.5% per day). Both required to surface a card.
Symmetric to ROAS decay. Detects significant cost-per-acquisition increases using the same dual-method approach on deduplicated conversion data.
Medium-severity anomalies enter a watch period before surfacing as actionable. High z-score drops (z < -3.0) are immediately actionable. Medium drops wait 7–14 days to confirm the signal is real, not a one-day blip.
Budget optimizer
The optimizer maximizes your total output from a fixed budget by finding the allocation where marginal ROAS is equal across all campaigns. When marginal returns are equalized, no budget shift can improve total output. That's the mathematical optimum.
Each campaign's spend-to-revenue relationship is modeled as a Hill function, capturing saturation effects that linear models miss. Curves are rebuilt every Monday from your actual deduplicated revenue data.
The optimizer uses scipy SLSQP to find the spend allocation across campaigns that maximizes total revenue subject to your total budget constraint. Each recommended shift must exceed $500 to surface as a card.
If an incrementality calibration factor exists for a channel, the optimizer uses your true incremental ROAS, not platform-reported ROAS, for response curve modeling. Tested channels get materially better recommendations.
Before/after verdicts
Following a budget recommendation is a hypothesis. TrustData treats it as one, tracking the outcome for 14 days with a control group to separate the signal from ambient ROAS movement.
After a recommendation is followed, TrustData captures the ROAS baseline snapshot and begins tracking. Verdict calculation starts after 14+ days of elapsed time.
Channel-level ROAS drift across all paid channels during the same period is the natural control. The adjusted delta filters out market-wide ROAS movements; only your campaign-level change counts.
winner (adjusted delta ≥ 0.3 ROAS units), likely_winner (≥ 0.1), no_effect (≤ -0.1), or inconclusive. These verdicts feed back into the response curve model for the next optimization cycle.
Card lifecycle
From detection to verdict, every paid action has a structured lifecycle. The four-tab dashboard gives you a clear view of what's new, what's active, and what the record shows.
Unfollowed anomaly cards (no spend_delta). ROAS decay and CPA spike cards with context snapshot including baseline ROAS, current ROAS, z-score, and days in decline.
Unfollowed optimization cards (with spend_delta). Recommended allocation change per campaign, backed by response curve evidence and marginal ROAS comparison.
Active shows followed cards tracking their 14-day window. Concluded shows the full before/after record: baseline ROAS, post-change ROAS, control drift, adjusted delta, and verdict.
Every component of the Paid Action Layer.
All anomaly detection runs on first-party deduplicated ROAS and CPA, never on platform-reported numbers.
Z-score vs 30-day rolling baseline plus linear regression slope over 14 days. Both run daily after the dbt pipeline.
Medium anomalies held for 7–14 days before surfacing. High-severity anomalies (z < -3.0) surface immediately. Hold expiry re-runs detection on fresh data.
Spend → revenue modeled via Hill saturation function. Rebuilt weekly on Monday from actual deduplicated revenue data per campaign.
scipy.optimize.minimize maximizes Σ revenue_i(spend_i) subject to total budget constraint and per-campaign bounds. Per-campaign spend bounds configurable.
If a CalibrationFactor exists for a channel, the optimizer multiplies r_max by the effective_factor (decayed). Tested channels get incrementality-aware recommendations.
If AdvertiserConfig is set with blended margin and goal = efficiency/profitability, the optimizer uses profit curves instead of revenue curves. ROI 2–4 waterfall available.
14-day observation window, control-group-adjusted delta, winner/likely_winner/no_effect/inconclusive verdicts. Results stored in outcome_tracked JSON.
FAQ
14-day free trial
14-day free trial. Detect anomalies, optimize your budget, and measure what actually moved the needle.