Improve your agent’s performance based on past support interactions
This article refers to features that are currently rolling out. To find out when these features will be live on your site, keep an eye on our release notes.
Optimize uses AI to analyze past support interactions – including agent conversations, work items, or support interactions from other products – then identifies gaps in your agent’s knowledge and generates suggested content to address these gaps. This can help your AI agent answer more customer questions successfully and reduce abandoned conversations.
You stay in control by reviewing, editing, and publishing the knowledge suggestions in Confluence before your AI agent can use them to answer customer questions.
Run an analysis on your support interactions
You can choose to analyze conversations and work items from Customer Service Management, or import data such as work items from Jira Service Management or support tickets from Zendesk and other customer service apps.
Important information before you start
You must have at least 500 support interactions for the analysis to work.
Optimize can analyze a maximum of 10,000 support interactions per session.
The Analyze support interactions option analyzes interactions from the last 180 days.
The process can take a while depending on the number of support interactions being analyzed. You can leave the Optimize screen to do other work and you’ll receive a notification when it's finished.
Run analysis on Customer Service Management support interactions
To run an analysis on your work items and conversations in Customer Service Management:
In your agent settings, select Optimize.
Select Run optimization, then select Analyse support interactions.
The optimization process will start. During this process, a Confluence space is created automatically to store any knowledge suggestions you choose to keep.
Run analysis on external data
To run an analysis on work items from Jira Service Management or tickets from Zendesk:
In your agent settings, select Optimize.
Select Run optimization, then select Upload external data.
Select Upload data as a CSV or JSON and choose your file, or drag and drop it.
Select Run optimization.
The optimization process will start. During this process, a Confluence space is created automatically to store any knowledge suggestions you choose to keep.
CSV files
Your CSV file must have the following column headers: Summary and Comments. Description is optional but recommended.
Examples of valid CSVs:
Minimal:
Summary,Comments
How do I reset my password?,Try the Forgot password link on the login page.With optional Description:
Summary,Description,Comments
How do I reset my password?,User asked about resetting their password,Try the Forgot password link on the login page.JSM-style export (multiple comments columns, issue metadata):
Issue Type,Issue key,Issue id,Summary,Comments,Comments,Comments
Task,CSMAI-1253,10721126,How to login to account,22/Jan/26 11:01 AM;customer;Hello my email and password is not working,22/Jan/26 11:01 AM;AGENT;have you tried resetting your password?,"22/Jan/26 11:03 AM;customer;Yes, that worked. Thank you"
Task,CSMAI-1251,10721112,Where are your store locations?,22/Jan/26 1:05 PM;customer;Where is the closest store to Sydney?,22/Jan/26 1:06 PM;AGENT;The closest store is in Sydney Pitt street mall,JSON (.json array)
JSON files are useful if you have your own tooling or APIs.
Important formatting information:
Field names are case-insensitive (
summary,Summary,SUMMARYall work).Required:
summary(non-empty string per object) andcomments(at least one object must have usable comments).Optional:
description(string).commentscan be a single string (e.g."comments": "one reply") or an array (e.g."comments": ["reply 1", "reply 2"]). Array elements can be strings or dicts (dicts are serialized as JSON strings – useful for structured formats like ADF).Extra fields are ignored – you can include IDs, timestamps, metadata, etc. and they won't cause errors.
Examples of valid JSON:
Minimal:
[
{
"summary": "How do I reset my password?",
"comments": ["Try the Forgot password link on the login page."]
}
]With description and single-string comment:
[
{
"summary": "How do I reset my password?",
"description": "User asked about resetting their password.",
"comments": "Try the Forgot password link on the login page."
}
]With extra metadata (ignored by the parser):
[
{
"id": "TICKET-4521",
"created": "2026-01-15T10:30:00Z",
"updated": "2026-01-16T08:00:00Z",
"priority": "high",
"summary": "SSO login failing after password change",
"description": "Customer reports SSO stopped working after an AD password reset.",
"comments": [
"Have you tried clearing your browser cache and cookies?",
"Yes I cleared cache. Still getting 403 on the SAML callback.",
"This is a known issue with the IdP token cache. I've escalated to engineering."
]
},
{
"id": "TICKET-4522",
"summary": "Bulk export timing out",
"comments": ["Try reducing the date range to 30 days — exports over 90 days can hit the gateway timeout."]
}
]With structured/ADF comments (dicts are serialized as JSON):
[
{
"summary": "Ticket with structured comments",
"comments": [
{
"authored_by": "agent-456",
"comment": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Please try restarting.\"}]}]}"
}
]
}
]Zendesk NDJSON (.json)
If you’re migrating from or using Zendesk, you can upload your Zendesk ticket exports directly without any conversion.
Important information:
NDJSON files are auto-detected when the file content starts with
{(one JSON object per line, as opposed to[for a JSON array).A line is recognized as a Zendesk ticket if: its
urlfield contains"zendesk.com", or it has both anidfield and asubjectorraw_subjectfield.Summary: taken from
raw_subject(preferred if non-empty), otherwisesubject.Comments: from the
commentsarray, where each element is a comment object. For each comment object, the parser checksplain_bodyfirst – if it's a non-empty string, that's used. Otherwisebodyis used. Non-dict elements are coerced to strings.Fallback: if the
commentsarray is empty or yields no text butdescriptionis non-empty, the description is used as a single comment.Extra Zendesk fields (
id,url,status,tags,assignee_id, etc.) are all fine – they're either mapped or ignored.
Examples of valid NDJSON:
Typical Zendesk export (two tickets, one per line):
{"id":1001,"url":"https://acme.zendesk.com/api/v2/tickets/1001.json","subject":"Can't log in after password reset","raw_subject":"Can't log in after password reset","description":"I changed my password yesterday and now SSO is broken.","comments":[{"id":9001,"plain_body":"Have you tried clearing your browser cookies?","body":"<p>Have you tried clearing your browser cookies?</p>"},{"id":9002,"plain_body":"That fixed it, thanks!","body":"<p>That fixed it, thanks!</p>"}]}
{"id":1002,"url":"https://acme.zendesk.com/api/v2/tickets/1002.json","subject":"Export API returning 429","raw_subject":"Export API returning 429","description":"Getting rate-limited on the incremental export endpoint.","comments":[{"id":9003,"plain_body":"You're hitting the 10 req/min limit. Add a backoff loop.","body":"<p>You're hitting the 10 req/min limit. Add a backoff loop.</p>"}]}Zendesk ticket with no comments (description used as fallback):
{"id":1003,"url":"https://acme.zendesk.com/api/v2/tickets/1003.json","subject":"Feature request: dark mode","description":"Would love a dark mode option for the dashboard.","comments":[]}Zendesk-like without http://zendesk.com URL (detected via id + subject heuristic):
{"id":2001,"subject":"Bulk import failing","description":"CSV upload hangs at 80%.","comments":[{"id":5001,"plain_body":"What's the file size? We have a 50MB limit.","body":"<p>What's the file size? We have a 50MB limit.</p>"},{"id":5002,"plain_body":"It was 120MB. I'll split it. Thanks!","body":"<p>It was 120MB. I'll split it. Thanks!</p>"}]}Review knowledge suggestions
When the analysis is finished, a list of knowledge suggestions will appear. Each suggestion includes a summary of the content.
To review a suggestion, select Review. The suggested content will appear in a modal.
Accept a suggestion
You can accept a suggestion as it is or make edits if required. Once you’re happy with it, select Publish. This will publish the page in the dedicated Confluence space and move the suggestion to the Published list on the Optimize screen.
Reject a suggestion
To reject a suggestion, close the modal and select Reject next to the title of the suggestion.
Published content as a knowledge source
Published content will automatically be added to your agent’s knowledge and will appear in the knowledge table as Generated knowledge. You can toggle this on or off at anytime to control whether your agent can access it. Read more about knowledge for your agent.
Was this helpful?