Skip to main content

Email Marketing Automation

🚀 Overview del Sistema

El sistema de Email Marketing Automation del CDP permite crear y ejecutar campañas de email personalizadas, automatizadas y basadas en triggers de comportamiento del cliente.

✨ Características Principales

🎯 Triggers Automáticos

  • Welcome Series - Secuencia de bienvenida para nuevos clientes
  • Abandoned Cart Recovery - Recuperación de carritos abandonados
  • Post-Purchase Follow-up - Seguimiento post-compra
  • Re-engagement - Reactivación de clientes inactivos
  • Birthday Campaigns - Campañas de cumpleaños
  • Winback Campaigns - Recuperación de clientes perdidos

📊 Personalización Avanzada

  • Contenido dinámico basado en RFM segment
  • Product recommendations personalizadas
  • Ofertas inteligentes basadas en CLV
  • Horario óptimo de envío por cliente
  • Frequency capping automático

📈 Analytics y Optimization

  • A/B Testing integrado
  • Performance tracking en tiempo real
  • ROI measurement por campaña
  • Deliverability monitoring
  • Engagement scoring

🛠️ Implementación Técnica

Configuración del Manager

# Email Automation Manager
from scripts.email.email_automation_manager import EmailAutomationManager

# Inicializar para un tenant
email_manager = EmailAutomationManager(tenant_id=1)

# Ejecutar todos los triggers automáticos
email_manager.run_all_triggers()

# Ejecutar trigger específico
email_manager.run_abandoned_cart_recovery()

Triggers Disponibles

1. Welcome Series

# Configurar serie de bienvenida
email_manager.setup_welcome_series(
emails_count=3,
delay_hours=[0, 24, 72],
personalization_level='high'
)

2. Abandoned Cart Recovery

# Recuperación de carritos abandonados
email_manager.run_abandoned_cart_recovery(
hours_threshold=24,
max_emails=3,
discount_progression=[0, 5, 10]
)

3. Re-engagement Campaign

# Campaña de reactivación
email_manager.run_reengagement_campaign(
inactive_days=90,
segment='medium_value',
offer_type='percentage'
)

📋 Configuración de Campañas

Template de Email

<!DOCTYPE html>
<html>
<head>
<title>{{campaign_name}}</title>
</head>
<body>
<h1>Hola {{customer_name}}!</h1>

<!-- Contenido personalizado por segmento -->
{% if segment == 'VIP' %}
<p>Como cliente VIP, tienes acceso exclusivo a...</p>
{% elif segment == 'New Customer' %}
<p>Bienvenido a nuestra familia!</p>
{% endif %}

<!-- Recomendaciones personalizadas -->
<div class="recommendations">
{% for product in recommended_products %}
<div class="product">
<img src="{{product.image}}" alt="{{product.name}}">
<h3>{{product.name}}</h3>
<p>{{product.price}}</p>
</div>
{% endfor %}
</div>

<!-- CTA personalizado -->
<a href="{{cta_url}}" class="cta-button">
{{cta_text}}
</a>
</body>
</html>

Variables de Personalización

VariableDescripciónEjemplo
{{customer_name}}Nombre del cliente"Juan Pérez"
{{segment}}Segmento RFM"Champions"
{{clv_score}}Customer Lifetime Value1250.00
{{last_purchase_date}}Última compra"2024-01-15"
{{recommended_products}}Array de productos recomendados[product1, product2, ...]
{{discount_code}}Código de descuento personalizado"VIP20"
{{days_since_last_purchase}}Días desde última compra45

🎯 Segmentación para Email

Segmentos RFM Automáticos

-- Champions (Mejores clientes)
SELECT customer_id, email
FROM cdp.customers_rfm_current
WHERE rfm_segment = 'Champions'
AND email_consent = true;

-- At Risk (Clientes en riesgo)
SELECT customer_id, email
FROM cdp.customers_rfm_current
WHERE rfm_segment = 'At Risk'
AND days_since_last_order > 60;

-- New Customers (Clientes nuevos)
SELECT customer_id, email
FROM cdp.customers_rfm_current
WHERE rfm_segment = 'New Customers'
AND first_order_date >= CURRENT_DATE - INTERVAL '30 days';

Segmentos Custom

-- Clientes con carritos abandonados
SELECT DISTINCT c.customer_id, c.email
FROM cdp.customers c
JOIN cdp.abandoned_carts ac ON c.customer_id = ac.customer_id
WHERE ac.created_at >= CURRENT_DATE - INTERVAL '24 hours'
AND ac.email_sent = false;

-- Clientes de cumpleaños
SELECT customer_id, email, first_name
FROM cdp.customers
WHERE EXTRACT(MONTH FROM birth_date) = EXTRACT(MONTH FROM CURRENT_DATE)
AND EXTRACT(DAY FROM birth_date) = EXTRACT(DAY FROM CURRENT_DATE);

📊 Métricas y KPIs

Métricas Principales

MétricaFórmulaBenchmark
Open RateEmails abiertos / Emails enviados25-30%
Click RateClicks / Emails enviados3-5%
Conversion RateConversiones / Emails enviados1-3%
Revenue per EmailRevenue total / Emails enviados$0.50-$2.00
Unsubscribe RateUnsubscribes / Emails enviados<0.5%

