Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.
Tags are labels Fini applies to every conversation automatically, in real time. They’re how the system understands what each conversation is about: what state it’s in, and whether the agent behaved correctly, and they’re how you turn that understanding into routing logic, analytics, and quality control.
The page header reads Tag Groups because tags don’t exist on their own, every tag belongs to a group: and each group represents one classification dimension. A group like Sentiment contains the tags Positive: Neutral: Negative; a group like Type of Issue contains the tags for whatever issue categories you want tracked. Fini evaluates one decision per group, per conversation.
What tags are for
Tags do three jobs at once. Understanding which job a tag is doing tells you how to configure it.
Job
What it looks like
Example
Observability
Tag fires; you filter and report on it. Doesn’t change agent behavior.
Type of Issue = billing: used to find all billing conversations in the Inbox or chart the issue mix in Analytics.
Routing
Tag is consumed by a Rulebook condition that branches the conversation. Requires the Tag Group available in Rulebooks toggle.
Action Confirmation = user_confirmed → Rulebook proceeds with the cancellation; user_denied → Rulebook sends apology and offers alternatives.
Reply behavior
Tag suppresses or modifies the reply itself via Reply Behavior.
Sentiment = spam-like → skip reply entirely rather than engage.
A single tag can only do one job at a time, but a single group can drive different jobs depending on how its toggle is set and which downstream systems read it.
How tags get applied
After each message exchange, Fini evaluates every active tag group against the conversation. For each group, it reads the group’s AI Instructions (the decision rules you’ve written) and picks the tag, or tags, that match.This happens automatically. You don’t trigger it, customers don’t see it, and tags accumulate on the conversation as it progresses. They’re visible on every conversation in the Inbox and queryable via filters and Analytics.The quality of your AI Instructions directly determines the accuracy of your tags. Vague instructions produce inconsistent tagging. A specific instruction, “apply escalated if the agent used the FALLBACK HATCH phrase or said ‘let me connect you with our team’; apply resolved if no follow-up is pending”: produces reliable, actionable tags.
Write AI Instructions as if you’re briefing a teammate on how to label transcripts manually. The model follows your wording closely, so be explicit about edge cases (“if the customer asks a clarifying question after the agent’s answer, still apply resolved”) and provide example phrases the agent says or the customer says that should trigger each tag.
Types of tag groups
Two orthogonal dimensions classify every group:
Dimension
Values
What it controls
Origin
Default (Fini ships it) vs. Custom (you create it)
Whether the group is editable. Default groups are read-only; Custom groups are fully editable.
Behavior
Mandatory (always-on, no opt-out) vs. Optional (you assign to specific agents)
Whether you can disable the group or scope it per-agent.
The cards on the Tag Groups page surface these as badges. A group with no badges is a fully editable Custom group. A group with Default is Fini-shipped but optional. A group with both Default and Mandatory (currently just one: Conversation Status) is Fini-shipped and always on. The Rulebook badge is independent of all of this, it indicates the group’s tags are usable as Rulebook conditions.
Default groups
Default groups are pre-built by Fini and available to all accounts. They cover the classifications most teams need out of the box.
Group
What it captures
Conversation Status
The state of the conversation, Resolved, Escalated to Human Agent, Waiting for Customer. The system tag that drives the Inbox status badge, Reply Behavior decisions, and resolution analytics. See Conversation Status below.
Sentiment
The customer’s reaction to the agent’s most recent reply, Positive, Neutral, Negative. Useful for satisfaction tracking and identifying conversations where the agent is failing the customer.
Escalation Reason
When the agent escalates, why. Eleven tags split across Knowledge gaps, Action failures, User-driven requests, and Policy triggers. The diagnostic backbone for “what is my agent struggling with?”
Type of Issue
The category of issue the customer is asking about. Used for triage and prioritization.
Knowledge Gap
Whether knowledge was missing from the knowledge search results, surfaces gaps in your knowledge base.
Default groups aren’t editable in their core configuration, title, description, AI Instructions, tag list, Tag Selection mode, and Rulebook availability are all locked. The group detail page shows a “This is a default tag group and cannot be edited” note in place of the Edit Overview button. What you can control is which agents each Default group is active on: see Assigning groups to agents.
Mandatory groups, Conversation Status
There is exactly one Mandatory group, and it’s load-bearing: Conversation Status.Conversation Status is the tag the rest of Fini depends on to understand what state a conversation is in. The Inbox status badge, Reply Behavior rules, “Fini Touched” filters, and resolution analytics all read from this tag. That’s why it’s both Mandatory (always on, every agent) and Default (Fini-controlled, can’t be edited).
It has three tags, applied via an explicit four-step decision rule the model follows in order:
Tag
When it applies
Escalated to Human Agent
Either: the agent has explicitly handed off (used the FALLBACK HATCH, said “let me connect you with our team,” or otherwise confirmed a human will take over); or the agent says a request was forwarded, passed on, or handed off to an internal team and indicates the team will follow up with the customer directly.
Waiting for Customer
The agent asked for specific required info or action necessary to proceed, and the conversation can’t move forward without it.
Resolved
None of the above. The agent gave a complete answer (or a complete acknowledgment of background work) and no follow-up is pending.
Because Conversation Status drives downstream systems, its instructions are written defensively, they encode specific phrases the agent uses (e.g. “I have forwarded your request to our specialist team” → Escalated to Human Agent vs. “Our finance team will process your payment automatically within 1-2 business days” → Resolved). When debugging why a conversation got the “wrong” status, read the AI Instructions on this group, the rules are explicit.
Conversation Status is not available as a Rulebook condition (the toggle is off and locked), its job is to describe what already happened, not to gate what happens next.
Custom groups
Custom groups are ones you create from scratch for your specific business. Fully editable: you set the title, description, AI Instructions, individual tags, multi-select behavior, and Rulebook availability.Three patterns cover almost all custom groups in practice. Match your use case to a pattern, and the configuration decisions follow.
Rulebook-driven (intent routing)
Observability (classification)
Guardrails (QA)
Read the user’s intent and feed the result into a Rulebook condition that branches the conversation.
Setting
Recommendation
Tag Group available in Rulebooks
ON: this is the defining choice
Tag Selection
Typically “Exactly one tag is selected”, the Rulebook condition expects a single value
AI Instructions
Must be tight, errors here cause the Rulebook to fire the wrong branch
Examples from real workspaces:
Action confirmation: Did the user confirm or deny a destructive action (cancel subscription, account closure)? Tags: user_confirmed, user_denied, not_applicable. Rulebook uses this to either execute the action or send an apology.
Background check status request: Is the user asking for a generic update or a specific check’s status? Tags: not_clear, specific_progress_update, generic_progress_update, query_not_related_to_check. Rulebook routes each to a different reply flow.
Role Confirmation: Has the agent confirmed the user’s role, and what role? Drives access-gated flows.
Rulebook-driven groups are the “control plane” tags, their job is to be read by downstream logic: not to be reported on.
For tags that capture something the agent did (confirmation, role check, action outcome), adopt the naming convention <Subject> by 'Finibot', Role Confirmation by Finibot: Action confirmation by Finibot. It signals to anyone reading a Rulebook condition that this tag describes the agent’s behavior, not a property of the customer or message.
Categorize conversations so you can filter, segment, and report on them. The tag is the destination, not an input to behavior.
Setting
Recommendation
Tag Group available in Rulebooks
OFF: you don’t need it; turning it on adds noise to the Rulebook condition picker
Tag Selection
”Multiple tags can be selected” is common, a single conversation can be about multiple topics
AI Instructions
Can be looser than routing tags, minor misclassifications hurt reporting accuracy but don’t break behavior
Common examples (fintech context):
Issue Category: what the customer is asking about: transactions, account_access, card_issues, transfers, kyc_verification, disputes. The single most common observability tag, drives the bulk of triage and reporting.
Product Area: which feature or surface the conversation touches: debit_card, savings_account, investments, lending, crypto. Lets you see conversation mix by product line rather than by issue.
Customer Lifecycle Stage: new_signup, active, dormant, churned, reactivation. Useful for understanding what support load looks like at each stage of the funnel.
Transaction Type Referenced: when a conversation references a transaction, what type: ach, wire, p2p, card_payment, refund, chargeback. Multi-select, since one conversation can reference several.
Build whatever observability groups make your conversation data queryable for your business. The pattern is the same: name the dimension, list the values it can take, write AI Instructions that pick the right value from the conversation.Observability groups are the “reporting plane”, their job is to make your conversation data queryable.
Detect when the agent does, or fails to do, something it should have. Used for compliance auditing, behavior review, and catching regressions.
Setting
Recommendation
Tag Group available in Rulebooks
Typically OFF: guardrails report on behavior after the fact and don’t usually need to gate live behavior
Tag Selection
Binary Pass/Fail is the common shape, so “Exactly one tag is selected”
AI Instructions
Specific, the model needs to identify whether the agent itself crossed the line, not whether the customer did anything wrong
Examples from real workspaces (the Guardrail | ... naming convention is a Fini convention worth adopting):
Guardrail | PII Redaction: did the agent reveal personal data it shouldn’t have?
Guardrail | Tone & Compliance: did the agent use neutral, non-accusatory language on sensitive topics?
Guardrail | Vendor / Product Claim Safety: did the agent make unsupported performance or accuracy claims?
Guardrail | Regulatory Accuracy: did the agent imply regulatory approval, compliance status, or legal outcomes?
Guardrail | Prompt-Injection Detection: did a user attempt to jailbreak the agent, and did the agent comply?
Guardrail | Knowledge Restriction Compliance: did the agent hallucinate beyond approved knowledge?
Guardrail groups are the “audit plane”, apply them to every agent and review flagged conversations in Inbox regularly.
For regulated industries, prompt-injection-detection and PII-redaction guardrails are particularly valuable: they create an auditable record of where the agent’s behavior diverged from policy. Pair these with the Test Suite so you can prove your agent’s behavior over time.
Anatomy of a group
A tag group has six configurable fields, visible on the group detail page.
Field
What it does
Group Title
Short, descriptive name (e.g. “Type of Issue”: “Guardrail | PII Redaction”). Shown on the page list, used by your team to find the group.
Group Description
Human-readable context for your team, what this group classifies and why. Not used by the model.
AI Instructions
The decision rules the model follows to pick a tag. The single most important field, accuracy comes from here.
Tag Selection
”Exactly one tag is selected” (mutually exclusive options) or “Multiple tags can be selected” (a conversation can carry multiple tags from the group).
Tag Group available in Rulebooks
Whether this group’s tags can be used as conditions in Rulebook rules. Off by default; turn on for Rulebook-driven groups.
Tags
The individual values the model can apply. Each tag has a name (machine-readable, e.g. user_confirmed) and a description (which doubles as the per-tag decision rule).
Creating a group
1
Click + New Group
Opens the create form on the page.
2
Fill in the group details
Set Group Title: Group Description: and a first pass at AI Instructions. The instructions can be refined later, focus on getting the decision logic written down, including edge cases and example phrases.
3
Set Tag Selection
“Exactly one tag” for mutually exclusive options (most cases). “Multiple tags” when a conversation can legitimately belong to more than one category.
4
Decide on Rulebook availability
Turn Tag Group available in Rulebooks on if you plan to use this group’s tags to gate Rulebook rules. Leave off for observability and guardrail groups. You can change this later.
5
Click Create Group
The group is created and you land on the group detail page. The tags section at the bottom is where you add the individual tag values.
Adding tags to a group
In the Tags section at the bottom of a group’s detail page:
Enter a tag name: short, machine-readable (e.g. resolved, user_denied, billing_dispute). This is what you’ll reference in Rulebook conditions and see in Inbox filters.
Enter a description: this doubles as the decision rule for when to apply this specific tag. Be explicit. Include example phrases the customer or agent uses that should trigger it.
Click + Add.
Repeat for every tag in the group. Use the edit and delete icons on each row to refine later.
Writing effective tag descriptions
The description on every tag doubles as the decision rule the model uses to apply it. A description that just labels the tag (“refund-related conversations”) leaves the model to guess at edges; a description that teaches the decision produces consistent tagging.The pattern that works:
What the tag means. A one-sentence definition the team would agree on.
When to apply it. The signals, phrases, customer behaviors, conversation states, that should trigger the tag.
When not to apply it. The lookalike cases the model will over-classify into this tag unless you rule them out explicitly. This is the part that separates good descriptions from drifting ones.
Example phrases. One or two real or representative messages that should and shouldn’t trigger it.
A worked example for a cancel_request tag in a Type of Issue group:
Section
Content
What it means
The customer is asking to cancel their subscription or close their account.
When to apply
The customer explicitly states intent to cancel (“I want to cancel”: “please close my account”: “how do I unsubscribe”), or asks the next step in cancelling. Apply even if the message is phrased as a question (“can you cancel my plan?”).
When not to apply
The customer is asking about the cancellation policy without stating intent (“what’s your refund policy if I cancel?”: apply cancellation_inquiry instead). The customer is venting about wanting to leave but hasn’t asked (“this product is terrible”: apply negative_sentiment, not this tag). The customer mentions cancellation as context for an unrelated issue (“after I cancelled last month, I noticed…”: apply the relevant follow-on tag, not this).
Example phrases
”I want to cancel my subscription.” / “How do I close my account?” / “Please cancel and refund me.”
A few additional principles:
Distinguish between similar tags in the same group. When two tags could plausibly fit, the description must say what makes this one the right pick. “Apply this tag, not general_complaint, when…” removes ambiguity the model can’t resolve on its own.
Avoid internal jargon. Acronyms and product shorthand your team uses won’t translate to model behavior. Write the description as if onboarding a new teammate who has the AI Instructions for context but doesn’t know your specific terminology.
Use the model’s mistakes to refine. When you find a mis-tagged conversation in the Inbox, read the AI Steps reasoning (see Debugging tags with AI Steps below) and update the description’s “when not to apply” section to handle the case the model got wrong.
The “when not to apply” section is the highest-leverage part of a tag description. Models default to over-applying tags that sound roughly right, being explicit about lookalike cases is usually what moves a tag from “mostly correct” to “reliable enough to drive Rulebook conditions.”
Assigning groups to agents
Default and Custom groups must be explicitly assigned to each agent before they become active on that agent’s conversations. Mandatory groups (Conversation Status) are always active and don’t need assignment.
1
Pick the agent
Click the agent selector dropdown in the top-right of the Tag Groups page and select the agent you want to configure.
2
Check the groups to activate
Checkboxes appear on every group card. Check the groups you want active on this agent’s conversations.
3
Click Save
The selected groups become active. From this point forward, every conversation handled by this agent will be evaluated against these groups.
Group assignment is per-agent. If you have multiple agents (e.g. Support-Billing and Support-Onboarding), each carries its own set of active groups. Switch agents in the selector to configure each independently.
Tags in Rulebooks
Tags become control-plane data the moment the Tag Group available in Rulebooks toggle is on. The tags then appear in the Rulebook Check step’s condition picker, where you can branch flow based on the value.Common patterns:
Pattern
Example
Confirmation gate
IF Action Confirmation = user_confirmed → execute the cancellation; IF user_denied → send apology, offer alternatives.
Topic routing
IF Type of Issue = billing → route to billing specialist queue.
Guardrail escalation
IF Guardrail | PII Redaction = fail → escalate to compliance team immediately.
Intent-specific reply flow
IF Background check status request = specific_progress_update → call the check-status action; IF generic_progress_update → use the generic reply template.
A concrete example. The rule below uses a Rulebook-driven tag (Account Tier) to gate whether a premium-only flow proceeds. The Check step asks: “Is the customer on the premium tier?”: and only if the tag value equals premium does the rule continue. Other tier values fall through to whatever the Fallback block defines (typically a reply explaining the feature isn’t available on their plan).
Two things this example illustrates. First, tag-driven Checks pair naturally with Fallback blocks: the Check defines the positive case (Account Tier = premium → proceed); the Fallback catches the negative (any other tier value → fall through to the alternative reply). Second, for tags that capture something the agent itself did or confirmed (rather than a property of the customer), the naming convention <Subject> by 'Finibot': Role Confirmation by ‘Finibot’: Action confirmation by ‘Finibot’: is worth adopting. It tells the reader instantly that this is an observable state of the agent’s behavior, not a customer attribute.
Tags are the most reliable input to Rulebook conditions. They’re set before the Rulebook rule runs (during the tagging phase), so the value is stable. Compare with Read step extractions, which run as part of the rule and can fail or return unexpected values. When you have a choice between branching on a tag versus extracting the same information mid-rule, choose the tag.
Mandatory tag groups (Conversation Status) are not available as Rulebook conditions. Their job is to describe the conversation’s final state, not to gate routing decisions. Only Default groups with the toggle enabled (e.g. Escalation Reason) and Custom groups with the toggle on appear in the condition picker.
Troubleshooting
Debugging tags with AI Steps
For supported decision-model runs, Input Tag Selection and Output Tag Selection show candidate tags with percentage bars and a check mark on the chosen tag. Expand more to inspect candidates beyond the first five. If the run has no compatible probability data, the selected tags still appear as chips. Use the final chosen tags when diagnosing routing; a model score is not a measured resolution rate. See Decision probabilities in AI Steps.Every conversation in the Inbox carries the model’s full tagging reasoning. Open any conversation and click the AI Steps panel, under Output Tag Selection you’ll see the reasoning the model used to choose every tag from every active group, plus the Chosen Tags list with the exact value picked from each.
This is the primary debugging surface for tags. When a tag fires unexpectedly, the reasoning text tells you exactly why: what signal the model latched onto, what it weighed against, and how the AI Instructions led to the chosen value. Use it as a feedback loop:
1
Find a conversation where the tag was wrong
Filter the Inbox to the suspect tag value, or open a specific conversation you know was mis-tagged.
2
Read the AI Steps reasoning for that group
The reasoning paragraph reveals what the model was thinking. Look for misinterpreted signals, “the conversation was already escalated by the assistant” might explain why a downstream tag fired the way it did.
3
Update the AI Instructions to handle that case
Add an explicit rule covering the missed edge case. If the model thought the customer’s frustration about the product was frustration with the agent: your Sentiment instructions need to disambiguate the two explicitly.
4
Save and verify on the next conversation
Changes take effect for new conversations. Run the same kind of message through and confirm the AI Steps reasoning now produces the right value.
The reasoning text isn’t visible to customers, it’s an internal trace meant for you. When a stakeholder asks “why did the bot tag this as escalated?”: the AI Steps panel is the answer. Treat it the way you’d treat logs in a system you operate.
Why a tag isn’t being applied correctly
The group isn't assigned to this agent
Default and Custom groups must be explicitly activated per-agent. Open the Tag Groups page, select the agent, and confirm the group’s checkbox is on. Mandatory groups (Conversation Status) are exempt.
The AI Instructions are too vague
“Apply this when the customer is unhappy” gives the model nothing to anchor on. Rewrite with specific phrases, example messages, and explicit edge-case handling. Use the model’s mistakes as your guide, read the conversations where it got the tag wrong and update the instructions to cover those cases.
Tag descriptions are missing or generic
The model uses each tag’s description as its per-tag decision rule. Empty or one-word descriptions force the model to guess. Write every tag’s description as a specific rule (“apply this if X happens AND Y is true”).
Tag Selection mode doesn't match the use case
“Exactly one tag” forces a single choice, if a conversation legitimately falls into two categories, the model has to pick one and may not pick consistently. Switch to “Multiple tags can be selected” if your tags aren’t mutually exclusive.
The Rulebook toggle is off but you expected a tag in the condition picker
Tags only appear as Rulebook conditions when the group’s Tag Group available in Rulebooks toggle is on. Mandatory groups (Conversation Status) can never appear in the picker, that’s by design.
You're inferring from totals, not from the conversation
Tags are applied per message exchange and recorded per-conversation. Don’t infer behavior from analytics totals or filter counts, open the specific conversation in the Inbox and read the AI Steps panel (see Debugging tags with AI Steps) to see exactly which tags fired and why.
Related
Rulebook
Use tag values as Check step conditions to route, branch, and escalate conversations.
Reply Behavior
Use tags to suppress replies entirely, for example, skipping conversations classified as spam.
Inbox
Filter and review conversations by tag. Conversation Status drives the status badge on every row.
Analytics
Chart tag distribution over time. Track topic mix, escalation reasons, sentiment trends, and guardrail violations.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/schema.json","name":"Fini","description":"Documentation for Fini AI (usefini.com): build, deploy and run autonomous AI support agents. Fini is made by Fini Technologies Inc. and is not affiliated with fini.ai.","colors":{"primary":"#C3EE5E","light":"#C3EE5E","dark":"#A8D43E"},"logo":{"light":"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-light.png?fit=max\u0026auto=format\u0026n=fep-JMymNphpe1DQ\u0026q=85\u0026s=a460ff8bb507876712db2f0fb12c21e4","dark":"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-dark.png?fit=max\u0026auto=format\u0026n=fep-JMymNphpe1DQ\u0026q=85\u0026s=8a2bf1d8a0e5c590ebb976eadccf26a9"},"favicon":"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-dark.png?fit=max\u0026auto=format\u0026n=fep-JMymNphpe1DQ\u0026q=85\u0026s=8a2bf1d8a0e5c590ebb976eadccf26a9","footer":{"socials":{"x":"https://x.com/finichatAI","linkedin":"https://www.linkedin.com/company/usefini","youtube":"https://www.youtube.com/@finiai","instagram":"https://www.instagram.com/usefini.official","github":"https://github.com/ask-fini"}},"seo":{"metatags":{"msvalidate.01":"9A9FD7AB87AE2DEA257FE41F07C61E70"}},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","default":true,"href":"en/introduction"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"fini","hasAudioNarration":false,"actualSubdomain":"fini","customDomains":["docs.usefini.com"],"gitSource":{"type":"github","owner":"ask-fini","repo":"fini-docs","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af6e134e0d07833655260d7","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"en","tag":"API reference","count":207},{"language":"en","tag":"Documentation","count":56},{"language":"en","tag":"Knowledge","count":40},{"language":"en","tag":"Test Suite","count":31},{"language":"en","tag":"Use cases","count":29},{"language":"en","tag":"Deploy","count":21},{"language":"en","tag":"Intent Rules","count":18},{"language":"en","tag":"Conversations","count":14},{"language":"en","tag":"Integrations","count":14},{"language":"en","tag":"Agent Configuration","count":13}]},"assistantConfig":{"deflection":{"enabled":true,"email":"[email protected]","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/configuration/tags","slug":"/en/configuration/tags","pageMetadata":{"title":"Tags","description":"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.","icon":"tag","href":"/en/configuration/tags"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Frame,Heading,Mermaid,Note,OptimizedImage,Step,Steps,Tab,Table,Tabs,Tip}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Tags are labels Fini applies to every conversation automatically, in real time. They’re how the system understands what each conversation is `,_jsx(_components.em,{children:`about`}),`: what `,_jsx(_components.em,{children:`state`}),` it’s in, and whether the agent behaved correctly, and they’re how you turn that understanding into routing logic, analytics, and quality control.`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/overview.png?fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=cd06f788fd357390c6a4e8cc408c75c9`,alt:`Tag Groups page showing a list of group cards. Each card has a tag icon, a group name, optional badges (Rulebook, Default, Mandatory), and a description. The top-right shows an agent selector set to All, and a New Group button.`,\"data-og-width\":`1680`,width:`1680`,\"data-og-height\":`1050`,height:`1050`,\"data-path\":`images/en/configuration/tags/overview.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/overview.png?w=280\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=cdfd31a7dfc37aaeb4a08780984a0b6c 280w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/overview.png?w=560\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=7356abac8a2b5973006efc92dd42438f 560w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/overview.png?w=840\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=6999f105836abd6f27c7b8600c5238b3 840w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/overview.png?w=1100\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=e431a153e07c3d404aa4e36ab3397e5a 1100w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/overview.png?w=1650\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=750814c0ede50bae839acd9471e34e81 1650w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/overview.png?w=2500\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=799673ea9f506e6ea65fa434912ba92d 2500w`})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`The page header reads `,_jsx(_components.strong,{children:`Tag Groups`}),` because tags don’t exist on their own, every tag belongs to a `,_jsx(_components.strong,{children:`group`}),`: and each group represents one classification dimension. A group like `,_jsx(_components.em,{children:`Sentiment`}),` contains the tags `,_jsx(_components.em,{children:`Positive`}),`: `,_jsx(_components.em,{children:`Neutral`}),`: `,_jsx(_components.em,{children:`Negative`}),`; a group like `,_jsx(_components.em,{children:`Type of Issue`}),` contains the tags for whatever issue categories you want tracked. Fini evaluates one decision per group, per conversation.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-tags-are-for`,children:`What tags are for`}),`\n`,_jsx(_components.p,{children:`Tags do three jobs at once. Understanding which job a tag is doing tells you how to configure it.`}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n MSG[\"Customer\u003cbr/>message\"] --> EVAL[\"Fini evaluates\u003cbr/>every active\u003cbr/>tag group\"]\n EVAL --> TAGS[\"Tags applied\u003cbr/>to conversation\"]\n TAGS --> OBS[\"Observability\u003cbr/>(Inbox filters,\u003cbr/>Analytics)\"]\n TAGS --> RULES[\"Routing\u003cbr/>(Rulebook\u003cbr/>conditions)\"]\n TAGS --> REPLY[\"Reply behavior\u003cbr/>(skip, suppress,\u003cbr/>route)\"]`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Job`}),_jsx(_components.th,{children:`What it looks like`}),_jsx(_components.th,{children:`Example`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Observability`})}),_jsx(_components.td,{children:`Tag fires; you filter and report on it. Doesn’t change agent behavior.`}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Type of Issue = billing`}),`: used to find all billing conversations in the Inbox or chart the issue mix in Analytics.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Routing`})}),_jsxs(_components.td,{children:[`Tag is consumed by a Rulebook condition that branches the conversation. Requires the `,_jsx(_components.strong,{children:`Tag Group available in Rulebooks`}),` toggle.`]}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Action Confirmation = user_confirmed`}),` → Rulebook proceeds with the cancellation; `,_jsx(_components.em,{children:`user_denied`}),` → Rulebook sends apology and offers alternatives.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Reply behavior`})}),_jsxs(_components.td,{children:[`Tag suppresses or modifies the reply itself via `,_jsx(_components.a,{href:`/en/automations/reply-behavior`,children:`Reply Behavior`}),`.`]}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`Sentiment = spam-like`}),` → skip reply entirely rather than engage.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`A single tag can only do one job at a time, but a single `,_jsx(_components.em,{children:`group`}),` can drive different jobs depending on how its toggle is set and which downstream systems read it.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-tags-get-applied`,children:`How tags get applied`}),`\n`,_jsxs(_components.p,{children:[`After each message exchange, Fini evaluates every active tag group against the conversation. For each group, it reads the group’s `,_jsx(_components.strong,{children:`AI Instructions`}),` (the decision rules you’ve written) and picks the tag, or tags, that match.`]}),`\n`,_jsx(_components.p,{children:`This happens automatically. You don’t trigger it, customers don’t see it, and tags accumulate on the conversation as it progresses. They’re visible on every conversation in the Inbox and queryable via filters and Analytics.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The quality of your AI Instructions directly determines the accuracy of your tags.`}),` Vague instructions produce inconsistent tagging. A specific instruction, `,_jsxs(_components.em,{children:[`“apply `,_jsx(_components.code,{children:`escalated`}),` if the agent used the FALLBACK HATCH phrase or said ‘let me connect you with our team’; apply `,_jsx(_components.code,{children:`resolved`}),` if no follow-up is pending”`]}),`: produces reliable, actionable tags.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Write AI Instructions as if you’re briefing a teammate on how to label transcripts manually. The model follows your wording closely, so be explicit about edge cases (`,_jsxs(_components.em,{children:[`“if the customer asks a clarifying question after the agent’s answer, still apply `,_jsx(_components.code,{children:`resolved`}),`”`]}),`) and provide example phrases the agent says or the customer says that should trigger each tag.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`types-of-tag-groups`,children:`Types of tag groups`}),`\n`,_jsx(_components.p,{children:`Two orthogonal dimensions classify every group:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Dimension`}),_jsx(_components.th,{children:`Values`}),_jsx(_components.th,{children:`What it controls`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Origin`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Default`}),` (Fini ships it) vs. `,_jsx(_components.strong,{children:`Custom`}),` (you create it)`]}),_jsx(_components.td,{children:`Whether the group is editable. Default groups are read-only; Custom groups are fully editable.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Behavior`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Mandatory`}),` (always-on, no opt-out) vs. `,_jsx(_components.strong,{children:`Optional`}),` (you assign to specific agents)`]}),_jsx(_components.td,{children:`Whether you can disable the group or scope it per-agent.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`The cards on the Tag Groups page surface these as badges. A group with no badges is a fully editable Custom group. A group with `,_jsx(_components.code,{children:`Default`}),` is Fini-shipped but optional. A group with both `,_jsx(_components.code,{children:`Default`}),` and `,_jsx(_components.code,{children:`Mandatory`}),` (currently just one: Conversation Status) is Fini-shipped and always on. The `,_jsx(_components.code,{children:`Rulebook`}),` badge is independent of all of this, it indicates the group’s tags are usable as Rulebook conditions.`]}),`\n`,_jsx(Heading,{level:`3`,id:`default-groups`,children:`Default groups`}),`\n`,_jsx(_components.p,{children:`Default groups are pre-built by Fini and available to all accounts. They cover the classifications most teams need out of the box.`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/default-group.png?fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=22c5df904df2f62786112aafdf4f321c`,alt:`Tag Groups list highlighting Default-badged groups including Knowledge Gap, Escalation Reason, Type of Issue, and Sentiment, alongside the Mandatory Conversation Status group.`,\"data-og-width\":`1680`,width:`1680`,\"data-og-height\":`1050`,height:`1050`,\"data-path\":`images/en/configuration/tags/default-group.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/default-group.png?w=280\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=194e08eec85199d01fa9116aad5089cc 280w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/default-group.png?w=560\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=5061e996c75e381b8bb43c9965e93d2e 560w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/default-group.png?w=840\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=eca7454fb74928102f064e3fa5d7a1ed 840w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/default-group.png?w=1100\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=2b60b2612ef2a8c23f4d1db51f494a88 1100w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/default-group.png?w=1650\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=c2425386116354f3f0b3d2ebe0053a91 1650w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/default-group.png?w=2500\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=dc6ecac1690e7137d04166c796eec67c 2500w`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Group`}),_jsx(_components.th,{children:`What it captures`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Conversation Status`})}),_jsxs(_components.td,{children:[`The state of the conversation, Resolved, Escalated to Human Agent, Waiting for Customer. The system tag that drives the Inbox status badge, Reply Behavior decisions, and resolution analytics. See `,_jsx(_components.a,{href:`#conversation-status`,children:`Conversation Status`}),` below.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Sentiment`})}),_jsx(_components.td,{children:`The customer’s reaction to the agent’s most recent reply, Positive, Neutral, Negative. Useful for satisfaction tracking and identifying conversations where the agent is failing the customer.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Escalation Reason`})}),_jsxs(_components.td,{children:[`When the agent escalates, `,_jsx(_components.em,{children:`why`}),`. Eleven tags split across Knowledge gaps, Action failures, User-driven requests, and Policy triggers. The diagnostic backbone for “what is my agent struggling with?”`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Type of Issue`})}),_jsx(_components.td,{children:`The category of issue the customer is asking about. Used for triage and prioritization.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Knowledge Gap`})}),_jsx(_components.td,{children:`Whether knowledge was missing from the knowledge search results, surfaces gaps in your knowledge base.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Default groups aren’t editable in their core configuration, title, description, AI Instructions, tag list, Tag Selection mode, and Rulebook availability are all locked. The group detail page shows a `,_jsx(_components.em,{children:`“This is a default tag group and cannot be edited”`}),` note in place of the Edit Overview button. `,_jsx(_components.strong,{children:`What you can control is which agents each Default group is active on`}),`: see `,_jsx(_components.a,{href:`#assigning-groups-to-agents`,children:`Assigning groups to agents`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`mandatory-groups-conversation-status`,children:`Mandatory groups, Conversation Status`}),`\n`,_jsxs(_components.p,{children:[`There is exactly one Mandatory group, and it’s load-bearing: `,_jsx(_components.strong,{children:`Conversation Status`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Conversation Status is the tag the rest of Fini depends on to understand what state a conversation is in.`}),` The Inbox status badge, Reply Behavior rules, “Fini Touched” filters, and resolution analytics all read from this tag. That’s why it’s both Mandatory (always on, every agent) and Default (Fini-controlled, can’t be edited).`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/conversation-status.png?fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=dd65c2525b1a87412ce4c83195b0390c`,alt:`Conversation Status group detail page showing the Mandatory and Default badges, the AI Instructions field with the four-step decision rule, Tag Selection 'Exactly one tag is selected', and the three tags Resolved, Escalated to Human Agent, Waiting for Customer.`,\"data-og-width\":`1680`,width:`1680`,\"data-og-height\":`1050`,height:`1050`,\"data-path\":`images/en/configuration/tags/conversation-status.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/conversation-status.png?w=280\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=35d503da10fecb1a2ca4c6304d607e1e 280w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/conversation-status.png?w=560\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=4c7d08271abf13e65e3876209285ff81 560w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/conversation-status.png?w=840\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=803e52c741823bd92b023e15c271ada6 840w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/conversation-status.png?w=1100\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=60d44d1c943548f0e45200d1a839a2cb 1100w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/conversation-status.png?w=1650\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=92e893b35d3f1a98f212c35db78f6716 1650w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/conversation-status.png?w=2500\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=ebd85b90381120fc4978f1aabaacddf8 2500w`})}),`\n`,_jsx(_components.p,{children:`It has three tags, applied via an explicit four-step decision rule the model follows in order:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tag`}),_jsx(_components.th,{children:`When it applies`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Escalated to Human Agent`})}),_jsxs(_components.td,{children:[`Either: the agent has explicitly handed off (used the FALLBACK HATCH, said “let me connect you with our team,” or otherwise confirmed a human will take over); `,_jsx(_components.em,{children:`or`}),` the agent says a request was forwarded, passed on, or handed off to an internal team `,_jsx(_components.strong,{children:`and`}),` indicates the team will follow up with the customer directly.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Waiting for Customer`})}),_jsx(_components.td,{children:`The agent asked for specific required info or action necessary to proceed, and the conversation can’t move forward without it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Resolved`})}),_jsx(_components.td,{children:`None of the above. The agent gave a complete answer (or a complete acknowledgment of background work) and no follow-up is pending.`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Because Conversation Status drives downstream systems, its instructions are written defensively, they encode specific phrases the agent uses (e.g. `,_jsx(_components.em,{children:`“I have forwarded your request to our specialist team”`}),` → Escalated to Human Agent vs. `,_jsx(_components.em,{children:`“Our finance team will process your payment automatically within 1-2 business days”`}),` → Resolved). When debugging why a conversation got the “wrong” status, read the AI Instructions on this group, the rules are explicit.`]})}),`\n`,_jsxs(_components.p,{children:[`Conversation Status is `,_jsx(_components.strong,{children:`not`}),` available as a Rulebook condition (the toggle is off and locked), its job is to describe what already happened, not to gate what happens next.`]}),`\n`,_jsx(Heading,{level:`3`,id:`custom-groups`,children:`Custom groups`}),`\n`,_jsx(_components.p,{children:`Custom groups are ones you create from scratch for your specific business. Fully editable: you set the title, description, AI Instructions, individual tags, multi-select behavior, and Rulebook availability.`}),`\n`,_jsx(_components.p,{children:`Three patterns cover almost all custom groups in practice. Match your use case to a pattern, and the configuration decisions follow.`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Rulebook-driven (intent routing)`,id:`rulebook-driven-intent-routing`,children:[_jsx(_components.p,{children:`Read the user’s intent and feed the result into a Rulebook condition that branches the conversation.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Recommendation`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tag Group available in Rulebooks`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`ON`}),`: this is the defining choice`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tag Selection`}),_jsx(_components.td,{children:`Typically “Exactly one tag is selected”, the Rulebook condition expects a single value`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AI Instructions`}),_jsx(_components.td,{children:`Must be tight, errors here cause the Rulebook to fire the wrong branch`})]})]})]}),_jsx(_components.p,{children:`Examples from real workspaces:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Action confirmation`}),`: Did the user confirm or deny a destructive action (cancel subscription, account closure)? Tags: `,_jsx(_components.code,{children:`user_confirmed`}),`, `,_jsx(_components.code,{children:`user_denied`}),`, `,_jsx(_components.code,{children:`not_applicable`}),`. Rulebook uses this to either execute the action or send an apology.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Background check status request`}),`: Is the user asking for a generic update or a specific check’s status? Tags: `,_jsx(_components.code,{children:`not_clear`}),`, `,_jsx(_components.code,{children:`specific_progress_update`}),`, `,_jsx(_components.code,{children:`generic_progress_update`}),`, `,_jsx(_components.code,{children:`query_not_related_to_check`}),`. Rulebook routes each to a different reply flow.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Role Confirmation`}),`: Has the agent confirmed the user’s role, and what role? Drives access-gated flows.`]}),`\n`]}),_jsxs(_components.p,{children:[`Rulebook-driven groups are the “control plane” tags, their job is to be `,_jsx(_components.strong,{children:`read by downstream logic`}),`: not to be reported on.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`For tags that capture something the agent did (confirmation, role check, action outcome), adopt the naming convention `,_jsx(_components.code,{children:`\u003cSubject> by 'Finibot'`}),`, `,_jsx(_components.em,{children:`Role Confirmation by Finibot`}),`: `,_jsx(_components.em,{children:`Action confirmation by Finibot`}),`. It signals to anyone reading a Rulebook condition that this tag describes the agent’s behavior, not a property of the customer or message.`]})})]}),_jsxs(Tab,{title:`Observability (classification)`,id:`observability-classification`,children:[_jsx(_components.p,{children:`Categorize conversations so you can filter, segment, and report on them. The tag is the destination, not an input to behavior.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Recommendation`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tag Group available in Rulebooks`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`OFF`}),`: you don’t need it; turning it on adds noise to the Rulebook condition picker`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tag Selection`}),_jsx(_components.td,{children:`”Multiple tags can be selected” is common, a single conversation can be about multiple topics`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AI Instructions`}),_jsx(_components.td,{children:`Can be looser than routing tags, minor misclassifications hurt reporting accuracy but don’t break behavior`})]})]})]}),_jsx(_components.p,{children:`Common examples (fintech context):`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Issue Category`}),`: what the customer is asking about: `,_jsx(_components.code,{children:`transactions`}),`, `,_jsx(_components.code,{children:`account_access`}),`, `,_jsx(_components.code,{children:`card_issues`}),`, `,_jsx(_components.code,{children:`transfers`}),`, `,_jsx(_components.code,{children:`kyc_verification`}),`, `,_jsx(_components.code,{children:`disputes`}),`. The single most common observability tag, drives the bulk of triage and reporting.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Product Area`}),`: which feature or surface the conversation touches: `,_jsx(_components.code,{children:`debit_card`}),`, `,_jsx(_components.code,{children:`savings_account`}),`, `,_jsx(_components.code,{children:`investments`}),`, `,_jsx(_components.code,{children:`lending`}),`, `,_jsx(_components.code,{children:`crypto`}),`. Lets you see conversation mix by product line rather than by issue.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Customer Lifecycle Stage`}),`: `,_jsx(_components.code,{children:`new_signup`}),`, `,_jsx(_components.code,{children:`active`}),`, `,_jsx(_components.code,{children:`dormant`}),`, `,_jsx(_components.code,{children:`churned`}),`, `,_jsx(_components.code,{children:`reactivation`}),`. Useful for understanding what support load looks like at each stage of the funnel.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Transaction Type Referenced`}),`: when a conversation references a transaction, what type: `,_jsx(_components.code,{children:`ach`}),`, `,_jsx(_components.code,{children:`wire`}),`, `,_jsx(_components.code,{children:`p2p`}),`, `,_jsx(_components.code,{children:`card_payment`}),`, `,_jsx(_components.code,{children:`refund`}),`, `,_jsx(_components.code,{children:`chargeback`}),`. Multi-select, since one conversation can reference several.`]}),`\n`]}),_jsxs(_components.p,{children:[`Build whatever observability groups make your conversation data queryable for `,_jsx(_components.em,{children:`your`}),` business. The pattern is the same: name the dimension, list the values it can take, write AI Instructions that pick the right value from the conversation.`]}),_jsx(_components.p,{children:`Observability groups are the “reporting plane”, their job is to make your conversation data queryable.`})]}),_jsxs(Tab,{title:`Guardrails (QA)`,id:`guardrails-qa`,children:[_jsx(_components.p,{children:`Detect when the agent does, or fails to do, something it should have. Used for compliance auditing, behavior review, and catching regressions.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Recommendation`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tag Group available in Rulebooks`}),_jsxs(_components.td,{children:[`Typically `,_jsx(_components.strong,{children:`OFF`}),`: guardrails report on behavior after the fact and don’t usually need to gate live behavior`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tag Selection`}),_jsx(_components.td,{children:`Binary Pass/Fail is the common shape, so “Exactly one tag is selected”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AI Instructions`}),_jsx(_components.td,{children:`Specific, the model needs to identify whether the agent itself crossed the line, not whether the customer did anything wrong`})]})]})]}),_jsxs(_components.p,{children:[`Examples from real workspaces (the `,_jsx(_components.code,{children:`Guardrail | ...`}),` naming convention is a Fini convention worth adopting):`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Guardrail | PII Redaction`}),`: did the agent reveal personal data it shouldn’t have?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Guardrail | Tone \u0026 Compliance`}),`: did the agent use neutral, non-accusatory language on sensitive topics?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Guardrail | Vendor / Product Claim Safety`}),`: did the agent make unsupported performance or accuracy claims?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Guardrail | Regulatory Accuracy`}),`: did the agent imply regulatory approval, compliance status, or legal outcomes?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Guardrail | Prompt-Injection Detection`}),`: did a user attempt to jailbreak the agent, and did the agent comply?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Guardrail | Knowledge Restriction Compliance`}),`: did the agent hallucinate beyond approved knowledge?`]}),`\n`]}),_jsx(_components.p,{children:`Guardrail groups are the “audit plane”, apply them to every agent and review flagged conversations in Inbox regularly.`}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`For regulated industries, prompt-injection-detection and PII-redaction guardrails are particularly valuable: they create an auditable record of where the agent’s behavior diverged from policy. Pair these with the `,_jsx(_components.a,{href:`/en/testing/test-suite`,children:`Test Suite`}),` so you can prove your agent’s behavior over time.`]})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`anatomy-of-a-group`,children:`Anatomy of a group`}),`\n`,_jsx(_components.p,{children:`A tag group has six configurable fields, visible on the group detail page.`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/new-group-form.png?fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=92bf937388d89c3384aca5efd673d223`,alt:`Tag group detail page showing the Group Title, Group Description, AI Instructions, Tag Selection, and Tag Group available in Rulebooks fields, plus the Tags section below with the per-tag editor.`,\"data-og-width\":`1680`,width:`1680`,\"data-og-height\":`1050`,height:`1050`,\"data-path\":`images/en/configuration/tags/new-group-form.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/new-group-form.png?w=280\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=6d70e03c5da1566ba9cc0941dc90c4c8 280w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/new-group-form.png?w=560\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=7f3b452d8ec34ef6eadbb741d55fbcc9 560w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/new-group-form.png?w=840\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=ae4f3e1f2c9152ec867062095ebbf980 840w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/new-group-form.png?w=1100\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=3d94babeb51e8d91c07e79694bf424e9 1100w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/new-group-form.png?w=1650\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=8b4e7f0972c4af2ed6d3bcd6543a64f1 1650w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/new-group-form.png?w=2500\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=822d35b7a225197e74f0c57fd34b4652 2500w`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Group Title`})}),_jsxs(_components.td,{children:[`Short, descriptive name (e.g. `,_jsx(_components.em,{children:`“Type of Issue”`}),`: `,_jsx(_components.em,{children:`“Guardrail | PII Redaction”`}),`). Shown on the page list, used by your team to find the group.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Group Description`})}),_jsx(_components.td,{children:`Human-readable context for your team, what this group classifies and why. Not used by the model.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`AI Instructions`})}),_jsx(_components.td,{children:`The decision rules the model follows to pick a tag. The single most important field, accuracy comes from here.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Tag Selection`})}),_jsx(_components.td,{children:`”Exactly one tag is selected” (mutually exclusive options) or “Multiple tags can be selected” (a conversation can carry multiple tags from the group).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Tag Group available in Rulebooks`})}),_jsx(_components.td,{children:`Whether this group’s tags can be used as conditions in Rulebook rules. Off by default; turn on for Rulebook-driven groups.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Tags`})}),_jsxs(_components.td,{children:[`The individual values the model can apply. Each tag has a name (machine-readable, e.g. `,_jsx(_components.code,{children:`user_confirmed`}),`) and a description (which doubles as the per-tag decision rule).`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`creating-a-group`,children:`Creating a group`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Click + New Group`,children:_jsx(_components.p,{children:`Opens the create form on the page.`})}),_jsx(Step,{title:`Fill in the group details`,children:_jsxs(_components.p,{children:[`Set `,_jsx(_components.strong,{children:`Group Title`}),`: `,_jsx(_components.strong,{children:`Group Description`}),`: and a first pass at `,_jsx(_components.strong,{children:`AI Instructions`}),`. The instructions can be refined later, focus on getting the decision logic written down, including edge cases and example phrases.`]})}),_jsx(Step,{title:`Set Tag Selection`,children:_jsx(_components.p,{children:`“Exactly one tag” for mutually exclusive options (most cases). “Multiple tags” when a conversation can legitimately belong to more than one category.`})}),_jsx(Step,{title:`Decide on Rulebook availability`,children:_jsxs(_components.p,{children:[`Turn `,_jsx(_components.strong,{children:`Tag Group available in Rulebooks`}),` on if you plan to use this group’s tags to gate Rulebook rules. Leave off for observability and guardrail groups. You can change this later.`]})}),_jsx(Step,{title:`Click Create Group`,children:_jsx(_components.p,{children:`The group is created and you land on the group detail page. The tags section at the bottom is where you add the individual tag values.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`adding-tags-to-a-group`,children:`Adding tags to a group`}),`\n`,_jsxs(_components.p,{children:[`In the `,_jsx(_components.strong,{children:`Tags`}),` section at the bottom of a group’s detail page:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Enter a `,_jsx(_components.strong,{children:`tag name`}),`: short, machine-readable (e.g. `,_jsx(_components.code,{children:`resolved`}),`, `,_jsx(_components.code,{children:`user_denied`}),`, `,_jsx(_components.code,{children:`billing_dispute`}),`). This is what you’ll reference in Rulebook conditions and see in Inbox filters.`]}),`\n`,_jsxs(_components.li,{children:[`Enter a `,_jsx(_components.strong,{children:`description`}),`: this doubles as the decision rule for `,_jsx(_components.em,{children:`when`}),` to apply this specific tag. Be explicit. Include example phrases the customer or agent uses that should trigger it.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`+ Add`}),`.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Repeat for every tag in the group. Use the edit and delete icons on each row to refine later.`}),`\n`,_jsx(Heading,{level:`2`,id:`writing-effective-tag-descriptions`,children:`Writing effective tag descriptions`}),`\n`,_jsxs(_components.p,{children:[`The description on every tag doubles as the decision rule the model uses to apply it. A description that just labels the tag (`,_jsx(_components.em,{children:`“refund-related conversations”`}),`) leaves the model to guess at edges; a description that `,_jsx(_components.em,{children:`teaches`}),` the decision produces consistent tagging.`]}),`\n`,_jsx(_components.p,{children:`The pattern that works:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`What the tag means.`}),` A one-sentence definition the team would agree on.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`When to apply it.`}),` The signals, phrases, customer behaviors, conversation states, that should trigger the tag.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`When `,_jsx(_components.em,{children:`not`}),` to apply it.`]}),` The lookalike cases the model will over-classify into this tag unless you rule them out explicitly. This is the part that separates good descriptions from drifting ones.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Example phrases.`}),` One or two real or representative messages that should and shouldn’t trigger it.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A worked example for a `,_jsx(_components.code,{children:`cancel_request`}),` tag in a Type of Issue group:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Section`}),_jsx(_components.th,{children:`Content`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`What it means`})}),_jsx(_components.td,{children:`The customer is asking to cancel their subscription or close their account.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`When to apply`})}),_jsxs(_components.td,{children:[`The customer explicitly states intent to cancel (`,_jsx(_components.em,{children:`“I want to cancel”`}),`: `,_jsx(_components.em,{children:`“please close my account”`}),`: `,_jsx(_components.em,{children:`“how do I unsubscribe”`}),`), or asks the next step in cancelling. Apply even if the message is phrased as a question (`,_jsx(_components.em,{children:`“can you cancel my plan?”`}),`).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsxs(_components.strong,{children:[`When `,_jsx(_components.em,{children:`not`}),` to apply`]})}),_jsxs(_components.td,{children:[`The customer is asking about the cancellation `,_jsx(_components.em,{children:`policy`}),` without stating intent (`,_jsx(_components.em,{children:`“what’s your refund policy if I cancel?”`}),`: apply `,_jsx(_components.code,{children:`cancellation_inquiry`}),` instead). The customer is venting about wanting to leave but hasn’t asked (`,_jsx(_components.em,{children:`“this product is terrible”`}),`: apply `,_jsx(_components.code,{children:`negative_sentiment`}),`, not this tag). The customer mentions cancellation as context for an unrelated issue (`,_jsx(_components.em,{children:`“after I cancelled last month, I noticed…”`}),`: apply the relevant follow-on tag, not this).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Example phrases`})}),_jsxs(_components.td,{children:[_jsx(_components.em,{children:`”I want to cancel my subscription.”`}),` / `,_jsx(_components.em,{children:`“How do I close my account?”`}),` / `,_jsx(_components.em,{children:`“Please cancel and refund me.”`})]})]})]})]}),`\n`,_jsx(_components.p,{children:`A few additional principles:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Distinguish between similar tags in the same group.`}),` When two tags could plausibly fit, the description must say what makes `,_jsx(_components.em,{children:`this`}),` one the right pick. `,_jsxs(_components.em,{children:[`“Apply this tag, not `,_jsx(_components.code,{children:`general_complaint`}),`, when…”`]}),` removes ambiguity the model can’t resolve on its own.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Avoid internal jargon.`}),` Acronyms and product shorthand your team uses won’t translate to model behavior. Write the description as if onboarding a new teammate who has the AI Instructions for context but doesn’t know your specific terminology.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use the model’s mistakes to refine.`}),` When you find a mis-tagged conversation in the Inbox, read the AI Steps reasoning (see `,_jsx(_components.a,{href:`#debugging-tags-with-ai-steps`,children:`Debugging tags with AI Steps`}),` below) and update the description’s “when not to apply” section to handle the case the model got wrong.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`The “when not to apply” section is the highest-leverage part of a tag description. Models default to over-applying tags that sound roughly right, being explicit about lookalike cases is usually what moves a tag from “mostly correct” to “reliable enough to drive Rulebook conditions.”`})}),`\n`,_jsx(Heading,{level:`2`,id:`assigning-groups-to-agents`,children:`Assigning groups to agents`}),`\n`,_jsx(_components.p,{children:`Default and Custom groups must be explicitly assigned to each agent before they become active on that agent’s conversations. Mandatory groups (Conversation Status) are always active and don’t need assignment.`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/agent-assignment.png?fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=2a5eb3f35551bfa6c407ebf797eb4543`,alt:`Tag Groups page in assignment mode with an agent selected from the top-right dropdown, showing checkboxes on each tag group card.`,\"data-og-width\":`1680`,width:`1680`,\"data-og-height\":`1050`,height:`1050`,\"data-path\":`images/en/configuration/tags/agent-assignment.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/agent-assignment.png?w=280\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=5e47e5d2db40c34407e0a6d4db43f05a 280w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/agent-assignment.png?w=560\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=1fc79cb61b6d4747b7bf6e6b2d9aa5c7 560w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/agent-assignment.png?w=840\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=076e9c8bda3c64a7f9b6ae306164f94b 840w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/agent-assignment.png?w=1100\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=7f1924b324e513737518339a95d2ef96 1100w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/agent-assignment.png?w=1650\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=84995448925b6182bc0ab8e7bb3c1589 1650w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/agent-assignment.png?w=2500\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=73fd40e0f8da2b5f441fdbce2114af41 2500w`})}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Pick the agent`,children:_jsx(_components.p,{children:`Click the agent selector dropdown in the top-right of the Tag Groups page and select the agent you want to configure.`})}),_jsx(Step,{title:`Check the groups to activate`,children:_jsx(_components.p,{children:`Checkboxes appear on every group card. Check the groups you want active on this agent’s conversations.`})}),_jsx(Step,{title:`Click Save`,children:_jsx(_components.p,{children:`The selected groups become active. From this point forward, every conversation handled by this agent will be evaluated against these groups.`})})]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Group assignment is per-agent. If you have multiple agents (e.g. Support-Billing and Support-Onboarding), each carries its own set of active groups. Switch agents in the selector to configure each independently.`})}),`\n`,_jsx(Heading,{level:`2`,id:`tags-in-rulebooks`,children:`Tags in Rulebooks`}),`\n`,_jsxs(_components.p,{children:[`Tags become control-plane data the moment the `,_jsx(_components.strong,{children:`Tag Group available in Rulebooks`}),` toggle is on. The tags then appear in the Rulebook Check step’s condition picker, where you can branch flow based on the value.`]}),`\n`,_jsx(_components.p,{children:`Common patterns:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Pattern`}),_jsx(_components.th,{children:`Example`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Confirmation gate`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`IF Action Confirmation = user_confirmed`}),` → execute the cancellation; `,_jsx(_components.code,{children:`IF user_denied`}),` → send apology, offer alternatives.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Topic routing`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`IF Type of Issue = billing`}),` → route to billing specialist queue.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Guardrail escalation`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`IF Guardrail | PII Redaction = fail`}),` → escalate to compliance team immediately.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Intent-specific reply flow`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`IF Background check status request = specific_progress_update`}),` → call the check-status action; `,_jsx(_components.code,{children:`IF generic_progress_update`}),` → use the generic reply template.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`A concrete example. The rule below uses a Rulebook-driven tag (`,_jsx(_components.em,{children:`Account Tier`}),`) to gate whether a premium-only flow proceeds. The Check step asks: `,_jsx(_components.em,{children:`“Is the customer on the premium tier?”`}),`: and only if the tag value equals `,_jsx(_components.code,{children:`premium`}),` does the rule continue. Other tier values fall through to whatever the Fallback block defines (typically a reply explaining the feature isn’t available on their plan).`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/rulebook-check-example.svg?fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=dc136e247f498ac418aa88b3969869e1`,alt:`A Rulebook rule named 'Verify Premium Account Holder' showing a Check step with the condition 'Account Tier Equals premium'. The Check is wrapped in a Steps block called 'Check account tier, premium' which sits inside a Fallback block called 'Account tier gate'.`,\"data-og-width\":`880`,width:`880`,\"data-og-height\":`560`,height:`560`,\"data-path\":`images/en/configuration/tags/rulebook-check-example.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/rulebook-check-example.svg?w=280\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=d4ec9d106e99a9f9f3aeff61c8963706 280w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/rulebook-check-example.svg?w=560\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=aa5cf3f333213f0feccc9874bc9bc0bc 560w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/rulebook-check-example.svg?w=840\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=43af4a8c2064c03ad5bc47b9b3b2edd6 840w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/rulebook-check-example.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=f76c0d39ecf81ca826e06df33cc90c6a 1100w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/rulebook-check-example.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=4ce525ce8804827fb07182173431d388 1650w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/rulebook-check-example.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=8e568154a68ee0cd08b3d3bff55f748e 2500w`})}),`\n`,_jsxs(_components.p,{children:[`Two things this example illustrates. First, `,_jsxs(_components.strong,{children:[`tag-driven Checks pair naturally with `,_jsx(_components.code,{children:`Fallback`}),` blocks`]}),`: the Check defines the positive case (`,_jsx(_components.code,{children:`Account Tier = premium`}),` → proceed); the Fallback catches the negative (any other tier value → fall through to the alternative reply). Second, for tags that capture `,_jsx(_components.strong,{children:`something the agent itself did or confirmed`}),` (rather than a property of the customer), the `,_jsxs(_components.strong,{children:[`naming convention `,_jsx(_components.code,{children:`\u003cSubject> by 'Finibot'`})]}),`: `,_jsx(_components.em,{children:`Role Confirmation by ‘Finibot’`}),`: `,_jsx(_components.em,{children:`Action confirmation by ‘Finibot’`}),`: is worth adopting. It tells the reader instantly that this is an observable state of the agent’s behavior, not a customer attribute.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Tags are the most reliable input to Rulebook conditions.`}),` They’re set `,_jsx(_components.em,{children:`before`}),` the Rulebook rule runs (during the tagging phase), so the value is stable. Compare with `,_jsx(_components.strong,{children:`Read`}),` step extractions, which run as part of the rule and can fail or return unexpected values. When you have a choice between branching on a tag versus extracting the same information mid-rule, choose the tag.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Mandatory tag groups (Conversation Status) are not available as Rulebook conditions.`}),` Their job is to describe the conversation’s final state, not to gate routing decisions. Only Default groups with the toggle enabled (e.g. Escalation Reason) and Custom groups with the toggle on appear in the condition picker.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsx(Heading,{level:`3`,id:`debugging-tags-with-ai-steps`,children:`Debugging tags with AI Steps`}),`\n`,_jsxs(_components.p,{children:[`For supported decision-model runs, Input Tag Selection and Output Tag Selection show candidate tags with percentage bars and a check mark on the chosen tag. Expand `,_jsx(_components.strong,{children:`more`}),` to inspect candidates beyond the first five. If the run has no compatible probability data, the selected tags still appear as chips. Use the final chosen tags when diagnosing routing; a model score is not a measured resolution rate. See `,_jsx(_components.a,{href:`/en/testing/inbox#decision-probabilities-in-ai-steps`,children:`Decision probabilities in AI Steps`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Every conversation in the Inbox carries the model’s full tagging reasoning. Open any conversation and click the `,_jsx(_components.strong,{children:`AI Steps`}),` panel, under `,_jsx(_components.strong,{children:`Output Tag Selection`}),` you’ll see the reasoning the model used to choose every tag from every active group, plus the `,_jsx(_components.strong,{children:`Chosen Tags`}),` list with the exact value picked from each.`]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/ai-steps-tagging.png?fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=9081ec9f5c3614bdad505bebfaf0467f`,alt:`AI Steps panel for a conversation showing the Output Tag Selection section. The Reasoning text explains the model's tagging choice in natural language. Below it, Chosen Tags lists each active group (Checks, Errors, Sentiment, Knowledge Gap, Type of Issue, Check Sub item, Escalation Reason, Conversation Status) with the specific tag value applied to this conversation.`,\"data-og-width\":`502`,width:`502`,\"data-og-height\":`1792`,height:`1792`,\"data-path\":`images/en/configuration/tags/ai-steps-tagging.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/ai-steps-tagging.png?w=280\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=eea94a970c6c4957fc0a075b3e5c04c3 280w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/ai-steps-tagging.png?w=560\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=0aa8b4cf6623b563020abd6fc478591d 560w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/ai-steps-tagging.png?w=840\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=f26257701ffdddd1efade96116348dc1 840w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/ai-steps-tagging.png?w=1100\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=5a599c2e2baf8d638ae768e5ffc4dfa0 1100w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/ai-steps-tagging.png?w=1650\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=38c40852e45b56addd016cae3f80ce88 1650w, https://mintcdn.com/fini/zctNPVP1t-q6dPqV/images/en/configuration/tags/ai-steps-tagging.png?w=2500\u0026fit=max\u0026auto=format\u0026n=zctNPVP1t-q6dPqV\u0026q=85\u0026s=f6d896831deb3a2f373e6eef1805c8f6 2500w`})}),`\n`,_jsxs(_components.p,{children:[`This is the primary debugging surface for tags. When a tag fires unexpectedly, the reasoning text tells you exactly `,_jsx(_components.em,{children:`why`}),`: what signal the model latched onto, what it weighed against, and how the AI Instructions led to the chosen value. Use it as a feedback loop:`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Find a conversation where the tag was wrong`,children:_jsx(_components.p,{children:`Filter the Inbox to the suspect tag value, or open a specific conversation you know was mis-tagged.`})}),_jsx(Step,{title:`Read the AI Steps reasoning for that group`,children:_jsxs(_components.p,{children:[`The reasoning paragraph reveals what the model was thinking. Look for misinterpreted signals, `,_jsx(_components.em,{children:`“the conversation was already escalated by the assistant”`}),` might explain why a downstream tag fired the way it did.`]})}),_jsx(Step,{title:`Update the AI Instructions to handle that case`,children:_jsxs(_components.p,{children:[`Add an explicit rule covering the missed edge case. If the model thought the customer’s frustration about the `,_jsx(_components.em,{children:`product`}),` was frustration with the `,_jsx(_components.em,{children:`agent`}),`: your Sentiment instructions need to disambiguate the two explicitly.`]})}),_jsx(Step,{title:`Save and verify on the next conversation`,children:_jsx(_components.p,{children:`Changes take effect for new conversations. Run the same kind of message through and confirm the AI Steps reasoning now produces the right value.`})})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`The reasoning text isn’t visible to customers, it’s an internal trace meant for you. When a stakeholder asks `,_jsx(_components.em,{children:`“why did the bot tag this as escalated?”`}),`: the AI Steps panel is the answer. Treat it the way you’d treat logs in a system you operate.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`why-a-tag-isn’t-being-applied-correctly`,children:`Why a tag isn’t being applied correctly`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`The group isn't assigned to this agent`,icon:`user-slash`,id:`the-group-isnt-assigned-to-this-agent`,children:_jsx(_components.p,{children:`Default and Custom groups must be explicitly activated per-agent. Open the Tag Groups page, select the agent, and confirm the group’s checkbox is on. Mandatory groups (Conversation Status) are exempt.`})}),_jsx(Accordion,{title:`The AI Instructions are too vague`,icon:`comment-question`,id:`the-ai-instructions-are-too-vague`,children:_jsxs(_components.p,{children:[_jsx(_components.em,{children:`“Apply this when the customer is unhappy”`}),` gives the model nothing to anchor on. Rewrite with specific phrases, example messages, and explicit edge-case handling. Use the model’s mistakes as your guide, read the conversations where it got the tag wrong and update the instructions to cover those cases.`]})}),_jsx(Accordion,{title:`Tag descriptions are missing or generic`,icon:`tag`,id:`tag-descriptions-are-missing-or-generic`,children:_jsxs(_components.p,{children:[`The model uses each tag’s `,_jsx(_components.strong,{children:`description`}),` as its per-tag decision rule. Empty or one-word descriptions force the model to guess. Write every tag’s description as a specific rule (`,_jsx(_components.em,{children:`“apply this if X happens AND Y is true”`}),`).`]})}),_jsx(Accordion,{title:`Tag Selection mode doesn't match the use case`,icon:`list-check`,id:`tag-selection-mode-doesnt-match-the-use-case`,children:_jsx(_components.p,{children:`“Exactly one tag” forces a single choice, if a conversation legitimately falls into two categories, the model has to pick one and may not pick consistently. Switch to “Multiple tags can be selected” if your tags aren’t mutually exclusive.`})}),_jsx(Accordion,{title:`The Rulebook toggle is off but you expected a tag in the condition picker`,icon:`toggle-off`,id:`the-rulebook-toggle-is-off-but-you-expected-a-tag-in-the-condition-picker`,children:_jsxs(_components.p,{children:[`Tags only appear as Rulebook conditions when the group’s `,_jsx(_components.strong,{children:`Tag Group available in Rulebooks`}),` toggle is on. Mandatory groups (Conversation Status) can never appear in the picker, that’s by design.`]})}),_jsx(Accordion,{title:`You're inferring from totals, not from the conversation`,icon:`message-question`,id:`you-re-inferring-from-totals-not-from-the-conversation`,children:_jsxs(_components.p,{children:[`Tags are applied per message exchange and recorded per-conversation. Don’t infer behavior from analytics totals or filter counts, open the specific conversation in the Inbox and read the `,_jsx(_components.strong,{children:`AI Steps`}),` panel (see `,_jsx(_components.a,{href:`#debugging-tags-with-ai-steps`,children:`Debugging tags with AI Steps`}),`) to see exactly which tags fired and why.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Rulebook`,icon:`bolt`,href:`/en/automations/rulebook`,children:_jsx(_components.p,{children:`Use tag values as Check step conditions to route, branch, and escalate conversations.`})}),_jsx(Card,{title:`Reply Behavior`,icon:`turn-down-right`,href:`/en/automations/reply-behavior`,children:_jsx(_components.p,{children:`Use tags to suppress replies entirely, for example, skipping conversations classified as spam.`})}),_jsx(Card,{title:`Inbox`,icon:`inbox`,href:`/en/testing/inbox`,children:_jsx(_components.p,{children:`Filter and review conversations by tag. Conversation Status drives the status badge on every row.`})}),_jsx(Card,{title:`Analytics`,icon:`chart-bar`,href:`/en/analytics`,children:_jsx(_components.p,{children:`Chart tag distribution over time. Track topic mix, escalation reasons, sentiment trends, and guardrail violations.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Tags","description":"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.","icon":"tag","href":"/en/configuration/tags"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What tags are for","slug":"what-tags-are-for","depth":2,"children":[]},{"title":"How tags get applied","slug":"how-tags-get-applied","depth":2,"children":[]},{"title":"Types of tag groups","slug":"types-of-tag-groups","depth":2,"children":[{"title":"Default groups","slug":"default-groups","depth":3,"children":[]},{"title":"Mandatory groups, Conversation Status","slug":"mandatory-groups-conversation-status","depth":3,"children":[]},{"title":"Custom groups","slug":"custom-groups","depth":3,"children":[]}]},{"title":"Anatomy of a group","slug":"anatomy-of-a-group","depth":2,"children":[]},{"title":"Creating a group","slug":"creating-a-group","depth":2,"children":[]},{"title":"Adding tags to a group","slug":"adding-tags-to-a-group","depth":2,"children":[]},{"title":"Writing effective tag descriptions","slug":"writing-effective-tag-descriptions","depth":2,"children":[]},{"title":"Assigning groups to agents","slug":"assigning-groups-to-agents","depth":2,"children":[]},{"title":"Tags in Rulebooks","slug":"tags-in-rulebooks","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[{"title":"Debugging tags with AI Steps","slug":"debugging-tags-with-ai-steps","depth":3,"children":[]},{"title":"Why a tag isn’t being applied correctly","slug":"why-a-tag-isn’t-being-applied-correctly","depth":3,"children":[]}]},{"title":"Related","slug":"related","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"fini","siteName":"Fini","title":"Tags - Fini","relatedPagesConfig":{"enabled":true,"limit":3,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/configuration/tags","matchLevel":0}}},"lastModified":"2026-10-29T17:50:30.936Z","originalFileLocation":"en/configuration/tags.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Fini\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=fep-JMymNphpe1DQ\u0026amp;q=85\u0026amp;s=8a2bf1d8a0e5c590ebb976eadccf26a9\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=fep-JMymNphpe1DQ\u0026amp;q=85\u0026amp;s=8a2bf1d8a0e5c590ebb976eadccf26a9\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=fep-JMymNphpe1DQ\u0026amp;q=85\u0026amp;s=8a2bf1d8a0e5c590ebb976eadccf26a9\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/png\" href=\"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-dark.png?fit=max\u0026amp;auto=format\u0026amp;n=fep-JMymNphpe1DQ\u0026amp;q=85\u0026amp;s=8a2bf1d8a0e5c590ebb976eadccf26a9\">\u003cmeta data-mint-head property=\"og:title\" content=\"Tags - Fini\">\u003cmeta data-mint-head property=\"og:description\" content=\"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Fini\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.usefini.com/en/configuration/tags\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://fini.mintlify.site/_mintlify/api/og/v2?division=Agent+Configuration\u0026amp;title=Tags\u0026amp;description=Classify+every+conversation+automatically+with+AI-powered+tag+groups%2C+for+observability%2C+routing+logic+in+Rulebooks%2C+and+AI+behavior+guardrails.\u0026amp;theme=cf30811e7a75ce9cedcd10e2\u0026amp;signature=7f347ec61e308cce0700f13bbbb5fb1ba0e18fd8b3550c76254a6aeff331130b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Tags - Fini\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://fini.mintlify.site/_mintlify/api/og/v2?division=Agent+Configuration\u0026amp;title=Tags\u0026amp;description=Classify+every+conversation+automatically+with+AI-powered+tag+groups%2C+for+observability%2C+routing+logic+in+Rulebooks%2C+and+AI+behavior+guardrails.\u0026amp;theme=cf30811e7a75ce9cedcd10e2\u0026amp;signature=7f347ec61e308cce0700f13bbbb5fb1ba0e18fd8b3550c76254a6aeff331130b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/fini/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Fini\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#C3EE5E\">\u003cmeta data-mint-head name=\"msvalidate.01\" content=\"9A9FD7AB87AE2DEA257FE41F07C61E70\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.usefini.com/en/configuration/tags\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/configuration/tags.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.usefini.com/#organization\",\"name\":\"Fini\",\"url\":\"https://docs.usefini.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/fini/fep-JMymNphpe1DQ/images/shared/logos/fini-light.png?fit=max\u0026auto=format\u0026n=fep-JMymNphpe1DQ\u0026q=85\u0026s=a460ff8bb507876712db2f0fb12c21e4\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.usefini.com#website\",\"name\":\"Fini\",\"url\":\"https://docs.usefini.com\",\"publisher\":{\"@id\":\"https://docs.usefini.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.usefini.com/en/configuration/tags#webpage\",\"url\":\"https://docs.usefini.com/en/configuration/tags\",\"name\":\"Tags\",\"description\":\"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.\",\"dateModified\":\"2026-10-29T17:50:30.936Z\",\"isPartOf\":{\"@id\":\"https://docs.usefini.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.usefini.com/en/configuration/tags#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.usefini.com/en/configuration/tags#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Agent Configuration\",\"item\":\"https://docs.usefini.com/en/configuration/agent-home\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tags\",\"item\":\"https://docs.usefini.com/en/configuration/tags\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.usefini.com/en/configuration/tags#article\",\"headline\":\"Tags\",\"name\":\"Tags\",\"description\":\"Classify every conversation automatically with AI-powered tag groups, for observability, routing logic in Rulebooks, and AI behavior guardrails.\",\"url\":\"https://docs.usefini.com/en/configuration/tags\",\"mainEntityOfPage\":{\"@id\":\"https://docs.usefini.com/en/configuration/tags#webpage\"},\"dateModified\":\"2026-10-29T17:50:30.936Z\",\"publisher\":{\"@id\":\"https://docs.usefini.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.usefini.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Fini\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Fini\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/en/configuration/tags.md","siteName":"Fini","nav":{"global":null,"languages":[{"language":"en","default":true,"tabs":[{"tab":"Documentation","groups":[{"group":"Getting Started","icon":"flag","pages":[{"title":"Introduction","icon":"book","href":"/en/introduction"},{"title":"What is Fini","icon":"circle-info","href":"/en/what-is-fini"},{"title":"How Fini works","icon":"gears","href":"/en/how-fini-works"},{"title":"Quickstart","icon":"bolt","href":"/en/quickstart"},{"title":"Rollout timeline: Day 1, 14, 30","icon":"calendar-days","href":"/en/rollout-timeline"},{"title":"Supported languages","icon":"language","href":"/en/supported-languages"},{"title":"Fini Scout","icon":"binoculars","href":"/en/fini-scout"},{"title":"Okta SSO","icon":"key","href":"/en/sso-login"},{"title":"Fini FAQ","icon":"circle-question","href":"/en/faq"}]},{"group":"Agent Configuration","icon":"sliders","pages":[{"title":"Home","icon":"robot","href":"/en/configuration/agent-home"},{"title":"Behavior","icon":"message","href":"/en/configuration/prompts"},{"group":"Knowledge","icon":"database","pages":[{"title":"Knowledge","icon":"graduation-cap","href":"/en/knowledge/overview"},{"title":"Sources","icon":"database","href":"/en/knowledge/sources"},{"title":"Articles","icon":"book-open","href":"/en/knowledge/articles"},{"title":"Magic Articles","icon":"wand-magic-sparkles","href":"/en/knowledge/magic-articles"},{"title":"Review Queue","icon":"circle-check","href":"/en/knowledge/review"},{"title":"How Fini handles messy or conflicting docs","description":"Why AI support gives wrong answers when policy docs conflict or update, and how Fini's approved-Articles design and Review Queue keep one approved answer per topic.","icon":"broom","href":"/en/knowledge/messy-or-conflicting-docs"}]},{"title":"Tags","icon":"tag","href":"/en/configuration/tags"},{"title":"Guardrails","description":"Configure per-agent reply checks, channel scope, and review guardrail activity.","icon":"shield-check","href":"/en/configuration/guardrails"},{"group":"Automations","icon":"bolt","pages":[{"title":"Intent Rules","icon":"diagram-project","href":"/en/automations/rulebook"},{"title":"Business Rules","icon":"zap","href":"/en/automations/business-rules"},{"title":"Reply Rules","icon":"turn-down-right","href":"/en/automations/reply-behavior"}]}]},{"group":"Deploy","icon":"cloud-arrow-up","pages":[{"title":"Channel overview","icon":"cloud-arrow-up","href":"/en/deploy/overview"},{"title":"Fini on top of your helpdesk","icon":"layer-group","href":"/en/deploy/on-top-of-your-helpdesk"},{"title":"Widget","icon":"message","href":"/en/deploy/widget"},{"title":"Help Center","icon":"book-open","href":"/en/deploy/helpcenter"},{"title":"Email","icon":"envelope","href":"/en/deploy/email"},{"title":"Fini on voice","icon":"phone","href":"/en/deploy/voice"},{"title":"API Keys","icon":"key","href":"/en/deploy/api-keys"},{"group":"Integrations","icon":"arrow-rotate-right","pages":[{"title":"Zendesk","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/zendesk.png","href":"/en/deploy/zendesk"},{"title":"Intercom","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/intercom.png","href":"/en/deploy/intercom"},{"title":"Front","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/front.png","href":"/en/deploy/front"},{"title":"Gorgias","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/gorgias.png","href":"/en/deploy/gorgias"},{"title":"HubSpot","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/hubspot.png","href":"/en/deploy/hubspot"},{"title":"Microsoft 365","icon":"envelope","href":"/en/deploy/microsoft365"},{"title":"Salesforce","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/salesforce.png","href":"/en/deploy/salesforce"},{"title":"LiveChat","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/livechat.png","href":"/en/deploy/livechat"},{"title":"Slack","icon":"https://mintlify.s3.us-west-1.amazonaws.com/fini/images/shared/logos/slack.png","href":"/en/deploy/slack"},{"title":"Facebook","icon":"key","href":"/en/deploy/facebook"},{"title":"Instagram","icon":"camera","href":"/en/deploy/instagram"},{"title":"Jira Service Management","icon":"ticket","href":"/en/deploy/jira"},{"title":"WhatsApp","icon":"comment-dots","href":"/en/deploy/whatsapp"},{"title":"Deskpro","icon":"inbox","href":"/en/deploy/deskpro"}]}]},{"group":"Ticketing","icon":"ticket","pages":[{"title":"Ticketing overview","icon":"ticket","href":"/en/ticketing/overview"},{"title":"Set up ticketing","icon":"sliders","href":"/en/ticketing/get-started"},{"title":"Agent groups","icon":"users","href":"/en/ticketing/agent-groups"},{"title":"Work a ticket","icon":"comments","href":"/en/ticketing/working-tickets"},{"title":"Escalation and hand-back","icon":"arrows-turn-to-dots","href":"/en/ticketing/escalation-and-handoff"},{"title":"Ticket macros","icon":"message","href":"/en/ticketing/macros"}]},{"group":"Test \u0026 Ship","icon":"vial","pages":[{"title":"Inbox","icon":"inbox","href":"/en/testing/inbox"},{"title":"Refine with AI","icon":"wand-magic-sparkles","href":"/en/testing/fix-with-ai"},{"title":"Test Suite","icon":"vial","href":"/en/testing/test-suite"},{"title":"Best practices for testing your agent","icon":"list-check","href":"/en/testing/best-practices"}]},{"group":"Performance \u0026 accuracy","icon":"gauge-high","pages":[{"title":"How accuracy and resolution rate are measured","icon":"bullseye","href":"/en/performance/how-accuracy-is-measured"},{"title":"Resolution vs deflection","icon":"scale-balanced","href":"/en/performance/resolution-vs-deflection"},{"title":"Analytics","icon":"chart-bar","href":"/en/analytics"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/en/api-reference/overview"}]},{"tab":"Use cases","pages":[{"title":"Use cases","href":"/en/use-cases/refunds"}]},{"tab":"Trust \u0026 pricing","pages":[{"title":"Trust \u0026 pricing","href":"/en/security/overview"}]}]}]},"basePath":"","title":"Tags - Fini","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-D2acuaLg.js","DynamicMarkdown-Co5nikxh.js","zoom-image-lightbox-BbK2OBGL.js","lightbox-handle-r17bVUz3.js"]}