Recent runs: All runs →
Ladies Dry Fit V Neck
Loading...
Avg Daily Sales (L7)
TACoS TargetSource: RE Campaigns TACoS Targets Google Sheet
Daily Budget Available
TACoS at Full Utilization
Total Sales
Ad Sales
Ad Spend
TACoS
Budget Util.
-
Pending
-
Critical (L1)
-
Growth (L2)
-
Bid changes
-
Budget changes
Loading suggestions...

Suggestions — Table

Showing 0 of 0 suggestions

Suggestions — Table Compact

Showing 0 of 0 suggestions

Suggestions — Table Buckets

Showing 0 of 0 suggestions

Campaign Decisions

No run selected

🚦 OOB · Engine Verdict

Out-of-budget by campaign for a date, labeled with the rule the engine hit and its final verdict. Same logic as the engine: a real OOB stamp or ≥90% utilization = OOB; an evening OOB that an LSM cap <80% of budget caused is masked to IN (artificial throttle); LSM cap ≥80% or not-capped evening OOB stays OOB.
⬇ Export Excel
Engine Sees As: Rule:
Loading…

Target Decisions

Pick a run from the Runs tab to populate Target Decisions.

📖 Bid Rules

Suggestions — Table Campaign

Showing 0 of 0

Suggestions — Spreadsheet

Showing 0 of 0
j/k move · a accept · c accept custom · r reject · x select · / search · Esc close drawer
No run selected
Click a run in the Runs tab to load its validation data here.

Agent Questions

Questions the agents wrote during their daily run. Answer one to teach the agent — your answer is saved AND added to the knowledge base automatically.

Today's advertising events

Loading...
Add knowledge entry
📖 Category guide — what goes where?
Strategy
High-level direction and priorities
  • Q2 is our strongest season for dry fit — be more aggressive with bids May through June
  • We prioritize margin protection over volume growth
  • We're testing video ads on workout tops — don't touch those campaign budgets
Guardrail
Hard rules the agent must NEVER violate
  • Never increase bids on competitor brand terms
  • No single campaign should exceed $200/day budget without explicit approval
  • Never decrease bids on keywords that are in our top 5 organic ranking positions
Parameter
Specific numbers and thresholds
  • Target portfolio TACoS is 12%
  • ACOS ceiling for EXACT match keywords: 35%
  • Maximum bid change per suggestion: 20%
Playbook
How to think about situations — daily operational approaches
  • When a keyword has high ACOS but strong sales volume, check the search term report for irrelevant traffic before cutting the bid
  • Before increasing a campaign budget, check if there are low-performing keywords eating spend that should be paused instead
  • Always check if a keyword is a ranking keyword before suggesting a bid decrease — we sometimes pay a premium for organic rank
Keyword insight
Specific knowledge about individual keywords or themes
  • workout tops for women converts much better on mobile than desktop
  • The keyword 'shirts for women' is too generic — broad match picks up irrelevant traffic
  • v neck terms have higher CVR than crew neck terms in this portfolio
Market context
External factors the agent can't see in the data
  • Prime Day is July 15–16 — expect higher CPCs and budget accordingly
  • Competitor XYZ is running heavy promotions this week
  • New listing launched April 1 — data before that date is for the old listing
Lesson learned
Things discovered from past experience
  • We tried aggressive bidding on broad match generic shirt terms in Q1 — it bled $5K with no incremental sales
  • Lowering bids on auto campaigns below $0.30 kills discovery traffic
  • Budget increases over 25% at once trigger Amazon's learning period and waste spend for 2–3 days
Override the TACoS target per portfolio. When an override is active (no expiration OR expires_at ≥ today PT), the agents (Strategist / Optimizer / Reviewer / Custom / Quick Analyst) use the override in place of the sheet value when deriving target ACOS. Leave the Override column blank to use the system value. Leave expiration blank for an indefinite override. To drop an override, clear the value and save.
Bulk assign: 0 selected
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…
Override the per-portfolio ETA multiplier. The engine computes an Initial ETA from 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.

