[{"data":1,"prerenderedAt":1717},["ShallowReactive",2],{"docs-nav-docs_es":3,"docs-search-docs_es":148,"doc-docs_es-\u002Fdocs\u002Fwork\u002Fconditions":1086,"surround-docs_es-\u002Fdocs\u002Fwork\u002Fconditions":1712},[4],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Docs","\u002Fdocs","docs",[9,13,17,21,43,64,77,98,111,115,140,144],{"title":10,"path":11,"stem":12},"Introducción","\u002Fdocs\u002Fintroduction","docs\u002F01.introduction",{"title":14,"path":15,"stem":16},"Primeros pasos","\u002Fdocs\u002Fgetting-started","docs\u002F02.getting-started",{"title":18,"path":19,"stem":20},"Cómo funciona","\u002Fdocs\u002Fhow-it-works","docs\u002F03.how-it-works",{"title":22,"path":23,"stem":24,"children":25,"page":42},"Conceptos","\u002Fdocs\u002Fconcepts","docs\u002F04.concepts",[26,30,34,38],{"title":27,"path":28,"stem":29},"Workspaces y recursos","\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources","docs\u002F04.concepts\u002F1.workspaces-and-resources",{"title":31,"path":32,"stem":33},"Servicios y disponibilidad","\u002Fdocs\u002Fconcepts\u002Fservices-and-availability","docs\u002F04.concepts\u002F2.services-and-availability",{"title":35,"path":36,"stem":37},"Reservas y pre-reservas","\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds","docs\u002F04.concepts\u002F3.bookings-and-holds",{"title":39,"path":40,"stem":41},"Automatizaciones","\u002Fdocs\u002Fconcepts\u002Fautomations","docs\u002F04.concepts\u002F4.automations",false,{"title":44,"path":45,"stem":46,"children":47,"page":42},"Canales","\u002Fdocs\u002Fchannels","docs\u002F05.channels",[48,52,56,60],{"title":49,"path":50,"stem":51},"WhatsApp","\u002Fdocs\u002Fchannels\u002Fwhatsapp","docs\u002F05.channels\u002F01.whatsapp",{"title":53,"path":54,"stem":55},"Chat web","\u002Fdocs\u002Fchannels\u002Fwebchat","docs\u002F05.channels\u002F02.webchat",{"title":57,"path":58,"stem":59},"Telegram","\u002Fdocs\u002Fchannels\u002Ftelegram","docs\u002F05.channels\u002F03.telegram",{"title":61,"path":62,"stem":63},"Pausas y Estado","\u002Fdocs\u002Fchannels\u002Fpauses-and-status","docs\u002F05.channels\u002F04.pauses-and-status",{"title":65,"path":66,"stem":67,"children":68,"page":42},"Bot y conocimiento","\u002Fdocs\u002Fbot","docs\u002F06.bot",[69,73],{"title":70,"path":71,"stem":72},"El bot y la IA","\u002Fdocs\u002Fbot\u002Foverview","docs\u002F06.bot\u002F01.overview",{"title":74,"path":75,"stem":76},"Conocimiento del bot","\u002Fdocs\u002Fbot\u002Fknowledge","docs\u002F06.bot\u002F02.knowledge",{"title":78,"path":79,"stem":80,"children":81,"page":42},"Trabajo, mapa y flujos","\u002Fdocs\u002Fwork","docs\u002F07.work",[82,86,90,94],{"title":83,"path":84,"stem":85},"Trabajo y acciones","\u002Fdocs\u002Fwork\u002Ftasks-and-actions","docs\u002F07.work\u002F01.tasks-and-actions",{"title":87,"path":88,"stem":89},"Mapa y direcciones","\u002Fdocs\u002Fwork\u002Fmap-and-addresses","docs\u002F07.work\u002F02.map-and-addresses",{"title":91,"path":92,"stem":93},"Flujos","\u002Fdocs\u002Fwork\u002Fflows","docs\u002F07.work\u002F03.flows",{"title":95,"path":96,"stem":97},"Condiciones de los flujos","\u002Fdocs\u002Fwork\u002Fconditions","docs\u002F07.work\u002F04.conditions",{"title":99,"path":100,"stem":101,"children":102,"page":42},"Equipo","\u002Fdocs\u002Fteam","docs\u002F08.team",[103,107],{"title":104,"path":105,"stem":106},"Telegram del equipo","\u002Fdocs\u002Fteam\u002Ftelegram-team","docs\u002F08.team\u002F01.telegram-team",{"title":108,"path":109,"stem":110},"Roles y permisos","\u002Fdocs\u002Fteam\u002Froles","docs\u002F08.team\u002F02.roles",{"title":112,"path":113,"stem":114},"Inicio rápido","\u002Fdocs\u002Fquickstart","docs\u002F09.quickstart",{"title":116,"path":117,"stem":118,"children":119,"page":42},"API","\u002Fdocs\u002Fapi","docs\u002F10.api",[120,124,128,132,136],{"title":121,"path":122,"stem":123},"Autenticación","\u002Fdocs\u002Fapi\u002Fauthentication","docs\u002F10.api\u002F1.authentication",{"title":125,"path":126,"stem":127},"Convenciones","\u002Fdocs\u002Fapi\u002Fconventions","docs\u002F10.api\u002F2.conventions",{"title":129,"path":130,"stem":131},"Endpoints","\u002Fdocs\u002Fapi\u002Fendpoints","docs\u002F10.api\u002F3.endpoints",{"title":133,"path":134,"stem":135},"Webhooks","\u002Fdocs\u002Fapi\u002Fwebhooks","docs\u002F10.api\u002F4.webhooks",{"title":137,"path":138,"stem":139},"SDK de TypeScript y Python","\u002Fdocs\u002Fapi\u002Fsdks","docs\u002F10.api\u002F5.sdks",{"title":141,"path":142,"stem":143},"MCP y agentes de IA","\u002Fdocs\u002Fmcp","docs\u002F11.mcp",{"title":145,"path":146,"stem":147},"Recetas","\u002Fdocs\u002Frecipes","docs\u002F12.recipes",[149,153,159,164,168,173,176,181,186,191,196,201,206,211,216,219,224,229,234,239,243,248,253,256,261,266,271,276,279,284,289,294,299,304,307,312,317,322,327,332,335,340,346,351,356,359,364,369,374,379,384,389,394,397,402,407,412,417,422,426,430,433,438,443,448,452,457,461,464,469,474,479,484,489,492,497,502,507,512,517,522,526,529,534,539,544,549,554,559,562,567,572,577,582,587,592,597,602,607,612,615,620,625,630,635,640,645,648,653,658,663,668,673,676,681,686,691,696,701,704,709,714,719,724,729,734,737,742,747,752,757,762,767,770,775,780,785,790,795,800,805,810,813,818,823,828,833,836,841,846,851,856,861,864,869,874,879,884,889,893,898,903,908,913,918,923,926,931,936,941,946,951,954,959,964,969,973,978,983,987,991,995,1000,1003,1008,1013,1018,1023,1028,1031,1036,1041,1046,1051,1056,1061,1066,1071,1076,1081],{"id":11,"title":10,"titles":150,"content":151,"level":152},[],"Qué es Wagend, para quién es y los bloques que vas a usar para atender, agendar y trabajar con tu equipo. Wagend es un motor de agenda y de trabajo con un asistente de IA que atiende a tus clientes por WhatsApp, Telegram y el chat de tu sitio web. Tus clientes reservan conversando; el sistema ofrece solo horarios que existen de verdad, los pre-reserva, los confirma y avisa a tu equipo. Vos gestionás todo desde un panel, y los desarrolladores integran por API REST, webhooks, SDK y MCP. Esta documentación describe lo que ya está disponible. Lo que todavía no existe aparece marcado como Próximamente.",1,{"id":154,"title":155,"titles":156,"content":157,"level":158},"\u002Fdocs\u002Fintroduction#para-quién-es","Para quién es",[10],"Cualquier negocio que vende el tiempo de alguien o de algo. Wagend usa un vocabulario genérico (tarea, recurso, servicio) y se adapta a tu rubro con un modelo inicial: NegocioQué se reserva o se haceBarberíaUn barbero por 30 a 45 minutosEstéticaUn profesional y una máquina y una cabina, al mismo tiempoClínicaUn médico y un consultorioRestauranteCubiertos en el salón según el tamaño del grupoEntregasTareas que un repartidor toma de una cola, con destino en el mapa",2,{"id":160,"title":161,"titles":162,"content":163,"level":158},"\u002Fdocs\u002Fintroduction#qué-vas-a-usar","Qué vas a usar",[10],"Hoy: lo que tenés que hacer ahora, con lo tuyo o lo de todo el equipo según tu rol.Inbox: todas las conversaciones de todos los canales en un solo lugar; tomás el control cuando haga falta.Trabajo: todas las tareas, en lista, calendario o mapa, con acciones por etapa (tomar, soltar, completar, no estaba).Clientes, Servicios, Equipo y recursos: tu catálogo y tu gente.Bot: personalidad, conocimiento y simulador. Automatización: reglas y flujos.Wagy: el asistente del panel que te ayuda a configurar todo charlando.Configuración: Negocio, Estado, Equipo, Canales, Desarrolladores, Webhooks y Uso de IA.",{"id":165,"title":44,"titles":166,"content":167,"level":158},"\u002Fdocs\u002Fintroduction#canales",[10],"Todos los canales usan el mismo motor: un horario reservado por WhatsApp desaparece al instante del panel, del chat web y de la API. WhatsApp con asistente de IA (texto y audio).Chat web para pegar en tu sitio.Telegram con el bot propio de tu negocio.Telegram del equipo: avisos y la Mini App \"Mi día\".",{"id":169,"title":170,"titles":171,"content":172,"level":158},"\u002Fdocs\u002Fintroduction#por-dónde-seguir","Por dónde seguir",[10],"Primeros pasos: del modelo de negocio a tu primera tarea, con Wagy.Cómo funciona: la vida de un mensaje y las garantías del motor.Trabajo y acciones y Flujos.Si desarrollás: Inicio rápido de la API, SDK y MCP.",{"id":15,"title":14,"titles":174,"content":175,"level":152},[],"Guía paso a paso para armar tu negocio en Wagend con la ayuda de Wagy, conectar un canal, probar el bot y hacer tu primera tarea. Esta guía te lleva de cero a un negocio atendiendo. Lleva unos 20 minutos y podés pedirle ayuda a Wagy en cada paso.",{"id":177,"title":178,"titles":179,"content":180,"level":158},"\u002Fdocs\u002Fgetting-started#_1-crear-el-negocio-desde-un-modelo","1. Crear el negocio desde un modelo",[14],"Cada negocio (o sede) es un proyecto. Al crearlo elegís el tipo de negocio y Wagend carga un modelo con servicios, recursos, horarios y etapas típicas de ese rubro: barbería, estética, clínica, restaurante o entregas. Entrá al panel y abrí el selector de proyectos.Tocá Crear proyecto, poné el nombre, elegí el tipo de negocio, la zona horaria y el idioma.Entrá al proyecto nuevo. Tu plan define cuántos proyectos podés tener; si llegaste al límite, el selector te lo avisa. Todo lo que trae el modelo se puede cambiar después. Los nombres se adaptan al rubro (por ejemplo \"Aceptar entrega\" en entregas), pero por debajo es el mismo motor.",{"id":182,"title":183,"titles":184,"content":185,"level":158},"\u002Fdocs\u002Fgetting-started#_2-configurar-con-wagy","2. Configurar con Wagy",[14],"Wagy es el asistente de configuración del panel: un bot amigable al que le contás qué hacés y arma tu negocio con vos. Lo abrís con el botón Hablar con Wagy. Solo lo usan el propietario y los gerentes. Contale tu negocio (\"Tengo una barbería con tres barberos\").Wagy te propone un plan de cambios: una tarjeta con lo que va a crear o modificar (servicios, horarios, recursos, reglas del bot, automatizaciones).Revisá el plan y tocá Confirmar, Ajustar (seguís conversando y te arma otro) o Descartar. Nada se aplica sin tu confirmación.Si no te gusta el resultado, tocá Deshacer: podés deshacer el último plan aplicado durante 24 horas. Wagy también te muestra una lista de Primeros pasos que se marca sola con tus datos reales: perfil del negocio, horario de atención, servicios, equipo, canal conectado, bot probado, primera reserva y primera tarea completada. Y te manda avisos discretos (no más de dos por día) que podés cerrar o silenciar. Wagy nunca te pide contraseñas ni tokens: para conectar un canal te lleva a la pantalla correspondiente. Los primeros mensajes con Wagy los paga la plataforma; después consume la cuota de IA de tu plan.",{"id":187,"title":188,"titles":189,"content":190,"level":158},"\u002Fdocs\u002Fgetting-started#_3-revisar-lo-básico-a-mano","3. Revisar lo básico a mano",[14],"Si preferís el panel, estas son las pantallas: Configuración → Negocio: nombre, zona horaria, moneda, idioma, dirección y política de cancelación.Servicios: duración, precio, seña y qué recursos pide cada servicio.Equipo y recursos: personas, salas o máquinas con sus horarios. Invitá a tu equipo desde Configuración → Equipo (ver roles y permisos).",{"id":192,"title":193,"titles":194,"content":195,"level":158},"\u002Fdocs\u002Fgetting-started#_4-conectar-un-canal","4. Conectar un canal",[14],"Andá a Configuración → Canales: WhatsApp: escaneá un QR. Mirá WhatsApp.Chat web: pegá una línea de código en tu sitio. Mirá Chat web.Telegram: pegá el token de tu bot. Mirá Telegram. Todas las conversaciones llegan a la misma bandeja, el Inbox.",{"id":197,"title":198,"titles":199,"content":200,"level":158},"\u002Fdocs\u002Fgetting-started#_5-probar-el-bot","5. Probar el bot",[14],"Antes de abrirlo a clientes reales, usá el Simulador en Automatización → Bot. Conversás con el bot como si fueras un cliente, sin enviar mensajes reales; las reservas que hace son de prueba. Probá frases como \"quiero reservar\", \"¿cuánto sale?\" o \"¿hasta qué hora abren?\". Ajustá la personalidad y cargá conocimiento (ver Bot y conocimiento).",{"id":202,"title":203,"titles":204,"content":205,"level":158},"\u002Fdocs\u002Fgetting-started#_6-tu-primera-tarea","6. Tu primera tarea",[14],"Tocá Nueva tarea (está en la barra superior, en cualquier pantalla).Elegí el servicio, buscá o creá al cliente y elegí el horario.Guardá. La tarea aparece en Hoy y en Trabajo.",{"id":207,"title":208,"titles":209,"content":210,"level":158},"\u002Fdocs\u002Fgetting-started#_7-ver-el-día-en-hoy","7. Ver el día en Hoy",[14],"Hoy muestra lo que hay que hacer ahora. Los dueños y gerentes ven todo; el equipo ve lo suyo. Desde cada tarea avanzás de etapa con las acciones disponibles. Seguí con Trabajo y acciones.",{"id":212,"title":213,"titles":214,"content":215,"level":158},"\u002Fdocs\u002Fgetting-started#próximos-pasos","Próximos pasos",[14],"Flujos y condiciones: recordatorios y avisos automáticos.Telegram del equipo: avisos y \"Mi día\" en el celular.Pausas y Estado: qué hacer si algo se complica.",{"id":19,"title":18,"titles":217,"content":218,"level":152},[],"Arquitectura, principios y la vida de un mensaje, desde que llega por un canal hasta que se convierte en una tarea, una acción o un aviso.",{"id":220,"title":221,"titles":222,"content":223,"level":158},"\u002Fdocs\u002Fhow-it-works#principios","Principios",[18],"Núcleo determinístico, IA como intérprete. La IA entiende al cliente y llama herramientas. El motor calcula disponibilidad, pre-reserva y confirma. La IA nunca inventa un horario ni un precio.La base de datos garantiza las reglas. El sobreturno es imposible porque PostgreSQL rechaza asignaciones superpuestas, no porque la app \"chequee antes\".Una verdad operativa, muchas vistas. Una tarea es un solo objeto; la ves en Hoy, en lista, en calendario o en el mapa.API primero. El panel, el bot, el MCP y Wagy usan los mismos servicios. Si algo no se puede hacer por API, falta en la API.La credencial define el negocio. Una clave o sesión siempre pertenece a un proyecto.",{"id":225,"title":226,"titles":227,"content":228,"level":158},"\u002Fdocs\u002Fhow-it-works#arquitectura","Arquitectura",[18],"Canales:    WhatsApp · Chat web · Telegram · Panel · Wagy · API · MCP\n                 │\nGateway:    credencial → proyecto · permisos · límites · pausas · webhooks firmados\n                 │\nNúcleo:     conversaciones + IA │ motor de agenda y tareas │ flujos │ conocimiento\n                 │\nDatos:      PostgreSQL (seguridad por fila, constraints de exclusión) · Redis\nExternos:   modelos de IA · transcripción de audio · proveedores de canal · mapas",{"id":230,"title":231,"titles":232,"content":233,"level":158},"\u002Fdocs\u002Fhow-it-works#la-vida-de-un-mensaje","La vida de un mensaje",[18],"Llega. El canal (WhatsApp, chat web o Telegram) entrega el mensaje. Se verifica la firma o la clave, se descartan duplicados y se guarda en el Inbox. Si el canal está pausado, se aplica la pausa antes de hacer nada más.Se entiende. Los audios se transcriben. Se identifica al cliente (un cliente puede tener varias identidades: teléfono, Telegram) y la conversación. Si una persona tomó el control, el bot no responde. Las reglas del canal (por ejemplo pedir teléfono y email en el chat web) se aplican antes de llamar a la IA.La IA pide. El modelo recibe el contexto del negocio, la fecha y hora locales y los últimos mensajes. Solo puede llamar herramientas: buscar horarios, pre-reservar, confirmar, consultar el conocimiento, guardar una ubicación compartida o derivar a una persona.El motor decide. Cada llamada se valida contra las reglas del negocio y recién después se ejecuta. Si algo cambió, el motor devuelve alternativas y la IA vuelve a preguntar.Respuesta exacta. Fechas, horas, servicios, precios y direcciones salen de plantillas completadas con el resultado real.Trabajo y eventos. La reserva es una tarea con etapas. Cada cambio de etapa o acción genera eventos que disparan flujos, avisos al equipo (por Telegram o WhatsApp) y webhooks.",{"id":235,"title":236,"titles":237,"content":238,"level":158},"\u002Fdocs\u002Fhow-it-works#tareas-etapas-y-acciones","Tareas, etapas y acciones",[18],"Cada negocio define las etapas por las que pasa su trabajo y las acciones que mueven una tarea de una a otra (tomar, soltar, completar, \"no estaba\"). Una acción puede tener efectos: asignar a quien la ejecuta, liberar, cerrar con un resultado. Mirá Trabajo y acciones.",{"id":240,"title":91,"titles":241,"content":242,"level":158},"\u002Fdocs\u002Fhow-it-works#flujos",[18],"Un flujo dice \"cuando pase esto, si se cumple esta condición, hacé aquello\": enviar un mensaje, avisar al equipo, esperar, ejecutar una acción. Las condiciones son expresiones simples sobre la tarea, el cliente o la hora.",{"id":244,"title":245,"titles":246,"content":247,"level":158},"\u002Fdocs\u002Fhow-it-works#seguridad","Seguridad",[18],"Cada negocio está aislado en la propia base de datos, los secretos van cifrados y cada cambio queda en un registro de auditoría. Vos sos el responsable de los datos de tus clientes; Wagend los trata en tu nombre.",{"id":249,"title":250,"titles":251,"content":252,"level":158},"\u002Fdocs\u002Fhow-it-works#a-dónde-seguir","A dónde seguir",[18],"Reservas y pre-reservas: las garantías de la agenda.Bot y IA: qué puede y qué no puede hacer el asistente.",{"id":28,"title":27,"titles":254,"content":255,"level":152},[],"Organizaciones, workspaces, roles, recursos, modos de capacidad y grupos de recursos.",{"id":257,"title":258,"titles":259,"content":260,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#organización-y-workspaces","Organización y workspaces",[27],"En el panel, un workspace se llama proyecto: podés tener varios y cambiar entre ellos con el selector de proyectos. Una organización es la cuenta que paga. Contiene uno o más workspaces. Un workspace es un negocio o sede con sus propios: zona horaria, idioma y moneda,número(s) de WhatsApp,bot, servicios, recursos y equipo. Una cadena de tres barberías es una organización con tres workspaces.",{"id":262,"title":263,"titles":264,"content":265,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#roles","Roles",[27],"Detalle completo de cada rol y de los permisos en Roles y permisos. RolPuedeownerTodo, en todos los workspaces de la organizaciónmanagerTodo dentro de un workspacestaffVer y gestionar solo sus propios recursos (por ejemplo, el barbero ve solo su agenda)viewerSolo lectura El equipo también puede actuar por WhatsApp después de vincular su número con un código de un solo uso. Las acciones de administrador por WhatsApp siempre piden confirmación SÍ\u002FNO.",{"id":267,"title":268,"titles":269,"content":270,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#recursos","Recursos",[27],"Un recurso es cualquier cosa que una reserva consume. kindEjemplosstaffBarbero, médico, esteticista, instructorspaceSala, consultorio, cabina, salónequipmentMáquina de láser, sillón, canchatableMesa de restaurante (modo mesas)vehicleCamioneta, equipo de repartozoneZona de entrega por código postal Cada recurso tiene un modo de capacidad: exclusive — atiende una reserva a la vez (un barbero, una sala, una máquina).pooled — tiene capacidad en unidades (40 cubiertos por turno, 12 lugares en una clase, 10 entregas por ventana).",{"id":272,"title":273,"titles":274,"content":275,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#grupos-de-recursos","Grupos de recursos",[27],"Un grupo de recursos es un conjunto intercambiable (\"cualquier barbero\", \"máquinas de láser\"). Los servicios piden grupos, no recursos individuales, para que el motor elija uno. La estrategia de asignación decide cuál: assignmentComportamientocustomer_choiceElige el cliente (por ejemplo \"con Juan\"); si le da igual, usa otra estrategiaround_robinRota entre los miembrosleast_busyElige al miembro con menos reservas en el díafixedSiempre el mismo miembro (una sola máquina, una sola sala) {\n  \"name\": \"Barberos\",\n  \"assignment\": \"customer_choice\",\n  \"member_ids\": [\"res_juan\", \"res_pedro\", \"res_leo\"]\n} html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":32,"title":31,"titles":277,"content":278,"level":152},[],"Servicios, requisitos con varios recursos, horarios y cómo se calculan los slots.",{"id":280,"title":281,"titles":282,"content":283,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#servicios","Servicios",[31],"Un servicio es lo que reserva el cliente. CampoSignificadoduration_minDuración del serviciostep_minGrilla de inicio (cada 15, 30 minutos…)buffer_before_min \u002F buffer_after_minTiempo de preparación o limpieza bloqueado alrededor de la reservaprice_cents, currencyPrecio que informa el bot (siempre desde la base de datos)deposit_centsSeña necesaria para confirmar (cobro en línea: próximamente)lead_time_minAnticipación mínima (por ejemplo 60 minutos)max_advance_daysCon cuánta anticipación máxima se puede reservarwindow_modeEl slot es una ventana fija (entregas: 14:00–16:00)fulfillment_modescheduled (default, con horario) o queue (despacho por cola, sin horario fijo)intake_formJSON Schema de datos extra a pedir (obra social, dirección…)requirementsQué recursos necesita el servicio al mismo tiempo",{"id":285,"title":286,"titles":287,"content":288,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#ventana-o-despacho-dos-modos-de-cumplimiento","Ventana o despacho: dos modos de cumplimiento",[31],"Cada servicio define cómo se cumple lo reservado (fulfillment_mode): scheduled (el default): la reserva ocupa un rango de tiempo conocido — un horario fijo o, con window_mode, una ventana (entregas de 14:00 a 16:00, con cupo por zona).queue (despacho, para agua, gas o delivery on-demand): la reserva no tiene horario fijo — entra en la cola de pendientes de un repartidor. El motor la asigna al repartidor con menos tareas activas y cada repartidor tiene un cupo de tareas activas a la vez, garantizado en la base de datos. La cola usa los mismos estados que una reserva: pendiente → aceptada → iniciada → finalizada (o fallida). Así, un mismo negocio de entregas puede ofrecer ventanas programadas, despacho inmediato o ambos.",{"id":290,"title":291,"titles":292,"content":293,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#requisitos","Requisitos",[31],"Un requisito dice: de este grupo, necesito tantas unidades. Un servicio puede tener varios; un slot existe solo si todos están libres. {\n  \"name\": \"Depilación láser\",\n  \"duration_min\": 45,\n  \"buffer_after_min\": 10,\n  \"requirements\": [\n    { \"resource_group_id\": \"grp_professionals\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_lasers\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_rooms\", \"units\": 1 }\n  ]\n} Con dos profesionales y un solo láser, Wagend nunca ofrece dos sesiones de láser superpuestas. Opciones avanzadas: units: \"party_size\" — consume tantas unidades como personas (restaurantes, clases).offset_min \u002F duration_min en un requisito — usa un recurso solo en parte del servicio (por ejemplo el lavacabezas en los últimos 15 minutos de un color).",{"id":295,"title":296,"titles":297,"content":298,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#horarios","Horarios",[31],"Cada recurso tiene un horario: reglas semanales en la zona horaria del recurso más excepciones para fechas puntuales (cerrado u horario especial). {\n  \"tz\": \"America\u002FArgentina\u002FBuenos_Aires\",\n  \"weekly\": { \"tue\": [[\"09:00\", \"19:00\"]], \"sat\": [[\"08:00\", \"12:00\"], [\"13:00\", \"16:00\"]] },\n  \"overrides\": [{ \"date\": \"2026-12-24\", \"ranges\": [[\"09:00\", \"13:00\"]] }, { \"date\": \"2026-12-25\", \"closed\": true }]\n}",{"id":300,"title":301,"titles":302,"content":303,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#cómo-se-calculan-los-slots","Cómo se calculan los slots",[31],"Expandir los horarios para el rango pedido, en la zona horaria de cada recurso.Restar reservas y pre-reservas activas (más los buffers) y bloqueos manuales.Cortar en slots candidatos según la duración y la grilla del servicio.Aplicar anticipación mínima y máxima, reglas de corte y tamaño del grupo.Cruzar todos los requisitos, probando los miembros de cada grupo según la estrategia de asignación.Devolver una lista corta y ordenada. Cuando no hay nada disponible, la respuesta trae unavailable_reason (closed, no_staff, no_equipment, no_space, lead_time, max_advance, cutoff, full) para que el bot explique por qué. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":36,"title":35,"titles":305,"content":306,"level":152},[],"Estados de la reserva, la pre-reserva de 10 minutos, señas y la garantía de cero sobreturnos.",{"id":308,"title":309,"titles":310,"content":311,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#por-qué-una-pre-reserva","Por qué una pre-reserva",[35],"Una conversación por WhatsApp puede tardar minutos: el cliente elige horario, después le pedís el nombre, quizás una seña. Mientras tanto otros clientes y la API compiten por el mismo horario. La pre-reserva (hold) guarda el horario por 10 minutos (15 cuando hay seña) y vence sola.",{"id":313,"title":314,"titles":315,"content":316,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#estados","Estados",[35],"EstadoSignificadoOcupa el horarioheldPre-reserva temporalSípending_paymentEsperando la señaSíconfirmedReservadoSíchecked_inEl cliente llegóSícompletedAtendidoNocancelledCancelado (o reemplazado por una reprogramación)Nono_showAusencia marcada por una personaNoexpiredPre-reserva no confirmada a tiempoNo held ──confirm──► confirmed ──check-in──► checked_in ──► completed\n │  └─(seña)──► pending_payment ──pagada──► confirmed\n └─vence──► expired          confirmed ──cancela──► cancelled",{"id":318,"title":319,"titles":320,"content":321,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#garantías","Garantías",[35],"Cada recurso que ocupa una reserva se guarda como una asignación con un rango de tiempo.Para recursos exclusive, PostgreSQL rechaza asignaciones superpuestas con una constraint de exclusión.Para recursos pooled, los contadores de capacidad nunca superan el límite (chequeo atómico).Una reserva con varios recursos se escribe en una sola transacción: si cualquier recurso choca, no se reserva nada.POST \u002Fholds y POST \u002Fholds\u002F{id}\u002Fconfirm exigen Idempotency-Key: reintentar un request nunca crea una segunda reserva. Si el horario se ocupó mientras el cliente decidía, recibís 409 con code: \"slot_taken\" y una lista de alternatives.",{"id":323,"title":324,"titles":325,"content":326,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#reprogramar-y-cancelar","Reprogramar y cancelar",[35],"Reprogramar crea una reserva nueva y cancela la anterior (vinculadas por rescheduled_to). Los recordatorios se mueven solos.Cancelar libera el horario y cancela los recordatorios pendientes.Ausencia nunca es automática: el sistema la sugiere, una persona la confirma.",{"id":328,"title":329,"titles":330,"content":331,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#señas","Señas",[35],"Si el servicio tiene deposit_cents, confirmar la pre-reserva deja la reserva en pending_payment y el horario sigue bloqueado. El cobro en línea de la seña es próximamente: hasta entonces la reserva no pasa sola a confirmed y no se emite payment.paid.",{"id":40,"title":39,"titles":333,"content":334,"level":152},[],"Reglas simples de recordatorios y confirmaciones, horario de silencio y garantías de ejecución. Para esperas y condiciones, mirá los flujos. Hay dos herramientas de automatización: Reglas: \"cuando pase esto, mandá aquel mensaje\". Son la forma más simple de enviar recordatorios y confirmaciones. Se administran en Más → Automatización → Reglas.Flujos: esperan, deciden con condiciones y actúan sobre las tareas. Ver Flujos y Condiciones.",{"id":336,"title":337,"titles":338,"content":339,"level":158},"\u002Fdocs\u002Fconcepts\u002Fautomations#reglas","Reglas",[39],"Una regla tiene un disparador, el mensaje que se envía (una plantilla con vista previa) y, si querés, un filtro por etapa o acción. Cada negocio crea, activa y ajusta las suyas: los modelos de negocio no activan reglas por sí solos.",{"id":341,"title":342,"titles":343,"content":344,"level":345},"\u002Fdocs\u002Fconcepts\u002Fautomations#disparadores","Disparadores",[39,337],"DisparadorEjemploConfirmación de la reservaEnviar el resumenUn tiempo antes del inicio24 h antes: enviar un recordatorioUn tiempo después del finMensaje de seguimientoCancelación o reprogramaciónAvisar al clienteCambio de etapa o acciónCuando la tarea pasa a otra etapa (por ejemplo \"Salió a entrega\")Hora fija del díaAvisos al equipo, como la agenda del día Las reglas dirigidas a clientes salen por WhatsApp. Los avisos al equipo salen por Telegram, WhatsApp o email, según cómo recibe avisos cada persona: ver Telegram del equipo. En cada regla ves los últimos envíos con su estado y el motivo si falló.",3,{"id":347,"title":348,"titles":349,"content":350,"level":158},"\u002Fdocs\u002Fconcepts\u002Fautomations#garantías-de-ejecución","Garantías de ejecución",[39],"Cada envío se programa junto con el evento que lo origina, así que no se pierde.Antes de salir, el sistema vuelve a revisar la tarea. Si se reprogramó o canceló, el envío viejo se descarta.Cada envío sale una sola vez y, si falla, reintenta con espera creciente; tras 5 fallos aparece en el panel.Horario de silencio: no se envía nada a clientes entre las 21:00 y las 08:00 de la zona horaria del negocio. El envío se difiere, no se pierde.Las respuestas SÍ\u002FNO (\"sí\", \"ok\", \"👍\", \"não\"...) se interpretan sin IA: instantáneo y sin costo.",{"id":352,"title":353,"titles":354,"content":355,"level":158},"\u002Fdocs\u002Fconcepts\u002Fautomations#próximamente","Próximamente",[39],"Todavía no existen disparadores para pre-reservas vencidas ni para pagos (llegan con el cobro de señas).",{"id":50,"title":49,"titles":357,"content":358,"level":152},[],"Conectá el número de tu negocio por QR, qué hace el asistente con clientes y con tu equipo, y cómo derivar una conversación a una persona.",{"id":360,"title":361,"titles":362,"content":363,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#conectar-un-número","Conectar un número",[49],"En el panel, andá a Configuración → Canales.Tocá Vincular WhatsApp. Aparece un código QR.En el celular del negocio abrí WhatsApp, tocá Configuración (o los tres puntos), Dispositivos vinculados y Vincular un dispositivo, y apuntá la cámara al código.Cuando el estado pase a Conectado ya podés recibir mensajes. Si el código vence, tocá Reconectar para generar otro. Solo el propietario y los gerentes pueden vincular. La pantalla te muestra el estado (conectado, esperando escaneo, desconectado) y cuántas conexiones incluye tu plan. Desconectar detiene al bot en ese número pero conserva las conversaciones y el historial. Usá un número dedicado al negocio. Hoy la conexión por QR (como en WhatsApp Web) es la forma de conectar WhatsApp. No compartas el código: da acceso a tu WhatsApp. Hay un Canal de prueba: es el simulador del bot y no cuenta para tu plan.",{"id":365,"title":366,"titles":367,"content":368,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#clientes-y-equipo","Clientes y equipo",[49],"El rol se decide en el código, nunca por lo que alguien diga en el chat: Un número vinculado a alguien del equipo (verificado con un código de un solo uso) recibe herramientas de equipo.Todos los demás reciben herramientas de cliente. Herramientas de clienteHerramientas de equipo (extra)Ver servicios, buscar horarios, pre-reservar y confirmar, ver y cancelar o reagendar sus reservas, consultar la información y el conocimiento del negocio, guardar una ubicación compartida, pasar a una personaVer el día, bloquear tiempo, marcar una ausencia, actualizar el catálogo y avanzar etapas de una tarea, siempre con confirmación SÍ\u002FNO El equipo también puede recibir avisos por Telegram.",{"id":370,"title":371,"titles":372,"content":373,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#qué-puede-y-qué-no-puede-hacer-la-ia","Qué puede y qué no puede hacer la IA",[49],"PuedeNo puedeEntender texto, audio, errores de tipeo y cambios de ideaInventar horarios, precios o direccionesBuscar horarios y ofrecer 2 o 3 opcionesConfirmar una reserva sin el motorPre-reservar y pedir los datos que faltanUsar herramientas de administrador con un clienteResponder con el conocimiento del negocioSeguir instrucciones escondidas en mensajes o archivosPasar la conversación a una personaVer datos de otro negocio Más detalle en Bot y IA.",{"id":375,"title":376,"titles":377,"content":378,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#ubicación-compartida","Ubicación compartida",[49],"Si un cliente comparte su ubicación por WhatsApp, queda guardada en la conversación y el Inbox la muestra con un mapa. El bot puede usarla como destino de una entrega o como dirección del cliente, siempre pidiéndole que confirme con SÍ o NO. Ver Mapa y direcciones.",{"id":380,"title":381,"titles":382,"content":383,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#derivación-a-una-persona","Derivación a una persona",[49],"El equipo ve todas las conversaciones en vivo en el Inbox. Con Tomar el control el bot se pausa en esa conversación; vuelve solo tras 15 minutos sin actividad del operador, o cuando tocás Devolver. El asistente también deriva cuando el cliente lo pide (\"quiero hablar con una persona\").",{"id":385,"title":386,"titles":387,"content":388,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#audios-e-idiomas","Audios e idiomas",[49],"Los audios se transcriben antes de que la IA los lea y la transcripción se ve en el Inbox. El asistente responde en el idioma del cliente (portugués, español o inglés).",{"id":390,"title":391,"titles":392,"content":393,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#pausar-el-canal","Pausar el canal",[49],"Si hay spam o ruido, podés pausar el bot o todo el canal sin desconectarlo. Mirá Pausas y Estado.",{"id":54,"title":53,"titles":395,"content":396,"level":152},[],"Poné el asistente de Wagend en tu sitio con una línea de código, con datos de contacto obligatorios y reglas por canal. El chat web es un widget que tu negocio pega en su propio sitio. Conversa con el mismo bot que WhatsApp (mismos horarios, precios y reservas), sin número ni aprobaciones de terceros. Las conversaciones llegan al mismo Inbox. Si alojás Wagend vos mismo, el chat web viene apagado: se activa con PUBLIC_WEBCHAT_ENABLED=true en la API.",{"id":398,"title":399,"titles":400,"content":401,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#instalar-paso-a-paso","Instalar paso a paso",[53],"Entrá como propietario a Configuración → Canales → Chat web.En Sitios permitidos agregá cada sitio donde lo vas a usar, uno por línea, con https:\u002F\u002F y sin comodines ni rutas (por ejemplo https:\u002F\u002Fwww.mitienda.com). Para probar en tu computadora se acepta http:\u002F\u002Flocalhost.Elegí color principal, posición del botón, idioma por defecto y un título opcional (hasta 40 caracteres).Tocá Activar chat web. Recibís una clave publicable wg_web_… y el código para pegar.Pegá el snippet antes de \u003C\u002Fbody> en cada página donde quieras el chat: \u003Cscript src=\"https:\u002F\u002Fwagend.app\u002Fwidget.js\" data-key=\"wg_web_…\" defer>\u003C\u002Fscript> Atributos opcionales: data-locale (pt, es o en; por defecto usa el idioma del navegador), data-offset-bottom (píxeles, para subir el botón si tu sitio tiene una barra fija abajo) y data-api (origen de la API, solo para entornos de prueba). Si tocás Desactivar, el chat deja de funcionar y se cierran las conversaciones abiertas; al volver a activarlo recibís una clave nueva y tenés que actualizar el código. En \u002Fdemo\u002Fwebchat hay una página de demostración donde pegás la clave y ves el widget funcionando.",{"id":403,"title":404,"titles":405,"content":406,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#qué-ve-el-visitante","Qué ve el visitante",[53],"Un botón flotante que abre el chat (en el celular se abre a pantalla completa, respetando las zonas seguras), en portugués, español o inglés.Un chat breve a propósito: respuestas cortas que proponen reservar o seguir por WhatsApp. Desde la web el visitante es anónimo y cada respuesta cuesta.Si el bot le pide su ubicación (por ejemplo para una entrega), ofrece Usar mi ubicación, con consentimiento explícito.La conversación sigue entre páginas y recargas: al volver, el chat muestra lo conversado y las respuestas que llegaron mientras tanto (con un aviso de mensajes nuevos si estaba cerrado). Un botón Nueva conversación, en el menú ⋯ del chat, la borra y empieza de cero.",{"id":408,"title":409,"titles":410,"content":411,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#continuidad-entre-páginas-y-recargas","Continuidad entre páginas y recargas",[53],"Al abrir la conversación el servidor emite un código de sesión opaco. El widget lo guarda en el almacenamiento del navegador (localStorage, o sessionStorage si no está disponible) del sitio donde instalaste el chat, con una clave por clave publicable. No usa cookies ni servicios de terceros, y ahí no se guarda nada personal: ni nombre, ni teléfono, ni email, ni mensajes. Los datos de contacto declarados viven solo en el servidor, así que el chat no los vuelve a pedir dentro de la misma conversación. Al cargar otra página o recargar, el widget valida el código, trae el historial y se reconecta para recibir las respuestas nuevas.Vencimiento: la conversación vence por inactividad y por un tope máximo de duración. Si el código venció, se cerró o se purgó, el widget lo borra y empieza una conversación nueva, sin mostrar errores.Nueva conversación: el visitante la elige desde el menú ⋯. Se invalida el código en el servidor, se borra el del navegador y el chat arranca vacío. El equipo conserva el historial anterior en el Inbox hasta que se purga.Modo privado o almacenamiento bloqueado: el chat funciona igual, pero la conversación no sobrevive a una recarga.Canal pausado: si pausaste el canal, el chat no se muestra aunque el visitante tenga un código guardado; al reanudarlo, la conversación sigue. El código no es un secreto fuerte: es una llave de una sola conversación, nunca da acceso a otras ni al panel. Solo sirve desde los orígenes que autorizaste en el widget, está sujeto a los mismos límites de uso y se invalida al vencer, al elegir Nueva conversación y al purgar la conversación.",{"id":413,"title":414,"titles":415,"content":416,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#datos-de-contacto-obligatorios","Datos de contacto obligatorios",[53],"Por defecto el bot no conversa hasta tener teléfono y email: ante cualquier mensaje responde un texto fijo (sin IA) y el chat muestra un mini formulario (teléfono con selector de país, en formato internacional, y email). Apenas se completa, el primer mensaje del visitante se procesa solo, sin que lo repita. Los datos son declarados, no verificados: no identifican al visitante ni se unen a clientes existentes. Se guardan cifrados y se borran junto con la conversación vencida.",{"id":418,"title":419,"titles":420,"content":421,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#reglas-del-bot-por-canal","Reglas del bot por canal",[53],"En Canales → Reglas del bot por canal (propietario y gerente) elegís el canal (Chat web o WhatsApp) y definís: ReglaQué haceChat web (por defecto)WhatsApp (por defecto)Datos que exigeNombre, teléfono y\u002Fo email antes de conversarteléfono y emailninguno (el teléfono ya llega del canal)Cuándo los pideDesde el primer mensaje, después de unas respuestas, o nuncadesde el primer mensajenuncaTexto con el que los pideUn texto fijo personalizableel predeterminadono aplicaLímite de respuestasTope de respuestas del bot por conversación6sin topeQué ofrece al llegar al límiteContinuar por WhatsApp y\u002Fo recibir la información por emailambosningunoEstilo del bot en el canalUna preferencia de tono (hasta 500 caracteres)respuestas cortasninguna Son reglas del proyecto: las aplica el servidor antes de invocar a la IA, aunque alguien use la API pública sin el widget. Al llegar al límite el bot deja de responder y de gastar IA, manda un mensaje fijo con las opciones y la conversación queda en el Inbox como \"necesita seguimiento\", con los datos que dejó el visitante. Si no hay WhatsApp conectado, esa opción no se ofrece.",{"id":423,"title":245,"titles":424,"content":425,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#seguridad",[53],"La clave publicable solo abre conversaciones anónimas: no da acceso al panel, a la API privada ni a datos de clientes. Se puede revocar cuando quieras.El negocio sale siempre de la clave; el widget nunca envía un identificador de negocio.Solo los sitios permitidos pueden usar el chat. Sin cookies.El chequeo del origen no es autenticación: solo protege contra otros sitios en un navegador. La protección real son los límites de uso.Hay topes de mensajes por conversación, por hora y por día. Al agotarse, el chat responde que esperes y la IA no se invoca.El texto del visitante se trata como dato no confiable, y el widget lo muestra siempre como texto plano.El chat solo responde: no envía mensajes proactivos.Podés pausar el bot o todo el canal si hace falta; con el canal pausado el widget se oculta.",{"id":427,"title":116,"titles":428,"content":429,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#api",[53],"Gestión (propietario): GET|PUT|DELETE \u002Fv1\u002Fwebchat-site. Reglas por canal (propietario y gerente): GET \u002Fv1\u002Fbot\u002Fchannel-policies y PUT \u002Fv1\u002Fbot\u002Fchannel-policies\u002F{channel}. Los endpoints públicos del widget están en el contrato OpenAPI bajo \u002Fv1\u002Fpublic\u002Fwebchat. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":58,"title":57,"titles":431,"content":432,"level":152},[],"Conectá el bot de Telegram de tu negocio para que tus clientes reserven y consulten como en WhatsApp, con la misma bandeja y el mismo bot. Con Telegram, tus clientes escriben a un bot propio de tu negocio y reciben la atención del mismo asistente que en WhatsApp: mismos servicios, mismos horarios, misma bandeja. Es independiente del Telegram del equipo, que es un único bot de Wagend para avisos internos y la Mini App \"Mi día\".",{"id":434,"title":435,"titles":436,"content":437,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#conectar-tu-bot","Conectar tu bot",[57],"En Telegram abrí @BotFather y mandá \u002Fnewbot. Elegí un nombre y un usuario que termine en bot.BotFather te da un token (algo como 123456:ABC…). Es un secreto: no lo compartas.En el panel, andá a Configuración → Canales → Telegram para tus clientes.Pegá el token en Token del bot y tocá Conectar bot. Solo el propietario puede hacerlo.Cuando el estado diga Recibiendo mensajes, ya funciona. Probalo escribiéndole al bot desde tu Telegram. El token se guarda cifrado y no se vuelve a mostrar. Si lo revocás en BotFather, pegá el nuevo con Actualizar token. Un mismo bot no puede estar conectado a dos negocios. Desconectar borra el token guardado y conserva el historial.",{"id":439,"title":440,"titles":441,"content":442,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#qué-hace","Qué hace",[57],"Atiende con el mismo bot: busca horarios, pre-reserva, confirma, responde con tu conocimiento y deriva a una persona.Las opciones y confirmaciones aparecen como botones dentro del chat.Acepta texto y ubicación (también la que comparten como lugar). Hoy no procesa voz, fotos ni mensajes de grupos o canales.No tiene ventana de respuesta como WhatsApp: podés contestar cuando quieras.",{"id":444,"title":445,"titles":446,"content":447,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#identidad-multicanal","Identidad multicanal",[57],"Cada persona que escribe por Telegram queda como una identidad del cliente, verificada por Telegram y sin teléfono. Un mismo cliente puede tener varias identidades (teléfono de WhatsApp, Telegram) y verlas todas en su ficha. Los mensajes salientes se envían por el canal de la identidad correspondiente.",{"id":449,"title":376,"titles":450,"content":451,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#ubicación-compartida",[57],"Si el cliente comparte su ubicación, queda en la conversación y el Inbox muestra un mapa. El bot puede guardarla como destino de la tarea o como dirección del cliente, con confirmación SÍ\u002FNO. Mirá Mapa y direcciones.",{"id":453,"title":454,"titles":455,"content":456,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#estado-y-pausas","Estado y pausas",[57],"En Configuración → Estado ves si el bot está recibiendo mensajes, si hubo errores de entrega y si algún cliente bloqueó al bot. Podés pausar el bot o el canal.",{"id":458,"title":353,"titles":459,"content":460,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#próximamente",[57],"Instagram: todavía no está disponible.",{"id":62,"title":61,"titles":462,"content":463,"level":152},[],"Pausá un canal o la IA de tu proyecto en una emergencia, y mirá en Estado y en Uso de IA si tu negocio está atendiendo. Hay tres herramientas para cuando algo se complica (spam, costos inesperados, ruido en el Inbox) y dos pantallas para ver cómo está tu servicio.",{"id":465,"title":466,"titles":467,"content":468,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#pausar-un-canal","Pausar un canal",[61],"Cada canal conectado (WhatsApp, Telegram y chat web) se puede pausar sin desconectarlo, en Configuración → Canales. Solo propietario y gerente. Hay dos niveles: NivelQué pasaCuándo usarloPausar botLos mensajes se siguen guardando y llegan al Inbox, pero el bot no responde ni gasta IA. La conversación pasa a modo humano, marcada para atención. Opcionalmente se envía al cliente un único mensaje fijo (vos elegís el texto; por defecto \"En breve te responde una persona.\").Querés atender a mano un rato.Pausar canalTodo lo que llega por el canal se descarta: no se crean clientes, conversaciones ni mensajes, y no hay IA. Solo se cuenta cuántos se descartaron. El equipo tampoco puede enviar por ese canal. El chat web deja de mostrarse.Hay spam o abuso. Pasos: Entrá a Configuración → Canales y buscá el canal.Tocá Pausar bot o Pausar canal.Escribí un motivo (opcional), decidí si querés enviar el mensaje fijo y confirmá.Para volver, tocá Reanudar. Mientras algo está en pausa, el panel muestra un aviso con quién lo pausó y desde cuándo. Todo queda en el registro de auditoría.",{"id":470,"title":471,"titles":472,"content":473,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#pausar-la-ia-del-proyecto","Pausar la IA del proyecto",[61],"Es un interruptor de emergencia en Configuración → Uso de IA: corta todo el consumo de IA del proyecto (bot, Wagy, conocimiento y transcripción de audios) antes de que se gaste un centavo más. El bot responde un mensaje fijo y pasa la conversación al Inbox con atención.Las importaciones de conocimiento quedan en espera, sin error, y se retoman al reanudar.Lo demás sigue funcionando: calendario, tareas, clientes y acciones manuales. Tocá Pausar IA y confirmá; para volver, Reanudar IA. Solo propietario y gerente.",{"id":475,"title":476,"titles":477,"content":478,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#estado-de-mi-servicio","Estado de mi servicio",[61],"Configuración → Estado (propietario y gerente) responde en lenguaje llano si tu negocio está atendiendo. Muestra un semáforo general y una tarjeta por cada parte: WhatsApp: si está conectado y recibiendo mensajes.Asistente automático: si el bot está activo.Respuestas inteligentes: si hay cuota de IA disponible este mes.Chat web y Telegram: sitios permitidos y sesiones activas, último mensaje, topes de uso alcanzados, webhook de Telegram, errores de entrega y clientes que bloquearon al bot.Los canales disponibles que todavía no conectaste, con un enlace a Canales. Cada tarjeta con un problema trae un enlace para arreglarlo. Si algo está pausado, también se indica.",{"id":480,"title":481,"titles":482,"content":483,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#uso-de-ia","Uso de IA",[61],"Configuración → Uso de IA muestra cuánta IA usó tu negocio este mes y cuál es el límite de tu plan, con avisos al llegar al 80 % y al límite. Al llegar al límite, las funciones con IA se pausan y las automatizaciones con IA esperan en la bandeja; todo lo demás sigue funcionando.Si no se puede confirmar el uso, aparece \"Uso incierto\" y la IA puede estar limitada.El monto es el subtotal conocido, no una factura.Con Solicitar más (propietario) le avisás al equipo de Wagend para ampliar el límite.",{"id":485,"title":486,"titles":487,"content":488,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#qué-rol-puede-qué","Qué rol puede qué",[61],"AcciónPropietarioGerenteEquipo y lecturaPausar o reanudar canales e IASíSíNoVer Estado y Uso de IASíSíNoSolicitar más IASíNoNoConectar Telegram o publicar el chat webSíNoNo Más sobre permisos en Roles y permisos.",{"id":71,"title":70,"titles":490,"content":491,"level":152},[],"Qué hace el bot de tu negocio, qué no puede hacer, cómo configurarlo, probarlo en el simulador y cuándo pasa la conversación a una persona. El bot es el asistente que atiende a tus clientes por WhatsApp, Telegram y el chat de tu sitio. Entiende lo que escriben, ofrece horarios reales y deja la reserva armada. Todo lo que importa lo calcula el sistema: el bot no inventa horarios, precios ni direcciones, y no confirma nada por su cuenta.",{"id":493,"title":494,"titles":495,"content":496,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#qué-puede-y-qué-no-puede-hacer","Qué puede y qué no puede hacer",[70],"PuedeNo puedeEntender texto, audios, errores de tipeo y cambios de ideaInventar horarios, precios o direccionesBuscar horarios y ofrecer 2 o 3 opcionesConfirmar una reserva sin pasar por el motor de agendaRetener un horario y pedir los datos que faltanUsar herramientas de administración con un clienteResponder dudas con la base de conocimientoSeguir instrucciones escondidas en un mensaje o un archivoGuardar una ubicación compartida (con tu confirmación SÍ\u002FNO)Ver datos de otro negocioPasar la conversación a una persona Fechas, horas, servicios y precios de cada mensaje salen de plantillas completadas con datos del sistema. Los audios se transcriben antes de que la IA los lea, y la transcripción se ve en el Inbox.",{"id":498,"title":499,"titles":500,"content":501,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#configurar-al-bot","Configurar al bot",[70],"Andá a Más → Automatización → Bot. Tiene cuatro pestañas: Personalidad: el nombre del bot, el tono (amigable, profesional o casual), el mensaje inicial (podés usar {name} y {business}), instrucciones sobre cómo debe comportarse e idioma predeterminado.Base de conocimiento: lo que el bot sabe de tu negocio. Ver Conocimiento del bot.Simulador: probás el bot sin enviar mensajes reales.Fuentes: páginas web, secciones de un sitio y listados que el bot lee y mantiene al día. Las instrucciones son una preferencia de estilo (\"sé breve\", \"tratá de vos\"). No cambian las reglas: el bot nunca va a poder saltarse el motor de agenda.",{"id":503,"title":504,"titles":505,"content":506,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#probarlo-en-el-simulador","Probarlo en el simulador",[70],"En la pestaña Simulador escribís como si fueras un cliente. Ves las respuestas del bot, la configuración y los elementos de conocimiento activos, y las reservas de prueba que se crean. Son reservas de prueba, aparte de las reales. Reiniciar conversación empieza de cero.",{"id":508,"title":509,"titles":510,"content":511,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#cuando-entra-una-persona","Cuando entra una persona",[70],"Todas las conversaciones se ven en el Inbox, con el estado \"IA respondiendo\", \"Pide una persona\" o \"Persona atendiendo\". Tomar el control: si escribís una respuesta, el bot se pausa en esa conversación.Devolver al bot: lo hacés a mano cuando termines.Si no hay actividad tuya durante 15 minutos, el bot retoma solo.El bot también pasa la conversación al Inbox cuando el cliente pide hablar con una persona o cuando algo falla.",{"id":513,"title":514,"titles":515,"content":516,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#límites-por-canal","Límites por canal",[70],"Cada canal puede tener sus reglas. En el chat web, por ejemplo, el bot pide teléfono y email antes de conversar y deja de responder después de un número de mensajes. Está explicado en WebChat.",{"id":518,"title":519,"titles":520,"content":521,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#cuánta-ia-usa-tu-negocio","Cuánta IA usa tu negocio",[70],"En Más → Configuración → Uso de IA ves cuánto consumió tu negocio este mes y el límite de tu plan. Al llegar al 80 % aparece un aviso; si se alcanza el límite, las funciones con IA se pausan y el bot responde un mensaje fijo y pasa la conversación al Inbox. También podés cortar el consumo a mano con la pausa de emergencia: ver Pausas y Estado.",{"id":523,"title":213,"titles":524,"content":525,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#próximos-pasos",[70],"Conocimiento del bot: enseñale a responder con la información de tu negocio.WhatsApp y Telegram: conectá los canales.",{"id":75,"title":74,"titles":527,"content":528,"level":152},[],"Enseñale al bot con textos, archivos, páginas web, una sección de tu sitio o listados (hojas de cálculo, CSV, JSON y RSS) que se mantienen al día. La base de conocimiento es lo que el bot consulta para contestar dudas: horarios de atención, políticas, productos, precios, novedades. Tiene dos orígenes: lo que cargás a mano y lo que importás de fuentes que se actualizan solas. Todo está en Más → Automatización → Bot, en las pestañas Base de conocimiento y Fuentes. No pongas datos personales de clientes en ninguna fuente. Lo que está en una fuente puede aparecer en las respuestas del bot. El bot cita esos datos como información, nunca los toma como órdenes.",{"id":530,"title":531,"titles":532,"content":533,"level":158},"\u002Fdocs\u002Fbot\u002Fknowledge#cargar-conocimiento-a-mano","Cargar conocimiento a mano",[74],"En Base de conocimiento tocá Nuevo elemento y elegí el tipo: Preguntas frecuentes: una pregunta y su respuesta.Texto: un título y un contenido libre (por ejemplo, la política de cancelación).Producto\u002FServicio: nombre, descripción y precio opcional.Archivo: arrastrá un archivo (máximo 5 MB). Se procesa y se puede activar o desactivar. Cada elemento tiene un interruptor Activo: el bot solo usa los activos. Podés buscar y filtrar por tipo.",{"id":535,"title":536,"titles":537,"content":538,"level":158},"\u002Fdocs\u002Fbot\u002Fknowledge#fuentes-lo-que-se-actualiza-solo","Fuentes: lo que se actualiza solo",[74],"En Fuentes tocá Agregar fuente y elegí el tipo. El sistema la importa en pocos minutos y la refresca solo; podés cambiar la frecuencia (cada hora, 6 horas, día o semana), Actualizar ahora, Pausar y Reanudar. Cada tarjeta muestra el estado: En cola, Al día, Con error o Pausada. Una fuente que falla varias veces seguidas se pausa sola. Si la borrás, también se quitan sus ítems importados (los escritos a mano no se tocan). Reglas comunes: solo direcciones públicas http(s), hasta 2 MiB por fuente y 10 fuentes por proyecto. No se leen páginas que pidan iniciar sesión, y se respeta el robots.txt del sitio.",{"id":540,"title":541,"titles":542,"content":543,"level":345},"\u002Fdocs\u002Fbot\u002Fknowledge#una-página-web","Una página web",[74,536],"Agregar fuente → Página web, alcance Página.Escribí la URL pública (por ejemplo, tu página de precios).Se lee el texto de la página, sin ejecutar JavaScript.",{"id":545,"title":546,"titles":547,"content":548,"level":345},"\u002Fdocs\u002Fbot\u002Fknowledge#una-sección-de-tu-sitio","Una sección de tu sitio",[74,536],"Para que el bot aprenda varias páginas de un mismo sitio, sin cargarlas una por una: Agregar fuente → Página web, alcance Sección del sitio.Escribí el prefijo, por ejemplo https:\u002F\u002Ftusitio.com\u002Fayuda.Elegí el máximo de páginas (50 por defecto, hasta 200). El sistema lee el sitemap.xml del dominio y toma solo las páginas del mismo sitio que empiezan con ese prefijo. En cada actualización suma las páginas nuevas, actualiza las que cambiaron y archiva las que desaparecieron. La tarjeta muestra \"N páginas importadas\" y Ver páginas lista cada una con su estado (Importada o Archivada). No hay un rastreador: si el sitio no publica sitemap.xml, la fuente queda con el aviso correspondiente y tenés que importar las páginas una por una.",{"id":550,"title":551,"titles":552,"content":553,"level":345},"\u002Fdocs\u002Fbot\u002Fknowledge#un-listado-hoja-de-cálculo-csv-json-o-rss","Un listado: hoja de cálculo, CSV, JSON o RSS",[74,536],"Sirve para productos, precios o novedades que ya llevás en una planilla, una tienda o un feed. Agregar fuente y elegí Hoja de cálculo, CSV, API JSON o RSS.Pegá el enlace. Para una hoja de Google: Archivo → Compartir → Publicar en la web o dejala visible para cualquiera con el enlace; la primera fila debe tener encabezados.En Mapeo de campos escribí qué columna alimenta cada campo: Nombre (obligatorio), Descripción, Precio, Categoría, Enlace y Clave estable. En JSON se escribe la ruta, por ejemplo productos[].nombre. Con RSS no hace falta mapeo.Tocá Ver vista previa: te muestra las primeras filas válidas y cuántas se omiten.Si se ve bien, Guardar fuente. Hasta 1000 filas por fuente. Si usás Clave estable (un código que no cambia, como un SKU), renombrar un producto lo actualiza; sin clave, renombrarlo crea un ítem nuevo y desactiva el viejo. Para una API que pide credencial podés cargar un encabezado Authorization o un parámetro en la URL: se guarda cifrada y no se vuelve a mostrar.",{"id":555,"title":556,"titles":557,"content":558,"level":158},"\u002Fdocs\u002Fbot\u002Fknowledge#si-algo-sale-mal","Si algo sale mal",[74],"La tarjeta de la fuente explica la causa: MensajeQué hacerNo encontramos esa página (404)Revisá la direcciónLa página pide iniciar sesiónSolo se leen páginas públicasEl sitio no respondióSe reintenta solo más tardeEl sitio no publica sitemap.xmlImportá las páginas una por unaEl sitemap no tiene páginas bajo esa direcciónRevisá el prefijoEl sitemap no es válidoRevisá el sitemap del sitioEl sitio no permite que la leamos (robots.txt)Es una decisión del sitioUna columna del mapeo no existeRevisá los nombres de columnaNo se encontró texto para importarLa página o el listado están vacíos; lo ya importado no se desactiva Después de agregar conocimiento, probalo en el Simulador: preguntale lo que preguntaría un cliente. Para integrar fuentes por API, mirá los endpoints \u002Fknowledge en Endpoints.",{"id":84,"title":83,"titles":560,"content":561,"level":152},[],"Cómo se organiza el día a día en Wagend, con Hoy, Inbox y Trabajo, y cómo funcionan las etapas y las acciones de una tarea, como tomar, soltar y cerrar. En Wagend todo lo que hay que hacer es una tarea: un turno, una mesa, una visita, una entrega. Una conversación puede crear una; también las creás a mano con el botón Nueva tarea o desde la API. El panel te lo muestra con tres destinos principales: Hoy, Inbox y Trabajo. El resto está en Más.",{"id":563,"title":564,"titles":565,"content":566,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#hoy-inbox-y-trabajo","Hoy, Inbox y Trabajo",[83],"Hoy es tu panel del día. Muestra lo que necesita tu atención, lo que viene ahora, lo en curso, lo de más tarde y, plegado, lo completado. Quien es del equipo ve solo lo suyo (Mías); dueño y gerente alternan entre Mías y Todo.Inbox reúne las conversaciones que piden una persona. Ver El bot y la IA.Trabajo es el lugar donde ves todas las tareas. Se mira en dos ejes que se combinan.",{"id":568,"title":569,"titles":570,"content":571,"level":345},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#trabajo-conjunto-forma","Trabajo: conjunto × forma",[83,564],"Primero elegís qué trabajo ver (el conjunto): ConjuntoQué muestraSin asignarLo que necesita atención: sin responsable, sin horario o esperando confirmaciónHoyEl trabajo de hoy de todo el negocioPróximasLo que viene, agrupado por díaTodoTodo el trabajo, con orden y agrupación a elecciónMíasLo asignado a vos Después elegís cómo verlo (la forma): FormaCuándo apareceListaSiempreCalendarioSi hay recursos con agenda (por día, por profesional o por semana)MapaSi hay tareas con ubicación. Ver Mapa y direcciones \"Si no tiene nada, no se ve\": una forma solo aparece cuando tu negocio la necesita. Todas abren el mismo detalle de la tarea. Los filtros (buscar, prioridad, etiqueta, fechas) y el orden y la agrupación valen para todas las formas.",{"id":573,"title":574,"titles":575,"content":576,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#la-tarea-y-sus-etapas","La tarea y sus etapas",[83],"Cada tarea está en una etapa. Las etapas son el vocabulario de tu negocio: una barbería usa Confirmada → En curso → Completada; una entrega usa Sin asignar → Aceptada → En camino → Entregada. Detrás hay estados fijos (pre-reserva, confirmada, en curso, completada, cancelada, ausente, fallida), por eso los números y las estadísticas significan lo mismo en todos los rubros. El detalle de la tarea muestra el cliente, la fecha y el recurso, las notas, los datos del formulario, el origen (por ejemplo la conversación de WhatsApp de donde vino) y los comentarios y la actividad.",{"id":578,"title":579,"titles":580,"content":581,"level":345},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#formularios-por-servicio","Formularios por servicio",[83,574],"Un servicio puede pedir datos propios al crear la tarea: la dirección de entrega, el motivo de la consulta, el modelo del equipo. Esos datos se completan en la tarea y quedan guardados con ella. Se definen en el servicio (Más → Negocio → Servicios).",{"id":583,"title":584,"titles":585,"content":586,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#acciones","Acciones",[83],"Las acciones son los botones de una tarea. Según la etapa, el rol y el negocio, el panel muestra una acción principal grande (por ejemplo Aceptar entrega o En camino) y el resto en Otras acciones. Cada acción puede pedir confirmación o un formulario corto (un comentario, un motivo). Una acción puede hacer más que cambiar la etapa. Los efectos disponibles son: EfectoQué haceTomarLa tarea queda asignada a quien la toma. Si otra persona llegó antes, avisa y no la asigna dos vecesAsignarEl dueño o el gerente elige a quién se la daSoltarLa tarea vuelve a Sin asignar para que otra persona la tome (solo antes de empezar)ResultadoCierra la tarea como completada, ausente (\"no estaba\"), rechazada (\"no quiere\"), o cancelada, con un motivo opcionalReagendarEn tareas sin horario, mueve el vencimiento para dentro de un rato Todo lo que hace una acción ocurre junto o no ocurre: si algo falla, no queda nada a medias. Y la acción nunca da permisos extra: una persona del equipo no puede asignar tareas aunque el botón existiera.",{"id":588,"title":589,"titles":590,"content":591,"level":345},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#tareas-sin-asignar-y-colas","Tareas sin asignar y colas",[83,584],"Hay trabajos que no tienen horario, como las entregas. Entran como Sin asignar, quien los puede hacer los toma y después sigue la secuencia. Una persona del equipo ve las tareas asignadas a ella y las que su grupo puede tomar, sin el teléfono ni el email del cliente hasta que la toma. Un repartidor ve primero solo la zona aproximada. Ejemplo del rubro de entregas: Llega un pedido: queda Sin asignar.Un repartidor toca Aceptar entrega: la tarea es suya. (O el gerente toca Asignar entrega.)Si no puede, toca Soltar entrega y vuelve a la cola.Toca En camino, luego Llegué.Cierra con Completar, o con No estaba o No quiere (más un motivo).",{"id":593,"title":594,"titles":595,"content":596,"level":345},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#cada-rubro-con-su-vocabulario","Cada rubro con su vocabulario",[83,584],"Las etapas y acciones vienen de la plantilla de tu rubro (barbería, estética, clínica, restaurante, entregas) y se pueden ajustar. Barbería, estética, clínica y restaurante traen Iniciar, Completar, Cancelar y Ausencia. Si querés cambiar los nombres o agregar acciones, hoy se hace por la API o el servidor MCP: ver API y MCP.",{"id":598,"title":599,"titles":600,"content":601,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#evidencia-de-trabajo","Evidencia de trabajo",[83],"Una acción puede pedir la ubicación del momento (por ejemplo al marcar \"Llegué\") y la tarea admite adjuntos (foto, documento, audio, nota). Son privados: solo los ve quien tiene acceso a esa tarea, los enlaces de descarga vencen a los 60 segundos y se borran pasado un plazo (30 días por defecto). El dueño o el gerente pueden borrar una ubicación.",{"id":603,"title":604,"titles":605,"content":606,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#qué-ve-cada-rol","Qué ve cada rol",[83],"RolHoyTrabajoClientesPropietario y gerenteTodo el negocioTodoSíEquipoLo suyo y lo que puede tomarLo suyo y lo que puede tomarNoLecturaSolo verSolo verNo Más detalles en Roles y permisos.",{"id":608,"title":609,"titles":610,"content":611,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#automatizar-el-trabajo","Automatizar el trabajo",[83],"Cada cambio de etapa o acción puede disparar un mensaje o un flujo: ver Flujos.",{"id":88,"title":87,"titles":613,"content":614,"level":152},[],"La vista Mapa de Trabajo, la dirección con autocompletar, la ubicación compartida por el cliente y cómo se protege la privacidad. Si tu negocio atiende en la dirección del cliente (entregas, visitas, servicio técnico), Wagend guarda dónde es cada tarea y te la muestra en un mapa.",{"id":616,"title":617,"titles":618,"content":619,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#la-vista-mapa","La vista Mapa",[87],"En Trabajo, la forma Mapa aparece cuando hay al menos una tarea con ubicación. Si no la necesitás, no se ve. Cada tarea es un marcador, con color, símbolo y nombre según su estado: pendiente, confirmada, en curso, completada o con problema. El color no es lo único que las distingue.Tocá un marcador para abrir la tarea.La lista lateral muestra las mismas tareas (útil con teclado o lector de pantalla). Las tareas sin ubicación se listan aparte.Se ajusta solo a los resultados y muestra hasta 500 tareas; si hay más, afiná los filtros. Los filtros y el conjunto (Sin asignar, Hoy, Próximas...) valen igual que en la lista.La leyenda cuenta las tareas por estado. El mapa usa Google Maps. Si Google no está disponible, se usa un mapa de respaldo y la vista sigue funcionando.",{"id":621,"title":622,"titles":623,"content":624,"level":345},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#modo-claro-y-oscuro","Modo claro y oscuro",[87,617],"Un selector flotante tiene tres opciones: Automático, Claro y Oscuro. Automático sigue el tema de tu panel. Se recuerda por navegador.",{"id":626,"title":627,"titles":628,"content":629,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#dirección-con-autocompletar","Dirección con autocompletar",[87],"Al cargar la dirección de un cliente, o el destino de una tarea (Nueva tarea o la edición), aparece un buscador: Empezá a escribir calle y número (desde 3 caracteres).Elegí una sugerencia: se guardan la dirección completa (calle, número, barrio, ciudad, código postal, país) y el punto en el mapa.Se muestra un mapa chico con un pin: arrastralo o tocá el mapa para ajustar la ubicación exacta. Si preferís, cargá la dirección a mano y tocá Ubicar en el mapa: el sistema la busca y deja el pin para que lo muevas. Si el autocompletado no está disponible, avisa y lo que escribiste pasa a la carga manual: no perdés nada. Un servicio \"tiene destino\" cuando su formulario pide la dirección de entrega. Para ese servicio, el destino se carga con este mismo buscador.",{"id":631,"title":632,"titles":633,"content":634,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#ubicación-compartida-por-el-cliente","Ubicación compartida por el cliente",[87],"Un cliente puede mandar su ubicación por WhatsApp o Telegram (o desde el chat web, con consentimiento explícito). En el Inbox el mensaje se ve con un mapa chico, el nombre o dirección si el canal los trajo y un enlace Abrir en el mapa.Si el servicio pide destino, el bot puede guardar esa ubicación como destino de la tarea o como dirección del cliente. Antes te pregunta con SÍ\u002FNO en la conversación.En el chat web, el widget ofrece \"Usar mi ubicación\" solo cuando el bot la pidió, y el visitante tiene que aceptar de forma explícita.",{"id":636,"title":637,"titles":638,"content":639,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#privacidad","Privacidad",[87],"La dirección y la ubicación son datos personales: no van a registros ni a la URL del panel.Un repartidor ve de una tarea sin tomar solo la zona aproximada. La dirección exacta aparece cuando la toma. Ver Trabajo y acciones.Google recibe lo que su mapa necesita para dibujarse. En la vista Mapa no recibe direcciones ni coordenadas de tus tareas. El autocompletado y \"Ubicar en el mapa\" sí le envían el texto de la dirección que buscás. Si tus clientes tienen requisitos especiales, mencionalo en tu aviso de privacidad.",{"id":641,"title":642,"titles":643,"content":644,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#para-quien-administra-la-cuenta","Para quien administra la cuenta",[87],"El mapa de Google necesita una clave de navegador y tres APIs de Google Maps Platform habilitadas (Maps JavaScript, Places y Geocoding). Es una configuración de la plataforma, no del negocio: si el mapa o el autocompletado no aparecen, consultá con soporte.",{"id":92,"title":91,"titles":646,"content":647,"level":152},[],"Qué hacer automáticamente cuando pasa algo en tu negocio, con esperas, condiciones y avisos. Cómo cargar ejemplos, activarlos, pausarlos y ver su historial. Un flujo es lo que el sistema hace solo cuando pasa algo: cuando ocurre un evento, esperar un tiempo, mirar una condición y hacer algo (avisar al equipo, mandar un mensaje, ejecutar una acción). Es el paso siguiente a las reglas simples de recordatorios. Los flujos están en Más → Automatización → Flujos.",{"id":649,"title":650,"titles":651,"content":652,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#las-piezas","Las piezas",[91],"Disparador: cuándo empieza. Algunos de los eventos disponibles: se crea, se asigna, se modifica, se completa o se cancela una tarea; cambia su estado; una tarea vence;se ejecuta una acción (por ejemplo, alguien marca \"No estaba\");empieza, se resuelve o llega un mensaje a una conversación;se crea un cliente o queda inactivo;se agrega un adjunto o se registra una ubicación. Pasos: qué hace. PasoQué haceEsperarUna duración (por ejemplo 2 horas), hasta una fecha, hasta una hora del día, un tiempo antes o después del inicio o fin de la tarea, o hasta que ocurra un evento con un máximo de espera. Hasta 90 díasCondición\"Si se cumple esta condición\": sigue por la rama Si se cumple o Si no se cumple. Ver CondicionesAvisar al equipoUn aviso interno sobre una tarea, por Telegram, WhatsApp o email según cómo reciba avisos cada personaEnviar un mensaje al clienteUn mensaje en su conversaciónEjecutar una acciónUsa una acción de la tarea (por ejemplo Soltar entrega), con las mismas reglas que el panelDejar un comentarioUna nota en la tareaCrear, actualizar o asignar una tareaOperaciones sobre tareasCalcular datosPrepara valores para usar en pasos siguientes Un flujo tiene hasta 32 pasos, sin ciclos. Los flujos no saltan ninguna regla: cada paso lo vuelve a validar el sistema, con el rol del dueño o gerente que creó el flujo. Una espera se cancela sola si la tarea se cancela.",{"id":654,"title":655,"titles":656,"content":657,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#empezar-con-ejemplos","Empezar con ejemplos",[91],"Tu plantilla de rubro trae flujos de ejemplo. En Flujos tocá Cargar ejemplos (solo el dueño). Quedan inactivos hasta que los actives, y volver a cargar no los duplica. RubroEjemploEntregasEntrega sin tomar por 2 h: cuando se crea una entrega, esperar 2 horas y, si sigue sin asignar, avisar al equipoEntregasEntrega aceptada que no sale en 30 min: si alguien acepta y no sale, la entrega vuelve a Sin asignarBarberíaTercera ausencia del cliente: al marcar una ausencia, si es la tercera, avisar para pedir seña la próxima vez",{"id":659,"title":660,"titles":661,"content":662,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#ver-activar-y-pausar","Ver, activar y pausar",[91],"Cada flujo muestra su estado (Activo, Pausado o Borrador) y su última ejecución. Al abrirlo ves Qué hace en lenguaje simple: el disparador y los pasos, con las ramas. Tocá Activar y confirmá. Desde ese momento actúa solo cada vez que se cumple el disparador.Pausar deja de empezar ejecuciones nuevas; las que ya están en curso terminan su camino.En Historial de ejecuciones ves cada corrida con su estado (Completada, En curso, Esperando, Falló, Cancelada...), hasta cuándo espera y qué rama tomó. Un flujo Borrador permite editar la condición: Editar condición, Probar esta condición y Guardar como versión nueva. Para cambiar un flujo activo o uno más complejo, pedíselo a Wagy, el asistente (Primeros pasos), o usá la API. Antes de activar un flujo con condición, probala con Probar esta condición sobre una tarea real. No cambia nada: solo te dice si da verdadero o falso.",{"id":664,"title":665,"titles":666,"content":667,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#flujos-y-reglas","Flujos y reglas",[91],"Las Reglas (pestaña al lado de Flujos) siguen siendo la forma más simple de mandar un recordatorio o una confirmación. Un flujo que viene de una regla clásica se administra en Reglas. Los flujos son para lo que necesita esperar, decidir o actuar sobre las tareas.",{"id":669,"title":670,"titles":671,"content":672,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#para-desarrolladores","Para desarrolladores",[91],"Los flujos se gestionan por API (\u002Fv1\u002Fautomation-flows, solo dueño o gerente con sesión del panel). Ver Endpoints. Los eventos que los disparan son los mismos que reciben tus webhooks.",{"id":96,"title":95,"titles":674,"content":675,"level":152},[],"Cómo escribir una condición en un flujo, qué datos puede mirar, ejemplos listos por rubro y cómo probarla antes de activarla. Una condición decide por qué rama sigue un flujo. Se escribe como una frase corta que da verdadero o falso, por ejemplo \"el servicio cuesta más de 100 y el cliente es VIP\". Una condición solo mira datos: no cambia nada.",{"id":677,"title":678,"titles":679,"content":680,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#cómo-se-escribe","Cómo se escribe",[95],"QuéEjemploComparar== (igual), !=, \u003C, \u003C=, >, >=Combinar&& (y), || (o), ! (no)Texto\"entrega\" entre comillasEstá en una lista\"vip\" in customer.tagsContieneservice.name.contains(\"Corte\")Si \u002F entoncesworkItem.priority == \"urgent\" ? now.hour \u003C 22 : now.hour \u003C 18Un campocustomer.no_show_count, con punto Eso es todo el lenguaje: no hay bucles ni funciones propias. Las condiciones se validan al guardar el flujo y de nuevo al activarlo.",{"id":682,"title":683,"titles":684,"content":685,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#qué-datos-puede-mirar","Qué datos puede mirar",[95],"ObjetoQué traetriggerEl evento que empezó el flujo. Con una acción ejecutada: action_key (la acción), from_stage, to_stageworkItemLa tarea: status, stage, priority, tags, party_size, start_at, due_at, age_minutes (minutos desde que se creó), assigned (si tiene responsable)customername, locale (idioma), tags, no_show_count (ausencias reales)servicename, price_cents (el precio en centavos: 100,00 es 10000), deposit_cents, duration_minresourcename, kindnowLa hora de tu negocio: hour, minute, weekday (0 = lunes ... 6 = domingo)variablesValores que calculó un paso anterior Por privacidad, una condición no ve teléfonos, emails, documentos, direcciones ni notas del cliente. Si el evento no trae una tarea, workItem, customer y service llegan vacíos y la condición falla con un mensaje claro, no responde \"falso\" en silencio.",{"id":687,"title":688,"titles":689,"content":690,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#ejemplos","Ejemplos",[95],"VIP con un servicio caro: avisar al gerente service.price_cents > 10000 && \"vip\" in customer.tags \"No estaba\" antes de las 18 h (disparador: se ejecuta una acción) trigger.action_key == \"nao_estava\" && now.hour \u003C 18 Tercera ausencia: pedir seña la próxima vez trigger.action_key == \"ausencia\" && customer.no_show_count >= 3 Tarea sin tomar hace más de 2 horas (después de un paso Esperar de 2 h) !workItem.assigned && workItem.age_minutes > 120 Fuera del horario comercial (sábado, domingo o fuera de 9 a 18) now.weekday >= 5 || now.hour \u003C 9 || now.hour >= 18 Tarea urgente workItem.priority == \"urgent\" || \"urgente\" in workItem.tags Cliente que habla portugués customer.locale == \"pt\" Seña pendiente hace más de una hora workItem.stage == \"aguardando_sinal\" && workItem.age_minutes >= 60 Servicio largo de corte service.name.contains(\"Corte\") && service.duration_min >= 45 Las claves de acción y de etapa (ausencia, nao_estava, aguardando_sinal) son las de tu plantilla de rubro. Si cambiaste los nombres, usá los tuyos.",{"id":692,"title":693,"titles":694,"content":695,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#probar-una-condición","Probar una condición",[95],"En el detalle de un flujo, tocá Probar esta condición (o Probar condición): Escribí la condición.Elegí una tarea real de tu proyecto con el buscador.Si mira trigger.action_key, escribí la clave de la acción en Simular la acción.Tocá Probar. Te muestra Verdadero o Falso y, debajo, Lo que vio la condición: exactamente los datos con los que decidió. No se ejecuta nada.",{"id":697,"title":698,"titles":699,"content":700,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#errores-comunes","Errores comunes",[95],"Al guardar, el mensaje dice qué paso falló y por qué: ProblemaQué significaEl campo no existeUsaste un dato que no está disponible (por ejemplo customer.email)Tipos que no combinanComparaste texto con un número (customer.name > 5)No da verdadero o falsoLa condición tiene que ser una pregunta de sí o noFunción no permitidaSolo existe containsObjeto desconocidoSolo se pueden usar los objetos de la tabla de arribaDemasiado larga o costosaDividila en dos condiciones con otro paso en medio Una condición admite hasta 1024 caracteres y se evalúa en una fracción de segundo.",{"id":105,"title":104,"titles":702,"content":703,"level":152},[],"Recibí avisos de trabajo en Telegram, tomá tareas con un toque y abrí tu jornada en la Mini App \"Mi día\". Telegram del equipo es la forma más rápida de que cada persona del negocio se entere de lo que le toca: una tarea asignada, un trabajo sin tomar, un recordatorio o el resumen del día. Se usa desde el celular, sin instalar nada más que Telegram. Hay un solo bot de Wagend para todos los equipos. No es el bot de tu negocio: ese es el que conversa con tus clientes (Telegram de clientes). Los dos son independientes y no se mezclan.",{"id":705,"title":706,"titles":707,"content":708,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#vincular-tu-telegram","Vincular tu Telegram",[104],"El vínculo es por persona, no por negocio: lo hacés una vez y vale para todos los negocios a los que tenés acceso. En el panel, abrí Mi cuenta (tu nombre, al pie del menú) y tocá Vincular Telegram.Tocá Abrir Telegram y, en el bot, Iniciar. El bot confirma que quedó vinculado.Para desvincular, escribí \u002Fsalir al bot o desvinculalo desde Mi cuenta. El enlace de vínculo es de un solo uso y vence a los 15 minutos. Si venció, generá otro. Si no ves la opción Vincular Telegram, el bot del equipo todavía no está activado en tu entorno: avisanos.",{"id":710,"title":711,"titles":712,"content":713,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#qué-avisos-recibís","Qué avisos recibís",[104],"AvisoCuándo llegaTarea asignadaAlguien te asignó una tareaTrabajo sin tomarHay una tarea de cola que tu grupo puede tomarRecordatorioFalta poco para un turno (aviso previo del equipo)Reporte diarioResumen de tu jornadaCambiosUna tarea tuya se canceló o cambió Los avisos traen botones para actuar sin abrir el panel: Abrir abre la Mini App directamente en esa tarea.Tomar y Completar ejecutan la acción con tus permisos, igual que en el panel. Si otra persona tomó el trabajo antes, te avisa que ya está tomado.Los avisos nunca incluyen datos de otro negocio. Los recordatorios, el reporte diario y el aviso al equipo salen de tus flujos y reglas. Si activás uno, el equipo lo recibe por este canal.",{"id":715,"title":716,"titles":717,"content":718,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#elegí-cómo-recibirlos","Elegí cómo recibirlos",[104],"En Mi cuenta → Preferencias de avisos definís: Canal preferido: automático, Telegram, WhatsApp o email. En automático, Telegram si lo tenés vinculado; si no, WhatsApp (con tu vínculo verificado) y, si tampoco, email.Qué silenciar: asignadas, sin tomar, recordatorios, reporte diario o cambios. Si Telegram no puede entregar un aviso (por ejemplo, bloqueaste el bot), el aviso cae al siguiente canal.",{"id":720,"title":721,"titles":722,"content":723,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#comandos","Comandos",[104],"ComandoQué hace\u002FstartVincula tu cuenta (con el enlace de Mi cuenta)\u002FhoyTe muestra tu día, por negocio\u002FsalirDesvincula tu Telegram",{"id":725,"title":726,"titles":727,"content":728,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#mini-app-mi-día","Mini App \"Mi día\"",[104],"El botón de menú del bot (a la izquierda del campo de texto) abre Mi día: el panel en formato compacto dentro de Telegram, sin pedirte contraseña. Muestra lo mismo que verías en el panel según tu rol: Hoy y Trabajo (con \"Mías\" por defecto para el personal) y un selector de negocio si tenés varios. La sesión dura 60 minutos y solo toca Hoy, Trabajo y las tareas. No da acceso a claves de API, equipo, canales ni webhooks.Se corta sola si desvinculás Telegram o si te dan de baja del negocio.",{"id":730,"title":731,"titles":732,"content":733,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#límites-y-seguridad","Límites y seguridad",[104],"El bot solo habla en chats privados con una persona.Telegram admite 1 mensaje por segundo por chat; si hay muchos avisos juntos, los siguientes esperan en cola y llegan igual.El vínculo y la Mini App se validan siempre en el servidor. Un enlace usado, vencido o de otra cuenta responde con el mismo mensaje neutro. Para qué ve y qué puede hacer cada persona, mirá Roles y permisos. Para desarrolladores: los endpoints GET\u002FDELETE \u002Fme\u002Ftelegram, POST \u002Fme\u002Ftelegram\u002Flink y GET\u002FPUT \u002Fme\u002Fnotification-preferences son de la cuenta del usuario (sesión de panel) y no se usan con claves de API.",{"id":109,"title":108,"titles":735,"content":736,"level":152},[],"Qué puede ver y hacer cada rol (dueño, gerente, personal y solo lectura), cómo invitar al equipo y cómo trabajar con varios proyectos. Cada persona entra a un negocio (un proyecto) con un rol. El rol decide qué pantallas ve y qué puede cambiar. Lo controla el servidor: ocultar un botón en el panel no es la única barrera.",{"id":738,"title":739,"titles":740,"content":741,"level":158},"\u002Fdocs\u002Fteam\u002Froles#los-cuatro-roles","Los cuatro roles",[108],"RolPara quiénQué haceDueño (owner)Quien administra la cuentaTodo, incluidas las claves de API, el equipo y los canalesGerente (manager)EncargadosOpera el negocio: catálogo, equipo, clientes, bot, flujos, canales y webhooks. No administra las claves de APIPersonal (staff)Quien atiende o reparteVe y trabaja lo suyo: sus tareas y lo que su grupo puede tomarSolo lectura (viewer)Socios, contadoresMira Hoy, Trabajo y conversaciones; no modifica nada",{"id":743,"title":744,"titles":745,"content":746,"level":158},"\u002Fdocs\u002Fteam\u002Froles#qué-ve-cada-uno-en-el-panel","Qué ve cada uno en el panel",[108],"SecciónDueñoGerentePersonalSolo lecturaHoy y TrabajoSíSíLo suyoSí (lectura)ConversacionesSíSíSolo las suyasSí (lectura)Catálogo, Equipo, ClientesSíSíNoNoBot y FlujosSíSíNoNoConfiguración, Canales, IA y usoSíSíNoNoWebhooksSíSíNoNoClaves de API (Desarrolladores)SíNoNoNo El personal busca clientes con una vista mínima: nombre, teléfono parcialmente oculto, etiquetas y ausencias, con un mínimo de caracteres y un tope de resultados. Un repartidor ve el destino exacto de una entrega solo después de tomarla; antes ve una zona aproximada.",{"id":748,"title":749,"titles":750,"content":751,"level":158},"\u002Fdocs\u002Fteam\u002Froles#invitar-al-equipo","Invitar al equipo",[108],"En Equipo podés invitar de dos maneras: Por email: para dueño, gerente, personal o solo lectura. La persona acepta la invitación y crea su contraseña.Por contacto (WhatsApp): solo para personal operativo, sin contraseña. Se le manda un enlace de acceso a su agenda. A una persona del personal la asociás a uno o más recursos (su agenda, su vehículo): eso define qué tareas ve y cuáles puede tomar. Podés cambiar el rol o dar de baja a alguien cuando quieras; sus sesiones y su Telegram dejan de funcionar al instante.",{"id":753,"title":754,"titles":755,"content":756,"level":158},"\u002Fdocs\u002Fteam\u002Froles#varios-proyectos","Varios proyectos",[108],"Una cuenta puede tener varios proyectos (negocios o sedes), cada uno con su equipo, su agenda, sus canales y sus datos, completamente aislados. El número de proyectos depende del plan. Con más de un proyecto, el selector de proyecto del panel te deja cambiar de uno a otro.Solo el dueño de la cuenta puede crear un proyecto nuevo, a partir de un modelo por rubro (barbería, estética, clínica, restaurante o entregas).Tu rol puede ser distinto en cada proyecto.",{"id":758,"title":759,"titles":760,"content":761,"level":158},"\u002Fdocs\u002Fteam\u002Froles#soporte-de-plataforma","Soporte de plataforma",[108],"Cuando necesitás ayuda, el equipo de Wagend puede entrar a tu proyecto de forma temporal: Siempre con un motivo escrito y por un máximo de 60 minutos.En modo lectura (ve lo que vería un gerente, sin cambiar nada) o asistencia (puede ajustar catálogo, horarios y configuración del negocio).Nunca puede ver ni cambiar claves de API, contraseñas, secretos de canales, facturación ni el equipo, ni enviar mensajes a tus clientes.Cada entrada y salida queda registrada y el dueño las ve en la actividad del negocio, con quién, en qué modo y por qué.",{"id":763,"title":764,"titles":765,"content":766,"level":158},"\u002Fdocs\u002Fteam\u002Froles#claves-de-api-y-permisos","Claves de API y permisos",[108],"Las claves de API no tienen rol: tienen scopes (permisos acotados, como slots:read o bookings:write) y las crea solo el dueño. Mirá Autenticación.",{"id":113,"title":112,"titles":768,"content":769,"level":152},[],"Creá tu primera reserva por API en cinco minutos con una clave de un negocio de prueba: servicios, horarios, pre-reserva y confirmación. Esta guía crea una reserva real, así que usá una clave de producción (wg_live_...) de un negocio que armaste para probar. Las claves wg_test_ son de solo lectura: permiten listar y leer, no crear ni modificar nada. Un sandbox para escrituras es Próximamente. Para probar el bot sin WhatsApp, usá el simulador del panel. URL base: https:\u002F\u002Fapi.wagend.app\u002Fv1. Cada request necesita Authorization: Bearer \u003Cclave>.",{"id":771,"title":772,"titles":773,"content":774,"level":158},"\u002Fdocs\u002Fquickstart#_1-generá-una-clave","1. Generá una clave",[112],"En el panel, andá a Configuración → Desarrolladores, creá una clave de Producción y marcá los scopes slots:read, bookings:write y config:read. La clave se muestra una sola vez. export WAGEND_KEY=\"wg_live_xxxxxxxx_xxxxxxxxxxxxxxxxxxxx\"",{"id":776,"title":777,"titles":778,"content":779,"level":158},"\u002Fdocs\u002Fquickstart#_2-verificá-quién-sos","2. Verificá quién sos",[112],"curl https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fme -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"workspace\": { \"id\": \"ws_9f2c\", \"name\": \"Barbería Centro\", \"timezone\": \"America\u002FSao_Paulo\", \"locale\": \"es\", \"currency\": \"BRL\" },\n  \"scopes\": [\"slots:read\", \"bookings:write\", \"config:read\"],\n  \"mode\": \"live\"\n} El workspace siempre sale de la clave. Nunca enviás un id de workspace.",{"id":781,"title":782,"titles":783,"content":784,"level":158},"\u002Fdocs\u002Fquickstart#_3-listá-los-servicios","3. Listá los servicios",[112],"curl https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fservices -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"data\": [\n    { \"id\": \"svc_corte\", \"name\": \"Corte\", \"duration_min\": 30, \"price_cents\": 5000, \"currency\": \"BRL\",\n      \"requirements\": [{ \"resource_group_id\": \"grp_barbers\", \"units\": 1 }] }\n  ]\n}",{"id":786,"title":787,"titles":788,"content":789,"level":158},"\u002Fdocs\u002Fquickstart#_4-buscá-horarios-disponibles","4. Buscá horarios disponibles",[112],"curl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fslots?service_id=svc_corte&from=2026-10-15T08:00:00-03:00&to=2026-10-15T13:00:00-03:00\" \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"data\": [\n    { \"start\": \"2026-10-15T09:00:00-03:00\", \"end\": \"2026-10-15T09:30:00-03:00\", \"resource_ids\": [\"res_juan\"] },\n    { \"start\": \"2026-10-15T09:45:00-03:00\", \"end\": \"2026-10-15T10:15:00-03:00\", \"resource_ids\": [\"res_juan\"] }\n  ],\n  \"unavailable_reason\": null\n}",{"id":791,"title":792,"titles":793,"content":794,"level":158},"\u002Fdocs\u002Fquickstart#_5-pre-reservá-el-horario","5. Pre-reservá el horario",[112],"La pre-reserva (hold) guarda el horario por 10 minutos mientras juntás los datos del cliente. Enviá siempre un Idempotency-Key para que los reintentos sean seguros. curl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fholds \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"service_id\": \"svc_corte\", \"start\": \"2026-10-15T09:45:00-03:00\", \"resource_ids\": [\"res_juan\"] }' { \"id\": \"bkg_7Qx1\", \"status\": \"held\", \"expires_at\": \"2026-10-14T15:30:00-03:00\", \"start\": \"2026-10-15T09:45:00-03:00\" }",{"id":796,"title":797,"titles":798,"content":799,"level":158},"\u002Fdocs\u002Fquickstart#_6-confirmá","6. Confirmá",[112],"curl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fholds\u002Fbkg_7Qx1\u002Fconfirm \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"customer\": { \"name\": \"Carlos\", \"phone\": \"+5491155550000\", \"locale\": \"es\" } }' { \"id\": \"bkg_7Qx1\", \"status\": \"confirmed\", \"start\": \"2026-10-15T09:45:00-03:00\", \"source\": \"api\" } Si el servicio pide seña, el estado queda en pending_payment. El cobro en línea de la seña es próximamente.",{"id":801,"title":802,"titles":803,"content":804,"level":158},"\u002Fdocs\u002Fquickstart#el-mismo-flujo-en-javascript","El mismo flujo en JavaScript",[112],"const api = (path: string, init: RequestInit = {}) =>\n  fetch(`https:\u002F\u002Fapi.wagend.app\u002Fv1${path}`, {\n    ...init,\n    headers: { Authorization: `Bearer ${process.env.WAGEND_KEY}`, 'Content-Type': 'application\u002Fjson', ...init.headers },\n  }).then((r) => r.json())\n\nconst { data: slots } = await api(`\u002Fslots?service_id=svc_corte&from=${from}&to=${to}`)\nconst hold = await api('\u002Fholds', {\n  method: 'POST',\n  headers: { 'Idempotency-Key': crypto.randomUUID() },\n  body: JSON.stringify({ service_id: 'svc_corte', start: slots[0].start }),\n})\nconst booking = await api(`\u002Fholds\u002F${hold.id}\u002Fconfirm`, {\n  method: 'POST',\n  headers: { 'Idempotency-Key': crypto.randomUUID() },\n  body: JSON.stringify({ customer: { name: 'Carlos', phone: '+5491155550000' } }),\n})",{"id":806,"title":807,"titles":808,"content":809,"level":158},"\u002Fdocs\u002Fquickstart#siguientes-pasos","Siguientes pasos",[112],"Preferís no armar el cliente a mano: usá los SDK de TypeScript y Python.Reaccioná a las reservas con webhooks.Mirá todos los endpoints en la referencia y más ejemplos en las recetas.Conectá un agente de IA con el servidor MCP. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"id":122,"title":121,"titles":811,"content":812,"level":152},[],"Claves de API, scopes y qué rutas se pueden usar con una clave y cuáles son solo del panel.",{"id":814,"title":815,"titles":816,"content":817,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#claves-de-api","Claves de API",[121],"Las claves las crea el dueño en Configuración → Desarrolladores. Se muestran una sola vez. Enviá tu clave como bearer token: GET \u002Fv1\u002Fme HTTP\u002F1.1\nHost: api.wagend.app\nAuthorization: Bearer wg_live_xxxxxxxx_xxxxxxxxxxxxxxxxxxxx PrefijoModowg_live_Datos de producción y mensajes realeswg_test_Solo lectura: permite listar y leer, no crear ni modificar nada. Un sandbox para escrituras es Próximamente Las claves pertenecen a un proyecto (workspace). El proyecto siempre se toma de la clave: no hay id de workspace en paths ni en bodies. Las claves se guardan hasheadas.",{"id":819,"title":820,"titles":821,"content":822,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#scopes","Scopes",[121],"ScopePermiteslots:readGET \u002Fslotsbookings:readLeer reservas y tareas (\u002Fbookings, \u002Fwork-items), historial de etapas, adjuntos, estadísticas del equipobookings:writePre-reservas, confirmar, cancelar, reprogramar, check-in, ausencia, completar, ejecutar acciones y editar prioridad, etiquetas y vencimiento de una tareacustomers:readLeer y buscar clientes, su historial, resumen y comentarioscustomers:writeCrear y editar clientesmessages:readLeer conversaciones y mensajesmessages:writeEnviar mensajes, cambiar el modo (bot o persona), resolver, marcar como leídoconfig:read \u002F config:writeServicios, recursos, grupos, horarios, automatizaciones por regla, conocimiento y botsettings:writeReemplazar y revertir etapas, acciones y formularios (\u002Fstage-config)webhooks:manageEndpoints de webhooks salientes Un request sin el scope necesario devuelve 403 con code: \"insufficient_scope\".",{"id":824,"title":825,"titles":826,"content":827,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#qué-es-solo-del-panel","Qué es solo del panel",[121],"Estas áreas no aceptan claves de API: usan la sesión de una persona del equipo (con su rol) y están protegidas con CSRF. Si las llamás con una clave, la API responde que no están disponibles para ese tipo de credencial. Canales, pausas de canales y de la IA, estado del servicio.Flujos de automatización (\u002Fautomation-flows), asistente Wagy y su plan.Fuentes de conocimiento (\u002Fknowledge\u002Fsources) y política del bot por canal.Equipo, invitaciones, claves de API, proyectos y soporte de plataforma.Telegram del equipo y preferencias de avisos. El listado de endpoints marca cuáles son cuáles.",{"id":829,"title":830,"titles":831,"content":832,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#rotación","Rotación",[121],"Creá una clave nueva, desplegala y después revocá la vieja en Configuración → Desarrolladores. Las claves revocadas devuelven 401 al instante. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":126,"title":125,"titles":834,"content":835,"level":152},[],"Formatos, idempotencia, paginación, errores y límites de uso de la API v1.",{"id":837,"title":838,"titles":839,"content":840,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#lo-básico","Lo básico",[125],"URL base https:\u002F\u002Fapi.wagend.app\u002Fv1. Los cambios incompatibles salen como una nueva versión; los cambios aditivos (campos nuevos) pueden llegar en cualquier momento, así que ignorá los campos que no conozcas.JSON de entrada y de salida (Content-Type: application\u002Fjson).Fechas en ISO 8601 con offset (2026-10-15T09:45:00-03:00). Se guardan en UTC.Montos en centavos enteros más currency (BRL, ARS, PYG, USD).Los IDs son strings opacos. Los campos sin valor llegan como null explícito.El contrato legible por máquina es packages\u002Fopenapi\u002Fopenapi.yaml (OpenAPI 3.1) y el historial de cambios resume lo nuevo.",{"id":842,"title":843,"titles":844,"content":845,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#idempotencia","Idempotencia",[125],"POST \u002Fholds, POST \u002Fholds\u002F{id}\u002Fconfirm, POST \u002Fbookings, POST \u002Fbookings\u002F{id}\u002Freschedule y POST \u002Fbookings\u002F{id}\u002Factions\u002F{key} llevan el header Idempotency-Key (por ejemplo un UUID). Repetir un request con la misma clave dentro de 24 horas devuelve la respuesta original. Reusar la clave con otro body devuelve 422 con code: \"idempotency_conflict\". POST \u002Fcustomers acepta Idempotency-Key de forma opcional. POST \u002Fwebhook-endpoints no lo admite, porque su respuesta contiene el secreto.",{"id":847,"title":848,"titles":849,"content":850,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#paginación","Paginación",[125],"Los endpoints de listado usan cursores: curl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fbookings?limit=50\" -H \"Authorization: Bearer $WAGEND_KEY\"\n# → { \"data\": [...], \"next_cursor\": \"eyJpZCI6...\" }\ncurl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fbookings?limit=50&cursor=eyJpZCI6...\" -H \"Authorization: Bearer $WAGEND_KEY\" Cuando next_cursor es null, no hay más páginas.",{"id":852,"title":853,"titles":854,"content":855,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#errores","Errores",[125],"Los errores siguen la RFC 9457 (application\u002Fproblem+json): {\n  \"type\": \"https:\u002F\u002Fwagend.app\u002Fdocs\u002Fapi\u002Fconventions#errors\",\n  \"title\": \"Slot no longer available\",\n  \"status\": 409,\n  \"code\": \"slot_taken\",\n  \"alternatives\": [{ \"start\": \"2026-10-15T10:15:00-03:00\", \"end\": \"2026-10-15T10:45:00-03:00\" }]\n} codeEstadoCuándovalidation_error422Falló la validación del body o de los parámetrosinvalid_api_key401Clave ausente, inválida o revocadaidempotency_key_required400Falta el header Idempotency-Key en una operación que lo exigeversion_conflict409Alguien editó antes el mismo recurso (versión desactualizada)insufficient_scope403La clave no tiene el scopenot_found404Id desconocido (o de otro proyecto)slot_taken409Otra persona tomó el horarioalready_claimed409Otra persona del equipo tomó antes la tarea de colacustomer_exists409Ya hay un cliente con ese teléfonoinvalid_transition409Por ejemplo confirmar una reserva canceladahold_expired410La pre-reserva venció antes de confirmaridempotency_conflict422Misma clave, distinto bodyrate_limited429Demasiados requests Cada respuesta de error trae code: usalo para decidir qué hacer, no el texto del title.",{"id":857,"title":858,"titles":859,"content":860,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#límites-de-uso","Límites de uso",[125],"Los límites aplican por clave y por proyecto (un cubo con ráfaga de 120 requests y recarga de 2 por segundo). Cada respuesta trae RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset. Ante un 429, esperá Retry-After segundos. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":130,"title":129,"titles":862,"content":863,"level":152},[],"Los endpoints de la API v1 agrupados por tema, con el scope que pide cada uno, y qué áreas son solo del panel. El contrato legible por máquina está en el repositorio, en packages\u002Fopenapi\u002Fopenapi.yaml (OpenAPI 3.1). Esta página resume lo que podés usar con una clave de API. Las áreas marcadas como \"solo panel\" usan la sesión de una persona del equipo (ver Autenticación).",{"id":865,"title":866,"titles":867,"content":868,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#agenda-horarios-y-reservas","Agenda: horarios y reservas",[129],"MétodoPathScopeDescripciónGET\u002Fslotsslots:readHorarios disponibles para un servicioPOST\u002Fholdsbookings:writeCrear pre-reserva de 10 minutosPOST\u002Fholds\u002F{id}\u002Fconfirmbookings:writeConfirmar (o pending_payment si pide seña)DELETE\u002Fholds\u002F{id}bookings:writeLiberar pre-reservaPOST\u002Fbookingsbookings:writePre-reserva y confirmación en una llamadaGET\u002Fbookingsbookings:readListar (from, to, status, resource_id, customer_id)GET \u002F PATCH\u002Fbookings\u002F{id}bookings:read \u002F writeLeer, actualizar notas o datos de ingresoPOST\u002Fbookings\u002F{id}\u002Fcancel, \u002Freschedule, \u002Fcheck-in, \u002Fno-show, \u002Fcomplete, \u002Ffailbookings:writeCambiar el estado",{"id":870,"title":871,"titles":872,"content":873,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#trabajo-tareas-y-acciones","Trabajo: tareas y acciones",[129],"Una reserva es una tarea con etapas. Las tareas sin horario (por ejemplo entregas) viven en la cola de un grupo hasta que alguien las toma. Ver Trabajo y acciones. MétodoPathScopeDescripciónGET\u002Fwork-itemsbookings:readConsulta unificada: filtros por view (inbox, today, upcoming), status, stage, unassigned, priority, tag, origin, q, rango de fechas y caja geográficaPATCH\u002Fwork-items\u002F{id}bookings:writeCambiar prioridad, etiquetas o vencimiento (con expected_version opcional)POST\u002Fbookings\u002F{id}\u002Factions\u002F{key}bookings:writeEjecutar una acción de la etapa (tomar, soltar, completar, \"no estaba\"…) con Idempotency-KeyGET\u002Fbookings\u002F{id}\u002Fstage-historybookings:readHistorial de etapasGET\u002Fbookings\u002F{id}\u002Fcomments, \u002Ftimelinebookings:readComentarios y línea de tiempoGET\u002Fbookings\u002F{id}\u002Fattachments, \u002Flocation-eventsbookings:readEvidencia de trabajoGET\u002Fconversations\u002F{id}\u002Fwork-itemsbookings:readTareas creadas desde una conversaciónGET\u002Fteam\u002Foverview, \u002Fresources\u002F{id}\u002Fstatsbookings:readOcupación y estadísticas del equipo",{"id":875,"title":876,"titles":877,"content":878,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#catálogo-y-etapas","Catálogo y etapas",[129],"MétodoPathScopeGET \u002F POST\u002Fservices, \u002Fresources, \u002Fresource-groups, \u002Fschedulesconfig:read \u002F config:writeGET \u002F PATCH \u002F DELETE\u002Fservices\u002F{id}, \u002Fresources\u002F{id}, \u002Fresource-groups\u002F{id}, \u002Fschedules\u002F{id}config:read \u002F config:writePOST \u002F DELETE\u002Fschedules\u002F{id}\u002Foverrides, \u002Fschedules\u002F{id}\u002Foverrides\u002F{date}config:writeGET\u002Fschedule-overridesconfig:readGET\u002Fstage-config, \u002Fstage-config\u002Fversions, \u002Fstage-config\u002Fversions\u002F{version}config:readPUT\u002Fstage-configsettings:writePOST\u002Fstage-config\u002Fversions\u002F{version}\u002Frevertsettings:write",{"id":880,"title":881,"titles":882,"content":883,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#clientes","Clientes",[129],"MétodoPathScopeDescripciónGET\u002Fcustomerscustomers:readListar y buscar (q: nombre, email, empresa, etiqueta o teléfono; phone, tag)POST\u002Fcustomerscustomers:writeAlta manual. El teléfono es único: si ya existe, 409 customer_existsGET \u002F PATCH\u002Fcustomers\u002F{id}customers:read \u002F writeLeer o editar (incluye dirección con formatted, lat y lng)GET\u002Fcustomers\u002F{id}\u002Fbookings, \u002Fsummary, \u002Ftimeline, \u002Fcommentscustomers:readHistorial, resumen en vivo, línea de tiempo y comentarios Un cliente puede tener varias identidades (WhatsApp, Telegram, WebChat) en identities[].",{"id":885,"title":886,"titles":887,"content":888,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#conversaciones","Conversaciones",[129],"MétodoPathScopeGET\u002Fconversations, \u002Fconversations\u002F{id}, \u002Fconversations\u002F{id}\u002Fmessagesmessages:readPOST\u002Fconversations\u002F{id}\u002Fmessagesmessages:write (responde 409 channel_paused si el canal está pausado)POST\u002Fconversations\u002F{id}\u002Fmode, \u002Fread, \u002Fresolvemessages:write",{"id":890,"title":65,"titles":891,"content":892,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#bot-y-conocimiento",[129],"MétodoPathScopeGET \u002F PUT\u002Fbotconfig:read \u002F config:writeGET \u002F POST\u002Fknowledge, \u002Fknowledge\u002Ffilesconfig:read \u002F config:writePOST\u002Fknowledge\u002Fsearchconfig:readPATCH \u002F DELETE\u002Fknowledge\u002F{id}config:writeGET \u002F POST \u002F PATCH\u002Fautomations, \u002Fautomations\u002F{id}config:read \u002F config:write",{"id":894,"title":895,"titles":896,"content":897,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#webhooks-salientes","Webhooks salientes",[129],"MétodoPathScopeGET \u002F POST\u002Fwebhook-endpointswebhooks:manageGET \u002F PATCH \u002F DELETE\u002Fwebhook-endpoints\u002F{id}webhooks:managePOST\u002Fwebhook-endpoints\u002F{id}\u002Frotate-secret, \u002Fping, \u002Fdeliveries\u002F{delivery_id}\u002Fresendwebhooks:manageGET\u002Fwebhook-endpoints\u002F{id}\u002Fdeliverieswebhooks:manage Detalle en Webhooks.",{"id":899,"title":900,"titles":901,"content":902,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#plataforma","Plataforma",[129],"MétodoPathScopeGET\u002Fmecualquiera",{"id":904,"title":905,"titles":906,"content":907,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#solo-panel-no-aceptan-claves-de-api","Solo panel (no aceptan claves de API)",[129],"ÁreaRutasCanales y pausas\u002Fchannels, \u002Fchannels\u002Fwhatsapp, \u002Fchannels\u002Ftelegram, \u002Fchannels\u002Fservice-status, \u002Fchannels\u002Fpauses, \u002Fchannels\u002F{channel}\u002Fpause y \u002Fresume; ver Pausas y EstadoPolítica del bot por canal\u002Fbot\u002Fchannel-policies (ver WebChat)Fuentes de conocimiento\u002Fknowledge\u002Fsources (ver Conocimiento)Flujos\u002Fautomation-flows (ver Flujos)IA del proyecto\u002Fai\u002Fusage, \u002Fai\u002Fpause, \u002Fai\u002Fresume, \u002Fai\u002FnoticesWagy\u002Fassistant\u002F*, el asistente de configuración del panelEquipo y cuenta\u002Fteam\u002F*, \u002Fapi-keys, \u002Fworkspaces, \u002Fme\u002Ftelegram, \u002Fme\u002Fnotification-preferencesWebChat\u002Fwebchat-site (gestión) y \u002Fpublic\u002Fwebchat\u002F* (públicos, con la clave publicable del widget)",{"id":909,"title":910,"titles":911,"content":912,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#ejemplo-slots","Ejemplo: slots",[129],"GET \u002Fv1\u002Fslots?service_id=svc_laser&from=2026-10-20T09:00:00-03:00&to=2026-10-20T20:00:00-03:00&around=2026-10-20T18:00:00-03:00 {\n  \"data\": [\n    { \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:30:00-03:00\", \"resource_ids\": [\"res_ana\", \"res_laser1\", \"res_room2\"] },\n    { \"start\": \"2026-10-20T18:45:00-03:00\", \"end\": \"2026-10-20T19:30:00-03:00\", \"resource_ids\": [\"res_carla\", \"res_laser1\", \"res_room1\"] }\n  ],\n  \"unavailable_reason\": null\n}",{"id":914,"title":915,"titles":916,"content":917,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#ejemplo-objeto-de-reserva","Ejemplo: objeto de reserva",[129],"{\n  \"id\": \"bkg_7Qx1\",\n  \"status\": \"confirmed\",\n  \"stage\": \"confirmed\",\n  \"service_id\": \"svc_laser\",\n  \"start\": \"2026-10-20T17:45:00-03:00\",\n  \"end\": \"2026-10-20T18:30:00-03:00\",\n  \"party_size\": 1,\n  \"customer\": { \"id\": \"cus_31\", \"name\": \"Marina\", \"phone\": \"+5521988887777\", \"locale\": \"pt\" },\n  \"allocations\": [\n    { \"resource_id\": \"res_ana\", \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:40:00-03:00\" },\n    { \"resource_id\": \"res_laser1\", \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:40:00-03:00\" },\n    { \"resource_id\": \"res_room2\", \"start\": \"2026-10-20T17:45:00-03:00\", \"end\": \"2026-10-20T18:40:00-03:00\" }\n  ],\n  \"priority\": \"normal\",\n  \"tags\": [],\n  \"source\": \"whatsapp\",\n  \"created_at\": \"2026-10-19T11:02:13-03:00\"\n} Las asignaciones incluyen el buffer (acá, 10 minutos después del servicio). En las tareas con cola, start y end vienen en null hasta que alguien las toma.",{"id":919,"title":920,"titles":921,"content":922,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#cambios-recientes","Cambios recientes",[129],"Estas son las novedades de la API, todas aditivas. El historial completo vive en el repositorio (docs\u002Fapi\u002FCHANGELOG.md). Clientes: alta manual, datos ampliados, dirección con formatted, lat y lng, e identities[] multicanal.Tareas y acciones: consulta unificada GET \u002Fwork-items, ejecutor de acciones con efectos (tomar, soltar, resultados) y 409 already_claimed.Mensajes con ubicación: WhatsApp, Telegram y WebChat guardan la ubicación compartida en la conversación.Pausas: al pausar un canal, enviar un mensaje responde 409 channel_paused.Conocimiento: fuentes de tipo sitio con max_pages y errores por causa. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"id":134,"title":133,"titles":924,"content":925,"level":152},[],"Avisos firmados de lo que pasa con tus reservas, con reintentos automáticos, log de entregas y ejemplos para verificar la firma.",{"id":927,"title":928,"titles":929,"content":930,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#eventos","Eventos",[133],"Hoy se pueden suscribir estos eventos de reservas: EventoCuándobooking.createdSe creó una pre-reserva o reservabooking.confirmedSe confirmó una reservabooking.cancelledCancelada o vencidabooking.rescheduledSe movió de horario (el payload trae el id viejo y el nuevo)booking.no_showMarcada como ausenciabooking.completedAtención completada El contrato reserva además payment.paid, message.received y conversation.handoff, pero todavía no se pueden suscribir ni se emiten (el cobro de la seña es Próximamente). Un endpoint que los pida recibe 422. Creá endpoints desde Configuración → Webhooks en el panel o con POST \u002Fv1\u002Fwebhook-endpoints (url y events). El secreto de firma (whsec_…) se muestra una sola vez. curl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fwebhook-endpoints \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"url\": \"https:\u002F\u002Fexample.com\u002Fwagend\", \"events\": [\"booking.confirmed\", \"booking.cancelled\"] }'",{"id":932,"title":933,"titles":934,"content":935,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#payload","Payload",[133],"{\n  \"id\": \"evt_3f6c1d9e0b7a4c2f8e5d1a9b7c3e6f20\",\n  \"type\": \"booking.confirmed\",\n  \"created_at\": \"2026-10-14T15:21:07-03:00\",\n  \"workspace_id\": \"b3a6c8e2-5f1d-4c7a-9e0b-2d8f4a1c6e53\",\n  \"data\": { \"booking\": { \"id\": \"6d1f0c4a-7b2e-4a58-9c3d-0e5f8a2b1c47\", \"status\": \"confirmed\", \"start_at\": \"2026-10-15T12:45:00+00:00\" } }\n} La entrega es al menos una vez: usá el id para ignorar duplicados.",{"id":937,"title":938,"titles":939,"content":940,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#verificar-la-firma","Verificar la firma",[133],"Cada request trae el header: Wagend-Signature: t=1791040867,v1=5c2b9f...e81 v1 es HMAC-SHA256(secreto, t + \".\" + body_crudo) en hexadecimal. Rechazá requests de más de 5 minutos y calculá la firma sobre el cuerpo crudo, sin volver a serializar el JSON. import crypto from 'node:crypto'\n\nexport function verifyWagend(rawBody: string, header: string, secret: string) {\n  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=') as [string, string]))\n  const age = Math.abs(Date.now() \u002F 1000 - Number(parts.t))\n  if (!parts.t || !parts.v1 || age > 300) return false\n  const expected = crypto.createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex')\n  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1))\n} import hashlib, hmac, time\n\ndef verify_wagend(raw_body: bytes, header: str, secret: str) -> bool:\n    parts = dict(p.split(\"=\", 1) for p in header.split(\",\"))\n    if abs(time.time() - int(parts.get(\"t\", \"0\"))) > 300:\n        return False\n    signed = f\"{parts['t']}.\".encode() + raw_body\n    expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()\n    return hmac.compare_digest(expected, parts.get(\"v1\", \"\"))",{"id":942,"title":943,"titles":944,"content":945,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#reintentos","Reintentos",[133],"Respondé con cualquier 2xx en menos de 10 segundos. Si no, reintentamos a los 1 min, 5 min, 30 min, 2 h y 12 h. Cada intento se ve en el log de entregas, donde también podés reenviar a mano.",{"id":947,"title":948,"titles":949,"content":950,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#seguridad-y-límites","Seguridad y límites",[133],"La URL debe ser https y resolver a una dirección pública: rechazamos localhost, redes privadas, link-local y direcciones de metadatos de nube (al registrar y en cada entrega). No seguimos redirecciones (un 3xx cuenta como fallo).Headers extra: Wagend-Event (tipo) y Wagend-Delivery (id de la entrega). Cada intento se firma con un timestamp nuevo.Hasta 10 endpoints por workspace. Tras 10 fallos consecutivos el endpoint se desactiva (reactivalo con PATCH \u002Fv1\u002Fwebhook-endpoints\u002F{id} y {\"active\": true}).POST \u002Fv1\u002Fwebhook-endpoints\u002F{id}\u002Fping envía un evento de prueba webhook.ping; POST \u002Fv1\u002Fwebhook-endpoints\u002F{id}\u002Frotate-secret genera un secreto nuevo (se muestra una sola vez; el anterior deja de valer al instante).Con API key usá el scope webhooks:manage. El log está en GET \u002Fv1\u002Fwebhook-endpoints\u002F{id}\u002Fdeliveries y el reenvío en POST …\u002Fdeliveries\u002F{delivery_id}\u002Fresend. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"id":138,"title":137,"titles":952,"content":953,"level":152},[],"Clientes tipados generados desde el contrato OpenAPI: cómo usarlos hoy desde el repositorio, con ejemplos de reserva, errores, paginación e idempotencia. Wagend tiene dos SDK que se generan a partir del contrato packages\u002Fopenapi\u002Fopenapi.yaml, así que sus tipos siempre siguen la API. Los SDK todavía no están publicados en npm ni en PyPI (Próximamente). Hoy se usan desde el repositorio, como se explica abajo. Si preferís no depender de ellos, la API REST funciona con cualquier cliente HTTP.",{"id":955,"title":956,"titles":957,"content":958,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#typescript","TypeScript",[137],"El cliente (packages\u002Fsdk-ts) es un envoltorio liviano sobre fetch con tipos de todas las rutas.",{"id":960,"title":961,"titles":962,"content":963,"level":345},"\u002Fdocs\u002Fapi\u002Fsdks#instalar-desde-el-repositorio","Instalar desde el repositorio",[137,956],"cd packages\u002Fsdk-ts\nnpm ci\nnpm run build          # genera dist\u002F En tu proyecto, instalalo desde esa carpeta: npm install \u002Fruta\u002Fa\u002Fwagendapp\u002Fpackages\u002Fsdk-ts",{"id":965,"title":966,"titles":967,"content":968,"level":345},"\u002Fdocs\u002Fapi\u002Fsdks#reservar-un-horario","Reservar un horario",[137,956],"import { createWagendClient, WagendError } from \"@wagend\u002Fsdk\";\n\nconst api = createWagendClient({\n  baseUrl: \"https:\u002F\u002Fapi.wagend.app\u002Fv1\",\n  apiKey: process.env.WAGEND_API_KEY!, \u002F\u002F wg_live_xxx\n});\n\ntry {\n  const { data: services } = await api.GET(\"\u002Fservices\");\n  const serviceId = services!.data![0].id!;\n\n  const { data: slots } = await api.GET(\"\u002Fslots\", {\n    params: { query: { service_id: serviceId, from: \"2026-10-15T08:00:00-03:00\", to: \"2026-10-15T13:00:00-03:00\" } },\n  });\n  const slot = slots!.data[0];\n\n  \u002F\u002F Pre-reserva de 10 minutos\n  const { data: hold } = await api.POST(\"\u002Fholds\", {\n    params: { header: { \"Idempotency-Key\": crypto.randomUUID() } },\n    body: { service_id: serviceId, start: slot.start, party_size: 1, resource_ids: slot.resource_ids },\n  });\n\n  \u002F\u002F Confirmación con los datos del cliente\n  const { data: booking } = await api.POST(\"\u002Fholds\u002F{id}\u002Fconfirm\", {\n    params: { path: { id: hold!.id! }, header: { \"Idempotency-Key\": crypto.randomUUID() } },\n    body: { customer: { name: \"Carlos\", phone: \"+5491155550000\", locale: \"es\" } },\n  });\n  console.log(booking!.status); \u002F\u002F \"confirmed\"\n} catch (err) {\n  if (err instanceof WagendError) {\n    console.error(err.status, err.code, err.retryAfter);\n  } else {\n    throw err;\n  }\n} Autenticación: el cliente agrega Authorization: Bearer solo.Idempotencia: en toda escritura agrega una Idempotency-Key si no pasás una. Para reintentar una operación, pasá vos la misma clave en los dos intentos (vale 24 horas). El tipo de TypeScript la declara en params.header para las rutas que la exigen.Errores: toda respuesta que no sea 2xx lanza WagendError con .status, .code, .problem (RFC 9457) y .retryAfter (segundos, en 429).",{"id":970,"title":848,"titles":971,"content":972,"level":345},"\u002Fdocs\u002Fapi\u002Fsdks#paginación",[137,956],"let cursor: string | undefined;\ndo {\n  const { data: page } = await api.GET(\"\u002Fbookings\", { params: { query: { limit: 50, cursor } } });\n  for (const booking of page?.data ?? []) console.log(booking.id);\n  cursor = page?.next_cursor ?? undefined;\n} while (cursor);",{"id":974,"title":975,"titles":976,"content":977,"level":345},"\u002Fdocs\u002Fapi\u002Fsdks#clientes-y-acciones","Clientes y acciones",[137,956],"\u002F\u002F Buscar y crear clientes (scopes customers:read y customers:write)\nconst { data: found } = await api.GET(\"\u002Fcustomers\", { params: { query: { q: \"carlos\" } } });\nawait api.POST(\"\u002Fcustomers\", { body: { name: \"Ana\", phone: \"+5491155551111\", tags: [\"vip\"] } });\n\n\u002F\u002F Ejecutar una acción de la etapa, por ejemplo asignar una entrega a un repartidor (scope bookings:write).\n\u002F\u002F \"atribuir\" es la clave de esa acción en el modelo de entregas.\nawait api.POST(\"\u002Fbookings\u002F{id}\u002Factions\u002F{key}\", {\n  params: { path: { id: taskId, key: \"atribuir\" }, header: { \"Idempotency-Key\": crypto.randomUUID() } },\n  body: { data: {}, resource_id: courierResourceId },\n}); Las claves de acción (key) las define la configuración de etapas de tu negocio: consultalas con GET \u002Fstage-config.",{"id":979,"title":980,"titles":981,"content":982,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#python","Python",[137],"El cliente (packages\u002Fsdk-py) usa httpx y modelos Pydantic v2 generados.",{"id":984,"title":961,"titles":985,"content":986,"level":345},"\u002Fdocs\u002Fapi\u002Fsdks#instalar-desde-el-repositorio-1",[137,980],"pip install \u002Fruta\u002Fa\u002Fwagendapp\u002Fpackages\u002Fsdk-py\n# o, con uv:\nuv pip install \u002Fruta\u002Fa\u002Fwagendapp\u002Fpackages\u002Fsdk-py",{"id":988,"title":966,"titles":989,"content":990,"level":345},"\u002Fdocs\u002Fapi\u002Fsdks#reservar-un-horario-1",[137,980],"from datetime import UTC, datetime\nfrom wagend import Wagend, WagendError\n\nwith Wagend(\"https:\u002F\u002Fapi.wagend.app\u002Fv1\", \"wg_live_xxx\") as api:\n    try:\n        service = api.list_services()[0]\n        slots = api.list_slots(\n            str(service.id), datetime(2026, 10, 15, 8, tzinfo=UTC), datetime(2026, 10, 15, 13, tzinfo=UTC)\n        )\n\n        hold = api.request(\n            \"POST\", \"\u002Fholds\",\n            json={\"service_id\": str(service.id), \"start\": slots[0].start.isoformat(), \"party_size\": 1},\n            idempotency_key=\"reserva-carlos-2026-10-15\",\n        )\n        booking = api.request(\n            \"POST\", f\"\u002Fholds\u002F{hold['id']}\u002Fconfirm\",\n            json={\"customer\": {\"name\": \"Carlos\", \"phone\": \"+5491155550000\"}},\n        )\n        print(booking[\"status\"])\n    except WagendError as err:\n        print(err.status, err.code, err.retry_after) list_services() y list_slots() devuelven modelos tipados. Para el resto de las rutas usá api.request(método, ruta, params=…, json=…); podés validar la respuesta con wagend.models.Idempotencia: las escrituras llevan Idempotency-Key (se genera una si no pasás idempotency_key). Reintentá con la misma clave.Errores: WagendError con .status, .code, .problem y .retry_after (en 429).Paginación: api.paginate(\"\u002Fbookings\", params={\"limit\": 50}) recorre todas las páginas. for booking in api.paginate(\"\u002Fbookings\", params={\"limit\": 50}):\n    print(booking[\"id\"])",{"id":992,"title":858,"titles":993,"content":994,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#límites-de-uso",[137],"El límite es por clave y por proyecto. Ante un 429, esperá retry_after \u002F retryAfter segundos antes de reintentar. Ver Convenciones.",{"id":996,"title":997,"titles":998,"content":999,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#regenerar-los-sdk","Regenerar los SDK",[137],"Si cambia el contrato, make sdk regenera los dos desde openapi.yaml y make sdk-check falla si quedaron desactualizados. html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"id":142,"title":141,"titles":1001,"content":1002,"level":152},[],"Conectá Claude, ChatGPT o tu propio agente al servidor MCP de Wagend para buscar horarios, reservar y operar el negocio con tu clave de API. Wagend incluye un servidor MCP (Model Context Protocol) para que los agentes de IA usen el mismo motor que el bot de WhatsApp: mismas pre-reservas, misma validación y mismo registro de auditoría. El servidor es un cliente fino de la API: cada herramienta llama a la API con tu misma clave, así que el MCP nunca da más permisos que la clave. El servidor está en el repositorio (packages\u002Fmcp) y hoy lo corrés vos. El servidor alojado en mcp.wagend.app todavía no está desplegado: es Próximamente. La autenticación con OAuth también.",{"id":1004,"title":1005,"titles":1006,"content":1007,"level":158},"\u002Fdocs\u002Fmcp#correr-el-servidor","Correr el servidor",[141],"Necesitás Python 3.12+ y uv. cd packages\u002Fmcp\nuv sync\nWAGEND_API_URL=https:\u002F\u002Fapi.wagend.app MCP_PORT=8700 uv run python -m wagend_mcp\n# escucha en http:\u002F\u002F127.0.0.1:8700\u002F (Streamable HTTP) Variables: VariablePara quéWAGEND_API_URLURL de la API (por defecto https:\u002F\u002Fapi.wagend.app)MCP_TOOLSETSConjuntos a exponer: booking, admin o ambos (por defecto booking,admin)MCP_HOST, MCP_PORTDónde escucha (por defecto 127.0.0.1:8700)MCP_ALLOWED_HOSTSHosts permitidos (protección contra DNS rebinding)",{"id":1009,"title":1010,"titles":1011,"content":1012,"level":158},"\u002Fdocs\u002Fmcp#conectar-un-cliente","Conectar un cliente",[141],"La autenticación es una clave de API en el header Authorization. Sin una clave con formato válido, el servidor responde 401 antes de entrar al protocolo. Con Claude Code: claude mcp add --transport http wagend http:\u002F\u002F127.0.0.1:8700\u002F \\\n  --header \"Authorization: Bearer wg_live_xxx\" O con la configuración JSON de cualquier cliente que soporte HTTP: {\n  \"mcpServers\": {\n    \"wagend\": {\n      \"type\": \"http\",\n      \"url\": \"http:\u002F\u002F127.0.0.1:8700\u002F\",\n      \"headers\": { \"Authorization\": \"Bearer wg_live_xxx\" }\n    }\n  }\n} Para probarlo sin un agente: npx @modelcontextprotocol\u002Finspector (transporte Streamable HTTP, la misma URL y el header).",{"id":1014,"title":1015,"titles":1016,"content":1017,"level":158},"\u002Fdocs\u002Fmcp#herramientas","Herramientas",[141],"Todas las herramientas del conjunto activo se listan, pero cada una funciona solo si la clave tiene el scope que necesita; si no, devuelve el error 403 de la API. Las escrituras quedan auditadas con actor mcp. Reservas (booking): para asistentes que reservan en nombre de un cliente. HerramientaScopeHacelist_servicesconfig:readServicios con duración y preciofind_slotsslots:readHorarios disponibles de un servicio entre dos fechashold_slotbookings:writePre-reserva de 10 minutosconfirm_bookingbookings:writeConfirma una pre-reserva con los datos del clientecancel_booking, reschedule_bookingbookings:writeGestiona una reserva existenteget_bookingbookings:readDetalle de una reserva Administración (admin): para que el dueño opere el negocio desde su asistente de IA. HerramientaScopeHacelist_resourcesconfig:readEquipo, salas, máquinas y gruposlist_todaybookings:readReservas del díablock_timeconfig:write y bookings:readCierra días completos de un recurso (máx. 31). No cancela reservas existentes: las devuelve para que una persona decidacreate_service, update_serviceconfig:writeCrea o cambia un servicio, con su formulario de reservaupdate_scheduleconfig:writeCambia el horario semanal o la zona horariaget_statsbookings:readReservas, ocupación y ausencias por recursoget_stage_config, list_stage_config_versions, get_stage_config_versionconfig:readEtapas, acciones y formularios, con su historial de versionesupdate_stage_config, revert_stage_configsettings:writeReemplaza o revierte las etapas (crea una versión nueva; no borra historial) Las escrituras de configuración exigen confirm=true. Sin él, la herramienta no llama a la API: devuelve confirmation_required con lo que enviaría, para que el agente se lo muestre a una persona y repita con la confirmación.",{"id":1019,"title":1020,"titles":1021,"content":1022,"level":158},"\u002Fdocs\u002Fmcp#ejemplos-de-pedidos","Ejemplos de pedidos",[141],"\"Reservame un corte con Juan mañana a la mañana, a nombre de Carlos.\"\"Bloqueá la máquina de láser el lunes que viene por mantenimiento y decime qué reservas quedan afectadas.\"\"¿Cuántas ausencias tuvimos este mes?\"",{"id":1024,"title":1025,"titles":1026,"content":1027,"level":158},"\u002Fdocs\u002Fmcp#docs-para-llms","Docs para LLMs",[141],"\u002Fllms.txt lista todas las páginas de la documentación.\u002Fllms-full.txt contiene la documentación completa en Markdown. html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":146,"title":145,"titles":1029,"content":1030,"level":152},[],"Recetas de API (clientes, tareas, acciones, webhooks) y cómo modelar una barbería, estética, clínica, restaurante y entregas.",{"id":1032,"title":1033,"titles":1034,"content":1035,"level":158},"\u002Fdocs\u002Frecipes#recetas-de-api","Recetas de API",[145],"Todas usan $WAGEND_KEY como en el inicio rápido.",{"id":1037,"title":1038,"titles":1039,"content":1040,"level":345},"\u002Fdocs\u002Frecipes#crear-un-cliente-y-reservarle-de-una-vez","Crear un cliente y reservarle de una vez",[145,1033],"Necesita customers:write y bookings:write. El teléfono es el identificador único del cliente: si ya existe, la API responde 409 customer_exists. curl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fcustomers \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"name\": \"Marina\", \"phone\": \"+5521988887777\", \"locale\": \"pt\", \"tags\": [\"vip\"],\n        \"address\": { \"street\": \"Rua das Flores\", \"number\": \"120\", \"city\": \"Rio de Janeiro\", \"formatted\": \"Rua das Flores 120, Rio de Janeiro\" } }'\n\ncurl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fbookings \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"service_id\": \"svc_corte\", \"start\": \"2026-10-15T09:45:00-03:00\",\n        \"customer\": { \"name\": \"Marina\", \"phone\": \"+5521988887777\" } }' POST \u002Fbookings hace la pre-reserva y la confirmación en una sola llamada.",{"id":1042,"title":1043,"titles":1044,"content":1045,"level":345},"\u002Fdocs\u002Frecipes#leer-lo-que-toca-hoy","Leer lo que toca hoy",[145,1033],"Necesita bookings:read. GET \u002Fwork-items es la misma consulta que usa la pantalla Hoy. curl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fwork-items?view=today&limit=50\" \\\n  -H \"Authorization: Bearer $WAGEND_KEY\"\n\n# Solo lo que nadie tomó todavía\ncurl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fwork-items?unassigned=true&limit=50\" \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" Cada tarea trae su stage y sus available_actions.",{"id":1047,"title":1048,"titles":1049,"content":1050,"level":345},"\u002Fdocs\u002Frecipes#asignar-y-cerrar-una-entrega-con-acciones","Asignar y cerrar una entrega con acciones",[145,1033],"Necesita bookings:write. Las acciones llevan el nombre que les da la configuración de etapas del negocio (con el modelo de entregas: atribuir, soltar, iniciar, concluir, nao_estava). Consultalas en GET \u002Fstage-config o en available_actions de la tarea. # Asignar la entrega a un repartidor (resource_id es el recurso del repartidor)\ncurl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fbookings\u002F$TASK_ID\u002Factions\u002Fatribuir \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"data\": {}, \"resource_id\": \"'$COURIER_ID'\" }'\n\n# Cerrarla como completada\ncurl -X POST https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fbookings\u002F$TASK_ID\u002Factions\u002Fconcluir \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"data\": {} }' Si dos personas toman la misma tarea a la vez, gana una y la otra recibe 409 already_claimed. La acción \"Aceptar entrega\" (aceitar) es para el personal desde el panel o Telegram: toma la tarea con el recurso de quien la ejecuta.",{"id":1052,"title":1053,"titles":1054,"content":1055,"level":345},"\u002Fdocs\u002Frecipes#recibir-avisos-por-webhook","Recibir avisos por webhook",[145,1033],"Registrá un endpoint (ver Webhooks) y verificá la firma antes de procesar. Ejemplo mínimo con Express: import express from 'express'\nimport { verifyWagend } from '.\u002Fverify' \u002F\u002F la función de la página de Webhooks\n\nconst app = express()\napp.post('\u002Fwagend', express.raw({ type: 'application\u002Fjson' }), (req, res) => {\n  const raw = req.body.toString('utf8')\n  if (!verifyWagend(raw, req.header('Wagend-Signature') ?? '', process.env.WAGEND_WEBHOOK_SECRET!)) {\n    return res.sendStatus(400)\n  }\n  const event = JSON.parse(raw)\n  if (event.type === 'booking.confirmed') console.log('Nueva reserva', event.data.booking.id)\n  res.sendStatus(200) \u002F\u002F respondé 2xx rápido; los duplicados se descartan por event.id\n})\napp.listen(3000)",{"id":1057,"title":1058,"titles":1059,"content":1060,"level":158},"\u002Fdocs\u002Frecipes#modelos-por-negocio","Modelos por negocio",[145],"Cada receta corresponde a un modelo listo que elegís en el onboarding.",{"id":1062,"title":1063,"titles":1064,"content":1065,"level":158},"\u002Fdocs\u002Frecipes#barbería","Barbería",[145],"Cada barbero es un recurso staff exclusive con su propio horario. Un grupo, customer_choice con round_robin como alternativa. {\n  \"name\": \"Corte\",\n  \"duration_min\": 30,\n  \"step_min\": 15,\n  \"buffer_after_min\": 5,\n  \"price_cents\": 5000,\n  \"requirements\": [{ \"resource_group_id\": \"grp_barbers\", \"units\": 1 }]\n}",{"id":1067,"title":1068,"titles":1069,"content":1070,"level":158},"\u002Fdocs\u002Frecipes#estética","Estética",[145],"Profesionales, máquinas y cabinas son recursos separados. El servicio pide los tres al mismo tiempo, así que el más escaso (casi siempre la máquina) limita la agenda. {\n  \"name\": \"Depilación láser\",\n  \"duration_min\": 45,\n  \"buffer_after_min\": 10,\n  \"price_cents\": 18000,\n  \"deposit_cents\": 5000,\n  \"requirements\": [\n    { \"resource_group_id\": \"grp_professionals\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_lasers\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_rooms\", \"units\": 1 }\n  ]\n}",{"id":1072,"title":1073,"titles":1074,"content":1075,"level":158},"\u002Fdocs\u002Frecipes#clínica","Clínica",[145],"Médico más consultorio, por sede (un workspace por sede). Los datos de salud son sensibles: el asistente nunca pregunta síntomas y el formulario pide solo lo necesario para reservar. {\n  \"name\": \"Consulta\",\n  \"duration_min\": 30,\n  \"buffer_after_min\": 10,\n  \"intake_form\": { \"type\": \"object\", \"properties\": { \"obra_social\": { \"type\": \"string\" } } },\n  \"requirements\": [\n    { \"resource_group_id\": \"grp_doctors\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_offices\", \"units\": 1 }\n  ]\n}",{"id":1077,"title":1078,"titles":1079,"content":1080,"level":158},"\u002Fdocs\u002Frecipes#restaurante","Restaurante",[145],"El salón es un recurso pooled con 40 unidades (cubiertos) por turno. La duración crece con el tamaño del grupo, y los grupos grandes pagan seña. {\n  \"name\": \"Mesa\",\n  \"step_min\": 30,\n  \"duration_by_units\": [\n    { \"max_units\": 2, \"duration_min\": 90 },\n    { \"max_units\": 4, \"duration_min\": 120 },\n    { \"max_units\": 20, \"duration_min\": 150 }\n  ],\n  \"requirements\": [{ \"resource_group_id\": \"grp_dining_room\", \"units\": \"party_size\" }]\n} El modo mesas (mesas puntuales con tamaño mínimo y máximo, y combinaciones) está en el roadmap.",{"id":1082,"title":1083,"titles":1084,"content":1085,"level":158},"\u002Fdocs\u002Frecipes#entregas","Entregas",[145],"Cada zona es un recurso pooled con capacidad por ventana de 2 horas. La zona se elige por código postal, y una regla de corte cierra las ventanas del mismo día al mediodía. {\n  \"name\": \"Entrega\",\n  \"window_mode\": true,\n  \"duration_min\": 120,\n  \"cutoff_rule\": { \"same_day_until\": \"12:00\" },\n  \"intake_form\": { \"type\": \"object\", \"required\": [\"address\", \"postal_code\"] },\n  \"requirements\": [{ \"resource_group_id\": \"grp_zones\", \"units\": 1, \"select_by\": \"postal_code\" }]\n} html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"id":1087,"title":95,"badge":1088,"body":1089,"description":1704,"extension":1705,"meta":1706,"navigation":1707,"path":96,"rawbody":1708,"seo":1709,"stem":97,"updated":1710,"__hash__":1711},"docs_es\u002Fdocs\u002F07.work\u002F04.conditions.md",null,{"type":1090,"value":1091,"toc":1697},"minimark",[1092,1114,1118,1237,1244,1247,1415,1430,1433,1438,1448,1454,1460,1465,1471,1477,1483,1489,1495,1500,1506,1511,1517,1522,1528,1533,1539,1556,1559,1570,1601,1616,1619,1622,1694],[1093,1094,1095,1096,1100,1101,1105,1106,1109,1110,1113],"p",{},"Una ",[1097,1098,1099],"strong",{},"condición"," decide por qué rama sigue un ",[1102,1103,1104],"a",{"href":92},"flujo",". Se escribe como una frase corta que da ",[1097,1107,1108],{},"verdadero o falso",", por ejemplo \"el servicio cuesta más de 100 y el cliente es VIP\". Una condición solo ",[1097,1111,1112],{},"mira"," datos: no cambia nada.",[1115,1116,678],"h2",{"id":1117},"cómo-se-escribe",[1119,1120,1121,1134],"table",{},[1122,1123,1124],"thead",{},[1125,1126,1127,1131],"tr",{},[1128,1129,1130],"th",{},"Qué",[1128,1132,1133],{},"Ejemplo",[1135,1136,1137,1166,1185,1196,1206,1216,1226],"tbody",{},[1125,1138,1139,1143],{},[1140,1141,1142],"td",{},"Comparar",[1140,1144,1145,1149,1150,1153,1154,1153,1157,1153,1160,1153,1163],{},[1146,1147,1148],"code",{},"=="," (igual), ",[1146,1151,1152],{},"!=",", ",[1146,1155,1156],{},"\u003C",[1146,1158,1159],{},"\u003C=",[1146,1161,1162],{},">",[1146,1164,1165],{},">=",[1125,1167,1168,1171],{},[1140,1169,1170],{},"Combinar",[1140,1172,1173,1176,1177,1180,1181,1184],{},[1146,1174,1175],{},"&&"," (y), ",[1146,1178,1179],{},"||"," (o), ",[1146,1182,1183],{},"!"," (no)",[1125,1186,1187,1190],{},[1140,1188,1189],{},"Texto",[1140,1191,1192,1195],{},[1146,1193,1194],{},"\"entrega\""," entre comillas",[1125,1197,1198,1201],{},[1140,1199,1200],{},"Está en una lista",[1140,1202,1203],{},[1146,1204,1205],{},"\"vip\" in customer.tags",[1125,1207,1208,1211],{},[1140,1209,1210],{},"Contiene",[1140,1212,1213],{},[1146,1214,1215],{},"service.name.contains(\"Corte\")",[1125,1217,1218,1221],{},[1140,1219,1220],{},"Si \u002F entonces",[1140,1222,1223],{},[1146,1224,1225],{},"workItem.priority == \"urgent\" ? now.hour \u003C 22 : now.hour \u003C 18",[1125,1227,1228,1231],{},[1140,1229,1230],{},"Un campo",[1140,1232,1233,1236],{},[1146,1234,1235],{},"customer.no_show_count",", con punto",[1093,1238,1239,1240,1243],{},"Eso es todo el lenguaje: no hay bucles ni funciones propias. Las condiciones se validan ",[1097,1241,1242],{},"al guardar"," el flujo y de nuevo al activarlo.",[1115,1245,683],{"id":1246},"qué-datos-puede-mirar",[1119,1248,1249,1259],{},[1122,1250,1251],{},[1125,1252,1253,1256],{},[1128,1254,1255],{},"Objeto",[1128,1257,1258],{},"Qué trae",[1135,1260,1261,1281,1320,1342,1367,1381,1405],{},[1125,1262,1263,1268],{},[1140,1264,1265],{},[1146,1266,1267],{},"trigger",[1140,1269,1270,1271,1274,1275,1153,1278],{},"El evento que empezó el flujo. Con una acción ejecutada: ",[1146,1272,1273],{},"action_key"," (la acción), ",[1146,1276,1277],{},"from_stage",[1146,1279,1280],{},"to_stage",[1125,1282,1283,1288],{},[1140,1284,1285],{},[1146,1286,1287],{},"workItem",[1140,1289,1290,1291,1153,1294,1153,1297,1153,1300,1153,1303,1153,1306,1153,1309,1153,1312,1315,1316,1319],{},"La tarea: ",[1146,1292,1293],{},"status",[1146,1295,1296],{},"stage",[1146,1298,1299],{},"priority",[1146,1301,1302],{},"tags",[1146,1304,1305],{},"party_size",[1146,1307,1308],{},"start_at",[1146,1310,1311],{},"due_at",[1146,1313,1314],{},"age_minutes"," (minutos desde que se creó), ",[1146,1317,1318],{},"assigned"," (si tiene responsable)",[1125,1321,1322,1327],{},[1140,1323,1324],{},[1146,1325,1326],{},"customer",[1140,1328,1329,1153,1332,1335,1336,1153,1338,1341],{},[1146,1330,1331],{},"name",[1146,1333,1334],{},"locale"," (idioma), ",[1146,1337,1302],{},[1146,1339,1340],{},"no_show_count"," (ausencias reales)",[1125,1343,1344,1349],{},[1140,1345,1346],{},[1146,1347,1348],{},"service",[1140,1350,1351,1153,1353,1356,1357,1360,1361,1153,1364],{},[1146,1352,1331],{},[1146,1354,1355],{},"price_cents"," (el precio en centavos: 100,00 es ",[1146,1358,1359],{},"10000","), ",[1146,1362,1363],{},"deposit_cents",[1146,1365,1366],{},"duration_min",[1125,1368,1369,1374],{},[1140,1370,1371],{},[1146,1372,1373],{},"resource",[1140,1375,1376,1153,1378],{},[1146,1377,1331],{},[1146,1379,1380],{},"kind",[1125,1382,1383,1388],{},[1140,1384,1385],{},[1146,1386,1387],{},"now",[1140,1389,1390,1391,1394,1395,1153,1398,1153,1401,1404],{},"La hora ",[1097,1392,1393],{},"de tu negocio",": ",[1146,1396,1397],{},"hour",[1146,1399,1400],{},"minute",[1146,1402,1403],{},"weekday"," (0 = lunes ... 6 = domingo)",[1125,1406,1407,1412],{},[1140,1408,1409],{},[1146,1410,1411],{},"variables",[1140,1413,1414],{},"Valores que calculó un paso anterior",[1093,1416,1417,1418,1421,1422,1153,1424,1426,1427,1429],{},"Por privacidad, una condición ",[1097,1419,1420],{},"no ve"," teléfonos, emails, documentos, direcciones ni notas del cliente. Si el evento no trae una tarea, ",[1146,1423,1287],{},[1146,1425,1326],{}," y ",[1146,1428,1348],{}," llegan vacíos y la condición falla con un mensaje claro, no responde \"falso\" en silencio.",[1115,1431,688],{"id":1432},"ejemplos",[1093,1434,1435],{},[1097,1436,1437],{},"VIP con un servicio caro: avisar al gerente",[1439,1440,1446],"pre",{"className":1441,"code":1443,"language":1444,"meta":1445},[1442],"language-text","service.price_cents > 10000 && \"vip\" in customer.tags\n","text","",[1146,1447,1443],{"__ignoreMap":1445},[1093,1449,1450,1453],{},[1097,1451,1452],{},"\"No estaba\" antes de las 18 h"," (disparador: se ejecuta una acción)",[1439,1455,1458],{"className":1456,"code":1457,"language":1444,"meta":1445},[1442],"trigger.action_key == \"nao_estava\" && now.hour \u003C 18\n",[1146,1459,1457],{"__ignoreMap":1445},[1093,1461,1462],{},[1097,1463,1464],{},"Tercera ausencia: pedir seña la próxima vez",[1439,1466,1469],{"className":1467,"code":1468,"language":1444,"meta":1445},[1442],"trigger.action_key == \"ausencia\" && customer.no_show_count >= 3\n",[1146,1470,1468],{"__ignoreMap":1445},[1093,1472,1473,1476],{},[1097,1474,1475],{},"Tarea sin tomar hace más de 2 horas"," (después de un paso Esperar de 2 h)",[1439,1478,1481],{"className":1479,"code":1480,"language":1444,"meta":1445},[1442],"!workItem.assigned && workItem.age_minutes > 120\n",[1146,1482,1480],{"__ignoreMap":1445},[1093,1484,1485,1488],{},[1097,1486,1487],{},"Fuera del horario comercial"," (sábado, domingo o fuera de 9 a 18)",[1439,1490,1493],{"className":1491,"code":1492,"language":1444,"meta":1445},[1442],"now.weekday >= 5 || now.hour \u003C 9 || now.hour >= 18\n",[1146,1494,1492],{"__ignoreMap":1445},[1093,1496,1497],{},[1097,1498,1499],{},"Tarea urgente",[1439,1501,1504],{"className":1502,"code":1503,"language":1444,"meta":1445},[1442],"workItem.priority == \"urgent\" || \"urgente\" in workItem.tags\n",[1146,1505,1503],{"__ignoreMap":1445},[1093,1507,1508],{},[1097,1509,1510],{},"Cliente que habla portugués",[1439,1512,1515],{"className":1513,"code":1514,"language":1444,"meta":1445},[1442],"customer.locale == \"pt\"\n",[1146,1516,1514],{"__ignoreMap":1445},[1093,1518,1519],{},[1097,1520,1521],{},"Seña pendiente hace más de una hora",[1439,1523,1526],{"className":1524,"code":1525,"language":1444,"meta":1445},[1442],"workItem.stage == \"aguardando_sinal\" && workItem.age_minutes >= 60\n",[1146,1527,1525],{"__ignoreMap":1445},[1093,1529,1530],{},[1097,1531,1532],{},"Servicio largo de corte",[1439,1534,1537],{"className":1535,"code":1536,"language":1444,"meta":1445},[1442],"service.name.contains(\"Corte\") && service.duration_min >= 45\n",[1146,1538,1536],{"__ignoreMap":1445},[1540,1541,1543],"callout",{"type":1542},"info",[1093,1544,1545,1546,1153,1549,1153,1552,1555],{},"Las claves de acción y de etapa (",[1146,1547,1548],{},"ausencia",[1146,1550,1551],{},"nao_estava",[1146,1553,1554],{},"aguardando_sinal",") son las de tu plantilla de rubro. Si cambiaste los nombres, usá los tuyos.",[1115,1557,693],{"id":1558},"probar-una-condición",[1093,1560,1561,1562,1565,1566,1569],{},"En el detalle de un flujo, tocá ",[1097,1563,1564],{},"Probar esta condición"," (o ",[1097,1567,1568],{},"Probar condición","):",[1571,1572,1573,1577,1584,1595],"ol",{},[1574,1575,1576],"li",{},"Escribí la condición.",[1574,1578,1579,1580,1583],{},"Elegí una ",[1097,1581,1582],{},"tarea real"," de tu proyecto con el buscador.",[1574,1585,1586,1587,1590,1591,1594],{},"Si mira ",[1146,1588,1589],{},"trigger.action_key",", escribí la clave de la acción en ",[1097,1592,1593],{},"Simular la acción",".",[1574,1596,1597,1598,1594],{},"Tocá ",[1097,1599,1600],{},"Probar",[1093,1602,1603,1604,1607,1608,1611,1612,1615],{},"Te muestra ",[1097,1605,1606],{},"Verdadero"," o ",[1097,1609,1610],{},"Falso"," y, debajo, ",[1097,1613,1614],{},"Lo que vio la condición",": exactamente los datos con los que decidió. No se ejecuta nada.",[1115,1617,698],{"id":1618},"errores-comunes",[1093,1620,1621],{},"Al guardar, el mensaje dice qué paso falló y por qué:",[1119,1623,1624,1634],{},[1122,1625,1626],{},[1125,1627,1628,1631],{},[1128,1629,1630],{},"Problema",[1128,1632,1633],{},"Qué significa",[1135,1635,1636,1648,1659,1667,1678,1686],{},[1125,1637,1638,1641],{},[1140,1639,1640],{},"El campo no existe",[1140,1642,1643,1644,1647],{},"Usaste un dato que no está disponible (por ejemplo ",[1146,1645,1646],{},"customer.email",")",[1125,1649,1650,1653],{},[1140,1651,1652],{},"Tipos que no combinan",[1140,1654,1655,1656,1647],{},"Comparaste texto con un número (",[1146,1657,1658],{},"customer.name > 5",[1125,1660,1661,1664],{},[1140,1662,1663],{},"No da verdadero o falso",[1140,1665,1666],{},"La condición tiene que ser una pregunta de sí o no",[1125,1668,1669,1672],{},[1140,1670,1671],{},"Función no permitida",[1140,1673,1674,1675],{},"Solo existe ",[1146,1676,1677],{},"contains",[1125,1679,1680,1683],{},[1140,1681,1682],{},"Objeto desconocido",[1140,1684,1685],{},"Solo se pueden usar los objetos de la tabla de arriba",[1125,1687,1688,1691],{},[1140,1689,1690],{},"Demasiado larga o costosa",[1140,1692,1693],{},"Dividila en dos condiciones con otro paso en medio",[1093,1695,1696],{},"Una condición admite hasta 1024 caracteres y se evalúa en una fracción de segundo.",{"title":1445,"searchDepth":158,"depth":345,"links":1698},[1699,1700,1701,1702,1703],{"id":1117,"depth":158,"text":678},{"id":1246,"depth":158,"text":683},{"id":1432,"depth":158,"text":688},{"id":1558,"depth":158,"text":693},{"id":1618,"depth":158,"text":698},"Cómo escribir una condición en un flujo, qué datos puede mirar, ejemplos listos por rubro y cómo probarla antes de activarla.","md",{},true,"---\ntitle: Condiciones de los flujos\ndescription: Cómo escribir una condición en un flujo, qué datos puede mirar, ejemplos listos por rubro y cómo probarla antes de activarla.\nupdated: \"2026-10-03\"\n---\n\nUna **condición** decide por qué rama sigue un [flujo](\u002Fdocs\u002Fwork\u002Fflows). Se escribe como una frase corta que da **verdadero o falso**, por ejemplo \"el servicio cuesta más de 100 y el cliente es VIP\". Una condición solo **mira** datos: no cambia nada.\n\n## Cómo se escribe\n\n| Qué | Ejemplo |\n| --- | --- |\n| Comparar | `==` (igual), `!=`, `\u003C`, `\u003C=`, `>`, `>=` |\n| Combinar | `&&` (y), `\\|\\|` (o), `!` (no) |\n| Texto | `\"entrega\"` entre comillas |\n| Está en una lista | `\"vip\" in customer.tags` |\n| Contiene | `service.name.contains(\"Corte\")` |\n| Si \u002F entonces | `workItem.priority == \"urgent\" ? now.hour \u003C 22 : now.hour \u003C 18` |\n| Un campo | `customer.no_show_count`, con punto |\n\nEso es todo el lenguaje: no hay bucles ni funciones propias. Las condiciones se validan **al guardar** el flujo y de nuevo al activarlo.\n\n## Qué datos puede mirar\n\n| Objeto | Qué trae |\n| --- | --- |\n| `trigger` | El evento que empezó el flujo. Con una acción ejecutada: `action_key` (la acción), `from_stage`, `to_stage` |\n| `workItem` | La tarea: `status`, `stage`, `priority`, `tags`, `party_size`, `start_at`, `due_at`, `age_minutes` (minutos desde que se creó), `assigned` (si tiene responsable) |\n| `customer` | `name`, `locale` (idioma), `tags`, `no_show_count` (ausencias reales) |\n| `service` | `name`, `price_cents` (el precio en centavos: 100,00 es `10000`), `deposit_cents`, `duration_min` |\n| `resource` | `name`, `kind` |\n| `now` | La hora **de tu negocio**: `hour`, `minute`, `weekday` (0 = lunes ... 6 = domingo) |\n| `variables` | Valores que calculó un paso anterior |\n\nPor privacidad, una condición **no ve** teléfonos, emails, documentos, direcciones ni notas del cliente. Si el evento no trae una tarea, `workItem`, `customer` y `service` llegan vacíos y la condición falla con un mensaje claro, no responde \"falso\" en silencio.\n\n## Ejemplos\n\n**VIP con un servicio caro: avisar al gerente**\n\n```text\nservice.price_cents > 10000 && \"vip\" in customer.tags\n```\n\n**\"No estaba\" antes de las 18 h** (disparador: se ejecuta una acción)\n\n```text\ntrigger.action_key == \"nao_estava\" && now.hour \u003C 18\n```\n\n**Tercera ausencia: pedir seña la próxima vez**\n\n```text\ntrigger.action_key == \"ausencia\" && customer.no_show_count >= 3\n```\n\n**Tarea sin tomar hace más de 2 horas** (después de un paso Esperar de 2 h)\n\n```text\n!workItem.assigned && workItem.age_minutes > 120\n```\n\n**Fuera del horario comercial** (sábado, domingo o fuera de 9 a 18)\n\n```text\nnow.weekday >= 5 || now.hour \u003C 9 || now.hour >= 18\n```\n\n**Tarea urgente**\n\n```text\nworkItem.priority == \"urgent\" || \"urgente\" in workItem.tags\n```\n\n**Cliente que habla portugués**\n\n```text\ncustomer.locale == \"pt\"\n```\n\n**Seña pendiente hace más de una hora**\n\n```text\nworkItem.stage == \"aguardando_sinal\" && workItem.age_minutes >= 60\n```\n\n**Servicio largo de corte**\n\n```text\nservice.name.contains(\"Corte\") && service.duration_min >= 45\n```\n\n::callout{type=\"info\"}\nLas claves de acción y de etapa (`ausencia`, `nao_estava`, `aguardando_sinal`) son las de tu plantilla de rubro. Si cambiaste los nombres, usá los tuyos.\n::\n\n## Probar una condición\n\nEn el detalle de un flujo, tocá **Probar esta condición** (o **Probar condición**):\n\n1. Escribí la condición.\n2. Elegí una **tarea real** de tu proyecto con el buscador.\n3. Si mira `trigger.action_key`, escribí la clave de la acción en **Simular la acción**.\n4. Tocá **Probar**.\n\nTe muestra **Verdadero** o **Falso** y, debajo, **Lo que vio la condición**: exactamente los datos con los que decidió. No se ejecuta nada.\n\n## Errores comunes\n\nAl guardar, el mensaje dice qué paso falló y por qué:\n\n| Problema | Qué significa |\n| --- | --- |\n| El campo no existe | Usaste un dato que no está disponible (por ejemplo `customer.email`) |\n| Tipos que no combinan | Comparaste texto con un número (`customer.name > 5`) |\n| No da verdadero o falso | La condición tiene que ser una pregunta de sí o no |\n| Función no permitida | Solo existe `contains` |\n| Objeto desconocido | Solo se pueden usar los objetos de la tabla de arriba |\n| Demasiado larga o costosa | Dividila en dos condiciones con otro paso en medio |\n\nUna condición admite hasta 1024 caracteres y se evalúa en una fracción de segundo.\n",{"title":95,"description":1704},"2026-10-03","fKkdeHSJzwDobfkquMqcQFzCLTTk3sB9m-mFSLd_fIw",[1713,1715],{"title":91,"path":92,"stem":93,"description":1714,"children":-1},"Qué hacer automáticamente cuando pasa algo en tu negocio, con esperas, condiciones y avisos. Cómo cargar ejemplos, activarlos, pausarlos y ver su historial.",{"title":104,"path":105,"stem":106,"description":1716,"children":-1},"Recibí avisos de trabajo en Telegram, tomá tareas con un toque y abrí tu jornada en la Mini App \"Mi día\".",1791052081454]