Commit
·
b3adf58
1
Parent(s):
da4a2eb
added auto insurance niche
Browse files- data/auto_insurance.py +738 -0
- data/frameworks.py +1 -0
- data/triggers.py +1 -0
- data/visuals.py +6 -0
- frontend/components/generation/BatchForm.tsx +1 -0
- frontend/components/generation/ExtensiveForm.tsx +2 -1
- frontend/components/generation/GenerationForm.tsx +1 -0
- main.py +10 -10
- services/generator.py +2 -1
- services/trend_monitor.py +5 -0
data/auto_insurance.py
ADDED
|
@@ -0,0 +1,738 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Auto Insurance - Complete Psychological Arsenal
|
| 3 |
+
All strategies: fear, urgency, savings, authority, loss aversion, etc.
|
| 4 |
+
Updated with winning ad patterns from high-converting creative analysis.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
# ============================================================================
|
| 8 |
+
# SECTION 1: PSYCHOLOGICAL STRATEGIES
|
| 9 |
+
# ============================================================================
|
| 10 |
+
|
| 11 |
+
STRATEGIES = {
|
| 12 |
+
# ------------------------------------------------------------------------
|
| 13 |
+
# Winning Strategies (High-Converting Patterns)
|
| 14 |
+
# ------------------------------------------------------------------------
|
| 15 |
+
|
| 16 |
+
"accusation_opener": {
|
| 17 |
+
"name": "Accusation Opener",
|
| 18 |
+
"description": "Direct accusation triggers immediate loss aversion - 'OVERPAYING?' style",
|
| 19 |
+
"hooks": [
|
| 20 |
+
"OVERPAYING?",
|
| 21 |
+
"Still Overpaying For Car Insurance?",
|
| 22 |
+
"Wasting $847/year On Auto Insurance?",
|
| 23 |
+
"Are You Being Overcharged?",
|
| 24 |
+
"Paying Too Much? Most Drivers Are.",
|
| 25 |
+
"Your Insurance Company Is Overcharging You",
|
| 26 |
+
"Stop Getting Ripped Off On Car Insurance",
|
| 27 |
+
"You're Probably Paying Double",
|
| 28 |
+
"Why Are You Still Paying Full Price?",
|
| 29 |
+
"Being Overcharged Without Knowing It?",
|
| 30 |
+
"Throwing Money Away Every Month?",
|
| 31 |
+
"Your Premium Is Too High. Here's Proof.",
|
| 32 |
+
],
|
| 33 |
+
"visual_styles": [
|
| 34 |
+
"person holding insurance bill, frustrated expression, accusatory",
|
| 35 |
+
"frustrated driver looking at renewal notice, red 'OVERPAYING?' text",
|
| 36 |
+
"money flying away from car, loss visualization",
|
| 37 |
+
"comparison of high vs low price with red X on high price",
|
| 38 |
+
"person counting money with worried expression",
|
| 39 |
+
"wallet being emptied at gas station, coins and bills falling out",
|
| 40 |
+
],
|
| 41 |
+
},
|
| 42 |
+
|
| 43 |
+
"curiosity_gap": {
|
| 44 |
+
"name": "Curiosity Gap",
|
| 45 |
+
"description": "Open loop with 'THIS' or 'Instead' demands click - highest CTR pattern",
|
| 46 |
+
"hooks": [
|
| 47 |
+
"Drivers Are Ditching Their Auto Insurance & Doing This Instead",
|
| 48 |
+
"Thousands of drivers are dropping their insurance after THIS",
|
| 49 |
+
"Drivers Over 50 Are Switching To THIS",
|
| 50 |
+
"What Smart Drivers Know About Car Insurance",
|
| 51 |
+
"The Secret Insurance Companies Don't Want You To Know",
|
| 52 |
+
"Everyone's Switching. Here's Why.",
|
| 53 |
+
"This Is Why Your Neighbors Pay Less",
|
| 54 |
+
"What 2,437 Drivers In Your Area Just Discovered",
|
| 55 |
+
"The Loophole Drivers Are Using",
|
| 56 |
+
"They Found Something Better. Have You?",
|
| 57 |
+
"After Seeing THIS, You'll Never Overpay Again",
|
| 58 |
+
"One Simple Change Saves Thousands",
|
| 59 |
+
],
|
| 60 |
+
"visual_styles": [
|
| 61 |
+
"driver looking at odometer or dashboard, candid documentary",
|
| 62 |
+
"collage with driver's license and insurance card",
|
| 63 |
+
"person reading document with surprised expression",
|
| 64 |
+
"group of drivers with knowing expressions",
|
| 65 |
+
"person pointing at hidden information, reveal moment",
|
| 66 |
+
"before/after document comparison with circled numbers",
|
| 67 |
+
],
|
| 68 |
+
},
|
| 69 |
+
|
| 70 |
+
"specific_price_anchor": {
|
| 71 |
+
"name": "Specific Price Anchor",
|
| 72 |
+
"description": "Oddly specific prices ($47.33 not $50) create instant believability",
|
| 73 |
+
"hooks": [
|
| 74 |
+
"Car Insurance for as low as $29/month",
|
| 75 |
+
"Auto Insurance with coverage as low as $29/month",
|
| 76 |
+
"$67.33/month For Full Coverage",
|
| 77 |
+
"Pay Just $37/month Instead of $150+",
|
| 78 |
+
"Locked In At $42/month",
|
| 79 |
+
"Full Protection For $1.25/day",
|
| 80 |
+
"Coverage From $29/month",
|
| 81 |
+
"$57/month Beats Your Current Rate",
|
| 82 |
+
"Most Drivers Qualify For $39/month",
|
| 83 |
+
"Switch And Pay Just $63/month",
|
| 84 |
+
"Rates Starting At $27.50/month",
|
| 85 |
+
],
|
| 86 |
+
"visual_styles": [
|
| 87 |
+
"giant price number $29 in teal/bold color, age buttons below",
|
| 88 |
+
"clean white background, price dominant, age selector: 18-35, 36-55, 56+",
|
| 89 |
+
"BLACK FRIDAY style with specific price and gold balloons",
|
| 90 |
+
"price comparison showing crossed-out high price, new low price",
|
| 91 |
+
"calculator interface showing specific savings number",
|
| 92 |
+
"insurance card or policy showing exact monthly amount",
|
| 93 |
+
],
|
| 94 |
+
},
|
| 95 |
+
|
| 96 |
+
"before_after_proof": {
|
| 97 |
+
"name": "Before/After Proof",
|
| 98 |
+
"description": "Specific savings numbers with visual proof creates social proof",
|
| 99 |
+
"hooks": [
|
| 100 |
+
"WAS: $1,842 → NOW: $647",
|
| 101 |
+
"How I Dropped My Premium By $1,195/year",
|
| 102 |
+
"Paid $2,200. Now Pay $756.",
|
| 103 |
+
"From $167/month To $57/month",
|
| 104 |
+
"Cut My Bill In Half. Here's How.",
|
| 105 |
+
"Saved $1,147 In 5 Minutes",
|
| 106 |
+
"Before: $2,400/year After: $780/year",
|
| 107 |
+
"My Friend Showed Me How To Save $900",
|
| 108 |
+
"Real Savings: $1,356 Less Per Year",
|
| 109 |
+
"Went From Overpaying To Saving Big",
|
| 110 |
+
"The 5-Minute Switch That Saved Me $1,200",
|
| 111 |
+
],
|
| 112 |
+
"visual_styles": [
|
| 113 |
+
"real driver 30-55 holding document with circled numbers, testimonial",
|
| 114 |
+
"before/after price bar: red 'WAS' vs green 'NOW'",
|
| 115 |
+
"split screen: old bill vs new bill with circles",
|
| 116 |
+
"person giving thumbs up with savings numbers visible",
|
| 117 |
+
"calculator or phone showing savings calculation",
|
| 118 |
+
"happy driver reviewing lower insurance bill in car",
|
| 119 |
+
],
|
| 120 |
+
},
|
| 121 |
+
|
| 122 |
+
"quiz_interactive": {
|
| 123 |
+
"name": "Quiz/Interactive",
|
| 124 |
+
"description": "Quiz format drives engagement and self-selection",
|
| 125 |
+
"hooks": [
|
| 126 |
+
"What Year Is Your Car?",
|
| 127 |
+
"Tap Your Age To Calculate Your New Rate",
|
| 128 |
+
"Answer 3 Questions. See Your Rate.",
|
| 129 |
+
"How Many Miles Do You Drive?",
|
| 130 |
+
"Check Your Eligibility In 60 Seconds",
|
| 131 |
+
"Take The 30-Second Quiz",
|
| 132 |
+
"Select Your Age Bracket",
|
| 133 |
+
"When Did You Last Shop For Insurance?",
|
| 134 |
+
"Find Your New Rate - 2 Questions",
|
| 135 |
+
"See If You Qualify For Lower Rates",
|
| 136 |
+
"Quick Quiz: How Much Can You Save?",
|
| 137 |
+
"Select Your State To See Rates",
|
| 138 |
+
],
|
| 139 |
+
"visual_styles": [
|
| 140 |
+
"iPhone Notes app dark mode with checkboxes: 2010 or older, 2010-2020, 2020+",
|
| 141 |
+
"age selector buttons: 18-35 (yellow), 36-55 (blue), 56+ (red)",
|
| 142 |
+
"quiz interface with multiple choice options",
|
| 143 |
+
"clean UI with 'Tap below to see your rate'",
|
| 144 |
+
"interactive calculator mockup",
|
| 145 |
+
"state selection dropdown or map interface",
|
| 146 |
+
],
|
| 147 |
+
},
|
| 148 |
+
|
| 149 |
+
"authority_transfer": {
|
| 150 |
+
"name": "Authority Transfer",
|
| 151 |
+
"description": "Transfer trust from government/institutions - highest trust pattern",
|
| 152 |
+
"hooks": [
|
| 153 |
+
"State Farm & GEICO Competitors Bring Savings!",
|
| 154 |
+
"Sponsored by Major Insurance Providers",
|
| 155 |
+
"Government Program For Safe Drivers",
|
| 156 |
+
"New State Program Cuts Insurance Costs",
|
| 157 |
+
"Federal Assistance For Drivers Over 50",
|
| 158 |
+
"Official: Safe Drivers Qualify For Reduced Rates",
|
| 159 |
+
"State-Approved Savings Program",
|
| 160 |
+
"DMV-Verified Rate Reduction",
|
| 161 |
+
"Senior Drivers: New Benefit Available",
|
| 162 |
+
"Good Drivers: Check Eligibility",
|
| 163 |
+
"Official Notice: Rate Reduction Program",
|
| 164 |
+
"State Insurance Commission Announces Savings",
|
| 165 |
+
],
|
| 166 |
+
"visual_styles": [
|
| 167 |
+
"official seal, government document aesthetic",
|
| 168 |
+
"driver's license with official badge background",
|
| 169 |
+
"official letterhead style with seal and formal typography",
|
| 170 |
+
"state capitol building with official banner",
|
| 171 |
+
"government form aesthetic with checkboxes",
|
| 172 |
+
"DMV or insurance commission seal visible",
|
| 173 |
+
],
|
| 174 |
+
},
|
| 175 |
+
|
| 176 |
+
"identity_targeting": {
|
| 177 |
+
"name": "Identity Targeting",
|
| 178 |
+
"description": "Direct demographic callout creates instant self-selection",
|
| 179 |
+
"hooks": [
|
| 180 |
+
"Drivers Won't Have To Pay More Than $39 A Month",
|
| 181 |
+
"Drivers Over 50: Check Your Eligibility",
|
| 182 |
+
"Safe drivers over the age of 50...",
|
| 183 |
+
"If You're 50+ And Drive, Read This",
|
| 184 |
+
"Attention: Drivers Born Before 1975",
|
| 185 |
+
"For Drivers 55 And Older",
|
| 186 |
+
"65+ Drivers: New Rate Available",
|
| 187 |
+
"Baby Boomers: Insurance Relief Is Here",
|
| 188 |
+
"Retired Drivers: Special Program",
|
| 189 |
+
"If You Drive And You're Over 50...",
|
| 190 |
+
"Senior Citizen Auto Insurance Rates",
|
| 191 |
+
"Safe Drivers Turning 65 This Year",
|
| 192 |
+
],
|
| 193 |
+
"visual_styles": [
|
| 194 |
+
"four diverse driver faces in portrait style, dignified, relatable",
|
| 195 |
+
"real senior driver in their car, trustworthy",
|
| 196 |
+
"driver looking at camera, confident expression",
|
| 197 |
+
"multiple drivers of different ages, inclusive",
|
| 198 |
+
"senior holding insurance card, testimonial style",
|
| 199 |
+
"mature hands on steering wheel or holding keys",
|
| 200 |
+
],
|
| 201 |
+
},
|
| 202 |
+
|
| 203 |
+
"insider_secret": {
|
| 204 |
+
"name": "Insider Secret",
|
| 205 |
+
"description": "Exclusivity and hidden knowledge framing",
|
| 206 |
+
"hooks": [
|
| 207 |
+
"The Easiest Way To Cut Car Insurance Bills",
|
| 208 |
+
"What Insurance Companies Don't Want You To Know",
|
| 209 |
+
"The Loophole That Saves Thousands",
|
| 210 |
+
"Former Agent Reveals Industry Secret",
|
| 211 |
+
"The Trick Your Insurance Company Hides",
|
| 212 |
+
"Why Insiders Pay 40% Less",
|
| 213 |
+
"The One Thing That Cuts Your Premium In Half",
|
| 214 |
+
"What They Don't Tell You About Auto Insurance",
|
| 215 |
+
"Insurance Industry Insider Speaks Out",
|
| 216 |
+
"The Secret Smart Drivers Use",
|
| 217 |
+
"Hidden Discount Most People Miss",
|
| 218 |
+
"The Backdoor To Lower Rates",
|
| 219 |
+
],
|
| 220 |
+
"visual_styles": [
|
| 221 |
+
"person whispering or revealing secret, documentary candid",
|
| 222 |
+
"document being unveiled or revealed",
|
| 223 |
+
"insider/whistleblower aesthetic, anonymous feel",
|
| 224 |
+
"magnifying glass over insurance policy",
|
| 225 |
+
"hidden text being exposed or highlighted",
|
| 226 |
+
"person looking over shoulder, sharing secret",
|
| 227 |
+
],
|
| 228 |
+
},
|
| 229 |
+
|
| 230 |
+
# ------------------------------------------------------------------------
|
| 231 |
+
# Core Psychological Strategies
|
| 232 |
+
# ------------------------------------------------------------------------
|
| 233 |
+
|
| 234 |
+
"fear_based": {
|
| 235 |
+
"name": "Fear-Based",
|
| 236 |
+
"description": "Trigger fear of accidents, tickets, and worst-case scenarios",
|
| 237 |
+
"hooks": [
|
| 238 |
+
"One accident could bankrupt you",
|
| 239 |
+
"Are you one fender-bender away from financial ruin?",
|
| 240 |
+
"Uninsured? One ticket costs $5,000+",
|
| 241 |
+
"Driving without coverage is illegal",
|
| 242 |
+
"What if you hit someone tomorrow?",
|
| 243 |
+
"Medical bills from one crash: $250,000",
|
| 244 |
+
"Your family could lose everything",
|
| 245 |
+
"Lawsuit from one accident could take your house",
|
| 246 |
+
"Can you afford a $50,000 hospital bill?",
|
| 247 |
+
"Police are cracking down on uninsured drivers",
|
| 248 |
+
"The average car accident costs $57,000",
|
| 249 |
+
"Are you gambling with your family's future?",
|
| 250 |
+
],
|
| 251 |
+
"visual_styles": [
|
| 252 |
+
"car accident scene with vintage film grain, documentary footage",
|
| 253 |
+
"damaged car on roadside with old VHS quality",
|
| 254 |
+
"police lights flashing, aged documentary photography",
|
| 255 |
+
"worried driver after minor accident, candid shot",
|
| 256 |
+
"tow truck removing damaged vehicle, old news footage aesthetic",
|
| 257 |
+
"hospital bills on dashboard, vintage feel",
|
| 258 |
+
],
|
| 259 |
+
},
|
| 260 |
+
|
| 261 |
+
"urgency_scarcity": {
|
| 262 |
+
"name": "Urgency & Scarcity",
|
| 263 |
+
"description": "Create time pressure and limited availability",
|
| 264 |
+
"hooks": [
|
| 265 |
+
"Rates increasing in 48 hours",
|
| 266 |
+
"Last chance for 2024 pricing",
|
| 267 |
+
"Only 23 spots left at this rate",
|
| 268 |
+
"Offer expires midnight",
|
| 269 |
+
"Insurers are RAISING rates in your area",
|
| 270 |
+
"Lock in before it's too late",
|
| 271 |
+
"Price hike coming January 1st",
|
| 272 |
+
"Limited-time discount ending soon",
|
| 273 |
+
"Your quote expires in 24 hours",
|
| 274 |
+
"Enrollment window closing",
|
| 275 |
+
"Act now or pay 30% more next month",
|
| 276 |
+
"Final warning: rates going up",
|
| 277 |
+
],
|
| 278 |
+
"visual_styles": [
|
| 279 |
+
"countdown timer graphic, urgent red colors",
|
| 280 |
+
"calendar with deadline circled",
|
| 281 |
+
"clock showing almost midnight",
|
| 282 |
+
"red URGENT stamp on documents",
|
| 283 |
+
"limited time banner, expiring offer",
|
| 284 |
+
],
|
| 285 |
+
},
|
| 286 |
+
|
| 287 |
+
"social_proof_fomo": {
|
| 288 |
+
"name": "Social Proof & FOMO",
|
| 289 |
+
"description": "Show others are doing it, create fear of missing out",
|
| 290 |
+
"hooks": [
|
| 291 |
+
"2,437 drivers in your area switched THIS WEEK",
|
| 292 |
+
"Your neighbors are saving. Are you?",
|
| 293 |
+
"Join 3.7 million smart drivers",
|
| 294 |
+
"Why is everyone switching?",
|
| 295 |
+
"The #1 choice for drivers in 2024",
|
| 296 |
+
"9 out of 10 drivers recommend this",
|
| 297 |
+
"Everyone in your neighborhood is saving. Except you?",
|
| 298 |
+
"Don't be the last one overpaying",
|
| 299 |
+
"Over 1 million claims paid this year",
|
| 300 |
+
"Rated #1 by Consumer Reports",
|
| 301 |
+
"The insurance your neighbors trust",
|
| 302 |
+
"Smart drivers are making the switch",
|
| 303 |
+
],
|
| 304 |
+
"visual_styles": [
|
| 305 |
+
"happy drivers in neighborhood, protected",
|
| 306 |
+
"map showing covered drivers in area",
|
| 307 |
+
"crowd of satisfied customers",
|
| 308 |
+
"testimonial collage of happy drivers",
|
| 309 |
+
"5-star rating badges, trust indicators",
|
| 310 |
+
],
|
| 311 |
+
},
|
| 312 |
+
|
| 313 |
+
"guilt_shame": {
|
| 314 |
+
"name": "Guilt & Shame",
|
| 315 |
+
"description": "Trigger guilt about family responsibility",
|
| 316 |
+
"hooks": [
|
| 317 |
+
"Can you look your family in the eye without coverage?",
|
| 318 |
+
"Your kids are counting on you",
|
| 319 |
+
"Don't let them down",
|
| 320 |
+
"Responsible drivers don't gamble with their family's future",
|
| 321 |
+
"What will you tell your kids after an accident?",
|
| 322 |
+
"A real parent protects their family",
|
| 323 |
+
"Your spouse trusts you to keep them safe",
|
| 324 |
+
"Failure to protect is a choice",
|
| 325 |
+
"They're depending on you. Don't fail them.",
|
| 326 |
+
"Would your family forgive you?",
|
| 327 |
+
"Every mile without coverage is a risk to your family",
|
| 328 |
+
"What kind of driver are you?",
|
| 329 |
+
],
|
| 330 |
+
"visual_styles": [
|
| 331 |
+
"parent looking worried with kids in backseat",
|
| 332 |
+
"family photo with protective imagery",
|
| 333 |
+
"father looking at damaged car, regret",
|
| 334 |
+
"mother with child, concerned expression",
|
| 335 |
+
"car seat in damaged vehicle, emotional impact",
|
| 336 |
+
],
|
| 337 |
+
},
|
| 338 |
+
|
| 339 |
+
"greed_savings": {
|
| 340 |
+
"name": "Greed & Savings",
|
| 341 |
+
"description": "Appeal to desire to save money and get more",
|
| 342 |
+
"hooks": [
|
| 343 |
+
"You're overpaying by $1,147/year",
|
| 344 |
+
"Stop throwing money away",
|
| 345 |
+
"Get $500 back instantly",
|
| 346 |
+
"Why pay more for less?",
|
| 347 |
+
"Save up to 45% on your premium",
|
| 348 |
+
"Free quote reveals your savings",
|
| 349 |
+
"Most drivers can save $900+",
|
| 350 |
+
"You're leaving money on the table",
|
| 351 |
+
"Switch and save in 5 minutes",
|
| 352 |
+
"Same coverage. Half the price.",
|
| 353 |
+
"Get more coverage for less money",
|
| 354 |
+
"Stop wasting money on overpriced insurance",
|
| 355 |
+
],
|
| 356 |
+
"visual_styles": [
|
| 357 |
+
"stack of cash, money savings",
|
| 358 |
+
"piggy bank overflowing with coins",
|
| 359 |
+
"comparison chart showing savings",
|
| 360 |
+
"happy driver reviewing lower bills in car",
|
| 361 |
+
"calculator showing big savings number",
|
| 362 |
+
"wallet with money, financial freedom",
|
| 363 |
+
],
|
| 364 |
+
},
|
| 365 |
+
|
| 366 |
+
"authority_trust": {
|
| 367 |
+
"name": "Authority & Trust",
|
| 368 |
+
"description": "Leverage expert credibility and insider knowledge",
|
| 369 |
+
"hooks": [
|
| 370 |
+
"Former agent reveals the truth",
|
| 371 |
+
"Industry insider secret exposed",
|
| 372 |
+
"A+ rated, 75 years trusted",
|
| 373 |
+
"Backed by major insurers",
|
| 374 |
+
"Exposed: The coverage gap trap",
|
| 375 |
+
"Insurance agent confessions",
|
| 376 |
+
"The dirty secret of cheap policies",
|
| 377 |
+
"What your agent isn't telling you",
|
| 378 |
+
"BBB accredited with zero complaints",
|
| 379 |
+
"Trusted by millions of drivers",
|
| 380 |
+
"Licensed in all 50 states",
|
| 381 |
+
],
|
| 382 |
+
"visual_styles": [
|
| 383 |
+
"professional insurance agent, trustworthy",
|
| 384 |
+
"A+ rating badge, gold seal",
|
| 385 |
+
"official documents, certificates",
|
| 386 |
+
"expert in business attire",
|
| 387 |
+
"trust badges, security icons",
|
| 388 |
+
"newspaper headline style, exposed",
|
| 389 |
+
],
|
| 390 |
+
},
|
| 391 |
+
|
| 392 |
+
"loss_aversion": {
|
| 393 |
+
"name": "Loss Aversion",
|
| 394 |
+
"description": "Emphasize what they stand to lose",
|
| 395 |
+
"hooks": [
|
| 396 |
+
"Everything you've worked for - GONE after one crash",
|
| 397 |
+
"Average accident costs $57,000 in damages",
|
| 398 |
+
"You can't get back what's already lost",
|
| 399 |
+
"Your savings. Your car. Your future. Gone.",
|
| 400 |
+
"One lawsuit could take everything",
|
| 401 |
+
"Imagine losing it all tomorrow",
|
| 402 |
+
"The average accident destroys years of savings",
|
| 403 |
+
"Your life's work, wiped out in seconds",
|
| 404 |
+
"What would you do if sued for $250,000?",
|
| 405 |
+
"Some things can never be replaced",
|
| 406 |
+
"Everything you own could be at risk",
|
| 407 |
+
"Your assets, your peace of mind, your security",
|
| 408 |
+
],
|
| 409 |
+
"visual_styles": [
|
| 410 |
+
"before/after accident comparison",
|
| 411 |
+
"damaged car in lot, total loss",
|
| 412 |
+
"family photo with worried expression",
|
| 413 |
+
"empty driveway where car used to be",
|
| 414 |
+
"lawsuit papers on dashboard",
|
| 415 |
+
"bank account with zero balance",
|
| 416 |
+
],
|
| 417 |
+
},
|
| 418 |
+
|
| 419 |
+
"anchoring": {
|
| 420 |
+
"name": "Anchoring",
|
| 421 |
+
"description": "Compare high value to low cost",
|
| 422 |
+
"hooks": [
|
| 423 |
+
"Coverage worth $100,000 for just $37/month",
|
| 424 |
+
"Compared to losing everything, $1.25/day is nothing",
|
| 425 |
+
"Full protection for less than your coffee habit",
|
| 426 |
+
"Your car is worth $30K. Protection is $29/month.",
|
| 427 |
+
"Accident cost: $50,000. Coverage cost: $42/month.",
|
| 428 |
+
"Insurance: $35/month. Lawsuit: $250,000.",
|
| 429 |
+
"Skip one lunch a week. Protect everything you own.",
|
| 430 |
+
"The cost of not having insurance: everything",
|
| 431 |
+
"$1.00/day protects $100,000 in assets",
|
| 432 |
+
"Cheaper than your streaming subscription",
|
| 433 |
+
],
|
| 434 |
+
"visual_styles": [
|
| 435 |
+
"scale comparing cost vs value",
|
| 436 |
+
"coffee cup vs car comparison",
|
| 437 |
+
"small price tag vs big protection",
|
| 438 |
+
"simple math equation graphic",
|
| 439 |
+
"price comparison infographic",
|
| 440 |
+
],
|
| 441 |
+
},
|
| 442 |
+
|
| 443 |
+
"simplicity": {
|
| 444 |
+
"name": "Simplicity & Ease",
|
| 445 |
+
"description": "Emphasize how easy it is to get covered",
|
| 446 |
+
"hooks": [
|
| 447 |
+
"Get covered in 3 minutes",
|
| 448 |
+
"One click. Full protection.",
|
| 449 |
+
"No paperwork. No hassle.",
|
| 450 |
+
"Quote in 60 seconds",
|
| 451 |
+
"The easiest insurance you'll ever buy",
|
| 452 |
+
"Set it and forget it protection",
|
| 453 |
+
"Online in minutes, protected for years",
|
| 454 |
+
"Skip the agent. Save time and money.",
|
| 455 |
+
"Apply from your phone",
|
| 456 |
+
"Instant quote, instant coverage",
|
| 457 |
+
"The lazy driver's insurance solution",
|
| 458 |
+
"Why is getting insurance still this hard? (It isn't anymore)",
|
| 459 |
+
],
|
| 460 |
+
"visual_styles": [
|
| 461 |
+
"person on phone in car, relaxed",
|
| 462 |
+
"simple 3-step process graphic",
|
| 463 |
+
"checkmark, done, complete icons",
|
| 464 |
+
"happy person with phone showing quote",
|
| 465 |
+
"clean, minimal interface screenshot",
|
| 466 |
+
],
|
| 467 |
+
},
|
| 468 |
+
|
| 469 |
+
"comparison_envy": {
|
| 470 |
+
"name": "Comparison & Envy",
|
| 471 |
+
"description": "Compare to others who are better protected",
|
| 472 |
+
"hooks": [
|
| 473 |
+
"Your coworker pays less and gets more coverage",
|
| 474 |
+
"Why are smart drivers switching?",
|
| 475 |
+
"They're protected. Why aren't you?",
|
| 476 |
+
"Same car. Same record. Half the premium.",
|
| 477 |
+
"What do they know that you don't?",
|
| 478 |
+
"Your friend just saved $900. Your turn.",
|
| 479 |
+
"Your colleague's claim was covered. Would yours be?",
|
| 480 |
+
"Everyone's switching. What are you waiting for?",
|
| 481 |
+
"Don't be the only unprotected driver",
|
| 482 |
+
"Your neighbor's accident was covered. Would yours be?",
|
| 483 |
+
],
|
| 484 |
+
"visual_styles": [
|
| 485 |
+
"two cars side by side, one protected",
|
| 486 |
+
"neighbor comparison graphic",
|
| 487 |
+
"protected driver vs exposed driver",
|
| 488 |
+
"happy driver vs worried driver",
|
| 489 |
+
"community showing coverage differences",
|
| 490 |
+
],
|
| 491 |
+
},
|
| 492 |
+
|
| 493 |
+
"transformation": {
|
| 494 |
+
"name": "Transformation & Peace",
|
| 495 |
+
"description": "Show the transformation from worry to peace",
|
| 496 |
+
"hooks": [
|
| 497 |
+
"From worried to worry-free in 5 minutes",
|
| 498 |
+
"Drive confidently knowing you're covered",
|
| 499 |
+
"Finally, peace of mind on the road",
|
| 500 |
+
"Stop worrying. Start driving.",
|
| 501 |
+
"Imagine never worrying about accidents again",
|
| 502 |
+
"The weight off your shoulders",
|
| 503 |
+
"From stressed to blessed",
|
| 504 |
+
"Drive your life. We'll protect your car.",
|
| 505 |
+
"Worry-free driving starts here",
|
| 506 |
+
"Breathe easy. You're protected.",
|
| 507 |
+
],
|
| 508 |
+
"visual_styles": [
|
| 509 |
+
"relaxed driver on peaceful road",
|
| 510 |
+
"person driving peacefully",
|
| 511 |
+
"before/after: worried vs happy driver",
|
| 512 |
+
"open road, secure feeling",
|
| 513 |
+
"family enjoying road trip, not worrying",
|
| 514 |
+
],
|
| 515 |
+
},
|
| 516 |
+
}
|
| 517 |
+
|
| 518 |
+
# ============================================================================
|
| 519 |
+
# SECTION 2: HIGH-CONVERTING VISUAL LIBRARY
|
| 520 |
+
# ============================================================================
|
| 521 |
+
|
| 522 |
+
PROTECTION_SAFETY_VISUALS = [
|
| 523 |
+
"driver confidently behind wheel, daylight",
|
| 524 |
+
"car parked safely in driveway, protected",
|
| 525 |
+
"parent with kids buckled safely in backseat",
|
| 526 |
+
"calm driving while storm clouds in distance",
|
| 527 |
+
"hands on steering wheel, confident grip",
|
| 528 |
+
"car + checkmark overlay, protected",
|
| 529 |
+
]
|
| 530 |
+
|
| 531 |
+
ACCIDENT_FEAR_VISUALS = [
|
| 532 |
+
"half image: safe car / damaged car",
|
| 533 |
+
"minor fender bender, manageable damage",
|
| 534 |
+
"cracked windshield close-up",
|
| 535 |
+
"dented bumper on roadside",
|
| 536 |
+
"flat tire by highway",
|
| 537 |
+
"damaged car blurred in background, intact one sharp",
|
| 538 |
+
]
|
| 539 |
+
|
| 540 |
+
FAMILY_SAFETY_VISUALS = [
|
| 541 |
+
"parents with kids in car seats, secure",
|
| 542 |
+
"child buckled in backseat safely",
|
| 543 |
+
"family loading car for road trip",
|
| 544 |
+
"parent checking mirrors with kids inside",
|
| 545 |
+
"multi-generational family in SUV",
|
| 546 |
+
]
|
| 547 |
+
|
| 548 |
+
FIRST_TIME_DRIVER_VISUALS = [
|
| 549 |
+
"teenager holding new driver's license",
|
| 550 |
+
"new driver with keys, excited",
|
| 551 |
+
"first car purchase, proud moment",
|
| 552 |
+
"SOLD sign outside dealership",
|
| 553 |
+
"young driver + nervous parent",
|
| 554 |
+
]
|
| 555 |
+
|
| 556 |
+
VEHICLE_ASSET_VISUALS = [
|
| 557 |
+
"beautiful car at sunset",
|
| 558 |
+
"clean driveway + new car parked",
|
| 559 |
+
"car with subtle price tag icon",
|
| 560 |
+
"car loan documents overlay",
|
| 561 |
+
"before/after car detailing shots",
|
| 562 |
+
]
|
| 563 |
+
|
| 564 |
+
PROBLEM_RISK_VISUALS = [
|
| 565 |
+
"minor fender bender damage",
|
| 566 |
+
"cracked windshield repair",
|
| 567 |
+
"tire blowout on highway",
|
| 568 |
+
"hail damage on hood",
|
| 569 |
+
"parking lot door ding",
|
| 570 |
+
"weather damage to vehicle",
|
| 571 |
+
]
|
| 572 |
+
|
| 573 |
+
RELIEF_VISUALS = [
|
| 574 |
+
"sunlight after rain over car",
|
| 575 |
+
"driver relaxing after safe arrival",
|
| 576 |
+
"family safe after road trip",
|
| 577 |
+
"car with insurance card visible",
|
| 578 |
+
"coffee in car, peaceful morning commute",
|
| 579 |
+
]
|
| 580 |
+
|
| 581 |
+
FINANCIAL_VISUALS = [
|
| 582 |
+
"official-looking insurance documents",
|
| 583 |
+
"phone with insurance app open",
|
| 584 |
+
"car + savings icon",
|
| 585 |
+
"insurance card on dashboard",
|
| 586 |
+
"calculator + paperwork in car",
|
| 587 |
+
]
|
| 588 |
+
|
| 589 |
+
COMPARISON_CHOICE_VISUALS = [
|
| 590 |
+
"insured vs uninsured driver split",
|
| 591 |
+
"cheap insurance vs proper coverage",
|
| 592 |
+
"umbrella over car vs rain",
|
| 593 |
+
"shield vs hazard symbol",
|
| 594 |
+
]
|
| 595 |
+
|
| 596 |
+
MINIMAL_SYMBOLIC_VISUALS = [
|
| 597 |
+
"simple car icon + shield",
|
| 598 |
+
"line-art car with lock",
|
| 599 |
+
"car inside protective bubble",
|
| 600 |
+
"steering wheel with checkmark",
|
| 601 |
+
"key + car silhouette",
|
| 602 |
+
]
|
| 603 |
+
|
| 604 |
+
LIFESTYLE_VISUALS = [
|
| 605 |
+
"morning commute, peaceful drive",
|
| 606 |
+
"weekend road trip with family",
|
| 607 |
+
"car parked at scenic overlook",
|
| 608 |
+
"daily routine, coffee and drive",
|
| 609 |
+
"highway aerial shot, traffic flow",
|
| 610 |
+
]
|
| 611 |
+
|
| 612 |
+
TEXT_FIRST_VISUALS = [
|
| 613 |
+
"text overlay: 'This driver is insured. Are you?'",
|
| 614 |
+
"text overlay: 'Most drivers are underinsured.'",
|
| 615 |
+
"text overlay: 'Hope is not a plan.'",
|
| 616 |
+
"text overlay: 'One accident can change everything.'",
|
| 617 |
+
]
|
| 618 |
+
|
| 619 |
+
SEASONAL_VISUALS = [
|
| 620 |
+
"rain driving (wet road safety)",
|
| 621 |
+
"summer heat (breakdown risk)",
|
| 622 |
+
"winter snow conditions",
|
| 623 |
+
"road trip season",
|
| 624 |
+
]
|
| 625 |
+
|
| 626 |
+
HIGH_CONVERTING_VISUAL_LIBRARY = (
|
| 627 |
+
PROTECTION_SAFETY_VISUALS +
|
| 628 |
+
ACCIDENT_FEAR_VISUALS +
|
| 629 |
+
FAMILY_SAFETY_VISUALS +
|
| 630 |
+
FIRST_TIME_DRIVER_VISUALS +
|
| 631 |
+
VEHICLE_ASSET_VISUALS +
|
| 632 |
+
PROBLEM_RISK_VISUALS +
|
| 633 |
+
RELIEF_VISUALS +
|
| 634 |
+
FINANCIAL_VISUALS +
|
| 635 |
+
COMPARISON_CHOICE_VISUALS +
|
| 636 |
+
MINIMAL_SYMBOLIC_VISUALS +
|
| 637 |
+
LIFESTYLE_VISUALS +
|
| 638 |
+
TEXT_FIRST_VISUALS +
|
| 639 |
+
SEASONAL_VISUALS
|
| 640 |
+
)
|
| 641 |
+
|
| 642 |
+
# ============================================================================
|
| 643 |
+
# SECTION 3: CREATIVE ELEMENTS
|
| 644 |
+
# ============================================================================
|
| 645 |
+
|
| 646 |
+
CREATIVE_DIRECTIONS = [
|
| 647 |
+
"accusatory", # Direct accusation style
|
| 648 |
+
"curiosity-driven", # Open loop/secret style
|
| 649 |
+
"price-focused", # Price anchor emphasis
|
| 650 |
+
"proof-based", # Evidence/testimonial style
|
| 651 |
+
"quiz-interactive", # Interactive/engagement style
|
| 652 |
+
"authority-backed", # Authority/trust transfer
|
| 653 |
+
"identity-targeted", # Demographic callout
|
| 654 |
+
"insider-reveal", # Exclusive/hidden knowledge
|
| 655 |
+
"urgent", # Time-sensitive urgency
|
| 656 |
+
]
|
| 657 |
+
|
| 658 |
+
VISUAL_MOODS = [
|
| 659 |
+
"documentary-candid", # Documentary photography style
|
| 660 |
+
"vintage-authentic", # Vintage/retro aesthetic
|
| 661 |
+
"proof-testimonial", # Testimonial/evidence style
|
| 662 |
+
"ui-screenshot", # Native app interface style
|
| 663 |
+
"official-institutional", # Official/document style
|
| 664 |
+
"warm-nostalgic", # Warm, nostalgic tones
|
| 665 |
+
"raw-unpolished", # Raw, unpolished UGC feel
|
| 666 |
+
"news-expose", # News/editorial style
|
| 667 |
+
]
|
| 668 |
+
|
| 669 |
+
COPY_TEMPLATES = [
|
| 670 |
+
{
|
| 671 |
+
"structure": "hook_then_cta",
|
| 672 |
+
"format": "{hook}\n\n{supporting_text}\n\n👉 {cta}",
|
| 673 |
+
},
|
| 674 |
+
{
|
| 675 |
+
"structure": "question_answer",
|
| 676 |
+
"format": "{question}\n\n{answer}\n\n{cta}",
|
| 677 |
+
},
|
| 678 |
+
{
|
| 679 |
+
"structure": "stat_hook",
|
| 680 |
+
"format": "⚠️ {statistic}\n\n{explanation}\n\n{cta}",
|
| 681 |
+
},
|
| 682 |
+
{
|
| 683 |
+
"structure": "story_hook",
|
| 684 |
+
"format": "{story_opening}\n\n{story_middle}\n\n{cta}",
|
| 685 |
+
},
|
| 686 |
+
]
|
| 687 |
+
|
| 688 |
+
CTAS = [
|
| 689 |
+
"Check Your Eligibility",
|
| 690 |
+
"See If You Qualify",
|
| 691 |
+
"Check Eligibility Now",
|
| 692 |
+
"Tap To See Your Rate",
|
| 693 |
+
"Calculate Your Savings",
|
| 694 |
+
"Get Your Free Quote",
|
| 695 |
+
"See Your New Rate",
|
| 696 |
+
"Find Out How Much You Can Save",
|
| 697 |
+
"Click To See Your Savings",
|
| 698 |
+
"Get Protected Now",
|
| 699 |
+
"Start Saving Today",
|
| 700 |
+
"Don't Miss This",
|
| 701 |
+
"Claim Your Rate",
|
| 702 |
+
"Drivers: Check Your Rate",
|
| 703 |
+
"See Driver Rates",
|
| 704 |
+
"50+: Get Your Quote",
|
| 705 |
+
]
|
| 706 |
+
|
| 707 |
+
# ============================================================================
|
| 708 |
+
# SECTION 4: AGGREGATED DATA
|
| 709 |
+
# ============================================================================
|
| 710 |
+
|
| 711 |
+
STRATEGY_NAMES = list(STRATEGIES.keys())
|
| 712 |
+
|
| 713 |
+
ALL_HOOKS = []
|
| 714 |
+
for strategy in STRATEGIES.values():
|
| 715 |
+
ALL_HOOKS.extend(strategy["hooks"])
|
| 716 |
+
|
| 717 |
+
ALL_VISUAL_STYLES = []
|
| 718 |
+
for strategy in STRATEGIES.values():
|
| 719 |
+
ALL_VISUAL_STYLES.extend(strategy["visual_styles"])
|
| 720 |
+
ALL_VISUAL_STYLES.extend(HIGH_CONVERTING_VISUAL_LIBRARY)
|
| 721 |
+
|
| 722 |
+
# ============================================================================
|
| 723 |
+
# SECTION 5: DATA EXPORT
|
| 724 |
+
# ============================================================================
|
| 725 |
+
|
| 726 |
+
def get_niche_data():
|
| 727 |
+
"""Return all auto insurance data for the generator."""
|
| 728 |
+
return {
|
| 729 |
+
"niche": "auto_insurance",
|
| 730 |
+
"strategies": STRATEGIES,
|
| 731 |
+
"all_hooks": ALL_HOOKS,
|
| 732 |
+
"all_visual_styles": ALL_VISUAL_STYLES,
|
| 733 |
+
"strategy_names": STRATEGY_NAMES,
|
| 734 |
+
"creative_directions": CREATIVE_DIRECTIONS,
|
| 735 |
+
"visual_moods": VISUAL_MOODS,
|
| 736 |
+
"copy_templates": COPY_TEMPLATES,
|
| 737 |
+
"ctas": CTAS,
|
| 738 |
+
}
|
data/frameworks.py
CHANGED
|
@@ -365,6 +365,7 @@ def get_frameworks_for_niche(niche: str, count: int = 3) -> List[Dict[str, Any]]
|
|
| 365 |
niche_preferences = {
|
| 366 |
"home_insurance": ["testimonial", "problem_solution", "authority", "before_after", "lifestyle"],
|
| 367 |
"glp1": ["before_after", "testimonial", "lifestyle", "authority", "problem_solution"],
|
|
|
|
| 368 |
}
|
| 369 |
|
| 370 |
# Get preferred frameworks or use all
|
|
|
|
| 365 |
niche_preferences = {
|
| 366 |
"home_insurance": ["testimonial", "problem_solution", "authority", "before_after", "lifestyle"],
|
| 367 |
"glp1": ["before_after", "testimonial", "lifestyle", "authority", "problem_solution"],
|
| 368 |
+
"auto_insurance": ["testimonial", "problem_solution", "authority", "before_after", "comparison"],
|
| 369 |
}
|
| 370 |
|
| 371 |
# Get preferred frameworks or use all
|
data/triggers.py
CHANGED
|
@@ -132,6 +132,7 @@ def get_triggers_for_niche(niche: str) -> List[Dict[str, Any]]:
|
|
| 132 |
niche_triggers = {
|
| 133 |
"home_insurance": ["fear", "greed", "social_proof", "authority", "relief"],
|
| 134 |
"glp1": ["transformation", "pride", "social_proof", "authority", "relief"],
|
|
|
|
| 135 |
}
|
| 136 |
trigger_keys = niche_triggers.get(niche_lower, list(PSYCHOLOGICAL_TRIGGERS.keys())[:5])
|
| 137 |
return [{"key": k, **PSYCHOLOGICAL_TRIGGERS[k]} for k in trigger_keys if k in PSYCHOLOGICAL_TRIGGERS]
|
|
|
|
| 132 |
niche_triggers = {
|
| 133 |
"home_insurance": ["fear", "greed", "social_proof", "authority", "relief"],
|
| 134 |
"glp1": ["transformation", "pride", "social_proof", "authority", "relief"],
|
| 135 |
+
"auto_insurance": ["fear", "greed", "social_proof", "authority", "relief"],
|
| 136 |
}
|
| 137 |
trigger_keys = niche_triggers.get(niche_lower, list(PSYCHOLOGICAL_TRIGGERS.keys())[:5])
|
| 138 |
return [{"key": k, **PSYCHOLOGICAL_TRIGGERS[k]} for k in trigger_keys if k in PSYCHOLOGICAL_TRIGGERS]
|
data/visuals.py
CHANGED
|
@@ -110,6 +110,12 @@ NICHE_VISUAL_GUIDANCE: Dict[str, Dict[str, Any]] = {
|
|
| 110 |
"age_guidance": "Show people aged 30-50 primarily. Avoid defaulting to elderly/senior citizens. Target audience is middle-aged adults, not seniors.",
|
| 111 |
"color_preference": "health",
|
| 112 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
}
|
| 114 |
|
| 115 |
def get_color_palette(trigger: str) -> Dict[str, str]:
|
|
|
|
| 110 |
"age_guidance": "Show people aged 30-50 primarily. Avoid defaulting to elderly/senior citizens. Target audience is middle-aged adults, not seniors.",
|
| 111 |
"color_preference": "health",
|
| 112 |
},
|
| 113 |
+
"auto_insurance": {
|
| 114 |
+
"subjects": ["driver with car", "family near vehicle", "car owner looking confident", "person reviewing insurance documents"],
|
| 115 |
+
"props": ["insurance papers", "car keys", "vehicle", "smartphone with app", "documents"],
|
| 116 |
+
"avoid": ["car accidents", "crashes", "damaged vehicles prominently", "stressed expressions"],
|
| 117 |
+
"color_preference": "trust",
|
| 118 |
+
},
|
| 119 |
}
|
| 120 |
|
| 121 |
def get_color_palette(trigger: str) -> Dict[str, str]:
|
frontend/components/generation/BatchForm.tsx
CHANGED
|
@@ -56,6 +56,7 @@ export const BatchForm: React.FC<BatchFormProps> = ({
|
|
| 56 |
options={[
|
| 57 |
{ value: "home_insurance", label: "Home Insurance" },
|
| 58 |
{ value: "glp1", label: "GLP-1" },
|
|
|
|
| 59 |
]}
|
| 60 |
error={errors.niche?.message}
|
| 61 |
{...register("niche")}
|
|
|
|
| 56 |
options={[
|
| 57 |
{ value: "home_insurance", label: "Home Insurance" },
|
| 58 |
{ value: "glp1", label: "GLP-1" },
|
| 59 |
+
{ value: "auto_insurance", label: "Auto Insurance" },
|
| 60 |
]}
|
| 61 |
error={errors.niche?.message}
|
| 62 |
{...register("niche")}
|
frontend/components/generation/ExtensiveForm.tsx
CHANGED
|
@@ -87,7 +87,8 @@ export const ExtensiveForm: React.FC<ExtensiveFormProps> = ({
|
|
| 87 |
options={[
|
| 88 |
{ value: "home_insurance", label: "Home Insurance" },
|
| 89 |
{ value: "glp1", label: "GLP-1" },
|
| 90 |
-
{ value: "
|
|
|
|
| 91 |
]}
|
| 92 |
error={errors.niche?.message}
|
| 93 |
{...register("niche")}
|
|
|
|
| 87 |
options={[
|
| 88 |
{ value: "home_insurance", label: "Home Insurance" },
|
| 89 |
{ value: "glp1", label: "GLP-1" },
|
| 90 |
+
{ value: "auto_insurance", label: "Auto Insurance" },
|
| 91 |
+
{ value: "others", label: "Others (Custom)" },
|
| 92 |
]}
|
| 93 |
error={errors.niche?.message}
|
| 94 |
{...register("niche")}
|
frontend/components/generation/GenerationForm.tsx
CHANGED
|
@@ -122,6 +122,7 @@ export const GenerationForm: React.FC<GenerationFormProps> = ({
|
|
| 122 |
options={[
|
| 123 |
{ value: "home_insurance", label: "Home Insurance" },
|
| 124 |
{ value: "glp1", label: "GLP-1" },
|
|
|
|
| 125 |
]}
|
| 126 |
error={errors.niche?.message}
|
| 127 |
{...register("niche")}
|
|
|
|
| 122 |
options={[
|
| 123 |
{ value: "home_insurance", label: "Home Insurance" },
|
| 124 |
{ value: "glp1", label: "GLP-1" },
|
| 125 |
+
{ value: "auto_insurance", label: "Auto Insurance" },
|
| 126 |
]}
|
| 127 |
error={errors.niche?.message}
|
| 128 |
{...register("niche")}
|
main.py
CHANGED
|
@@ -110,8 +110,8 @@ if os.path.exists(frontend_static_path):
|
|
| 110 |
# Request/Response schemas
|
| 111 |
class GenerateRequest(BaseModel):
|
| 112 |
"""Request schema for ad generation."""
|
| 113 |
-
niche: Literal["home_insurance", "glp1"] = Field(
|
| 114 |
-
description="Target niche: home_insurance or
|
| 115 |
)
|
| 116 |
num_images: int = Field(
|
| 117 |
default=1,
|
|
@@ -143,8 +143,8 @@ class GenerateRequest(BaseModel):
|
|
| 143 |
|
| 144 |
class GenerateBatchRequest(BaseModel):
|
| 145 |
"""Request schema for batch ad generation."""
|
| 146 |
-
niche: Literal["home_insurance", "glp1"] = Field(
|
| 147 |
-
description="Target niche: home_insurance or
|
| 148 |
)
|
| 149 |
count: int = Field(
|
| 150 |
default=5,
|
|
@@ -225,7 +225,7 @@ class BatchResponse(BaseModel):
|
|
| 225 |
# Matrix-based schemas
|
| 226 |
class MatrixGenerateRequest(BaseModel):
|
| 227 |
"""Request for angle × concept matrix generation."""
|
| 228 |
-
niche: Literal["home_insurance", "glp1"] = Field(
|
| 229 |
description="Target niche"
|
| 230 |
)
|
| 231 |
angle_key: Optional[str] = Field(
|
|
@@ -276,7 +276,7 @@ class RefineCustomRequest(BaseModel):
|
|
| 276 |
type: Literal["angle", "concept"] = Field(
|
| 277 |
description="Whether this is an angle or concept"
|
| 278 |
)
|
| 279 |
-
niche: Literal["home_insurance", "glp1"] = Field(
|
| 280 |
description="Target niche for context"
|
| 281 |
)
|
| 282 |
goal: Optional[str] = Field(
|
|
@@ -316,7 +316,7 @@ class RefineCustomResponse(BaseModel):
|
|
| 316 |
# Motivator generation (angle + concept context)
|
| 317 |
class MotivatorGenerateRequest(BaseModel):
|
| 318 |
"""Request to generate motivators from niche + angle + concept."""
|
| 319 |
-
niche: Literal["home_insurance", "glp1"] = Field(description="Target niche")
|
| 320 |
angle: Dict[str, Any] = Field(
|
| 321 |
description="Angle context: name, trigger, example (and optional key, category)"
|
| 322 |
)
|
|
@@ -505,7 +505,7 @@ async def health():
|
|
| 505 |
|
| 506 |
@app.get("/api/trends/{niche}")
|
| 507 |
async def get_trends(
|
| 508 |
-
niche: Literal["home_insurance", "glp1"],
|
| 509 |
username: str = Depends(get_current_user)
|
| 510 |
):
|
| 511 |
"""
|
|
@@ -545,7 +545,7 @@ async def get_trends(
|
|
| 545 |
|
| 546 |
@app.get("/api/trends/angles/{niche}")
|
| 547 |
async def get_trending_angles(
|
| 548 |
-
niche: Literal["home_insurance", "glp1"],
|
| 549 |
username: str = Depends(get_current_user)
|
| 550 |
):
|
| 551 |
"""
|
|
@@ -1512,7 +1512,7 @@ async def list_image_models():
|
|
| 1512 |
|
| 1513 |
|
| 1514 |
@app.get("/strategies/{niche}")
|
| 1515 |
-
async def get_strategies(niche: Literal["home_insurance", "glp1"]):
|
| 1516 |
"""
|
| 1517 |
Get available psychological strategies for a niche.
|
| 1518 |
|
|
|
|
| 110 |
# Request/Response schemas
|
| 111 |
class GenerateRequest(BaseModel):
|
| 112 |
"""Request schema for ad generation."""
|
| 113 |
+
niche: Literal["home_insurance", "glp1", "auto_insurance"] = Field(
|
| 114 |
+
description="Target niche: home_insurance, glp1, or auto_insurance"
|
| 115 |
)
|
| 116 |
num_images: int = Field(
|
| 117 |
default=1,
|
|
|
|
| 143 |
|
| 144 |
class GenerateBatchRequest(BaseModel):
|
| 145 |
"""Request schema for batch ad generation."""
|
| 146 |
+
niche: Literal["home_insurance", "glp1", "auto_insurance"] = Field(
|
| 147 |
+
description="Target niche: home_insurance, glp1, or auto_insurance"
|
| 148 |
)
|
| 149 |
count: int = Field(
|
| 150 |
default=5,
|
|
|
|
| 225 |
# Matrix-based schemas
|
| 226 |
class MatrixGenerateRequest(BaseModel):
|
| 227 |
"""Request for angle × concept matrix generation."""
|
| 228 |
+
niche: Literal["home_insurance", "glp1", "auto_insurance"] = Field(
|
| 229 |
description="Target niche"
|
| 230 |
)
|
| 231 |
angle_key: Optional[str] = Field(
|
|
|
|
| 276 |
type: Literal["angle", "concept"] = Field(
|
| 277 |
description="Whether this is an angle or concept"
|
| 278 |
)
|
| 279 |
+
niche: Literal["home_insurance", "glp1", "auto_insurance"] = Field(
|
| 280 |
description="Target niche for context"
|
| 281 |
)
|
| 282 |
goal: Optional[str] = Field(
|
|
|
|
| 316 |
# Motivator generation (angle + concept context)
|
| 317 |
class MotivatorGenerateRequest(BaseModel):
|
| 318 |
"""Request to generate motivators from niche + angle + concept."""
|
| 319 |
+
niche: Literal["home_insurance", "glp1", "auto_insurance"] = Field(description="Target niche")
|
| 320 |
angle: Dict[str, Any] = Field(
|
| 321 |
description="Angle context: name, trigger, example (and optional key, category)"
|
| 322 |
)
|
|
|
|
| 505 |
|
| 506 |
@app.get("/api/trends/{niche}")
|
| 507 |
async def get_trends(
|
| 508 |
+
niche: Literal["home_insurance", "glp1", "auto_insurance"],
|
| 509 |
username: str = Depends(get_current_user)
|
| 510 |
):
|
| 511 |
"""
|
|
|
|
| 545 |
|
| 546 |
@app.get("/api/trends/angles/{niche}")
|
| 547 |
async def get_trending_angles(
|
| 548 |
+
niche: Literal["home_insurance", "glp1", "auto_insurance"],
|
| 549 |
username: str = Depends(get_current_user)
|
| 550 |
):
|
| 551 |
"""
|
|
|
|
| 1512 |
|
| 1513 |
|
| 1514 |
@app.get("/strategies/{niche}")
|
| 1515 |
+
async def get_strategies(niche: Literal["home_insurance", "glp1", "auto_insurance"]):
|
| 1516 |
"""
|
| 1517 |
Get available psychological strategies for a niche.
|
| 1518 |
|
services/generator.py
CHANGED
|
@@ -56,7 +56,7 @@ except ImportError:
|
|
| 56 |
print("Note: Trend monitor service not available.")
|
| 57 |
|
| 58 |
# Data module imports
|
| 59 |
-
from data import home_insurance, glp1
|
| 60 |
from services.matrix import matrix_service
|
| 61 |
from data.frameworks import get_frameworks_for_niche, get_framework_hook_examples, get_all_frameworks
|
| 62 |
from data.containers import (
|
|
@@ -78,6 +78,7 @@ from data.visuals import (
|
|
| 78 |
NICHE_DATA = {
|
| 79 |
"home_insurance": home_insurance.get_niche_data,
|
| 80 |
"glp1": glp1.get_niche_data,
|
|
|
|
| 81 |
}
|
| 82 |
|
| 83 |
# Age brackets for identity targeting (proven high-CTR pattern)
|
|
|
|
| 56 |
print("Note: Trend monitor service not available.")
|
| 57 |
|
| 58 |
# Data module imports
|
| 59 |
+
from data import home_insurance, glp1, auto_insurance
|
| 60 |
from services.matrix import matrix_service
|
| 61 |
from data.frameworks import get_frameworks_for_niche, get_framework_hook_examples, get_all_frameworks
|
| 62 |
from data.containers import (
|
|
|
|
| 78 |
NICHE_DATA = {
|
| 79 |
"home_insurance": home_insurance.get_niche_data,
|
| 80 |
"glp1": glp1.get_niche_data,
|
| 81 |
+
"auto_insurance": auto_insurance.get_niche_data,
|
| 82 |
}
|
| 83 |
|
| 84 |
# Age brackets for identity targeting (proven high-CTR pattern)
|
services/trend_monitor.py
CHANGED
|
@@ -19,6 +19,11 @@ NICHE_KEYWORDS = {
|
|
| 19 |
"GLP-1", "Ozempic", "Wegovy", "Mounjaro", "Zepbound",
|
| 20 |
"weight loss", "diabetes", "semaglutide", "tirzepatide",
|
| 21 |
"weight loss drug", "obesity treatment"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
]
|
| 23 |
}
|
| 24 |
|
|
|
|
| 19 |
"GLP-1", "Ozempic", "Wegovy", "Mounjaro", "Zepbound",
|
| 20 |
"weight loss", "diabetes", "semaglutide", "tirzepatide",
|
| 21 |
"weight loss drug", "obesity treatment"
|
| 22 |
+
],
|
| 23 |
+
"auto_insurance": [
|
| 24 |
+
"auto insurance", "car insurance", "vehicle insurance",
|
| 25 |
+
"driving safety", "accident rates", "insurance premiums",
|
| 26 |
+
"car insurance rates", "driver discounts", "vehicle coverage"
|
| 27 |
]
|
| 28 |
}
|
| 29 |
|