【QA v3 demo】Ad Architecture Spec v4 (direct optimization + broad CBO)

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 user direction 2026-05-16 v3,重定)

核心 principle:CBO/ABO 沒定論(5/14 wave 是 confounded test)→ MOFU/BOFU/Retention 全 CBO 廣撒;TOFU 保留 ABO 因為 4-audience-variant test 需要預算對等控制;Skip optimization ladder — ATC/Purchase 訊號量現在已足夠,TOFU 直接 ATC optimization,MOFU/BOFU/Retention 直接 Purchase。

Campaign 拆分為 4 條獨立軌道(per funnel stage 各自 campaign,因為 different optimization_goal 不能塞同個 CBO 內):

9 主題 × 3 城市 = 27 theme×city × 3 funnel stages = 81 prospect campaigns
+ 1 Retention CBOcross-sell to past buyers
= 82 active campaigns

TOFU campaigns (27): ABO, 4 audience variant adsets each
MOFU campaigns (27): CBO, 3 CA adsets each
BOFU campaigns (27): CBO, 2 CA adsets each
Retention campaign (1): CBO, 5 cross-sell adsets

Archive: 22 個原有 CBO duplicates不符新架構全砍重做

Campaign 命名規範

SEC2026・<theme>・<city>・TOFU  (ABO)
SEC2026・<theme>・<city>・MOFU  (CBO)
SEC2026・<theme>・<city>・BOFU  (CBO)
SEC2026・retention・BUYERS-cross-sell  (CBO, single campaign)

Adset 結構 per campaign

TOFU campaign(ABO,4-audience variant 並跑)

SEC2026・<theme>・<city>・TOFU (ABO)
├ TOFU-A・Adv+ Audience pure      (advantage_audience:1, no seed, 25% campaign budget)
├ TOFU-B・Manual LAL 1-3pct       (purchaser/email LAL seed, advantage_audience:0, 25%)
├ TOFU-C・Manual Custom Interests (STEM教育/parents_6_8/Montessori 等 stack, 25%)
└ TOFU-D・Mix (LAL seed + Adv+)   (LAL seed + advantage_audience:1 expansion, 25%)

optimization_goal: OFFSITE_CONVERSIONS (AddToCart) — 直接 ATC,不用 PageView 起跑
bid_strategy: COST_CAP @ AOV/8 → ROAS Goal 10 after 50+ Purchase/wk per adset

理由:ATC volume sufficient(CAPI 修好後每日 ATC events 預期 30-80),TOFU 4 變體共享同 optimization 才能公平比較。

MOFU campaign(CBO,3 Manual CA adsets)

SEC2026・<theme>・<city>・MOFU (CBO)
├ MOFU-VV75-7d   (video viewers ≥75% last 7d, CA)
├ MOFU-VC30      (ViewContent last 30d exclude ATC, CA)
└ MOFU-LeadMag   (lead magnet / email subscribers if exists, CA)

CBO budget distributes across 3 adsets (Meta auto-balances)
optimization_goal: OFFSITE_CONVERSIONS (Purchase) — CA 已 pre-qualified 可直接 Purchase
bid_strategy: ROAS Goal 12

BOFU campaign(CBO,2 Manual CA adsets)

SEC2026・<theme>・<city>・BOFU (CBO)
├ BOFU-ATC30-ex-buyers   (ATC last 30d exclude purchasers, CA)
└ BOFU-IC30-ex-buyers    (IC last 30d exclude purchasers, CA)

optimization_goal: OFFSITE_CONVERSIONS (Purchase)
bid_strategy: ROAS Goal 15

Retention campaign(CBO,5 cross-sell adsets)

SEC2026・retention・BUYERS-cross-sell (CBO, single campaign for entire portfolio)
├ RET-dentistry-to-vet      (dentistry buyers, exclude vet purchasers)
├ RET-floral-to-dentistry   (floral buyers, exclude dentistry purchasers)
├ RET-vet-to-vet-camp       (vet-rescue buyers, exclude vet-camp purchasers)
├ RET-architect-to-dino     (architect buyers, exclude dino purchasers)
└ RET-broad-multi           (any buyer, multi-theme combo creative)

optimization_goal: OFFSITE_CONVERSIONS (Purchase)
bid_strategy: ROAS Goal 8

