【QA v3 demo】Ad Architecture Spec 2026-05-16 v2 (optimization goal patch)

DESIGN SPEC · 2026-05-16

Ad Campaign Architecture · ROAS-10 + Funnel + Equity-Floor

Status: design draft · pending user review → writing-plans

Ad Campaign Architecture: ROAS-10 + Funnel + Equity-Floor Spec

狀態:design draft(pending user review → writing-plans)
日期:2026-05-16
前置
– CAPI ATC bridge fix 完成(mu-plugin 2-sec-meta-capi-atc.php,audit pass HTTP 200 with em/ph/fn/country hashed)
– 45 個 v2 pencil banner 全 9 主題簽收(project_v2_pencil_banners_45_complete
– 5/14 fresh audit 跑完(2026-05-14-meta-ads-audit-510-513.md)+ 5/16 補拉 last 3d Meta data
Spec refs
2026-05-14-meta-ads-optimization-roadmap.md(A1-A4, B1-B6, C1-C7 53 items)
– ads-meta SKILL(Andromeda, EMQ, M01-M50 markers)
– ads-budget SKILL(70/20/10, 3x Kill Rule, 20% scaling rule)
– ads-test SKILL(IF/THEN/BECAUSE hypothesis, 95% confidence)
– ads-math SKILL(Break-Even CPA = AOV × Margin = NT$13.7K × 60% ≈ NT$8,200)
– ads-plan/info-products template(Cold 50-70% / Retargeting 20-35% / Buyer 10-15%)


1. Goal

把 SEC 廣告帳號從「51 campaign 過度分散 + ROAS 7.84x blended 但 60% spend 在零轉換」整理成「27 theme×city + 1 BUYER cross-sell campaign,portfolio blended ROAS ≥ 10x,每個 session 不被偏頗」。

核心 KPI(依優先序):
1. Equity floor:每個 theme×city campaign 永不 archive;每個 session 都有 fair shot 達到最低門檻 8 人
2. Portfolio blended ROAS ≥ 10.0(current 15.7x — 砍掉 CBO 拖累後預期維持)
3. Per-funnel-stage ROAS targets:cold 10 / warm 10 / hot 15 / buyer 8(自然差異健康)

為什麼現在做
– CAPI 修好後 em/ph/fn 真的進 Meta,EMQ 預計 24-48h 從 6.1 → 7.5-8.5+,現在是 restructure 的最佳窗口
– 45 v2 banner 簽收但還沒 bind到 adsets,仍跑 5/10 的 27 套版(Andromeda M-AN1 Critical Fail 還在繼續發生)
– 5/14 CBO migration 那批 duplicates 在 3d ROAS 7.35x(CBO 沒 warm/hot adsets + A+ Audience + LPV optimization),無論 budget mode 真實效果如何都該砍 — 不修每天繼續燒 NT$11K+/day 在零轉換 CBO duplicates;真實 budget mode 對比留 § 7 Exp 3 二次驗證
– 報名季 T-30 倒數,summer camp 不能再花時間在 noise 上

非目標
– 不擴展到 Google / YouTube / LINE 平台(spec 限 Meta 範圍)
– 不重新生成 creative(45 v2 banner 已 lock,per feedback_ad_signoff_full_state_picker
– 不動 mu-plugin / wp-config / production code(per carve-out 之一,需人工)
– 不替換 brand voice / messaging(既有 specs.json copy 已 lock)


2. Scope(per data-driven decisions 2026-05-16)

9 主題 × 3 城市 = 27 theme×city base campaigns
   25  ABOper 3-day head-to-head, ABO ROAS 22.56x vs CBO 7.35x
   2  CBOvet-camp 中學班 × taichung + taipei唯一 CBO 贏的 theme

+ 1  cross-sell CBO campaignnew
   SEC2026cross-sellBUYERS

= 28  active campaignsvs 現況 51 

Archive: 22  CBO duplicates其他 9 主題的 CBO 全砍

Adset 結構(每個 prospect campaign 內 4 個 funnel stage)

SEC2026・<theme>・<city>
├ COLD-LAL-1-3pct (Manual narrow, 30% budget)        → Cost Cap @ AOV/10
├ COLD-CLUSTER-A   (Manual interest, 30%)            → Cost Cap @ AOV/10
├ COLD-ADV-AUDIENCE (A+ Audience TEST slot, 10%)    → 14d learn-or-kill
├ WARM-VV75-7d     (75% video viewers last 7d, 10%) → ROAS Goal 10
├ HOT-ATC30        (ATC last 30d - buyers, 12%)     → ROAS Goal 15
└ HOT-IC30         (IC last 30d - buyers, 8%)       → ROAS Goal 15

Buyer cross-sell campaign 結構

SEC2026・cross-sell・BUYERS (CBO)
├ BUYER-dentistry-to-vet     (CA: dentistry buyers, exclude vet buyers)
├ BUYER-floral-to-dentistry  (CA: floral buyers, exclude dentistry buyers)
├ BUYER-vet-to-vet-camp      (CA: vet-rescue buyers, exclude vet-camp buyers)
├ BUYER-architect-to-dino    (CA: architect buyers, exclude dino buyers)
└ BUYER-broad-multi          (CA: any buyer, multi-theme combo creative)

Budget split (portfolio-level)
– Cold prospecting:60% of daily total(25 ABO + 2 CBO 中學班)
– Warm nurture:15%(each campaign 內 WARM adset)
– Hot retargeting:15%(each campaign 內 HOT-ATC + HOT-IC)
– Buyer cross-sell:10%(新 CBO campaign)


3. 4-Dimension Decision Matrix(已知 winner lock + unknown test)

                  COLD (60%)                  WARM (15%)                 HOT (15%)                 BUYER (10%)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Budget Mode       ABO (25 themes)             ABO (within campaign)     ABO (within campaign)     CBO (cross-product)
                  CBO (vet-camp 中學班)                                                         
                   Evidence: ROAS 22 vs 7     Inherit from camp        Inherit from camp        Cross-theme 有意義
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Audience          Manual Narrow (90%)         Manual CA                 Manual CA                 Manual CA (buyers)
                  + A+ Audience (10% test)   (parents_6_8, VV75,        (ATC30 / IC30 exclude     (cross-theme)
                   Evidence: Narrow 24-31x    lead magnet)              buyers per 5/14 A1)    
                   A+ 未測,14d learn-or-kill   N/A (A+ 不適用 CA)        N/A (A+ 不適用 CA)        N/A
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Bidding           Cost Cap @AOV/10            ROAS Goal 10              ROAS Goal 15              ROAS Goal 8
                   ROAS Goal 10 after        (small pool fast)         (retargeting natural      (cross-sell harder
                   50+pur/wk per ads-meta                                higher 3.61x median)      than same-theme)
                   Per ads-budget tree        Stable signal pool       Per benchmarks           Realistic floor
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Creative          All 45 v2 banners bound     Same (Andromeda decides)   Same + emphasize          Cross-theme combo
                  (per Andromeda M-AN1)                                  testimonial / urgency     creative (new)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Mode A/B          per session fill status     N/A (no fill constraint)  N/A                       N/A
switching         < 8 enrollment + T-30                                                        
                   Filling (Lowest Cost)                                                        

已知 winners(lock,但部分 confounded — 詳 § 5)
1. ABO + Manual Narrow + warm/hot funnel adsets 整套組合 ROAS 22.56x(vs CBO + A+ Audience + cold-only adsets 7.35x)— 變數混雜,Exp 3 補做純 budget mode 對比
2. Manual Narrow > Manual Broad(per last 3d aggregate:Cluster 31.48x / LAL 24.35x vs Broad 7.73x)— 較乾淨對比
3. vet-camp 中學班 CBO + A+ Audience ROAS 81x(單一高 AOV 主題例外)→ Spec § 2 保留作 CBO exception

Unknown to test(disciplined experiments per § 7)
3. Manual Narrow vs A+ Audience — SEC 從未開過 A+ Audience(per 5/14 audit M22)
4. Funnel Sequential vs Parallel — SEC 目前 cold-only 流量集中,retargeting 還沒建
5. CBO vs ABO 二次驗證 — 5/14 的 wave 有 launch noise,cleaner setup retest


4. Per-theme×city Campaign Spec

每個 27 campaign 必須符合:

Field Value
Naming SEC2026・<theme>・<city> (ABO) or SEC2026・<theme>・<city>・CBO (vet-camp 中學班)
Objective OUTCOME_SALES
Budget level Adset (ABO) or Campaign (CBO)
Daily budget per adset (ABO) NT$300-1500(依 theme×city × funnel-stage allocation)
Daily budget per campaign (CBO) NT$2000-3000(vet-camp 中學班 / cross-sell)
Bid strategy default Cost Cap @ AOV/10 (cold) / ROAS Goal (warm/hot/buyer)
Attribution 7-day click / 1-day view(per ads-meta M09,後 Jan 2026 view-through 28d 移除)
Region TW only
Age 28-50(per 既有 catalog)
Compliance TAIWAN_UNIVERSAL(per meta-ads-taiwan-compliance rule)
Floor 每 campaign 至少 2.5% portfolio daily total(27 × 2.5% = 67.5% baseline)

Adset 內 budget allocation(per campaign 總預算)
– COLD-LAL-1-3pct: 30%
– COLD-CLUSTER-A: 30%
– COLD-ADV-AUDIENCE: 10%(test slot)
– WARM-VV75-7d: 10%
– HOT-ATC30: 12%
– HOT-IC30: 8%


5. Optimization Goal Ladder(新增 — 5/16 18:00 patch)

5/16 拉樣本後發現:幾乎所有 cold adsets 都設 optimization_goal: LANDING_PAGE_VIEWS。這在 CAPI bridge bug 期間是 defensible(Purchase 訊號收不全),但現在 CAPI 修好、em/ph/fn 真實上 Meta 後,應該升級為 conversion-based optimization。

現況樣本

Campaign Adsets optimization_goal advantage_audience
ABO dentistry × taipei (cold, 5/10) interest + unbought_CA LANDING_PAGE_VIEWS 0 (Manual)
ABO dentistry × taipei (warm, 5/10) CA-based OFFSITE_CONVERSIONS (Purchase) 0 (Manual)
CBO vet-camp 中學班 × taichung (5/14) LAL LANDING_PAGE_VIEWS 1 (A+ Audience ON)

Implication for prior conclusions
– 「ABO 22.56x vs CBO 7.35x」是 confounded experiment —— ABO 有 warm/hot funnel adsets + Manual targeting,CBO 只有 cold + A+ Audience,optimization_goal 兩邊都 LPV
– 真實 winner = 「Manual + funnel structure + warm/hot 用 OFFSITE_CONVERSIONS」這整套組合,不是 ABO budget mode 本身
– vet-camp 中學班 CBO 贏(ROAS 81x)的真正原因可能是 A+ Audience + 高 AOV 主題 work together,CBO 只是順便

目標 optimization_goal per funnel stage

Funnel stage Current setting Target setting Conversion event Notes
COLD-learning (< 50 ATC/wk) LANDING_PAGE_VIEWS OFFSITE_CONVERSIONS AddToCart LPV → ATC 切換,per ads-bidding-strategies decision tree
COLD-mature (≥ 50 ATC/wk) n/a OFFSITE_CONVERSIONS Purchase once 50+ ATC/wk stable, upgrade
COLD-very-mature (≥ 50 Purchase/wk) n/a OFFSITE_CONVERSIONS (VALUE) Purchase + ROAS Goal once 50+ Purchase/wk, upgrade to ROAS Goal bidding
WARM (smaller pool, hotter) OFFSITE_CONVERSIONS (Purchase) Keep (already correct) Purchase per current ABO warm setup
HOT-retargeting (ATC30 / IC30) n/a (沒建) OFFSITE_CONVERSIONS Purchase per 5/14 spec A1 lock
BUYER (cross-sell) n/a (沒建) OFFSITE_CONVERSIONS Purchase small CA but hot, can sustain

Migration schedule per funnel stage

Day 0-3:  Cold LPV → Cold ATC optimization
          (per adset, change optimization_goal + add ATC conversion event)
          Note: 觸發 learning phase reset 7-14 天,per M14;spec 5.5 接受 reset cost
Day 7-14: ATC adsets 累積 50+ ATC/wk 的 → upgrade to Purchase optimization
Day 14+:  Purchase adsets 累積 50+ Purchase/wk → upgrade to ROAS Goal bidding

Decision rules in daily_rebalancer.py

def determine_optimization_target(adset, weekly_atc, weekly_purchase):
    """Auto-upgrade conversion event signal as data accumulates."""
    if adset.funnel_stage in ("warm", "hot", "buyer"):
        return ("OFFSITE_CONVERSIONS", "purchase")  # always Purchase
    # COLD ladder:
    if weekly_purchase >= 50:
        return ("OFFSITE_CONVERSIONS", "purchase")  # mature
    if weekly_atc >= 50:
        return ("OFFSITE_CONVERSIONS", "add_to_cart")  # learning
    return ("LANDING_PAGE_VIEWS", None)  # cold start fallback

# Important: don't auto-change optimization_goal more than 1× per 14 days
# (changes trigger Learning Phase reset, M14)

Cross-reference with ads-meta framework

  • M02 CAPI active ✅(今天剛修好)
  • M07 Standard events → Purchase + AddToCart fired via CAPI bridge ✅
  • M04 EMQ ≥ 8.5 (Purchase):需要 EMQ 達門檻才能切 Purchase optimization → 24-48h 後評估
  • ads-bidding-strategies decision tree:< 15 conv/month → Maximize Clicks/LPV;15-50 → ATC;50+ → Purchase

6. Bidding Ladder per Funnel Stage

COLD (prospecting)
  Phase 1 — Learning (0-50 purchases/week):
    bid_strategy = COST_CAP
    cost_cap = AOV / 10  → floral/dentistry NT$800, 5-day NT$1500, vet-camp NT$2000

  Phase 2 — Stable (50+ purchases/week):
    bid_strategy = LOWEST_COST_WITH_BID_CAP (ROAS Goal)
    roas_target = 10.0

WARM (lead nurture, smaller pool)
  bid_strategy = LOWEST_COST_WITH_BID_CAP (ROAS Goal)
  roas_target = 10.0
  ⚠ if 7d pur < 5 → fallback COST_CAP @ AOV/8

HOT (retargeting, hottest pool)
  bid_strategy = LOWEST_COST_WITH_BID_CAP (ROAS Goal)
  roas_target = 15.0
  ⚠ retargeting benchmark 3.61x median × narrow CA ≈ 14-15x feasible

BUYER (cross-sell)
  bid_strategy = LOWEST_COST_WITH_BID_CAP (ROAS Goal)
  roas_target = 8.0
  ⚠ cross-sell 比 same-theme buy 難,現實 floor 較低

Per ads-budget decision tree(M12 + M-ST1):daily budget per adset 必須 ≥ 5× target CPA(CPA = AOV / ROAS target)。violation → P1 alert。


7. Test Framework — 3 Disciplined Experiments

用 Meta Ads Manager > Experiments tab(手動 budget split — 用 Experiments 自動 audience split + 95% confidence 計算)。

Experiment 1: COLD Manual Narrow vs Advantage+ Audience

Hypothesis

IF 切到 Advantage+ Audience THEN ROAS 會 降低 30-50% vs Manual Narrow
BECAUSE SEC niche audience (TW 6-12 歲家長 STEAM 興趣) 下 broad expansion 稀釋;
但 hedge:可能 +20% BECAUSE Andromeda 找到 manual interest stacks 抓不到的 high-intent buyers

Test cells
| Theme×City | Daily budget | Variant A (control) | Variant B (test) |
|—|—|—|—|
| dentistry × taipei | NT$1800 | Manual LAL 1-3pct + Cluster A | Advantage+ Audience |
| vet-rescue × taichung | NT$1500 | Manual LAL 1-3pct + Cluster A | Advantage+ Audience |
| space × zhubei | NT$1200 | Manual LAL 1-3pct + Cluster A | Advantage+ Audience |

Setup
– Meta Ads Manager > Experiments tab > Create A/B Test
– 50/50 audience split (Meta auto)
– Same creative pool (45 v2 banners)
– Same landing page
– Same bidding (Cost Cap @ AOV/10)
– Duration: 14 days
– Primary metric: 7-day click ROAS

Decision rule
– A+ Audience 取代 manual 只當 ROAS ≥ 0.9x control AND p < 0.05
– 否則永久保持 manual narrow,新 theme 也照 manual 路線

Experiment 2: HOT Funnel Sequence — Sequential vs Parallel

Hypothesis

IF 用 sequential exposure (cold-only first → unlock warm → unlock retargeting)
THEN blended theme CPA 降 30%
BECAUSE 教育類產品決策週期 2-4 週,serial exposure 比一次推 cold 高 3-5x 轉換 (per ads-plan info-products § Common Pitfalls)

Test cells
| Theme | Variant A: Parallel (default) | Variant B: Sequential |
|—|—|—|
| vet-rescue (3 cities) | 4 funnel stages 同時跑 | cold-only first,50 ATC 累積後才開 warm+hot |
| dentistry (3 cities) | 同 | 同 |
| space (3 cities) | 同 | 同 |

Setup
– Duration: 21 days
– Primary metric: theme blended CPA
– Audience split: 由 city 切(taipei = Parallel, taichung = Sequential — 然後對調 mid-test 避免 city bias)

Decision rule
– Sequential 贏 → 新 theme launch 一律 sequential 開
– Parallel 贏 → 維持現狀

Experiment 3: CBO vs ABO 二次驗證

5/14 wave 比較有 launch noise(CBO 只跑 1.5-2 天),用 mature campaigns + 充足 budget 重測。

Hypothesis

IF CBO 跑在 mature theme × NT$1500/day 預算 (per ads-budget「CBO works >$500/day」)
THEN ROAS 仍 < ABO
BECAUSE 27 theme×city 是不同產品,CBO 跨 adset budget reallocation 在 different audiences/themes 內幫助有限

Test cells
| Theme×City | Daily budget | Variant A | Variant B |
|—|—|—|—|
| dentistry × taipei | NT$1800 | ABO (current) | CBO |
| space × taichung | NT$1500 | ABO | CBO |

Setup
– Duration: 14 days
– Primary metric: 7-day click ROAS
– 比 5/14 lapsed CBO 高出 3-4x budget per campaign

Decision rule
– 確認 ABO 仍贏 → 25 theme×city 永久 ABO,vet-camp 中學班 CBO 保留
– CBO 贏 → 全面切 CBO(含 25 theme×city migration)


8. Equity Floor + Fill-Gap Monitor(永遠不偏頗任何 session)

核心 constraint:SEC 是辦活動的公司,「答應有人報名就保證開班」+「不能偏頗」。任何 theme/session 都不能被算法放棄。

8.1 Campaign-level floor

CAMPAIGN_BUDGET_FLOOR_PCT = 0.025  # 每個 27 campaign 至少 2.5% portfolio daily total
TOTAL_FLOOR = 27 × 0.025 = 0.675   # 67.5% baseline floor
PERFORMANCE_BUDGET = 0.325         # 32.5% dynamic reward 給高 ROAS adsets

ALLOWED_KILL_LEVEL = "adset"       # 絕對不在 campaign-level kill

如果某 theme×city 內全部 adset ROAS < archive threshold → 保留 1 個 BROAD placeholder adset 活著(NT$50/day minimum),同步 escalate diagnostic(landing page / creative / audience root cause)。

8.2 Session-level fill-gap tracking

新 script:scripts/meta_ads/ops/fill_gap_monitor.py

# 每日 cron 從 WordPress 拉實際報名數
def get_session_enrollment(theme, city, session_date):
    # Box Office order_item meta → wp_postmeta
    return enrollment_count

# 計算 fill gap per session
SESSIONS = load_sessions()  # from content/operations/2026-summer-*.json
for s in SESSIONS:
    days_to_start = (s.start_date - today).days
    enrolled = get_session_enrollment(s.theme, s.city, s.start_date)
    target = 8  # minimum viable per 1:7 照顧比
    gap = target - enrolled
    s.mode = "FILLING" if days_to_start <= 30 and enrolled < target else "SCALING"

8.3 Mode A/B switching per campaign

def determine_campaign_mode(theme, city):
    sessions = get_sessions(theme, city)
    urgent = [s for s in sessions if s.mode == "FILLING"]
    return "FILLING" if urgent else "SCALING"

# In daily_rebalancer.py
def apply_mode(campaign, mode):
    if mode == "FILLING":
        # Override bidding: Lowest Cost (volume), wider audience
        # Disable A+ Audience experimental slot (force ROAS check pause)
        campaign.bid_strategy = "LOWEST_COST_WITHOUT_CAP"
        campaign.daily_budget *= 1.5   # boost to fill
    else:  # SCALING
        # Restore: Cost Cap → ROAS Goal ladder per § 5
        ...

9. Automation Upgrades

9.1 Rewire scripts/meta_ads/ops/daily_rebalancer.py

從 CPA-target 改 funnel-stage-aware ROAS-target

# Replace CPL_TARGET_TWD = 200 with:
ROAS_TARGET_BY_STAGE = {
    "cold":   {"target": 10.0, "archive": 3.0, "boost": 15.0, "boost_pct": 0.20},
    "warm":   {"target": 10.0, "archive": 5.0, "boost": 18.0, "boost_pct": 0.20},
    "hot":    {"target": 15.0, "archive": 6.0, "boost": 25.0, "boost_pct": 0.20},
    "buyer":  {"target":  8.0, "archive": 3.0, "boost": 12.0, "boost_pct": 0.20},
}

# Replace add_to_cart conversion metric with purchase + value
def _extract_roas(insights):
    spend = float(insights.get('spend') or 0)
    value = sum(
        float(a.get('value', 0))
        for a in insights.get('action_values', [])
        if a.get('action_type') in ('purchase', 'offsite_conversion.fb_pixel_purchase')
    )
    return value / spend if spend > 0 else 0

# Don't touch active experiment adsets (Meta auto-determines winner)
def should_skip(adset):
    return adset.is_in_experiment

# Per `ads-budget` 20% scaling rule
DAILY_BUDGET_DELTA_CAP = 0.20  # was 0.50 (too aggressive)

# Per ads-budget kill rule + safety
NO_CONV_SPEND_FLOOR = 3 * 200  # was 600 — keep but compute against AOV/ROAS target

9.2 New script scripts/meta_ads/ops/experiment_monitor.py

每 6h cron:
– 拉 active Meta Experiments status (via /<exp_id> endpoint)
– Variant ROAS > control × 1.3 → Discord「早期 winner」
– Variant ROAS < control × 0.5 → Discord「早期 loser,建議手動 kill 變體」
– 達 14d/21d 期限 inconclusive (p > 0.10) → P1 alert 建議 abort 或 extend

9.3 Upgrade scripts/meta_ads/ops/_alerts.py

新增 5 個 P0/P1 alert threshold:

P0_ALERTS = [
    # CAPI health
    {"name": "atc_funnel_broken",
     "condition": lambda m: m["click_to_atc_pct"] < 2.0,
     "window": "7d",
     "action": "Discord + email"},

    {"name": "capi_http_error",
     "condition": lambda m: m["capi_http_200_rate"] < 0.95,
     "window": "1d",
     "action": "Discord"},

    {"name": "dedup_anomaly",
     "condition": lambda m: m["atc_to_pur_ratio"] > 1.5 or m["atc_to_pur_ratio"] < 0.15,
     "window": "7d",
     "action": "Discord + email"},

    # ROAS health (new)
    {"name": "blended_roas_drop",
     "condition": lambda m: m["blended_roas_7d"] < 8.0,
     "window": "7d",
     "action": "Discord P1"},

    {"name": "theme_break_even_breach",
     "condition": lambda m: any(t["roas_7d"] < 1.67 for t in m["per_theme"]),
     "window": "3d",
     "action": "Discord P0 diagnostic"},

    # Fill-gap (new)
    {"name": "session_at_risk_T-14",
     "condition": lambda m: any(s["days_to_start"] == 14 and s["enrollment"] < s["target"] * 0.3 for s in m["sessions"]),
     "action": "Discord warning + suggested rescue"},

    {"name": "session_at_risk_T-7",
     "condition": lambda m: any(s["days_to_start"] == 7 and s["enrollment"] < s["target"] * 0.5 for s in m["sessions"]),
     "action": "Discord critical + email + suggested rescue tactics"},

    # Experiment health (new)
    {"name": "experiment_inconclusive_14d",
     "condition": lambda e: e["age_days"] >= 14 and e["p_value"] > 0.10,
     "action": "Discord P1 — suggest extend 7d or abort"},
]

9.4 Daily Discord snapshot upgrade(daily_report.py

SEC Meta Ads Daily  2026-MM-DD
─────────────────────────────────
Portfolio 7d ROAS: 15.2x  (vs target 10.0)
Portfolio 7d spend: NT$78,432

27 theme×city grid:
                  taipei          taichung       zhubei
─────────────────┼────────────────┼───────────────┼──────────────
vet-rescue        Mode B · 18x   Mode A · 24x   Mode A · 28x
architect         Mode B · 12x    Mode A · 6x   Mode B · 15x
dino              Mode A · 3x 🔴  Mode A · 4x   Mode A · 0x 🔴  root cause
space             Mode B · 22x    Mode B · 28x   Mode B · 31x 
insect            Mode A · 5x    Mode A · 6x   Mode A · 7x
speed             Mode A · 4x    Mode A · 8x    Mode A · 12x
floral            Mode A · 6x    Mode A · 9x    Mode A · 14x
dentistry         Mode B · 45x   Mode B · 38x   Mode B · 52x 
vet-camp 中學     Mode B · 18x    Mode B · 24x   Mode B · 16x

Session fill status (T-30 days):
  vet-rescue × taipei 7/14: 12/8  filled
  vet-rescue × taipei 7/21: 5/8  filling
  ...

Active experiments:
  Exp1 (A+ vs Manual): Day 5/14, control 24x / variant 8x, p=0.04  variant losing fast
  Exp2 (Sequence): Day 12/21, control 9x / variant 11x, p=0.18  inconclusive
  Exp3 (CBO vs ABO retest): Day 8/14, control 22x / variant 7x, p=0.02  ABO confirmed

Today's autonomous actions:
   Archived 3 adsets: ROAS < 3 × 3 days (dino  cold-cluster-a, etc.)
   Boosted 5 adsets +20%: ROAS > 15 (dentistry × 3 cities cold + hot)
   Mode switch: vet-camp × zhubei 8/4 session filled  Scaling
   Manual review needed: insect × taipei 7d ROAS 5x persistent

10. Implementation Phases

Phase 內容 時數
10.1 Archive 22 個 CBO duplicates(保留 vet-camp 中學班 CBO + 25 ABO) 1 hr
10.2 Bind 45 v2 banner 全 9 主題 27 campaign 的全部 adsets(per Andromeda) 2 hr
10.3 每個 ABO campaign 內 build 6 個 funnel-stage adset(cold ×3 / warm / hot ×2) 4-6 hr
10.4 Build new SEC2026・cross-sell・BUYERS CBO campaign + 5 個 BUYER adsets 2 hr
10.5 Rewrite daily_rebalancer.py 為 funnel-stage + ROAS-target driven 3 hr
10.6 Build fill_gap_monitor.py(從 WP Box Office 拉 enrollment) 3 hr
10.7 Build experiment_monitor.py(每 6h cron) 2 hr
10.8 Upgrade _alerts.py 加 7 個 alert thresholds 2 hr
10.9 Upgrade daily_report.py 出新 27-grid + experiment + fill-gap snapshot 3 hr
10.10 設 3 個 Meta Experiments(A+ Audience / Sequence / CBO retest) 1 hr
10.11 Bidding strategy migration: 各 adset 從 LOWEST_COST → COST_CAP/ROAS Goal 2 hr
10.12 14-day observation period — daily rebalancer + experiment monitor 自動跑
10.13 Day 14: Experiment 1 (A+) + Experiment 3 (CBO retest) 結束,apply winners 1 hr
10.14 Day 21: Experiment 2 (Sequence) 結束,apply winner 1 hr
10.15 Lock final architecture,write 2026-06-06 retrospective 2 hr

Total:~30 hr 工程 + 21 天 observation/experiment 跑完。


11. Success Metrics & Decision Gates

11.1 Day 7 gate(restructure 完 + experiments 開始)

Metric Threshold Action if NOT met
Portfolio 7d blended ROAS ≥ 10 Reverse 任一 archive decision,retest
27 campaigns all active yes Restore archived theme×city(per equity floor)
Active adsets count 150-200 Check 是否有 inadvertent over-pruning
45 v2 banners bound 100% Force-bind missing
Experiments running 3/3 Re-launch failed experiment setup

11.2 Day 14 gate(Exp 1 + 3 結束)

Metric Threshold Action
A+ Audience ROAS vs Manual control < 0.9x (expected) Kill experimental slot,永久 manual
A+ Audience ROAS vs Manual control ≥ 1.0x 漸進 migrate 10% → 30% → 50% 接下 30 天
CBO vs ABO 二次驗證 ABO 仍 ≥ 1.5x CBO ROAS Lock 25 theme ABO(vet-camp 中學班 keep CBO)
CBO vs ABO 二次驗證 CBO ≥ 1.0x ABO ROAS Pause spec,重新規劃全面 CBO migration
Portfolio ROAS trend (Day 7 → 14) Stable or rising Continue
Portfolio ROAS trend Falling > 20% Diagnostic:哪個 funnel stage 拖累

11.3 Day 21 gate(Exp 2 結束 + first month wrap)

Metric Threshold Action
Sequential vs Parallel Sequential ≥ 1.2x ROAS Lock 新 theme launch SOP = sequential
Sequential vs Parallel Tie or Parallel wins Lock parallel
Portfolio 21d ROAS ≥ 12(above target 10) 進入 maintenance mode
Portfolio 21d ROAS 8-10 Continue + 找 ROAS leak
Portfolio 21d ROAS < 8 P0 review — 找系統性破洞
Session fill rates All sessions ≥ 50% target by T-7 Continue
Session fill rates Any session < 50% T-7 Human-intervened rescue(折扣 / 跨通路 / refund 預備)

12. 風險與防護

風險 1: Archive 22 個 CBO duplicates → 失去 vet-camp 中學班 CBO 以外的「冗餘 redundant 觸達」

緩解:archive 是 reversible (Meta 可 unarchive within 90 days)。Phase 10.1 後密切觀察 24h,若 portfolio ROAS 立刻掉超過 15% → revert。

風險 2: Funnel stage adset restructure 觸發 Learning Phase reset

緩解:per ads-meta M14,避免 reset 規則是「不在 learning 時 edit」。9.2-9.4 改動會 reset,但這是必要的 reset——既有 27 變體 creative + 5/10 setup 都還在 learning limited 狀態。new structure 重新進 7-14 天 learning,14 天後 stable,比 stuck-in-learning forever 好。

風險 3: A+ Audience experimental slot 把整個 theme ROAS 拖下來

緩解:每個 theme 只 10% budget 走 A+,且14 天 hard kill if ROAS < 0.5x control。最壞情況:portfolio 整體 ROAS 受影響 < 5%。

風險 4: 報名 fill-gap monitor 拉不到 WordPress Box Office data

緩解:Phase 10.6 上線前 dry-run 測試。若 WP API 不行,fallback 用 WC REST API + Box Office filter。

風險 5: Meta Experiments 設定錯(audience split 不乾淨)

緩解:用 Meta 內建 Experiments tab(不手動 budget split)。Audience exclusion 由 Meta 自動處理。

風險 6: 27 個 ABO campaign × 6 adsets × NT$300 daily = NT$48K/day baseline,加 buyer 跟 boost 後輕鬆破 NT$80K/day

緩解:daily spend ceiling alert @ NT$80K/day(P1);NT$100K/day(P0 auto-cap)。確認 Meta 帳號月限額 ≥ NT$3M(per current account capacity unclear → user 需 verify with Meta 客服)。

風險 7: ROAS Goal bidding 需要 50+ purchases/week per adset,多數 adset 不夠

緩解:Cold 用 Cost Cap fallback(ads-budget 認可路徑)。Warm/Hot 用 portfolio-level ROAS goal(將 6 adsets 視為一個學習單元)。實在不夠 signal 的 adset → 降回 LOWEST_COST 餵 data 7 天。


13. 開放議題

  1. vet-camp 中學班 CBO 例外是否擴大到其他高 AOV theme? 目前只 keep 中學班 CBO(AOV NT$20K)。dentistry (AOV NT$8K) 和 vet-rescue (AOV NT$15K) 是否也試 CBO?建議:先 lock spec,等 Experiment 3 二次驗證結果再決定。

  2. Meta 帳號月限額:current daily spend ceiling 是 NT$80K,但帳號 monthly threshold 不清楚。需 user 跟 Meta 客服確認 NT$3M/月限額 / 是否需要 raise credit limit。

  3. Cross-sell BUYER campaign 的 audience size:SEC current buyer pool 5,500(master_buyers)+ 11K email CA。Cross-theme exclude 後預估每 cell 1K-3K 人。可能太小達不到 ROAS Goal 50+pur/wk → 需 fallback bidding。

  4. A+ Audience 14d 後若贏,migrate 速度:是否 day-15 全切 100% 還是漸進 10% → 30% → 50% over 30 days?建議漸進,避免單次切完才發現 hidden risk。

  5. Equity floor 是否會被 Meta 演算法吞:例如 dino 連 30 天 ROAS 0.5x,daily_rebalancer 該不該守 2.5% floor?建議:守,但 floor budget 同時 escalate 到 human review(landing page fix / new audience test / new creative concept),不能單靠廣告層救。

  6. Phase 9.2 (45 banner bind) 應在 9.1 (archive CBO) 之前還是之後:先 bind 再 archive 較安全(避免 archive 後立刻沒能用的 creative)。Spec 9.1-9.4 可重排為 9.2 (bind) → 9.1 (archive) → 9.3-9.4。

  7. 5/14 spec roadmap 53 items 怎麼處理:本 spec 取代部分(A1/A2 retargeting → § 2、C1 A+ Sales → § 5、C3 consolidation → § 2)。建議 5/14 roadmap mark superseded by 此 spec,剩下 unfinished items(B2 Threads / B3 dayparting / B4 DPA / C5 UGC / C6 English / C7 WhatsApp / D1-D4 monitoring)獨立追蹤。


14. 引用 framework refs

per ads* skill content 讀過 + 引用:

來源 應用於
ads/SKILL.md Quality Gates 3x Kill Rule, Andromeda diversity, Privacy infrastructure
ads-meta M01-M50 markers EMQ targets, Frequency thresholds, Campaign count Jon Loomer best practice
ads-budget 70/20/10 + 20% scaling rule Budget allocation per funnel, scaling cap
ads-budget 3x Kill Rule ROAS archive threshold logic
ads-test IF/THEN/BECAUSE + 95% confidence 3 Experiments framework
ads-math Break-Even formula NT$8,200 break-even CPA = headroom 證明
ads-plan info-products template 4-stage funnel + budget split 50-70% cold / 20-35% retargeting / 10-15% buyer
ads/scoring-system severity multipliers Critical 5x / High 3x / Medium 1.5x — alert priority logic
ads/references/benchmarks Meta median ROAS 2.19 / Advantage+ 4.52 Per-funnel target validation
ads/references/conversion-tracking EMQ tier Purchase ≥8.5, ATC ≥6.5, PageView ≥5.5
ads/references/bidding-strategies Meta decision tree Cost Cap → ROAS Goal ladder
ads/references/compliance Taiwan + Meta policy TAIWAN_UNIVERSAL declaration
ads/references/platform-specs Meta creative specs 1080×1080 safe zone for 45 banners

Memory refs(既有 lock):
feedback_ad_automation_no_human_pick — 不手挑贏家,全 programmatic
feedback_ad_signoff_full_state_picker — banner 簽收必含 locked copy
feedback_ad_real_kid_photo_faceswap — 真實學員照進廣告前必 face-swap
feedback_pencil_handson_portrait_1to2 — banner 規格
feedback_meta_launch_crawler_overload — 上廣告前 fb crawler mu-plugin 預防(已部署)
feedback_vet_rescue_vs_vet_camp_distinct_products — 兩產品文案不可混用
project_capi_atc_bridge_fix_2026-05-16 — CAPI 已修,em/ph 流入 EMQ recovering
project_v2_pencil_banners_45_complete — 45 v2 banner all signed off
reference_wc_store_api_cart_item_data — Store API bridge 規則
reference_cloudways_ssh — server-side deploy 流程