{"id":880,"date":"2026-10-29T13:42:05","date_gmt":"2026-10-29T13:42:05","guid":{"rendered":"https:\/\/vectalk.com.br\/blog\/whatsapp-chatbot-human-handoff\/"},"modified":"2026-10-29T13:42:09","modified_gmt":"2026-10-29T13:42:09","slug":"whatsapp-chatbot-human-handoff","status":"publish","type":"post","link":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/","title":{"rendered":"From bot to human on WhatsApp: when and how to hand off the conversation"},"content":{"rendered":"\n<p><em>Updated on October 29, 2026<\/em><\/p>\n\n\n\n<p>To hand off a WhatsApp conversation from a bot to a human, your system changes the conversation state from &#8220;bot&#8221; to &#8220;waiting for human&#8221;, stops generating automated replies, lets the customer know, and gives the agent a summary with the data already collected. The handoff should happen when the customer asks for it, when the topic is sensitive, when the bot fails twice, or when the customer is a priority. The WhatsApp Business policy allows automation within the 24-hour window, but requires prompt, clear and direct escalation paths.<\/p>\n\n\n\n<p>The official WhatsApp Business API has no &#8220;transfer&#8221; button: your software does the handoff. This guide covers triggers, what to pass to the agent, how to pause and resume the bot, SLA, and pseudocode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why handoff is mandatory, not optional<\/h2>\n\n\n\n<p>The <a href=\"https:\/\/whatsappbusiness.com\/policy\/\" target=\"_blank\" rel=\"noreferrer noopener\">WhatsApp Business Messaging Policy<\/a> says a business can use automation when replying within the 24-hour window, as long as it keeps prompt, clear and direct escalation paths. The list of accepted options includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>transfer to a human agent within the same conversation;<\/li>\n\n\n<li>a phone number;<\/li>\n\n\n<li>an email address;<\/li>\n\n\n<li>support on the business&#8217;s website;<\/li>\n\n\n<li>a visit to a store or branch;<\/li>\n\n\n<li>a support form.<\/li>\n\n<\/ul>\n\n\n\n<p>An in-chat transfer gives the best experience; the other options work as a fallback outside business hours.<\/p>\n\n\n\n<p>AI bots have one more reason: Meta&#8217;s terms restrict general-purpose AI assistants on the platform, and a customer service bot with a narrow scope and a path to a human is clearly on the permitted side. The details are in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-ai-policy-2026\/\">Meta&#8217;s AI policy for chatbots<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The four handoff triggers<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Trigger<\/th><th>How to detect it<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>Explicit request<\/td><td>Keywords, a &#8220;Talk to an agent&#8221; button, or the LLM classifies the intent<\/td><td>&#8220;I want to talk to a person&#8221;<\/td><\/tr><tr><td>Sensitive intent<\/td><td>A list of topics the business decides to handle only with people<\/td><td>cancellation, complaint, disputed charge, health data<\/td><\/tr><tr><td>Repeated failure<\/td><td>A counter of unsuccessful replies in the same conversation<\/td><td>the bot didn&#8217;t understand twice in a row<\/td><\/tr><tr><td>Priority customer<\/td><td>A CRM lookup by WhatsApp number<\/td><td>corporate contract customer, order above a certain amount<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Explicit request<\/h3>\n\n\n\n<p>Three layers help:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>A button always at hand.<\/strong> Include &#8220;Talk to an agent&#8221; as an option in the bot&#8217;s interactive messages. See <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-interactive-messages-api\/\">interactive messages<\/a>.<\/li>\n\n\n<li><strong>Keywords.<\/strong> &#8220;agent&#8221;, &#8220;human&#8221;, &#8220;person&#8221;, &#8220;manager&#8221;. Simple, fast and with no LLM cost.<\/li>\n\n\n<li><strong>Intent classification.<\/strong> If the bot uses an LLM, ask it to flag the <code>talk_to_human<\/code> intent when the customer asks in other words.<\/li>\n\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Sensitive intent<\/h3>\n\n\n\n<p>Define the list with the customer service and legal teams, not with the tech team. Cancellation, disputed charges, formal complaints and any conversation involving sensitive data (health, for example) usually make the list. Brazil&#8217;s data protection law, the LGPD, treats health data as sensitive personal data (art. 5, II, of Law 13,709\/2018); this article does not replace advice from a lawyer about your case.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Repeated failure<\/h3>\n\n\n\n<p>Count failures per conversation (&#8220;I didn&#8217;t understand&#8221;, empty search, customer repeating the question). Two in a row is a good starting point for handing off; reset the counter when the bot gets it right.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Priority customer<\/h3>\n\n\n\n<p>The webhook carries the customer&#8217;s number in <code>messages[].from<\/code>. With it, your system checks the CRM before the bot replies. If the customer has an account manager or a high-value order in progress, the conversation can go straight to the human queue, or the bot does only the triage and hands off.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The conversation state machine<\/h2>\n\n\n\n<p>The core of the handoff is a state field per conversation, stored in the database by the customer&#8217;s <code>wa_id<\/code>. Every event that arrives through the webhook passes through it before any reply.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-text\">                  handoff trigger\n   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b6  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n   \u2502 bot  \u2502                                \u2502   waiting_human    \u2502\n   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u25c0\u2500\u2500\u2500\u2500 timeout, no agent \u2500\u2500\u2500\u2500\u2500\u2500 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n      \u25b2          (bot notifies and offers           \u2502\n      \u2502           another channel)                  \u2502 agent takes over\n      \u2502                                             \u25bc\n      \u2502                                    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 agent returns it \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502    human     \u2502\n               or conversation idle        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>State<\/th><th>Who replies<\/th><th>What the bot does<\/th><th>Exits when<\/th><\/tr><\/thead><tbody><tr><td><code>bot<\/code><\/td><td>Bot<\/td><td>Replies normally<\/td><td>A trigger fires<\/td><\/tr><tr><td><code>waiting_human<\/code><\/td><td>No one automatically<\/td><td>Notifies once and stays silent<\/td><td>An agent takes over, or the maximum wait time runs out<\/td><\/tr><tr><td><code>human<\/code><\/td><td>Agent<\/td><td>Nothing; only logs the messages<\/td><td>The agent returns it, closes it, or the conversation goes idle<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Two common mistakes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>The bot talking over the agent.<\/strong> This happens when the state lives only in process memory or when two workers process the same conversation. Store the state in the database and process each conversation&#8217;s messages in order.<\/li>\n\n\n<li><strong>A conversation stuck in <code>human<\/code> forever.<\/strong> The customer comes back a week later and nobody answers, because the bot thinks someone is handling it. Use an inactivity timeout to return it to the bot.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What to pass to the agent<\/h2>\n\n\n\n<p>The agent shouldn&#8217;t have to read 40 messages to understand the case. Along with the handoff, deliver a card with:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Item<\/th><th>Where it comes from<\/th><\/tr><\/thead><tbody><tr><td>Name and number<\/td><td><code>contacts[].profile.name<\/code> and <code>messages[].from<\/code> in the webhook<\/td><\/tr><tr><td>Handoff reason<\/td><td>The trigger that fired (request, sensitive, failure, priority)<\/td><\/tr><tr><td>2 or 3 line summary<\/td><td>Generated by the LLM from the history, or assembled from the flow&#8217;s answers<\/td><\/tr><tr><td>Data already collected<\/td><td>Order number, partial CPF (Brazilian taxpayer ID), email, product<\/td><\/tr><tr><td>Source<\/td><td>Ad, website, QR code; the webhook carries the <code>referral<\/code> object when the conversation starts from a Click-to-WhatsApp ad<\/td><\/tr><tr><td>Time of the customer&#8217;s last message<\/td><td><code>messages[].timestamp<\/code>, to know how much of the 24-hour window is left<\/td><\/tr><tr><td>Link to the full history<\/td><td>Your database or CRM<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>An example payload your system can publish to the support queue or the CRM:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"conversation_id\": \"5511988887777\",\n  \"reason\": \"sensitive_intent:cancellation\",\n  \"summary\": \"Customer wants to cancel the annual subscription. Already provided email and order number. Asked about a prorated refund.\",\n  \"data\": { \"order\": \"48213\", \"email\": \"customer@example.com\" },\n  \"source\": { \"type\": \"ad\", \"source_id\": \"120226305854810726\" },\n  \"last_customer_message\": \"2026-10-29T14:02:11-03:00\",\n  \"window_expires_at\": \"2026-10-30T14:02:11-03:00\",\n  \"priority\": \"normal\"\n}<\/code><\/pre>\n\n\n\n<p>The LLM summary can be wrong: show the full history right below it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to notify the customer<\/h2>\n\n\n\n<p>The transition message needs to say three things: that a person will take over, how long it should take, and what to do if it&#8217;s outside business hours.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>During business hours:<\/strong> &#8220;I&#8217;m bringing in someone from our team. The average wait right now is a few minutes, and you don&#8217;t need to repeat anything.&#8221;<\/li>\n\n\n<li><strong>Outside business hours:<\/strong> &#8220;Our team is available Monday to Friday, 8am to 6pm. I&#8217;ve logged your case and someone will reply here first thing. If it&#8217;s urgent, call (11) 0000-0000.&#8221;<\/li>\n\n<\/ul>\n\n\n\n<p>Send the notice <strong>once<\/strong>. If the customer writes again while waiting, the bot doesn&#8217;t reply to every message; at most, it repeats the notice after an interval. Welcome and away messages based on business hours are covered in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-welcome-away-message\/\">welcome and away messages on the API<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Watch the 24-hour window<\/h3>\n\n\n\n<p>Free-form text can only be sent up to 24 hours after the customer&#8217;s last message. If the human queue is slow and the window closes, the agent can no longer reply with free-form text: they need an approved template to reopen contact. That&#8217;s why the agent&#8217;s card shows when the window expires, and the queue should be sorted with that deadline in mind. The rules are in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-24-hour-customer-service-window\/\">the WhatsApp 24-hour window<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to return to the bot<\/h2>\n\n\n\n<p>The return to the bot can happen in three ways:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>The agent returns it.<\/strong> A &#8220;Return to bot&#8221; button in the support tool changes the state to <code>bot<\/code>. The bot shouldn&#8217;t send a message at that moment; it only resumes replying on the customer&#8217;s next message.<\/li>\n\n\n<li><strong>The agent closes the case.<\/strong> When the case is closed, the state goes back to <code>bot<\/code> and the support history is recorded for the next conversation.<\/li>\n\n\n<li><strong>Inactivity.<\/strong> If the conversation is in <code>human<\/code> and nobody writes for a set period (for example, a few hours), the system returns it to the bot.<\/li>\n\n<\/ol>\n\n\n\n<p>When it comes back, include a note in the LLM context such as &#8220;case handled by an agent on such date&#8221;, so the bot doesn&#8217;t reopen the topic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SLA: what to measure<\/h2>\n\n\n\n<p>Measure the handoff with data your own system already records:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Metric<\/th><th>How to calculate it<\/th><\/tr><\/thead><tbody><tr><td>Handoff rate<\/td><td>Handed-off conversations \u00f7 conversations handled by the bot<\/td><\/tr><tr><td>Handoffs by trigger<\/td><td>Count by reason (request, sensitive, failure, priority)<\/td><\/tr><tr><td>Time until an agent takes over<\/td><td>Time it entered <code>human<\/code> \u2212 time it entered <code>waiting_human<\/code><\/td><\/tr><tr><td>Windows lost in the queue<\/td><td>Conversations where the 24-hour window closed before the agent replied<\/td><\/tr><tr><td>Returns to the bot<\/td><td>Conversations that went back to <code>bot<\/code> and were resolved without another handoff<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Many handoffs due to &#8220;failure&#8221; mean the bot is missing content; many due to &#8220;explicit request&#8221; right on the first message suggest the bot doesn&#8217;t introduce itself well. General support metrics (first response time, average handling time, CSAT) are covered in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-customer-service-metrics\/\">WhatsApp customer service metrics<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Router pseudocode<\/h2>\n\n\n\n<p>The router runs for every incoming message, after deduplication by the <code>wamid<\/code> ID.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-python\">def route(msg, conversation):\n    conversation.last_customer_msg = msg.timestamp\n    log_to_history(conversation, msg)\n\n    if conversation.state == \"human\":\n        notify_agent(conversation, msg)           # the bot stays silent\n        return\n\n    if conversation.state == \"waiting_human\":\n        if max_wait_exceeded(conversation):\n            send_text(msg.from_, OTHER_CHANNEL_NOTICE)\n            conversation.state = \"bot\"\n        return                                    # don't reply to every message\n\n    # state == \"bot\"\n    reason = detect_trigger(msg, conversation)    # request, sensitive, failure, priority\n    if reason:\n        return hand_off(conversation, reason)\n\n    reply = bot_reply(conversation)\n    if reply.failed:\n        conversation.failures += 1\n        if conversation.failures &gt;= 2:\n            return hand_off(conversation, \"repeated_failure\")\n    else:\n        conversation.failures = 0\n    send_text(msg.from_, reply.text)\n\n\ndef hand_off(conversation, reason):\n    conversation.state = \"waiting_human\"\n    conversation.queued_at = now()\n    send_text(conversation.wa_id, handoff_notice(within_business_hours()))\n    publish_to_human_queue({\n        \"conversation_id\": conversation.wa_id,\n        \"reason\": reason,\n        \"summary\": summarize(conversation.history),\n        \"window_expires_at\": conversation.last_customer_msg + hours(24),\n    })\n\n\ndef agent_took_over(conversation, agent_id):\n    conversation.state = \"human\"\n    conversation.agent = agent_id\n    record_metric(\"time_to_take_over\", now() - conversation.queued_at)\n\n\ndef return_to_bot(conversation):\n    conversation.state = \"bot\"\n    conversation.failures = 0\n    add_context_note(conversation, \"human support completed\")<\/code><\/pre>\n\n\n\n<p><code>send_text<\/code> calls the API with Meta&#8217;s standard payload (<code>type: \"text\"<\/code>); the queue and notifications live in your tool (tickets, CRM, your own screen).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What if the agent replies from their phone?<\/h3>\n\n\n\n<p>With <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-coexistence\/\">coexistence<\/a>, the same number lives in the WhatsApp Business app and on the API. Messages the agent sends from the app reach your system as echo events. The router can use that echo to switch the conversation to <code>human<\/code> automatically: if a person replied from the phone, the bot steps aside. What syncs and what doesn&#8217;t is covered in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-coexistence-what-syncs\/\">coexistence: what syncs<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to do the handoff with Vectalk<\/h2>\n\n\n\n<p>Vectalk provides the official API: you receive webhooks in Meta&#8217;s format and send through the <code>POST https:\/\/apis.vectalk.com.br\/api\/messages<\/code> endpoint, with the same payload. The Vectalk dashboard has no support inbox and no built-in bot. The router, the conversation state and the agent screen live in your system or in the tool you connect to the API (a CRM, a customer service platform, an n8n flow).<\/p>\n\n\n\n<p>In practice, the setup looks like this:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Register your router&#8217;s URL as the instance webhook (<a href=\"https:\/\/docs.vectalk.com.br\/concepts\/webhooks\">webhooks documentation<\/a>). You can register more than one URL; all of them receive the same event.<\/li>\n\n\n<li>The router decides between bot and human and sends replies through the API.<\/li>\n\n\n<li>The support tool reads and replies through the same calls, or the team uses the app on their phone with coexistence.<\/li>\n\n<\/ol>\n\n\n\n<p>If several agents will use the same number, see <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-multi-agent-api\/\">multiple agents on the same number<\/a>. To get started, create your account at <a href=\"https:\/\/apps.vectalk.com.br\/register\">apps.vectalk.com.br\/register<\/a> and read the guide to the <a href=\"https:\/\/vectalk.com.br\/blog\/en\/official-whatsapp-api\/\">official WhatsApp Business API<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Does the WhatsApp Business API have a native human handoff feature?<\/h3>\n\n\n\n<p>No. The Cloud API sends and receives messages; your system decides whether the reply comes from the bot or from a person. The handoff is a state change in your database, not an API call.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What happens if nobody takes over the conversation?<\/h3>\n\n\n\n<p>Set a maximum time in the queue. When it runs out, the bot tells the customer, offers another channel (phone, email, form) and logs the case for follow-up. If the 24-hour window closes, follow-up can only be done with a template.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Are the agent&#8217;s messages charged like the bot&#8217;s?<\/h3>\n\n\n\n<p>Yes. For Meta, a free-form text reply within the window is a service message, whether written by a person or by a third-party AI. Since October 1, 2026, each number gets 1,000 free service messages per month and pays from the 1,001st on; for recipients in Brazil, the rate is R$ 0.0350 (Brazilian reais) per delivered message.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can the bot suggest replies to the agent?<\/h3>\n\n\n\n<p>Yes. In this model, the LLM generates a draft on the agent&#8217;s screen, and the agent reviews and sends it. It&#8217;s a way to keep a human in control on sensitive topics without losing speed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Official sources consulted on October 29, 2026:<\/strong> <a href=\"https:\/\/whatsappbusiness.com\/policy\/\" target=\"_blank\" rel=\"noreferrer noopener\">WhatsApp Business Messaging Policy<\/a> (updated on September 23, 2026), <a href=\"https:\/\/www.facebook.com\/legal\/Meta-Terms-for-WhatsApp-Business-Platform\" target=\"_blank\" rel=\"noreferrer noopener\">Meta Terms for WhatsApp Business Platform<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/messages\/send-messages\" target=\"_blank\" rel=\"noreferrer noopener\">Customer service window<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/pricing\" target=\"_blank\" rel=\"noreferrer noopener\">Platform pricing<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/reference\/messages\/text\" target=\"_blank\" rel=\"noreferrer noopener\">Text message webhook and referral object<\/a>, <a href=\"https:\/\/docs.vectalk.com.br\/concepts\/webhooks\">Webhooks (Vectalk)<\/a>, <a href=\"https:\/\/www.planalto.gov.br\/ccivil_03\/_ato2015-2018\/2018\/lei\/l13709.htm\" target=\"_blank\" rel=\"noreferrer noopener\">Law 13,709\/2018 (LGPD, Brazil&#8217;s data protection law)<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Triggers, a state machine, a summary for the agent, a notice to the customer and the return to the bot: how to build WhatsApp handoff on the official API.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-880","post","type-post","status-publish","format-standard","hentry","category-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WhatsApp Chatbot to Human Handoff | Vectalk<\/title>\n<meta name=\"description\" content=\"WhatsApp chatbot to human handoff: triggers, what to pass to the agent, pausing and resuming the bot, SLA, and pseudocode on the WhatsApp Business API.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WhatsApp Chatbot to Human Handoff | Vectalk\" \/>\n<meta property=\"og:description\" content=\"WhatsApp chatbot to human handoff: triggers, what to pass to the agent, pausing and resuming the bot, SLA, and pseudocode on the WhatsApp Business API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Vectalk\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-29T13:42:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-29T13:42:09+00:00\" \/>\n<meta name=\"author\" content=\"wanderleyfcunha\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"wanderleyfcunha\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/\"},\"author\":{\"name\":\"wanderleyfcunha\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"headline\":\"From bot to human on WhatsApp: when and how to hand off the conversation\",\"datePublished\":\"2026-10-29T13:42:05+00:00\",\"dateModified\":\"2026-10-29T13:42:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/\"},\"wordCount\":1884,\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/\",\"name\":\"WhatsApp Chatbot to Human Handoff | Vectalk\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-29T13:42:05+00:00\",\"dateModified\":\"2026-10-29T13:42:09+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"description\":\"WhatsApp chatbot to human handoff: triggers, what to pass to the agent, pausing and resuming the bot, SLA, and pseudocode on the WhatsApp Business API.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-chatbot-human-handoff\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"From bot to human on WhatsApp: when and how to hand off the conversation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\",\"name\":\"Blog Vectalk\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\",\"name\":\"wanderleyfcunha\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"caption\":\"wanderleyfcunha\"},\"sameAs\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WhatsApp Chatbot to Human Handoff | Vectalk","description":"WhatsApp chatbot to human handoff: triggers, what to pass to the agent, pausing and resuming the bot, SLA, and pseudocode on the WhatsApp Business API.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/","og_locale":"en_US","og_type":"article","og_title":"WhatsApp Chatbot to Human Handoff | Vectalk","og_description":"WhatsApp chatbot to human handoff: triggers, what to pass to the agent, pausing and resuming the bot, SLA, and pseudocode on the WhatsApp Business API.","og_url":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/","og_site_name":"Blog Vectalk","article_published_time":"2026-10-29T13:42:05+00:00","article_modified_time":"2026-10-29T13:42:09+00:00","author":"wanderleyfcunha","twitter_card":"summary_large_image","twitter_misc":{"Written by":"wanderleyfcunha","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/#article","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/"},"author":{"name":"wanderleyfcunha","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"headline":"From bot to human on WhatsApp: when and how to hand off the conversation","datePublished":"2026-10-29T13:42:05+00:00","dateModified":"2026-10-29T13:42:09+00:00","mainEntityOfPage":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/"},"wordCount":1884,"articleSection":["Blog"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/","url":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/","name":"WhatsApp Chatbot to Human Handoff | Vectalk","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/#website"},"datePublished":"2026-10-29T13:42:05+00:00","dateModified":"2026-10-29T13:42:09+00:00","author":{"@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"description":"WhatsApp chatbot to human handoff: triggers, what to pass to the agent, pausing and resuming the bot, SLA, and pseudocode on the WhatsApp Business API.","breadcrumb":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-chatbot-human-handoff\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vectalk.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"From bot to human on WhatsApp: when and how to hand off the conversation"}]},{"@type":"WebSite","@id":"https:\/\/vectalk.com.br\/blog\/#website","url":"https:\/\/vectalk.com.br\/blog\/","name":"Blog Vectalk","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vectalk.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b","name":"wanderleyfcunha","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","caption":"wanderleyfcunha"},"sameAs":["https:\/\/vectalk.com.br\/blog"]}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/880","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/comments?post=880"}],"version-history":[{"count":1,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/880\/revisions"}],"predecessor-version":[{"id":883,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/880\/revisions\/883"}],"wp:attachment":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/media?parent=880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/categories?post=880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/tags?post=880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}