Portfolio Budget split
– TOFU(27 campaigns × ABO):50% of daily total — 新客 discovery 最高優先
– MOFU(27 campaigns × CBO):25%
– BOFU(27 campaigns × CBO):15%
– Retention(1 campaign × CBO):10%

Total adsets: 108 TOFU + 81 MOFU + 54 BOFU + 5 Retention = 248 adsets

理由:per ads-plan info-products template + SEC 「pool 不能枯竭」 constraint → 推到 50% TOFU。每 funnel stage 獨立 campaign 才能 CBO 各自最佳化(CBO 在同 campaign 內混 optimization_goal 會失效)。


3. 4-Dimension Decision Matrix(已知 lock + 未定論測試)

                  TOFU (50%) 新客 discovery       MOFU (25%) warm engaged       BOFU (15%) cart abandon      Retention (10%) cross-sell
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Budget Mode       ABO default                    ABO                           ABO                          CBOcross-product 跨主題)
                  CBO  Exp 2 retest            (inherit from campaign)       (inherit from campaign)       一個 campaign  buyers
                   沒定論                                                                                
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Audience          4 變體並跑(discovery!)      Manual CA only              Manual CA only             Manual CA (buyers)
                   Adv+ Audience pure           - VV75-7d (video 75%)          - ATC30 exclude buyers       - cross-theme combos
                   Manual LAL 1-3pct            - VC30 exclude ATC             - IC30 exclude buyers        - 5 cross-sell adsets
                   Manual Custom Interests      - LeadMag (if exists)          N/A Adv+ (CA is exact pool)  N/A Adv+
                   Mix (LAL seed + Adv+)        N/A Adv+ (CA is exact pool)                               
                   跨變體探索新客 pool                                                                    
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Optimization      PageView (volume first)        AddToCart                     Purchase                     Purchase
goal               AddToCart after 50/wk         Purchase after 50/wk        (already tight intent)       (buyers known to convert)
                   Purchase after 50/wk                                                                  
                   Volume-first feed Meta        Mid-intent signal             High-intent signal          Pure conversion play
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Bidding           Lowest Cost (no cap初期)       Cost Cap @ AOV/8               ROAS Goal 15                 ROAS Goal 8
                   Cost Cap @AOV/10 後段         ROAS Goal 12 after stable   (retargeting natural high)  (cross-sell harder)
                  per ads-bidding decision tree                                                           
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Creative angle    「故事 / 驚奇 / 識讀」hooks    hands-on / social proof   authority / urgency / 折抵」│  「跨主題 combo
                  emotion + data v2 banners      hands-on + social-proof v2   authority + 新做 urgency     新做 cross-theme creative
                  - 對冷流量說「為什麼有趣」     -  warm 說「為什麼適合你」│  -  cart 說「再不買就...   -  buyer 說「順便也買...
                  per § 6 Creative Routing                                                                
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Mode A/B          per session fill status        N/A                           N/A                          N/A
switching         < 8 enrollment + T-30                                                                  
                  Filling (Lowest Cost + 預算+)                                                            

Locked decisions(明確證據)
1. Manual Narrow > Manual Broad(last 3d ROAS Cluster 31.48x / LAL 24.35x vs Broad 7.73x)— 較乾淨對比,但 narrow flavor 內部 LAL vs Custom vs Mix 還未測 → TOFU 4 變體並跑
2. vet-camp 中學班 CBO + A+ Audience ROAS 81x(高 AOV 單一主題例外)→ keep CBO 但 Exp 2 內部 retest 對比 ABO 版本

Unknown — 要 disciplined test 才知(per § 7)
3. CBO vs ABO 真實對比(5/14 wave 是 confounded — 同時換了 budget mode + audience + funnel structure)
4. TOFU 4 audience flavor 哪個贏(Adv+ pure / Manual LAL / Manual Custom / Mix)
5. Optimization goal ladder timing(什麼時候從 PageView → ATC → Purchase 升級)
6. Funnel Sequential vs Parallel — 等 retargeting 建好後測


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 總預算)

TOFU 50%(4 audience flavor 並排)
– TOFU-A・Adv+ Audience pure: 10%
– TOFU-B・Manual LAL 1-3pct: 12%
– TOFU-C・Manual Custom Interests: 12%
– TOFU-D・Mix (LAL + Adv+): 16%

