【QA v3 demo】Ad Architecture Spec v5 (Phase 1 NT$15K/day)
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 — Phase 1 at NT$15K/day(per user direction 2026-05-16 v5)
Phase 1 budget envelope:NT$15,000 / day = ~NT$450K / month
Phase 1 設計原則:
– 27 theme×city 全保留(equity floor 不放棄任何主題/城市)
– 每 theme×city 只塞 3 個 adsets(不是 v4 的 9 個)— 因為 NT$15K ÷ 27 ÷ 4 = NT$139/adset 不夠 sustain 4-variant
– CBO/ABO 沒定論 → 全 ABO Phase 1(簡化管理 + 預算對等分配;CBO 留到 Phase 2 NT$30K+ 再測)
– 3 adsets per campaign:TOFU-Adv+ / TOFU-Manual mix / Retargeting combined(融合 MOFU+BOFU)
– Retention 單獨 1 個 CBO campaign(分配 10% 預算 = NT$1.5K/day)
Phase 1 結構(NT$15K/day)
9 主題 × 3 城市 = 27 theme×city ABO campaigns
+ 1 Retention CBO campaign
= 28 active campaigns(vs 現況 51 個)
Per theme×city campaign(avg NT$500/day, equity floor NT$300 / performance bonus 動態):
├ TOFU-Adv+ Audience pure (advantage_audience:1, NT$160-200/day)
├ TOFU-Manual Mix (LAL 1-3pct seed + Custom Interests + Adv+ expansion, NT$160-200/day)
└ Retargeting-Combined CA (VV75-7d ∪ VC30 ∪ ATC30 ∪ IC30, exclude buyers, NT$140-180/day)
= 27 × 3 = 81 prospect adsets
Retention CBO campaign(NT$1.5K/day, 5 cross-sell adsets):
├ RET-dentistry-to-vet
├ RET-floral-to-dentistry
├ RET-vet-to-vet-camp
├ RET-architect-to-dino
└ RET-broad-multi
Total: 81 + 5 = 86 adsets (vs v4 的 248 adsets)
Archive: 22 個原有 CBO duplicates(不符 Phase 1 架構)
Phase 1 vs v4 完整架構的妥協:
| 維度 | v4 完整 | Phase 1 (NT$15K) | 妥協 reason |
|---|---|---|---|
| Campaign 數 | 82 | 28 | 預算分散會稀釋每個 adset 學不到位 |
| Adsets 數 | 248 | 86 | NT$15K ÷ 248 = NT$60/adset 不到 sufficiency 門檻 |
| TOFU audience 變體 | 4 variants (A/B/C/D) | 2 variants(Adv+ pure / Manual mix) | 4 太分散,先測 Adv+ vs Manual 對比 |
| MOFU / BOFU 分開 | Yes | 合併為 Retargeting-Combined CA | 各別 CA size 太小不足以 sustain Purchase optimization |
| MOFU/BOFU/Retention CBO | All CBO | Phase 1 全 ABO(含 Retention 1 CBO 例外) | 預算分散下 CBO budget reallocation 反而傷 — Phase 2 才測 |
Campaign 命名規範 Phase 1:
SEC2026・<theme>・<city> (ABO, 3 adsets, all funnel stages within)
SEC2026・retention・BUYERS-cross-sell (CBO, 5 cross-sell adsets)
Phase 1 Adset 結構 per theme×city campaign:
SEC2026・<theme>・<city> (ABO)
├ Adset 1: TOFU-Adv+-pure (NT$160-200/day, 33-40% campaign budget)
│ - targeting: advantage_audience:1, no seed, age 28-50 TW
│ - optimization_goal: OFFSITE_CONVERSIONS (AddToCart)
│ - bid_strategy: COST_CAP @ AOV/8
│ - creative: emotion + data v2 banners (TOFU angle)
│
├ Adset 2: TOFU-Manual-Mix (NT$160-200/day, 33-40%)
│ - targeting: Custom Audience LAL 1-3pct seed + flexible_spec interests (STEM, parents_6_8, Montessori)
│ + advantage_audience:1 (Mix expansion)
│ - optimization_goal: OFFSITE_CONVERSIONS (AddToCart)
│ - bid_strategy: COST_CAP @ AOV/8
│ - creative: emotion + data v2 banners (TOFU angle)
│
└ Adset 3: Retargeting-Combined (NT$140-180/day, 28-34%)
- targeting: Custom Audience union of {VV75-7d, VC30, ATC30, IC30} - exclude buyers
- optimization_goal: OFFSITE_CONVERSIONS (Purchase)
- bid_strategy: ROAS Goal 12
- creative: hands-on + social-proof + authority v2 banners (MOFU/BOFU mix)
Phase 1 Retention CBO campaign:
SEC2026・retention・BUYERS-cross-sell (CBO, NT$1.5K/day = 10% portfolio)
├ RET-dentistry-to-vet (CA: dentistry buyers, exclude vet purchasers)
├ RET-floral-to-dentistry (CA: floral buyers, exclude dentistry purchasers)
├ RET-vet-to-vet-camp (CA: vet-rescue buyers, exclude vet-camp purchasers)
├ RET-architect-to-dino (CA: architect buyers, exclude dino purchasers)
└ RET-broad-multi (CA: any buyer, multi-theme combo creative)
optimization_goal: OFFSITE_CONVERSIONS (Purchase)
bid_strategy: ROAS Goal 8
Portfolio Budget split Phase 1:
| Stage | Budget | Notes |
|---|---|---|
| TOFU (Adv+ Audience pure) | NT$5,400 (36%) | NT$200/campaign × 27 |
| TOFU (Manual Mix) | NT$5,400 (36%) | NT$200/campaign × 27 |
| Retargeting Combined (within each theme×city) | NT$2,700 (18%) | NT$100/campaign × 27 |
| Retention CBO | NT$1,500 (10%) | 5 cross-sell adsets × NT$300 |
| Total | NT$15,000 |
Equity floor: 每個 27 theme×city campaign 至少 NT$300/day(27 × NT$300 = NT$8,100 baseline = 54% portfolio)。剩 46% performance bonus 給 ROAS 高的 theme×city。
2.5 Scaling Phases(往後展望)
當 daily spend 突破對應 threshold + 30 天穩定 ROAS ≥ 10 → 推到下一 phase。
| Phase | Daily budget | Architecture | Trigger |
|---|---|---|---|
| Phase 1 (current) | NT$15K | 28 campaigns / 86 adsets / TOFU 2-variant / Retargeting combined / 全 ABO + 1 Retention CBO | start here |
| Phase 2 | NT$30K-60K | 拆 4-variant TOFU per theme×city,加 separate MOFU adsets,BOFU 獨立 | Phase 1 跑 30 天 blended ROAS ≥ 10 |
| Phase 3 | NT$60K+ | v4 完整架構:82 campaigns / 248 adsets / 4 audience variants / 3 funnel stages 全分開 / CBO/ABO 並排測 | Phase 2 跑 30 天 ROAS 維持 ≥ 10 + audience pool 顯示 fatigue (freq > 2.5) 表示需擴張 |
Scaling trigger logic(per ads-budget 20% scaling rule + 5x CPA sufficiency):
def should_advance_phase(metrics):
"""Auto-suggest phase advance when budget capacity + ROAS allow."""
if metrics["daily_spend_30d_avg"] >= 30000 and metrics["blended_roas_30d"] >= 10:
return "phase_2"
if metrics["daily_spend_30d_avg"] >= 60000 and metrics["blended_roas_30d"] >= 10:
if metrics["max_freq_30d"] > 2.5: # pool saturation signal
return "phase_3"
return None # stay
3. 4-Dimension Decision Matrix(Phase 2/3 完整版 — Phase 1 collapses per § 2)
Note:以下 matrix 是 Phase 2-3 完整架構(NT$30K+/day 後啟用)。Phase 1 因預算限制把 MOFU/BOFU 合併為 Retargeting-Combined adset、TOFU 只 2 variants(Adv+/Manual Mix)— 詳 § 2。
│ TOFU (50%) 新客 discovery │ MOFU (25%) warm engaged │ BOFU (15%) cart abandon │ Retention (10%) cross-sell
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Budget Mode │ ABO default │ ABO │ ABO │ CBO(cross-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-buyers,retargeting 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 — Phase 1 跑 1 個 Experiment,Phase 2-3 啟動其他
| Experiment | Phase 1 (NT$15K) | Phase 2 (NT$30K+) | Phase 3 (NT$60K+) |
|---|---|---|---|
| Exp 1: TOFU audience variant test | ✅ 簡化版(2 variants:Adv+ vs Manual Mix) | ✅ 4 variants 全跑(Adv+/LAL/Custom/Mix) | 同 Phase 2 |
| Exp 2: ABO vs CBO clean retest | ⏸ defer(預算不足以 clean test) | ✅ 啟動(NT$5K/day per cell) | 同 Phase 2 |
| Exp 3: Funnel Sequential vs Parallel | ⏸ defer(MOFU/BOFU 合併中) | ⏸ defer(still combined) | ✅ 啟動(funnel 已分開) |
Phase 1 只跑 Exp 1 一個 experiment。剩兩個 phase 2-3 才啟動,避免預算分散每個都做不好。
用 Meta Ads Manager > Experiments tab(不手動 budget split — 用 Experiments 自動 audience split + 95% confidence)。
Experiment 1 — Phase 1: TOFU 2-Audience Variant(Adv+ Audience pure vs Manual Mix)
Hypothesis:
IF TOFU 同時跑 Adv+ Audience pure 與 Manual Mix(LAL+Custom+Adv+ expansion)
THEN 兩種會分別捕到不同 high-intent buyers,blended ROAS ≥ 10x
BECAUSE Adv+ 可能找到 manual interest stacks 抓不到的;manual mix 對 SEC niche 已驗證 strong
Setup(Phase 1 — 2 adsets per theme×city, 不是 Meta Experiments tab,是內建 architecture):
– 每 theme×city 內 2 TOFU adsets:Adv+ pure / Manual Mix
– 同 optimization_goal(OFFSITE_CONVERSIONS / AddToCart)
– 同 creative pool(emotion + data v2 banners)
– 同 budget(NT$160-200/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 另一 seed(譬如 LAL 0-1pct 換 1-3pct,或加新 interest)
– 不能 2 個都砍 — 至少保留 1 個活著確保 pool diversity(per equity floor)
Phase 2 expansion path:當 daily spend ≥ NT$30K + ROAS ≥ 10 → 拆出 TOFU-C (Manual Custom-only) 和 TOFU-D (Manual LAL-only) 完成 4-variant test。
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. 開放議題
-
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 重要)。
-
Meta 帳號月限額:current daily spend ceiling 是 NT$80K,但帳號 monthly threshold 不清楚。需 user 跟 Meta 客服確認 NT$3M/月限額 / 是否需要 raise credit limit。
-
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。
-
A+ Audience 14d 後若贏,migrate 速度:是否 day-15 全切 100% 還是漸進 10% → 30% → 50% over 30 days?建議漸進,避免單次切完才發現 hidden risk。
-
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),不能單靠廣告層救。
-
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。
-
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 流程
