Systems Library / Marketing Automation / How to Create AI-Powered Re-engagement Campaigns
Marketing Automation email marketing

How to Create AI-Powered Re-engagement Campaigns

Automatically identify and re-engage inactive subscribers with AI-personalized content.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

This ai re-engagement email campaign automation system identifies quiet subscribers and brings them back with content matched to why they signed up. I run this monthly across all accounts.

Most re-engagement fails because it sends "we miss you" to everyone. This system personalizes the approach.

What You Need Before Starting

Step 1: Identify Inactive Subscribers

import pandas as pd
from datetime import datetime, timedelta

def find_inactive(df, days=60):
    cutoff = datetime.now() - timedelta(days=days)
    return df[
        (pd.to_datetime(df["last_open"]) < cutoff) &
        (df["total_opens"] > 0)
    ]

Step 2: Classify Inactivity Reason

import anthropic
from dotenv import load_dotenv

load_dotenv()
client = anthropic.Anthropic()

def classify(subscriber):
    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=256,
        system="Classify inactivity reason: content_mismatch, frequency_fatigue, lifecycle_complete, seasonal, unknown.",
        messages=[{"role": "user", "content": f"Last open: {subscriber['last_open']}. Opens: {subscriber['total_opens']}. Last click: {subscriber['last_click_topic']}."}]
    )
    return message.content[0].text

Step 3: Generate Personalized Re-engagement

def create_reengagement(subscriber, reason):
    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=512,
        system="Write re-engagement email. Short, direct, personal. Give a reason to come back. No guilt trips.",
        messages=[{"role": "user", "content": f"Name: {subscriber['name']}. Reason: {reason}. Interest: {subscriber['last_click_topic']}."}]
    )
    return message.content[0].text

Step 4: Run the Campaign

def run_reengagement(inactive_list):
    for sub in inactive_list:
        reason = classify(sub)
        email = create_reengagement(sub, reason)
        schedule_send(sub["email"], email, delay=0)

What to Build Next

Track which re-engagement reasons respond best to which email types. Feed that back into the classifier.

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