MOFU 25%(Manual CA only)
– MOFU-VV75-7d: 12%
– MOFU-VC30: 12%
– MOFU-LeadMag (if exists): 1%(reserve)

BOFU 15%(Manual CA, cart abandoners)
– BOFU-ATC30-ex-buyers: 9%
– BOFU-IC30-ex-buyers: 6%

Retention 10%(separate CBO cross-sell campaign,分攤到 5 cross-sell adsets each 2%)


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(v3 — skip ladder, direct optimization)

User direction:「ATC Purchase 已經夠大量的不用再等,直接跑」。Skip PageView learning phase + skip ATC-to-Purchase ladder。直接設目標訊號。

Funnel stage Current setting Target setting Conversion event Rationale
TOFU (4 audience variants) LANDING_PAGE_VIEWS OFFSITE_CONVERSIONS AddToCart ATC volume 已足(CAPI 修好後 30-80/day),不需要 PageView 起跑;ATC 比 Purchase 訊號 5-10x 多,TOFU 4 變體共享 ATC 可獲足夠 signal
MOFU (CA only) OFFSITE_CONVERSIONS (Purchase) Keep / OFFSITE_CONVERSIONS Purchase CA pre-qualified,可直接吃 Purchase 訊號
BOFU (cart abandoners CA) n/a (沒建) OFFSITE_CONVERSIONS Purchase 高 intent CA,Purchase 訊號
Retention (buyers CA) n/a (沒建) OFFSITE_CONVERSIONS Purchase buyers CA,已知 convertible

Migration

Day 0-3:  全部 adsets 從 LANDING_PAGE_VIEWS / 既有 setting → 切到對應 stage 的目標
          TOFU adsets → AddToCart optimization
          MOFU/BOFU/Retention adsets → Purchase optimization
          Note: 觸發 learning phase reset 7-14 天,per M14;接受 reset cost
Day 7+:   Learning Phase 出口後 stable — 不再升級 ladder
          (除非 daily_rebalancer 偵測 50+ Purchase/wk per TOFU adset → 才考慮升)

Decision rules in daily_rebalancer.py

def determine_optimization_target(adset):
    """Direct optimization per funnel stage. No ladder."""
    stage = adset.funnel_stage
    if stage == "tofu":
        return ("OFFSITE_CONVERSIONS", "add_to_cart")
    elif stage in ("mofu", "bofu", "retention"):
        return ("OFFSITE_CONVERSIONS", "purchase")
    return None  # fallback unknown stage

# Optional future upgrade rule (after 30d if stable):
def consider_purchase_upgrade(adset, weekly_purchase):
    """Only TOFU has upgrade path; MOFU/BOFU/Retention already at Purchase."""
    if adset.funnel_stage == "tofu" and weekly_purchase >= 50:
        return ("OFFSITE_CONVERSIONS", "purchase")  # upgrade signal
    return None  # keep current

# Important: don't auto-change optimization_goal more than 1× per 14 days (M14)

Cross-reference with ads-meta framework

  • M02 CAPI active ✅(5/16 修好)
  • M07 Standard events → Purchase + AddToCart fired via CAPI bridge ✅
  • M04 EMQ ≥ 8.5 (Purchase):24-48h 後預期回升至 7.5-8.5+,足以 sustain Purchase optimization
  • ads-bidding-strategies decision tree:原本 < 15 conv/month → LPV,但 SEC 整體 Purchase ~50/wk 且 ATC ~150/wk 已 sufficient,直接跳到 conversion-based optimization 是正確 call

6. Bidding Strategy per Funnel Stage(v3 — direct, no ladder)

User direction:「ATC Purchase 訊號夠了,直接跑,不用 ladder」。每個 stage 一次到位設目標 bid strategy。

TOFU (ABO, 4 audience variants)
  optimization_goal = OFFSITE_CONVERSIONS (AddToCart)
  bid_strategy      = COST_CAP
  cost_cap          = AOV / 8  (floral NT$1000, 5-day NT$1875, vet-camp NT$2500)
  rationale         = ATC sufficient signal; cap 控制 CPA 上限,後段 stable 可考慮升 ROAS Goal

MOFU (CBO, 3 Manual CA adsets)
  optimization_goal = OFFSITE_CONVERSIONS (Purchase)
  bid_strategy      = ROAS Goal
  roas_target       = 12.0
  rationale         = CA pre-qualified, Purchase 訊號可直接拿;warm pool ROAS 自然較 cold  20%

BOFU (CBO, 2 Manual CA adsets, cart abandoners)
  optimization_goal = OFFSITE_CONVERSIONS (Purchase)
  bid_strategy      = ROAS Goal
  roas_target       = 15.0
  rationale         =  intent CA × narrow exclude-buyersretargeting benchmark 3.61x × niche  14-15x feasible

Retention (CBO, single cross-sell campaign, 5 adsets)
  optimization_goal = OFFSITE_CONVERSIONS (Purchase)
  bid_strategy      = ROAS Goal
  roas_target       = 8.0
  rationale         = cross-sell  same-theme 難(不同主題 buyer  必要轉換),realistic floor 較低

Bid sufficiency rule(per ads-budget M-ST1):daily budget per adset 必須 ≥ 5× target CPA。
– TOFU dentistry × Cost Cap NT$1000 → 需 NT$5000/day per adset → TOFU campaign NT$5000 × 4 = NT$20K/day per dentistry-taipei TOFU campaign
– MOFU dentistry × ROAS Goal 12 → CPA NT$667 → 需 NT$3,333/day per adset → MOFU CBO NT$10K/day
– 帳號月限額需確認 ≥ NT$5M/month 才撐得起 ROAS 10 + 50% TOFU 配置

如果預算不足以滿足 5× CPA per adset → 降低 adset 數(譬如 TOFU 只 2 個 variant),不要每個都餵不飽。violation → P1 alert in _alerts.py


7. Test Framework — 3 Disciplined Experiments

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

Experiment 1: TOFU 4-Audience Variant Test(最重要)

Hypothesis

IF TOFU 跑 4 種 audience flavor 並排(Adv+ pure / Manual LAL / Manual Custom / Mix LAL+Adv+)
THEN 至少 2 個 variant 達 ROAS ≥ 5x baseline,提供持續新客 pool
BECAUSE SEC niche 但 pool 必須持續刷新;Adv+ 可能找到 manual 抓不到的 high-intent;mix 兼具兩者優點

Setup(這是 § 2 spec 本身的常態 architecture,不是 Meta Experiments tab — 而是 4 個 sibling adsets 在同 campaign 內並跑,用 daily_rebalancer 比較):
– 每 theme×city campaign 內 4 個 TOFU adsets:TOFU-A/B/C/D
– 同 optimization_goal(PageView → ATC ladder)
– 同 creative pool(emotion + data 5 v2 banners)
– 同 budget(10-16%/adset per § 2)
– Duration: 持續監測,每 7 天滾動 ROAS 比較

Decision rule(per audience variant)
– 7d ROAS ≥ 15 → +20% budget per 3-5d
– 7d ROAS 5-15 → hold + 換 creative
– 7d ROAS < 3 連 7 天 → archive 該 variant,重新 launch 另一種 audience seed(譬如換 LAL 來源)
不會 4 個都砍 — 至少保留 2 個活著確保 pool diversity

Experiment 2: TOFU ABO vs CBO(4-variant 內測 budget mode)

MOFU/BOFU/Retention 已 default CBO(廣撒),這個 experiment 只測 TOFU 的 budget mode。

Hypothesis

IF TOFU 切到 CBO(4 audience variants 同 campaign 共享預算)
THEN Meta 把 budget 自動傾倒到「最好的 audience variant」上 → 失去 4-variant 探索功能
BECAUSE CBO 算法會 starve 表現差的 variant 給好的,破壞 audience diversity(pool 探索);ABO 保持 4 variants 都活著

Test cells(控制其他變數)
| Theme×City | Daily budget | Variant A: TOFU ABO | Variant B: TOFU CBO |
|—|—|—|—|
| dentistry × taipei | NT$5000 | TOFU-A/B/C/D 各 NT$1250 強制等分 | TOFU-A/B/C/D in CBO 共享 NT$5000 |
| space × taichung | NT$5000 | 同 | 同 |
| vet-rescue × zhubei | NT$5000 | 同 | 同 |

Setup
– Meta Ads Manager > Experiments tab > Create A/B Test
– Duration: 14 days
– Primary metric: (a) blended ROAS, (b) audience variant survival rate(4 個 variants 跑完後幾個還 active)
– 三組 theme×city 都對打