The TACoS Target column is editable inline — your edits write to the same backend the TACoS Targets tab uses. Initial ETA + Effective ETA recompute live as you type, and Save flushes both knobs in one go.
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…
Per-portfolio Effective ETA (after multiplier) broken out by match type. Each cell = 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…
For each portfolio, this view treats today's total daily budget as FIXED and proposes how to MOVE that budget around campaigns within the portfolio. The total per portfolio doesn't change. Pure read-only — nothing pushes to Amazon, nothing queues, no run consumes this. How a campaign earns its share of its portfolio's total budget:
  • Demand — yesterday's utilization. OOB (≥100%) earns 1.5×, high util (90-99%) 1.3×, healthy (70-89%) 1.0×, moderate (50-69%) 0.7×, low (<50%) 0.4×.
  • Efficiency — L14 ACOS vs the engine's ETA target. Way under (<0.5×) 1.5×, comfortably under 1.3×, at target 1.0×, bleeding hard (≥1.5×) 0.3×.
  • Scale — sqrt(L14 sales). Bigger campaigns weigh more but with diminishing returns so one giant doesn't eat the portfolio.
Score = Demand × Efficiency × Scale. Each campaign's share = its score ÷ total score in the portfolio.

Safety guards (so suggestions are sane to act on): no campaign loses more than 40% of current, no campaign more than doubles, every active campaign keeps at least $5/day. After guards, totals are re-scaled to match the portfolio exactly.
Loading…
Computing redistribution…
Suggested daily ad-budget allocations per portfolio, then per match type within the portfolio, then per campaign within the match type. Read-only — nothing pushes to Amazon from here. Step 1 — How much can we afford to spend on ads per day?
Take your TACoS target and apply it to your L14 average daily total sales.
Example: TACoS target 10% × $10,000/day in L14 sales = $1,000/day we can afford to spend on ads.

Step 2 — How do we split that across match types?
Each match type earns its slice based on two things working together:
  • Dollars back per dollar in — for every $1 we put into this match type over the last 14 days, how many $ came back?
  • How much we trust the number — a $10,000 track record makes us about 10× more sure than a $100 track record (not 100×). This stops a lucky 5× return on $5 of spend from outvoting a steady 4× return on $1,200 of real spend.
Multiply those two together → that's the match type's score. Each match type's slice of the budget = its score ÷ total of every match type's score in the portfolio.

Step 3 — How do we split each match type's slice across campaigns?
Same exact logic, one level down — campaigns with strong return AND real spend behind them get the bigger slice.

Zero-sales match types or campaigns get a score of zero → zero budget. ("Stop spending here.")
Loading…
Computing budget distribution…
How the run modes differ. Each mode reads different signals and makes different kinds of moves. Pick the one that matches the question you're trying to answer: "Are my campaigns running efficiently as a whole?" (Campaign Legacy) · "Are individual keywords priced right?" (Bids) · "Bids, but with an extra check?" (Bids + Review).

Quick Run – Campaign (Legacy)

quick_rules_campaign Default

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.

Best for: daily decisioning across portfolios. You want fast, coordinated moves on each campaign and you're OK with the bid being applied uniformly across all keywords (with guardrails).
How a decision flows
1. Read campaign roll-upACOS L7/L14/L30, spend, sales, orders, OOB hours, utilization, last budget change.
2. Compute target ACOSTACoS goal ÷ L14 ad-sales share × your ETA multiplier × match-type tolerance + per-campaign orders bonus.
3. Decide bid + budgetTwo coordinated decisions. Bid follows ACOS-vs-target trend; budget follows OOB + utilization + perf.
4. Run guardrailsHOLD-band, OOB gate, budget cooldown, stance override, per-kw cooldowns.
5. Apply per-kwSame bid % to each child kw, with IKWE −5% cap, $0.02–$3.00 clamp, same-day floor, same-direction cooldown.
Signals

Uses these signals

  • Campaign-level ACOS L7 / L14 / L30 vs target ACOS (ETA)
  • TACoS target (with active overrides)
  • Your ETA multiplier (ETA Targets tab)
  • Match type — sets the tolerance multiplier (auto 0.80 ··· exact 1.20)
  • Campaign orders/day (high-volume campaigns earn extra ACOS room)
  • Out-of-budget hours yesterday + first-OOB time
  • Yesterday's budget utilization
  • Last budget change date (cooldown gate)
  • Portfolio stance — derived from inventory + pace projection
  • Per-keyword last bid change date (cooldown gate)
  • IKWE / sacred-campaign protection

