【QA v3 demo】Ad Architecture Spec v4 (direct optimization + broad CBO)
Ad Campaign Architecture: ROAS-10 + Funnel + Equity-Floor Spec
狀態:design draft(pending user review → writing-plans)
日期:2026-05-16
前置:
– CAPI ATC bridge fix 完成(mu-plugin 2-sec-meta-capi-atc.php,audit pass HTTP 200 with em/ph/fn/country hashed)
– 45 個 v2 pencil banner 全 9 主題簽收(project_v2_pencil_banners_45_complete)
– 5/14 fresh audit 跑完(2026-05-14-meta-ads-audit-510-513.md)+ 5/16 補拉 last 3d Meta data
Spec refs:
– 2026-05-14-meta-ads-optimization-roadmap.md(A1-A4, B1-B6, C1-C7 53 items)
– ads-meta SKILL(Andromeda, EMQ, M01-M50 markers)
– ads-budget SKILL(70/20/10, 3x Kill Rule, 20% scaling rule)
– ads-test SKILL(IF/THEN/BECAUSE hypothesis, 95% confidence)
– ads-math SKILL(Break-Even CPA = AOV × Margin = NT$13.7K × 60% ≈ NT$8,200)
– ads-plan/info-products template(Cold 50-70% / Retargeting 20-35% / Buyer 10-15%)
1. Goal
把 SEC 廣告帳號從「51 campaign 過度分散 + ROAS 7.84x blended 但 60% spend 在零轉換」整理成「27 theme×city + 1 BUYER cross-sell campaign,portfolio blended ROAS ≥ 10x,每個 session 不被偏頗」。
核心 KPI(依優先序):
1. Equity floor:每個 theme×city campaign 永不 archive;每個 session 都有 fair shot 達到最低門檻 8 人
2. Portfolio blended ROAS ≥ 10.0(current 15.7x — 砍掉 CBO 拖累後預期維持)
3. Per-funnel-stage ROAS targets:cold 10 / warm 10 / hot 15 / buyer 8(自然差異健康)
為什麼現在做:
– CAPI 修好後 em/ph/fn 真的進 Meta,EMQ 預計 24-48h 從 6.1 → 7.5-8.5+,現在是 restructure 的最佳窗口
– 45 v2 banner 簽收但還沒 bind到 adsets,仍跑 5/10 的 27 套版(Andromeda M-AN1 Critical Fail 還在繼續發生)
– 5/14 CBO migration 那批 duplicates 在 3d ROAS 7.35x(CBO 沒 warm/hot adsets + A+ Audience + LPV optimization),無論 budget mode 真實效果如何都該砍 — 不修每天繼續燒 NT$11K+/day 在零轉換 CBO duplicates;真實 budget mode 對比留 § 7 Exp 3 二次驗證
– 報名季 T-30 倒數,summer camp 不能再花時間在 noise 上
非目標:
– 不擴展到 Google / YouTube / LINE 平台(spec 限 Meta 範圍)
– 不重新生成 creative(45 v2 banner 已 lock,per feedback_ad_signoff_full_state_picker)
– 不動 mu-plugin / wp-config / production code(per carve-out 之一,需人工)
– 不替換 brand voice / messaging(既有 specs.json copy 已 lock)
2. Scope(per user direction 2026-05-16 v3,重定)
核心 principle:CBO/ABO 沒定論(5/14 wave 是 confounded test)→ MOFU/BOFU/Retention 全 CBO 廣撒;TOFU 保留 ABO 因為 4-audience-variant test 需要預算對等控制;Skip optimization ladder — ATC/Purchase 訊號量現在已足夠,TOFU 直接 ATC optimization,MOFU/BOFU/Retention 直接 Purchase。
Campaign 拆分為 4 條獨立軌道(per funnel stage 各自 campaign,因為 different optimization_goal 不能塞同個 CBO 內):
9 主題 × 3 城市 = 27 theme×city × 3 funnel stages = 81 prospect campaigns
+ 1 Retention CBO(cross-sell to past buyers)
= 82 active campaigns
TOFU campaigns (27): ABO, 4 audience variant adsets each
MOFU campaigns (27): CBO, 3 CA adsets each
BOFU campaigns (27): CBO, 2 CA adsets each
Retention campaign (1): CBO, 5 cross-sell adsets
Archive: 22 個原有 CBO duplicates(不符新架構,全砍重做)
Campaign 命名規範:
SEC2026・<theme>・<city>・TOFU (ABO)
SEC2026・<theme>・<city>・MOFU (CBO)
SEC2026・<theme>・<city>・BOFU (CBO)
SEC2026・retention・BUYERS-cross-sell (CBO, single campaign)
Adset 結構 per campaign:
TOFU campaign(ABO,4-audience variant 並跑)
SEC2026・<theme>・<city>・TOFU (ABO)
├ TOFU-A・Adv+ Audience pure (advantage_audience:1, no seed, 25% campaign budget)
├ TOFU-B・Manual LAL 1-3pct (purchaser/email LAL seed, advantage_audience:0, 25%)
├ TOFU-C・Manual Custom Interests (STEM教育/parents_6_8/Montessori 等 stack, 25%)
└ TOFU-D・Mix (LAL seed + Adv+) (LAL seed + advantage_audience:1 expansion, 25%)
optimization_goal: OFFSITE_CONVERSIONS (AddToCart) — 直接 ATC,不用 PageView 起跑
bid_strategy: COST_CAP @ AOV/8 → ROAS Goal 10 after 50+ Purchase/wk per adset
理由:ATC volume sufficient(CAPI 修好後每日 ATC events 預期 30-80),TOFU 4 變體共享同 optimization 才能公平比較。
MOFU campaign(CBO,3 Manual CA adsets)
SEC2026・<theme>・<city>・MOFU (CBO)
├ MOFU-VV75-7d (video viewers ≥75% last 7d, CA)
├ MOFU-VC30 (ViewContent last 30d exclude ATC, CA)
└ MOFU-LeadMag (lead magnet / email subscribers if exists, CA)
CBO budget distributes across 3 adsets (Meta auto-balances)
optimization_goal: OFFSITE_CONVERSIONS (Purchase) — CA 已 pre-qualified 可直接 Purchase
bid_strategy: ROAS Goal 12
BOFU campaign(CBO,2 Manual CA adsets)
SEC2026・<theme>・<city>・BOFU (CBO)
├ BOFU-ATC30-ex-buyers (ATC last 30d exclude purchasers, CA)
└ BOFU-IC30-ex-buyers (IC last 30d exclude purchasers, CA)
optimization_goal: OFFSITE_CONVERSIONS (Purchase)
bid_strategy: ROAS Goal 15
Retention campaign(CBO,5 cross-sell adsets)
SEC2026・retention・BUYERS-cross-sell (CBO, single campaign for entire portfolio)
├ RET-dentistry-to-vet (dentistry buyers, exclude vet purchasers)
├ RET-floral-to-dentistry (floral buyers, exclude dentistry purchasers)
├ RET-vet-to-vet-camp (vet-rescue buyers, exclude vet-camp purchasers)
├ RET-architect-to-dino (architect buyers, exclude dino purchasers)
└ RET-broad-multi (any buyer, multi-theme combo creative)
optimization_goal: OFFSITE_CONVERSIONS (Purchase)
bid_strategy: ROAS Goal 8
Portfolio Budget split:
– TOFU(27 campaigns × ABO):50% of daily total — 新客 discovery 最高優先
– MOFU(27 campaigns × CBO):25%
– BOFU(27 campaigns × CBO):15%
– Retention(1 campaign × CBO):10%
Total adsets: 108 TOFU + 81 MOFU + 54 BOFU + 5 Retention = 248 adsets
理由:per ads-plan info-products template + SEC 「pool 不能枯竭」 constraint → 推到 50% TOFU。每 funnel stage 獨立 campaign 才能 CBO 各自最佳化(CBO 在同 campaign 內混 optimization_goal 會失效)。
3. 4-Dimension Decision Matrix(已知 lock + 未定論測試)
│ TOFU (50%) 新客 discovery │ MOFU (25%) warm engaged │ BOFU (15%) cart abandon │ Retention (10%) cross-sell
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Budget Mode │ ABO default │ ABO │ ABO │ 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 — 3 Disciplined Experiments
用 Meta Ads Manager > Experiments tab(不手動 budget split — 用 Experiments 自動 audience split + 95% confidence)。
Experiment 1: TOFU 4-Audience Variant Test(最重要)
Hypothesis:
IF TOFU 跑 4 種 audience flavor 並排(Adv+ pure / Manual LAL / Manual Custom / Mix LAL+Adv+)
THEN 至少 2 個 variant 達 ROAS ≥ 5x baseline,提供持續新客 pool
BECAUSE SEC niche 但 pool 必須持續刷新;Adv+ 可能找到 manual 抓不到的 high-intent;mix 兼具兩者優點
Setup(這是 § 2 spec 本身的常態 architecture,不是 Meta Experiments tab — 而是 4 個 sibling adsets 在同 campaign 內並跑,用 daily_rebalancer 比較):
– 每 theme×city campaign 內 4 個 TOFU adsets:TOFU-A/B/C/D
– 同 optimization_goal(PageView → ATC ladder)
– 同 creative pool(emotion + data 5 v2 banners)
– 同 budget(10-16%/adset per § 2)
– Duration: 持續監測,每 7 天滾動 ROAS 比較
Decision rule(per audience variant):
– 7d ROAS ≥ 15 → +20% budget per 3-5d
– 7d ROAS 5-15 → hold + 換 creative
– 7d ROAS < 3 連 7 天 → archive 該 variant,重新 launch 另一種 audience seed(譬如換 LAL 來源)
– 不會 4 個都砍 — 至少保留 2 個活著確保 pool diversity
Experiment 2: TOFU ABO vs CBO(4-variant 內測 budget mode)
MOFU/BOFU/Retention 已 default CBO(廣撒),這個 experiment 只測 TOFU 的 budget mode。
Hypothesis:
IF TOFU 切到 CBO(4 audience variants 同 campaign 共享預算)
THEN Meta 把 budget 自動傾倒到「最好的 audience variant」上 → 失去 4-variant 探索功能
BECAUSE CBO 算法會 starve 表現差的 variant 給好的,破壞 audience diversity(pool 探索);ABO 保持 4 variants 都活著
Test cells(控制其他變數):
| Theme×City | Daily budget | Variant A: TOFU ABO | Variant B: TOFU CBO |
|—|—|—|—|
| dentistry × taipei | NT$5000 | TOFU-A/B/C/D 各 NT$1250 強制等分 | TOFU-A/B/C/D in CBO 共享 NT$5000 |
| space × taichung | NT$5000 | 同 | 同 |
| vet-rescue × zhubei | NT$5000 | 同 | 同 |
Setup:
– Meta Ads Manager > Experiments tab > Create A/B Test
– Duration: 14 days
– Primary metric: (a) blended ROAS, (b) audience variant survival rate(4 個 variants 跑完後幾個還 active)
– 三組 theme×city 都對打
Decision rule:
– CBO ROAS ≥ ABO 且仍保 ≥ 3 variants active → 切 CBO(接受 Meta 篩選贏家)
– CBO ROAS ≥ ABO 但 ≤ 2 variants alive → keep ABO(pool diversity 重要於短期 ROAS)
– CBO < ABO → keep ABO(current default)
Experiment 3: Funnel Sequential vs Parallel
Hypothesis:
IF 新 theme launch 用 sequential exposure(TOFU only first → 50 ATC 累積後 unlock MOFU → 50 IC 後 unlock BOFU)
THEN blended theme CPA 降 30%
BECAUSE 教育類產品決策週期 2-4 週,serial exposure 比一次推全 funnel 高 3-5x 轉換(per ads-plan info-products § Common Pitfalls)
Test cells:
| Theme | Variant A: Parallel (default) | Variant B: Sequential |
|—|—|—|
| vet-rescue (3 cities) | TOFU + MOFU + BOFU 同時 active | TOFU only → 50 ATC → unlock MOFU → 50 IC → unlock BOFU |
| dentistry (3 cities) | 同 | 同 |
| space (3 cities) | 同 | 同 |
Setup:
– 由 city 切(taipei = Parallel, taichung = Sequential,後對調避免 city bias)
– Duration: 21 days
– Primary metric: theme blended CPA
Decision rule:
– Sequential 贏 → 新 theme launch SOP 一律 sequential
– Parallel 贏 → 維持現狀
7.5 Creative Routing per Funnel Stage(新增)
不同 funnel stage 對應不同 audience temperature,需要不同 creative 語氣。
| Stage | Audience temperature | Creative angle | v2 banner concepts to use | New creative needed? |
|---|---|---|---|---|
| TOFU | 冷流量、不認識 SEC、可能只搜過「夏令營」 | 故事性、驚奇感、學科識讀 | emotion + data(5 v2 banners per theme) | ✗ 既有夠用 |
| MOFU | 看過 SEC 但沒 ATC | 深度教學、社會證明 | hands-on + social-proof(既有 v2) | ✗ 既有夠用 |
| BOFU | 加過 cart 但沒結帳 | 急迫感、權威、折抵提醒 | authority(既有 v2)+ urgency/discount(新做) | ✓ 需做 1-2 張 urgency / 折抵 |
| Retention | 已買過某主題 | 跨主題 combo、互補性 | cross-theme combo(新做) | ✓ 需做 5 張 cross-sell |
Implementation:
– TOFU adsets bind emotion + data v2 banners only(5 張 per theme)
– MOFU adsets bind hands-on + social-proof v2 banners only(10 張 per theme,2 concept)
– BOFU adsets bind authority v2 banners + 新做 urgency creative(per theme 2 張新)
– Retention adsets bind 新做 cross-theme combo creatives(5 張 cross-sell adsets each 1 張)
新 creative production budget(後續 spec 接續,這份 spec lock 不做但標出 dependency):
– BOFU urgency creative:9 主題 × 2 = 18 張
– Retention cross-sell:5 cross-sell combos × 1 張 = 5 張
– 共 23 張新 creative 需要在 Day 7 之前做完(per § 10 phasing)
8. Equity Floor + Fill-Gap Monitor(永遠不偏頗任何 session)
核心 constraint:SEC 是辦活動的公司,「答應有人報名就保證開班」+「不能偏頗」。任何 theme/session 都不能被算法放棄。
8.1 Campaign-level floor
CAMPAIGN_BUDGET_FLOOR_PCT = 0.025 # 每個 27 campaign 至少 2.5% portfolio daily total
TOTAL_FLOOR = 27 × 0.025 = 0.675 # 67.5% baseline floor
PERFORMANCE_BUDGET = 0.325 # 32.5% dynamic reward 給高 ROAS adsets
ALLOWED_KILL_LEVEL = "adset" # 絕對不在 campaign-level kill
如果某 theme×city 內全部 adset ROAS < archive threshold → 保留 1 個 BROAD placeholder adset 活著(NT$50/day minimum),同步 escalate diagnostic(landing page / creative / audience root cause)。
8.2 Session-level fill-gap tracking
新 script:scripts/meta_ads/ops/fill_gap_monitor.py
# 每日 cron 從 WordPress 拉實際報名數
def get_session_enrollment(theme, city, session_date):
# Box Office order_item meta → wp_postmeta
return enrollment_count
# 計算 fill gap per session
SESSIONS = load_sessions() # from content/operations/2026-summer-*.json
for s in SESSIONS:
days_to_start = (s.start_date - today).days
enrolled = get_session_enrollment(s.theme, s.city, s.start_date)
target = 8 # minimum viable per 1:7 照顧比
gap = target - enrolled
s.mode = "FILLING" if days_to_start <= 30 and enrolled < target else "SCALING"
8.3 Mode A/B switching per campaign
def determine_campaign_mode(theme, city):
sessions = get_sessions(theme, city)
urgent = [s for s in sessions if s.mode == "FILLING"]
return "FILLING" if urgent else "SCALING"
# In daily_rebalancer.py
def apply_mode(campaign, mode):
if mode == "FILLING":
# Override bidding: Lowest Cost (volume), wider audience
# Disable A+ Audience experimental slot (force ROAS check pause)
campaign.bid_strategy = "LOWEST_COST_WITHOUT_CAP"
campaign.daily_budget *= 1.5 # boost to fill
else: # SCALING
# Restore: Cost Cap → ROAS Goal ladder per § 5
...
9. Automation Upgrades
9.1 Rewire scripts/meta_ads/ops/daily_rebalancer.py
從 CPA-target 改 funnel-stage-aware ROAS-target:
# Replace CPL_TARGET_TWD = 200 with:
ROAS_TARGET_BY_STAGE = {
"tofu": {"target": 10.0, "archive": 3.0, "boost": 15.0, "boost_pct": 0.20},
"mofu": {"target": 12.0, "archive": 5.0, "boost": 18.0, "boost_pct": 0.20},
"bofu": {"target": 15.0, "archive": 6.0, "boost": 25.0, "boost_pct": 0.20},
"retention": {"target": 8.0, "archive": 3.0, "boost": 12.0, "boost_pct": 0.20},
}
# TOFU sub-variant differentiation (4 audience flavors compete within TOFU)
TOFU_VARIANT_ARCHIVE_RULE = {
# Don't archive ALL 4 variants — keep at least 2 alive for pool diversity
"min_active_variants_per_campaign": 2,
"archive_if_roas_under": 3.0,
"for_consecutive_days": 7,
}
# Replace add_to_cart conversion metric with purchase + value
def _extract_roas(insights):
spend = float(insights.get('spend') or 0)
value = sum(
float(a.get('value', 0))
for a in insights.get('action_values', [])
if a.get('action_type') in ('purchase', 'offsite_conversion.fb_pixel_purchase')
)
return value / spend if spend > 0 else 0
# Don't touch active experiment adsets (Meta auto-determines winner)
def should_skip(adset):
return adset.is_in_experiment
# Per `ads-budget` 20% scaling rule
DAILY_BUDGET_DELTA_CAP = 0.20 # was 0.50 (too aggressive)
# Per ads-budget kill rule + safety
NO_CONV_SPEND_FLOOR = 3 * 200 # was 600 — keep but compute against AOV/ROAS target
9.2 New script scripts/meta_ads/ops/experiment_monitor.py
每 6h cron:
– 拉 active Meta Experiments status (via /<exp_id> endpoint)
– Variant ROAS > control × 1.3 → Discord「早期 winner」
– Variant ROAS < control × 0.5 → Discord「早期 loser,建議手動 kill 變體」
– 達 14d/21d 期限 inconclusive (p > 0.10) → P1 alert 建議 abort 或 extend
9.3 Upgrade scripts/meta_ads/ops/_alerts.py
新增 5 個 P0/P1 alert threshold:
P0_ALERTS = [
# CAPI health
{"name": "atc_funnel_broken",
"condition": lambda m: m["click_to_atc_pct"] < 2.0,
"window": "7d",
"action": "Discord + email"},
{"name": "capi_http_error",
"condition": lambda m: m["capi_http_200_rate"] < 0.95,
"window": "1d",
"action": "Discord"},
{"name": "dedup_anomaly",
"condition": lambda m: m["atc_to_pur_ratio"] > 1.5 or m["atc_to_pur_ratio"] < 0.15,
"window": "7d",
"action": "Discord + email"},
# ROAS health (new)
{"name": "blended_roas_drop",
"condition": lambda m: m["blended_roas_7d"] < 8.0,
"window": "7d",
"action": "Discord P1"},
{"name": "theme_break_even_breach",
"condition": lambda m: any(t["roas_7d"] < 1.67 for t in m["per_theme"]),
"window": "3d",
"action": "Discord P0 diagnostic"},
# Fill-gap (new)
{"name": "session_at_risk_T-14",
"condition": lambda m: any(s["days_to_start"] == 14 and s["enrollment"] < s["target"] * 0.3 for s in m["sessions"]),
"action": "Discord warning + suggested rescue"},
{"name": "session_at_risk_T-7",
"condition": lambda m: any(s["days_to_start"] == 7 and s["enrollment"] < s["target"] * 0.5 for s in m["sessions"]),
"action": "Discord critical + email + suggested rescue tactics"},
# Experiment health (new)
{"name": "experiment_inconclusive_14d",
"condition": lambda e: e["age_days"] >= 14 and e["p_value"] > 0.10,
"action": "Discord P1 — suggest extend 7d or abort"},
]
9.4 Daily Discord snapshot upgrade(daily_report.py)
SEC Meta Ads Daily — 2026-MM-DD
─────────────────────────────────
Portfolio 7d ROAS: 15.2x ▲ (vs target 10.0)
Portfolio 7d spend: NT$78,432
27 theme×city grid:
│ taipei │ taichung │ zhubei
─────────────────┼────────────────┼───────────────┼──────────────
vet-rescue │ Mode B · 18x ✓ │ Mode A · 24x │ Mode A · 28x
architect │ Mode B · 12x │ Mode A · 6x ⚠ │ Mode B · 15x
dino │ Mode A · 3x 🔴 │ Mode A · 4x ⚠ │ Mode A · 0x 🔴 → root cause
space │ Mode B · 22x │ Mode B · 28x │ Mode B · 31x ✓
insect │ Mode A · 5x ⚠ │ Mode A · 6x ⚠ │ Mode A · 7x
speed │ Mode A · 4x ⚠ │ Mode A · 8x │ Mode A · 12x
floral │ Mode A · 6x ⚠ │ Mode A · 9x │ Mode A · 14x
dentistry │ Mode B · 45x ✓ │ Mode B · 38x │ Mode B · 52x ✓
vet-camp 中學 │ Mode B · 18x │ Mode B · 24x │ Mode B · 16x
Session fill status (T-30 days):
vet-rescue × taipei 7/14: 12/8 ✓ filled
vet-rescue × taipei 7/21: 5/8 ⚠ filling
...
Active experiments:
Exp1 (A+ vs Manual): Day 5/14, control 24x / variant 8x, p=0.04 → variant losing fast
Exp2 (Sequence): Day 12/21, control 9x / variant 11x, p=0.18 → inconclusive
Exp3 (CBO vs ABO retest): Day 8/14, control 22x / variant 7x, p=0.02 → ABO confirmed
Today's autonomous actions:
✓ Archived 3 adsets: ROAS < 3 × 3 days (dino 北 cold-cluster-a, etc.)
✓ Boosted 5 adsets +20%: ROAS > 15 (dentistry × 3 cities cold + hot)
✓ Mode switch: vet-camp × zhubei 8/4 session filled → Scaling
⚠ Manual review needed: insect × taipei 7d ROAS 5x persistent
10. Implementation Phases
| Phase | 內容 | 時數 |
|---|---|---|
| 10.1 | Archive 22 個 CBO duplicates(保留 vet-camp 中學班 CBO + 25 ABO) | 1 hr |
| 10.2 | Bind 45 v2 banner 全 9 主題 27 campaign 的全部 adsets(per Andromeda) | 2 hr |
| 10.3 | 每個 ABO campaign 內 build 6 個 funnel-stage adset(cold ×3 / warm / hot ×2) | 4-6 hr |
| 10.4 | Build new SEC2026・cross-sell・BUYERS CBO campaign + 5 個 BUYER adsets |
2 hr |
| 10.5 | Rewrite daily_rebalancer.py 為 funnel-stage + ROAS-target driven |
3 hr |
| 10.6 | Build fill_gap_monitor.py(從 WP Box Office 拉 enrollment) |
3 hr |
| 10.7 | Build experiment_monitor.py(每 6h cron) |
2 hr |
| 10.8 | Upgrade _alerts.py 加 7 個 alert thresholds |
2 hr |
| 10.9 | Upgrade daily_report.py 出新 27-grid + experiment + fill-gap snapshot |
3 hr |
| 10.10 | 設 3 個 Meta Experiments(A+ Audience / Sequence / CBO retest) | 1 hr |
| 10.11 | Bidding strategy migration: 各 adset 從 LOWEST_COST → COST_CAP/ROAS Goal | 2 hr |
| 10.12 | 14-day observation period — daily rebalancer + experiment monitor 自動跑 | — |
| 10.13 | Day 14: Experiment 2 (TOFU ABO vs CBO) 結束,apply winner | 1 hr |
| 10.14 | Day 21: Experiment 3 (Funnel Sequential vs Parallel) 結束,apply winner | 1 hr |
| 10.15 | Lock final architecture,write 2026-06-06 retrospective | 2 hr |
Total:~30 hr 工程 + 21 天 observation/experiment 跑完。
11. Success Metrics & Decision Gates
11.1 Day 7 gate(restructure 完 + experiments 開始)
| Metric | Threshold | Action if NOT met |
|---|---|---|
| Portfolio 7d blended ROAS | ≥ 10 | Reverse 任一 archive decision,retest |
| 27 campaigns all active | yes | Restore archived theme×city(per equity floor) |
| Active adsets count | 150-200 | Check 是否有 inadvertent over-pruning |
| 45 v2 banners bound | 100% | Force-bind missing |
| Experiments running | 3/3 | Re-launch failed experiment setup |
11.2 Day 14 gate(Exp 1 + 3 結束)
| Metric | Threshold | Action |
|---|---|---|
| A+ Audience ROAS vs Manual control | < 0.9x (expected) | Kill experimental slot,永久 manual |
| A+ Audience ROAS vs Manual control | ≥ 1.0x | 漸進 migrate 10% → 30% → 50% 接下 30 天 |
| CBO vs ABO 二次驗證 | ABO 仍 ≥ 1.5x CBO ROAS | Lock 25 theme ABO(vet-camp 中學班 keep CBO) |
| CBO vs ABO 二次驗證 | CBO ≥ 1.0x ABO ROAS | Pause spec,重新規劃全面 CBO migration |
| Portfolio ROAS trend (Day 7 → 14) | Stable or rising | Continue |
| Portfolio ROAS trend | Falling > 20% | Diagnostic:哪個 funnel stage 拖累 |
11.3 Day 21 gate(Exp 2 結束 + first month wrap)
| Metric | Threshold | Action |
|---|---|---|
| Sequential vs Parallel | Sequential ≥ 1.2x ROAS | Lock 新 theme launch SOP = sequential |
| Sequential vs Parallel | Tie or Parallel wins | Lock parallel |
| Portfolio 21d ROAS | ≥ 12(above target 10) | 進入 maintenance mode |
| Portfolio 21d ROAS | 8-10 | Continue + 找 ROAS leak |
| Portfolio 21d ROAS | < 8 | P0 review — 找系統性破洞 |
| Session fill rates | All sessions ≥ 50% target by T-7 | Continue |
| Session fill rates | Any session < 50% T-7 | Human-intervened rescue(折扣 / 跨通路 / refund 預備) |
12. 風險與防護
風險 1: Archive 22 個 CBO duplicates → 失去 vet-camp 中學班 CBO 以外的「冗餘 redundant 觸達」
緩解:archive 是 reversible (Meta 可 unarchive within 90 days)。Phase 10.1 後密切觀察 24h,若 portfolio ROAS 立刻掉超過 15% → revert。
風險 2: Funnel stage adset restructure 觸發 Learning Phase reset
緩解:per ads-meta M14,避免 reset 規則是「不在 learning 時 edit」。9.2-9.4 改動會 reset,但這是必要的 reset——既有 27 變體 creative + 5/10 setup 都還在 learning limited 狀態。new structure 重新進 7-14 天 learning,14 天後 stable,比 stuck-in-learning forever 好。
風險 3: A+ Audience experimental slot 把整個 theme ROAS 拖下來
緩解:每個 theme 只 10% budget 走 A+,且14 天 hard kill if ROAS < 0.5x control。最壞情況:portfolio 整體 ROAS 受影響 < 5%。
風險 4: 報名 fill-gap monitor 拉不到 WordPress Box Office data
緩解:Phase 10.6 上線前 dry-run 測試。若 WP API 不行,fallback 用 WC REST API + Box Office filter。
風險 5: Meta Experiments 設定錯(audience split 不乾淨)
緩解:用 Meta 內建 Experiments tab(不手動 budget split)。Audience exclusion 由 Meta 自動處理。
風險 6: 27 個 ABO campaign × 6 adsets × NT$300 daily = NT$48K/day baseline,加 buyer 跟 boost 後輕鬆破 NT$80K/day
緩解:daily spend ceiling alert @ NT$80K/day(P1);NT$100K/day(P0 auto-cap)。確認 Meta 帳號月限額 ≥ NT$3M(per current account capacity unclear → user 需 verify with Meta 客服)。
風險 7: ROAS Goal bidding 需要 50+ purchases/week per adset,多數 adset 不夠
緩解:Cold 用 Cost Cap fallback(ads-budget 認可路徑)。Warm/Hot 用 portfolio-level ROAS goal(將 6 adsets 視為一個學習單元)。實在不夠 signal 的 adset → 降回 LOWEST_COST 餵 data 7 天。
13. 開放議題
-
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 流程
