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.
| Piece | What it does | API |
|---|---|---|
| Member tags | Which skills a team member has. | GET/PUT /users/{user_id}/tags |
| Tag-based inbox access | Members with a tag can see a private custom inbox. | access_tag_ids on custom inboxes |
| Assignment on handoff | When 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 tag | The 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
| Method | Path | Scope | Body |
|---|---|---|---|
GET | /api/v1/users/{user_id}/tags | team:read | — |
PUT | /api/v1/users/{user_id}/tags | team: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"}
]
}
| Status | When |
|---|---|
404 | The user is not a member of this workspace ("User not found in tenant"). |
422 | A 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_idsis separate fromtag_ids.tag_idsfilters which conversations are in the inbox;access_tag_idsdecides 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:
| Field | Type | Notes |
|---|---|---|
escalation_routing_strategy | string or null | null (default), round_robin_all, least_busy_all, round_robin, least_busy or notify_only. |
escalation_tag_id | string | The 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_minutes | integer | 1..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
}'
| Strategy | On hand-over |
|---|---|
null | Keep the conversation unassigned. Your team is alerted as usual. |
round_robin_all | Assign an unassigned conversation to the next eligible team member in turn. No tag. |
least_busy_all | Assign an unassigned conversation to the eligible team member with the fewest open conversations. No tag. |
notify_only | Add the tag to the conversation and alert the members holding it. Nobody is assigned. |
round_robin | Add the tag and assign an unassigned conversation to the next tag holder in turn. |
least_busy | Add 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_minutesset, 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 (_allstrategies). - 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_tagandleast_busy_by_tagadd 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_idis 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
- Custom Inboxes — inbox filters and access control
- Tags & Lists — create and manage tags
- Flow nodes — Open Conversation reference