【QA v3 demo】Ad Architecture Spec v3 (3-tier funnel + 4-audience TOFU)
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 campaigns(budget mode 待 Exp 2 二次驗證)
├ 25 個 ABO(current default — 但 Exp 2 retest)
└ 2 個 CBO(vet-camp 中學班 — 高 AOV 主題例外,待 Exp 2 確認)
+ 1 個 Retention CBO campaign(new)
└ SEC2026・retention・BUYERS-cross-sell
= 28 個 active campaigns(vs 現況 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 │ 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
| 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. 開放議題
-
vet-camp 中學班 CBO 例外是否擴大到其他高 AOV theme? 目前只 keep 中學班 CBO(AOV NT$20K)。dentistry (AOV NT$8K) 和 vet-rescue (AOV NT$15K) 是否也試 CBO?建議:先 lock spec,等 Experiment 3 二次驗證結果再決定。
-
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 流程
