🎯 Anatomía del MVP Backlog — Flujo Encuesta de Satisfacción Post-Consulta
Fecha: 1 de abril de 2026
Propósito: Diseño exhaustivo nodo-por-nodo del flujo MVP Backlog que demuestra el valor completo de Pet Flows
Estado: Este flujo es 100% vigente según el usuario
1. La Historia de Usuario (Textual)
"Crearemos un flujo permanente, que detecta cierres de casos y planifica mandarle dentro de 5 días al usuario una notificación push (que incluye un deeplink) para que abra la app de QC+ y rellene una encuesta de satisfacción"
2. El Flujo Visual
graph LR
T["⚡ TRIGGER<br/>Caso cerrado<br/>App: DKV PET<br/>Cola: Telemedicina"]
--> F["🔍 FILTRO<br/>(en edge)<br/>queue = Telemedicina<br/>status = closed"]
--> W["⏱️ ESPERA<br/>5 días<br/>App: Flow Control<br/>Módulo: Sleep"]
--> C["🔍 CONDICIÓN<br/>¿Push habilitado?<br/>user.push_enabled"]
C -->|"Sí"| P["📲 PUSH<br/>Enviar push<br/>App: Notificaciones<br/>Deep link encuesta"]
C -->|"No"| E["✉️ EMAIL<br/>Enviar email<br/>App: Notificaciones<br/>Link encuesta"]
P --> LOG["📊 REGISTRO<br/>Log evento<br/>App: Datos<br/>analytics_event"]
E --> LOG
style T fill:#7C3AED,color:#fff
style F fill:#D97706,color:#fff
style W fill:#6366f1,color:#fff
style C fill:#D97706,color:#fff
style P fill:#059669,color:#fff
style E fill:#059669,color:#fff
style LOG fill:#2563EB,color:#fff
3. Nodo por Nodo — Configuración Completa
Nodo 1: ⚡ Trigger — Caso Cerrado
| Campo |
Valor |
| App |
🐾 DKV PET |
| Módulo |
pet-case-closed — Caso cerrado |
| Tipo trigger |
instant-trigger (webhook) |
| Modo |
Always-on (permanente) |
| Cola configurada |
Telemedicina (seleccionable de dropdown) |
Fuente técnica: PET publica un webhook cuando un caso se cierra en la cola.
El campo webhook_new_message_recipients en la entidad Queue de dkv-pet-admin apunta a la URL de ingress de Pet Flows.
Payload que recibe (desde PET):
{
"event": "encounter_closed",
"queue_id": "queue-telemedicina-001",
"queue_name": "Telemedicina General",
"encounter": {
"id": "enc-2026-04-001",
"patient_id": "user-12345",
"patient_name": "María García",
"pet_id": "pet-67890",
"pet_name": "Luna",
"pet_species": "dog",
"vet_id": "vet-555",
"vet_name": "Dr. López",
"created_at": "2026-04-01T10:00:00Z",
"closed_at": "2026-04-01T10:45:00Z",
"reason": "Consulta dermatológica",
"diagnosis": "Dermatitis atópica leve",
"resolution": "Tratamiento prescrito"
},
"user": {
"id": "user-12345",
"name": "María García",
"email": "maria.garcia@example.com",
"push_enabled": true,
"push_token": "fcm:abc123...",
"app_platform": "ios",
"locale": "es-ES",
"tags": ["premium", "dog-owner", "madrid"]
}
}
Nodo 2: ⏱️ Espera — 5 Días
| Campo |
Valor |
| App |
🔧 Flow Control |
| Módulo |
fc-sleep — Espera |
| Duración |
5 días |
| Unidad |
days |
Backend: Dapr Timer — ctx.createTimer(Duration.ofDays(5)).await()
[!IMPORTANT]
Este nodo es crítico para la durabilidad. Si el servidor se reinicia durante los 5 días, Dapr Workflows reanuda automáticamente desde este checkpoint. No se pierden flujos en progreso.
Nodo 3: 🔍 Condición — ¿Push Habilitado?
| Campo |
Valor |
| App |
(inline, nodo lógico del Router) |
| Regla |
context.user.push_enabled == true |
| Rama Sí |
→ Nodo Push |
| Rama No |
→ Nodo Email |
Nodo 4a: 📲 Push — Enviar Notificación
| Campo |
Valor |
| App |
📲 Notificaciones |
| Módulo |
notify-push-rich — Push enriquecido |
| Título |
"¡Hola {{user.name}}! ¿Cómo fue la consulta de {{pet.name}}?" |
| Cuerpo |
"Cuéntanos tu experiencia con {{vet.name}}. Solo 2 minutos." |
| Deep Link |
qcplus://survey/satisfaction?encounter={{encounter.id}} |
| Imagen |
URL del logo DKV o imagen de la mascota |
| Botón acción |
"Responder encuesta" → deep link |
Payload Gorush:
{
"notifications": [{
"tokens": ["fcm:abc123..."],
"platform": 2,
"title": "¡Hola María! ¿Cómo fue la consulta de Luna?",
"message": "Cuéntanos tu experiencia con Dr. López. Solo 2 minutos.",
"data": {
"deep_link": "qcplus://survey/satisfaction?encounter=enc-2026-04-001",
"type": "satisfaction_survey"
},
"mutable_content": true,
"image": "https://cdn.dkv.es/pet/survey-header.png"
}]
}
Nodo 4b: ✉️ Email — Alternativa
| Campo |
Valor |
| App |
📲 Notificaciones |
| Módulo |
notify-email — Enviar Email |
| Para |
{{user.email}} |
| Asunto |
"{{user.name}}, ¿cómo fue la consulta de {{pet.name}}?" |
| Template |
satisfaction_survey_email |
| Variables |
user, pet, vet, encounter |
Nodo 5: 📊 Registro — Log Analítico
| Campo |
Valor |
| App |
🗄️ Datos |
| Módulo |
data-variable / log evento |
| Evento |
survey_sent |
| Datos |
encounter_id, channel (push |
4. Serialización JSON del Flujo (FlowData)
{
"id": "flow-satisfaction-survey-v1",
"version": "1.0.0",
"name": "Encuesta de satisfacción post-consulta",
"status": "active",
"triggerMode": "always-on",
"nodes": [
{
"id": "trigger-1",
"type": "trigger",
"position": { "x": 100, "y": 300 },
"data": {
"label": "Caso cerrado",
"moduleType": "instant-trigger",
"icon": "stethoscope",
"color": "#009BE0",
"configValues": {
"app": "dkv-pet",
"module": "pet-case-closed",
"queue_filter": "telemedicina"
}
}
},
{
"id": "wait-1",
"type": "module",
"position": { "x": 350, "y": 300 },
"data": {
"label": "Esperar 5 días",
"moduleType": "action",
"icon": "clock",
"color": "#10b981",
"configValues": {
"app": "flow-control",
"module": "fc-sleep",
"duration": 5,
"unit": "days"
}
}
},
{
"id": "condition-1",
"type": "router",
"position": { "x": 600, "y": 300 },
"data": {
"label": "¿Push habilitado?",
"moduleType": "router",
"icon": "split",
"color": "#10b981"
}
},
{
"id": "push-1",
"type": "module",
"position": { "x": 850, "y": 200 },
"data": {
"label": "Enviar push",
"moduleType": "action",
"icon": "bell",
"color": "#059669",
"configValues": {
"app": "notifications",
"module": "notify-push-rich",
"title": "¡Hola {{user.name}}! ¿Cómo fue la consulta de {{pet.name}}?",
"body": "Cuéntanos tu experiencia con {{vet.name}}. Solo 2 minutos.",
"deep_link": "qcplus://survey/satisfaction?encounter={{encounter.id}}"
}
}
},
{
"id": "email-1",
"type": "module",
"position": { "x": 850, "y": 400 },
"data": {
"label": "Enviar email",
"moduleType": "action",
"icon": "mail",
"color": "#059669",
"configValues": {
"app": "notifications",
"module": "notify-email",
"to": "{{user.email}}",
"subject": "{{user.name}}, ¿cómo fue la consulta de {{pet.name}}?",
"template": "satisfaction_survey_email"
}
}
},
{
"id": "log-1",
"type": "module",
"position": { "x": 1100, "y": 300 },
"data": {
"label": "Registrar envío",
"moduleType": "action",
"icon": "bar-chart",
"color": "#2563EB",
"configValues": {
"app": "data",
"module": "data-variable",
"event": "survey_sent"
}
}
}
],
"edges": [
{ "id": "e1", "source": "trigger-1", "target": "wait-1", "type": "animated-edge" },
{ "id": "e2", "source": "wait-1", "target": "condition-1", "type": "animated-edge" },
{
"id": "e3", "source": "condition-1", "target": "push-1", "type": "animated-edge",
"data": { "label": "Push ON", "filter": { "rules": [{ "operand1": "user.push_enabled", "operator": "==", "operand2": "true" }] } }
},
{
"id": "e4", "source": "condition-1", "target": "email-1", "type": "animated-edge",
"data": { "label": "Push OFF", "isFallback": true }
},
{ "id": "e5", "source": "push-1", "target": "log-1", "type": "animated-edge" },
{ "id": "e6", "source": "email-1", "target": "log-1", "type": "animated-edge" }
],
"metadata": {
"createdAt": "2026-04-01T14:00:00Z",
"createdBy": "admin",
"domainPack": "pet-health",
"description": "Flujo permanente: detecta cierres de caso en cola de telemedicina, espera 5 días, envía push/email con deep link a encuesta de satisfacción en QC+"
}
}
5. Segundo Flujo MVP Backlog — Tiempo de Respuesta en Cola (Nuevo Requisito)
El usuario menciona un nuevo requisito: "el primer cambio que nos han pedido se puede hacer con unos ajustes añadiendo una nueva configuración de tiempo de respuesta (parecida) en la configuración de la cola".
graph LR
T["⚡ TRIGGER<br/>SLA excedido<br/>Cola: Urgencias<br/>Timeout: 30min"]
--> GET["🔍 BUSCAR<br/>Obtener datos<br/>del caso y usuario"]
--> PUSH["📲 PUSH<br/>Alerta al equipo<br/>médico de guardia"]
--> ESCALAR["📊 REGISTRAR<br/>Evento de<br/>escalado"]
style T fill:#7C3AED,color:#fff
style GET fill:#2563EB,color:#fff
style PUSH fill:#059669,color:#fff
style ESCALAR fill:#2563EB,color:#fff
| Campo |
Valor |
| Trigger |
pet-queue-timeout — Tiempo de respuesta excedido |
| Cola |
Urgencias |
| SLA configurado |
30 minutos |
| Acción |
Push al equipo médico de guardia + registro de escalado |
[!TIP]
Este flujo demuestra que Pet Flows puede gestionar SLAs operativos además de engagement marketing. El mismo motor de flujos sirve para ambos casos — lo cual multiplica el valor del producto para DKV.
6. ¿Qué se necesita implementar para que el MVP Backlog funcione?
Backend (dkv-pet-flows-api)
| Componente |
Story |
SP |
Prioridad |
| Webhook ingress endpoint |
POST /api/webhooks/pet que recibe payloads de PET |
3 |
Must |
| Flow execution engine |
Dapr Workflow que interpreta el flow JSON |
13 |
Must |
| Wait/Timer activity |
ctx.createTimer() para la espera de 5 días |
3 |
Must |
| Condition evaluator |
Evaluar user.push_enabled == true |
3 |
Must |
| Gorush push activity |
HTTP POST a Gorush con payload rich |
5 |
Must |
| Email activity |
Dapr Binding SMTP |
3 |
Should |
| Total MVP Backlog backend |
|
30 SP |
|
Frontend (dkv-pet-flows-admin + Jaraxa)
| Componente |
Story |
SP |
Prioridad |
| Reemplazar mock apps por 5 apps DKV |
Datos estáticos, no API |
3 |
Must |
| Trigger config panel (cola + evento) |
Post-selección del trigger |
8 |
Must |
| Sleep config panel (duración) |
Formulario simple |
2 |
Must |
| Push config panel (título, body, deep link) |
Template con variables |
5 |
Must |
| Visualización del flujo en canvas |
Ya funciona con Jaraxa |
0 |
Done |
| Total MVP Backlog frontend |
|
18 SP |
|
Integración PET
| Componente |
Story |
SP |
Prioridad |
Configurar webhook_new_message_recipients en cola Telemedicina |
Config en dkv-pet-admin |
1 |
Must |
| Verificar payload del webhook |
Spike: interceptar y documentar |
2 |
Must |
| Total integración |
|
3 SP |
|
TOTAL MVP Backlog: ~51 SP ≈ 3-4 semanas con 1 desarrollador
Documentos Relacionados