【QA v3 demo】Ad Architecture Spec v3 (3-tier funnel + 4-audience TOFU)

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,重定)

核心 principle:CBO/ABO 沒定論(5/14 wave 是 confounded test);TOFU 必須持續探索新客(pool 不能枯竭);MOFU/BOFU/Retention 是 CA-based 純粹收割。

9 主題 × 3 城市 = 27 theme×city base campaignsbudget mode  Exp 2 二次驗證
   25  ABOcurrent default   Exp 2 retest
   2  CBOvet-camp 中學班   AOV 主題例外 Exp 2 確認

+ 1  Retention CBO campaignnew
   SEC2026retentionBUYERS-cross-sell

= 28  active campaignsvs 現況 51 
Archive: 22  CBO duplicates 中沒贏的保留 vet-camp 中學班 CBO + 25 ABO

Adset 結構(每個 prospect campaign 內 3-tier funnel + 4 TOFU audience variants)

SEC2026・<theme>・<city>  (ABO default, CBO for vet-camp 中學班 exception)

TOFU — 新客 discovery(50% budget,4 audience flavor 並跑)
  ├ TOFU-A・Adv+ Audience pure         (Meta 全自決定,10% budget)
  ├ TOFU-B・Manual LAL 1-3pct          (purchaser/email LAL seed, 12%)
  ├ TOFU-C・Manual Custom Interests    (STEM教育/parents_6_8/Montessori 等 stack, 12%)
  └ TOFU-D・Mix (Manual LAL + Adv+)    (LAL seed + advantage_audience:1 expansion, 16%)
     → optimization_goal: LANDING_PAGE_VIEWS or LINK_CLICKS (volume-first)
     → 累積 50+ ATC/wk per adset → 升級 OFFSITE_CONVERSIONS (AddToCart)

MOFU — engaged warm(30% budget,all Manual CA, no Adv+)
  ├ MOFU-VV75-7d   (video viewers ≥75% last 7d, 12%)
  ├ MOFU-VC30      (ViewContent last 30d exclude ATC, 12%)
  └ MOFU-LeadMag   (lead magnet/email subscribers if exists, 6%)
     → optimization_goal: OFFSITE_CONVERSIONS (AddToCart → Purchase ladder)

BOFU — cart abandoners(20% budget,all Manual CA, no Adv+)
  ├ BOFU-ATC30-ex-buyers   (ATC last 30d exclude purchasers, 12%)
  └ BOFU-IC30-ex-buyers    (IC last 30d exclude purchasers, 8%)
     → optimization_goal: OFFSITE_CONVERSIONS (Purchase)

= 9 adsets per theme×city × 27 campaigns = 243 prospect adsets total

Retention cross-sell campaign 結構(新)

SEC2026・retention・BUYERS-cross-sell (CBO, Manual CA buyers only, no Adv+)
├ 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)

Portfolio Budget split
– TOFU(新客 discovery):50% of daily total — 最高優先,pool replenishment
– MOFU(warm nurture):25%
– BOFU(cart abandoners):15%
– Retention(cross-sell):10%

理由:per ads-plan info-products template「Cold 50-70% / Retargeting 20-35% / Buyer 10-15%」+ SEC 特殊 constraint「pool 不能枯竭」→ 推到 50% TOFU。


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

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

每個 funnel stage 的 bidding 邏輯 align 兩個維度:(a) optimization_goal ladder(per § 5)和 (b) bid_strategy ladder。

TOFU (new customer discovery)
  Phase 1  Cold start (per adset accumulating signal):
    optimization_goal = LANDING_PAGE_VIEWS (volume-first feed Meta)
    bid_strategy      = LOWEST_COST_WITHOUT_CAP
    rationale         = let algorithm explore; no constraint until signal stable

  Phase 2  Mid (50+ ATC/wk per adset):
    optimization_goal = OFFSITE_CONVERSIONS (AddToCart)
    bid_strategy      = COST_CAP
    cost_cap          = AOV / 10  (floral NT$800, 5-day NT$1500, vet-camp NT$2000)

  Phase 3  Mature (50+ Purchase/wk per adset):
    optimization_goal = OFFSITE_CONVERSIONS (Purchase / Value)
    bid_strategy      = LOWEST_COST_WITH_BID_CAP (ROAS Goal)
    roas_target       = 10.0

MOFU (warm engaged, Manual CA)
  Phase 1  Start:
    optimization_goal = OFFSITE_CONVERSIONS (AddToCart)
    bid_strategy      = COST_CAP @ AOV / 8

  Phase 2  Stable (50+ Purchase/wk):
    optimization_goal = OFFSITE_CONVERSIONS (Purchase / Value)
    bid_strategy      = ROAS Goal
    roas_target       = 12.0   warm  cold 

BOFU (cart abandoners, Manual CA)
  optimization_goal = OFFSITE_CONVERSIONS (Purchase)
  bid_strategy      = ROAS Goal
  roas_target       = 15.0
   retargeting benchmark 3.61x median × narrow exclude-buyers CA  14-15x feasible

Retention (cross-sell to past buyers, CBO campaign)
  optimization_goal = OFFSITE_CONVERSIONS (Purchase)
  bid_strategy      = ROAS Goal
  roas_target       = 8.0
   cross-sell  same-theme buy 難(不同主題的 buyer  一定要更多主題),realistic floor 較低

Bid sufficiency rule(per ads-budget M-ST1):daily budget per adset 必須 ≥ 5× target CPA(CPA = AOV / ROAS target)。譬如 dentistry × MOFU ROAS Goal 12 → CPA NT$667 → daily budget ≥ NT$3,333/adset。violation → P1 alert。

Bid strategy 升級 trigger:per ads-bidding-strategies decision tree
– < 15 conv/month → Lowest Cost
– 15-50 conv/month → Cost Cap
– 50+ conv/month → ROAS Goal
– 50+ conv/wk + 7+ days stable CPA SD < 20% → 升級 next phase


7. Test Framework — 4 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: CBO vs ABO 真實對比(confounded retest)

Hypothesis

IF CBO 跑在 mature theme × NT$1500/day 預算(per ads-budget「CBO works >$500/day」)× 同 audience strategy × 同 funnel structure
THEN CBO ≈ ABO (±10% ROAS)
BECAUSE CBO 真正優勢是 cross-adset budget optimization,當 audience/funnel 一致時 budget 模式本身差異有限

Test cells(控制其他變數)
| Theme×City | Daily budget | Variant A: ABO | Variant B: CBO |
|—|—|—|—|
| dentistry × taipei | NT$1800 | ABO + 9 adsets (TOFU×4 / MOFU×3 / BOFU×2) | CBO 同 9 adsets |
| space × taichung | NT$1500 | 同 | 同 |
| vet-rescue × zhubei | NT$1500 | 同 | 同 |

Setup
– Meta Ads Manager > Experiments tab > Create A/B Test
– Duration: 14 days
– Primary metric: 7-day click ROAS
– 三組 theme×city 都對打,避免 single-theme bias

Decision rule
– CBO ≥ 1.0x ABO ROAS → 全面切 CBO(含 25 theme×city migration)
– CBO 0.85-1.0x ABO → 保留現狀(ABO 主,vet-camp 中學班 CBO 例外)
– CBO < 0.85x ABO → 確認 ABO 為主,archive vet-camp CBO 改 ABO

Experiment 3: Optimization Goal Ladder Timing

Hypothesis

IF TOFU 用 PageView 起跑直到該 adset 累積 50+ ATC/wk → 切 OFFSITE_CONVERSIONS (AddToCart)
THEN ROAS 在切換後 7-14 天提升 30-50%(vs 一直停留 PageView)
BECAUSE PageView 找 click 高但不一定買,ATC 訊號 更貼近購買 intent

Setup
– 在 3 個 mature theme×city 比較:dentistry × taipei / vet-rescue × zhubei / space × taichung
– 同 audience strategy (Manual LAL 1-3pct as control variant)
– Variant A (control): PageView 持續
– Variant B (test): PageView → ATC at 50/wk → Purchase at 50/wk
– Duration: 21 days(讓 ladder 至少跑完 2 級)
– Primary metric: 7-day click ROAS post-switch

Decision rule
– 升級後 ROAS lift ≥ 20% AND learning phase reset 影響 < 7d → 全面 adopt ladder(per daily_rebalancer.py auto-upgrade rule § 9.1)
– Lift < 20% 或 reset 痛苦 > 7d → 留 PageView baseline,只在 high-volume adsets 升級

Experiment 4: 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 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 流程