start-vibing-stacks 2.28.0 → 2.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/migrate.js +81 -43
- package/dist/setup.js +20 -1
- package/package.json +1 -1
- package/stacks/_shared/ads-agents/README.md +452 -0
- package/stacks/_shared/ads-agents/RESEARCH-REPORT.md +157 -0
- package/stacks/_shared/ads-agents/SKILL.md +210 -0
- package/stacks/_shared/ads-agents/SKILLS-UPDATE-REPORT.md +255 -0
- package/stacks/_shared/ads-agents/agents/audit-budget.md +116 -0
- package/stacks/_shared/ads-agents/agents/audit-compliance.md +131 -0
- package/stacks/_shared/ads-agents/agents/audit-creative.md +127 -0
- package/stacks/_shared/ads-agents/agents/audit-google.md +113 -0
- package/stacks/_shared/ads-agents/agents/audit-meta.md +112 -0
- package/stacks/_shared/ads-agents/agents/audit-tracking.md +134 -0
- package/stacks/_shared/ads-agents/agents/copy-writer.md +188 -0
- package/stacks/_shared/ads-agents/agents/creative-strategist.md +199 -0
- package/stacks/_shared/ads-agents/agents/format-adapter.md +175 -0
- package/stacks/_shared/ads-agents/agents/visual-designer.md +245 -0
- package/stacks/_shared/ads-agents/references/additional-platforms.md +106 -0
- package/stacks/_shared/ads-agents/references/benchmarks.md +257 -0
- package/stacks/_shared/ads-agents/references/bidding-strategies.md +333 -0
- package/stacks/_shared/ads-agents/references/brand-dna-template.md +190 -0
- package/stacks/_shared/ads-agents/references/budget-allocation.md +150 -0
- package/stacks/_shared/ads-agents/references/compliance.md +280 -0
- package/stacks/_shared/ads-agents/references/conversion-tracking.md +246 -0
- package/stacks/_shared/ads-agents/references/copy-frameworks.md +187 -0
- package/stacks/_shared/ads-agents/references/funnel-content-copy-rules.md +44 -0
- package/stacks/_shared/ads-agents/references/gaql-notes.md +49 -0
- package/stacks/_shared/ads-agents/references/google-audit.md +217 -0
- package/stacks/_shared/ads-agents/references/google-creative-specs.md +119 -0
- package/stacks/_shared/ads-agents/references/image-providers.md +133 -0
- package/stacks/_shared/ads-agents/references/linkedin-audit.md +141 -0
- package/stacks/_shared/ads-agents/references/linkedin-creative-specs.md +129 -0
- package/stacks/_shared/ads-agents/references/mcp-integration.md +125 -0
- package/stacks/_shared/ads-agents/references/meta-audit.md +141 -0
- package/stacks/_shared/ads-agents/references/meta-creative-specs.md +134 -0
- package/stacks/_shared/ads-agents/references/microsoft-audit.md +158 -0
- package/stacks/_shared/ads-agents/references/microsoft-creative-specs.md +123 -0
- package/stacks/_shared/ads-agents/references/platform-specs.md +276 -0
- package/stacks/_shared/ads-agents/references/scoring-system.md +169 -0
- package/stacks/_shared/ads-agents/references/tiktok-audit.md +165 -0
- package/stacks/_shared/ads-agents/references/tiktok-creative-specs.md +139 -0
- package/stacks/_shared/ads-agents/references/voice-to-style.md +87 -0
- package/stacks/_shared/ads-agents/references/youtube-creative-specs.md +134 -0
- package/stacks/_shared/ads-agents/skills/ads-apple/SKILL.md +225 -0
- package/stacks/_shared/ads-agents/skills/ads-audit/SKILL.md +108 -0
- package/stacks/_shared/ads-agents/skills/ads-budget/SKILL.md +198 -0
- package/stacks/_shared/ads-agents/skills/ads-competitor/SKILL.md +198 -0
- package/stacks/_shared/ads-agents/skills/ads-create/SKILL.md +198 -0
- package/stacks/_shared/ads-agents/skills/ads-creative/SKILL.md +208 -0
- package/stacks/_shared/ads-agents/skills/ads-dna/SKILL.md +245 -0
- package/stacks/_shared/ads-agents/skills/ads-generate/SKILL.md +173 -0
- package/stacks/_shared/ads-agents/skills/ads-google/SKILL.md +192 -0
- package/stacks/_shared/ads-agents/skills/ads-landing/SKILL.md +186 -0
- package/stacks/_shared/ads-agents/skills/ads-linkedin/SKILL.md +200 -0
- package/stacks/_shared/ads-agents/skills/ads-math/SKILL.md +216 -0
- package/stacks/_shared/ads-agents/skills/ads-meta/SKILL.md +167 -0
- package/stacks/_shared/ads-agents/skills/ads-microsoft/SKILL.md +163 -0
- package/stacks/_shared/ads-agents/skills/ads-photoshoot/SKILL.md +220 -0
- package/stacks/_shared/ads-agents/skills/ads-plan/SKILL.md +176 -0
- package/stacks/_shared/ads-agents/skills/ads-test/SKILL.md +199 -0
- package/stacks/_shared/ads-agents/skills/ads-tiktok/SKILL.md +190 -0
- package/stacks/_shared/ads-agents/skills/ads-youtube/SKILL.md +199 -0
- package/stacks/_shared/hooks/_state.ts +8 -2
- package/stacks/_shared/hooks/plan-gate.ts +138 -0
- package/stacks/_shared/memories/funnel-content-copy.md +81 -0
- package/templates/CLAUDE-python.md +6 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Brand DNA Template
|
|
2
|
+
|
|
3
|
+
<!-- Updated: 2026-03-12 -->
|
|
4
|
+
<!-- Used by: ads-dna (extraction), ads-create (consumption), ads-generate (style injection) -->
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Defines the canonical schema for `brand-profile.json`. All agents that produce or
|
|
9
|
+
consume brand data must use these exact field names and value types.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## JSON Schema
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"schema_version": "1.0",
|
|
18
|
+
"brand_name": "string",
|
|
19
|
+
"website_url": "string (full URL including https://)",
|
|
20
|
+
"extracted_at": "ISO-8601 timestamp (e.g. 2026-03-12T14:30:00Z)",
|
|
21
|
+
|
|
22
|
+
"voice": {
|
|
23
|
+
"formal_casual": 7,
|
|
24
|
+
"rational_emotional": 4,
|
|
25
|
+
"playful_serious": 5,
|
|
26
|
+
"bold_subtle": 8,
|
|
27
|
+
"traditional_innovative": 6,
|
|
28
|
+
"expert_accessible": 5,
|
|
29
|
+
"descriptors": ["authoritative", "warm", "direct"]
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
"colors": {
|
|
33
|
+
"primary": "#1A2E4A",
|
|
34
|
+
"secondary": ["#F4A623", "#FFFFFF"],
|
|
35
|
+
"forbidden": ["#FF0000"],
|
|
36
|
+
"background": "#F9F9F9",
|
|
37
|
+
"text": "#1A1A1A"
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
"typography": {
|
|
41
|
+
"heading_font": "Inter",
|
|
42
|
+
"body_font": "Source Sans Pro",
|
|
43
|
+
"pairing_descriptor": "modern sans-serif, clean and readable"
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
"imagery": {
|
|
47
|
+
"style": "professional photography",
|
|
48
|
+
"subjects": ["people using product", "clean product shots", "diverse workforce"],
|
|
49
|
+
"composition": "clean backgrounds, good negative space",
|
|
50
|
+
"forbidden": ["stock photo clichés", "corporate handshakes", "cheesy smiles"]
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
"aesthetic": {
|
|
54
|
+
"mood_keywords": ["trustworthy", "modern", "approachable"],
|
|
55
|
+
"texture": "minimal, flat",
|
|
56
|
+
"negative_space": "generous"
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
"brand_values": ["transparency", "innovation", "customer-first"],
|
|
60
|
+
|
|
61
|
+
"target_audience": {
|
|
62
|
+
"age_range": "28-45",
|
|
63
|
+
"profession": "marketing managers and small business owners",
|
|
64
|
+
"pain_points": ["time-consuming reporting", "unclear ROI"],
|
|
65
|
+
"aspirations": ["grow efficiently", "look professional"]
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
"screenshots": {
|
|
69
|
+
"homepage": "./brand-screenshots/example_com_desktop.png",
|
|
70
|
+
"secondary": ["./brand-screenshots/example_com_pricing_desktop.png"]
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Field Reference
|
|
78
|
+
|
|
79
|
+
### Voice Axes (1-10 scale)
|
|
80
|
+
|
|
81
|
+
Score interpretation: 1 = extreme left pole, 10 = extreme right pole, 5 = neutral.
|
|
82
|
+
|
|
83
|
+
| Field | 1 (Left) | 10 (Right) | Ad Implication |
|
|
84
|
+
|-------|----------|------------|----------------|
|
|
85
|
+
| `formal_casual` | Very formal, corporate | Very casual, conversational | Headlines tone |
|
|
86
|
+
| `rational_emotional` | Data-driven, logical | Emotionally evocative | Story vs stats |
|
|
87
|
+
| `playful_serious` | Fun, humorous | Serious, no-nonsense | CTA phrasing |
|
|
88
|
+
| `bold_subtle` | Big claims, loud | Understated, nuanced | Visual hierarchy |
|
|
89
|
+
| `traditional_innovative` | Classic, established | Cutting-edge, disruptive | Imagery style |
|
|
90
|
+
| `expert_accessible` | Deep expertise, jargon | Everyone can understand | Copy complexity |
|
|
91
|
+
|
|
92
|
+
`descriptors` (array of 3-5 strings): Free-form adjectives capturing tone not covered by axes.
|
|
93
|
+
|
|
94
|
+
### Colors
|
|
95
|
+
|
|
96
|
+
- `primary`: Main brand color. **Always inject into image generation prompts.**
|
|
97
|
+
- `secondary`: Supporting palette. Use for accents in generation prompts.
|
|
98
|
+
- `forbidden`: Colors to explicitly exclude from prompts (e.g., competitor brand colors).
|
|
99
|
+
- `background` / `text`: Digital UI colors (less relevant for ad image generation).
|
|
100
|
+
|
|
101
|
+
**Null handling:** If extraction fails for a color, set to `null`. Agents must skip null
|
|
102
|
+
color injection rather than defaulting to arbitrary colors.
|
|
103
|
+
|
|
104
|
+
### Typography
|
|
105
|
+
|
|
106
|
+
Used by `copy-writer` agent for tone calibration. Not injected into image prompts
|
|
107
|
+
(typography is handled by ad platform copy fields, not image generation).
|
|
108
|
+
|
|
109
|
+
### Imagery
|
|
110
|
+
|
|
111
|
+
- `style`: Main descriptor passed to image generation (e.g., "professional photography",
|
|
112
|
+
"illustration", "flat design").
|
|
113
|
+
- `subjects`: Array injected as subject guidance in prompts.
|
|
114
|
+
- `composition`: Passed verbatim as a composition constraint.
|
|
115
|
+
- `forbidden`: Converted to negative prompt modifiers (e.g., "no corporate handshakes").
|
|
116
|
+
|
|
117
|
+
### Aesthetic
|
|
118
|
+
|
|
119
|
+
- `mood_keywords`: Injected directly into generation prompts as atmosphere descriptors.
|
|
120
|
+
- `texture`: Passed as texture preference.
|
|
121
|
+
- `negative_space`: "generous" → "plenty of white space, uncluttered composition".
|
|
122
|
+
|
|
123
|
+
### Screenshots (optional, populated by `/ads dna`)
|
|
124
|
+
|
|
125
|
+
- `homepage`: Desktop screenshot of homepage. **Primary visual style reference** for
|
|
126
|
+
`visual-designer` agent. When present, generation auto-uses `gemini-3.1-flash-image-preview`
|
|
127
|
+
(Nano Banana 2) for better brand style-transfer.
|
|
128
|
+
- `secondary`: Additional pages (pricing, about, product). Supplemental context.
|
|
129
|
+
- **If field absent**: `visual-designer` falls back to text-only generation (`gemini-2.5-flash-image`).
|
|
130
|
+
- **If field present but file missing on disk**: `visual-designer` logs a warning and falls back gracefully.
|
|
131
|
+
- Set by `ads-dna` Step 2b. Omitted entirely if screenshot capture failed or `--quick` was used.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Extraction Guide
|
|
136
|
+
|
|
137
|
+
### Pages to scan (in order)
|
|
138
|
+
|
|
139
|
+
1. **Homepage**: Primary brand impression, dominant colors, hero headline tone
|
|
140
|
+
2. **About / Our Story**: Brand values, voice descriptors, team photography style
|
|
141
|
+
3. **Product / Service page**: Imagery style, composition, subject matter
|
|
142
|
+
4. **Existing ads** (if accessible via Meta Ad Library or Google Ads Transparency): Override
|
|
143
|
+
|
|
144
|
+
### CSS extraction targets
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
background-color, color → colors.primary / secondary
|
|
148
|
+
font-family → typography.heading_font / body_font
|
|
149
|
+
@import url (Google Fonts) → typography (font name from URL path)
|
|
150
|
+
og:image meta tag → imagery.style (analyze dominant visual)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Voice scoring heuristics
|
|
154
|
+
|
|
155
|
+
| Signal | Scoring |
|
|
156
|
+
|--------|---------|
|
|
157
|
+
| Uses "you" and "your" frequently | formal_casual +2 (casual) |
|
|
158
|
+
| Industry jargon in hero text | expert_accessible -2 (expert) |
|
|
159
|
+
| Short sentences (≤10 words) | bold_subtle +1 (bold) |
|
|
160
|
+
| Testimonials lead with emotion | rational_emotional +2 (emotional) |
|
|
161
|
+
| "Trusted by 10,000+ companies" | traditional_innovative -1 (traditional) |
|
|
162
|
+
|
|
163
|
+
### Fallback heuristics
|
|
164
|
+
|
|
165
|
+
- **No Google Fonts detected**: Set `typography.heading_font` to "system-ui"
|
|
166
|
+
- **Sparse content (< 200 words)**: Mark `extracted_at` note: "low confidence extraction"
|
|
167
|
+
- **Dark mode site**: If background is dark (#333 or darker), swap `background` and `text`
|
|
168
|
+
- **Cannot extract primary color**: Use most prominent color from og:image analysis
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Usage in Generation Prompts
|
|
173
|
+
|
|
174
|
+
When building image generation prompts, inject brand DNA as:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
"[subject], [imagery.style], [imagery.composition],
|
|
178
|
+
brand colors [colors.primary] and [colors.secondary[0]],
|
|
179
|
+
[aesthetic.mood_keywords joined by comma] atmosphere,
|
|
180
|
+
[aesthetic.texture] texture, [aesthetic.negative_space] composition,
|
|
181
|
+
no [imagery.forbidden joined by comma]"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Example output:
|
|
185
|
+
```
|
|
186
|
+
"person using laptop, professional photography, clean backgrounds good negative space,
|
|
187
|
+
brand colors #1A2E4A and #F4A623, trustworthy modern approachable atmosphere,
|
|
188
|
+
minimal flat texture, generous white space composition,
|
|
189
|
+
no stock photo clichés, no corporate handshakes"
|
|
190
|
+
```
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Budget Allocation & Scaling Framework
|
|
2
|
+
|
|
3
|
+
<!-- Updated: 2026-02-10 -->
|
|
4
|
+
<!-- Sources: Google Research PDF 2, Claude Research, Gemini Research -->
|
|
5
|
+
|
|
6
|
+
## Platform Selection Matrix by Business Type
|
|
7
|
+
|
|
8
|
+
| Business Type | Platform 1 | Platform 2 | Platform 3 | Other | Min Monthly | Primary KPI | Time to Profit |
|
|
9
|
+
|--------------|------------|------------|------------|-------|-------------|-------------|---------------|
|
|
10
|
+
| SaaS B2B | Google 35-45% | LinkedIn 30-40% | Meta 15-25% | YouTube 10% | $5,000 | Pipeline ROI, LTV:CAC | 3-6 months |
|
|
11
|
+
| E-commerce DTC | Meta 50-68% | Google PMax 23-30% | TikTok 5-15% | Email 5% | $3,000 | ROAS, MER, POAS | 0-2 months |
|
|
12
|
+
| Local Service | Google LSA/Search 60% | Meta 30% | Bing 10% | N/A | $1,500 | Cost Per Lead/Booking | 1 month |
|
|
13
|
+
| B2B Enterprise | LinkedIn 39-60% | Google 20-35% | ABM Display 15-20% | Programmatic 11% | $10,000 | Pipeline, SQLs | 6-12 months |
|
|
14
|
+
| Info Products | YouTube 40% | Meta 40% | Email 20% | N/A | $2,000 | ROAS, Webinar CPL | 1-3 months |
|
|
15
|
+
| Mobile App | Apple Search 30% | Google App 30% | Meta/TikTok 40% | N/A | $5,000 | CPI, LTV, D7 Retention | 3-6 months |
|
|
16
|
+
| Real Estate | Meta Lead Forms 50% | Google Search 40% | LinkedIn 10% | N/A | $2,500 | Cost Per Lead | 2-4 months |
|
|
17
|
+
| Healthcare | Google Search 55% | Meta 20% | Microsoft 10% | YouTube/Display 15% | $4,000 | Cost Per Patient | 2-5 months |
|
|
18
|
+
| Finance/Fintech | Google Search 40-50% | LinkedIn 20-30% | Meta 15% | YouTube/Display 10% | $8,000 | CAC, LTV:CAC | 4-8 months |
|
|
19
|
+
| Agency (Own) | LinkedIn 50% | Meta 30% | Google 20% | N/A | $1,500 | Cost Per Lead | 1-3 months |
|
|
20
|
+
| B2C / DTC | Meta 50% | Google 20% | TikTok 30% | N/A | $2,000 | ROAS, CAC | 1-3 months |
|
|
21
|
+
|
|
22
|
+
## Budget Distribution Rule: 70/20/10
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
70% → Proven performers (campaigns with established positive ROAS/CPA)
|
|
26
|
+
20% → Promising growth (campaigns showing traction, need scale)
|
|
27
|
+
10% → Experiments (new platforms, audiences, formats)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Scaling Decision Tree
|
|
31
|
+
|
|
32
|
+
### 20% Rule (Scale Up)
|
|
33
|
+
```
|
|
34
|
+
IF actual_CPA < target_CPA by > 10%
|
|
35
|
+
AND conversions_last_7d >= learning_threshold
|
|
36
|
+
AND campaign NOT in learning phase
|
|
37
|
+
THEN increase budget by 20%
|
|
38
|
+
→ Wait 3-5 days before next increase
|
|
39
|
+
→ Never increase more than 20% at once on Meta (triggers learning reset)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3× Kill Rule (Pause)
|
|
43
|
+
```
|
|
44
|
+
IF spend > 3× target_CPA
|
|
45
|
+
AND conversions == 0
|
|
46
|
+
THEN pause ad/ad set/campaign immediately
|
|
47
|
+
→ Review: creative, targeting, landing page, tracking
|
|
48
|
+
→ Don't restart without changes
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Decreasing Returns Detection
|
|
52
|
+
```
|
|
53
|
+
IF CPA increased > 15% after last budget increase
|
|
54
|
+
THEN roll back to previous budget level
|
|
55
|
+
→ Wait 7 days
|
|
56
|
+
→ Try horizontal scaling instead (new audiences, platforms)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Saturation Signals
|
|
60
|
+
| Platform | Signal | Threshold | Action |
|
|
61
|
+
|----------|--------|-----------|--------|
|
|
62
|
+
| Google | Impression Share | >80% | Diminishing returns; diversify |
|
|
63
|
+
| Meta | Frequency (7-day) | >4.0 | Audience exhausted; refresh creative or expand |
|
|
64
|
+
| TikTok | Frequency | >3.0 | Creative fatigue; replace assets |
|
|
65
|
+
| LinkedIn | Audience penetration | >50% | Audience exhausted; expand targeting |
|
|
66
|
+
|
|
67
|
+
## Marketing Efficiency Ratio (MER)
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
MER = Total Revenue / Total Ad Spend (all platforms combined)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
| Business Type | Healthy MER | Excellent MER | Danger Zone |
|
|
74
|
+
|--------------|-------------|---------------|-------------|
|
|
75
|
+
| E-commerce | 3.0-5.0 | >5.0 | <2.0 |
|
|
76
|
+
| SaaS | Use LTV:CAC (3:1 target) | >4:1 | <2:1 |
|
|
77
|
+
| Lead Gen | Revenue/Lead × CVR / CPL | N/A | <1.5 |
|
|
78
|
+
|
|
79
|
+
**Why MER over ROAS:**
|
|
80
|
+
- ROAS is platform-reported (overclaims by 20-40%)
|
|
81
|
+
- MER captures true business economics
|
|
82
|
+
- Cross-platform; not inflated by attribution overlap
|
|
83
|
+
|
|
84
|
+
## Seasonality Adjustments
|
|
85
|
+
|
|
86
|
+
### Q4 (October-December)
|
|
87
|
+
- CPMs increase 30-50%
|
|
88
|
+
- Reduce ROAS targets by 20%
|
|
89
|
+
- Front-load creative testing in September
|
|
90
|
+
- Increase budgets 40-60% for Black Friday / Cyber Monday
|
|
91
|
+
- Meta: Advantage+ Sales performs best during peaks
|
|
92
|
+
|
|
93
|
+
### Q1 (January-March)
|
|
94
|
+
- CPMs decrease 20-30% post-holiday
|
|
95
|
+
- Best time for new campaign testing
|
|
96
|
+
- Aggressive customer acquisition (lower competition)
|
|
97
|
+
- Meta Jan 2026 CPC: $0.85 (24% below prior January)
|
|
98
|
+
|
|
99
|
+
### Q2 (April-June)
|
|
100
|
+
- Steady CPMs, good testing window
|
|
101
|
+
- Mother's Day / Father's Day spikes for retail
|
|
102
|
+
|
|
103
|
+
### Q3 (July-September)
|
|
104
|
+
- LinkedIn CPC peaks in Q3 ($15.72 average)
|
|
105
|
+
- Back-to-school surge for education
|
|
106
|
+
- Good time to build retargeting pools for Q4
|
|
107
|
+
|
|
108
|
+
## Incrementality Testing (Geo-Lift)
|
|
109
|
+
|
|
110
|
+
### Setup
|
|
111
|
+
- Duration: 2-4 weeks minimum
|
|
112
|
+
- Holdout: 10% of geographic regions (matched pairs)
|
|
113
|
+
- Method: Compare conversion rates exposed vs holdout
|
|
114
|
+
- Statistical significance: p < 0.05
|
|
115
|
+
|
|
116
|
+
### Tools
|
|
117
|
+
- Meta: Robyn (R-based, open source), best for ~80% of orgs
|
|
118
|
+
- Google: Meridian (Python, Bayesian, geo-level)
|
|
119
|
+
- Advanced: PyMC-Marketing (fully customizable)
|
|
120
|
+
- Budget: Significant; allocate 10% of monthly spend for testing
|
|
121
|
+
|
|
122
|
+
### Post-Purchase Surveys
|
|
123
|
+
- Fill ~30% of attribution gap that digital tracking misses
|
|
124
|
+
- Question: "How did you first hear about us?"
|
|
125
|
+
- Implement on order confirmation page
|
|
126
|
+
- Weight responses against platform-reported data
|
|
127
|
+
|
|
128
|
+
## Minimum Viable Budgets
|
|
129
|
+
|
|
130
|
+
| Platform | Minimum Monthly | Rationale |
|
|
131
|
+
|----------|----------------|-----------|
|
|
132
|
+
| Google Ads | $1,000 | 15+ conv/month minimum for Smart Bidding |
|
|
133
|
+
| Meta Ads | $600-$800 | 50 conv/week/ad set × $CPA |
|
|
134
|
+
| LinkedIn Ads | $3,000 | High CPCs; $10/day minimum × multiple campaigns |
|
|
135
|
+
| TikTok Ads | $300 | $50/day campaign min × creative testing needs |
|
|
136
|
+
| Microsoft Ads | $200-$300 | 20-30% of Google budget |
|
|
137
|
+
|
|
138
|
+
## Cross-Platform Attribution Hierarchy
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Source of Truth (best → worst):
|
|
142
|
+
1. CRM Data (actual revenue, closed deals, LTV)
|
|
143
|
+
2. MER (total revenue / total ad spend)
|
|
144
|
+
3. Post-Purchase Surveys ("How did you hear about us?")
|
|
145
|
+
4. Google Analytics 4 (cross-channel, multi-touch)
|
|
146
|
+
5. Platform-Reported Data (always overclaims 20-40%)
|
|
147
|
+
|
|
148
|
+
RULE: Never trust platform-reported ROAS alone.
|
|
149
|
+
Always cross-reference with ≥2 other data sources.
|
|
150
|
+
```
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Advertising Compliance & Privacy Reference
|
|
2
|
+
|
|
3
|
+
<!-- Updated: 2026-05-14 | v1.6 -->
|
|
4
|
+
<!-- Sources: Claude Research, Gemini Research, 2026 Verification Pass -->
|
|
5
|
+
|
|
6
|
+
## Google Ads Policies
|
|
7
|
+
|
|
8
|
+
### Enforcement System: Three-Strike Policy
|
|
9
|
+
| Strike | Consequence | Duration |
|
|
10
|
+
|--------|------------|----------|
|
|
11
|
+
| Strike 1 | 90-day probation | Warning period |
|
|
12
|
+
| Strike 2 | 90-day restriction | Limited functionality |
|
|
13
|
+
| Strike 3 | Permanent suspension | Account terminated |
|
|
14
|
+
|
|
15
|
+
### Prohibited Content (Immediate Disapproval)
|
|
16
|
+
- Counterfeit goods
|
|
17
|
+
- Dangerous products or services
|
|
18
|
+
- Dishonest behavior enablement
|
|
19
|
+
- Inappropriate content (hate speech, violence, shocking content)
|
|
20
|
+
|
|
21
|
+
### Restricted Categories (Certification Required)
|
|
22
|
+
| Category | Requirement |
|
|
23
|
+
|----------|-------------|
|
|
24
|
+
| Online pharmacies | Google certification + LegitScript |
|
|
25
|
+
| Telemedicine | Platform certification |
|
|
26
|
+
| Health insurance | Certification in applicable regions |
|
|
27
|
+
| Gambling | State/country-specific licensing |
|
|
28
|
+
| Political ads | Identity verification + disclosures |
|
|
29
|
+
| Cryptocurrency | Certification required |
|
|
30
|
+
| Financial services | Clear APR/fee/terms disclosures |
|
|
31
|
+
| Alcohol | Age-gating + regional restrictions |
|
|
32
|
+
| Adult content | Age restriction + limited placements |
|
|
33
|
+
|
|
34
|
+
### Common Disapprovals
|
|
35
|
+
- Misleading claims (superlatives without evidence)
|
|
36
|
+
- Missing landing page content (404s, under construction)
|
|
37
|
+
- Destination mismatch (ad promise ≠ landing page)
|
|
38
|
+
- Prohibited content in ad text
|
|
39
|
+
- Trademark infringement
|
|
40
|
+
- Restricted healthcare claims
|
|
41
|
+
|
|
42
|
+
### Recommendations Tab: What to Accept/Reject
|
|
43
|
+
|
|
44
|
+
**Safe to accept:**
|
|
45
|
+
- Optimized ad rotation
|
|
46
|
+
- Relevant extensions
|
|
47
|
+
- Fix disapproved ads
|
|
48
|
+
|
|
49
|
+
**Usually reject:**
|
|
50
|
+
- "Raise your budget"
|
|
51
|
+
- "Add broad match keywords"
|
|
52
|
+
- "Add new keywords" (auto-suggested)
|
|
53
|
+
- Auto-created RSAs
|
|
54
|
+
- Bidding strategy switches
|
|
55
|
+
- Turn off Optimization Score auto-apply
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Meta Ads Policies
|
|
60
|
+
|
|
61
|
+
### Special Ad Categories (Restricted Targeting)
|
|
62
|
+
| Category | Restrictions |
|
|
63
|
+
|----------|-------------|
|
|
64
|
+
| Housing | No ZIP code, age must be 18-65+, no lookalike |
|
|
65
|
+
| Employment | Same restrictions as Housing |
|
|
66
|
+
| Credit | Same restrictions as Housing |
|
|
67
|
+
| **Financial Products** | **New Jan 2025**, enforced as Special Category |
|
|
68
|
+
|
|
69
|
+
All Special Ad Categories:
|
|
70
|
+
- Cannot target by age (18-65+ only range)
|
|
71
|
+
- Cannot target by ZIP code / postal code
|
|
72
|
+
- Cannot use Lookalike Audiences
|
|
73
|
+
- Must declare category before campaign creation
|
|
74
|
+
|
|
75
|
+
### Enforcement Scale
|
|
76
|
+
- Over 1.3 billion ads rejected or removed in 2024
|
|
77
|
+
- Account restrictions escalate with repeated violations
|
|
78
|
+
- Appeal process available but slow
|
|
79
|
+
|
|
80
|
+
### Detailed Targeting Exclusions (Removed)
|
|
81
|
+
- Removed from new ad sets: March 31, 2025
|
|
82
|
+
- Removed from boosted posts: June 10, 2025
|
|
83
|
+
- Existing campaigns with old exclusions stopped: January 15, 2026
|
|
84
|
+
- Meta cites 22.6% lower median cost per conversion without exclusions
|
|
85
|
+
|
|
86
|
+
### Content Rules
|
|
87
|
+
- No misleading health/weight loss claims
|
|
88
|
+
- Before/after images: heavily restricted
|
|
89
|
+
- Cryptocurrency: certification required
|
|
90
|
+
- Political ads: "Paid for by" disclosure required
|
|
91
|
+
- Personal attributes: cannot imply user has specific condition
|
|
92
|
+
- Sensational content: no clickbait tactics
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## LinkedIn Ads Policies
|
|
97
|
+
|
|
98
|
+
### Restricted Industries
|
|
99
|
+
- Gambling and betting
|
|
100
|
+
- Tobacco and related products
|
|
101
|
+
- Weapons and ammunition
|
|
102
|
+
- Adult content
|
|
103
|
+
- Multi-level marketing
|
|
104
|
+
- Cryptocurrency (restricted, not prohibited)
|
|
105
|
+
|
|
106
|
+
### Professional Standards
|
|
107
|
+
- B2B focus expected; casual/misleading content penalized
|
|
108
|
+
- Thought Leader Ads must come from genuine employees
|
|
109
|
+
- Lead Gen Forms must have clear privacy policy
|
|
110
|
+
- Job postings must comply with employment laws
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## TikTok Ads Policies
|
|
115
|
+
|
|
116
|
+
### Platform Requirements
|
|
117
|
+
- Content must feel native (not overly polished/corporate)
|
|
118
|
+
- Audio required (TikTok is sound-on)
|
|
119
|
+
- Must comply with music licensing for commercial use
|
|
120
|
+
- Creator content (Spark Ads) requires creator approval
|
|
121
|
+
|
|
122
|
+
### Restricted Categories
|
|
123
|
+
- Age-restricted products (alcohol, gambling): geo-gated
|
|
124
|
+
- Health claims: evidence required
|
|
125
|
+
- Financial products: risk disclosures required
|
|
126
|
+
- Political ads: banned in many markets
|
|
127
|
+
|
|
128
|
+
### TikTok Shop Policies
|
|
129
|
+
- Products must meet marketplace standards
|
|
130
|
+
- No counterfeit or restricted goods
|
|
131
|
+
- Seller verification required
|
|
132
|
+
- Available in 11 countries (US, UK, key Asian/European markets)
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Microsoft Ads Policies
|
|
137
|
+
|
|
138
|
+
### Import Considerations
|
|
139
|
+
- Google Ads policy approvals don't transfer
|
|
140
|
+
- Microsoft has separate review process
|
|
141
|
+
- Some Google-approved ads may be disapproved on Microsoft
|
|
142
|
+
- Bing audience skews older/more conservative; creative should match
|
|
143
|
+
|
|
144
|
+
### Copilot Placement Policies
|
|
145
|
+
- Ads in Copilot must be clearly labeled
|
|
146
|
+
- Copilot Checkout (Jan 2026): commerce within conversations
|
|
147
|
+
- Higher quality standards for conversational context
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Privacy Regulations (February 2026)
|
|
152
|
+
|
|
153
|
+
### Global Privacy Landscape
|
|
154
|
+
|
|
155
|
+
| Regulation | Region | Status | Key Requirement |
|
|
156
|
+
|-----------|--------|--------|-----------------|
|
|
157
|
+
| GDPR | EU/EEA | Active | Consent before tracking; data minimization |
|
|
158
|
+
| UK GDPR | UK | Active | Similar to EU GDPR |
|
|
159
|
+
| CCPA/CPRA | California | Active | Right to opt out; mandatory audits |
|
|
160
|
+
| 20 State Laws | US (various) | Active Jan 2026 | Indiana, Kentucky, Rhode Island newest |
|
|
161
|
+
| LGPD | Brazil | Active | Consent and transparency |
|
|
162
|
+
| PIPL | China | Active | Consent and data localization |
|
|
163
|
+
|
|
164
|
+
### Key Privacy Facts (2026)
|
|
165
|
+
|
|
166
|
+
**Privacy Sandbox is DEAD:**
|
|
167
|
+
- Google officially retired October 2025
|
|
168
|
+
- Third-party cookies remain in Chrome (~67% browser share)
|
|
169
|
+
- Safari and Firefox already block third-party cookies
|
|
170
|
+
- No separate consent prompt coming
|
|
171
|
+
|
|
172
|
+
**iOS App Tracking Transparency (ATT):**
|
|
173
|
+
- Average opt-in rate: ~35% (Q2 2025, up from 29% in 2022)
|
|
174
|
+
- Gaming highest: 37-50%
|
|
175
|
+
- Education lowest: 7-14%
|
|
176
|
+
- Apps with <30% opt-in lose 58% of ad revenue on average
|
|
177
|
+
|
|
178
|
+
**Consent Mode v2 (Mandatory for EU/EEA):**
|
|
179
|
+
- Enforcement tightened July 2025
|
|
180
|
+
- Without: 90-95% metric drops
|
|
181
|
+
- Advanced mode recovers 30-50% of lost conversions
|
|
182
|
+
- ~31% of users globally accept tracking cookies
|
|
183
|
+
|
|
184
|
+
**US State Privacy:**
|
|
185
|
+
- 20 state laws active by January 2026
|
|
186
|
+
- Texas AG: $1.4 billion settlement for tracking violations
|
|
187
|
+
- California CPPA: mandatory cybersecurity audits + data processing risk assessments
|
|
188
|
+
- Server-side tracking now architecturally necessary for compliance
|
|
189
|
+
|
|
190
|
+
### Compliance Decision Tree
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
IF serving_region INCLUDES "EU/EEA":
|
|
194
|
+
→ Consent Mode v2 = MANDATORY
|
|
195
|
+
→ Cookie consent banner = MANDATORY
|
|
196
|
+
→ Data Processing Agreement = MANDATORY
|
|
197
|
+
→ Enhanced Conversions with consent = RECOMMENDED
|
|
198
|
+
|
|
199
|
+
IF serving_region INCLUDES "California":
|
|
200
|
+
→ CCPA/CPRA compliance = MANDATORY
|
|
201
|
+
→ "Do Not Sell" link = MANDATORY
|
|
202
|
+
→ Data processing risk assessment = MANDATORY (2026)
|
|
203
|
+
|
|
204
|
+
IF serving_region INCLUDES any US state:
|
|
205
|
+
→ Check specific state law requirements
|
|
206
|
+
→ 20 states have active laws as of Jan 2026
|
|
207
|
+
|
|
208
|
+
FOR ALL REGIONS:
|
|
209
|
+
→ Server-side tracking = RECOMMENDED (bypasses most client-side issues)
|
|
210
|
+
→ First-party data strategy = ESSENTIAL
|
|
211
|
+
→ Privacy policy on landing pages = MANDATORY
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Healthcare-Specific Compliance
|
|
215
|
+
|
|
216
|
+
| Rule | Enforcement |
|
|
217
|
+
|------|-------------|
|
|
218
|
+
| No remarketing/retargeting for health services | Google policy: account suspension risk |
|
|
219
|
+
| No targeting by health conditions | Google, Meta, all platforms |
|
|
220
|
+
| Online pharmacy certification | Google: LegitScript required |
|
|
221
|
+
| Telemedicine certification | Google: platform certification |
|
|
222
|
+
| HIPAA considerations | US: no PHI in tracking pixels |
|
|
223
|
+
| Use contextual targeting | Instead of audience targeting |
|
|
224
|
+
|
|
225
|
+
### Financial Services Compliance
|
|
226
|
+
|
|
227
|
+
| Rule | Enforcement |
|
|
228
|
+
|------|-------------|
|
|
229
|
+
| Clear APR/fee/terms disclosures | Google, Meta: ad disapproval |
|
|
230
|
+
| Lending certification | Google: account level |
|
|
231
|
+
| Crypto certification | Google: account level |
|
|
232
|
+
| Risk disclosures | All platforms |
|
|
233
|
+
| Financial Products Special Category | Meta (Jan 2025): restricted targeting |
|
|
234
|
+
| No misleading income claims | All platforms: account suspension |
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 2025-2026 Changes
|
|
239
|
+
|
|
240
|
+
### Microsoft Consent Mode Deadline
|
|
241
|
+
- **May 5, 2025**: Consent Mode required for all campaigns targeting EEA, UK, and Switzerland
|
|
242
|
+
- Without implementation, conversion tracking in these regions will be severely degraded
|
|
243
|
+
|
|
244
|
+
### Meta Link Clicks Redefinition (Feb 2025)
|
|
245
|
+
- "Link clicks" metric now **excludes social engagement clicks** (likes, comments, shares)
|
|
246
|
+
- Only counts clicks that navigate away from Meta surfaces
|
|
247
|
+
- Affects historical benchmarking: year-over-year comparisons will show apparent drops
|
|
248
|
+
- Use "outbound clicks" or "landing page views" for continuity
|
|
249
|
+
|
|
250
|
+
### Meta Shops Native Checkout Phase-Out (June-August 2025)
|
|
251
|
+
- Native in-app checkout phased out between June and August 2025
|
|
252
|
+
- All checkout flows now redirect to the advertiser's website
|
|
253
|
+
- Update any campaigns relying on Shops checkout conversion events
|
|
254
|
+
|
|
255
|
+
### Google Call Ads Deprecation
|
|
256
|
+
- **February 2026**: No new call-only ad creation permitted
|
|
257
|
+
- **February 2027**: Existing call ads stop serving entirely
|
|
258
|
+
- **Migration path**: Use call assets (extensions) within Responsive Search Ads (RSAs)
|
|
259
|
+
|
|
260
|
+
### Apple Ads Rebrand (April 2025)
|
|
261
|
+
- "Apple Search Ads" officially renamed to **"Apple Ads"**
|
|
262
|
+
- Reflects expanded inventory beyond App Store search (Today tab, Search tab, product pages)
|
|
263
|
+
- Update all client-facing reports and documentation to use new branding
|
|
264
|
+
|
|
265
|
+
### EU Sponsored Messaging: LinkedIn (Discontinued Jan 2022)
|
|
266
|
+
- Message Ads and Conversation Ads **cannot be delivered to EU members** since January 2022
|
|
267
|
+
- LinkedIn removed EU targeting for these formats due to ePrivacy Directive
|
|
268
|
+
- **Never recommend Message/Conversation Ads for EU-targeting campaigns**
|
|
269
|
+
- Use alternative formats: Sponsored Content, Lead Gen Forms, or InMail via Sales Navigator
|
|
270
|
+
|
|
271
|
+
### Google Enhanced CPC (ECPC): Fully Deprecated (March 2025)
|
|
272
|
+
- ECPC bidding strategy **fully removed** as of March 2025
|
|
273
|
+
- Existing ECPC campaigns auto-migrated to Manual CPC (no bid adjustments)
|
|
274
|
+
- Recommended migration: Target CPA or Maximize Conversions with optional target
|
|
275
|
+
|
|
276
|
+
### Google Rule-Based Attribution Models (Deprecated)
|
|
277
|
+
- First click, linear, time decay, and position-based attribution models all removed
|
|
278
|
+
- All campaigns using these models were **auto-upgraded to Data-Driven Attribution (DDA)**
|
|
279
|
+
- DDA is now the only multi-touch attribution option in Google Ads
|
|
280
|
+
- Audit note: flag any client reports still referencing legacy attribution models
|