Dashboard de Performance

# Obtener métricas de campaña
def get_campaign_metrics(campaign_id, tenant_id):
return {
'emails_sent': 1000,
'emails_opened': 280,
'emails_clicked': 45,
'conversions': 12,
'revenue_generated': 2400.00,
'open_rate': 28.0,
'click_rate': 4.5,
'conversion_rate': 1.2,
'revenue_per_email': 2.40
}

🔄 Automation Workflows

Workflow de Carrito Abandonado

graph TD
A[Cliente abandona carrito] --> B[Esperar 1 hora]
B --> C[Enviar Email 1: Recordatorio]
C --> D{¿Completó compra?}
D -->|Sí| E[Fin del workflow]
D -->|No| F[Esperar 24 horas]
F --> G[Enviar Email 2: Descuento 5%]
G --> H{¿Completó compra?}
H -->|Sí| E
H -->|No| I[Esperar 48 horas]
I --> J[Enviar Email 3: Descuento 10%]
J --> K{¿Completó compra?}
K -->|Sí| E
K -->|No| L[Mover a segmento "Lost"]

Workflow de Bienvenida

graph TD
A[Nuevo registro] --> B[Enviar Email de Bienvenida]
B --> C[Esperar 24 horas]
C --> D[Enviar Guía de Productos]
D --> E[Esperar 72 horas]
E --> F[Enviar Oferta de Primera Compra]
F --> G{¿Realizó primera compra?}
G -->|Sí| H[Mover a workflow Post-Purchase]
G -->|No| I[Mover a segmento "New Prospects"]

🎨 Mejores Prácticas

Subject Lines

  • Personalización: Incluir nombre del cliente
  • Urgencia: Crear sensación de escasez
  • Curiosidad: Generar interés sin revelar todo
  • Emojis: Usar con moderación para destacar
  • A/B Testing: Probar diferentes versiones

Timing Optimization

  • Análisis por segmento: Cada segmento tiene horarios óptimos
  • Día de la semana: Martes-Jueves mejor performance
  • Hora del día: 10AM-12PM y 2PM-4PM picos de apertura
  • Frequency capping: Máximo 2-3 emails por semana

Content Personalization

  • Dynamic content basado en RFM segment
  • Product recommendations basadas en historial
  • Location-based offers para clientes locales
  • Lifecycle stage messaging apropiado

🔧 Configuración Técnica

Variables de Entorno

# Email Service Configuration
EMAIL_SERVICE_PROVIDER=sendgrid
EMAIL_API_KEY=your_sendgrid_api_key
EMAIL_FROM_ADDRESS=noreply@nerdistan.com.ar
EMAIL_FROM_NAME=Nerdistan Team

# Campaign Settings
EMAIL_BATCH_SIZE=100
EMAIL_RATE_LIMIT=10_per_minute
EMAIL_RETRY_ATTEMPTS=3
EMAIL_WEBHOOK_URL=https://your-domain.com/email-webhooks

Integraciones Disponibles

SendGrid

from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

sg = SendGridAPIClient(api_key=os.environ.get('SENDGRID_API_KEY'))

def send_personalized_email(to_email, template_id, dynamic_data):
message = Mail(
from_email='noreply@nerdistan.com.ar',
to_emails=to_email
)
message.template_id = template_id
message.dynamic_template_data = dynamic_data

response = sg.send(message)
return response

Mailchimp

import mailchimp_marketing as MailchimpMarketing

client = MailchimpMarketing.Client()
client.set_config({
"api_key": "your_api_key",
"server": "us6"
})

def sync_audience_to_mailchimp(audience_data):
response = client.lists.batch_list_members(
list_id="your_list_id",
body={"members": audience_data}
)
return response

📈 Optimización y Testing

A/B Testing Setup

# Configurar A/B test para subject line
def setup_subject_line_test(campaign_id):
test_config = {
'test_name': 'Subject Line Test - Campaign {}'.format(campaign_id),
'test_type': 'subject_line',
'variants': [
{'name': 'A', 'subject': '🎉 Oferta especial para ti'},
{'name': 'B', 'subject': 'No te pierdas esta oportunidad'}
],
'split_percentage': 20, # 20% para testing
'duration_hours': 4,
'winner_metric': 'open_rate'
}
return create_ab_test(test_config)

Performance Monitoring

# Monitor de performance en tiempo real
def monitor_campaign_performance(campaign_id):
metrics = get_campaign_metrics(campaign_id)

# Alertas automáticas
if metrics['open_rate'] < 15:
send_alert('Low open rate detected')

if metrics['unsubscribe_rate'] > 2:
send_alert('High unsubscribe rate detected')

return metrics

🚀 Próximos Pasos

  1. A/B Testing Guide - Optimización de campañas
  2. Segmentation Guide - Audiencias avanzadas
  3. VTEX Integration - Sincronización de datos
  4. Campaign Orchestration - Campañas multicanal

💡 ¿Listo para crear tu primera campaña? Consulta el Tutorial: Primera Campaña de Email para una guía paso a paso.