Marketing Campaign Contract
全チャネルを同一メッセージ階層で統一する
1つの商品に対して、LP・広告・メール・SNS・営業資料を「同じトーン、同じメッセージ階層」で一括生成する契約(Contract)。
メガプロンプトで「いい感じに作って」は祈り。Contractは「この入力→この出力→この検証」を保証する。
→ 5W1B+P Message Contract | OS-10
なぜ Contract か
| アプローチ | 問題 |
|---|---|
| チャネルごとに別々に作る | トーンがバラける。修正の連鎖が終わらない |
| メガプロンプトで全部盛り | 出力が長大で検証できない。「それっぽい長文」になる |
| Campaign Contract | 1つの5W1B+Pから全チャネルを派生。媒体別の制約で出力を固定 |
入力スキーマ
Core: 5W1B+P(全チャネル共通)
Speaker: 誰が言うか(ブランド名、信頼性、声のトーン)
Claim: 何を言うか(主張、差別化、裏付け事実)
Audience: 誰に言うか(ペルソナ、JTBD、反論、知識レベル)
Timing: いつ言うか(文脈、心理、季節フック)
Purpose: なぜ言うか(課題、ゴール)
Benefit: 何が得か(成果、感情、機能、社会的価値、変容)
Proof: 根拠(データ、事例、証言、認定)
+P: ひと押し(magic hints)Campaign-specific
product_name: 商品名
offer: "初月無料", "30日返金保証"
channels: 対象チャネル(下記参照)
banned_phrases: キャンペーン全体のNG語句
message_hierarchy:
primary: コアメッセージ(1文)
secondary: 補強メッセージ(配列)
proof_points: 数字・根拠(配列)
cta_primary: メインCTA
cta_secondary: ソフトCTA対応チャネルと出力制約
| Channel | Format | Max Chars | Required Elements | Variations |
|---|---|---|---|---|
| LP | HTML | 5,000 | headline, subheadline, benefit_list, proof, cta, faq | 1 |
| Google Ads (RSA) | Text | 270 | headline×3(30字), description×2(90字) | 3 |
| Meta Ads | Text | 500 | primary_text, headline, cta_button | 3 |
| TikTok Ads | Text | 300 | hook, value_prop, cta | 2 |
| Email (Welcome) | HTML | 1,500 | subject, preview, greeting, value_delivery, next_step | 2 |
| Email (Promo) | HTML | 1,200 | subject, preview, offer, urgency, cta | 2 |
| Email (Nurture) | HTML | 1,500 | subject, preview, insight, proof, soft_cta | 1 |
| Email (Re-engage) | HTML | 800 | subject, preview, we_miss_you, incentive, cta | 2 |
| Twitter/X | Text | 280* | hook, value, cta_or_link | 3 |
| Threads | Text | 500 | hook, story, cta_or_link | 3 |
| Sales Deck | Markdown | 3,000 | problem, solution, differentiator, proof, pricing, cta | 1 |
* Twitter: CJK=2文字, URL=23文字固定の加重カウント
検証条件(Validation)
Per-asset(アセット単位)
- 文字数が min〜max 範囲内
- 必須要素がすべて存在
- 禁止語句なし
- CTAが空でない
- Twitter: 加重文字数 ≤ 280
- Google Ads: headline ≤ 30字, description ≤ 90字
Cross-channel(キャンペーン全体)
- message_hierarchy.primary がすべてのアセットに反映されている
- tone の一貫性スコア ≥ 0.7
- 全チャネルで同じ offer を訴求している
- 禁止語句が全アセットで排除されている
出力フォーマット
{
"campaign_id": "mc-campaign-001",
"assets": [
{
"channel": "lp",
"variation": 0,
"headline": "...",
"body": "...",
"cta": "...",
"meta": { "description": "..." },
"char_count": 3200,
"constraint_violations": [],
"tone_consistency_score": 0.92
},
{
"channel": "google_ads",
"variation": 0,
"headline": "...",
"body": "...",
"cta": "...",
"meta": { "ad_group": "..." },
"char_count": 240,
"constraint_violations": [],
"tone_consistency_score": 0.88
}
],
"message_consistency_score": 0.91,
"tone_consistency_score": 0.89,
"total_assets": 24,
"channels_covered": ["lp", "google_ads", "meta_ads", "email_welcome", "sns_twitter", "sns_threads"],
"validation_passed": true
}使い方
1. Contract を定義する
5W1B+Pのコア要素 + 対象チャネル + message_hierarchy を設定。
2. 一括生成する
全チャネルのアセットが同時に生成される。各チャネルの制約に従って出力が自動調整される。
3. 検証する
アセット単位の制約チェック + キャンペーン全体のトーン一貫性チェックが自動実行される。
4. A/Bテスト
variations > 1 のチャネルは複数バリエーションが生成される。本番投入後のパフォーマンスで選択。
技術実装
型定義: src/lib/genpost/contracts-v2.ts
MarketingCampaignContract // Campaign contract
MarketingAsset // Individual asset
MarketingCampaignOutput // Full campaign output
ChannelConstraints // Per-channel specs
CHANNEL_DEFAULTS // Channel preset configs
validateMarketingAsset() // Per-asset validation
twitterCharCount() // Twitter weighted count
validateTwitterAsset() // Twitter-specific validationRelated
- 5W1B+P Message Contract: /panolabo-engine
- OS-10: /operating-principles
- Design Audit: /design-audit-checklist
設計診断を依頼する
Campaign Contract の設計・導入支援が必要な場合:
- 設計診断:https://www.panolabollc.com/contact/?type=audit
- OEM相談:https://www.panolabollc.com/contact/?type=oem
Responsible Architect:Panolabo / 沼 健一郎
Last updated on