Skip to main content

Skill-Based Routing

Skill-based routing uses your existing tags as skills. Give team members tags such as billing, german or enterprise, then let SendSeven send matching conversations to the people holding them.

PieceWhat it doesAPI
Member tagsWhich skills a team member has.GET/PUT /users/{user_id}/tags
Tag-based inbox accessMembers with a tag can see a private custom inbox.access_tag_ids on custom inboxes
Assignment on handoffWhen an FAQ Bot hands over, assign the conversation to any team member or to a tag holder, or just notify the tag holders.escalation_* fields on bots
Flow assignment by tagThe Open Conversation node assigns to a tag holder.round_robin_by_tag / least_busy_by_tag

Tags are shared between contacts, conversations and members. Manage them with the Tags API. Tag names are unique per workspace.


Member tags​

MethodPathScopeBody
GET/api/v1/users/{user_id}/tagsteam:read—
PUT/api/v1/users/{user_id}/tagsteam:update{"tag_ids": ["...", "..."]} (max 100)

PUT replaces the member's full set of tags. Send an empty list to remove all of them.

curl -X PUT "https://api.sendseven.com/api/v1/users/USER_ID/tags" \
-H "Authorization: Bearer s7_api_a1b2c3d4e5f6789012345678abcdef00" \
-H "Content-Type: application/json" \
-d '{"tag_ids": ["tag_billing", "tag_german"]}'

Both endpoints return:

{
"items": [
{"id": "tag_billing", "name": "Billing", "color": "#F59E0B"},
{"id": "tag_german", "name": "German", "color": "#3B82F6"}
]
}
StatusWhen
404The user is not a member of this workspace ("User not found in tenant").
422A tag does not belong to this workspace.

Tag-based inbox access​

A custom inbox with Specific users access (access_mode: "specific") can also be opened to everyone holding a tag. Set access_tag_ids (max 50) when creating or updating the inbox:

{
"name": "Billing questions",
"access_mode": "specific",
"all_channels": true,
"tag_ids": ["tag_billing"],
"access_tag_ids": ["tag_billing"]
}
  • Members holding any of the access tags see the conversations that match the inbox's filters.
  • access_tag_ids is separate from tag_ids. tag_ids filters which conversations are in the inbox; access_tag_ids decides who may see it.
  • Access through tags is added to the users you list explicitly. Owners and Admins always see everything.
  • When a conversation that is open and unassigned gets one of the inbox's filter tags, the members holding the access tags are notified.

See Custom Inboxes — API fields for all fields.


Assignment on handoff​

FAQ Bots (/api/v1/automation/bots) have three optional fields that decide what happens to the conversation when the bot hands it to a human:

FieldTypeNotes
escalation_routing_strategystring or nullnull (default), round_robin_all, least_busy_all, round_robin, least_busy or notify_only.
escalation_tag_idstringThe tag that marks the needed skill. Must belong to your workspace. Required for round_robin, least_busy and notify_only; ignored and cleared for the _all strategies.
escalation_fallback_minutesinteger1..1440. Optional safety net for every strategy, see below.
curl -X PATCH "https://api.sendseven.com/api/v1/automation/bots/BOT_ID" \
-H "Authorization: Bearer s7_api_a1b2c3d4e5f6789012345678abcdef00" \
-H "Content-Type: application/json" \
-d '{
"escalation_routing_strategy": "round_robin_all",
"escalation_fallback_minutes": 15
}'
StrategyOn hand-over
nullKeep the conversation unassigned. Your team is alerted as usual.
round_robin_allAssign an unassigned conversation to the next eligible team member in turn. No tag.
least_busy_allAssign an unassigned conversation to the eligible team member with the fewest open conversations. No tag.
notify_onlyAdd the tag to the conversation and alert the members holding it. Nobody is assigned.
round_robinAdd the tag and assign an unassigned conversation to the next tag holder in turn.
least_busyAdd the tag and assign an unassigned conversation to the tag holder with the fewest open conversations.
  • Every hand-over alerts your team, whatever the strategy. Assignment happens on top of that.
  • Only active members who can see the conversation are eligible. Online members are preferred.
  • An already assigned conversation is never reassigned.
  • If no member is eligible, workspace Owners and Admins are alerted instead and the conversation stays unassigned.
  • Fallback: with escalation_fallback_minutes set, if the conversation is still unassigned, or the assigned member has not replied, after that many minutes, Owners and Admins are alerted, together with the tag holders (tag strategies) or the assigned member (_all strategies).
  • The fallback follows your escalation schedule: when the bot's escalation schedule is enabled and the hand-over happens outside it, the countdown starts when the schedule next opens, not at the moment of the hand-over. A conversation handed over at 22:00 with a 15-minute fallback and a schedule opening at 09:00 is checked at 09:15. Replies sent before then still count.
  • Outside the escalation schedule: on messaging channels (WhatsApp, Telegram, SMS, email and so on) the bot sends its outside-hours message instead of its hand-over message; your team is still alerted and the assignment above still runs, so the conversation is ready for the next working day. On live chat the bot's offline behaviour decides: Escalate anyway hands over as usual; Leave a message and Continue helping do not hand over, so nothing is assigned.

PATCH merges with the stored values; send null to clear a field. Responses always include all three fields. A tag strategy without a tag, or a tag from another workspace, returns 422. Switching to round_robin_all or least_busy_all clears the stored tag.

Conversational Agents can also hand over with a skill tag: list the allowed tags in the agent's handoff_config.handoff_tag_ids, and the agent adds the matching tag to the conversation when it hands over. See Conversational Agents — Hand-off & assignment.


Flow assignment by tag​

The Flow Open Conversation node supports two tag strategies:

{
"type": "open_conversation",
"config": {
"assign_strategy": "round_robin_by_tag",
"assignment_tag_id": "tag_billing",
"unattended_fallback_minutes": 15
}
}
  • round_robin_by_tag and least_busy_by_tag add the tag to the conversation, then assign it to an eligible member holding that tag (in turn, or the one with the fewest open conversations).
  • assignment_tag_id is required and must exist when the flow is saved and published. If the tag is deleted later, the node skips assignment.
  • unattended_fallback_minutes (1..1440) works like the bot fallback above. If the flow trigger has a schedule, its time windows count as your opening hours: when the conversation is opened outside them, the countdown starts at the next window. Without a trigger schedule the countdown starts immediately.

Round-robin turns are shared per tag, so bots and flows routing to the same tag take turns through the same rotation. round_robin_all has its own workspace-wide rotation.

Next steps​