Does NOT use directly

  • Per-keyword ACOS (decisions are at campaign grain — kw ACOS is rolled up but not read individually)
  • Inventory levels directly (only via stance)
  • Pace projections directly (only via stance)
  • Rank-SKU status
  • Per-keyword sweet-spot detection
  • Drift detection
  • Trend classifier sub-scenarios at the kw level
Guardrails
  • Anti-overcut guard — bid AND budget DECREASES are suppressed whenever ACOS L30 is at-or-below 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.)
  • OOB gate (bid) — if the campaign capped out yesterday, bid increases get held regardless of whether the budget is also being raised. The reasoning: pushing bids and budgets up at the same moment puts too much pressure on a freshly-raised cap. Let the budget expansion play out first, then revisit bids next run.
  • Budget cooldown — universal 24h floor on any budget change. Same-direction cooldowns: 5/7/10 days for increases (light/moderate/strong), 3/5/7 days for decreases. Reversals (different direction) are allowed past the 24h floor.
  • DEFENSIVE caps — DEFENSIVE / CONSERVATIVE stance does NOT force any change. If the scenario is already deciding to move, the magnitude gets capped: max 5% bid increase, max 2.5% bid decrease, max 5% budget change (in either direction). Conservative means restrained, not aggressive backpedal — DEFENSIVE often just means inventory is uneven across variants, not that the portfolio is unsellable.
  • SCALE upgrade — SCALE stance promotes the bid step on sustained-good campaigns: instead of the default +5% bump, sustained-good in SCALE goes +10%.
  • Per-keyword same-day floor — never two bid changes on the same keyword in the same calendar day.
  • Per-keyword same-direction cooldown — if we cut a kw's bid 4 days ago and the campaign decision says cut again today, the cut is skipped on that kw. Reversals (different direction) are allowed.
  • IKWE protection — sacred Individual KW Exact campaigns get a max −5% bid decrease cap.
  • Bid clamps — every kw bid stays inside $0.02 – $3.00. Changes smaller than $0.02 are skipped.
  • Hold-band override transparency — when the trend classifier wanted to cut but the hold band blocked it, the suppressed scenario is recorded so you can see what would have happened.

Quick Run – Bids

quick_rules Start Rules

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.

Best for: targeted bid optimization where each keyword's history matters more than the campaign average. Especially useful for portfolios with a mix of high- and low-performing keywords inside the same campaign.
How a decision flows
1. Read each keywordPer-kw ACOS L7/L14/L30, current bid, orders, clicks, days with data, last bid change.
2. Compute kw targetTarget ACOS × match-type tolerance + per-keyword orders bonus.
3. Classify trendEight scenarios: sustained_good/bad, emerging good/bad, deteriorating, recovering, lucky, mixed.
4. Run guardrailsHOLD band, zero-sales check, drift, sweet-spot, same-day floor, same-direction cooldown, IKWE cap.
5. Emit suggestionPer-kw bid change with urgency level (L1–L4) and reasoning. Budget side is untouched.
Signals

Uses these signals

  • Per-keyword ACOS L7 / L14 / L30
  • Per-keyword bid history (last change date, from/to, dominant bid by period)
  • Per-keyword orders/day, clicks, days with data
  • Match type tolerance (per kw)
  • TACoS target + your ETA multiplier
  • Sweet-spot detection (revert to a known-good prior bid)
  • Drift detection (cumulative L30 movement)
  • Same-day floor + same-direction cooldown bands
  • Campaign-level OOB / utilization (feeds urgency, not bid math directly)
  • Portfolio stance (feeds urgency / bucket assignment)
  • IKWE / sacred-campaign protection
  • Zero-sales-with-clicks (high-priority L1 cut)

Does NOT use

  • Budget changes — this mode never touches budgets
  • Inventory levels directly (only feeds urgency tier)
  • Pace projections directly (only feeds urgency tier)
  • Rank-SKU status
  • Coordinated bid+budget logic (each kw is decided in isolation)
