Systems Library / Marketing Automation / How to Build an AI Email Copy Personalization System
Marketing Automation email marketing

How to Build an AI Email Copy Personalization System

Personalize email copy dynamically based on subscriber data and behavior.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

This ai email copy personalization system with dynamic content rewrites sections of your email based on who reads it. Static emails treat everyone the same. This adapts per subscriber.

I run this for clients with 1,000+ tagged subscribers. The personalization must be meaningful, not just name tokens.

What You Need Before Starting

Step 1: Map Personalization Points

PERSONALIZATION = {
    "hero": {"varies_by": "industry", "fallback": "general"},
    "pain_point": {"varies_by": "stage", "fallback": "awareness"},
    "proof": {"varies_by": "industry", "fallback": "generic"},
    "cta": {"varies_by": "engagement_level", "fallback": "soft"},
}

Step 2: Generate Content Variants

import anthropic
from dotenv import load_dotenv

load_dotenv()
client = anthropic.Anthropic()

def generate_variants(section, variable, values, context):
    variants = {}
    for value in values:
        message = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=512,
            system="Write email copy sections. Short. Direct. No filler.",
            messages=[{"role": "user", "content": f"Context: {context}\nSection: {section}\nFor {variable} = {value}. Write 2-3 sentences."}]
        )
        variants[value] = message.content[0].text
    return variants

Step 3: Assemble Dynamic Emails

def assemble(template, subscriber, all_variants):
    result = template
    for section, config in PERSONALIZATION.items():
        tag = subscriber.get(config["varies_by"], config["fallback"])
        content = all_variants.get(section, {}).get(tag, all_variants[section][config["fallback"]])
        result = result.replace(f"{{{{{section}}}}}", content)
    return result

Step 4: Track Variant Performance

import sqlite3

db = sqlite3.connect("personalization.db")
db.execute('''CREATE TABLE IF NOT EXISTS variant_performance (
    email_id TEXT, section TEXT, variant TEXT,
    opens INTEGER DEFAULT 0, clicks INTEGER DEFAULT 0
)''')
db.commit()

What to Build Next

Add real-time personalization that checks subscriber activity in the last 24 hours before sending. Pricing page visitors get different content.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems