docs: especificacion de los dos Flows de WhatsApp para el admin de Meta

JSON completo de Ciclos y Pluviometria, con la configuracion que hay que poner
en WhatsApp Manager y las dos verificaciones previas a publicar.

Va versionado porque una vez publicado un Flow su estructura no se edita, y
conviene tener registro de que se publico.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-05 08:45:44 -05:00
co-authored by Claude Sonnet 4.6
parent e5326bda8c
commit 598c3b4fda
+251
View File
@@ -0,0 +1,251 @@
================================================================================
CREAR FLOWS DE WHATSAPP — PALMAS360
Instrucciones para el administrador de Meta Business
================================================================================
CONFIGURACION COMUN
--------------------------------------------------------------------------------
WhatsApp Manager -> cuenta de WhatsApp Business -> Flows -> Crear flujo
Para los dos flujos:
Categoria .......... Otro / Personalizado
Endpoint ........... DEJAR VACIO
Plantilla .......... desde cero (JSON)
El endpoint vacio es lo importante. Si se configura uno, Meta exige cifrado y
clave publica, y no hace falta: el bot manda los datos al abrir el formulario y
recibe todo al cerrarlo.
CUAL PRIMERO
--------------------------------------------------------------------------------
Ciclos. Es una sola pantalla, sin ranuras ni maximos que definir, y ataca el
paso mas molesto del bot actual: elegir varios lotes hoy son seis mensajes de
ida y vuelta.
================================================================================
FLOW 1 — CICLOS
Nombre: Ciclos
================================================================================
Un solo Flow cubre las doce combinaciones (seis tipos de ciclo x abrir/cerrar),
porque el titulo y la lista de lotes los manda el bot en cada envio.
Sin maximos que definir: el CheckboxGroup es un solo componente cuya lista de
opciones viene de los datos, asi que da igual si la finca tiene 5 lotes o 40.
--------------------------------------------------------------------------------
{
"version": "7.0",
"screens": [
{
"id": "CICLOS",
"title": "Ciclos de lotes",
"terminal": true,
"data": {
"titulo": { "type": "string", "__example__": "Abrir ciclos — Cosecha" },
"fecha": { "type": "string", "__example__": "2026-08-04" },
"lotes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"title": { "type": "string" }
}
},
"__example__": [
{ "id": "4", "title": "REPOSO 1A" },
{ "id": "7", "title": "REPOSO 1B" },
{ "id": "9", "title": "REPOSO 2A" }
]
}
},
"layout": {
"type": "SingleColumnLayout",
"children": [
{ "type": "TextHeading", "text": "${data.titulo}" },
{
"type": "Form",
"name": "form_ciclos",
"children": [
{
"type": "DatePicker",
"name": "fecha",
"label": "Fecha",
"required": true,
"init-value": "${data.fecha}"
},
{
"type": "CheckboxGroup",
"name": "lotes",
"label": "Lotes",
"required": true,
"data-source": "${data.lotes}"
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"fecha": "${form.fecha}",
"lotes": "${form.lotes}"
}
}
}
]
}
]
}
}
]
}
================================================================================
FLOW 2 — PLUVIOMETRIA
Nombre: Pluviometria
================================================================================
Aca si hay un maximo, y es por una razon tecnica: cada finca lleva un valor
distinto, asi que necesita su propio campo. Hay ocho ranuras y el bot muestra
solo las que existen; las demas quedan ocultas.
Si alguna empresa llegara a tener mas de ocho fincas, hay que republicar el
Flow con mas ranuras. CONFIRMAR EL MAXIMO ANTES DE PUBLICAR.
--------------------------------------------------------------------------------
{
"version": "7.0",
"screens": [
{
"id": "PLUVIOMETRIA",
"title": "Registrar pluviometría",
"terminal": true,
"data": {
"fecha": { "type": "string", "__example__": "2026-08-04" },
"finca_1_label": { "type": "string", "__example__": "REPOSO" },
"finca_1_visible": { "type": "boolean", "__example__": true },
"finca_2_label": { "type": "string", "__example__": "ROSA BLANCA" },
"finca_2_visible": { "type": "boolean", "__example__": true },
"finca_3_label": { "type": "string", "__example__": "" },
"finca_3_visible": { "type": "boolean", "__example__": false },
"finca_4_label": { "type": "string", "__example__": "" },
"finca_4_visible": { "type": "boolean", "__example__": false },
"finca_5_label": { "type": "string", "__example__": "" },
"finca_5_visible": { "type": "boolean", "__example__": false },
"finca_6_label": { "type": "string", "__example__": "" },
"finca_6_visible": { "type": "boolean", "__example__": false },
"finca_7_label": { "type": "string", "__example__": "" },
"finca_7_visible": { "type": "boolean", "__example__": false },
"finca_8_label": { "type": "string", "__example__": "" },
"finca_8_visible": { "type": "boolean", "__example__": false }
},
"layout": {
"type": "SingleColumnLayout",
"children": [
{ "type": "TextBody", "text": "Milímetros de lluvia registrados por finca." },
{
"type": "Form",
"name": "form_pluvio",
"children": [
{ "type": "DatePicker", "name": "fecha", "label": "Fecha", "required": true, "init-value": "${data.fecha}" },
{ "type": "TextInput", "name": "finca_1", "label": "${data.finca_1_label}", "input-type": "number", "visible": "${data.finca_1_visible}" },
{ "type": "TextInput", "name": "finca_2", "label": "${data.finca_2_label}", "input-type": "number", "visible": "${data.finca_2_visible}" },
{ "type": "TextInput", "name": "finca_3", "label": "${data.finca_3_label}", "input-type": "number", "visible": "${data.finca_3_visible}" },
{ "type": "TextInput", "name": "finca_4", "label": "${data.finca_4_label}", "input-type": "number", "visible": "${data.finca_4_visible}" },
{ "type": "TextInput", "name": "finca_5", "label": "${data.finca_5_label}", "input-type": "number", "visible": "${data.finca_5_visible}" },
{ "type": "TextInput", "name": "finca_6", "label": "${data.finca_6_label}", "input-type": "number", "visible": "${data.finca_6_visible}" },
{ "type": "TextInput", "name": "finca_7", "label": "${data.finca_7_label}", "input-type": "number", "visible": "${data.finca_7_visible}" },
{ "type": "TextInput", "name": "finca_8", "label": "${data.finca_8_label}", "input-type": "number", "visible": "${data.finca_8_visible}" },
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"fecha": "${form.fecha}",
"finca_1": "${form.finca_1}",
"finca_2": "${form.finca_2}",
"finca_3": "${form.finca_3}",
"finca_4": "${form.finca_4}",
"finca_5": "${form.finca_5}",
"finca_6": "${form.finca_6}",
"finca_7": "${form.finca_7}",
"finca_8": "${form.finca_8}"
}
}
}
]
}
]
}
}
]
}
================================================================================
PUBLICAR
================================================================================
Guardar -> Publicar.
Despues de publicado la estructura no se edita: los cambios son una version
nueva. Por eso conviene definir las ranuras de pluviometria de una vez.
================================================================================
QUE SE NECESITA DE VUELTA
================================================================================
Los dos Flow ID. Son numeros largos que aparecen en la lista de flujos o en la
URL al abrirlos. Es lo unico que falta para conectarlos desde el bot.
Ciclos ............. _______________________
Pluviometria ....... _______________________
================================================================================
ANTES DE PUBLICAR — DOS VERIFICACIONES
================================================================================
1. VERSION DEL JSON
Esta puesta la 7.0, pero conviene usar la mas reciente que ofrezca el
editor. Al pegar el JSON, el editor valida y marca si algun componente o
propiedad cambio de nombre. Confirmar ahi antes de publicar.
2. MAXIMO DE FINCAS (solo pluviometria)
Hay ocho ranuras. Confirmar que ninguna empresa vaya a superar ese numero,
porque cambiarlo despues obliga a republicar el Flow.
Ciclos no tiene este problema.
================================================================================
NOTAS TECNICAS (para quien conecte el bot)
================================================================================
- Los valores __example__ son solo para la vista previa del editor. Los reales
los siembra el bot en flow_action_payload.data al enviar el mensaje.
- Ambos Flows usan flow_action "navigate" (sin endpoint). La respuesta llega al
webhook como mensaje interactive de tipo nfm_reply, con el contenido en
response_json.
- En Ciclos, el bot resuelve antes en chat el tipo de ciclo y la accion
(apertura/cierre), porque eso determina que lotes sembrar: apertura ofrece
todos los lotes de la finca, cierre solo los que estan abiertos.
- Falta construir del lado del bot: envio de mensajes tipo flow en
WhatsAppSender, recepcion de nfm_reply en WpWebhook, y un tipo de flujo que
siembre los datos y arme el POST.