Guardrails
  • HOLD band — when ACOS L30 sits between 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.
  • Zero-sales-with-clicks — keywords with clicks but zero sales over L30 trigger an L1-urgent cut, bypassing the HOLD band (active money-loss).
  • Same-day floor — never two bid changes on the same kw in the same day.
  • Same-direction cooldown — light bands run ~3 days, moderate ~5, aggressive ~7. Lets the prior change settle before stacking.
  • Reversal allowed — different-direction prior change isn't blocked by cooldown (only by the 24h floor).
  • Sweet-spot revert — when a kw is being cut, the engine looks for a historically-profitable bid level and may revert toward the midpoint instead of cutting fresh.
  • Drift detection — kw drifted ≥ N% cumulative in either direction triggers special handling: pause-candidate for chronic decreases, pull-back for over-increased.
  • IKWE protection — IKWE keywords get max −5% bid decrease cap, and pause is forbidden.
  • OOB-yesterday gate (bid increases) — same logic as Campaign mode: bid+ blocked if budget isn't being raised, softened to +5% if it is.
  • Bid clamps — every bid stays inside $0.02 – $3.00. Changes smaller than $0.02 are skipped.

Quick Run – Bids + Review

quick_rules_reviewed Start Rules + Review

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.

Best for: when you want every per-keyword suggestion second-checked for math errors, contradictions ("we're cutting and increasing the same kw on different days"), or stale signals before you start clicking Accept.
How it differs from Quick Run – Bids
1. Same as Bids modeAll five steps from the Bids mode run identically.
2. Reviewer agent reads each suggestionClaude managed agent loads the suggestion + its reasoning + the kw's recent history.
3. Math + contradiction checksVerifies the % change and direction match the cited ACOS. Spots contradictions with recent history.
4. Final urgency + confidenceL1–L4 urgency, bucket, confidence score. May downgrade urgency or flag for manual review.
5. Write to dashboardSuggestion lands with reviewer metadata attached.
What the Reviewer does

Reviewer can

  • Validate the proposed bid math (does the % match the ACOS-vs-ETA delta?)
  • Flag contradictions ("we cut this kw 2 days ago and now we want to cut again — is that right?")
  • Downgrade urgency (L1 → L3 if the signal is weak)
  • Assign a final bucket (urgent_critical, urgent_growth, optimization, monitor)
  • Attach a confidence score (high / medium / low)
  • Add notes that show on the suggestion card

Reviewer cannot

  • Change the proposed bid value (math comes from the rules engine)
  • Add new suggestions (only reviews ones the rules engine emitted)
  • Override engine guardrails (HOLD band, IKWE cap, cooldowns are final)
  • Reach the Amazon Ads API (read-only — Eddie still clicks Accept to push)
Trade-offs
  • Slower — adds the Reviewer pass on top of the rules pass. Expect roughly 2× the wall-clock time of plain Quick Run – Bids.
  • More expensive — Claude managed-agent calls cost real money per run.
  • Better quality — math errors and contradictions get caught before you act on them. Confidence scores let you triage which suggestions to read carefully vs which to bulk-approve.
  • Same guardrails — every safety net listed under Quick Run – Bids still applies. The Reviewer is additive, not replacing.

Negating

SP search-term candidates · L30 · refreshed every 12h
Pick filters and click Load.
Targeting
Severity
Min camp L30 spend $ Portfolio contains View
Pick filters and click Load to fetch candidates.

Placement

SP campaign × placement · L30 · refreshed every 12h · raw L30 inspection — Decisions live under the Placement Decisions tab
Pick filters and click Load.
Campaign state
Min camp L30 spend $ Campaign name contains
Pick filters and click Load to fetch placement data.

Placement Decisions

