Blog / Practical notes for builders

Give your bot a useful human handoff

Give your bot a useful human handoff; BadAssBots.com is for sale

A bot handoff succeeds when a person can continue the work. A message saying that support has been notified is only one part of that experience. The receiving team needs enough context, a clear reason for escalation, and ownership of the next action. The user needs an accurate explanation of what happened and a way to return to the same case.

Design the handoff before the bot handles real requests. Start with a fictional conversation that reaches a reasonable limit: a user cannot access a workshop they believe they purchased, and the bot cannot establish which account holds the enrollment. Write what the user sees, what the operator receives, and where the case waits. The gaps become easier to spot when all three views are visible.

Decide when a person takes over

Make explicit requests for a person a supported path. Also define escalation triggers for missing authority, conflicting records, repeated failed attempts, and tasks outside the bot's scope. A trigger should describe an observable condition. “When the conversation gets difficult” is too vague to implement or test consistently.

Avoid treating a model's confidence score as the whole policy. A system can sound certain while holding incomplete information. For actions with meaningful consequences, use concrete checks: an account match exists, the required permission is present, and the requested operation is within the bot's allowed role. If those checks fail, prepare a handoff rather than improvising a result.

Limit repeated troubleshooting loops. If the user has already tried the documented recovery step and it failed, record that fact. Asking the same question again may be easy for the bot but costly for the person. Give the user a clear exit from the loop and preserve what they have already supplied.

Write a handoff record an operator can use

A useful record contains the user's goal, relevant identifiers, what has been verified, actions attempted, results observed, and the unresolved question. Include a link to the conversation where the platform supports it. Keep the summary short enough to scan, with the full history available when the operator needs detail.

For the fictional workshop case, the summary might say: “User wants access to the September session. Signed in as account A. Enrollment lookup returned no matching record. User reports an order confirmation under a second address. No account changes made. Needs an operator to verify ownership and locate the enrollment.” This separates the user's report from facts the system has verified.

Do not allow a generated summary to silently become the authoritative record. Preserve structured fields and original evidence, and label unverified statements. If the bot could not complete a lookup because the service timed out, say that. “No enrollment exists” would be a materially different claim.

Microsoft's Copilot Studio handoff documentation describes transferring conversation history and contextual variables to a connected engagement hub. Those platform features can carry the record, but your team still needs to decide which fields matter and how an operator will use them.

Name the owner and the waiting state

A case needs a destination that someone actually monitors. Define the receiving queue, how assignment occurs, and who handles cases that remain unassigned. If the queue covers several products, include a routing field that has a clear source. Do not force the operator to infer the destination from a long transcript.

Separate “waiting for the team” from “waiting for the customer.” Zendesk's explanation of ticket states distinguishes work awaiting agent attention from work waiting on a requester or third party. Your terminology may differ, but the underlying ownership question remains useful: who can move this case forward now?

Choose a policy for unattended hours. If nobody is available for live transfer, create a persistent case or offer the configured contact route. Do not display a live-agent promise when the actual result is a ticket for later review. Publish response expectations only when the team has adopted and can support them.

Tell the user what was actually accepted

The bot's confirmation should follow evidence from the receiving system. If a case was created, show its reference and explain where replies will appear. If creation failed, say that the handoff has not completed and provide a fallback. Avoid converting every integration response into the same cheerful success message.

For the workshop example, a useful confirmation could state that a support request was created, include the reference, and explain that the operator will review the enrollment details already supplied. It should also make clear whether the user needs to remain in chat. If they can leave and return later, tell them how to find the case.

If the system is unsure whether a request was accepted, reconcile its status before telling the user to submit again. A timeout can leave the outcome unknown. Repeating the transfer may produce duplicate cases and conflicting replies. Use a stable handoff identifier so a retry can refer to the same intended escalation.

Stop the bot from competing with the operator

Define the bot's behavior after transfer. It may acknowledge a new user message and attach it to the existing case, but it should not independently make decisions that conflict with the operator's work. Give the conversation a recorded mode such as awaiting support or assigned to an operator, and make transitions deliberate.

Think about the operator returning control to the bot. The return should include a reason and an updated state, such as “identity verified; resume workshop selection.” The bot needs the result of the human step, not an instruction to restart the original script. If resumption is unsupported, close the automated path cleanly and let the operator finish.

Preserve access boundaries through this transition. Transcripts and account details should be visible only to the roles that need them. Avoid copying sensitive context into a broad public channel to make notification easier. A short alert with a link to the restricted case is often more appropriate than a full transcript in the notification.

Test the uncomfortable transfers

Run the handoff with no operator available, an invalid routing value, a slow ticket service, and a user who sends another message during transfer. Test a repeated escalation request and an operator who changes the assigned team. Inspect both the user's view and the receiving queue; neither alone proves the transfer works.

Check whether context survives across channels if your product offers that capability. A chat reference pasted into email is not automatically a connected conversation. Verify which replies attach to the case and what happens when a user returns from a different device. Document any identity check required before showing existing details.

Measure more than the number of escalations. Sample whether operators had to repeat questions, whether summaries were accurate, and how long cases remained without an owner. A low escalation rate can conceal users who gave up. Feedback from the receiving team is a better guide to handoff quality than a goal of keeping every conversation automated.

Begin with one sample handoff record and ask an operator to resolve the fictional case using only that record. Let them point out what is missing. Revise the data and the user message together. When both sides can understand the next step, the handoff becomes a working part of the service rather than a polite dead end.

Michael Santiago

About Michael Santiago

Michael founded i-Newswire.com in 2007, growing through iNewswire.com into the category-defining Newswire.com. The business sold to Issuer Direct for $44 million in 2022. That experience informs his belief in clear, memorable names. Today he develops premium domains and companies through OnlineBusiness.com.