Decision rule
– CBO ROAS ≥ ABO 且仍保 ≥ 3 variants active → 切 CBO(接受 Meta 篩選贏家)
– CBO ROAS ≥ ABO 但 ≤ 2 variants alive → keep ABO(pool diversity 重要於短期 ROAS)
– CBO < ABO → keep ABO(current default)

Experiment 3: Funnel Sequential vs Parallel

Hypothesis

IF 新 theme launch 用 sequential exposure(TOFU only first → 50 ATC 累積後 unlock MOFU → 50 IC 後 unlock BOFU)
THEN blended theme CPA 降 30%
BECAUSE 教育類產品決策週期 2-4 週,serial exposure 比一次推全 funnel 高 3-5x 轉換(per ads-plan info-products § Common Pitfalls)

Test cells
| Theme | Variant A: Parallel (default) | Variant B: Sequential |
|—|—|—|
| vet-rescue (3 cities) | TOFU + MOFU + BOFU 同時 active | TOFU only → 50 ATC → unlock MOFU → 50 IC → unlock BOFU |
| dentistry (3 cities) | 同 | 同 |
| space (3 cities) | 同 | 同 |

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

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


7.5 Creative Routing per Funnel Stage(新增)

不同 funnel stage 對應不同 audience temperature,需要不同 creative 語氣。

Stage Audience temperature Creative angle v2 banner concepts to use New creative needed?
TOFU 冷流量、不認識 SEC、可能只搜過「夏令營」 故事性、驚奇感、學科識讀 emotion + data(5 v2 banners per theme) ✗ 既有夠用
MOFU 看過 SEC 但沒 ATC 深度教學、社會證明 hands-on + social-proof(既有 v2) ✗ 既有夠用
BOFU 加過 cart 但沒結帳 急迫感、權威、折抵提醒 authority(既有 v2)+ urgency/discount(新做) ✓ 需做 1-2 張 urgency / 折抵
Retention 已買過某主題 跨主題 combo、互補性 cross-theme combo(新做) ✓ 需做 5 張 cross-sell

Implementation
– TOFU adsets bind emotion + data v2 banners only(5 張 per theme)
– MOFU adsets bind hands-on + social-proof v2 banners only(10 張 per theme,2 concept)
– BOFU adsets bind authority v2 banners + 新做 urgency creative(per theme 2 張新)
– Retention adsets bind 新做 cross-theme combo creatives(5 張 cross-sell adsets each 1 張)

新 creative production budget(後續 spec 接續,這份 spec lock 不做但標出 dependency):
– BOFU urgency creative:9 主題 × 2 = 18 張
– Retention cross-sell:5 cross-sell combos × 1 張 = 5 張
– 共 23 張新 creative 需要在 Day 7 之前做完(per § 10 phasing)


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 = {
    "tofu":      {"target": 10.0, "archive": 3.0, "boost": 15.0, "boost_pct": 0.20},
    "mofu":      {"target": 12.0, "archive": 5.0, "boost": 18.0, "boost_pct": 0.20},
    "bofu":      {"target": 15.0, "archive": 6.0, "boost": 25.0, "boost_pct": 0.20},
    "retention": {"target":  8.0, "archive": 3.0, "boost": 12.0, "boost_pct": 0.20},
}

# TOFU sub-variant differentiation (4 audience flavors compete within TOFU)
TOFU_VARIANT_ARCHIVE_RULE = {
    # Don't archive ALL 4 variants — keep at least 2 alive for pool diversity
    "min_active_variants_per_campaign": 2,
    "archive_if_roas_under": 3.0,
    "for_consecutive_days": 7,
}

# 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 2 (TOFU ABO vs CBO) 結束,apply winner 1 hr
10.14 Day 21: Experiment 3 (Funnel Sequential vs Parallel) 結束,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. TOFU ABO vs CBO 決策時機:spec v3 default = TOFU ABO(保 4-variant pool diversity)。Experiment 2 跑 14 天後若 CBO ≥ ABO ROAS 且 ≥3 variants 存活 → 切 CBO。若 < 3 variants 存活 → 即使 ROAS 贏也保 ABO(pool 比短期 ROAS 重要)。

  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 流程