| Loading… |
| Pick a run from the Runs tab to populate Target Decisions. |
| Portfolio | Push | Inventory | Inventory Bucket | Rank SKU | Projection (yest) | Stance | TACoS Target override % · expires · note |
Yest TACoS | Yest Spend | L3 TACoS | L7 TACoS | L14 TACoS | L30 TACoS | L14 Total Revenue | L14 Ad Sales | Ad Sales % (L14) | Initial ETA | Multiplier multiplier × · expires · note |
Effective ETA | Auto | Broad | Phrase | Exact | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||||||||||||||||||
TACoS target ÷ Ad-sales % L14, then
multiplies by this knob before applying match-type tolerance and
the campaign-level orders/day bonus. Set 1.00 for no change,
1.10 for +10% (more aggressive), 0.90 for −10%
(more conservative). Leave blank to clear the override.
| Portfolio | Push | Inventory | Inventory Bucket | Rank SKU | Projection (yest) | Stance | TACoS Target | Yest TACoS | Yest Spend | L3 TACoS | L7 TACoS | L14 TACoS | L30 TACoS | L14 Total Revenue | L14 Ad Sales | Ad Sales % (L14) | Initial ETA | Multiplier | Expires (PT) | Note | Effective ETA |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Loading… | |||||||||||||||||||||
Effective ETA × match-type tolerance. The orders/day bonus is applied
per-campaign at run time on top of these values, so cells here represent the starting
ETA the engine uses for any keyword/target of that match type before the orders bonus.
The TACoS Target column is editable inline (same backend the TACoS Targets tab uses) —
all match-type cells recompute live as you type. Edit multipliers on the ETA Targets tab;
edit match-type tolerances on Settings → Bid Rules → Match-type tolerances. Saving any
of those auto-refreshes this tab.
| Portfolio | Push | Inventory | Inventory Bucket | Rank SKU | Projection (yest) | Stance | TACoS Targetoverride %(blank = sys) | Yest TACoS | Yest Spend | L3 TACoS | L7 TACoS | L14 TACoS | L30 TACoS | L14 Total Revenue | L14 Ad Sales | Ad Sales % (L14) | Initial ETAtacos ÷ ad-sales % | Multiplier+expires/note | Effective ETA(initial × multiplier) | Autoeta × — | Broadeta × — | Phraseeta × — | Exacteta × — |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Loading… | |||||||||||||||||||||||
Looks at each campaign as a whole. Decides ONE bid direction and ONE budget direction per campaign, then applies the bid decision to every keyword in the campaign with per-keyword safety guardrails. Best for coordinated moves where bid and budget should respond together.
target ACOS × hold_band_hi. With the default hold_band_hi = 1.00, that means at-or-below the target ACOS itself. Worked example: target = 28.8% → cut-threshold = 28.8% × 1.00 = 28.8%. Note that's multiplicative (NOT 28.8% minus 10pp = 18.8%). A campaign with L30 ACOS at 28% sits inside the protected zone → no cut. A campaign at 30% is above the threshold → cut allowed. Cutting at-or-below target risks starving a winner. (Changed 2026-05-06 from the old 1.10 default; campaigns running L30 above the target now get a cut even if they're only slightly over.)Looks at each KEYWORD individually. Decides bid up / down / hold per kw based on its own ACOS history and trend. No budget changes — that side is untouched. Best when you want fine-grained per-keyword tuning.
kw target × 0.90 (the lower edge) and kw target × 1.00 (the upper edge — the target itself), decreases are suppressed. Worked example: kw target = 28.8% → band runs 25.92% (= 28.8 × 0.90) up through 28.8% (= 28.8 × 1.00). A kw at 27% L30 sits inside → no cut. A kw at 30% is above the upper edge → cut allowed. Note this is multiplicative — 28.8 × 0.90 = 25.92, NOT 28.8 minus 10pp = 18.8.Same as Quick Run – Bids, but adds a Reviewer agent at the end. The Reviewer reads each suggestion, validates the math, flags contradictions, and assigns final urgency / bucket / confidence before the dashboard sees it. Quality gate, not a redecide.
| Queued (PT · ET) | Type | Status | Stale | Portfolio | Campaign | Keyword / Target | Match | Direction | From | To | Δ | % Δ | ACOS L7 | Ord L7 | ETA | OOB | Comment | Actions | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Loading… | |||||||||||||||||||
Tunable knobs for the ads-agent stack. Changes are saved to Firestore and take effect on the next request — no redeploy needed. Every change is recorded in the audit log at the bottom of this page.
Mirrors of the knobs you flip most often. Change a value here, then click Save changes at the bottom — the same as on Bid Rules / Budget Rules, and the change applies in both places at once.
Numbers above are stored to Firestore on save and visible to the engine immediately. The engine itself reads from these on every run starting in Phase 2B (runner deploy follows).
Cooldown windows + suggestion gates for the Placement tab's auto-suggester. Lengthening the cooldown gives a placement change more time to settle into the L14 window before another move is suggested.
Budget magnitudes use the same % / Flat $ / Hybrid rule shape as bid magnitudes. Engine reads from these on the next campaign run.
| Name | Region | Last execution | State | Completed | Tasks | Image (digest) |
|---|---|---|---|---|---|---|
| Loading… | ||||||
| Name | Schedule (cron) | Region | State | Last attempt | Next fire | Target URI |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Upload a list of campaign names with an expiration date. While an entry is active (today is before its expiration date, PT), that campaign behaves like a push-off portfolio on Campaign Decisions: the row is greyed, its checkbox is disabled, and it carries a PUSH OFF - C badge in the campaign column (portfolio push-offs show PUSH OFF in the portfolio column). The expiration date is your safety net — a forgotten entry auto-reactivates once the date passes, so nothing stays off forever.
Matching is by campaign name (case-insensitive, whitespace-normalized). Download the template, fill it in (one row per campaign: campaign_name,expiration_date where the date is YYYY-MM-DD), then upload it.
Define rules so newly-created portfolios or campaigns whose name contains a chosen pattern get treated as push-off automatically — no need to add each one to the explicit Push Off-C list. Matching is case-insensitive; pattern TOS and ROS catches "Mens Tee | TOS and ROS | Manual" and "TOS AND ROS broad". Toggle a rule OFF to pause it without deleting.
When a rule matches: the portfolio's push behaves like Push Off (portfolio level) and the campaign's push behaves like Push Off-C (campaign level). The matched rows on Campaign Decisions show a red AUTO PUSH OFF badge so you can tell rule-driven from explicit-list-driven at a glance.
| On | Pattern | Notes | Currently matching | |
|---|---|---|---|---|
| Loading… | ||||
| On | Pattern | Notes | Currently matching | |
|---|---|---|---|---|
| Loading… | ||||
Surfaces campaigns where the portfolio is hot on TACoS and the campaign is hot on ACOS. Tune the thresholds and default cut on the Settings tab → Budget Decrease section. Default sort = biggest leaks first (highest waste = spend − sales×target).
Ad-hoc fetch-then-queue. Each fetch is hand-coded by Claude for a specific need, results land here, you select rows + an action, queue through the existing queue.
Each campaign appears in at most one window — the window when it first crossed the threshold that day. Use this to split the day into action buckets (e.g. "morning crossers get +$10/d, afternoon crossers get +20%").
One row per campaign. Columns:
row_type, campaign_name, action,
amount, notes.
row_type = bid or budget (dropdown).
action (dropdown):
Always enter positive amounts. Direction comes from the action.
For bid rows, the action applies to every enabled kw/target in the campaign individually. Percentage and dollar changes net a different absolute bid per kw based on each kw's current bid; preview shows the resolved per-target ranges.
Upload the same template you'd queue today, but tell us when to fire it. PIN authorizes the schedule right now and the cloud scheduler runs the compute→push chain at the chosen time. No PIN prompt at fire time. Cancel any time before it transitions to 'firing'.
| Schedule ID | Created | Run at (ET / PT) | Filename | Rows | Err | Status | Comment | |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
| Batch ID | Uploaded | Filename | Rows | Pushed | Status | |
|---|---|---|---|---|---|---|
| Loading… | ||||||
| Time (PT · ET) | Batch ID | Items | Outcome | Ad type mix | Kind mix | Portfolios | Pushed by | Duration | |
|---|---|---|---|---|---|---|---|---|---|
| Click Batches above to load batch summaries. | |||||||||