No decisions loaded
Conditions (all must be met)
    Rationale

    Placement Decisions - V

    No decisions loaded
    Only Totals columns are sortable — placement columns lock together so each campaign's 3 rows stay grouped.

    Rank Decisions - V

    No decisions loaded
    Only Totals columns are sortable — placement columns lock together so each campaign's 3 rows stay grouped.

    📋 Reads

    Latest: —
    Loading…
    No Read selected. Click ▶ above or pick one from the history list.

    Top Targets

    No run selected
    Yest spend bucket:
    0 selected
    0 selected
    0 selected
    Loading…
    Queued (PT · ET) Type Status Stale Portfolio Campaign Keyword / Target Match Direction From To Δ % Δ ACOS L7 Ord L7 ETA OOB Comment Actions
    Loading…

    Settings

    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.

    📈 Bid — frequently used

    mirrored from Bid Rules
    Loading…

    💰 Budget — frequently used

    mirrored from Budget Rules
    Loading…
    Loading…

    Email log

    every email the system sent or would have sent — newest first
    Loading…

    Audit log

    recent settings changes — newest first
    Loading…
    Same backend — scenario view anchors each setting to a concrete "if X happens" example.
    Loading…

    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).

    Loading…

    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.

    Same backend — scenario view anchors each setting to a concrete "if X happens" example.
    Loading…

    Budget magnitudes use the same % / Flat $ / Hybrid rule shape as bid magnitudes. Engine reads from these on the next campaign run.

    0 changes pending
    Cloud Run Jobs
    NameRegionLast executionStateCompletedTasksImage (digest)
    Loading…
    Cloud Scheduler
    NameSchedule (cron)RegionStateLast attemptNext fireTarget URI
    Loading…

    ⛔ Push Off-C — campaign-level push-off

    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.

    ⤓ Download template (CSV)

    Current entries

    Campaign nameExpiration (PT)StatusAdded
    Loading…

    🛑 Auto Push Off — pattern-based push-off

    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.

    🗂 Portfolio rules

    On Pattern Notes Currently matching
    Loading…

    🎯 Campaign rules

    On Pattern Notes Currently matching
    Loading…

    🪓 Budget Decrease — workspace

    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).

    Loading…
    Portfolio P-TACoS Campaign ACOS Spend Sales Waste Cur $/d Sug $/d Override $/d
    Loading…

    🎯 One Time Runs — workspace

    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.

    🕒 Fetch: First crossed N% in a PT window

    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%").

    ⊘ Exclude campaigns that already had moves (optional)
    Pick a saved run above to load rows.
    ⚠ Override tool. This bypasses every gate at push time — no cooldown, no universal bid cap, no portfolio push-off, no Push Off - C, no SB/SD kill switch. Whatever you queue pushes as-is from the Queue tab (PIN there). Use Campaign Decisions for normal flow.

    1. Download the template

    One row per campaign. Columns: row_type, campaign_name, action, amount, notes.

    row_type = bid or budget (dropdown).

    action (dropdown):

    • set to — amount is the new absolute value.
    • raise by % / lower by % — amount is a positive percentage.
    • raise by $ / lower by $ — amount is a positive dollar change.

    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.

    2. Upload your filled file

    📊 Click to upload, or drag & drop your filled-in .xlsx

    ⏰ Schedule for later (deferred fire)

    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'.

    = — PT

    📅 Scheduled bulk edits

    Schedule IDCreatedRun at (ET / PT) FilenameRowsErr StatusComment
    Loading…

    Recent edit batches

    Batch IDUploadedFilenameRowsPushedStatus
    Loading…

    Edit batch

    Loading…
    One row per bulk_action_id — every push action grouped. Click a row to drill into its individual rows.
    From: To:
    Time (PT · ET) Batch ID Items Outcome Ad type mix Kind mix Portfolios Pushed by Duration
    Click Batches above to load batch summaries.
    Portfolios
    ⏳ Loading portfolios…
    Three engines operate at the keyword/target level across each selected portfolio (no Strategist, no per-campaign Optimizer). Emits bid changes only (no budget changes). Singleton: only one Complete or Quick* run can be in progress at a time.
    Rules engine
    Deterministic Python — no LLM. Fast iteration / testing / baseline.
    ~30–60 sec per portfolio.
    Rules + Reviewer
    Rules engine then Reviewer agent QA. Safety net for daily routine.
    ~3–8 min per portfolio.
    Agent (Keyword/Target Analyst)
    Full LLM pass + Reviewer. Deepest analysis with narrative reasoning.
    ~15–25 min per portfolio.
    Recent Runs
    ⌛ Loading recent runs…
    0 selected
    Bulk select by vote: