[{"data":1,"prerenderedAt":1656},["ShallowReactive",2],{"docs-nav-docs_en":3,"docs-search-docs_en":148,"doc-docs_en-\u002Fdocs\u002Fwork\u002Ftasks-and-actions":1085,"surround-docs_en-\u002Fdocs\u002Fwork\u002Ftasks-and-actions":1651},[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},"Introduction","\u002Fdocs\u002Fintroduction","docs\u002F01.introduction",{"title":14,"path":15,"stem":16},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F02.getting-started",{"title":18,"path":19,"stem":20},"How it works","\u002Fdocs\u002Fhow-it-works","docs\u002F03.how-it-works",{"title":22,"path":23,"stem":24,"children":25,"page":42},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F04.concepts",[26,30,34,38],{"title":27,"path":28,"stem":29},"Workspaces and resources","\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources","docs\u002F04.concepts\u002F1.workspaces-and-resources",{"title":31,"path":32,"stem":33},"Services and availability","\u002Fdocs\u002Fconcepts\u002Fservices-and-availability","docs\u002F04.concepts\u002F2.services-and-availability",{"title":35,"path":36,"stem":37},"Bookings and holds","\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds","docs\u002F04.concepts\u002F3.bookings-and-holds",{"title":39,"path":40,"stem":41},"Automations","\u002Fdocs\u002Fconcepts\u002Fautomations","docs\u002F04.concepts\u002F4.automations",false,{"title":44,"path":45,"stem":46,"children":47,"page":42},"Channels","\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},"Web chat","\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},"Pauses and Status","\u002Fdocs\u002Fchannels\u002Fpauses-and-status","docs\u002F05.channels\u002F04.pauses-and-status",{"title":65,"path":66,"stem":67,"children":68,"page":42},"Bot and knowledge","\u002Fdocs\u002Fbot","docs\u002F06.bot",[69,73],{"title":70,"path":71,"stem":72},"The bot and the AI","\u002Fdocs\u002Fbot\u002Foverview","docs\u002F06.bot\u002F01.overview",{"title":74,"path":75,"stem":76},"Bot knowledge","\u002Fdocs\u002Fbot\u002Fknowledge","docs\u002F06.bot\u002F02.knowledge",{"title":78,"path":79,"stem":80,"children":81,"page":42},"Work, map and flows","\u002Fdocs\u002Fwork","docs\u002F07.work",[82,86,90,94],{"title":83,"path":84,"stem":85},"Work and actions","\u002Fdocs\u002Fwork\u002Ftasks-and-actions","docs\u002F07.work\u002F01.tasks-and-actions",{"title":87,"path":88,"stem":89},"Map and addresses","\u002Fdocs\u002Fwork\u002Fmap-and-addresses","docs\u002F07.work\u002F02.map-and-addresses",{"title":91,"path":92,"stem":93},"Flows","\u002Fdocs\u002Fwork\u002Fflows","docs\u002F07.work\u002F03.flows",{"title":95,"path":96,"stem":97},"Flow conditions","\u002Fdocs\u002Fwork\u002Fconditions","docs\u002F07.work\u002F04.conditions",{"title":99,"path":100,"stem":101,"children":102,"page":42},"Team","\u002Fdocs\u002Fteam","docs\u002F08.team",[103,107],{"title":104,"path":105,"stem":106},"Team Telegram","\u002Fdocs\u002Fteam\u002Ftelegram-team","docs\u002F08.team\u002F01.telegram-team",{"title":108,"path":109,"stem":110},"Roles and permissions","\u002Fdocs\u002Fteam\u002Froles","docs\u002F08.team\u002F02.roles",{"title":112,"path":113,"stem":114},"Quickstart","\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},"Authentication","\u002Fdocs\u002Fapi\u002Fauthentication","docs\u002F10.api\u002F1.authentication",{"title":125,"path":126,"stem":127},"Conventions","\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},"TypeScript and Python SDKs","\u002Fdocs\u002Fapi\u002Fsdks","docs\u002F10.api\u002F5.sdks",{"title":141,"path":142,"stem":143},"MCP and AI agents","\u002Fdocs\u002Fmcp","docs\u002F11.mcp",{"title":145,"path":146,"stem":147},"Recipes","\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,252,255,260,265,270,275,278,283,288,293,298,303,306,311,316,321,326,331,334,339,345,350,355,358,363,368,373,378,383,388,393,396,401,406,411,416,421,425,429,432,437,442,447,451,456,460,463,468,473,478,483,488,491,496,501,506,511,516,521,525,528,533,538,543,548,553,558,561,566,571,576,581,586,591,596,601,606,611,614,619,624,629,634,639,644,647,652,657,662,667,672,675,680,685,690,695,700,703,708,713,718,723,728,733,736,741,746,751,756,761,766,769,774,779,784,789,794,799,804,809,812,817,822,827,832,835,840,845,850,855,860,863,868,873,878,883,888,892,897,902,907,912,917,922,925,930,935,940,945,950,953,958,963,968,972,977,982,986,990,994,999,1002,1007,1012,1017,1022,1027,1030,1035,1040,1045,1050,1055,1060,1065,1070,1075,1080],{"id":11,"title":10,"titles":150,"content":151,"level":152},[],"What Wagend is, who it is for, and the building blocks you will use to take bookings, serve customers and run work with your team. Wagend is a scheduling and work engine with an AI assistant that serves your customers on WhatsApp, Telegram and your website chat. Customers book by chatting; the system only offers times that really exist, holds them, confirms them and notifies your team. You run everything from a dashboard, and developers integrate through the REST API, webhooks, SDKs and MCP. This documentation describes what is already available. Anything that does not exist yet is marked Coming soon.",1,{"id":154,"title":155,"titles":156,"content":157,"level":158},"\u002Fdocs\u002Fintroduction#who-it-is-for","Who it is for",[10],"Any business that sells someone's or something's time. Wagend uses generic vocabulary (task, resource, service) and adapts to your trade with a starting template: BusinessWhat is booked or doneBarbershopOne barber for 30 to 45 minutesAestheticsA professional and a machine and a booth, at the same timeClinicA doctor and a consulting roomRestaurantSeats in the dining room according to party sizeDeliveriesTasks that a courier picks from a queue, with a destination on the map",2,{"id":160,"title":161,"titles":162,"content":163,"level":158},"\u002Fdocs\u002Fintroduction#what-you-will-use","What you will use",[10],"Today: what needs doing now, your own work or the whole team's depending on your role.Inbox: every conversation from every channel in one place; take over whenever needed.Work: all tasks as a list, calendar or map, with actions per stage (take, release, complete, no-show).Customers, Services, Team and resources: your catalog and your people.Bot: personality, knowledge and simulator. Automation: rules and flows.Wagy: the dashboard assistant that helps you set everything up by chatting.Settings: Business, Status, Team, Channels, Developers, Webhooks and AI usage.",{"id":165,"title":44,"titles":166,"content":167,"level":158},"\u002Fdocs\u002Fintroduction#channels",[10],"All channels use the same engine: a time booked on WhatsApp disappears instantly from the dashboard, the web chat and the API. WhatsApp with an AI assistant (text and audio).Web chat to paste into your site.Telegram with your business's own bot.Team Telegram: alerts and the \"My day\" Mini App.",{"id":169,"title":170,"titles":171,"content":172,"level":158},"\u002Fdocs\u002Fintroduction#where-to-go-next","Where to go next",[10],"Getting started: from a business template to your first task, with Wagy.How it works: the life of a message and the engine's guarantees.Work and actions and Flows.If you build: API quickstart, SDKs and MCP.",{"id":15,"title":14,"titles":174,"content":175,"level":152},[],"Step-by-step guide to set up your business in Wagend with Wagy's help, connect a channel, test the bot and complete your first task. This guide takes you from zero to a business that serves customers. It takes about 20 minutes and you can ask Wagy for help at every step.",{"id":177,"title":178,"titles":179,"content":180,"level":158},"\u002Fdocs\u002Fgetting-started#_1-create-the-business-from-a-template","1. Create the business from a template",[14],"Each business (or location) is a project. When you create it you pick the business type and Wagend loads a template with the services, resources, schedules and stages typical for that trade: barbershop, aesthetics, clinic, restaurant or deliveries. Open the dashboard and the project selector.Tap Create project, enter the name, choose the business type, the time zone and the language.Enter the new project. Your plan sets how many projects you can have; if you reached the limit, the selector tells you. Everything in the template can be changed later. Names adapt to the trade (for example \"Accept delivery\" for deliveries), but underneath it is the same engine.",{"id":182,"title":183,"titles":184,"content":185,"level":158},"\u002Fdocs\u002Fgetting-started#_2-set-up-with-wagy","2. Set up with Wagy",[14],"Wagy is the dashboard's setup assistant: a friendly bot you tell what you do, and it builds your business with you. Open it with the Talk to Wagy button. Only the owner and managers use it. Tell it about your business (\"I have a barbershop with three barbers\").Wagy proposes a change plan: a card with what it will create or modify (services, schedules, resources, bot rules, automations).Review the plan and tap Confirm, Adjust (you keep chatting and it builds another) or Discard. Nothing is applied without your confirmation.If you do not like the result, tap Undo: you can undo the last applied plan for 24 hours. Wagy also shows a First steps checklist that ticks itself from your real data: business profile, opening hours, services, team, connected channel, bot tested, first booking and first completed task. It also sends discreet nudges (at most two a day) that you can dismiss or mute. Wagy never asks for passwords or tokens: to connect a channel it takes you to the right screen. The first messages with Wagy are paid by the platform; after that they use your plan's AI quota.",{"id":187,"title":188,"titles":189,"content":190,"level":158},"\u002Fdocs\u002Fgetting-started#_3-review-the-basics-by-hand","3. Review the basics by hand",[14],"If you prefer the dashboard, these are the screens: Settings → Business: name, time zone, currency, language, address and cancellation policy.Services: duration, price, deposit and which resources each service needs.Team and resources: people, rooms or machines with their schedules. Invite your team from Settings → Team (see roles and permissions).",{"id":192,"title":193,"titles":194,"content":195,"level":158},"\u002Fdocs\u002Fgetting-started#_4-connect-a-channel","4. Connect a channel",[14],"Go to Settings → Channels: WhatsApp: scan a QR code. See WhatsApp.Web chat: paste one line of code into your site. See Web chat.Telegram: paste your bot's token. See Telegram. All conversations land in the same place, the Inbox.",{"id":197,"title":198,"titles":199,"content":200,"level":158},"\u002Fdocs\u002Fgetting-started#_5-test-the-bot","5. Test the bot",[14],"Before opening it to real customers, use the Simulator under Automation → Bot. You chat with the bot as if you were a customer, without sending real messages; the bookings it makes are test ones. Try phrases like \"I want to book\", \"how much is it?\" or \"what time do you close?\". Adjust the personality and load knowledge (see Bot and knowledge).",{"id":202,"title":203,"titles":204,"content":205,"level":158},"\u002Fdocs\u002Fgetting-started#_6-your-first-task","6. Your first task",[14],"Tap New task (in the top bar, on any screen).Pick the service, search for or create the customer and choose the time.Save. The task shows up in Today and in Work.",{"id":207,"title":208,"titles":209,"content":210,"level":158},"\u002Fdocs\u002Fgetting-started#_7-see-your-day-in-today","7. See your day in Today",[14],"Today shows what needs doing now. Owners and managers see everything; team members see their own. From each task you move to the next stage with the available actions. Continue with Work and actions.",{"id":212,"title":213,"titles":214,"content":215,"level":158},"\u002Fdocs\u002Fgetting-started#next-steps","Next steps",[14],"Flows and conditions: automatic reminders and alerts.Team Telegram: alerts and \"My day\" on your phone.Pauses and Status: what to do if something goes wrong.",{"id":19,"title":18,"titles":217,"content":218,"level":152},[],"Architecture, principles and the life of a message, from arriving on a channel to becoming a task, an action or an alert.",{"id":220,"title":221,"titles":222,"content":223,"level":158},"\u002Fdocs\u002Fhow-it-works#principles","Principles",[18],"Deterministic core, AI as interpreter. The AI understands the customer and calls tools. The engine computes availability, holds and confirms. The AI never invents a time or a price.The database guarantees the rules. Double booking is impossible because PostgreSQL rejects overlapping allocations, not because the app \"checks first\".One operational truth, many views. A task is a single object; you see it in Today, as a list, in the calendar or on the map.API first. The dashboard, the bot, MCP and Wagy use the same services. If something cannot be done through the API, the API is missing it.The credential defines the business. A key or session always belongs to one project.",{"id":225,"title":226,"titles":227,"content":228,"level":158},"\u002Fdocs\u002Fhow-it-works#architecture","Architecture",[18],"Channels:   WhatsApp · Web chat · Telegram · Dashboard · Wagy · API · MCP\n                 │\nGateway:    credential → project · permissions · limits · pauses · signed webhooks\n                 │\nCore:       conversations + AI │ scheduling and task engine │ flows │ knowledge\n                 │\nData:       PostgreSQL (row-level security, exclusion constraints) · Redis\nExternal:   AI models · audio transcription · channel providers · maps",{"id":230,"title":231,"titles":232,"content":233,"level":158},"\u002Fdocs\u002Fhow-it-works#the-life-of-a-message","The life of a message",[18],"It arrives. The channel (WhatsApp, web chat or Telegram) delivers the message. The signature or key is verified, duplicates are dropped and it is stored in the Inbox. If the channel is paused, the pause applies before anything else.It is understood. Audio is transcribed. The customer is identified (one customer can have several identities: phone, Telegram) along with the conversation. If a person took over, the bot does not answer. Channel rules (for example asking for phone and email on the web chat) apply before the AI is called.The AI asks. The model receives the business context, the local date and time and the latest messages. It can only call tools: find slots, hold, confirm, query knowledge, save a shared location or hand off to a person.The engine decides. Every call is validated against the business rules and only then executed. If something changed, the engine returns alternatives and the AI asks again.Exact reply. Dates, times, services, prices and addresses come from templates filled with the real result.Work and events. A booking is a task with stages. Every stage change or action produces events that trigger flows, team alerts (via Telegram or WhatsApp) and webhooks.",{"id":235,"title":236,"titles":237,"content":238,"level":158},"\u002Fdocs\u002Fhow-it-works#tasks-stages-and-actions","Tasks, stages and actions",[18],"Each business defines the stages its work goes through and the actions that move a task from one to another (take, release, complete, \"no-show\"). An action can have effects: assign it to whoever runs it, release it, close it with an outcome. See Work and actions.",{"id":240,"title":91,"titles":241,"content":242,"level":158},"\u002Fdocs\u002Fhow-it-works#flows",[18],"A flow says \"when this happens, if this condition holds, do that\": send a message, notify the team, wait, run an action. Conditions are simple expressions about the task, the customer or the time.",{"id":244,"title":245,"titles":246,"content":247,"level":158},"\u002Fdocs\u002Fhow-it-works#security","Security",[18],"Each business is isolated in the database itself, secrets are encrypted and every change is recorded in an audit log. You are responsible for your customers' data; Wagend processes it on your behalf.",{"id":249,"title":170,"titles":250,"content":251,"level":158},"\u002Fdocs\u002Fhow-it-works#where-to-go-next",[18],"Bookings and holds: the schedule's guarantees.Bot and AI: what the assistant can and cannot do.",{"id":28,"title":27,"titles":253,"content":254,"level":152},[],"Organizations, workspaces, roles, resources, capacity modes and resource groups.",{"id":256,"title":257,"titles":258,"content":259,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#organization-and-workspaces","Organization and workspaces",[27],"In the dashboard, a workspace is called a project: you can have several and switch between them with the project selector. An organization is the account that pays. It contains one or more workspaces. A workspace is a business or a location with its own: time zone, language and currency,WhatsApp number(s),bot, services, resources and team. A chain of three barbershops is one organization with three workspaces.",{"id":261,"title":262,"titles":263,"content":264,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#roles","Roles",[27],"Full detail of each role and its permissions in Roles and permissions. RoleCanownerEverything, across all workspaces of the organizationmanagerEverything inside one workspacestaffSee and manage only their own resources (for example, a barber sees only their agenda)viewerRead-only Staff can also act from WhatsApp after linking their number with a one-time code. Admin actions from WhatsApp always ask for a YES\u002FNO confirmation.",{"id":266,"title":267,"titles":268,"content":269,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#resources","Resources",[27],"A resource is anything that gets consumed by a booking. kindExamplesstaffBarber, doctor, beautician, instructorspaceRoom, office, booth, dining roomequipmentLaser machine, chair, courttableRestaurant table (table mode)vehicleVan, delivery crewzoneDelivery area by postal code Each resource has a capacity mode: exclusive — serves one booking at a time (a barber, a room, a machine).pooled — has a capacity in units (40 covers per slot, 12 seats in a class, 10 deliveries per window).",{"id":271,"title":272,"titles":273,"content":274,"level":158},"\u002Fdocs\u002Fconcepts\u002Fworkspaces-and-resources#resource-groups","Resource groups",[27],"A resource group is an interchangeable pool (\"any barber\", \"laser machines\"). Services require groups, not individual resources, so the engine can pick one. The assignment strategy decides which: assignmentBehaviorcustomer_choiceThe customer picks (for example \"with Juan\"); falls back to another strategy if they don't careround_robinRotates between membersleast_busyPicks the member with the fewest bookings that dayfixedAlways the same member (single machine, single room) {\n  \"name\": \"Barbers\",\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":276,"content":277,"level":152},[],"Services, multi-resource requirements, schedules and how slots are computed.",{"id":279,"title":280,"titles":281,"content":282,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#services","Services",[31],"A service is what the customer books. FieldMeaningduration_minLength of the servicestep_minGrid for start times (every 15, 30 minutes…)buffer_before_min \u002F buffer_after_minCleanup or preparation time blocked around the bookingprice_cents, currencyPrice shown by the bot (always from the database)deposit_centsDeposit required to confirm (online charging: coming soon)lead_time_minMinimum notice (for example 60 minutes)max_advance_daysHow far ahead customers can bookwindow_modeThe slot is a fixed window (deliveries: 14:00–16:00)fulfillment_modescheduled (default, with a time slot) or queue (dispatch by queue, no fixed time)intake_formJSON Schema of extra data to collect (insurance, address…)requirementsWhich resources the service needs at the same time",{"id":284,"title":285,"titles":286,"content":287,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#window-or-dispatch-two-fulfillment-modes","Window or dispatch: two fulfillment modes",[31],"Every service defines how the booking is fulfilled (fulfillment_mode): scheduled (the default): the booking occupies a known time range — a fixed slot or, with window_mode, a window (deliveries from 14:00 to 16:00, with capacity per zone).queue (dispatch, for water, gas or on-demand delivery): the booking has no fixed time — it joins a courier's backlog queue. The engine assigns it to the courier with the fewest active tasks, and each courier has a cap on active tasks at a time, enforced in the database. The queue uses the same states as a booking: pending → accepted → started → completed (or failed). So the same delivery business can offer scheduled windows, immediate dispatch, or both.",{"id":289,"title":290,"titles":291,"content":292,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#requirements","Requirements",[31],"A requirement says: from this group, I need this many units. A service can have several; a slot exists only if all of them are free. {\n  \"name\": \"Laser hair removal\",\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} With two professionals but only one laser, Wagend will never offer two overlapping laser sessions. Advanced options: units: \"party_size\" — consume as many units as people (restaurants, classes).offset_min \u002F duration_min on a requirement — use a resource for part of the service only (for example the wash basin during the last 15 minutes of a hair color).",{"id":294,"title":295,"titles":296,"content":297,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#schedules","Schedules",[31],"Each resource has a schedule: weekly rules in the resource's time zone plus overrides for specific dates (closed, or special hours). {\n  \"tz\": \"America\u002FSao_Paulo\",\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":299,"title":300,"titles":301,"content":302,"level":158},"\u002Fdocs\u002Fconcepts\u002Fservices-and-availability#how-slots-are-computed","How slots are computed",[31],"Expand the schedules for the requested range, in each resource's time zone.Remove active bookings and holds (plus buffers) and manual blocks.Cut into candidate slots using the service duration and step.Apply lead time, max advance, cutoff rules and party size.Cross all requirements, trying group members according to the assignment strategy.Return a short, ordered list. When nothing is available, the response includes unavailable_reason (closed, no_staff, no_equipment, no_space, lead_time, max_advance, cutoff, full) so the bot can explain why. 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":304,"content":305,"level":152},[],"Booking states, the 10-minute hold, deposits and the no-double-booking guarantee.",{"id":307,"title":308,"titles":309,"content":310,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#why-a-hold","Why a hold",[35],"A WhatsApp conversation can take minutes: the customer picks a time, then you ask their name, then maybe a deposit. Meanwhile other customers and the API are competing for the same slot. A hold reserves the slot for 10 minutes (15 when a deposit is required) and expires on its own.",{"id":312,"title":313,"titles":314,"content":315,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#states","States",[35],"StatusMeaningOccupies the slotheldTemporary reservationYespending_paymentWaiting for the depositYesconfirmedBookedYeschecked_inThe customer arrivedYescompletedService doneNocancelledCancelled (or replaced by a reschedule)Nono_showMarked absent by a personNoexpiredHold not confirmed in timeNo held ──confirm──► confirmed ──check-in──► checked_in ──► completed\n │  └─(deposit)─► pending_payment ──paid──► confirmed\n └─expire──► expired          confirmed ──cancel──► cancelled",{"id":317,"title":318,"titles":319,"content":320,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#guarantees","Guarantees",[35],"Every resource a booking occupies is stored as an allocation with a time range.For exclusive resources, PostgreSQL rejects overlapping allocations with an exclusion constraint.For pooled resources, capacity counters can never exceed the limit (checked atomically).A multi-resource booking is written in a single transaction: if any resource clashes, nothing is booked.POST \u002Fholds and POST \u002Fholds\u002F{id}\u002Fconfirm require an Idempotency-Key: retrying a request never creates a second booking. If a slot was taken while the customer was deciding, you get 409 with code: \"slot_taken\" and a list of alternatives.",{"id":322,"title":323,"titles":324,"content":325,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#reschedule-and-cancel","Reschedule and cancel",[35],"Reschedule creates a new booking and cancels the old one (linked by rescheduled_to). Reminders move automatically.Cancel frees the slot and cancels pending reminders.No-show is never automatic: the system suggests it, a person confirms it.",{"id":327,"title":328,"titles":329,"content":330,"level":158},"\u002Fdocs\u002Fconcepts\u002Fbookings-and-holds#deposits","Deposits",[35],"If the service has deposit_cents, confirming a hold leaves the booking as pending_payment and the slot stays blocked. Charging the deposit online is coming soon: until it ships, the booking does not move to confirmed on its own and payment.paid is not emitted.",{"id":40,"title":39,"titles":332,"content":333,"level":152},[],"Simple reminder and confirmation rules, quiet hours and execution guarantees. For waits and conditions, see flows. There are two automation tools: Rules: \"when this happens, send that message\". They are the simplest way to send reminders and confirmations. They are managed in More → Automation → Rules.Flows: they wait, decide with conditions and act on tasks. See Flows and Conditions.",{"id":335,"title":336,"titles":337,"content":338,"level":158},"\u002Fdocs\u002Fconcepts\u002Fautomations#rules","Rules",[39],"A rule has a trigger, the message it sends (a template with preview) and, if you want, a filter by stage or action. Each business creates, activates and adjusts its own: industry templates do not turn rules on by themselves.",{"id":340,"title":341,"titles":342,"content":343,"level":344},"\u002Fdocs\u002Fconcepts\u002Fautomations#triggers","Triggers",[39,336],"TriggerExampleBooking confirmationSend the summarySome time before the start24 h before: send a reminderSome time after the endFollow-up messageCancellation or rescheduleNotify the customerStage or action changeWhen the task moves to another stage (for example \"Out for delivery\")Fixed time of dayTeam alerts, such as the day's agenda Rules aimed at customers go out through WhatsApp. Team alerts go out through Telegram, WhatsApp or email, depending on how each person receives alerts: see Team Telegram. In each rule you see the latest sends with their status and the reason if one failed.",3,{"id":346,"title":347,"titles":348,"content":349,"level":158},"\u002Fdocs\u002Fconcepts\u002Fautomations#execution-guarantees","Execution guarantees",[39],"Each send is scheduled together with the event that causes it, so it is not lost.Before going out, the system checks the task again. If it was rescheduled or cancelled, the old send is discarded.Each send goes out once and, if it fails, retries with growing waits; after 5 failures it shows in the panel.Quiet hours: nothing is sent to customers between 21:00 and 08:00 in the business's time zone. The send is deferred, not lost.YES\u002FNO replies (\"yes\", \"ok\", \"👍\", \"não\"...) are interpreted without AI: instant and free.",{"id":351,"title":352,"titles":353,"content":354,"level":158},"\u002Fdocs\u002Fconcepts\u002Fautomations#coming-soon","Coming soon",[39],"Triggers for expired holds and for payments do not exist yet (they arrive with deposit collection).",{"id":50,"title":49,"titles":356,"content":357,"level":152},[],"Connect your business number by QR, what the assistant does with customers and with your team, and how to hand a conversation to a person.",{"id":359,"title":360,"titles":361,"content":362,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#connect-a-number","Connect a number",[49],"In the dashboard, go to Settings → Channels.Tap Link WhatsApp. A QR code appears.On the business phone open WhatsApp, tap Settings (or the three dots), Linked devices and Link a device, and point the camera at the code.When the status turns Connected you can receive messages. If the code expires, tap Reconnect to generate a new one. Only the owner and managers can link. The screen shows the status (connected, waiting for scan, disconnected) and how many connections your plan includes. Disconnect stops the bot on that number but keeps conversations and history. Use a number dedicated to the business. Today the QR connection (like WhatsApp Web) is the way to connect WhatsApp. Do not share the code: it gives access to your WhatsApp. There is a Test channel: it is the bot simulator and does not count toward your plan.",{"id":364,"title":365,"titles":366,"content":367,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#customers-and-team","Customers and team",[49],"The role is decided in code, never by what someone says in the chat: A number linked to a team member (verified with a one-time code) gets team tools.Everyone else gets customer tools. Customer toolsTeam tools (extra)See services, find slots, hold and confirm, see and cancel or reschedule their own bookings, query the business's information and knowledge, save a shared location, hand off to a personSee the day, block time, mark a no-show, update the catalog and advance a task's stage, always with a YES\u002FNO confirmation Your team can also receive alerts on Telegram.",{"id":369,"title":370,"titles":371,"content":372,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#what-the-ai-can-and-cannot-do","What the AI can and cannot do",[49],"CanCannotUnderstand text, audio, typos and changes of mindInvent times, prices or addressesFind slots and offer 2 or 3 optionsConfirm a booking without the engineHold a slot and ask for missing detailsUse admin tools with a customerAnswer from the business's knowledgeFollow instructions hidden in messages or filesHand the conversation to a personSee another business's data More in Bot and AI.",{"id":374,"title":375,"titles":376,"content":377,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#shared-location","Shared location",[49],"If a customer shares their location on WhatsApp, it is saved in the conversation and the Inbox shows it on a map. The bot can use it as a delivery destination or as the customer's address, always asking for a YES or NO confirmation. See Map and addresses.",{"id":379,"title":380,"titles":381,"content":382,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#handing-off-to-a-person","Handing off to a person",[49],"The team sees every conversation live in the Inbox. Take over pauses the bot in that conversation; it comes back by itself after 15 minutes without operator activity, or when you tap Hand back to bot. The assistant also hands off when the customer asks (\"I want to talk to a person\").",{"id":384,"title":385,"titles":386,"content":387,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#audio-and-languages","Audio and languages",[49],"Audio is transcribed before the AI reads it, and the transcript shows in the Inbox. The assistant answers in the customer's language (Portuguese, Spanish or English).",{"id":389,"title":390,"titles":391,"content":392,"level":158},"\u002Fdocs\u002Fchannels\u002Fwhatsapp#pausing-the-channel","Pausing the channel",[49],"If there is spam or noise, you can pause the bot or the whole channel without disconnecting. See Pauses and Status.",{"id":54,"title":53,"titles":394,"content":395,"level":152},[],"Put the Wagend assistant on your site with one line of code, with required contact details and per-channel rules. The web chat is a widget your business pastes into its own site. It talks to the same bot as WhatsApp (same schedules, prices and bookings), with no phone number or third-party approvals. Conversations land in the same Inbox. If you self-host Wagend, the web chat ships turned off: enable it with PUBLIC_WEBCHAT_ENABLED=true on the API.",{"id":397,"title":398,"titles":399,"content":400,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#install-step-by-step","Install step by step",[53],"As the owner, go to Settings → Channels → Web chat.Under Allowed sites add each site where you will use it, one per line, with https:\u002F\u002F and no wildcards or paths (for example https:\u002F\u002Fwww.mystore.com). To test on your computer, http:\u002F\u002Flocalhost is accepted.Choose the main color, button position, default language and an optional title (up to 40 characters).Tap Turn on web chat. You get a publishable key wg_web_… and the code to paste.Paste the snippet before \u003C\u002Fbody> on every page where you want the chat: \u003Cscript src=\"https:\u002F\u002Fwagend.app\u002Fwidget.js\" data-key=\"wg_web_…\" defer>\u003C\u002Fscript> Optional attributes: data-locale (pt, es or en; defaults to the browser language), data-offset-bottom (pixels, to raise the button if your site has a fixed bottom bar) and data-api (API origin, for test environments only). If you tap Turn off, the chat stops working and open conversations are closed; when you turn it on again you get a new key and must update the code. There is a demo page at \u002Fdemo\u002Fwebchat where you paste the key and see the widget working.",{"id":402,"title":403,"titles":404,"content":405,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#what-the-visitor-sees","What the visitor sees",[53],"A floating button that opens the chat (full screen on phones, respecting safe areas), in Portuguese, Spanish or English.A chat that is short on purpose: brief answers that suggest booking or continuing on WhatsApp. On the web the visitor is anonymous and every answer costs money.If the bot asks for their location (for example for a delivery), it offers Use my location, with explicit consent.The conversation carries across pages and reloads: when the visitor comes back, the chat shows what was said and any replies that arrived meanwhile (with a new-messages badge if it was closed). A New conversation button, in the chat's ⋯ menu, clears it and starts fresh.",{"id":407,"title":408,"titles":409,"content":410,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#continuity-across-pages-and-reloads","Continuity across pages and reloads",[53],"When a conversation opens, the server issues an opaque session code. The widget keeps it in the browser storage (localStorage, or sessionStorage if unavailable) of the site where you installed the chat, with one key per publishable key. It uses no cookies or third-party services, and nothing personal is stored there: no name, phone, email or messages. Declared contact details live only on the server, so the chat does not ask for them again within the same conversation. On another page or after a reload, the widget validates the code, loads the history and reconnects to receive new replies.Expiry: the conversation expires after inactivity and at a maximum lifetime. If the code expired, was closed or was purged, the widget discards it and starts a new conversation, with no visible error.New conversation: the visitor picks it from the ⋯ menu. The code is invalidated on the server, the browser copy is deleted and the chat starts empty. Your team keeps the previous history in the Inbox until it is purged.Private mode or blocked storage: the chat still works, but the conversation does not survive a reload.Paused channel: if you paused the channel, the chat is not shown even when the visitor has a saved code; when you resume, the conversation continues. The code is not a strong secret: it is a key to a single conversation, never to others or to the panel. It only works from the origins you authorized in the widget, is subject to the same usage limits, and is invalidated on expiry, on New conversation and when the conversation is purged.",{"id":412,"title":413,"titles":414,"content":415,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#required-contact-details","Required contact details",[53],"By default the bot does not chat until it has a phone and an email: for any message it replies with a fixed text (no AI) and the chat shows a small form (phone with country selector, in international format, and email). As soon as it is filled in, the visitor's first message is processed on its own, without repeating it. The details are declared, not verified: they do not identify the visitor and are never merged with existing customers. They are stored encrypted and deleted along with the expired conversation.",{"id":417,"title":418,"titles":419,"content":420,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#bot-rules-per-channel","Bot rules per channel",[53],"Under Channels → Bot rules per channel (owner and manager) you pick the channel (Web chat or WhatsApp) and set: RuleWhat it doesWeb chat (default)WhatsApp (default)Required detailsName, phone and\u002For email before chattingphone and emailnone (the phone already comes from the channel)When it asksFrom the first message, after a few replies, or neverfrom the first messageneverText used to askA customizable fixed textthe defaultnot applicableReply limitCap on bot replies per conversation6no capWhat it offers at the limitContinue on WhatsApp and\u002For get the information by emailbothnoneBot style in the channelA tone preference (up to 500 characters)short answersnone These are project rules: the server applies them before invoking the AI, even if someone uses the public API without the widget. At the limit the bot stops replying and stops spending AI, sends a fixed message with the options and the conversation stays in the Inbox as \"needs follow-up\", with the details the visitor left. If no WhatsApp is connected, that option is not offered.",{"id":422,"title":245,"titles":423,"content":424,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#security",[53],"The publishable key only opens anonymous conversations: it gives no access to the dashboard, the private API or customer data. You can revoke it at any time.The business always comes from the key; the widget never sends a business identifier.Only allowed sites can use the chat. No cookies.The origin check is not authentication: it only protects against other sites in a browser. Real protection comes from usage limits.There are caps on messages per conversation, per hour and per day. When reached, the chat asks the visitor to wait and the AI is not invoked.Visitor text is treated as untrusted data, and the widget always renders it as plain text.The chat only replies: it sends no proactive messages.You can pause the bot or the whole channel if needed; with the channel paused the widget hides.",{"id":426,"title":116,"titles":427,"content":428,"level":158},"\u002Fdocs\u002Fchannels\u002Fwebchat#api",[53],"Management (owner): GET|PUT|DELETE \u002Fv1\u002Fwebchat-site. Per-channel rules (owner and manager): GET \u002Fv1\u002Fbot\u002Fchannel-policies and PUT \u002Fv1\u002Fbot\u002Fchannel-policies\u002F{channel}. The widget's public endpoints are in the OpenAPI contract under \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":430,"content":431,"level":152},[],"Connect your business's Telegram bot so customers can book and ask questions as on WhatsApp, with the same Inbox and the same bot. With Telegram, your customers message a bot that belongs to your business and get served by the same assistant as on WhatsApp: same services, same schedules, same Inbox. It is separate from Team Telegram, which is a single Wagend bot for internal alerts and the \"My day\" Mini App.",{"id":433,"title":434,"titles":435,"content":436,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#connect-your-bot","Connect your bot",[57],"In Telegram open @BotFather and send \u002Fnewbot. Choose a name and a username ending in bot.BotFather gives you a token (something like 123456:ABC…). It is a secret: do not share it.In the dashboard, go to Settings → Channels → Telegram for your customers.Paste the token into Bot token and tap Connect bot. Only the owner can do this.When the status reads Receiving messages, it works. Try it by messaging the bot from your own Telegram. The token is stored encrypted and never shown again. If you revoke it in BotFather, paste the new one with Update token. One bot cannot be connected to two businesses. Disconnect deletes the stored token and keeps the history.",{"id":438,"title":439,"titles":440,"content":441,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#what-it-does","What it does",[57],"Serves with the same bot: finds slots, holds, confirms, answers from your knowledge and hands off to a person.Options and confirmations appear as buttons inside the chat.Accepts text and location (including a location shared as a place). Today it does not process voice, photos or group and channel messages.There is no reply window like WhatsApp: you can answer whenever you want.",{"id":443,"title":444,"titles":445,"content":446,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#multichannel-identity","Multichannel identity",[57],"Each person who writes on Telegram becomes an identity of the customer, verified by Telegram and without a phone number. One customer can have several identities (WhatsApp phone, Telegram) and see them all on their profile. Outgoing messages go through the channel of the matching identity.",{"id":448,"title":375,"titles":449,"content":450,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#shared-location",[57],"If the customer shares their location, it stays in the conversation and the Inbox shows a map. The bot can save it as the task destination or as the customer's address, with a YES\u002FNO confirmation. See Map and addresses.",{"id":452,"title":453,"titles":454,"content":455,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#status-and-pauses","Status and pauses",[57],"In Settings → Status you see whether the bot is receiving messages, whether there were delivery errors and whether any customer blocked the bot. You can pause the bot or the channel.",{"id":457,"title":352,"titles":458,"content":459,"level":158},"\u002Fdocs\u002Fchannels\u002Ftelegram#coming-soon",[57],"Instagram: not available yet.",{"id":62,"title":61,"titles":461,"content":462,"level":152},[],"Pause a channel or your project's AI in an emergency, and check Status and AI usage to see whether your business is serving customers. There are three tools for when something goes wrong (spam, unexpected costs, Inbox noise) and two screens to see how your service is doing.",{"id":464,"title":465,"titles":466,"content":467,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#pause-a-channel","Pause a channel",[61],"Every connected channel (WhatsApp, Telegram and web chat) can be paused without disconnecting it, in Settings → Channels. Owner and manager only. There are two levels: LevelWhat happensWhen to use itPause botMessages are still stored and reach the Inbox, but the bot does not reply or spend AI. The conversation switches to human mode, flagged for attention. Optionally the customer gets one fixed message (you choose the text; by default \"A person will reply shortly.\").You want to handle things by hand for a while.Pause channelEverything arriving on the channel is discarded: no customers, conversations or messages are created, and there is no AI. Only a count of discarded messages is kept. The team cannot send on that channel either. The web chat stops showing.There is spam or abuse. Steps: Go to Settings → Channels and find the channel.Tap Pause bot or Pause channel.Write a reason (optional), decide whether to send the fixed message and confirm.To go back, tap Resume. While something is paused, the dashboard shows a notice with who paused it and since when. Everything is recorded in the audit log.",{"id":469,"title":470,"titles":471,"content":472,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#pause-the-projects-ai","Pause the project's AI",[61],"It is an emergency switch in Settings → AI usage: it cuts all of the project's AI consumption (bot, Wagy, knowledge and audio transcription) before another cent is spent. The bot replies with a fixed message and moves the conversation to the Inbox with attention flagged.Knowledge imports wait, without error, and resume when you turn AI back on.Everything else keeps working: calendar, tasks, customers and manual actions. Tap Pause AI and confirm; to go back, Resume AI. Owner and manager only.",{"id":474,"title":475,"titles":476,"content":477,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#my-service-status","My service status",[61],"Settings → Status (owner and manager) answers in plain language whether your business is serving customers. It shows an overall traffic light and one card per part: WhatsApp: whether it is connected and receiving messages.Automatic assistant: whether the bot is on.Smart replies: whether AI quota is available this month.Web chat and Telegram: allowed sites and active sessions, last message, usage caps reached, Telegram webhook, delivery errors and customers who blocked the bot.The available channels you have not connected yet, with a link to Channels. Each card with a problem has a link to fix it. If something is paused, that is shown too.",{"id":479,"title":480,"titles":481,"content":482,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#ai-usage","AI usage",[61],"Settings → AI usage shows how much AI your business used this month and your plan's limit, with warnings at 80 % and at the limit. At the limit, AI features pause and AI automations wait in the inbox; everything else keeps working.If usage cannot be confirmed, \"Uncertain usage\" appears and AI may be limited.The amount is the known subtotal, not an invoice.With Request more (owner) you notify the Wagend team to raise the limit.",{"id":484,"title":485,"titles":486,"content":487,"level":158},"\u002Fdocs\u002Fchannels\u002Fpauses-and-status#who-can-do-what","Who can do what",[61],"ActionOwnerManagerTeam and read-onlyPause or resume channels and AIYesYesNoSee Status and AI usageYesYesNoRequest more AIYesNoNoConnect Telegram or publish the web chatYesNoNo More about permissions in Roles and permissions.",{"id":71,"title":70,"titles":489,"content":490,"level":152},[],"What your business's bot does, what it cannot do, how to configure it, test it in the simulator and when a conversation passes to a person. The bot is the assistant that serves your customers on WhatsApp, Telegram and your website chat. It understands what they write, offers real time slots and leaves the booking ready. Everything that matters is calculated by the system: the bot does not invent times, prices or addresses, and it never confirms anything on its own.",{"id":492,"title":493,"titles":494,"content":495,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#what-it-can-and-cannot-do","What it can and cannot do",[70],"It canIt cannotUnderstand text, voice notes, typos and changes of mindInvent times, prices or addressesLook up slots and offer 2 or 3 optionsConfirm a booking without the scheduling engineHold a slot and ask for missing detailsUse admin tools with a customerAnswer questions from the knowledge baseFollow instructions hidden in a message or a fileSave a shared location (with your YES\u002FNO confirmation)See another business's dataHand the conversation to a person Dates, times, services and prices in every message come from templates filled with system data. Voice notes are transcribed before the AI reads them, and the transcript shows in the Inbox.",{"id":497,"title":498,"titles":499,"content":500,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#configure-the-bot","Configure the bot",[70],"Go to More → Automation → Bot. It has four tabs: Personality: the bot's name, tone (friendly, professional or casual), the first message (you can use {name} and {business}), behavior instructions and default language.Knowledge Base: what the bot knows about your business. See Bot knowledge.Simulator: test the bot without sending real messages.Sources: web pages, site sections and listings that the bot reads and keeps up to date. Instructions are a style preference (\"keep it short\", \"be informal\"). They do not change the rules: the bot can never bypass the scheduling engine.",{"id":502,"title":503,"titles":504,"content":505,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#test-it-in-the-simulator","Test it in the simulator",[70],"In the Simulator tab you write as if you were a customer. You see the bot's replies, its configuration, the active knowledge items and the test bookings it creates. These are test bookings, kept apart from the real ones. Restart Conversation starts over.",{"id":507,"title":508,"titles":509,"content":510,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#when-a-person-steps-in","When a person steps in",[70],"Every conversation shows in the Inbox, with the state \"AI replying\", \"Wants a person\" or \"Person handling\". Take over: if you write a reply, the bot pauses in that conversation.Hand back to bot: do it manually when you are done.If you are inactive for 15 minutes, the bot resumes on its own.The bot also moves the conversation to the Inbox when the customer asks to talk to a person or when something fails.",{"id":512,"title":513,"titles":514,"content":515,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#limits-per-channel","Limits per channel",[70],"Each channel can have its own rules. On the web chat, for example, the bot asks for phone and email before chatting and stops replying after a set number of messages. See WebChat.",{"id":517,"title":518,"titles":519,"content":520,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#how-much-ai-your-business-uses","How much AI your business uses",[70],"In More → Settings → AI usage you see how much your business used this month and your plan's limit. At 80 % a warning appears; if the limit is reached, AI features pause, and the bot replies with a fixed message and moves the conversation to the Inbox. You can also cut consumption manually with the emergency pause: see Pauses and Status.",{"id":522,"title":213,"titles":523,"content":524,"level":158},"\u002Fdocs\u002Fbot\u002Foverview#next-steps",[70],"Bot knowledge: teach it to answer with your business information.WhatsApp and Telegram: connect your channels.",{"id":75,"title":74,"titles":526,"content":527,"level":152},[],"Teach the bot with texts, files, web pages, a section of your site or listings (spreadsheets, CSV, JSON and RSS) that stay up to date. The knowledge base is what the bot consults to answer questions: opening hours, policies, products, prices, news. It has two origins: what you enter by hand and what you import from sources that refresh themselves. Everything is in More → Automation → Bot, in the Knowledge Base and Sources tabs. Do not put customers' personal data in any source. What is in a source can show up in the bot's replies. The bot quotes that data as information; it never treats it as orders.",{"id":529,"title":530,"titles":531,"content":532,"level":158},"\u002Fdocs\u002Fbot\u002Fknowledge#add-knowledge-by-hand","Add knowledge by hand",[74],"In Knowledge Base, tap New Item and choose the type: FAQ: a question and its answer.Text: a title and free content (for example, the cancellation policy).Product\u002FService: name, description and an optional price.File: drag a file (5 MB maximum). It is processed and can be turned on or off. Each item has an Active switch: the bot only uses active ones. You can search and filter by type.",{"id":534,"title":535,"titles":536,"content":537,"level":158},"\u002Fdocs\u002Fbot\u002Fknowledge#sources-what-updates-itself","Sources: what updates itself",[74],"In Sources, tap Add source and choose the type. The system imports it within minutes and refreshes it on its own; you can change the frequency (every hour, 6 hours, day or week), Refresh now, Pause and Resume. Each card shows the status: Queued, Up to date, Error or Paused. A source that fails several times in a row pauses itself. If you delete it, its imported items go too (items written by hand are untouched). Common rules: public http(s) addresses only, up to 2 MiB per source and 10 sources per project. Pages that require login are not read, and the site's robots.txt is respected.",{"id":539,"title":540,"titles":541,"content":542,"level":344},"\u002Fdocs\u002Fbot\u002Fknowledge#a-web-page","A web page",[74,535],"Add source → Web page, scope Page.Enter the public URL (for example, your pricing page).The page text is read, without running JavaScript.",{"id":544,"title":545,"titles":546,"content":547,"level":344},"\u002Fdocs\u002Fbot\u002Fknowledge#a-section-of-your-site","A section of your site",[74,535],"For the bot to learn several pages of the same site without adding them one by one: Add source → Web page, scope Site section.Enter the prefix, for example https:\u002F\u002Fyoursite.com\u002Fhelp.Choose the maximum pages (50 by default, up to 200). The system reads the domain's sitemap.xml and takes only pages on the same site that start with that prefix. On every refresh it adds new pages, updates changed ones and archives those that disappeared. The card shows \"N pages imported\" and Show pages lists each one with its status (Imported or Archived). There is no crawler: if the site does not publish a sitemap.xml, the source shows the matching notice and you need to import pages one by one.",{"id":549,"title":550,"titles":551,"content":552,"level":344},"\u002Fdocs\u002Fbot\u002Fknowledge#a-listing-spreadsheet-csv-json-or-rss","A listing: spreadsheet, CSV, JSON or RSS",[74,535],"Useful for products, prices or news you already keep in a spreadsheet, a store or a feed. Add source and choose Spreadsheet, CSV, JSON API or RSS.Paste the link. For a Google Sheet: File → Share → Publish to web, or make it viewable by anyone with the link; the first row must contain headers.In Field mapping, write which column feeds each field: Name (required), Description, Price, Category, Link and Stable key. For JSON you write the path, for example products[].name. RSS needs no mapping.Tap Show preview: it shows the first valid rows and how many were skipped.If it looks right, Save source. Up to 1000 rows per source. If you use a Stable key (a code that does not change, like a SKU), renaming a product updates it; without a key, renaming creates a new item and deactivates the old one. For an API that needs a credential you can enter an Authorization header or a URL parameter: it is stored encrypted and never shown again.",{"id":554,"title":555,"titles":556,"content":557,"level":158},"\u002Fdocs\u002Fbot\u002Fknowledge#if-something-goes-wrong","If something goes wrong",[74],"The source card explains the cause: MessageWhat to doWe could not find that page (404)Check the addressThe page asks for loginOnly public pages are readThe site did not respondIt retries on its own laterThe site does not publish sitemap.xmlImport pages one by oneThe sitemap has no pages under that addressCheck the prefixThe sitemap is not validReview the site's sitemapThe site does not allow reading (robots.txt)It is the site's decisionA mapping column does not existCheck the column namesNo text found to importThe page or listing is empty; what was already imported is not deactivated After adding knowledge, try it in the Simulator: ask what a customer would ask. To integrate sources through the API, see the \u002Fknowledge endpoints in Endpoints.",{"id":84,"title":83,"titles":559,"content":560,"level":152},[],"How the day to day is organized in Wagend, with Today, Inbox and Work, and how task stages and actions work, such as take, release and close. In Wagend, everything that needs doing is a task: an appointment, a table, a visit, a delivery. A conversation can create one; you also create them by hand with the New task button or through the API. The panel gives you three main destinations: Today, Inbox and Work. The rest lives under More.",{"id":562,"title":563,"titles":564,"content":565,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#today-inbox-and-work","Today, Inbox and Work",[83],"Today is your day's board. It shows what needs your attention, what is next, what is in progress, what is later today and, collapsed, what is completed. Team members see only their own (Mine); owner and manager switch between Mine and All.Inbox gathers the conversations that need a person. See The bot and the AI.Work is where you see all tasks. You look at it along two axes that combine.",{"id":567,"title":568,"titles":569,"content":570,"level":344},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#work-set-form","Work: set × form",[83,563],"First you choose which work to see (the set): SetWhat it showsUnassignedWhat needs attention: no owner, no time or waiting for confirmationTodayToday's work for the whole businessUpcomingWhat is coming, grouped by dayAllAll work, with the order and grouping you pickMineWhat is assigned to you Then you choose how to see it (the form): FormWhen it appearsListAlwaysCalendarIf there are resources with a schedule (by day, by professional or by week)MapIf there are tasks with a location. See Map and addresses \"If it has nothing, it does not show\": a form only appears when your business needs it. All of them open the same task detail. Filters (search, priority, tag, dates), order and grouping apply to every form.",{"id":572,"title":573,"titles":574,"content":575,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#the-task-and-its-stages","The task and its stages",[83],"Each task is in a stage. Stages are your business's vocabulary: a barbershop uses Confirmed → In progress → Completed; a delivery uses Unassigned → Accepted → On the way → Delivered. Behind them are fixed states (hold, confirmed, in progress, completed, cancelled, absent, failed), so numbers and statistics mean the same in every industry. The task detail shows the customer, the date and resource, notes, form data, the origin (for example the WhatsApp conversation it came from) and the comments and activity.",{"id":577,"title":578,"titles":579,"content":580,"level":344},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#forms-per-service","Forms per service",[83,573],"A service can ask for its own data when the task is created: the delivery address, the reason for the visit, the equipment model. That data is filled in on the task and stays with it. It is defined on the service (More → Business → Services).",{"id":582,"title":583,"titles":584,"content":585,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#actions","Actions",[83],"Actions are a task's buttons. Depending on the stage, role and business, the panel shows one big main action (for example Accept delivery or On my way) and the rest under Other actions. Each action can ask for confirmation or a short form (a comment, a reason). An action can do more than change stage. The available effects are: EffectWhat it doesTakeThe task is assigned to whoever takes it. If someone else got there first, it warns and does not assign it twiceAssignThe owner or manager chooses who gets itReleaseThe task goes back to Unassigned for someone else to take (only before it starts)OutcomeCloses the task as completed, absent (\"not home\"), refused (\"does not want it\") or cancelled, with an optional reasonRescheduleOn tasks with no set time, moves the due time a little later Everything an action does happens together or not at all: if something fails, nothing is left half done. And an action never grants extra permissions: a team member cannot assign tasks even if the button existed.",{"id":587,"title":588,"titles":589,"content":590,"level":344},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#unassigned-tasks-and-queues","Unassigned tasks and queues",[83,583],"Some jobs have no set time, like deliveries. They enter as Unassigned, whoever can do them takes them and then follows the sequence. A team member sees the tasks assigned to them and those their group can take, without the customer's phone or email until they take it. A courier first sees only the approximate area. Example in the deliveries industry: An order arrives: it is Unassigned.A courier taps Accept delivery: the task is theirs. (Or the manager taps Assign delivery.)If they cannot, they tap Release delivery and it goes back to the queue.They tap On my way, then Arrived.They close with Complete, or with Not home or Refused (plus a reason).",{"id":592,"title":593,"titles":594,"content":595,"level":344},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#each-industry-with-its-own-vocabulary","Each industry with its own vocabulary",[83,583],"Stages and actions come from your industry's template (barbershop, aesthetics, clinic, restaurant, deliveries) and can be adjusted. Barbershop, aesthetics, clinic and restaurant come with Start, Complete, Cancel and No-show. To rename them or add actions, today you do it through the API or the MCP server: see API and MCP.",{"id":597,"title":598,"titles":599,"content":600,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#work-evidence","Work evidence",[83],"An action can ask for the location at that moment (for example when marking \"Arrived\") and a task accepts attachments (photo, document, audio, note). They are private: only people with access to that task see them, download links expire after 60 seconds and files are deleted after a retention period (30 days by default). The owner or manager can delete a location.",{"id":602,"title":603,"titles":604,"content":605,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#what-each-role-sees","What each role sees",[83],"RoleTodayWorkCustomersOwner and managerThe whole businessEverythingYesStaffTheir own and what they can takeTheir own and what they can takeNoViewerView onlyView onlyNo More in Roles and permissions.",{"id":607,"title":608,"titles":609,"content":610,"level":158},"\u002Fdocs\u002Fwork\u002Ftasks-and-actions#automate-the-work","Automate the work",[83],"Every stage change or action can trigger a message or a flow: see Flows.",{"id":88,"title":87,"titles":612,"content":613,"level":152},[],"The Work map view, address autocomplete, the location a customer shares and how privacy is protected. If your business serves customers at their address (deliveries, visits, field service), Wagend stores where each task is and shows it on a map.",{"id":615,"title":616,"titles":617,"content":618,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#the-map-view","The Map view",[87],"In Work, the Map form appears when there is at least one task with a location. If you do not need it, you do not see it. Each task is a marker, with color, symbol and name according to its status: pending, confirmed, in progress, completed or with a problem. Color is not the only thing that tells them apart.Tap a marker to open the task.The side list shows the same tasks (useful with a keyboard or screen reader). Tasks without a location are listed separately.The map fits itself to the results and shows up to 500 tasks; if there are more, narrow the filters. Filters and the set (Unassigned, Today, Upcoming...) work as in the list.The legend counts tasks by status. The map uses Google Maps. If Google is unavailable, a fallback map is used and the view keeps working.",{"id":620,"title":621,"titles":622,"content":623,"level":344},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#light-and-dark-mode","Light and dark mode",[87,616],"A floating selector has three options: Automatic, Light and Dark. Automatic follows your panel's theme. It is remembered per browser.",{"id":625,"title":626,"titles":627,"content":628,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#address-autocomplete","Address autocomplete",[87],"When you enter a customer's address, or a task's destination (New task or the edit form), a search box appears: Start typing street and number (from 3 characters).Pick a suggestion: the full address (street, number, neighborhood, city, postal code, country) and the point on the map are saved.A small map with a pin appears: drag it or tap the map to adjust the exact spot. If you prefer, enter the address manually and tap Place on the map: the system looks it up and leaves the pin for you to move. If autocomplete is unavailable, it tells you and what you typed moves to manual entry: you lose nothing. A service \"has a destination\" when its form asks for the delivery address. For that service, the destination is entered with this same search box.",{"id":630,"title":631,"titles":632,"content":633,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#location-shared-by-the-customer","Location shared by the customer",[87],"A customer can send their location on WhatsApp or Telegram (or from the web chat, with explicit consent). In the Inbox the message shows with a small map, the name or address if the channel provided them, and an Open in map link.If the service asks for a destination, the bot can save that location as the task's destination or as the customer's address. It asks first with YES\u002FNO in the conversation.On the web chat, the widget offers \"Use my location\" only when the bot asked for it, and the visitor must explicitly accept.",{"id":635,"title":636,"titles":637,"content":638,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#privacy","Privacy",[87],"Address and location are personal data: they do not go to logs or to the panel URL.A courier sees only the approximate area of a task that has not been taken. The exact address appears when they take it. See Work and actions.Google receives what its map needs to draw. In the Map view it does not receive addresses or coordinates of your tasks. Autocomplete and \"Place on the map\" do send it the address text you search. If your customers have special requirements, mention it in your privacy notice.",{"id":640,"title":641,"titles":642,"content":643,"level":158},"\u002Fdocs\u002Fwork\u002Fmap-and-addresses#for-whoever-manages-the-account","For whoever manages the account",[87],"The Google map needs a browser key and three Google Maps Platform APIs enabled (Maps JavaScript, Places and Geocoding). It is a platform setting, not a business one: if the map or autocomplete do not appear, contact support.",{"id":92,"title":91,"titles":645,"content":646,"level":152},[],"What to do automatically when something happens in your business: waits, conditions and alerts. Load examples, activate, pause and review history. A flow is what the system does by itself when something happens: when an event occurs, wait a while, check a condition and do something (alert the team, send a message, run an action). It is the next step after the simple rules for reminders. Flows are in More → Automation → Flows.",{"id":648,"title":649,"titles":650,"content":651,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#the-pieces","The pieces",[91],"Trigger: when it starts. Some of the available events: a task is created, assigned, modified, completed or cancelled; its status changes; a task becomes overdue;an action is executed (for example, someone marks \"Not home\");a conversation starts, is resolved or receives a message;a customer is created or becomes inactive;an attachment is added or a location is recorded. Steps: what it does. StepWhat it doesWaitA duration (for example 2 hours), until a date, until a time of day, some time before or after the task's start or end, or until an event happens with a maximum wait. Up to 90 daysCondition\"If this condition is met\": continues on the If met or If not met branch. See ConditionsAlert the teamAn internal alert about a task, by Telegram, WhatsApp or email depending on how each person receives alertsSend a message to the customerA message in their conversationRun an actionUses a task action (for example Release delivery), with the same rules as the panelLeave a commentA note on the taskCreate, update or assign a taskOperations on tasksCalculate dataPrepares values for later steps A flow has up to 32 steps, with no loops. Flows bypass no rule: every step is validated again by the system, with the role of the owner or manager who created the flow. A wait cancels itself if the task is cancelled.",{"id":653,"title":654,"titles":655,"content":656,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#start-with-examples","Start with examples",[91],"Your industry template comes with example flows. In Flows, tap Load examples (owner only). They stay inactive until you activate them, and loading again does not duplicate them. IndustryExampleDeliveriesDelivery not taken for 2 h: when a delivery is created, wait 2 hours and, if it is still unassigned, alert the teamDeliveriesAccepted delivery that does not leave in 30 min: if someone accepts and does not leave, the delivery goes back to UnassignedBarbershopCustomer's third no-show: when a no-show is marked, if it is the third, alert to ask for a deposit next time",{"id":658,"title":659,"titles":660,"content":661,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#view-activate-and-pause","View, activate and pause",[91],"Each flow shows its state (Active, Paused or Draft) and its last run. When you open it you see What it does in plain language: the trigger and the steps, with the branches. Tap Activate and confirm. From then on it acts on its own every time the trigger happens.Pause stops starting new runs; those already in progress finish their path.In Run history you see each run with its status (Done, Running, Waiting, Failed, Cancelled...), how long it waits and which branch it took. A Draft flow lets you edit the condition: Edit condition, Test this condition and Save as new version. To change an active or more complex flow, ask Wagy, the assistant (Getting started), or use the API. Before activating a flow with a condition, test it with Test this condition on a real task. Nothing is changed: it only tells you whether it comes out true or false.",{"id":663,"title":664,"titles":665,"content":666,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#flows-and-rules","Flows and rules",[91],"Rules (the tab next to Flows) remain the simplest way to send a reminder or a confirmation. A flow that comes from a classic rule is managed in Rules. Flows are for what needs to wait, decide or act on tasks.",{"id":668,"title":669,"titles":670,"content":671,"level":158},"\u002Fdocs\u002Fwork\u002Fflows#for-developers","For developers",[91],"Flows are managed through the API (\u002Fv1\u002Fautomation-flows, owner or manager with a panel session only). See Endpoints. The events that trigger them are the same ones your webhooks receive.",{"id":96,"title":95,"titles":673,"content":674,"level":152},[],"How to write a condition in a flow, which data it can look at, ready-made examples by industry and how to test it before activating. A condition decides which branch a flow follows. It is written as a short sentence that gives true or false, for example \"the service costs more than 100 and the customer is VIP\". A condition only looks at data: it changes nothing.",{"id":676,"title":677,"titles":678,"content":679,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#how-it-is-written","How it is written",[95],"WhatExampleCompare== (equal), !=, \u003C, \u003C=, >, >=Combine&& (and), || (or), ! (not)Text\"delivery\" in quotesIs in a list\"vip\" in customer.tagsContainsservice.name.contains(\"Haircut\")If \u002F thenworkItem.priority == \"urgent\" ? now.hour \u003C 22 : now.hour \u003C 18A fieldcustomer.no_show_count, with a dot That is the whole language: no loops or custom functions. Conditions are validated when you save the flow and again when you activate it.",{"id":681,"title":682,"titles":683,"content":684,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#which-data-it-can-look-at","Which data it can look at",[95],"ObjectWhat it hastriggerThe event that started the flow. With an executed action: action_key (the action), from_stage, to_stageworkItemThe task: status, stage, priority, tags, party_size, start_at, due_at, age_minutes (minutes since it was created), assigned (whether it has an owner)customername, locale (language), tags, no_show_count (real no-shows)servicename, price_cents (the price in cents: 100.00 is 10000), deposit_cents, duration_minresourcename, kindnowYour business's time: hour, minute, weekday (0 = Monday ... 6 = Sunday)variablesValues calculated by an earlier step For privacy, a condition cannot see phones, emails, documents, addresses or customer notes. If the event does not carry a task, workItem, customer and service arrive empty and the condition fails with a clear message instead of silently answering \"false\".",{"id":686,"title":687,"titles":688,"content":689,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#examples","Examples",[95],"VIP with an expensive service: alert the manager service.price_cents > 10000 && \"vip\" in customer.tags \"Not home\" before 6 pm (trigger: an action is executed) trigger.action_key == \"nao_estava\" && now.hour \u003C 18 Third no-show: ask for a deposit next time trigger.action_key == \"ausencia\" && customer.no_show_count >= 3 Task unassigned for more than 2 hours (after a 2 h Wait step) !workItem.assigned && workItem.age_minutes > 120 Outside business hours (Saturday, Sunday or outside 9 to 18) now.weekday >= 5 || now.hour \u003C 9 || now.hour >= 18 Urgent task workItem.priority == \"urgent\" || \"urgente\" in workItem.tags Customer who speaks Portuguese customer.locale == \"pt\" Deposit pending for over an hour workItem.stage == \"aguardando_sinal\" && workItem.age_minutes >= 60 Long haircut service service.name.contains(\"Corte\") && service.duration_min >= 45 Action and stage keys (ausencia, nao_estava, aguardando_sinal) are the ones from your industry template. If you renamed them, use yours. Text values such as \"Corte\" must match the name your service has.",{"id":691,"title":692,"titles":693,"content":694,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#test-a-condition","Test a condition",[95],"In a flow's detail, tap Test this condition (or Test a condition): Write the condition.Pick a real task from your project with the search box.If it looks at trigger.action_key, write the action key in Simulate the action.Tap Test. It shows True or False and, below, What the condition saw: exactly the data it decided with. Nothing is executed.",{"id":696,"title":697,"titles":698,"content":699,"level":158},"\u002Fdocs\u002Fwork\u002Fconditions#common-errors","Common errors",[95],"When saving, the message says which step failed and why: ProblemWhat it meansThe field does not existYou used data that is not available (for example customer.email)Types that do not matchYou compared text with a number (customer.name > 5)Not true or falseThe condition must be a yes or no questionFunction not allowedOnly contains existsUnknown objectOnly the objects in the table above can be usedToo long or costlySplit it into two conditions with another step in between A condition accepts up to 1024 characters and is evaluated in a fraction of a second.",{"id":105,"title":104,"titles":701,"content":702,"level":152},[],"Get work alerts on Telegram, take tasks with one tap and open your day in the \"My day\" Mini App. Team Telegram is the fastest way for everyone in the business to know what is theirs: an assigned task, an unclaimed job, a reminder or the daily summary. It works from your phone, with nothing to install except Telegram. There is one single Wagend bot for all teams. It is not your business's bot: that one talks to your customers (customer Telegram). The two are independent and never mixed.",{"id":704,"title":705,"titles":706,"content":707,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#link-your-telegram","Link your Telegram",[104],"The link is per person, not per business: you do it once and it applies to every business you have access to. In the dashboard, open My account (your name, at the bottom of the menu) and tap Link Telegram.Tap Open Telegram and, in the bot, Start. The bot confirms the link.To unlink, send \u002Fleave to the bot or unlink from My account. The link is single-use and expires after 15 minutes. If it expired, generate another. If you do not see Link Telegram, the team bot is not enabled in your environment yet: let us know.",{"id":709,"title":710,"titles":711,"content":712,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#which-alerts-you-get","Which alerts you get",[104],"AlertWhen it arrivesAssigned taskSomeone assigned a task to youUnclaimed jobThere is a queue task your group can takeReminderAn appointment is coming up (team advance notice)Daily reportA summary of your dayChangesOne of your tasks was cancelled or changed Alerts come with buttons so you can act without opening the dashboard: Open opens the Mini App straight on that task.Take and Complete run the action with your permissions, just like the dashboard. If someone else took the job first, the bot tells you it is already taken.Alerts never include data from another business. Reminders, the daily report and the team notice come from your flows and rules. If you turn one on, the team receives it on this channel.",{"id":714,"title":715,"titles":716,"content":717,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#choose-how-to-receive-them","Choose how to receive them",[104],"In My account → Alert preferences you set: Preferred channel: automatic, Telegram, WhatsApp or email. On automatic, Telegram if you have it linked; if not, WhatsApp (with your verified link) and, if not that either, email.What to mute: assigned, unclaimed, reminders, daily report or changes. If Telegram cannot deliver an alert (for example, you blocked the bot), the alert falls back to the next channel.",{"id":719,"title":720,"titles":721,"content":722,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#commands","Commands",[104],"CommandWhat it does\u002FstartLinks your account (with the link from My account)\u002FtodayShows your day, per business\u002FleaveUnlinks your Telegram",{"id":724,"title":725,"titles":726,"content":727,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#my-day-mini-app","\"My day\" Mini App",[104],"The bot's menu button (to the left of the text field) opens My day: the dashboard in a compact format inside Telegram, without asking for a password. It shows the same as you would see in the dashboard for your role: Today and Work (with \"Mine\" by default for staff) and a business selector if you have several. The session lasts 60 minutes and only reaches Today, Work and tasks. It gives no access to API keys, team, channels or webhooks.It ends on its own if you unlink Telegram or are removed from the business.",{"id":729,"title":730,"titles":731,"content":732,"level":158},"\u002Fdocs\u002Fteam\u002Ftelegram-team#limits-and-security","Limits and security",[104],"The bot only talks in private chats with one person.Telegram allows 1 message per second per chat; if many alerts arrive together, the next ones wait in a queue and still arrive.The link and the Mini App are always validated on the server. A used, expired or other-account link gets the same neutral message. To see what each person can view and do, read Roles and permissions. For developers: the endpoints GET\u002FDELETE \u002Fme\u002Ftelegram, POST \u002Fme\u002Ftelegram\u002Flink and GET\u002FPUT \u002Fme\u002Fnotification-preferences belong to the user's account (dashboard session) and are not used with API keys.",{"id":109,"title":108,"titles":734,"content":735,"level":152},[],"What each role (owner, manager, staff and read-only) can see and do, how to invite the team and how to work with several projects. Each person joins a business (a project) with a role. The role decides which screens they see and what they can change. The server enforces it: hiding a button in the dashboard is not the only barrier.",{"id":737,"title":738,"titles":739,"content":740,"level":158},"\u002Fdocs\u002Fteam\u002Froles#the-four-roles","The four roles",[108],"RoleFor whomWhat they doOwner (owner)Whoever administers the accountEverything, including API keys, the team and channelsManager (manager)SupervisorsRuns the business: catalog, team, customers, bot, flows, channels and webhooks. Does not administer API keysStaff (staff)Whoever serves or deliversSees and works on their own: their tasks and what their group can takeRead-only (viewer)Partners, accountantsViews Today, Work and conversations; changes nothing",{"id":742,"title":743,"titles":744,"content":745,"level":158},"\u002Fdocs\u002Fteam\u002Froles#what-each-one-sees-in-the-dashboard","What each one sees in the dashboard",[108],"SectionOwnerManagerStaffRead-onlyToday and WorkYesYesTheir ownYes (read)ConversationsYesYesOnly theirsYes (read)Catalog, Team, CustomersYesYesNoNoBot and FlowsYesYesNoNoSettings, Channels, AI and usageYesYesNoNoWebhooksYesYesNoNoAPI keys (Developers)YesNoNoNo Staff look up customers with a minimal view: name, partially hidden phone, tags and no-shows, with a minimum number of characters and a result cap. A courier sees a delivery's exact destination only after taking it; before that they see an approximate area.",{"id":747,"title":748,"titles":749,"content":750,"level":158},"\u002Fdocs\u002Fteam\u002Froles#invite-the-team","Invite the team",[108],"In Team you can invite in two ways: By email: for owner, manager, staff or read-only. The person accepts the invitation and creates a password.By contact (WhatsApp): only for operational staff, without a password. They are sent an access link to their agenda. You associate a staff person with one or more resources (their agenda, their vehicle): that defines which tasks they see and which they can take. You can change a role or remove someone at any time; their sessions and their Telegram stop working immediately.",{"id":752,"title":753,"titles":754,"content":755,"level":158},"\u002Fdocs\u002Fteam\u002Froles#several-projects","Several projects",[108],"An account can have several projects (businesses or branches), each with its own team, agenda, channels and data, fully isolated. The number of projects depends on the plan. With more than one project, the dashboard's project selector lets you switch between them.Only the account owner can create a new project, from a template by industry (barbershop, aesthetics, clinic, restaurant or deliveries).Your role can be different in each project.",{"id":757,"title":758,"titles":759,"content":760,"level":158},"\u002Fdocs\u002Fteam\u002Froles#platform-support","Platform support",[108],"When you need help, the Wagend team can enter your project temporarily: Always with a written reason and for at most 60 minutes.In read mode (sees what a manager would see, changes nothing) or assist mode (can adjust catalog, schedules and business settings).Never able to see or change API keys, passwords, channel secrets, billing or the team, nor send messages to your customers.Every entry and exit is logged and the owner sees them in the business activity, with who, in which mode and why.",{"id":762,"title":763,"titles":764,"content":765,"level":158},"\u002Fdocs\u002Fteam\u002Froles#api-keys-and-permissions","API keys and permissions",[108],"API keys have no role: they have scopes (narrow permissions, such as slots:read or bookings:write) and only the owner creates them. See Authentication.",{"id":113,"title":112,"titles":767,"content":768,"level":152},[],"Create your first booking through the API in five minutes using a key for a test business. This guide creates a real booking, so use a production key (wg_live_...) from a business you set up for testing. wg_test_ keys are read-only: they can list and read, not create or change anything. A sandbox for writes is Coming soon. To try the bot without WhatsApp, use the simulator in the dashboard. Base URL: https:\u002F\u002Fapi.wagend.app\u002Fv1. Every request needs Authorization: Bearer \u003Ckey>.",{"id":770,"title":771,"titles":772,"content":773,"level":158},"\u002Fdocs\u002Fquickstart#_1-get-a-key","1. Get a key",[112],"In the dashboard, go to Settings → Developers, create a Production key, and select the scopes slots:read, bookings:write and config:read. The key is shown only once. export WAGEND_KEY=\"wg_live_xxxxxxxx_xxxxxxxxxxxxxxxxxxxx\"",{"id":775,"title":776,"titles":777,"content":778,"level":158},"\u002Fdocs\u002Fquickstart#_2-check-who-you-are","2. Check who you are",[112],"curl https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fme -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"workspace\": { \"id\": \"ws_9f2c\", \"name\": \"Downtown Barbershop\", \"timezone\": \"America\u002FSao_Paulo\", \"locale\": \"pt\", \"currency\": \"BRL\" },\n  \"scopes\": [\"slots:read\", \"bookings:write\", \"config:read\"],\n  \"mode\": \"live\"\n} The workspace always comes from the key. You never send a workspace id.",{"id":780,"title":781,"titles":782,"content":783,"level":158},"\u002Fdocs\u002Fquickstart#_3-list-services","3. List services",[112],"curl https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fservices -H \"Authorization: Bearer $WAGEND_KEY\" {\n  \"data\": [\n    { \"id\": \"svc_corte\", \"name\": \"Haircut\", \"duration_min\": 30, \"price_cents\": 5000, \"currency\": \"BRL\",\n      \"requirements\": [{ \"resource_group_id\": \"grp_barbers\", \"units\": 1 }] }\n  ]\n}",{"id":785,"title":786,"titles":787,"content":788,"level":158},"\u002Fdocs\u002Fquickstart#_4-find-available-slots","4. Find available slots",[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":790,"title":791,"titles":792,"content":793,"level":158},"\u002Fdocs\u002Fquickstart#_5-hold-the-slot","5. Hold the slot",[112],"A hold reserves the slot for 10 minutes while you collect the customer's details. Always send an Idempotency-Key so retries are safe. 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":795,"title":796,"titles":797,"content":798,"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\": \"+5521999990000\", \"locale\": \"pt\" } }' { \"id\": \"bkg_7Qx1\", \"status\": \"confirmed\", \"start\": \"2026-10-15T09:45:00-03:00\", \"source\": \"api\" } If the service requires a deposit, the status is pending_payment. Charging the deposit online is coming soon.",{"id":800,"title":801,"titles":802,"content":803,"level":158},"\u002Fdocs\u002Fquickstart#same-flow-in-javascript","Same flow in 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: '+5521999990000' } }),\n})",{"id":805,"title":806,"titles":807,"content":808,"level":158},"\u002Fdocs\u002Fquickstart#next","Next",[112],"Would rather not build the client by hand? Use the TypeScript and Python SDKs.React to bookings with webhooks.See every endpoint in the reference and more examples in the recipes.Connect an AI agent with the MCP server. 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":810,"content":811,"level":152},[],"API keys, scopes, and which routes you can use with a key and which are dashboard-only.",{"id":813,"title":814,"titles":815,"content":816,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#api-keys","API keys",[121],"Keys are created by the owner in Settings → Developers. They are shown once. Send your key as a bearer token: GET \u002Fv1\u002Fme HTTP\u002F1.1\nHost: api.wagend.app\nAuthorization: Bearer wg_live_xxxxxxxx_xxxxxxxxxxxxxxxxxxxx PrefixModewg_live_Production data and real messageswg_test_Read-only: it can list and read, not create or change anything. A sandbox for writes is Coming soon Keys belong to one project (workspace). The project always comes from the key: there is no workspace id in paths or bodies. Keys are stored hashed.",{"id":818,"title":819,"titles":820,"content":821,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#scopes","Scopes",[121],"ScopeAllowsslots:readGET \u002Fslotsbookings:readRead bookings and tasks (\u002Fbookings, \u002Fwork-items), stage history, attachments, team statisticsbookings:writeHolds, confirm, cancel, reschedule, check-in, no-show, complete, run actions and edit a task's priority, tags and due datecustomers:readRead and search customers, their history, summary and commentscustomers:writeCreate and edit customersmessages:readRead conversations and messagesmessages:writeSend messages, switch the mode (bot or person), resolve, mark as readconfig:read \u002F config:writeServices, resources, groups, schedules, rule-based automations, knowledge and botsettings:writeReplace and revert stages, actions and forms (\u002Fstage-config)webhooks:manageOutgoing webhook endpoints A request without the needed scope returns 403 with code: \"insufficient_scope\".",{"id":823,"title":824,"titles":825,"content":826,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#what-is-dashboard-only","What is dashboard-only",[121],"These areas do not accept API keys: they use the session of a team member (with their role) and are protected with CSRF. If you call them with a key, the API answers that they are not available for that type of credential. Channels, channel and AI pauses, service status.Automation flows (\u002Fautomation-flows), the Wagy assistant and its plan.Knowledge sources (\u002Fknowledge\u002Fsources) and the per-channel bot policy.Team, invitations, API keys, projects and platform support.Team Telegram and alert preferences. The endpoint list marks which is which.",{"id":828,"title":829,"titles":830,"content":831,"level":158},"\u002Fdocs\u002Fapi\u002Fauthentication#rotation","Rotation",[121],"Create a new key, deploy it, then revoke the old one in Settings → Developers. Revoked keys return 401 immediately. 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":833,"content":834,"level":152},[],"Formats, idempotency, pagination, errors and rate limits of the v1 API.",{"id":836,"title":837,"titles":838,"content":839,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#the-basics","The basics",[125],"Base URL https:\u002F\u002Fapi.wagend.app\u002Fv1. Breaking changes ship as a new version; additive changes (new fields) can arrive at any time, so ignore fields you do not know.JSON in and out (Content-Type: application\u002Fjson).Dates in ISO 8601 with offset (2026-10-15T09:45:00-03:00). They are stored in UTC.Amounts in integer cents plus currency (BRL, ARS, PYG, USD).IDs are opaque strings. Fields without a value arrive as explicit null.The machine-readable contract is packages\u002Fopenapi\u002Fopenapi.yaml (OpenAPI 3.1) and the recent changes summarize what is new.",{"id":841,"title":842,"titles":843,"content":844,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#idempotency","Idempotency",[125],"POST \u002Fholds, POST \u002Fholds\u002F{id}\u002Fconfirm, POST \u002Fbookings, POST \u002Fbookings\u002F{id}\u002Freschedule and POST \u002Fbookings\u002F{id}\u002Factions\u002F{key} carry the Idempotency-Key header (for example a UUID). Repeating a request with the same key within 24 hours returns the original response. Reusing the key with a different body returns 422 with code: \"idempotency_conflict\". POST \u002Fcustomers accepts Idempotency-Key optionally. POST \u002Fwebhook-endpoints does not accept it, because its response contains the secret.",{"id":846,"title":847,"titles":848,"content":849,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#pagination","Pagination",[125],"List endpoints use cursors: 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\" When next_cursor is null, there are no more pages.",{"id":851,"title":852,"titles":853,"content":854,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#errors","Errors",[125],"Errors follow 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} codeStatusWhenvalidation_error422Body or parameter validation failedinvalid_api_key401Key missing, invalid or revokedidempotency_key_required400The Idempotency-Key header is missing on an operation that needs itinsufficient_scope403The key lacks the scopenot_found404Unknown id (or from another project)slot_taken409Someone else took the timealready_claimed409Another team member took the queue task firstcustomer_exists409A customer with that phone already existsinvalid_transition409For example confirming a cancelled bookingversion_conflict409Someone edited the same resource first (stale version)hold_expired410The hold expired before confirmingidempotency_conflict422Same key, different bodyrate_limited429Too many requests Every error response carries code: use it to decide what to do, not the text of title.",{"id":856,"title":857,"titles":858,"content":859,"level":158},"\u002Fdocs\u002Fapi\u002Fconventions#rate-limits","Rate limits",[125],"Limits apply per key and per project (a bucket with a burst of 120 requests and a refill of 2 per second). Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset. On a 429, wait Retry-After seconds. 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":861,"content":862,"level":152},[],"The v1 API endpoints grouped by topic, with the scope each one needs, and which areas are dashboard-only. The machine-readable contract lives in the repository, in packages\u002Fopenapi\u002Fopenapi.yaml (OpenAPI 3.1). This page summarizes what you can use with an API key. Areas marked \"dashboard-only\" use the session of a team member (see Authentication).",{"id":864,"title":865,"titles":866,"content":867,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#schedule-times-and-bookings","Schedule: times and bookings",[129],"MethodPathScopeDescriptionGET\u002Fslotsslots:readAvailable times for a servicePOST\u002Fholdsbookings:writeCreate a 10-minute holdPOST\u002Fholds\u002F{id}\u002Fconfirmbookings:writeConfirm (or pending_payment if a deposit is required)DELETE\u002Fholds\u002F{id}bookings:writeRelease a holdPOST\u002Fbookingsbookings:writeHold and confirmation in one callGET\u002Fbookingsbookings:readList (from, to, status, resource_id, customer_id)GET \u002F PATCH\u002Fbookings\u002F{id}bookings:read \u002F writeRead, update notes or intake dataPOST\u002Fbookings\u002F{id}\u002Fcancel, \u002Freschedule, \u002Fcheck-in, \u002Fno-show, \u002Fcomplete, \u002Ffailbookings:writeChange the state",{"id":869,"title":870,"titles":871,"content":872,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#work-tasks-and-actions","Work: tasks and actions",[129],"A booking is a task with stages. Tasks without a time (for example deliveries) sit in a group's queue until someone takes them. See Work and actions. MethodPathScopeDescriptionGET\u002Fwork-itemsbookings:readUnified query: filters by view (inbox, today, upcoming), status, stage, unassigned, priority, tag, origin, q, date range and geographic boxPATCH\u002Fwork-items\u002F{id}bookings:writeChange priority, tags or due date (with optional expected_version)POST\u002Fbookings\u002F{id}\u002Factions\u002F{key}bookings:writeRun a stage action (take, release, complete, \"not home\"…) with Idempotency-KeyGET\u002Fbookings\u002F{id}\u002Fstage-historybookings:readStage historyGET\u002Fbookings\u002F{id}\u002Fcomments, \u002Ftimelinebookings:readComments and timelineGET\u002Fbookings\u002F{id}\u002Fattachments, \u002Flocation-eventsbookings:readWork evidenceGET\u002Fconversations\u002F{id}\u002Fwork-itemsbookings:readTasks created from a conversationGET\u002Fteam\u002Foverview, \u002Fresources\u002F{id}\u002Fstatsbookings:readTeam occupancy and statistics",{"id":874,"title":875,"titles":876,"content":877,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#catalog-and-stages","Catalog and stages",[129],"MethodPathScopeGET \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":879,"title":880,"titles":881,"content":882,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#customers","Customers",[129],"MethodPathScopeDescriptionGET\u002Fcustomerscustomers:readList and search (q: name, email, company, tag or phone; phone, tag)POST\u002Fcustomerscustomers:writeManual creation. The phone is unique: if it exists, 409 customer_existsGET \u002F PATCH\u002Fcustomers\u002F{id}customers:read \u002F writeRead or edit (includes address with formatted, lat and lng)GET\u002Fcustomers\u002F{id}\u002Fbookings, \u002Fsummary, \u002Ftimeline, \u002Fcommentscustomers:readHistory, live summary, timeline and comments A customer can have several identities (WhatsApp, Telegram, WebChat) in identities[].",{"id":884,"title":885,"titles":886,"content":887,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#conversations","Conversations",[129],"MethodPathScopeGET\u002Fconversations, \u002Fconversations\u002F{id}, \u002Fconversations\u002F{id}\u002Fmessagesmessages:readPOST\u002Fconversations\u002F{id}\u002Fmessagesmessages:write (answers 409 channel_paused if the channel is paused)POST\u002Fconversations\u002F{id}\u002Fmode, \u002Fread, \u002Fresolvemessages:write",{"id":889,"title":65,"titles":890,"content":891,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#bot-and-knowledge",[129],"MethodPathScopeGET \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":893,"title":894,"titles":895,"content":896,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#outgoing-webhooks","Outgoing webhooks",[129],"MethodPathScopeGET \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 Details in Webhooks.",{"id":898,"title":899,"titles":900,"content":901,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#platform","Platform",[129],"MethodPathScopeGET\u002Fmeany",{"id":903,"title":904,"titles":905,"content":906,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#dashboard-only-they-do-not-accept-api-keys","Dashboard-only (they do not accept API keys)",[129],"AreaRoutesChannels and pauses\u002Fchannels, \u002Fchannels\u002Fwhatsapp, \u002Fchannels\u002Ftelegram, \u002Fchannels\u002Fservice-status, \u002Fchannels\u002Fpauses, \u002Fchannels\u002F{channel}\u002Fpause and \u002Fresume; see Pauses and StatusPer-channel bot policy\u002Fbot\u002Fchannel-policies (see WebChat)Knowledge sources\u002Fknowledge\u002Fsources (see Knowledge)Flows\u002Fautomation-flows (see Flows)Project AI\u002Fai\u002Fusage, \u002Fai\u002Fpause, \u002Fai\u002Fresume, \u002Fai\u002FnoticesWagy\u002Fassistant\u002F*, the dashboard's setup assistantTeam and account\u002Fteam\u002F*, \u002Fapi-keys, \u002Fworkspaces, \u002Fme\u002Ftelegram, \u002Fme\u002Fnotification-preferencesWebChat\u002Fwebchat-site (management) and \u002Fpublic\u002Fwebchat\u002F* (public, with the widget's publishable key)",{"id":908,"title":909,"titles":910,"content":911,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#example-slots","Example: 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":913,"title":914,"titles":915,"content":916,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#example-booking-object","Example: booking object",[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} Allocations include the buffer (here, 10 minutes after the service). On queue tasks, start and end are null until someone takes them.",{"id":918,"title":919,"titles":920,"content":921,"level":158},"\u002Fdocs\u002Fapi\u002Fendpoints#recent-changes","Recent changes",[129],"These are the API's new features, all additive. The full history lives in the repository (docs\u002Fapi\u002FCHANGELOG.md). Customers: manual creation, extended data, address with formatted, lat and lng, and multichannel identities[].Tasks and actions: unified GET \u002Fwork-items query, action executor with effects (take, release, outcomes) and 409 already_claimed.Messages with location: WhatsApp, Telegram and WebChat store the shared location in the conversation.Pauses: when a channel is paused, sending a message answers 409 channel_paused.Knowledge: site-type sources with max_pages and errors by cause. 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":923,"content":924,"level":152},[],"Signed notifications for what happens to your bookings, with automatic retries, a delivery log and examples to verify the signature.",{"id":926,"title":927,"titles":928,"content":929,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#events","Events",[133],"These booking events can be subscribed to today: EventWhenbooking.createdA hold or booking was createdbooking.confirmedA booking was confirmedbooking.cancelledCancelled or expiredbooking.rescheduledMoved to a new time (payload has the old and new ids)booking.no_showMarked as absentbooking.completedAppointment completed The contract also reserves payment.paid, message.received and conversation.handoff, but they cannot be subscribed to yet and are not emitted (collecting the deposit is Coming soon). An endpoint that asks for them gets 422. Create endpoints in Settings → Webhooks in the dashboard or with POST \u002Fv1\u002Fwebhook-endpoints (url and events). The signing secret (whsec_…) is shown once. 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":931,"title":932,"titles":933,"content":934,"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} Delivery is at least once: use id to ignore duplicates.",{"id":936,"title":937,"titles":938,"content":939,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#verifying-the-signature","Verifying the signature",[133],"Every request has a header: Wagend-Signature: t=1791040867,v1=5c2b9f...e81 v1 is HMAC-SHA256(secret, t + \".\" + raw_body) in hex. Reject requests older than 5 minutes and compute the signature over the raw body, without re-serializing the 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":941,"title":942,"titles":943,"content":944,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#retries","Retries",[133],"Respond with any 2xx within 10 seconds. Otherwise we retry after 1 min, 5 min, 30 min, 2 h and 12 h. Every attempt is visible in the delivery log, where you can also resend manually.",{"id":946,"title":947,"titles":948,"content":949,"level":158},"\u002Fdocs\u002Fapi\u002Fwebhooks#security-and-limits","Security and limits",[133],"The URL must be https and resolve to a public address: we reject localhost, private networks, link-local and cloud metadata addresses (when you register it and on every delivery). Redirects are not followed (a 3xx counts as a failure).Extra headers: Wagend-Event (type) and Wagend-Delivery (delivery id). Every attempt is signed with a fresh timestamp.Up to 10 endpoints per workspace. After 10 consecutive failures the endpoint is disabled (re-enable it with PATCH \u002Fv1\u002Fwebhook-endpoints\u002F{id} and {\"active\": true}).POST \u002Fv1\u002Fwebhook-endpoints\u002F{id}\u002Fping sends a webhook.ping test event; POST \u002Fv1\u002Fwebhook-endpoints\u002F{id}\u002Frotate-secret issues a new secret (shown once; the old one stops working immediately).With an API key use the webhooks:manage scope. The log is at GET \u002Fv1\u002Fwebhook-endpoints\u002F{id}\u002Fdeliveries and resending at 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":951,"content":952,"level":152},[],"Typed clients generated from the OpenAPI contract: how to use them today from the repository, with booking, error, pagination and idempotency examples. Wagend has two SDKs that are generated from the contract packages\u002Fopenapi\u002Fopenapi.yaml, so their types always follow the API. The SDKs are not published yet on npm or PyPI (Coming soon). Today you use them from the repository, as explained below. If you would rather not depend on them, the REST API works with any HTTP client.",{"id":954,"title":955,"titles":956,"content":957,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#typescript","TypeScript",[137],"The client (packages\u002Fsdk-ts) is a light wrapper over fetch with types for every route.",{"id":959,"title":960,"titles":961,"content":962,"level":344},"\u002Fdocs\u002Fapi\u002Fsdks#install-from-the-repository","Install from the repository",[137,955],"cd packages\u002Fsdk-ts\nnpm ci\nnpm run build          # genera dist\u002F In your project, install it from that folder: npm install \u002Fpath\u002Fto\u002Fwagendapp\u002Fpackages\u002Fsdk-ts",{"id":964,"title":965,"titles":966,"content":967,"level":344},"\u002Fdocs\u002Fapi\u002Fsdks#book-a-slot","Book a slot",[137,955],"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 10-minute hold\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 Confirmation with the customer data\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} Authentication: the client adds Authorization: Bearer for you.Idempotency: on every write it adds an Idempotency-Key if you do not pass one. To retry an operation, pass the same key yourself in both attempts (valid for 24 hours). The TypeScript type declares it in params.header for the routes that require it.Errors: any non-2xx response throws WagendError with .status, .code, .problem (RFC 9457) and .retryAfter (seconds, on 429).",{"id":969,"title":847,"titles":970,"content":971,"level":344},"\u002Fdocs\u002Fapi\u002Fsdks#pagination",[137,955],"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":973,"title":974,"titles":975,"content":976,"level":344},"\u002Fdocs\u002Fapi\u002Fsdks#customers-and-actions","Customers and actions",[137,955],"\u002F\u002F Search and create customers (scopes customers:read and 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 Run a stage action, for example assigning a delivery to a courier (scope bookings:write).\n\u002F\u002F \"atribuir\" is the key of that action in the deliveries template.\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}); Action keys (key) are defined by your business's stage configuration: look them up with GET \u002Fstage-config.",{"id":978,"title":979,"titles":980,"content":981,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#python","Python",[137],"The client (packages\u002Fsdk-py) uses httpx and generated Pydantic v2 models.",{"id":983,"title":960,"titles":984,"content":985,"level":344},"\u002Fdocs\u002Fapi\u002Fsdks#install-from-the-repository-1",[137,979],"pip install \u002Fpath\u002Fto\u002Fwagendapp\u002Fpackages\u002Fsdk-py\n# or, with uv:\nuv pip install \u002Fpath\u002Fto\u002Fwagendapp\u002Fpackages\u002Fsdk-py",{"id":987,"title":965,"titles":988,"content":989,"level":344},"\u002Fdocs\u002Fapi\u002Fsdks#book-a-slot-1",[137,979],"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=\"booking-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() and list_slots() return typed models. For the other routes use api.request(method, path, params=…, json=…); you can validate the response with wagend.models.Idempotency: writes carry an Idempotency-Key (one is generated if you do not pass idempotency_key). Retry with the same key.Errors: WagendError with .status, .code, .problem and .retry_after (on 429).Pagination: api.paginate(\"\u002Fbookings\", params={\"limit\": 50}) walks every page. for booking in api.paginate(\"\u002Fbookings\", params={\"limit\": 50}):\n    print(booking[\"id\"])",{"id":991,"title":857,"titles":992,"content":993,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#rate-limits",[137],"The limit is per key and per project. On a 429, wait retry_after \u002F retryAfter seconds before retrying. See Conventions.",{"id":995,"title":996,"titles":997,"content":998,"level":158},"\u002Fdocs\u002Fapi\u002Fsdks#regenerating-the-sdks","Regenerating the SDKs",[137],"If the contract changes, make sdk regenerates both from openapi.yaml and make sdk-check fails if they are out of date. 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":1000,"content":1001,"level":152},[],"Connect Claude, ChatGPT or your own agent to the Wagend MCP server to look up times, book and run the business with your API key. Wagend includes an MCP server (Model Context Protocol) so AI agents use the same engine as the WhatsApp bot: same holds, same validation and same audit trail. The server is a thin client of the API: every tool calls the API with your own key, so MCP never grants more permissions than the key. The server lives in the repository (packages\u002Fmcp) and today you run it yourself. The hosted server at mcp.wagend.app is not deployed yet: it is Coming soon. So is OAuth authentication.",{"id":1003,"title":1004,"titles":1005,"content":1006,"level":158},"\u002Fdocs\u002Fmcp#run-the-server","Run the server",[141],"You need Python 3.12+ and 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: VariablePurposeWAGEND_API_URLAPI URL (default https:\u002F\u002Fapi.wagend.app)MCP_TOOLSETSToolsets to expose: booking, admin or both (default booking,admin)MCP_HOST, MCP_PORTWhere it listens (default 127.0.0.1:8700)MCP_ALLOWED_HOSTSAllowed hosts (DNS rebinding protection)",{"id":1008,"title":1009,"titles":1010,"content":1011,"level":158},"\u002Fdocs\u002Fmcp#connect-a-client","Connect a client",[141],"Authentication is an API key in the Authorization header. Without a key in a valid format, the server answers 401 before entering the protocol. With Claude Code: claude mcp add --transport http wagend http:\u002F\u002F127.0.0.1:8700\u002F \\\n  --header \"Authorization: Bearer wg_live_xxx\" Or with the JSON configuration of any client that supports 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} To try it without an agent: npx @modelcontextprotocol\u002Finspector (Streamable HTTP transport, the same URL and header).",{"id":1013,"title":1014,"titles":1015,"content":1016,"level":158},"\u002Fdocs\u002Fmcp#tools","Tools",[141],"All tools in the active toolset are listed, but each one only works if the key has the scope it needs; otherwise it returns the API's 403 error. Writes are audited with actor mcp. Bookings (booking): for assistants that book on behalf of a customer. ToolScopeDoeslist_servicesconfig:readServices with duration and pricefind_slotsslots:readAvailable times for a service between two dateshold_slotbookings:write10-minute holdconfirm_bookingbookings:writeConfirms a hold with the customer's datacancel_booking, reschedule_bookingbookings:writeManages an existing bookingget_bookingbookings:readBooking detail Administration (admin): so the owner can run the business from their AI assistant. ToolScopeDoeslist_resourcesconfig:readTeam, rooms, machines and groupslist_todaybookings:readToday's bookingsblock_timeconfig:write and bookings:readCloses whole days of a resource (max. 31). It does not cancel existing bookings: it returns them for a person to decidecreate_service, update_serviceconfig:writeCreates or changes a service, with its booking formupdate_scheduleconfig:writeChanges the weekly schedule or the time zoneget_statsbookings:readBookings, occupancy and no-shows per resourceget_stage_config, list_stage_config_versions, get_stage_config_versionconfig:readStages, actions and forms, with their version historyupdate_stage_config, revert_stage_configsettings:writeReplaces or reverts the stages (creates a new version; history is kept) Configuration writes require confirm=true. Without it, the tool does not call the API: it returns confirmation_required with what it would send, so the agent can show it to a person and repeat with the confirmation.",{"id":1018,"title":1019,"titles":1020,"content":1021,"level":158},"\u002Fdocs\u002Fmcp#example-requests","Example requests",[141],"\"Book a haircut with Juan tomorrow morning, under the name Carlos.\"\"Block the laser machine next Monday for maintenance and tell me which bookings are affected.\"\"How many no-shows did we have this month?\"",{"id":1023,"title":1024,"titles":1025,"content":1026,"level":158},"\u002Fdocs\u002Fmcp#docs-for-llms","Docs for LLMs",[141],"\u002Fllms.txt lists every documentation page.\u002Fllms-full.txt contains the full documentation in 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":1028,"content":1029,"level":152},[],"API recipes (customers, tasks, actions, webhooks) and how to model a barbershop, aesthetics, clinic, restaurant and deliveries.",{"id":1031,"title":1032,"titles":1033,"content":1034,"level":158},"\u002Fdocs\u002Frecipes#api-recipes","API recipes",[145],"All of them use $WAGEND_KEY as in the quickstart.",{"id":1036,"title":1037,"titles":1038,"content":1039,"level":344},"\u002Fdocs\u002Frecipes#create-a-customer-and-book-for-them-in-one-go","Create a customer and book for them in one go",[145,1032],"Needs customers:write and bookings:write. The phone number is the customer's unique identifier: if it already exists, the API answers 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 does the hold and the confirmation in a single call.",{"id":1041,"title":1042,"titles":1043,"content":1044,"level":344},"\u002Fdocs\u002Frecipes#read-what-is-due-today","Read what is due today",[145,1032],"Needs bookings:read. GET \u002Fwork-items is the same query the Today screen uses. curl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fwork-items?view=today&limit=50\" \\\n  -H \"Authorization: Bearer $WAGEND_KEY\"\n\n# Only what nobody has taken yet\ncurl \"https:\u002F\u002Fapi.wagend.app\u002Fv1\u002Fwork-items?unassigned=true&limit=50\" \\\n  -H \"Authorization: Bearer $WAGEND_KEY\" Each task carries its stage and its available_actions.",{"id":1046,"title":1047,"titles":1048,"content":1049,"level":344},"\u002Fdocs\u002Frecipes#assign-and-close-a-delivery-with-actions","Assign and close a delivery with actions",[145,1032],"Needs bookings:write. Actions are named by the business's stage configuration (with the deliveries template: atribuir, soltar, iniciar, concluir, nao_estava). Look them up in GET \u002Fstage-config or in the task's available_actions. # Assign the delivery to a courier (resource_id is the courier's resource)\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# Close it as completed\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\": {} }' If two people take the same task at once, one wins and the other gets 409 already_claimed. The \"Accept delivery\" action (aceitar) is for staff from the dashboard or Telegram: it takes the task with the resource of whoever runs it.",{"id":1051,"title":1052,"titles":1053,"content":1054,"level":344},"\u002Fdocs\u002Frecipes#receive-webhook-notifications","Receive webhook notifications",[145,1032],"Register an endpoint (see Webhooks) and verify the signature before processing. Minimal Express example: import express from 'express'\nimport { verifyWagend } from '.\u002Fverify' \u002F\u002F the function from the Webhooks page\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('New booking', event.data.booking.id)\n  res.sendStatus(200) \u002F\u002F answer 2xx quickly; duplicates are dropped by event.id\n})\napp.listen(3000)",{"id":1056,"title":1057,"titles":1058,"content":1059,"level":158},"\u002Fdocs\u002Frecipes#templates-by-business","Templates by business",[145],"Each recipe matches a ready-made template you can pick during onboarding.",{"id":1061,"title":1062,"titles":1063,"content":1064,"level":158},"\u002Fdocs\u002Frecipes#barbershop","Barbershop",[145],"Each barber is an exclusive staff resource with their own schedule. One group, customer_choice with a round_robin fallback. {\n  \"name\": \"Haircut\",\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":1066,"title":1067,"titles":1068,"content":1069,"level":158},"\u002Fdocs\u002Frecipes#aesthetics","Aesthetics",[145],"Professionals, machines and rooms are separate resources. A service requires all three at the same time, so the scarcest one (usually the machine) limits the agenda. {\n  \"name\": \"Laser hair removal\",\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":1071,"title":1072,"titles":1073,"content":1074,"level":158},"\u002Fdocs\u002Frecipes#clinic","Clinic",[145],"Doctor plus office, per location (one workspace per location). Health data is sensitive: the assistant never asks about symptoms, and the intake form collects only what scheduling needs. {\n  \"name\": \"Appointment\",\n  \"duration_min\": 30,\n  \"buffer_after_min\": 10,\n  \"intake_form\": { \"type\": \"object\", \"properties\": { \"insurance\": { \"type\": \"string\" } } },\n  \"requirements\": [\n    { \"resource_group_id\": \"grp_doctors\", \"units\": 1 },\n    { \"resource_group_id\": \"grp_offices\", \"units\": 1 }\n  ]\n}",{"id":1076,"title":1077,"titles":1078,"content":1079,"level":158},"\u002Fdocs\u002Frecipes#restaurant","Restaurant",[145],"The dining room is one pooled resource with 40 units (covers) per slot. Duration grows with the party size, and large parties require a deposit. {\n  \"name\": \"Table\",\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} Table mode (specific tables with minimum and maximum size, and combinations) is on the roadmap.",{"id":1081,"title":1082,"titles":1083,"content":1084,"level":158},"\u002Fdocs\u002Frecipes#deliveries","Deliveries",[145],"Each zone is a pooled resource with a capacity per 2-hour window. The zone is selected by postal code, and a cutoff rule closes same-day windows at noon. {\n  \"name\": \"Delivery\",\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":1086,"title":83,"badge":1087,"body":1088,"description":1643,"extension":1644,"meta":1645,"navigation":1646,"path":84,"rawbody":1647,"seo":1648,"stem":85,"updated":1649,"__hash__":1650},"docs_en\u002Fdocs\u002F07.work\u002F01.tasks-and-actions.md",null,{"type":1089,"value":1090,"toc":1627},"minimark",[1091,1120,1124,1173,1177,1184,1251,1258,1304,1307,1310,1326,1332,1335,1342,1345,1364,1367,1447,1454,1457,1467,1470,1518,1521,1541,1544,1555,1558,1614,1619,1622],[1092,1093,1094,1095,1099,1100,1103,1104,1107,1108,1111,1112,1115,1116,1119],"p",{},"In Wagend, everything that needs doing is a ",[1096,1097,1098],"strong",{},"task",": an appointment, a table, a visit, a delivery. A conversation can create one; you also create them by hand with the ",[1096,1101,1102],{},"New task"," button or through the API. The panel gives you three main destinations: ",[1096,1105,1106],{},"Today",", ",[1096,1109,1110],{},"Inbox"," and ",[1096,1113,1114],{},"Work",". The rest lives under ",[1096,1117,1118],{},"More",".",[1121,1122,563],"h2",{"id":1123},"today-inbox-and-work",[1125,1126,1127,1160,1168],"ul",{},[1128,1129,1130,1132,1133,1136,1137,1136,1140,1136,1143,1146,1147,1150,1151,1154,1155,1111,1157,1119],"li",{},[1096,1131,1106],{}," is your day's board. It shows what ",[1096,1134,1135],{},"needs your attention",", what is ",[1096,1138,1139],{},"next",[1096,1141,1142],{},"in progress",[1096,1144,1145],{},"later today"," and, collapsed, what is ",[1096,1148,1149],{},"completed",". Team members see only their own (",[1096,1152,1153],{},"Mine","); owner and manager switch between ",[1096,1156,1153],{},[1096,1158,1159],{},"All",[1128,1161,1162,1164,1165,1119],{},[1096,1163,1110],{}," gathers the conversations that need a person. See ",[1166,1167,70],"a",{"href":71},[1128,1169,1170,1172],{},[1096,1171,1114],{}," is where you see all tasks. You look at it along two axes that combine.",[1174,1175,568],"h3",{"id":1176},"work-set-form",[1092,1178,1179,1180,1183],{},"First you choose ",[1096,1181,1182],{},"which work to see"," (the set):",[1185,1186,1187,1200],"table",{},[1188,1189,1190],"thead",{},[1191,1192,1193,1197],"tr",{},[1194,1195,1196],"th",{},"Set",[1194,1198,1199],{},"What it shows",[1201,1202,1203,1214,1223,1233,1242],"tbody",{},[1191,1204,1205,1211],{},[1206,1207,1208],"td",{},[1096,1209,1210],{},"Unassigned",[1206,1212,1213],{},"What needs attention: no owner, no time or waiting for confirmation",[1191,1215,1216,1220],{},[1206,1217,1218],{},[1096,1219,1106],{},[1206,1221,1222],{},"Today's work for the whole business",[1191,1224,1225,1230],{},[1206,1226,1227],{},[1096,1228,1229],{},"Upcoming",[1206,1231,1232],{},"What is coming, grouped by day",[1191,1234,1235,1239],{},[1206,1236,1237],{},[1096,1238,1159],{},[1206,1240,1241],{},"All work, with the order and grouping you pick",[1191,1243,1244,1248],{},[1206,1245,1246],{},[1096,1247,1153],{},[1206,1249,1250],{},"What is assigned to you",[1092,1252,1253,1254,1257],{},"Then you choose ",[1096,1255,1256],{},"how to see it"," (the form):",[1185,1259,1260,1270],{},[1188,1261,1262],{},[1191,1263,1264,1267],{},[1194,1265,1266],{},"Form",[1194,1268,1269],{},"When it appears",[1201,1271,1272,1282,1292],{},[1191,1273,1274,1279],{},[1206,1275,1276],{},[1096,1277,1278],{},"List",[1206,1280,1281],{},"Always",[1191,1283,1284,1289],{},[1206,1285,1286],{},[1096,1287,1288],{},"Calendar",[1206,1290,1291],{},"If there are resources with a schedule (by day, by professional or by week)",[1191,1293,1294,1299],{},[1206,1295,1296],{},[1096,1297,1298],{},"Map",[1206,1300,1301,1302],{},"If there are tasks with a location. See ",[1166,1303,87],{"href":88},[1092,1305,1306],{},"\"If it has nothing, it does not show\": a form only appears when your business needs it. All of them open the same task detail. Filters (search, priority, tag, dates), order and grouping apply to every form.",[1121,1308,573],{"id":1309},"the-task-and-its-stages",[1092,1311,1312,1313,1316,1317,1321,1322,1325],{},"Each task is in a ",[1096,1314,1315],{},"stage",". Stages are your business's vocabulary: a barbershop uses ",[1318,1319,1320],"em",{},"Confirmed → In progress → Completed","; a delivery uses ",[1318,1323,1324],{},"Unassigned → Accepted → On the way → Delivered",". Behind them are fixed states (hold, confirmed, in progress, completed, cancelled, absent, failed), so numbers and statistics mean the same in every industry.",[1092,1327,1328,1329,1119],{},"The task detail shows the customer, the date and resource, notes, form data, the origin (for example the WhatsApp conversation it came from) and the ",[1096,1330,1331],{},"comments and activity",[1174,1333,578],{"id":1334},"forms-per-service",[1092,1336,1337,1338,1341],{},"A service can ask for its own data when the task is created: the delivery address, the reason for the visit, the equipment model. That data is filled in on the task and stays with it. It is defined on the service (",[1096,1339,1340],{},"More → Business → Services",").",[1121,1343,583],{"id":1344},"actions",[1092,1346,1347,1348,1351,1352,1355,1356,1359,1360,1363],{},"Actions are a task's buttons. Depending on the stage, role and business, the panel shows ",[1096,1349,1350],{},"one big main action"," (for example ",[1318,1353,1354],{},"Accept delivery"," or ",[1318,1357,1358],{},"On my way",") and the rest under ",[1096,1361,1362],{},"Other actions",". Each action can ask for confirmation or a short form (a comment, a reason).",[1092,1365,1366],{},"An action can do more than change stage. The available effects are:",[1185,1368,1369,1378],{},[1188,1370,1371],{},[1191,1372,1373,1376],{},[1194,1374,1375],{},"Effect",[1194,1377,439],{},[1201,1379,1380,1390,1400,1413,1437],{},[1191,1381,1382,1387],{},[1206,1383,1384],{},[1096,1385,1386],{},"Take",[1206,1388,1389],{},"The task is assigned to whoever takes it. If someone else got there first, it warns and does not assign it twice",[1191,1391,1392,1397],{},[1206,1393,1394],{},[1096,1395,1396],{},"Assign",[1206,1398,1399],{},"The owner or manager chooses who gets it",[1191,1401,1402,1407],{},[1206,1403,1404],{},[1096,1405,1406],{},"Release",[1206,1408,1409,1410,1412],{},"The task goes back to ",[1318,1411,1210],{}," for someone else to take (only before it starts)",[1191,1414,1415,1420],{},[1206,1416,1417],{},[1096,1418,1419],{},"Outcome",[1206,1421,1422,1423,1107,1425,1428,1429,1432,1433,1436],{},"Closes the task as ",[1096,1424,1149],{},[1096,1426,1427],{},"absent"," (\"not home\"), ",[1096,1430,1431],{},"refused"," (\"does not want it\") or ",[1096,1434,1435],{},"cancelled",", with an optional reason",[1191,1438,1439,1444],{},[1206,1440,1441],{},[1096,1442,1443],{},"Reschedule",[1206,1445,1446],{},"On tasks with no set time, moves the due time a little later",[1092,1448,1449,1450,1453],{},"Everything an action does happens together or not at all: if something fails, nothing is left half done. And an action ",[1096,1451,1452],{},"never grants extra permissions",": a team member cannot assign tasks even if the button existed.",[1174,1455,588],{"id":1456},"unassigned-tasks-and-queues",[1092,1458,1459,1460,1462,1463,1466],{},"Some jobs have no set time, like deliveries. They enter as ",[1096,1461,1210],{},", whoever can do them ",[1096,1464,1465],{},"takes"," them and then follows the sequence. A team member sees the tasks assigned to them and those their group can take, without the customer's phone or email until they take it. A courier first sees only the approximate area.",[1092,1468,1469],{},"Example in the deliveries industry:",[1471,1472,1473,1478,1488,1495,1504],"ol",{},[1128,1474,1475,1476,1119],{},"An order arrives: it is ",[1096,1477,1210],{},[1128,1479,1480,1481,1483,1484,1487],{},"A courier taps ",[1096,1482,1354],{},": the task is theirs. (Or the manager taps ",[1096,1485,1486],{},"Assign delivery",".)",[1128,1489,1490,1491,1494],{},"If they cannot, they tap ",[1096,1492,1493],{},"Release delivery"," and it goes back to the queue.",[1128,1496,1497,1498,1500,1501,1119],{},"They tap ",[1096,1499,1358],{},", then ",[1096,1502,1503],{},"Arrived",[1128,1505,1506,1507,1510,1511,1355,1514,1517],{},"They close with ",[1096,1508,1509],{},"Complete",", or with ",[1096,1512,1513],{},"Not home",[1096,1515,1516],{},"Refused"," (plus a reason).",[1174,1519,593],{"id":1520},"each-industry-with-its-own-vocabulary",[1092,1522,1523,1524,1107,1527,1107,1529,1111,1532,1535,1536,1111,1538,1119],{},"Stages and actions come from your industry's template (barbershop, aesthetics, clinic, restaurant, deliveries) and can be adjusted. Barbershop, aesthetics, clinic and restaurant come with ",[1318,1525,1526],{},"Start",[1318,1528,1509],{},[1318,1530,1531],{},"Cancel",[1318,1533,1534],{},"No-show",". To rename them or add actions, today you do it through the API or the MCP server: see ",[1166,1537,116],{"href":130},[1166,1539,1540],{"href":142},"MCP",[1121,1542,598],{"id":1543},"work-evidence",[1092,1545,1546,1547,1550,1551,1554],{},"An action can ask for the ",[1096,1548,1549],{},"location"," at that moment (for example when marking \"Arrived\") and a task accepts ",[1096,1552,1553],{},"attachments"," (photo, document, audio, note). They are private: only people with access to that task see them, download links expire after 60 seconds and files are deleted after a retention period (30 days by default). The owner or manager can delete a location.",[1121,1556,603],{"id":1557},"what-each-role-sees",[1185,1559,1560,1573],{},[1188,1561,1562],{},[1191,1563,1564,1567,1569,1571],{},[1194,1565,1566],{},"Role",[1194,1568,1106],{},[1194,1570,1114],{},[1194,1572,880],{},[1201,1574,1575,1589,1602],{},[1191,1576,1577,1580,1583,1586],{},[1206,1578,1579],{},"Owner and manager",[1206,1581,1582],{},"The whole business",[1206,1584,1585],{},"Everything",[1206,1587,1588],{},"Yes",[1191,1590,1591,1594,1597,1599],{},[1206,1592,1593],{},"Staff",[1206,1595,1596],{},"Their own and what they can take",[1206,1598,1596],{},[1206,1600,1601],{},"No",[1191,1603,1604,1607,1610,1612],{},[1206,1605,1606],{},"Viewer",[1206,1608,1609],{},"View only",[1206,1611,1609],{},[1206,1613,1601],{},[1092,1615,1616,1617,1119],{},"More in ",[1166,1618,108],{"href":109},[1121,1620,608],{"id":1621},"automate-the-work",[1092,1623,1624,1625,1119],{},"Every stage change or action can trigger a message or a flow: see ",[1166,1626,91],{"href":92},{"title":1628,"searchDepth":158,"depth":344,"links":1629},"",[1630,1633,1636,1640,1641,1642],{"id":1123,"depth":158,"text":563,"children":1631},[1632],{"id":1176,"depth":344,"text":568},{"id":1309,"depth":158,"text":573,"children":1634},[1635],{"id":1334,"depth":344,"text":578},{"id":1344,"depth":158,"text":583,"children":1637},[1638,1639],{"id":1456,"depth":344,"text":588},{"id":1520,"depth":344,"text":593},{"id":1543,"depth":158,"text":598},{"id":1557,"depth":158,"text":603},{"id":1621,"depth":158,"text":608},"How the day to day is organized in Wagend, with Today, Inbox and Work, and how task stages and actions work, such as take, release and close.","md",{},true,"---\ntitle: Work and actions\ndescription: How the day to day is organized in Wagend, with Today, Inbox and Work, and how task stages and actions work, such as take, release and close.\nupdated: \"2026-10-03\"\n---\n\nIn Wagend, everything that needs doing is a **task**: an appointment, a table, a visit, a delivery. A conversation can create one; you also create them by hand with the **New task** button or through the API. The panel gives you three main destinations: **Today**, **Inbox** and **Work**. The rest lives under **More**.\n\n## Today, Inbox and Work\n\n- **Today** is your day's board. It shows what **needs your attention**, what is **next**, what is **in progress**, what is **later today** and, collapsed, what is **completed**. Team members see only their own (**Mine**); owner and manager switch between **Mine** and **All**.\n- **Inbox** gathers the conversations that need a person. See [The bot and the AI](\u002Fdocs\u002Fbot\u002Foverview).\n- **Work** is where you see all tasks. You look at it along two axes that combine.\n\n### Work: set × form\n\nFirst you choose **which work to see** (the set):\n\n| Set | What it shows |\n| --- | --- |\n| **Unassigned** | What needs attention: no owner, no time or waiting for confirmation |\n| **Today** | Today's work for the whole business |\n| **Upcoming** | What is coming, grouped by day |\n| **All** | All work, with the order and grouping you pick |\n| **Mine** | What is assigned to you |\n\nThen you choose **how to see it** (the form):\n\n| Form | When it appears |\n| --- | --- |\n| **List** | Always |\n| **Calendar** | If there are resources with a schedule (by day, by professional or by week) |\n| **Map** | If there are tasks with a location. See [Map and addresses](\u002Fdocs\u002Fwork\u002Fmap-and-addresses) |\n\n\"If it has nothing, it does not show\": a form only appears when your business needs it. All of them open the same task detail. Filters (search, priority, tag, dates), order and grouping apply to every form.\n\n## The task and its stages\n\nEach task is in a **stage**. Stages are your business's vocabulary: a barbershop uses *Confirmed → In progress → Completed*; a delivery uses *Unassigned → Accepted → On the way → Delivered*. Behind them are fixed states (hold, confirmed, in progress, completed, cancelled, absent, failed), so numbers and statistics mean the same in every industry.\n\nThe task detail shows the customer, the date and resource, notes, form data, the origin (for example the WhatsApp conversation it came from) and the **comments and activity**.\n\n### Forms per service\n\nA service can ask for its own data when the task is created: the delivery address, the reason for the visit, the equipment model. That data is filled in on the task and stays with it. It is defined on the service (**More → Business → Services**).\n\n## Actions\n\nActions are a task's buttons. Depending on the stage, role and business, the panel shows **one big main action** (for example *Accept delivery* or *On my way*) and the rest under **Other actions**. Each action can ask for confirmation or a short form (a comment, a reason).\n\nAn action can do more than change stage. The available effects are:\n\n| Effect | What it does |\n| --- | --- |\n| **Take** | The task is assigned to whoever takes it. If someone else got there first, it warns and does not assign it twice |\n| **Assign** | The owner or manager chooses who gets it |\n| **Release** | The task goes back to *Unassigned* for someone else to take (only before it starts) |\n| **Outcome** | Closes the task as **completed**, **absent** (\"not home\"), **refused** (\"does not want it\") or **cancelled**, with an optional reason |\n| **Reschedule** | On tasks with no set time, moves the due time a little later |\n\nEverything an action does happens together or not at all: if something fails, nothing is left half done. And an action **never grants extra permissions**: a team member cannot assign tasks even if the button existed.\n\n### Unassigned tasks and queues\n\nSome jobs have no set time, like deliveries. They enter as **Unassigned**, whoever can do them **takes** them and then follows the sequence. A team member sees the tasks assigned to them and those their group can take, without the customer's phone or email until they take it. A courier first sees only the approximate area.\n\nExample in the deliveries industry:\n\n1. An order arrives: it is **Unassigned**.\n2. A courier taps **Accept delivery**: the task is theirs. (Or the manager taps **Assign delivery**.)\n3. If they cannot, they tap **Release delivery** and it goes back to the queue.\n4. They tap **On my way**, then **Arrived**.\n5. They close with **Complete**, or with **Not home** or **Refused** (plus a reason).\n\n### Each industry with its own vocabulary\n\nStages and actions come from your industry's template (barbershop, aesthetics, clinic, restaurant, deliveries) and can be adjusted. Barbershop, aesthetics, clinic and restaurant come with *Start*, *Complete*, *Cancel* and *No-show*. To rename them or add actions, today you do it through the API or the MCP server: see [API](\u002Fdocs\u002Fapi\u002Fendpoints) and [MCP](\u002Fdocs\u002Fmcp).\n\n## Work evidence\n\nAn action can ask for the **location** at that moment (for example when marking \"Arrived\") and a task accepts **attachments** (photo, document, audio, note). They are private: only people with access to that task see them, download links expire after 60 seconds and files are deleted after a retention period (30 days by default). The owner or manager can delete a location.\n\n## What each role sees\n\n| Role | Today | Work | Customers |\n| --- | --- | --- | --- |\n| Owner and manager | The whole business | Everything | Yes |\n| Staff | Their own and what they can take | Their own and what they can take | No |\n| Viewer | View only | View only | No |\n\nMore in [Roles and permissions](\u002Fdocs\u002Fteam\u002Froles).\n\n## Automate the work\n\nEvery stage change or action can trigger a message or a flow: see [Flows](\u002Fdocs\u002Fwork\u002Fflows).\n",{"title":83,"description":1643},"2026-10-03","8fUqpE0nhExexzsuRGkzwiyo6SFc10wzz3fyRGubNyo",[1652,1654],{"title":74,"path":75,"stem":76,"description":1653,"children":-1},"Teach the bot with texts, files, web pages, a section of your site or listings (spreadsheets, CSV, JSON and RSS) that stay up to date.",{"title":87,"path":88,"stem":89,"description":1655,"children":-1},"The Work map view, address autocomplete, the location a customer shares and how privacy is protected.",1791052082522]