← Volver al catálogo

🔁 DM Re-engagement

Archivo: /Users/user/rifai-agents/agentes/social/dm-reengage.ts · Plist: com.rifai.dm-reengage (solo en ~/Library/LaunchAgents/, no en cron/) · Horario: diario a las 18:00 (StartCalendarInterval Hour 18 / Minute 0, RunAtLoad false)

Qué hace

Una vez al día reactiva leads templados/calientes que escribieron por DM hace 24-72h, recibieron respuesta de "Sergio" y no han vuelto a contestar. Lee el historial que deja el DM Responder y selecciona a quienes mostraron intent de compra (precio, comprar, envío, stock, oferta…). Genera un mensaje de re-engagement personalizado con un LLM local y lo envía por Messenger/IG. Limita a 10 envíos por ejecución para no parecer spam y marca a cada cliente como ya re-contactado para no insistir.

Cómo funciona

1. Carga .env; si no existe data/dm-responder-state.json (historial del DM Responder), sale.

2. Carga su propio estado data/dm-reengage-state.json (pinged: clientes ya re-contactados).

3. Filtra candidatos del historial: tienen sender_id y platform, no han sido pinged, su edad está entre 22h y 72h, y el mensaje del cliente matchea intent de compra (regex precio|comprar|cuánto|envío|stock|disponible|oferta|descuento).

4. Para máx 10 candidatos: construye prompt recordando su consulta original y la respuesta dada, genera mensaje (haiku, 2-3 frases, sin inventar descuentos) con claude().

5. Envía con Graph API (/me/messages FB, /{IG_ID}/messages IG), marca al cliente en pinged y guarda estado.

6. Si envió ≥1, notifica resumen por el router (evento cs_question).

Datos/APIs

  • Meta Graph API v21.0 (Messenger + IG Direct) para enviar el ping.
  • LLM local tools/gemini-cli (haiku).
  • notify-router evento cs_question.
  • Fuente de datos: data/dm-responder-state.json (lo produce dm-responder.ts). Estado propio: data/dm-reengage-state.json.
  • Vars .env: META_PAGE_ID (fallback 112610281241802), META_PAGE_TOKEN/META_ACCESS_TOKEN, INSTAGRAM_BUSINESS_ID (fallback 17841401185807202).

Cómo probarlo

cd /Users/user/rifai-agents && npx tsx agentes/social/dm-reengage.ts

Sin flag FORCE; envía DMs reales a los candidatos que cumplan la ventana 22-72h. Si no hay historial o no hay candidatos en esa ventana, sale limpio sin enviar. Salida esperada: cabecera 🔁 DM Re-engagement, N candidatos warm/hot, líneas ✅ plataforma sender: mensaje, y 📊 Re-engagement enviados: N. Nota: requiere que el DM Responder haya generado historial y que la ventana de mensajería de 24h de Messenger siga abierta.

Si se rompe / recuperar

launchctl unload ~/Library/LaunchAgents/com.rifai.dm-reengage.plist
launchctl load   ~/Library/LaunchAgents/com.rifai.dm-reengage.plist

Logs: /Users/user/rifai-agents/logs/dm-reengage.out.log y .err.log. Fallos típicos: no existe historial del DM Responder (sale en seguida), token Meta caducado, o la ventana de 24h de Messenger cerrada (Meta rechaza el envío fuera de ese plazo). Plist NO versionado en cron/.

Cómo replicarlo

  • Que el dm-responder.ts esté corriendo y generando data/dm-responder-state.json con history (sender_id, platform, ts, user_msg, reply).
  • Token de Página Meta con permisos de mensajería + IDs en .env.
  • LLM local tools/gemini-cli y tools/notify-router.
  • Estado JSON dm-reengage-state.json para no re-pinguear + plist StartCalendarInterval 18:00.