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
| Variable | Descripción | Ejemplo |
|---|---|---|
{{customer_name}} | Nombre del cliente | "Juan Pérez" |
{{segment}} | Segmento RFM | "Champions" |
{{clv_score}} | Customer Lifetime Value | 1250.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 compra | 45 |
🎯 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étrica | Fórmula | Benchmark |
|---|---|---|
| Open Rate | Emails abiertos / Emails enviados | 25-30% |
| Click Rate | Clicks / Emails enviados | 3-5% |
| Conversion Rate | Conversiones / Emails enviados | 1-3% |
| Revenue per Email | Revenue total / Emails enviados | $0.50-$2.00 |
| Unsubscribe Rate | Unsubscribes / 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
- A/B Testing Guide - Optimización de campañas
- Segmentation Guide - Audiencias avanzadas
- VTEX Integration - Sincronización de datos
- 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.