RevoplyAIDocs
Guides

Hand over to a human

Open a ticket in your helpdesk when the assistant hands a conversation to your team, using the conversation.handover event.

When the assistant cannot or should not carry on (the customer asks for a person, is upset, or asks something only your team can do) it hands the conversation to your team. The conversation.handover event tells your systems at that moment, so you can open a ticket, page someone or post to a channel.

1. Choose the events

Add an endpoint under Integrations → Webhooks, or edit one, and choose Handed over to your team. Add Conversation assigned and Conversation resolved to follow the conversation afterwards. Build the receiver as in Receive messages with webhooks.

2. Read the event

It fires when the conversation is handed over: the customer asked for a person, the assistant was missing information, a flow reached a handover step, a lead qualified for a handover, or loop protection stepped in. It fires once per handover: a customer who asks twice while the handover is open raises it once.

FieldHolds
data.reasonWhy, as a stable code: customer_asked_for_person, missing_information, needs_staff_action, customer_upset, qualified_lead, flow_handover, message_burst, unsupported_media… Treat an unknown code as "other".
data.reasonTextThe assistant's own words, when it gave any. For people; often Arabic.
data.conversationThe conversation's id, channelId and channelType
data.contactThe customer's id, name, phone and whatsAppId, where the channel knows them

3. Open a ticket

Turn the event into a ticket, keyed on the event id so a repeated delivery opens one ticket:

export function ticketFromHandover(event) {
  if (event.type !== 'conversation.handover' || event.test) return null;

  const { conversation, contact, reason, reasonText } = event.data;
  return {
    // One ticket per event, however often the event is delivered.
    externalId: event.id,
    subject: `Handover (${reason}): ${contact?.name ?? contact?.phone ?? 'a customer'}`,
    // The assistant's own words, when it gave any; often Arabic.
    description: reasonText ?? '',
    priority: reason === 'customer_upset' ? 'high' : 'normal',
    channelType: conversation.channelType,
    conversationId: conversation.id,
    phone: contact?.phone ?? null,
    openedAt: event.createdAt,
  };
}

Answer 200 first, then call your helpdesk from a queue: a helpdesk that is slow to answer must not make the delivery time out.

4. Follow the conversation

  • conversation.assigned fires when a team member assigns, reassigns or unassigns it; data.assignee is null when unassigned.
  • conversation.resolved fires when a team member resolves or closes it. Close the ticket then. A bulk close sends only the conversation id, so key tickets on it.

Your team answers the customer from the RevoplyAI inbox.

On this page